marginaleffects/0000755000176200001440000000000014632777612013423 5ustar liggesusersmarginaleffects/tests/0000755000176200001440000000000014632712433014553 5ustar liggesusersmarginaleffects/tests/tinytest.R0000644000176200001440000000035314632712433016562 0ustar liggesusersif (requireNamespace("tinytest", quietly = TRUE) && isTRUE(Sys.getenv("R_NOT_CRAN") == "true") && isTRUE(Sys.info()["sysname"] != "Windows") && dir.exists("inst/tinytest")) { tinytest::test_package("marginaleffects") } marginaleffects/tests/spelling.R0000644000176200001440000000021014631452336016506 0ustar liggesusersif(requireNamespace('spelling', quietly = TRUE)) { spelling::spell_check_test(vignettes = TRUE, error = FALSE, skip_on_cran = TRUE) } marginaleffects/MD50000644000176200001440000002107214632777612013735 0ustar liggesusers17b1f1e2f6b06352944d56ed0aaf72d0 *DESCRIPTION 27f7b3606227e2c7df4d92a78900f45c *NAMESPACE f754d2c9449ff0471688b0bfc0d11785 *NEWS.md bb1da3e78a3f5dd03af88bb04cafb8ca *R/RcppExports.R 113931fe7bbad00cdea15dd91343a2a4 *R/backtransform.R 215bc2e132dee432c55d0fb0329c6788 *R/bootstrap_boot.R 11067a113f30465feac4810c73711484 *R/bootstrap_fwb.R d46409e0d0d2c8b1ec8ccbd5428154c2 *R/bootstrap_rsample.R 108c3d90a5c3505b26fdb94919ec91b6 *R/bootstrap_simulation.R d0da17fc7cb4cc3e844f93cd7757dd40 *R/broom.R 18ea90260881eafcec66c8c58bd046e7 *R/by.R 5199ee5c608221d807dd6f2ab08807ce *R/ci.R 90e599a6c4bac853f0cdf4f732fd16a8 *R/comparisons.R 4b349397e2529b4dda7f5af7fb3bbfb4 *R/complete_levels.R 5298a3c6412e495adaeb55c3cb638d51 *R/conformal.R bb595838abd20345e056b7e894e8de6c *R/datagrid.R 938c3c5ac98355241bd62ce55f93c453 *R/deprecated.R 82c48550b6a695bdf71d0f850ee0eb0b *R/equivalence.R fa771a0ded49cd91d500c4be32e0f344 *R/get_coef.R 50679a9c83b12c73323787e18d58649e *R/get_contrast_data.R 8728467cc0e3f3771ffb530e91eca231 *R/get_contrast_data_character.R 9a18eb4ad0b65036d0564913b8d251fe *R/get_contrast_data_factor.R b6fd7a6f7c4b4e4e6554db17ced1cf23 *R/get_contrast_data_logical.R afdedd2e6a4aefcbdc7cba78ea0bbb37 *R/get_contrast_data_numeric.R 58b8c9d7059c736896b3bcdaef043871 *R/get_contrasts.R 1fe5ddda867059ca42687fc84d13bbb5 *R/get_group_names.R 7a49a7b6a50a3a0f028857e8bde69563 *R/get_hypothesis.R b98786d8951edd88167d3fb4c8b62d1f *R/get_jacobian.R 08c5777e213c8aa2ce328c4bd3c7136d *R/get_model_matrix.R e548ba7573c9b0c665317bc85dff653d *R/get_model_matrix_attribute.R 0f048edca7f46eeecade6f09db388373 *R/get_modeldata.R d727b76881254e96b5a82a29570bf7cc *R/get_predict.R 46139821934b973f92bab6479848bb62 *R/get_se_delta.R c1d0b40b25414f1eeb2cbab35d56fd20 *R/get_term_labels.R 055ba051c100367a2698dd1ed3695ac7 *R/get_vcov.R 7078102a5eaa8e8d5d49b707411d52a4 *R/github_issue.R ba91a987205e717587704726a59e68a1 *R/hush.R 7de36454ff6e0447aab0fc2d753885ea *R/hypotheses.R 799dbaab89da1aa2027907bfbaa74550 *R/hypotheses_joint.R c9ba28eef440898ee5a113ac72349b29 *R/hypothesis_helper.R 6b57e2e69afd8fae53020f083993fcef *R/imputation.R b0466415371fccd052f56cb7bb6cb50c *R/inferences.R ca9964357eb3917f6691bccbda59fe69 *R/mean_or_mode.R b16f4dd6e06ae13bf66e18a081640de9 *R/methods.R 254b94170fa5b09d5dea427e29543c44 *R/methods_AER.R 45da88d5337089b487cde2bb95734a24 *R/methods_MASS.R ee0d2b56a5cb611f02ce49a581dff154 *R/methods_MCMCglmm.R 0c32a2964e96f693ad8b9ad87249479c *R/methods_Rchoice.R 153ec50b032f6000bf8634efb38a5a39 *R/methods_afex.R 9b76b0fb1ece5155f87e02998f70e245 *R/methods_aod.R 1639448040715888da590fdef0eda402 *R/methods_betareg.R 664b234b95e2bbd211c3475f2b473a06 *R/methods_bife.R b405afd1dac4df9c5f2100f25e73347f *R/methods_biglm.R 3656e4bac5cd2c76af7d755ccf1c8ed2 *R/methods_brglm2.R 614a342286fbc0613ccc133ef3b0f576 *R/methods_brms.R cf983748c9301ed7455894c9ecdfe654 *R/methods_crch.R 86ac1337e67cb6b405aae13cfbafcef9 *R/methods_dataframe.R 57f8db0a3f536d8d38b1ff8474fca54e *R/methods_dbarts.R 16c6859ad75215a6fae3c401dbc3c383 *R/methods_fixest.R 26e622dac03a30a2fc2c40a6e96a2b82 *R/methods_flexsurv.R c4e6137c681083ab6363059cc41de8d4 *R/methods_gamlss.R 323a911ca5045632c74571781aa72c3b *R/methods_glmmTMB.R 3746a261e273e70d27edddbfbdc7b18c *R/methods_glmx.R 03bc1209c2e32db1035e01653a37ba32 *R/methods_lme4.R de5f408473610b110f14afb6165a74e2 *R/methods_mclogit.R 96bdd95b493e263675e7e131c13af0b3 *R/methods_mgcv.R bdd287c114120dfd86a13790736be008 *R/methods_mhurdle.R d2cf8244bd4de0eca23a15da9e3813a7 *R/methods_mlm.R cb3f2511197b0c73af44d18fce594e4b *R/methods_mlogit.R 969f759880202a3adad0fddcc9a0627c *R/methods_mlr3.R 7bc9665f23cbe12b51cccb54c666f097 *R/methods_nlme.R f86f1434e93953455327cb89ec1dcef3 *R/methods_nnet.R 56435226bbc19b480f6443da918af834 *R/methods_ordinal.R f6f6e2c9e5b0401095d3404f4bdc86fe *R/methods_plm.R d0a4a6b4d611fa455a249d61a0d482f8 *R/methods_pscl.R 45e7bbccb58edb2720a9daa67de702f6 *R/methods_quantreg.R 76406644f1ab215d012f0c24eb5504d5 *R/methods_rms.R 3512e62b3fd5df31858ac52ceff73b30 *R/methods_robustlmm.R 6136062cf0dc2d5d144101d3cf96b4fe *R/methods_rstanarm.R 8d4a45cbf9ee1de2174262096407bc2b *R/methods_sampleSelection.R d6a009aa1aadeff7d5f8af72bcea8120 *R/methods_scam.R d24518f21b90784835bf98d4faeb0e50 *R/methods_stats.R aa09c6d1fc486f6343c7a2fd4fdafeb8 *R/methods_survey.R 8c5832b33925e1ea1b49e84eb7a56611 *R/methods_survival.R 66cb56aaeb95f4f6de1a6cf8548464e7 *R/methods_tidymodels.R 30eec5e50ebb75eee60314d0e3c75249 *R/methods_tobit1.R 576257c245e9b2f490349fbd70f8d218 *R/modelarchive.R 970b67d14246cb1f71b95f90f9f54b93 *R/myTryCatch.R 3ef9ac1ab03559f1c50ffda2884976f3 *R/package.R c2e3bc3b6871c223d34897427426b7fe *R/plot.R 86a2bed7ff2587c592c919e6259f72cd *R/plot_build.R b1048c67700e975ab7afbb3c607370a6 *R/plot_comparisons.R 4ab457ad8aafe8e56f3f1ea5183370da *R/plot_predictions.R 86f4356f95003d82d12a2ebde3df961b *R/plot_slopes.R 4d464795da0e9545fe351881ffad23c1 *R/posterior_draws.R 5e0a204f2d44f57644e38a63a5c66ac2 *R/predictions.R 5d34f628c6e556f2e86247ec98362733 *R/print.R f5c51615c1504792626a320c347bd90d *R/recall.R 4a25bcc2e217714332bf3209106ee1db *R/sanitize_comparison.R 9f59f967a15cfe8ec3f0cba15412e195 *R/sanitize_condition.R a3b8b0611f32a8f7f44ce3397b426815 *R/sanitize_conf_level.R e57b0e6e71227184d25e381b99033797 *R/sanitize_hypothesis.R 24120d0d0d4b5daa4e7dda807d82b4dd *R/sanitize_hypothesis_formula.R f092223ee4603fe29b5cadcf8a7455cd *R/sanitize_interaction.R 89003e876ee0a8eeef5379507474d115 *R/sanitize_newdata.R faa70a06a3428b56c5dd7b773667673d *R/sanitize_numderiv.R 3cefc60dac44476adcf7c812626d58c9 *R/sanitize_type.R 727516061293220041b991c2343eb4ce *R/sanitize_variables.R e40df5bbcc4d88eb52cd261482c5a8fe *R/sanitize_vcov.R 56a607380a56072ec5b4f91f497b5700 *R/sanity.R 6385876a8a17b4a1e32d65af31e41976 *R/sanity_by.R 44c849eef7c2178a3d87a034bdedeb7f *R/sanity_dots.R ba4e208bf4443e81e00cffc920387659 *R/sanity_model.R c3468fc7ad0a1e1d7afbd66058c8776f *R/set_coef.R a7ec0ae417f84bd1b9d1ffd9fcb2fb9a *R/settings.R bed06eeee522bc0204a5564ad51e30c7 *R/slopes.R aaef0ac1c9d1ecf3dc5ff56f4d784242 *R/sort.R 5aca9f19a0e16d0dbdca9963f750e99b *R/tinytest.R 0725de517beb9426ab24426a7fe0e788 *R/type_dictionary.R 8c3288b68106bd3979351a0e10fb2d0a *R/unpack_matrix_cols.R 9a25c83773827c6e030459ddb31379a5 *R/utils.R d7e8b180541cbf62fe8b08a228fbc8b1 *README.md 4d470d45161e4078f1f46b0b495f3737 *inst/CITATION 7388d57168b866210b551329420431f6 *inst/COPYRIGHTS 37370e23122ced31fe186348dd8c1558 *inst/WORDLIST 4128084ad3401feea0f2d2cf71b948a5 *man/comparisons.Rd 84668bf4b7fa8fc8e3c6351e1bad4e03 *man/complete_levels.Rd 1b589aca82a899e2aa49028bb85c2bcc *man/datagrid.Rd 26f5dc2b3a87bba04de66e5d373f7ba9 *man/datagridcf.Rd 88f305fbe39fd64a4f0ab4cbf7e098f0 *man/deltamethod.Rd 615e980f40da029afe1a3eb08d4a4c18 *man/expect_margins.Rd a13ad2214b8d6671c34bb48ddec118be *man/expect_predictions.Rd 215fd0c51fa09ca96f6aa35da934803f *man/expect_slopes.Rd de8f79175b481378d9d98bc0acd2ef6c *man/figures/marginaleffects_logo_word.svg 8d9cba50f58cde710d8e44dac6187156 *man/figures/mfx_slopes.png 2b0a7cc5ceb04acdb70d81087f214a8a *man/figures/zoo_banner.png db7705987ad953d73a55c9e1465cb027 *man/figures/zoo_header.png 0e76aafdeaeca82ce4d82904a2088a66 *man/get_coef.Rd 564e21c7b44d04c5306b076f8a7b8a0c *man/get_group_names.Rd c8d368f547a63eb8446980f9048fea32 *man/get_model_matrix.Rd c749bdb872b48983696de8abdcde94ff *man/get_predict.Rd 4804d3eb1f99e47e526c464acfb7f8d6 *man/get_varcov_args.Rd 12574aea12a63c164c933e6341bb3ab8 *man/get_vcov.Rd 452ab5b649a2f1fa08aa27e99a8b3cfc *man/hypotheses.Rd 90fd09055e068cb2f070e3a54fd81d82 *man/inferences.Rd e06051cceb21b33ef36fffc5e70984db *man/knit_print.marginaleffects.Rd d122f353a64d83e5f1537251d5d30710 *man/marginal_means.Rd 37f2c2cd77e30a3bd7e21236f21f5c5a *man/marginaleffects.Rd 74c860b56c8c296d9b2e58da6c139822 *man/marginalmeans.Rd f5eee91998298d050863f946e8d5573f *man/meffects.Rd 8069fdd1bb36012aa57d00837f61db50 *man/plot_comparisons.Rd 1b4041626619cfd3153952abffc2e634 *man/plot_predictions.Rd c04941a24ed1bb3468b8eb4b7a942fd7 *man/plot_slopes.Rd 281a145bb93056f6201b86f985857c98 *man/posterior_draws.Rd bb6528442188174f54cb4c0abfbb469b *man/posteriordraws.Rd f3bfa496b5c043ee41cfd96a43f91738 *man/predictions.Rd 99ebcba951af82f5a357de3d47e7c8d3 *man/print.marginaleffects.Rd 1e18cfe170451992ed72e3a2e6313dee *man/reexports.Rd 91ff16c1be878e50bb4853e7c2a92965 *man/sanitize_model_specific.Rd e340e21dada566786a8e6bd967eca89b *man/set_coef.Rd 125f1869ef3208cb5ef57bdd3c683621 *man/slopes.Rd 5610fede2c344e79bf255894567a9bc2 *man/specify_hypothesis.Rd e84fbde88a4134d4d943cd148c5e0a67 *src/RcppExports.cpp 52bfe4eb70930b6c30ac049945bb3d8a *src/eigen.cpp ff2d6bca48b0cc82868ec8a0ad8091c4 *tests/spelling.R 9e02c61c9d64c74037900e0c08616f36 *tests/tinytest.R marginaleffects/R/0000755000176200001440000000000014632674171013620 5ustar liggesusersmarginaleffects/R/backtransform.R0000644000176200001440000000215114631452335016571 0ustar liggesusersbacktransform <- function(x, transform) { # transform can be a function or a named list of length 1 with a function, but could be NULL if (!is.function(transform)) { if (is.null(transform[[1]])) { return(x) } else { transform <- transform[[1]] } } checkmate::assert_data_frame(x) checkmate::assert_function(transform) cols <- intersect(colnames(x), c("estimate", "conf.low", "conf.high")) draws <- attr(x, "posterior_draws") if (!is.null(draws)) { dim_pre <- dim(draws) draws <- transform(draws) dim_post <- dim(draws) if (!identical(dim_pre, dim_post)) { insight::format_error("The `transform` function must return an object of the same class as its input: a matrix input must return a matrix of the same size, and a vector input must return a vector of the same length.") } } for (col in cols) { x[[col]] <- transform(x[[col]]) } for (col in c("std.error", "statistic")) { x[[col]] <- NULL } attr(x, "posterior_draws") <- draws return(x) } marginaleffects/R/get_contrast_data_logical.R0000644000176200001440000000153414631452335021120 0ustar liggesusersget_contrast_data_logical <- function(model, newdata, variable, ...) { # custom data frame or function if (isTRUE(checkmate::check_function(variable$value)) || isTRUE(checkmate::check_data_frame(variable$value))) { out <- contrast_categories_custom(variable, newdata) return(out) } lo <- hi <- newdata lo[[variable$name]] <- FALSE hi[[variable$name]] <- TRUE lab <- suppressWarnings(tryCatch( sprintf(variable$label, TRUE, FALSE), error = function(e) variable$label)) out <- list(rowid = seq_len(nrow(newdata)), lo = lo, hi = hi, original = newdata, ter = rep(variable$name, nrow(newdata)), lab = rep(lab, nrow(newdata))) return(out) } marginaleffects/R/plot.R0000644000176200001440000000210014631452335014705 0ustar liggesusers# The reason why I don't supply these functions is that there is too much ambiguity about which kind of plot people are expecting. The `plot_predictions()` function has a bunch of extra arguments, and makes assumptions based on the order of the user-supplied `condition` values, for example. Having another `plot.predictions()` method in addition would require me to add all those arguments, or to make opinionated decisions that would require a ton of `if/else` based on the original `predictions()` call's `by`, `newdata` grid, and others. This is hard, and almost certainly unsatisfactory. Also, it duplicates the plotting user-interface. It feels better to steer all users to a single point of entry for plots. #' @export plot.predictions <- function(x, ...) { insight::format_error("Please use the `plot_predictions()` function.") } #' @export plot.comparisons <- function(x, ...) { insight::format_error("Please use the `plot_comparisons()` function.") } #' @export plot.slopes <- function(x, ...) { insight::format_error("Please use the `plot_slopes()` function.") }marginaleffects/R/methods_fixest.R0000644000176200001440000000250714631452335016767 0ustar liggesusers#' @rdname get_predict #' @export get_predict.fixest <- function(model, newdata = insight::get_data(model), type = "response", ...) { insight::check_if_installed("fixest") if (is.null(type)) { type <- sanitize_type(model = model, type = type, calling_function = "predictions") } dots <- list(...) # some predict methods raise warnings on unused arguments unused <- c("normalize_dydx", "step_size", "numDeriv_method", "conf.int", "internal_call") dots <- dots[setdiff(names(dots), unused)] # fixest is super slow when using do call because of some `deparse()` call # issue #531: we don't want to waste time computing intervals or risk having # them as leftover columns in contrast computations pred <- try( stats::predict( object = model, newdata = newdata, type = type), silent = TRUE) if (inherits(pred, "try-error")) { return(pred) } if ("rowid" %in% colnames(newdata)) { out <- data.frame( rowid = newdata$rowid, estimate = as.numeric(pred)) } else { out <- data.frame( rowid = seq_len(nrow(newdata)), estimate = as.numeric(pred)) } return(out) } marginaleffects/R/get_modeldata.R0000644000176200001440000001574714631452335016545 0ustar liggesusersget_modeldata <- function(model, additional_variables = FALSE, modeldata = NULL, wts = FALSE, ...) { # mice if (inherits(model, c("mira", "amest"))) { return(modeldata) } # tidymodels: always require `newdata`, because sometimes there needs to be # some pre-processing, and we want to rely on the workflow to do that. # workflows are triggered on `stats::predict()` if (inherits(model, c("model_fit", "workflow"))) { return(NULL) } # otherwise, insight::get_data can sometimes return only the the outcome variable if (inherits(model, "bart")) { modeldata <- insight::get_data(model, additional_variables = TRUE) return(modeldata) } if (!is.null(modeldata)) { modeldata <- set_variable_class(modeldata, model = model) return(modeldata) } # often used to extract `by` if (isTRUE(checkmate::check_data_frame(additional_variables))) { additional_variables <- colnames(additional_variables) } # always get weights if (isTRUE(checkmate::check_string(wts))) { additional_variables <- c(additional_variables, wts) } # feols weights can be a formula if (inherits(model, "fixest")) { fwts <- tryCatch(all.vars(model$call$weights), error = function(e) NULL) additional_variables <- c(additional_variables, fwts) } # after by if (isTRUE(checkmate::check_flag(additional_variables))) { out <- hush(insight::get_data( model, additional_variables = additional_variables, verbose = FALSE) ) out <- set_variable_class(out, model = model) return(out) } # always extract offset variable if available off <- hush(insight::find_offset(model)) if (isTRUE(checkmate::check_formula(off))) { additional_variables <- c(additional_variables, hush(all.vars(off))) } else if (isTRUE(checkmate::check_character(off, max.len = 4))) { if (isTRUE(grepl("~", off))) { additional_variables <- c(additional_variables, hush(all.vars(stats::as.formula(off)))) } else { additional_variables <- c(additional_variables, off) } } # always extract weights variable if available wtsvname <- hush(insight::find_weights(model)) if (isTRUE(checkmate::check_formula(wtsvname))) { additional_variables <- c(additional_variables, hush(all.vars(wtsvname))) } else if (isTRUE(checkmate::check_character(wtsvname, max.len = 4))) { if (isTRUE(grepl("~", wtsvname))) { additional_variables <- c(additional_variables, hush(all.vars(stats::as.formula(wtsvname)))) } else { additional_variables <- c(additional_variables, wtsvname) } } out <- hush(insight::get_data(model, verbose = FALSE, additional_variables = additional_variables)) if (isTRUE(wts)) { tmp <- insight::get_weights(model) if (is.numeric(tmp) && length(tmp) == nrow(out)) { out[["marginaleffects_wts_internal"]] <- tmp } } # iv_robust and some others if (is.null(out)) { out <- evalup(model[["call"]][["data"]]) } if (is.null(out)) { out <- evalup(attr(model, "call")$data) } out <- as.data.frame(out) out <- set_variable_class(out, model = model) return(out) } set_variable_class <- function(modeldata, model = NULL) { if (is.null(modeldata)) return(modeldata) # this can be costly on large datasets, when only a portion of # variables are used in the model variables <- NULL if (is.null(model)) { variables <- tryCatch( unlist(insight::find_variables(model, flatten = TRUE), use.names = FALSE), error = function(e) NULL) } if (is.null(variables)) variables <- colnames(modeldata) out <- modeldata cl <- NULL for (col in variables) { if (is.logical(out[[col]])) { cl[col] <- "logical" } else if (is.character(out[[col]])) { cl[col] <- "character" } else if (is.factor(out[[col]])) { cl[col] <- "factor" } else if (inherits(out[[col]], "Surv")) { # is numeric but breaks the %in% 0:1 check cl[col] <- "other" } else if (is.numeric(out[[col]])) { if (is_binary(out[[col]])) { cl[col] <- "binary" } else { cl[col] <- "numeric" } } else { cl[col] <- "other" } } if (is.null(model)) { attr(out, "marginaleffects_variable_class") <- cl return(out) } te <- hush(insight::find_terms(model, flatten = TRUE)) # in-formula factor regex <- "^(^as\\.factor|^factor)\\((.*)\\)" idx <- gsub( regex, "\\2", Filter(function(x) grepl(regex, x), te)) cl[names(cl) %in% idx] <- "factor" # in-formula categoricals regex <- "^(^mo|^strata)\\((.*)\\)" idx <- gsub( regex, "\\2", Filter(function(x) grepl(regex, x), te)) cl[names(cl) %in% idx] <- "strata" # in-formula numeric regex <- "^numeric\\((.*)\\)$|^as.numeric\\((.*)\\)$" idx <- gsub( regex, "\\1", Filter(function(x) grepl(regex, x), te)) cl[names(cl) %in% idx] <- "numeric" # in-formula logical regex <- "^logical\\((.*)\\)$|^as.logical\\((.*)\\)$" idx <- gsub( regex, "\\1", Filter(function(x) grepl(regex, x), te)) cl[names(cl) %in% idx] <- "logical" # in-formula: fixest::i() fi <- NULL idx <- grepl("^i\\(.*\\)$", te) if (sum(idx) > 0) { arg1 <- lapply(te[idx], function(x) hush(as.character(str2lang(x)[[2]]))) arg2 <- lapply(te[idx], function(x) hush(as.character(str2lang(x)[[3]]))) arg1 <- unlist(arg1, recursive = TRUE) arg2 <- unlist(arg2, recursive = TRUE) arg2 <- gsub("^i\\.", "", arg2[grepl("^i\\.", arg2)]) fi <- unique(c(arg1, arg2)) } for (f in fi) { cl[f] <- "cluster" } # attributes attr(out, "marginaleffects_variable_class") <- cl return(out) } get_variable_class <- function(newdata, variable = NULL, compare = NULL) { if ("marginaleffects_variable_class" %in% names(attributes(newdata))) { cl <- attributes(newdata)$marginaleffects_variable_class } else { newdata <- set_variable_class(newdata) cl <- attributes(newdata)$marginaleffects_variable_class } if (is.null(compare) && is.null(variable)) { out <- cl } else if (is.null(compare)) { out <- cl[variable] } else if (is.null(variable)) { if (isTRUE(compare == "categorical")) { out <- cl[cl %in% c("factor", "character", "logical", "strata", "cluster", "binary")] } else { out <- cl[cl %in% compare] } } else { if (isTRUE(compare == "categorical")) { out <- cl[variable] %in% c("factor", "character", "logical", "strata", "cluster", "binary") } else { out <- cl[variable] %in% compare } } return(out) } marginaleffects/R/methods_glmx.R0000644000176200001440000000041214631452335016425 0ustar liggesusers#' @include set_coef.R #' @rdname set_coef #' @export set_coef.glmx <- function(model, coefs, ...) { out <- model out$coefficients$glm <- coefs[names(out$coefficients$glm)] out$coefficients$extra <- coefs[names(out$coefficients$extra)] return(out) } marginaleffects/R/methods_stats.R0000644000176200001440000000545114631452335016624 0ustar liggesusers#' @include set_coef.R #' @rdname set_coef #' @export set_coef.glm <- function(model, coefs, ...) { model[["coefficients"]] <- sub_named_vector( model[["coefficients"]], coefs ) ## But, there's an edge case!! When `predict(model, se.fit = TRUE)` is called without `newdata`, `predict.lm()` isn't called. ## Instead `model$linear.predictors` is returned directly if `type = "link"` and ## `model$fitted.values` is returned directly if `type = "response"`. ## `marginal_effects()` for "glm" is always called with `newdata`, so we won't hit this. model } #' @rdname set_coef #' @export set_coef.lm <- function(model, coefs, ...) { model[["coefficients"]] <- sub_named_vector( model[["coefficients"]], coefs ) model } #' @rdname get_predict #' @export get_predict.lm <- function(model, newdata = insight::get_data(model), type = "response", ...) { MM <- attr(newdata, "marginaleffects_model_matrix") beta <- get_coef(model) if (!isTRUE(checkmate::check_matrix(MM)) || ncol(MM) != length(beta)) { out <- get_predict.default(model = model, newdata = newdata, type = type, ...) return(out) } p <- model$rank p1 <- seq_len(p) piv <- if (p) qr(model)$pivot[p1] if (!all(seq_len(ncol(MM)) %in% piv)) { MM <- MM[, piv, drop = FALSE] beta <- beta[piv] } if (getOption("marginaleffects_linalg", default = "RcppEigen") == "RcppEigen") { pred <- eigenMatMult(MM, beta) } else { pred <- drop(MM %*% beta) } # `pred` is a secret argument which re-uses the default get_predict to format a vector a data frame using correct `rowid` out <- get_predict.default(model = model, newdata = newdata, type = type, pred = pred, ...) return(out) } #' @rdname get_predict #' @export get_predict.glm <- function(model, newdata = insight::get_data(model), type = "response", ...) { out <- NULL MM <- attr(newdata, "marginaleffects_model_matrix") if (isTRUE(checkmate::check_matrix(MM))) { if (isTRUE(checkmate::check_choice(type, c("link")))) { out <- get_predict.lm(model = model, newdata = newdata, ...) } else if (isTRUE(checkmate::check_choice(type, "response")) || is.null(type)) { out <- get_predict.lm(model = model, newdata = newdata, ...) out$estimate <- stats::family(model)$linkinv(out$estimate) } } if (is.null(out)) { out <- get_predict.default(model = model, newdata = newdata, type = type, ...) } return(out) } #' @include set_coef.R #' @rdname set_coef #' @export set_coef.nls <- function(model, coefs, ...) { out <- model out$m$setPars(coefs) return(out) } #' @include get_coef.R #' @rdname get_coef #' @export get_coef.nls <- function(model, ...) { model$m$getPars() } marginaleffects/R/methods_betareg.R0000644000176200001440000000400614631452335017072 0ustar liggesusers#' @include set_coef.R #' @rdname set_coef #' @export set_coef.betareg <- function(model, coefs, ...) { # coefs are split between mean coefs (which can be length 0) and precision coefs # (which must be length > 0 and always start with "(phi)_" due to get_coef.betareg(), # to match with get_varcov(., component = "all") output). In betareg object, these # are stored as two elements in a list, with precision coefs lacking the "(phi)_" # prefix, so we remove it. mean_coefs <- coefs[names(coefs) != "(phi)" & !startsWith(names(coefs), "(phi)_")] precision_coefs <- coefs[names(coefs) == "(phi)" | startsWith(names(coefs), "(phi)_")] names(precision_coefs) <- sub("(phi)_", "", names(precision_coefs), fixed = TRUE) if (length(mean_coefs) > 0) { model[["coefficients"]]$mean[names(mean_coefs)] <- mean_coefs } model[["coefficients"]]$precision[names(precision_coefs)] <- precision_coefs model } #' @include get_coef.R #' @rdname get_coef #' @export get_coef.betareg <- function(model, ...) { mean_coefs <- model$coefficients$mean precision_coefs <- model$coefficients$precision # precision coefs have "(phi)_" appended to their names in covariance matrix; mean coefficients # never have this, so no risk of duplicate names, and precision coefs are always determined. # Mimicking coef.betareg(., "full"). if (!identical(names(precision_coefs), "(phi)")) { names(precision_coefs) <- paste0("(phi)_", names(precision_coefs)) } c(mean_coefs, precision_coefs) } #' @include get_predict.R #' @rdname get_predict #' @export get_predict.betareg <- function(model, newdata, ...) { out <- stats::predict(model, newdata = newdata) out <- data.frame(rowid = seq_len(nrow(newdata)), estimate = out) return(out) } #' @rdname sanitize_model_specific sanitize_model_specific.betareg <- function(model, ...) { insight::check_if_installed("insight", minimum_version = "0.17.1") return(model) } marginaleffects/R/sanitize_type.R0000644000176200001440000000274214631452335016632 0ustar liggesusers#' check type sanity #' #' @param model model object #' @param type character vector #' @noRd sanitize_type <- function(model, type, by = FALSE, calling_function = "raw") { # mlr3 if (inherits(model, "Learner")) { if (is.null(type)) type <- "response" valid <- setdiff(model$predict_types, "se") checkmate::assert_choice(type, choices = valid, null.ok = TRUE) return(type) } checkmate::assert_character(type, len = 1, null.ok = TRUE) if (inherits(model, "model_fit")) { cl <- "model_fit" } else { cl <- class(model)[1] } if (!cl %in% type_dictionary$class) { cl <- "other" } dict <- type_dictionary # raw is often invoked by `get_predict()`, which is required for {clarify} and others. # we only allow invlink(link) in predictions() and marginal_means(), which are handled by {marginaleffects} if (!calling_function %in% "predictions") {# || !isFALSE(by)) { dict <- dict[dict$type != "invlink(link)", , drop = FALSE] } # fixest: invlink(link) only supported for glm model if (inherits(model, "fixest")) { if (!isTRUE(hush(model[["method_type"]]) %in% c("feglm"))) { dict <- dict[dict$type != "invlink(link)", , drop = FALSE] } } dict <- dict[dict$class == cl, , drop = FALSE] checkmate::assert_choice(type, choices = dict$type, null.ok = TRUE) if (is.null(type)) { type <- dict$type[1] } return(type) }marginaleffects/R/RcppExports.R0000644000176200001440000000036114632674171016234 0ustar liggesusers# Generated by using Rcpp::compileAttributes() -> do not edit by hand # Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 eigenMatMult <- function(A, B) { .Call('_marginaleffects_eigenMatMult', PACKAGE = 'marginaleffects', A, B) } marginaleffects/R/print.R0000644000176200001440000002725214631452335015102 0ustar liggesusers#' Print a marginaleffects object in knitr #' #' @keywords internal #' @return A string with class `knit_asis` to be printed in Rmarkdown or Quarto documents. #' @exportS3Method knitr::knit_print knit_print.marginaleffects <- function(x, ...) { if (isTRUE(getOption("marginaleffects_print_style") == "tinytable")) { insight::check_if_installed("tinytable") x <- print(x, "tinytable") printfun <- utils::getFromNamespace("knit_print.tinytable", "tinytable") printfun(x) } else { print(x) } } #' Print `marginaleffects` objects #' #' @description #' This function controls the text which is printed to the console when one of the core `marginalefffects` functions is called and the object is returned: `predictions()`, `comparisons()`, `slopes()`, `hypotheses()`, `avg_predictions()`, `avg_comparisons()`, `avg_slopes()`. #' #' All of those functions return standard data frames. Columns can be extracted by name, `predictions(model)$estimate`, and all the usual data manipulation functions work out-of-the-box: `colnames()`, `head()`, `subset()`, `dplyr::filter()`, `dplyr::arrange()`, etc. #' #' Some of the data columns are not printed by default. You can disable pretty printing and print the full results as a standard data frame using the `style` argument or by applying `as.data.frame()` on the object. See examples below. #' #' @param x An object produced by one of the `marginaleffects` package functions. #' @param style "summary", "data.frame", or "tinytable" #' @param digits The number of digits to display. #' @param p_eps p values smaller than this number are printed in "<0.001" style. #' @param topn The number of rows to be printed from the beginning and end of tables with more than `nrows` rows. #' @param nrows The number of rows which will be printed before truncation. #' @param ncols The maximum number of column names to display at the bottom of the printed output. #' @param type boolean: should the type be printed? #' @param column_names boolean: should the column names be printed? #' @param ... Other arguments are currently ignored. #' @export #' @examples #' library(marginaleffects) #' mod <- lm(mpg ~ hp + am + factor(gear), data = mtcars) #' p <- predictions(mod, by = c("am", "gear")) #' p #' #' subset(p, am == 1) #' #' print(p, style = "data.frame") #' #' data.frame(p) #' print.marginaleffects <- function(x, style = getOption("marginaleffects_print_style", default = "summary"), digits = getOption("marginaleffects_print_digits", default = 3), p_eps = getOption("marginaleffects_print_p_eps", default = 0.001), topn = getOption("marginaleffects_print_topn", default = 5), nrows = getOption("marginaleffects_print_nrows", default = 30), ncols = getOption("marginaleffects_print_ncols", default = 30), type = getOption("marginaleffects_print_type", default = TRUE), column_names = getOption("marginaleffects_print_column_names", default = TRUE), ...) { checkmate::assert_number(digits) checkmate::assert_number(topn) checkmate::assert_number(nrows) checkmate::assert_choice( style, choices = c("data.frame", "summary", "tinytable", "html", "latex", "markdown", "typst") ) if (isTRUE(style == "data.frame")) { print(as.data.frame(x)) return(invisible(x)) } out <- x nrows <- max(nrows, 2 * topn) if ("group" %in% colnames(out) && all(out$group == "main_marginaleffects")) { out$group <- NULL } # subset before rounding so that digits match top and bottom rows if (nrow(out) > nrows) { out <- rbind(utils::head(out, topn), utils::tail(out, topn)) splitprint <- TRUE } else { splitprint <- FALSE } # round and replace NAs ps <- c("p.value", "p.value.nonsup", "p.value.noninf", "p.value.equiv") for (i in seq_along(out)) { if (colnames(out)[i] %in% ps) { out[[i]] <- format.pval(out[[i]], digits = digits, eps = p_eps) } else if (isTRUE("s.value" == colnames(out)[i])) { out[[i]] <- sprintf("%.1f", out[[i]]) } else { out[[i]] <- format(out[[i]], digits = digits) } } if (is.null(attr(x, "conf_level"))) { alpha <- NULL } else { alpha <- 100 * (1 - attr(x, "conf_level")) } # contrast is sometimes useless if ("contrast" %in% colnames(out) && all(out$contrast == "")) { out$contrast <- NULL } statistic_label <- attr(x, "statistic_label") if (is.null(statistic_label)) { if (any(out[["df"]] < Inf)) { statistic_label <- "t" } else { statistic_label <- "z" } } # rename dict <- c( "group" = "Group", "term" = "Term", "contrast" = "Contrast", "hypothesis" = "Hypothesis", "value" = "Value", "by" = "By", "estimate" = "Estimate", "std.error" = "Std. Error", "statistic" = statistic_label, "p.value" = sprintf("Pr(>|%s|)", statistic_label), "s.value" = "S", "conf.low" = ifelse(is.null(alpha), "CI low", sprintf("%.1f %%", alpha / 2)), "conf.high" = ifelse(is.null(alpha), "CI high", sprintf("%.1f %%", 100 - alpha / 2)), "pred.low" = ifelse(is.null(alpha), "Pred low", sprintf("Pred. %.1f %%", alpha / 2)), "pred.high" = ifelse(is.null(alpha), "Pred high", sprintf("Pred. %.1f %%", 100 - alpha / 2)), "pred.set" = ifelse(is.null(alpha), "Pred Set", sprintf("Pred Set %.1f %%", 100 - alpha / 2)), "p.value.nonsup" = "p (NonSup)", "p.value.noninf" = "p (NonInf)", "p.value.equiv" = "p (Equiv)", "df" = "Df", "df1" = "Df 1", "df2" = "Df 2" ) if (inherits(x, "marginalmeans")) { dict["estimate"] <- "Mean" } # Subset columns idx <- c( names(dict), grep("^contrast_", colnames(x), value = TRUE)) # explicitly given by user in `datagrid()` or `by` or `newdata` nd <- attr(x, "newdata") if (is.null(nd)) { nd <- attr(x, "newdata_newdata") } tmp <- c("by", attr(x, "hypothesis_by"), attr(nd, "variables_datagrid"), attr(nd, "newdata_variables_datagrid"), attr(x, "variables_datagrid"), attr(x, "newdata_variables_datagrid") ) if (isTRUE(checkmate::check_character(attr(x, "by")))) { tmp <- c(tmp, attr(x, "by")) } idx <- c(idx[1:grep("by", idx)], tmp, idx[(grep("by", idx) + 1):length(idx)]) if (isTRUE(attr(nd, "newdata_newdata_explicit")) || isTRUE(attr(nd, "newdata_explicit"))) { idx <- c(idx, colnames(nd)) } # drop useless columns: rowid useless <- c("rowid", "rowidcf") # drop useless columns: dv dv <- tryCatch( unlist(insight::find_response(attr(x, "model"), combine = TRUE), use.names = FALSE), error = function(e) NULL) useless <- c(useless, dv) # selection style data.table::setDT(out) # drop useless columns idx <- setdiff(unique(idx), useless) idx <- intersect(idx, colnames(out)) out <- out[, ..idx, drop = FALSE] if ("term" %in% colnames(out) && all(out$term == "cross")) { out[["term"]] <- NULL colnames(out) <- gsub("^contrast_", "C: ", colnames(out)) } for (i in seq_along(dict)) { colnames(out)[colnames(out) == names(dict)[i]] <- dict[i] } # avoid infinite recursion by stripping marginaleffect.summary class data.table::setDF(out) # recommend avg_*() rec <- "" if (isFALSE(attr(x, "by"))) { if (inherits(x, "predictions")) { rec <- "?avg_predictions and " } else if (inherits(x, "comparisons")) { rec <- "?avg_comparisons and " } else if (inherits(x, "slopes")) { rec <- "?avg_slopes and " } } print_columns_text <- print_type_text <- NULL if (ncol(x) <= ncols && isTRUE(column_names)) { print_columns_text <- paste("Columns:", paste(colnames(x), collapse = ", "), "\n") } if (isTRUE(type) && !is.null(attr(x, "type"))) { print_type_text <- paste("Type: ", attr(x, "type"), "\n") } if (style %in% c("tinytable", "html", "latex", "typst", "markdown")) { insight::check_if_installed("tinytable") tab <- as.data.frame(out) if (isTRUE(splitprint)) { tab <- rbind(utils::head(tab, topn), utils::tail(tab, topn)) } # at <- attributes(tab) # attributes(tab) <- at[names(at) %in% c("row.names", "names", "class")] args <- list(x = tab) notes <- c(print_type_text, print_columns_text) if (!is.null(notes)) args$notes <- notes tab <- do.call(tinytable::tt, args) tab <- tinytable::format_tt(tab, escape = TRUE) if (isTRUE(splitprint)) { msg <- "%s rows omitted" msg <- sprintf(msg, nrow(x) - 2 * topn) msg <- stats::setNames(list(topn + 1), msg) tab <- tinytable::group_tt(tab, i = msg) tab <- tinytable::style_tt(tab, i = topn + 1, align = "c") } tab@output <- style if (style == "tinytable") { return(tab) } print(tab) return(invisible(tab)) } # head cat("\n") print_head <- attr(x, "print_head") if (!is.null(print_head)) { cat(print_head, "\n") } # some commands do not generate average contrasts/mfx. E.g., `lnro` with `by` if (splitprint) { print(utils::head(out, n = topn), row.names = FALSE) msg <- "--- %s rows omitted. See %s?print.marginaleffects ---" msg <- sprintf(msg, nrow(x) - 2 * topn, rec) cat(msg, "\n") # remove colnames tmp <- utils::capture.output(print(utils::tail(out, n = topn), row.names = FALSE)) tmp <- paste(tmp[-1], collapse = "\n") cat(tmp) } else { print(out, row.names = FALSE) } cat("\n") cat(print_columns_text) cat(print_type_text) cat("\n") ## This is tricky to extract nicely when transform_* are passed from avg_comparisons to comparisons. I could certainly figure it out, but at the same time, I don't think the print method should return information that is immediately visible from the call. This is different from `type`, where users often rely on the default value, which can change from model to model, so printing it is often # if (!is.null(attr(x, "comparison_label"))) { # cat("Pre-transformation: ", paste(attr(x, "comparison_label"), collapse = ""), "\n") # } # if (!is.null(attr(x, "transform_label"))) { # cat("Post-transformation: ", paste(attr(x, "transform_label"), collapse = ""), "\n") # } print_tail <- attr(x, "print_tail") if (!is.null(print_tail)) { cat(print_tail, "\n") } return(invisible(x)) } #' @noRd #' @export print.hypotheses <- print.marginaleffects #' @noRd #' @export print.predictions <- print.marginaleffects #' @noRd #' @export print.comparisons <- print.marginaleffects #' @noRd #' @export print.slopes <- print.marginaleffects #' @noRd #' @exportS3Method knitr::knit_print knit_print.hypotheses <- knit_print.marginaleffects #' @noRd #' @exportS3Method knitr::knit_print knit_print.predictions <- knit_print.marginaleffects #' @noRd #' @exportS3Method knitr::knit_print knit_print.comparisons <- knit_print.marginaleffects #' @noRd #' @exportS3Method knitr::knit_print knit_print.slopes <- knit_print.marginaleffects marginaleffects/R/equivalence.R0000644000176200001440000000304214631452335016236 0ustar liggesusersequivalence <- function(x, equivalence = NULL, df = Inf, ...) { if (is.null(equivalence)) { return(x) } if (!is.null(equivalence) && any(!c("estimate", "std.error") %in% colnames(x))) { msg <- "The `equivalence` argument is not supported with models for which `marginaleffects` does not estimate a standard error (e.g., bayesian)." insight::format_error(msg) } checkmate::assert_numeric(equivalence, min.len = 1, max.len = 2) if (length(equivalence) == 1) { equivalence <- c(equivalence, equivalence) } delta <- abs(diff(equivalence)) / 2 null <- min(equivalence) + delta # definitions from `emmeans`, with a different user interface based on symmetric "equivalence" x$statistic.noninf <- (x$estimate - equivalence[1]) / x$std.error x$statistic.nonsup <- (x$estimate - equivalence[2]) / x$std.error ## keep this in case we return to the emmeans-style user interface # x$statistic.inf <- (x$estimate - null + delta) / x$std.error # x$statistic.sup <- (x$estimate - null - delta) / x$std.error if (is.infinite(df)) { x$p.value.noninf <- stats::pnorm(x$statistic.noninf, lower.tail = FALSE) x$p.value.nonsup <- stats::pnorm(x$statistic.nonsup, lower.tail = TRUE) } else { x$p.value.noninf <- stats::pt(x$statistic.noninf, lower.tail = FALSE, df = x[["df"]]) x$p.value.nonsup <- stats::pt(x$statistic.nonsup, lower.tail = TRUE, df = x[["df"]]) } x$p.value.equiv <- pmax(x$p.value.nonsup, x$p.value.noninf) return(x) }marginaleffects/R/recall.R0000644000176200001440000000427714631452335015212 0ustar liggesusers# fancy way to catch the call so that get_averages(slopes()) does not evaluate twice # and is fast recall <- function(x, ...) { funs <- c("comparisons", "slopes", "predictions", "marginalmeans", "hypotheses", "avg_predictions", "avg_comparisons", "avg_slopes") # 2-step estimation with already evaluated & assigned call if (!is.call(x)) { # unsupported evaluated object: return `NULL` if (!inherits(x, funs)) { return(NULL) } # retrieve call mc <- attr(x, "call") if (!is.call(mc)) { msg <- sprintf("Call could not be retrieved from object of class %s.", class(x)[1]) insight::format_error(msg) } # unsupported call: return `NULL` } else { if (!as.character(x[1]) %in% funs) { return(NULL) } mc <- x } dots <- list(...) # don't overwrite certain arguments if ("hypothesis" %in% names(mc) && "hypothesis" %in% names(dots)) { if (is.null(dots[["hypothesis"]])) { dots[["hypothesis"]] <- NULL } } # safe to work with original objects when available objs <- c("newdata", "model") for (obj in objs) { if (!is.null(attr(x, "call")[[obj]])) { dots[[obj]] <- attr(x, "call")[[obj]] } } # overwrite previous arguments for (n in names(dots)) { # named NULL should not remove the corresponding argument from the call if (is.null(dots[[n]])) { mc[n] <- list(NULL) } else { mc[[n]] <- dots[[n]] } } ## old `rlang` convenience. I don't think the current version is toooo unsafe. # FUN <- rlang::call_modify # args <- c(list(".call" = quote(mc)), dots) # # evaluate call # mc <- do.call("FUN", args) # # expand user-supplied arguments (don't think this is necessary) # funs <- list( # "predictions" = predictions, # "comparisons" = comparisons, # "slopes" = slopes, # "hypotheses" = hypotheses, # "marginalmeans" = marginalmeans) # mc <- match.call( # definition = funs[[as.character(mc)[1]]], # call = mc) out <- eval(mc) return(out) } marginaleffects/R/unpack_matrix_cols.R0000644000176200001440000000351714631452335017631 0ustar liggesusersunpack_matrix_cols <- function(x) { # what data types are we working with dcs <- sapply(x, function(x) class(x)[1]) # do something if we have matrix columns if (any(mcols <- dcs == "matrix")) { # assume that any matrix columns are of the same number of cols nc <- ncol(x[mcols][[1L]]) out <- lapply(x[mcols], as.vector) other <- lapply(x[!mcols], function(y, nc) rep(y, times = nc), nc = nc) out <- as.data.frame(out) other <- as.data.frame(other) out <- cbind(out, other) # put order back as it was out <- out[names(x)] } else { return(x) } out } # The content of this file was adapted from the `gratia` package # https://github.com/gavinsimpson/gratia # The MIT License (MIT) # # Copyright (c) 2013-2020 Gavin L. Simpson # # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # marginaleffects/R/methods_mlm.R0000644000176200001440000000110714631452335016245 0ustar liggesusers#' @include set_coef.R #' @rdname set_coef #' @export set_coef.mlm <- function(model, coefs, ...) { model$coefficients[] <- coefs return(model) } #' @include get_coef.R #' @rdname get_coef #' @export get_coef.mlm <- function(model, ...) { out <- insight::get_parameters(model, ...) out <- stats::setNames( out$Estimate, sprintf("%s:%s", out$Response, out$Parameter)) return(out) } #' @include get_group_names.R #' @rdname get_group_names #' @export get_group_names.mlm <- function(model, ...) { resp <- insight::get_response(model) return(names(resp)) } marginaleffects/R/methods_MASS.R0000644000176200001440000000441414631452335016227 0ustar liggesusers#' @include get_coef.R #' @rdname get_coef #' @export get_coef.polr <- function(model, ...) { out <- insight::get_parameters(model) out <- stats::setNames(out$Estimate, out$Parameter) names(out) <- gsub("Intercept: ", "", names(out)) return(out) } #' @include set_coef.R #' @rdname set_coef #' @export set_coef.polr <- function(model, coefs, ...) { # in basic model classes coefficients are named vector idx <- match(names(model$coefficients), names(coefs)) model[["coefficients"]] <- coefs[idx] idx <- match(names(model$zeta), names(coefs)) model[["zeta"]] <- coefs[idx] model } #' @include get_group_names.R #' @rdname get_group_names #' @export get_group_names.polr <- function(model, ...) { resp <- insight::get_response(model) if (is.factor(resp)) { out <- levels(resp) } else { out <- unique(resp) } return(out) } #' @include get_predict.R #' @rdname get_predict #' @export get_predict.polr <- function(model, newdata = insight::get_data(model), type = "probs", ...) { type <- sanitize_type(model, type, calling_function = "predictions") # hack: 1-row newdata returns a vector, so get_predict.default does not learn about groups if (nrow(newdata) == 1) { hack <- TRUE newdata <- newdata[c(1, 1), , drop = FALSE] newdata$rowid[1] <- -Inf } else { hack <- FALSE } out <- get_predict.default(model, newdata = newdata, type = type, ...) # hack out <- out[out$rowid != -Inf, ] return(out) } #' @include set_coef.R #' @rdname set_coef #' @export set_coef.glmmPQL <- function(model, coefs, ...) { model[["coefficients"]][["fixed"]][names(coefs)] <- coefs model } #' @rdname get_predict #' @export get_predict.glmmPQL <- function(model, newdata = insight::get_data(model), type = "response", ...) { out <- stats::predict(model, newdata = newdata, type = type, ...) out <- data.frame( rowid = seq_len(nrow(newdata)), estimate = out) return(out) } marginaleffects/R/sanitize_condition.R0000644000176200001440000001567014631452335017643 0ustar liggesuserscondition_shortcuts <- function(x, tr, shortcuts) { if (identical(tr, "threenum")) { m <- mean(x, na.rm = TRUE) s <- stats::sd(x, na.rm = TRUE) out <- c(m - s, m, m + s) } else if (identical(tr, "fivenum")) { out <- stats::fivenum(x, na.rm = TRUE) } else if (identical(tr, "minmax")) { out <- c( min(x, na.rm = TRUE), max(x, na.rm = TRUE)) } else if (identical(tr, "quartile")) { out <- stats::quantile(x, probs = c(.25, .5, .75), na.rm = TRUE) } return(out) } sanitize_condition <- function(model, condition, variables = NULL, modeldata = NULL) { # allow multiple conditions and/or effects checkmate::assert( checkmate::check_character(condition, min.len = 1, max.len = 4), checkmate::check_list(condition, min.len = 1, max.len = 4)) # c("a", "b") or list("a", "b") -> named list of NULLs flag1 <- isTRUE(checkmate::check_character(condition)) flag2 <- isTRUE(checkmate::check_list(condition, names = "unnamed")) && all(sapply(condition, function(x) isTRUE(checkmate::check_string(x)))) if (flag1 || flag2) { condition <- stats::setNames(rep(list(NULL), length(condition)), unlist(condition)) } # validity of the list for (i in seq_along(condition)) { if (identical(names(condition)[i], "")) { if (!isTRUE(checkmate::check_character(condition[[i]], len = 1))) { msg <- "The `condition` argument must be a character vector or a named list." insight::format_error(msg) } else { names(condition)[i] <- condition[[i]] tmp <- stats::setNames(list(NULL), names(condition)[i]) condition <- utils::modifyList(condition, tmp, keep.null = TRUE) } } } # get data to know over what range of values we should plot if (is.null(modeldata) && isTRUE(checkmate::check_character(condition))) { dat <- get_modeldata(model, additional_variables = condition) } else if (is.null(modeldata) && isTRUE(checkmate::check_list(condition))) { dat <- get_modeldata(model, additional_variables = names(condition)) } else { dat <- modeldata } resp <- insight::get_response(model) respname <- insight::find_response(model) flag <- checkmate::check_true(all(names(condition) %in% c(colnames(dat), "group"))) if (!isTRUE(flag)) { msg <- sprintf("Entries in the `condition` argument must be element of: %s", paste(colnames(dat), collapse = ", ")) insight::format_error(msg) } # condition names condition1 <- names(condition)[[1]] condition2 <- hush(names(condition)[[2]]) condition3 <- hush(names(condition)[[3]]) condition4 <- hush(names(condition)[[4]]) # build typical dataset with a sequence of values over "condition" range at_list <- list() shortcuts <- c("threenum", "fivenum", "minmax", "quartile") # condition 1: x-axis if (is.null(condition[[1]])) { if (get_variable_class(dat, condition1, "binary")) { at_list[[condition1]] <- 0:1 } else if (is.numeric(dat[[condition1]]) && !get_variable_class(dat, condition1, "categorical")) { at_list[[condition1]] <- seq( min(dat[[condition1]], na.rm = TRUE), max(dat[[condition1]], na.rm = TRUE), length.out = 50) } else { at_list[[condition1]] <- factor(unique(dat[[condition1]])) } } else { if (isTRUE(checkmate::check_choice(condition[[1]], shortcuts))) { at_list[[condition1]] <- condition_shortcuts(dat[[condition1]], condition[[1]], shortcuts) } else { at_list[[condition1]] <- condition[[1]] } } # condition 2: color if (length(condition) > 1) { if (is.null(condition[[2]])) { if (is.numeric(dat[[condition2]])) { at_list[[condition2]] <- stats::fivenum(dat[[condition2]]) } else { at_list[[condition2]] <- unique(dat[[condition2]]) } } else { if (isTRUE(checkmate::check_choice(condition[[2]], shortcuts))) { at_list[[condition2]] <- condition_shortcuts(dat[[condition2]], condition[[2]], shortcuts) } else { at_list[[condition2]] <- condition[[2]] } } } # condition 3: facet_1 if (length(condition) > 2) { if (is.null(condition[[3]])) { if (is.numeric(dat[[condition3]])) { at_list[[condition3]] <- stats::fivenum(dat[[condition3]]) } else { at_list[[condition3]] <- unique(dat[[condition3]]) } } else { if (isTRUE(checkmate::check_choice(condition[[3]], shortcuts))) { at_list[[condition3]] <- condition_shortcuts(dat[[condition3]], condition[[3]], shortcuts) } else { at_list[[condition3]] <- condition[[3]] } } } # condition 4: facet_2 if (length(condition) > 3) { if (is.null(condition[[4]])) { if (is.numeric(dat[[condition4]])) { at_list[[condition4]] <- stats::fivenum(dat[[condition4]]) } else { at_list[[condition4]] <- unique(dat[[condition4]]) } } else { if (isTRUE(checkmate::check_choice(condition[[4]], shortcuts))) { at_list[[condition4]] <- condition_shortcuts(dat[[condition4]], condition[[4]], shortcuts) } else { at_list[[condition4]] <- condition[[4]] } } } at_list[["model"]] <- model at_list[["newdata"]] <- dat if (isTRUE(checkmate::check_list(variables))) { flag <- all(names(variables) %in% names(condition)) } else { flag <- all(variables %in% names(condition)) } if (!flag) { # sometimes we use the same condition as effect (e.g., GAM vignette), # but otherwise we don't want it at all if (isTRUE(checkmate::check_character(variables))) { dups <- setdiff(variables, names(condition)) for (d in dups) { at_list[[d]] <- NULL } } else { at_list[[names(variables)]] <- NULL } } # mlr3 and tidymodels are not supported by `insight::find_variables()`, so we need to create a grid based on all the variables supplied in `newdata` if (inherits(at_list$model, "Learner") || inherits(at_list$model, "model_fit") || inherits(at_list$model, "workflow") ) { at_list$model <- NULL } # create data nd <- do.call("datagrid", at_list) out <- list( "modeldata" = dat, "newdata" = nd, "resp" = resp, "respname" = respname, "condition" = condition, "condition1" = condition1, "condition2" = condition2, "condition3" = condition3, "condition4" = condition4) return(out) }marginaleffects/R/methods_rstanarm.R0000644000176200001440000000014714631452335017312 0ustar liggesusers#' @include get_predict.R #' @rdname get_predict #' @export get_predict.stanreg <- get_predict.brmsfit marginaleffects/R/methods_nnet.R0000644000176200001440000000707514631452335016436 0ustar liggesusers#' @include set_coef.R #' @rdname set_coef #' @export set_coef.multinom <- function(model, coefs, ...) { # internally, coefficients are held in the `wts` vector, with 0s # interspersed. When transforming that vector to a matrix, we see that the # first row and first column are all zeros. # NOTE: must use `newdata` in predict otherwise returns stored object. b_original <- get_coef(model) model$wts[match(b_original, model$wts)] <- coefs return(model) } #' @include get_coef.R #' @rdname get_coef #' @export get_coef.multinom <- function(model, ...) { out <- insight::get_parameters(model, ...) out <- stats::setNames( out$Estimate, sprintf("%s:%s", out$Response, out$Parameter)) return(out) } #' @include get_group_names.R #' @rdname get_group_names #' @export get_group_names.multinom <- function(model, ...) { resp <- insight::get_response(model) if (is.factor(resp)) { out <- levels(resp) } else { out <- unique(resp) } return(out[2:length(out)]) } #' @include get_predict.R #' @rdname get_predict #' @export get_predict.multinom <- function(model, newdata = insight::get_data(model), type = "probs", ...) { type <- sanitize_type(model, type, calling_function = "predictions") is_latent <- is_mclogit <- is_nnet <- FALSE if (isTRUE(type == "latent") && inherits(model, c("mblogit", "mclogit"))) { is_latent <- TRUE is_mclogit <- TRUE type <- "link" } else if (isTRUE(type == "latent") && inherits(model, "multinom")) { is_latent <- TRUE is_nnet <- TRUE type <- "probs" } # needed because `predict.multinom` uses `data` rather than `newdata` pred <- stats::predict(model, newdata = newdata, type = type, ...) # atomic vector means there is only one row in `newdata` # two levels DV returns a vector if (isTRUE(checkmate::check_atomic_vector(pred))) { y_original <- sort(unique(insight::get_response(model))) two_levels <- length(y_original) == 2 if (isTRUE(two_levels)) { pred <- matrix(pred) colnames(pred) <- as.character(y_original[2]) } else { pred <- matrix(pred, nrow = 1, dimnames = list(NULL, names(pred))) } } if (is_latent && is_mclogit) { missing_level <- as.character(unique(insight::get_response(model))) missing_level <- setdiff(missing_level, colnames(pred)) if (length(missing_level == 1)) { pred <- cbind(0, pred) colnames(pred)[1] <- missing_level pred <- pred - rowMeans(pred) } else { insight::format_error("Unable to compute predictions on the latent scale.") } } else if (is_latent && is_nnet) { inverse_softMax <- function(mu) { log_mu <- log(mu) return(sweep(log_mu, 1, STATS = rowMeans(log_mu), FUN = "-")) } pred <- inverse_softMax(pred) } # matrix with outcome levels as columns out <- data.frame( group = rep(colnames(pred), each = nrow(pred)), estimate = c(pred)) out$group <- group_to_factor(out$group, model) # usually when `newdata` is supplied by `comparisons` if ("rowid" %in% colnames(newdata)) { out$rowid <- rep(newdata$rowid, times = ncol(pred)) } else { out$rowid <- rep(seq_len(nrow(pred)), times = ncol(pred)) } return(out) } marginaleffects/R/plot_predictions.R0000644000176200001440000001666714631452335017337 0ustar liggesusers#' Plot Conditional or Marginal Predictions #' #' @description #' Plot predictions on the y-axis against values of one or more predictors (x-axis, colors/shapes, and facets). #' #' The `by` argument is used to plot marginal predictions, that is, predictions made on the original data, but averaged by subgroups. This is analogous to using the `by` argument in the `predictions()` function. #' #' The `condition` argument is used to plot conditional predictions, that is, predictions made on a user-specified grid. This is analogous to using the `newdata` argument and `datagrid()` function in a `predictions()` call. All variables whose values are not specified explicitly are treated as usual by `datagrid()`, that is, they are held at their mean or mode (or rounded mean for integers). This includes grouping variables in mixed-effects models, so analysts who fit such models may want to specify the groups of interest using the `condition` argument, or supply model-specific arguments to compute population-level estimates. See details below. #' #' See the "Plots" vignette and website for tutorials and information on how to customize plots: #' #' * https://marginaleffects.com/vignettes/plot.html #' * https://marginaleffects.com #' #' @param condition Conditional predictions #' + Character vector (max length 4): Names of the predictors to display. #' + Named list (max length 4): List names correspond to predictors. List elements can be: #' - Numeric vector #' - Function which returns a numeric vector or a set of unique categorical values #' - Shortcut strings for common reference values: "minmax", "quartile", "threenum" #' + 1: x-axis. 2: color/shape. 3: facet (wrap if no fourth variable, otherwise cols of grid). 4: facet (rows of grid). #' + Numeric variables in positions 2 and 3 are summarized by Tukey's five numbers `?stats::fivenum` #' @param by Marginal predictions #' + Character vector (max length 3): Names of the categorical predictors to marginalize across. #' + 1: x-axis. 2: color. 3: facets. #' @param newdata When `newdata` is `NULL`, the grid is determined by the `condition` argument. When `newdata` is not `NULL`, the argument behaves in the same way as in the `predictions()` function. #' @param points Number between 0 and 1 which controls the transparency of raw data points. 0 (default) does not display any points. #' @param draw `TRUE` returns a `ggplot2` plot. `FALSE` returns a `data.frame` of the underlying data. #' @inheritParams plot_slopes #' @inheritParams predictions #' @template model_specific_arguments #' @template type #' @return A `ggplot2` object or data frame (if `draw=FALSE`) #' @export #' @examples #' mod <- lm(mpg ~ hp + wt, data = mtcars) #' plot_predictions(mod, condition = "wt") #' #' mod <- lm(mpg ~ hp * wt * am, data = mtcars) #' plot_predictions(mod, condition = c("hp", "wt")) #' #' plot_predictions(mod, condition = list("hp", wt = "threenum")) #' #' plot_predictions(mod, condition = list("hp", wt = range)) #' plot_predictions <- function(model, condition = NULL, by = NULL, newdata = NULL, type = NULL, vcov = NULL, conf_level = 0.95, wts = FALSE, transform = NULL, points = 0, rug = FALSE, gray = FALSE, draw = TRUE, ...) { dots <- list(...) checkmate::assert_number(points, lower = 0, upper = 1) if ("variables" %in% names(dots)) { insight::format_error("The `variables` argument is not supported by this function.") } if ("effect" %in% names(dots)) { insight::format_error("The `effect` argument is not supported by this function.") } if ("transform_post" %in% names(dots)) { # backward compatibility transform <- dots[["transform_post"]] } if (inherits(model, "mira") && is.null(newdata)) { msg <- "Please supply a data frame to the `newdata` argument explicitly." insight::format_error(msg) } # order of the first few paragraphs is important scall <- rlang::enquo(newdata) newdata <- sanitize_newdata_call(scall, newdata, model, by = by) if (!isFALSE(wts) && is.null(by)) { insight::format_error("The `wts` argument requires a `by` argument.") } checkmate::assert_character(by, null.ok = TRUE) # sanity check checkmate::assert_character(by, null.ok = TRUE, max.len = 4, min.len = 1, names = "unnamed") if ((!is.null(condition) && !is.null(by)) || (is.null(condition) && is.null(by))) { msg <- "One of the `condition` and `by` arguments must be supplied, but not both." insight::format_error(msg) } modeldata <- get_modeldata( model, additional_variables = c(names(condition), by), wts = wts) # mlr3 and tidymodels if (is.null(modeldata) || nrow(modeldata) == 0) { modeldata <- newdata } # conditional if (!is.null(condition)) { condition <- sanitize_condition(model, condition, variables = NULL, modeldata = modeldata) v_x <- condition$condition1 v_color <- condition$condition2 v_facet_1 <- condition$condition3 v_facet_2 <- condition$condition4 datplot <- predictions( model, newdata = condition$newdata, type = type, vcov = vcov, conf_level = conf_level, transform = transform, modeldata = modeldata, wts = wts, ...) } # marginal if (!isFALSE(by) && !is.null(by)) { # switched from NULL above condition <- NULL newdata <- sanitize_newdata( model = model, newdata = newdata, modeldata = modeldata, by = by, wts = wts) # tidymodels & mlr3 if (is.null(modeldata)) { modeldata <- newdata } datplot <- predictions( model, by = by, type = type, vcov = vcov, conf_level = conf_level, wts = wts, transform = transform, newdata = newdata, modeldata = modeldata, ...) v_x <- by[[1]] v_color <- hush(by[[2]]) v_facet_1 <- hush(by[[3]]) v_facet_2 <- hush(by[[4]]) } dv <- unlist(insight::find_response(model, combine = TRUE), use.names = FALSE)[1] datplot <- plot_preprocess(datplot, v_x = v_x, v_color = v_color, v_facet_1 = v_facet_1, v_facet_2 = v_facet_2, condition = condition, modeldata = modeldata) # return immediately if the user doesn't want a plot if (isFALSE(draw)) { out <- as.data.frame(datplot) attr(out, "posterior_draws") <- attr(datplot, "posterior_draws") return(out) } # ggplot2 insight::check_if_installed("ggplot2") p <- plot_build(datplot, v_x = v_x, v_color = v_color, v_facet_1 = v_facet_1, v_facet_2 = v_facet_2, points = points, modeldata = modeldata, dv = dv, rug = rug, gray = gray) p <- p + ggplot2::labs( x = v_x, y = dv, color = v_color, fill = v_color, linetype = v_color) # attach model data for each of use attr(p, "modeldata") <- modeldata return(p) } marginaleffects/R/methods_quantreg.R0000644000176200001440000000402714631452335017312 0ustar liggesusers#' @rdname get_predict #' @export get_predict.rq <- function(model, newdata = insight::get_data(model), type = NULL, ...) { # type argument of the method is used to specify confidence interval type insight::check_if_installed("quantreg") if (isTRUE(getOption("marginaleffects_linalg", default = "RcppEigen") == "RcppEigen")) { MM <- attr(newdata, "marginaleffects_model_matrix") if (isTRUE(checkmate::check_matrix(MM))) { beta <- get_coef(model) out <- hush(eigenMatMult(MM, beta)) if (isTRUE(checkmate::check_numeric(out, len = nrow(newdata)))) { out <- data.frame(rowid = newdata$rowid, estimate = out) return(out) } else { out = data.frame(rowid = seq_len(length(out)), estimate = out) } } } out <- quantreg::predict.rq(model, newdata = newdata, ...) if (isTRUE(checkmate::check_numeric(out, len = nrow(newdata)))) { out <- data.frame(rowid = newdata$rowid, estimate = out) } else { out = data.frame(rowid = seq_len(length(out)), estimate = out) } return(out) } #' @include sanity_model.R #' @rdname sanitize_model_specific #' @keywords internal sanitize_model_specific.rqs <- function(model, ...) { stop("`marginaleffects` only supports `quantreg::rq` models with a single `tau` value.", call. = FALSE) } # #' @rdname get_model_matrix # #' @keywords internal # #' @export # get_model_matrix.rq <- function(object, newdata) { # tt <- terms(object) # Terms <- delete.response(tt) # m <- model.frame(Terms, newdata, na.action = na.pass, xlev = object$xlevels) # if (!is.null(cl <- attr(Terms, "dataClasses"))) # stats::.checkMFClasses(cl, m) # X <- model.matrix(Terms, m, contrasts.arg = object$contrasts) # if (!isTRUE(nrow(X) == nrow(newdata))) { # return(NULL) # } else { # return(X) # } # }marginaleffects/R/get_term_labels.R0000644000176200001440000000132314631452335017065 0ustar liggesusersget_term_labels <- function(x, idx = NULL) { if (is.data.frame(x)) { if ("term" %in% names(x) && length(unique(x$term)) == nrow(x)) { return(unique(x$term)) } else if (any(grepl("^contrast", names(x)))) { tmp <- grep("^term$|^contrast", names(x)) out <- x[, tmp, drop = FALSE] if (length(unique(out[["term"]])) == 1) { out[["term"]] <- NULL } out <- do.call(paste, c(out, sep = " ")) } else { out <- paste0("b", seq_len(nrow(x))) } } else if (is.vector(x)) { if (!is.null(names(x))) { out <- names(x) } else { out <- paste0("b", seq_along(x)) } } else { return(NULL) } if (!is.null(idx)) out <- out[idx] return(out) }marginaleffects/R/github_issue.R0000644000176200001440000000040114631452335016423 0ustar liggesusersgithub_issue <- function() { msg <- insight::format_string( "Please report this error along with a minimal reproducible example using publicly available data on Github: https://github.com/vincentarelbundock/marginaleffects/issues ") } marginaleffects/R/methods_brglm2.R0000644000176200001440000000114014631452335016642 0ustar liggesusers#' @rdname get_coef #' @export get_coef.brmultinom <- function(model, ...) { out <- insight::get_parameters(model) out <- stats::setNames(out$Estimate, sprintf("%s:%s", out$Response, out$Parameter)) return(out) } #' @include methods_nnet.R #' @rdname get_predict #' @export get_predict.brmultinom <- get_predict.multinom #' @include get_group_names.R #' @include methods_nnet.R #' @rdname get_group_names #' @export get_group_names.bracl <- get_group_names.multinom #' @rdname get_coef #' @export get_coef.bracl <- function(model, ...) { stats::coef(model) } marginaleffects/R/methods_mclogit.R0000644000176200001440000000333314631452335017121 0ustar liggesusers#' @rdname get_group_names #' @export get_group_names.mblogit <- function(model, type, ...) { out <- get_predict(model, type = type) if ("group" %in% colnames(out)) { out <- unique(out$group) } else { out <- "main_marginaleffects" } return(out) } #' @include sanity_model.R #' @rdname sanitize_model_specific #' @export sanitize_model_specific.mblogit <- function(model, calling_function = "marginaleffects", ...) { if (calling_function == "marginaleffects") { variables <- insight::find_variables(model, flatten = TRUE) dat <- insight::get_data(model) dat <- dat[, intersect(variables, colnames(dat))] flag <- any(sapply(dat, is.character)) if (isTRUE(flag)) { stop("Cannot compute marginal effects for models of class `mblogit` when the data includes character variables. Please convert character variables to factors in the dataset before fitting the model, and call `marginaleffects` again.", call. = FALSE) } } return(model) } #' @rdname get_predict #' @export get_predict.mblogit <- function(model, newdata = insight::get_data(model), type = "response", ...) { out <- suppressMessages( get_predict.multinom(model = model, newdata = newdata, type = type, ...)) return(out) } #' @rdname get_coef #' @export get_coef.mblogit <- function(model, ...) { # get_coef.default uses `insight::get_parameters`, but does not combine # Response and Parameter columns. This also matches naming scheme from # `vcov` stats::coef(model) }marginaleffects/R/deprecated.R0000644000176200001440000003471014631452335016043 0ustar liggesusers#' Deprecated function #' #' @keywords internal #' @export deltamethod <- function(...) { .Deprecated("hypotheses()") } #' Deprecated function #' #' @keywords internal #' @export marginaleffects <- function(...) { .Deprecated("slopes()") slopes(...) } #' Deprecated function #' #' @keywords internal #' @export meffects <- marginaleffects #' Deprecated function #' #' @keywords internal #' @export datagridcf <- function(...) { .Deprecated('datagrid(x = 1:2, grid_type = "counterfactual")') datagridcf_internal(...) } #' Deprecated function #' #' @keywords internal #' @export marginal_means <- function(model, variables = NULL, newdata = NULL, vcov = TRUE, conf_level = 0.95, type = NULL, transform = NULL, cross = FALSE, hypothesis = NULL, equivalence = NULL, p_adjust = NULL, df = Inf, wts = "equal", by = NULL, numderiv = "fdforward", ...) { .Deprecated(' predictions(mod, by = "x", newdata = datagrid(grid_type = \"balanced\")) ') # deprecation and backward compatibility dots <- list(...) sanity_equivalence_p_adjust(equivalence, p_adjust) if ("transform_post" %in% names(dots)) transform <- dots[["transform_post"]] if ("variables_grid" %in% names(dots)) { if (!is.null(newdata)) { insight::format_error("The `variables_grid` argument and has been replaced by `newdata`. These two arguments cannot be used simultaneously.") } newdata <- dots[["variables_grid"]] } if (!is.null(equivalence) && !is.null(p_adjust)) { insight::format_error("The `equivalence` and `p_adjust` arguments cannot be used together.") } numderiv = sanitize_numderiv(numderiv) # build call: match.call() doesn't work well in *apply() call_attr <- c(list( name = "marginal_means", model = model, newdata = newdata, variables = variables, type = type, vcov = vcov, by = by, conf_level = conf_level, transform = transform, wts = wts, hypothesis = hypothesis, equivalence = equivalence, p_adjust = p_adjust, df = df), list(...)) call_attr <- do.call("call", call_attr) # multiple imputation if (inherits(model, c("mira", "amest"))) { out <- process_imputation(model, call_attr, marginal_means = TRUE) return(out) } # if type is NULL, we backtransform if relevant type_string <- sanitize_type(model = model, type = type, calling_function = "marginal_means") if (type_string == "invlink(link)") { if (is.null(hypothesis)) { type_call <- "link" } else { type_call <- "response" type_string <- "response" insight::format_warning('The `type="invlink"` argument is not available unless `hypothesis` is `NULL` or a single number. The value of the `type` argument was changed to "response" automatically. To suppress this warning, use `type="response"` explicitly in your function call.') } } else { type_call <- type_string } modeldata <- get_modeldata(model, additional_variables = FALSE, wts = wts) checkmate::assert_flag(cross) transform <- sanitize_transform(transform) conf_level <- sanitize_conf_level(conf_level, ...) model <- sanitize_model(model, vcov = vcov, calling_function = "marginalmeans") checkmate::assert_choice(wts, choices = c("equal", "cells", "proportional")) if (wts != "equal" && is.data.frame(newdata)) { insight::format_error('The `wts` argument must be "equal" when `newdata` is a data frame.') } tmp <- sanitize_hypothesis(hypothesis, ...) hypothesis <- tmp$hypothesis hypothesis_null <- tmp$hypothesis_null sanity_dots(model = model, ...) if (inherits(model, c("brmsfit", "bart"))) { insight::format_error("This model object type is not yet supported by the `marginal_means` function.") } # fancy vcov processing to allow strings like "HC3" vcov_false <- isTRUE(vcov == FALSE) vcov <- get_vcov(model, vcov = vcov, type = type, ...) # focal categorical variables checkmate::assert_character(variables, min.len = 1, null.ok = TRUE) if (any(variables %in% insight::find_response(model))) { insight::format_error("The `variables` vector cannot include the response.") } if (is.null(variables)) { variables <- insight::find_predictors(model, flatten = TRUE) } idx <- vapply( variables, FUN = get_variable_class, newdata = modeldata, FUN.VALUE = logical(1), compare = c("logical", "character", "factor")) focal <- variables[idx] if (length(focal) == 0) { insight::format_error("No categorical predictor was found in the model data or `variables` argument.") } # non-focal categorical variables checkmate::assert( checkmate::check_null(newdata), checkmate::check_character(newdata), checkmate::check_data_frame(newdata)) if (is.null(newdata)) { nonfocal <- insight::find_predictors(model, flatten = TRUE) nonfocal <- setdiff(nonfocal, focal) } else if (is.character(newdata)) { if (!all(newdata %in% colnames(modeldata))) { insight::format_error("Some of the variables in `newdata` are missing from the data used to fit the model.") } nonfocal <- setdiff(newdata, focal) } else if (is.data.frame(newdata)) { nonfocal <- colnames(newdata) } idx <- vapply( nonfocal, FUN = get_variable_class, newdata = modeldata, FUN.VALUE = logical(1), compare = c("logical", "character", "factor")) nonfocal <- nonfocal[idx] # grid args <- list(model = model) if (is.data.frame(newdata)) { for (v in focal) { args[[v]] <- unique(modeldata[[v]]) } newgrid <- do.call(datagridcf, args) } else { for (v in c(focal, nonfocal)) { args[[v]] <- unique(modeldata[[v]]) } newgrid <- do.call(datagrid, args) } # by: usual tests + only data frames in `marginal_means()` # after newgrid checkmate::assert_data_frame(by, null.ok = TRUE) sanity_by(by, newgrid) # weights if (identical(wts, "equal")) { newgrid[["wts"]] <- 1 } else if (identical(wts, "proportional")) { wtsgrid <- copy(data.table(modeldata)[, ..nonfocal]) idx <- nonfocal wtsgrid[, N := .N] wtsgrid[, "wts" := .N / N, by = idx] # sometimes datagrid() converts to factors when there is a transformation # in the model formula, so we need to standardize the data for (v in colnames(newgrid)) { if (v %in% colnames(wtsgrid) && is.factor(newgrid[[v]])) { wtsgrid[[v]] <- factor(wtsgrid[[v]], levels = levels(newgrid[[v]])) } } wtsgrid <- unique(wtsgrid) newgrid <- merge(newgrid, wtsgrid, all.x = TRUE) newgrid[["wts"]][is.na(newgrid[["wts"]])] <- 0 } else if (identical(wts, "cells")) { # https://stackoverflow.com/questions/66748520/what-is-the-difference-between-weights-cell-and-weights-proportional-in-r-pa idx <- c(focal, nonfocal) wtsgrid <- copy(data.table(modeldata)[, ..idx]) if (length(idx) == 0) { newgrid[["wts"]] <- 1 return(newgrid) } else { wtsgrid <- data.table(modeldata)[ , .(wts = .N), by = idx][ , wts := wts / sum(wts)] # sometimes datagrid() converts to factors when there is a transformation # in the model formula, so we need to standardize the data for (v in colnames(newgrid)) { if (v %in% colnames(wtsgrid) && is.factor(newgrid[[v]])) { wtsgrid[[v]] <- factor(wtsgrid[[v]], levels = levels(newgrid[[v]])) } } wtsgrid <- unique(wtsgrid) newgrid <- merge(newgrid, wtsgrid, all.x = TRUE) newgrid[["wts"]][is.na(newgrid[["wts"]])] <- 0 } } # `equivalence` should not be passed to predictions() at this stage args <- list( model = model, newdata = newgrid, type = type_call, variables = focal, cross = cross, hypothesis = hypothesis, by = by, modeldata = modeldata) args <- c(args, list(...)) args[["equivalence"]] <- NULL mm <- do.call(get_marginalmeans, args) # we want consistent output, regardless of whether `data.table` is installed/used or not out <- as.data.frame(mm) # standard errors via delta method if (!vcov_false) { args <- list( model, vcov = vcov, type = type_call, FUN = get_se_delta_marginalmeans, index = NULL, variables = focal, newdata = newgrid, cross = cross, modeldata = modeldata, hypothesis = hypothesis, by = by, numderiv = numderiv) args <- c(args, list(...)) args[["equivalence"]] <- NULL se <- do.call(get_se_delta, args) # get rid of attributes in column out[["std.error"]] <- as.numeric(se) J <- attr(se, "jacobian") } else { J <- NULL } out <- get_ci( out, conf_level = conf_level, vcov = vcov, null_hypothesis = hypothesis_null, df = df, p_adjust = p_adjust, model = model, ...) # equivalence tests out <- equivalence(out, equivalence = equivalence, df = df, ...) # after assign draws if (identical(type_string, "invlink(link)")) { linv <- tryCatch(insight::link_inverse(model), error = function(e) identity) out <- backtransform(out, transform = linv) } out <- backtransform(out, transform) # column order cols <- c("rowid", "group", colnames(by), "term", "hypothesis", "value", variables, "estimate", "std.error", "statistic", "p.value", "s.value", "conf.low", "conf.high", sort(colnames(out))) cols <- unique(cols) cols <- intersect(cols, colnames(out)) out <- out[, cols, drop = FALSE] # attributes attr(out, "model") <- model attr(out, "jacobian") <- J attr(out, "type") <- type_string attr(out, "model_type") <- class(model)[1] attr(out, "variables") <- variables attr(out, "call") <- call_attr attr(out, "conf_level") <- conf_level attr(out, "transform_label") <- names(transform)[1] if (isTRUE(cross)) { attr(out, "variables_grid") <- setdiff(nonfocal, variables) } else { attr(out, "variables_grid") <- unique(c(nonfocal, variables)) } if (inherits(model, "brmsfit")) { insight::check_if_installed("brms") attr(out, "nchains") <- brms::nchains(model) } class(out) <- c("marginalmeans", class(out)) return(out) } get_marginalmeans <- function(model, newdata, type, variables, cross, modeldata, hypothesis = NULL, by = NULL, ...) { if ("wts" %in% colnames(newdata)) { wts <- "wts" } else { wts <- NULL } # predictions for each cell of all categorical data, but not the response if (isTRUE(cross) || length(variables) == 1) { out <- predictions( model = model, newdata = newdata, type = type, vcov = FALSE, modeldata = modeldata, wts = wts, by = c("group", variables), ...) if (length(variables) == 1) { out$term <- variables out$value <- out[[variables]] } # predictions for each variable individual, then bind } else { pred_list <- draw_list <- list() for (v in variables) { tmp <- predictions( model = model, newdata = newdata, type = type, vcov = FALSE, modeldata = modeldata, wts = wts, by = c("group", v), ...) tmp$rowid <- NULL draw_list[[v]] <- attr(tmp, "posterior_draws") tmp$term <- v data.table::setnames(tmp, old = v, new = "value") pred_list[[v]] <- tmp } # try to preserve term-value class, but convert to character if needed to bind classes <- sapply(pred_list, function(x) class(x$value)[1]) if (length(unique(classes)) > 1) { for (i in seq_along(pred_list)) { pred_list[[i]]$value <- as.character(pred_list[[i]]$value) } } out <- rbindlist(pred_list) } data.table::setDT(out) if (isTRUE(checkmate::check_data_frame(by))) { # warnings for factor vs numeric vs character. merge.data.table usually still works. bycols <- intersect(colnames(out), colnames(by)) if (length(bycols) == 0) { msg <- "There is no common columns in `by` and in the output of `marginal_means()`. Make sure one of the entries in the `variables` argument corresponds to one of the columns in `by`." insight::format_error(msg) } for (b in bycols) { if (is.factor(out[[b]]) && is.numeric(by[[b]])) { out[[b]] <- as.numeric(as.character(out[[b]])) } else if (is.numeric(out[[b]]) && is.factor(by[[b]])) { by[[b]] <- as.numeric(as.character(by[[b]])) } else if (is.factor(out[[b]]) && is.character(by[[b]])) { out[[b]] <- as.character(out[[b]]) } else if (is.character(out[[b]]) && is.factor(by[[b]])) { by[[b]] <- as.character(by[[b]]) } } out <- merge(out, by, sort = FALSE) out <- out[, .(estimate = mean(estimate)), by = "by"] } if (!is.null(hypothesis)) { out <- get_hypothesis(out, hypothesis, by = by) } return(out) } #' Deprecated function #' #' @keywords internal #' @export marginalmeans <- marginal_means marginaleffects/R/methods_afex.R0000644000176200001440000000244314631452335016407 0ustar liggesusers #' @include set_coef.R #' @rdname set_coef #' @export set_coef.afex_aov <- function(model, coefs, ...) { if (isTRUE(checkmate::check_matrix(model$lm$coefficients))) { mat <- matrix(coefs, ncol = ncol(model$lm$coefficients)) dimnames(mat) <- dimnames(model$lm$coefficients) model$lm$coefficients <- mat } else { model$lm$coefficients <- coefs } return(model) } #' @include get_coef.R #' @rdname get_coef #' @export get_coef.afex_aov <- function(model, ...) { b <- insight::get_parameters(model) b <- stats::setNames(b$Estimate, paste(b$Parameter, b$Response, sep = ":")) return(b) } #' @include get_vcov.R #' @rdname get_vcov #' @export get_vcov.afex_aov <- function(model, vcov = NULL, ...) { if (!is.null(vcov) && !is.logical(vcov)) { stop("The `vcov` argument is not supported for models of this class.") } insight::get_varcov(model) } #' @include get_predict.R #' @rdname get_predict #' @export get_predict.afex_aov <- function(model, newdata = NULL, ...) { out <- stats::predict(model, newdata = newdata) out <- data.frame(estimate = out) if (isTRUE("rowid" %in% colnames(newdata))) { out[["rowid"]] <- newdata[["rowid"]] } else { out[["rowid"]] <- seq_len(nrow(out)) } return(out) } marginaleffects/R/mean_or_mode.R0000644000176200001440000000303314631452335016361 0ustar liggesusers#' find mode, preserve type, and pick an arbitrary value when multi-modal #' https://stackoverflow.com/a/8189441/342331 #' @noRd get_mode <- function(x) { ux <- unique(x) ux[which.max(tabulate(match(x, ux)))] } #################################################################### # The functions below were copied from the `prediction` package. ## # Copyright: Thomas J. Leeper 2016-2018 ## # MIT License ## #################################################################### #' Compute the mode or mean of `x` #' @param x extract the mean or the mode of vector or data.frame x depending on its type #' @keywords internal #' @noRd #' @return numeric vector get_mean_or_mode <- function(x) { UseMethod("get_mean_or_mode") } #' @export get_mean_or_mode.default <- function(x) { mean(x) } #' @export get_mean_or_mode.character <- function(x) { get_mode(x) } #' @export get_mean_or_mode.factor <- function(x) { get_mode(x) } #' @export get_mean_or_mode.logical <- function(x) { get_mode(x) } #' @export get_mean_or_mode.data.frame <- function(x) { out <- list() for (n in names(x)) { # variables transformed to factor in formula are assigned a "factor" # TRUE attribute by insight::get_data if (isTRUE(attributes(x)$marginaleffects_variable_class[[n]] == "factor")) { out[[n]] <- get_mean_or_mode.factor(x[[n]]) } else { out[[n]] <- get_mean_or_mode(x[[n]]) } } return(out) } marginaleffects/R/set_coef.R0000644000176200001440000000252514631452335015531 0ustar liggesusers#' Internal function to set coefficients #' #' Set the coefficients in a model to different values and return the modified object (internal function) #' #' @rdname set_coef #' @param model object to modify #' @param coefs vector of coefficients to insert in the model object #' @export #' @keywords internal #' @return Model object of the same class as the `model` argument, but with #' different stored coefficients. #' @details To compute the variance of marginal effects we need to take the #' Jacobian with # respect to the model coefficients. These functions manipulate model objects # to change the coefficients stored internally, which changes the output of the # `predict()` function. set_coef <- function(model, coefs, ...) { UseMethod("set_coef") } #' @rdname set_coef #' @export set_coef.default <- function(model, coefs, ...) { # in basic model classes coefficients are named vector # in ordinal::clm models, there are sometimes duplicates, so name matching doesn't work # sometimes names are backticked, others not Issue #1005 a <- gsub("`", "", names(coefs)) b <- gsub("`", "", names(model$coefficients)) flag <- length(model[["coefficients"]]) == length(coefs) && all(a == b) if (flag) { model[["coefficients"]] <- coefs } else { model[["coefficients"]][names(coefs)] <- coefs } model } marginaleffects/R/by.R0000644000176200001440000000522314631452335014352 0ustar liggesusersget_by <- function( estimates, draws, newdata, by, byfun = NULL, verbose = TRUE, ...) { if (is.null(by) || isFALSE(by)) { out <- estimates attr(out, "posterior_draws") <- draws return(out) } missing <- setdiff(setdiff(colnames(by), "by"), colnames(estimates)) if (length(missing) > 0) { idx <- intersect(c("rowid", "rowidcf", missing), colnames(newdata)) estimates <- merge(estimates, newdata[, idx], sort = FALSE, all.x = TRUE) } if (isTRUE(by)) { regex <- "^term$|^group$|^contrast$|^contrast_" bycols <- grep(regex, colnames(estimates), value = TRUE) } else if (isTRUE(checkmate::check_character(by))) { bycols <- by } else if (isTRUE(checkmate::check_data_frame(by))) { idx <- setdiff(intersect(colnames(estimates), colnames(by)), "by") # harmonize column types for (v in colnames(by)) { if (isTRUE(is.character(estimates[[v]])) && isTRUE(is.numeric(by[[v]]))) { by[[v]] <- as.character(by[[v]]) } else if (isTRUE(is.numeric(estimates[[v]])) && isTRUE(is.character(by[[v]]))) { by[[v]] <- as.numeric(by[[v]]) } } estimates[by, by := by, on = idx] bycols <- "by" } if ("by" %in% colnames(estimates) && anyNA(estimates[["by"]])) { msg <- insight::format_message("The `by` data.frame does not cover all combinations of response levels and/or predictors. Some estimates will not be included in the aggregation.") if (isTRUE(verbose)) warning(msg, call. = FALSE) tmp <- !is.na(estimates[["by"]]) draws <- draws[tmp, drop = FALSE] estimates <- estimates[tmp, drop = FALSE] } bycols <- intersect(unique(c("term", bycols)), colnames(estimates)) # bayesian if (!is.null(draws)) { estimates <- average_draws( data = estimates, index = bycols, draws = draws, byfun = byfun) # frequentist } else { if (!is.null(byfun)) { estimates <- estimates[, .(estimate = byfun(estimate)), by = bycols] } else if ("marginaleffects_wts_internal" %in% colnames(newdata)) { estimates <- estimates[, .(estimate = stats::weighted.mean( estimate, marginaleffects_wts_internal, na.rm = TRUE)), by = bycols] } else { estimates <- estimates[, .(estimate = mean(estimate, na.rm = TRUE)), by = bycols] } } return(estimates) }marginaleffects/R/inferences.R0000644000176200001440000002140314631452335016057 0ustar liggesusers#' (EXPERIMENTAL) Bootstrap, Conformal, and Simulation-Based Inference #' #' @description #' Warning: This function is experimental. It may be renamed, the user interface may change, or the functionality may migrate to arguments in other `marginaleffects` functions. #' #' Apply this function to a `marginaleffects` object to change the inferential method used to compute uncertainty estimates. #' #' @param x Object produced by one of the core `marginaleffects` functions. #' @param method String #' + "delta": delta method standard errors #' + "boot" package #' + "fwb": fractional weighted bootstrap #' + "rsample" package #' + "simulation" from a multivariate normal distribution (Krinsky & Robb, 1986) #' + "mi" multiple imputation for missing data #' + "conformal_split": prediction intervals using split conformal prediction (see Angelopoulos & Bates, 2022) #' + "conformal_cv+": prediction intervals using cross-validation+ conformal prediction (see Barber et al., 2020) #' @param R Number of resamples, simulations, or cross-validation folds. #' @param conf_type String: type of bootstrap interval to construct. #' + `boot`: "perc", "norm", "basic", or "bca" #' + `fwb`: "perc", "norm", "basic", "bc", or "bca" #' + `rsample`: "perc" or "bca" #' + `simulation`: argument ignored. #' @param conformal_test Data frame of test data for conformal prediction. #' @param conformal_calibration Data frame of calibration data for split conformal prediction (`method="conformal_split`). #' @param conformal_score String. Warning: The `type` argument in `predictions()` must generate predictions which are on the same scale as the outcome variable. Typically, this means that `type` must be "response" or "probs". #' + "residual_abs" or "residual_sq" for regression tasks (numeric outcome) #' + "softmax" for classification tasks (when `predictions()` returns a `group` columns, such as multinomial or ordinal logit models. #' @param ... #' + If `method="boot"`, additional arguments are passed to `boot::boot()`. #' + If `method="fwb"`, additional arguments are passed to `fwb::fwb()`. #' + If `method="rsample"`, additional arguments are passed to `rsample::bootstraps()`. #' + Additional arguments are ignored for all other methods. #' @details #' When `method="simulation"`, we conduct simulation-based inference following the method discussed in Krinsky & Robb (1986): #' 1. Draw `R` sets of simulated coefficients from a multivariate normal distribution with mean equal to the original model's estimated coefficients and variance equal to the model's variance-covariance matrix (classical, "HC3", or other). #' 2. Use the `R` sets of coefficients to compute `R` sets of estimands: predictions, comparisons, slopes, or hypotheses. #' 3. Take quantiles of the resulting distribution of estimands to obtain a confidence interval and the standard deviation of simulated estimates to estimate the standard error. #' #' When `method="fwb"`, drawn weights are supplied to the model fitting function's `weights` argument; if the model doesn't accept non-integer weights, this method should not be used. If weights were included in the original model fit, they are extracted by [weights()] and multiplied by the drawn weights. These weights are supplied to the `wts` argument of the estimation function (e.g., `comparisons()`). #' #' @section References: #' #' Krinsky, I., and A. L. Robb. 1986. “On Approximating the Statistical Properties of Elasticities.” Review of Economics and Statistics 68 (4): 715–9. #' #' King, Gary, Michael Tomz, and Jason Wittenberg. "Making the most of statistical analyses: Improving interpretation and presentation." American journal of political science (2000): 347-361 #' #' Dowd, Bryan E., William H. Greene, and Edward C. Norton. "Computation of standard errors." Health services research 49.2 (2014): 731-750. #' #' Angelopoulos, Anastasios N., and Stephen Bates. 2022. "A Gentle Introduction to Conformal Prediction and Distribution-Free Uncertainty Quantification." arXiv. https://doi.org/10.48550/arXiv.2107.07511. #' #' Barber, Rina Foygel, Emmanuel J. Candes, Aaditya Ramdas, and Ryan J. Tibshirani. 2020. “Predictive Inference with the Jackknife+.” arXiv. http://arxiv.org/abs/1905.02928. #' #' #' @return #' A `marginaleffects` object with simulation or bootstrap resamples and objects attached. #' @examples #' \dontrun{ #' library(marginaleffects) #' library(magrittr) #' set.seed(1024) #' mod <- lm(Sepal.Length ~ Sepal.Width * Species, data = iris) #' #' # bootstrap #' avg_predictions(mod, by = "Species") %>% #' inferences(method = "boot") #' #' avg_predictions(mod, by = "Species") %>% #' inferences(method = "rsample") #' #' # Fractional (bayesian) bootstrap #' avg_slopes(mod, by = "Species") %>% #' inferences(method = "fwb") %>% #' posterior_draws("rvar") %>% #' data.frame() #' #' # Simulation-based inference #' slopes(mod) %>% #' inferences(method = "simulation") %>% #' head() #' } #' @export inferences <- function(x, method, R = 1000, conf_type = "perc", conformal_test = NULL, conformal_calibration = NULL, conformal_score = "residual_abs", ...) { # inherit conf_level from the original object conf_level <- attr(x, "conf_level") if (is.null(conf_level)) conf_level <- 0.95 checkmate::assert( checkmate::check_class(x, "predictions"), checkmate::check_class(x, "comparisons"), checkmate::check_class(x, "slopes"), checkmate::check_class(x, "hypotheses") ) checkmate::assert_number(conf_level, lower = 1e-10, upper = 1 - 1e-10) checkmate::assert_integerish(R, lower = 2) checkmate::assert_choice( method, choices = c("delta", "boot", "fwb", "rsample", "simulation", "conformal_split", "conformal_cv+")) if (method %in% c("conformal_split", "conformal_cv+")) { checkmate::assert_class(x, "predictions") checkmate::assert_choice(conformal_score, choices = c("residual_abs", "residual_sq", "softmax")) checkmate::assert_data_frame(conformal_test, null.ok = FALSE) } if (method == "conformal_split") { checkmate::assert_data_frame(conformal_calibration, null.ok = FALSE) conformal_fun <- conformal_split } if (method == "conformal_cv+") { checkmate::assert_integerish(R, upper = 25) conformal_fun <- conformal_cv_plus } mfx_call <- attr(x, "call") model <- mfx_call[["model"]] # default standard errors are Delta anyway if (method == "delta") { return(x) } else if (method == "boot") { insight::check_if_installed("boot") attr(model, "inferences_method") <- "boot" attr(model, "inferences_dots") <- c(list(R = R), list(...)) attr(model, "inferences_conf_type") <- conf_type } else if (method == "fwb") { insight::check_if_installed("fwb") dots <- list(...) if (!"verbose" %in% names(dots)) { dots[["verbose"]] <- FALSE } attr(model, "inferences_method") <- "fwb" attr(model, "inferences_dots") <- c(list(R = R), dots) attr(model, "inferences_conf_type") <- conf_type if (isTRUE("wts" %in% names(attr(x, "call"))) && !isFALSE(attr(x, "call")[["wts"]])) { insight::format_error('The `fwb` method is not supported with the `wts` argument.') } } else if (method == "rsample") { insight::check_if_installed("rsample") attr(model, "inferences_method") <- "rsample" attr(model, "inferences_dots") <- c(list(times = R), list(...)) attr(model, "inferences_conf_type") <- conf_type } else if (method == "simulation") { insight::check_if_installed("MASS") attr(model, "inferences_method") <- "simulation" attr(model, "inferences_R") <- R } if (isTRUE(grepl("conformal", method))) { out <- conformal_fun( x, R = R, conf_level = conf_level, test = conformal_test, calibration = conformal_calibration, score = conformal_score) } else { mfx_call[["model"]] <- model out <- recall(mfx_call) } return(out) } inferences_dispatch <- function(model, INF_FUN, ...) { args <- list( model = model, INF_FUN = INF_FUN ) args <- c(args, list(...)) if ("rowid" %in% names(args$newdata)) { args$newdata <- subset(args$newdata, rowid > 0) } if (isTRUE(attr(model, "inferences_method") == "rsample")) { do.call(bootstrap_rsample, args) } else if (isTRUE(attr(model, "inferences_method") == "boot")) { do.call(bootstrap_boot, args) } else if (isTRUE(attr(model, "inferences_method") == "fwb")) { do.call(bootstrap_fwb, args) } else if (isTRUE(attr(model, "inferences_method") == "simulation")) { do.call(bootstrap_simulation, args) } else { return(NULL) } } marginaleffects/R/methods_mhurdle.R0000644000176200001440000000143514631452335017124 0ustar liggesusers #' @rdname get_predict #' @export get_predict.mhurdle <- function(model, newdata = insight::get_data(model), type = "response", ...) { out <- stats::predict(model, what = type, newdata = newdata) out <- data.frame(rowid = seq_len(length(out)), estimate = out) return(out) } #' @rdname get_vcov #' @export get_vcov.mhurdle <- function(model, vcov = NULL, ...) { if (!is.null(vcov) && !is.logical(vcov)) { insight::format_error("The `vcov` for this class of models must be TRUE or FALSE.") } out <- try(stats::vcov(model), silent = TRUE) if (inherits(out, "try-error")) { out <- tryCatch(model[["vcov"]], error = function(e) NULL) } return(out) } marginaleffects/R/hypotheses_joint.R0000644000176200001440000001101514631452335017332 0ustar liggesusersjoint_test <- function(object, joint_index = NULL, hypothesis = 0, joint_test = "f", df = NULL) { checkmate::assert_choice(joint_test, c("f", "chisq")) if (joint_test == "f") { checkmate::assert_numeric(df, len = 2, null.ok = TRUE) } else { checkmate::assert_numeric(df, len = 1, null.ok = TRUE) } # theta_hat: P x 1 vector of estimated parameters if (inherits(object, c("slopes", "comparisons"))) { nam <- object$term if ("contrast" %in% names(object)) { nam <- paste(nam, object$contrast) } theta_hat <- stats::setNames(object$estimate, nam) } else { theta_hat <- get_coef(object) } # index checkmate::assert( checkmate::check_integerish(joint_index, lower = 1, upper = length(theta_hat)), checkmate::check_character(joint_index), checkmate::check_true(joint_index) ) if (isTRUE(joint_index)) { joint_index <- seq_along(theta_hat) } else if (isTRUE(checkmate::check_string(joint_index))) { joint_index <- grep(joint_index, names(theta_hat), perl = TRUE) } # V_hat: estimated covariance matrix V_hat <- stats::vcov(object) # n: sample size n <- tryCatch(stats::nobs(object), error = function(e) NULL) if (is.null(n)) n <- tryCatch(stats::nobs(attr(object, "model")), error = function(e) NULL) if (is.null(n)) insight::format_error("Could not extract sample size from model object.") # R: Q x P matrix for testing Q hypotheses on P parameters # build R matrix based on joint_index R <- matrix(0, nrow = length(joint_index), ncol = length(theta_hat)) for (i in seq_along(joint_index)) { if (is.numeric(joint_index)) { R[i, joint_index[i]] <- 1 } else { R[i, which(names(theta_hat) == joint_index[i])] <- 1 } } # null hypothesis checkmate::assert( checkmate::check_number(hypothesis), checkmate::check_numeric(hypothesis, len = nrow(R)), checkmate::check_null(hypothesis) ) if (is.null(hypothesis)) hypothesis <- 0 r <- matrix(hypothesis, nrow = nrow(R), ncol = 1) # Calculate the difference between R*theta_hat and r diff <- R %*% theta_hat - r # Calculate the inverse of R*(V_hat/n)*R' inv <- solve(R %*% V_hat %*% t(R)) # Calculate the Wald test statistic if (joint_test == "f") { wald_statistic <- t(diff) %*% inv %*% diff / dim(R)[1] # Q is the number of rows in R } else if (joint_test == "chisq") { wald_statistic <- t(diff) %*% inv %*% diff # Not normalized for chi-squared joint_test } # Degrees of freedom if (is.null(df)) { if (inherits(object, "lme")) { msg <- "The `hypotheses()` functions uses simple heuristics to select degrees of freedom for this test. See the relevant section in `?hypotheses`. These rules are likely to yield inappropriate results for models of class `%s`. Please supply degrees of freedom values explicitly via the `df` argument." msg <- sprintf(msg, class(object)[1]) insight::format_warning(msg) } df1 <- dim(R)[1] # Q df2 <- tryCatch(insight::get_df(attr(object, "model")), error = function(e) NULL) if (is.null(df2)) tryCatch(insight::get_df(object), error = function(e) NULL) if (is.null(df2)) df2 <- n - length(theta_hat) # n - P } else { df1 <- df[1] df2 <- df[2] } # Calculate the p-value if (joint_test == "f") { p_value <- 1 - stats::pf(wald_statistic, df1, df2) } else if (joint_test == "chisq") { p_value <- 1 - stats::pchisq(wald_statistic, df1) df2 <- NULL } # Return the Wald joint_test statistic and p-value out <- data.frame(statistic = drop(wald_statistic), p.value = drop(p_value)) class(out) <- c("hypotheses", "data.frame") if (joint_test == "f") { attr(out, "statistic_label") <- "F" } else if (joint_test == "chisq") { attr(out, "statistic_label") <- "ChiSq" } # degrees of freedom print if (joint_test == "f") { out$df1 <- df1 out$df2 <- df2 } else { out$df <- df1 } # Create the print_head string print_head <- "\nJoint hypothesis test:\n" if (is.character(joint_index)) { for (i in joint_index) { print_head <- paste0(print_head, i, sprintf(" = %s\n", hypothesis)) } } else if (inherits(object, c("marginaleffects", "comparisons", "slopes", "marginal_means"))) { tmp <- paste0(get_term_labels(object, joint_index), sprintf(" = %s\n", hypothesis)) print_head <- c(print_head, tmp) } else { tmp <- paste0(get_term_labels(stats::coef(object), joint_index), sprintf(" = %s\n", hypothesis)) print_head <- c(print_head, tmp) } attr(out, "print_head") <- print_head return(out) } marginaleffects/R/hush.R0000644000176200001440000000052214631452335014704 0ustar liggesusers# Execute code silently # Do not export to avoid conflict with modelsummary hush <- function(code) { void <- utils::capture.output({ out <- invisible( suppressMessages( suppressWarnings( tryCatch(code, error = function(e) NULL)) ) ) }) return(out) } marginaleffects/R/methods_bife.R0000644000176200001440000000127514631452335016373 0ustar liggesusers#' @include get_predict.R #' @rdname get_predict #' @keywords internal #' @export get_predict.bife <- function(model, newdata = insight::get_data(model), type = "response", ...) { pred <- stats::predict(model, X_new = newdata, type = type, ...) sanity_predict_vector(pred = pred, model = model, newdata = newdata, type = type) sanity_predict_numeric(pred = pred, model = model, newdata = newdata, type = type) out <- data.frame( rowid = seq_len(nrow(newdata)), estimate = pred) return(out) } marginaleffects/R/sanity_by.R0000644000176200001440000000312114631452335015734 0ustar liggesuserssanity_by <- function(by, newdata) { checkmate::assert( checkmate::check_flag(by), checkmate::check_data_frame(by, min.cols = 1, min.rows = 1), checkmate::check_character(by, min.len = 1), checkmate::check_null(by)) known <- c("by", "group", "term", "rowid", "rowidcf", "contrast", colnames(newdata)) if (isTRUE(by == "group") && "group" %in% colnames(newdata)) { msg <- 'The "group" variable name is forbidden to avoid conflicts with the column names of the outputs produced by the `marginaleffects` package. Please rename your variable of change the value of the `by` argument.' insight::format_error(msg) } if (isTRUE(checkmate::check_flag(by))) { flag <- FALSE } else if (inherits(by, "data.frame")) { flag <- !all(colnames(by) %in% known) || !"by" %in% colnames(by) } else { flag <- !all(by %in% known | grepl("^contrast_", by)) } if (flag) { bycols <- paste(setdiff(colnames(newdata), c("rowid", "rowidcf", "term", "group")), collapse = ", ") msg <- c( "The `by` argument must be either:", "", sprintf("1. Character vector in which each element is part of: %s", bycols), "", sprintf("2. A data frame with a `by` column of labels, and in which all other columns are elements of: %s", bycols), "", "It can sometimes be useful to supply a data frame explicitly to the `newdata` argument in order to be able to group by different columns." ) stop(insight::format_message(msg), call. = FALSE) } }marginaleffects/R/slopes.R0000644000176200001440000004671314632657466015273 0ustar liggesusers#' Slopes (aka Partial derivatives, Marginal Effects, or Trends) #' #' @description #' Partial derivative of the regression equation with respect to a regressor of interest. #' #' * `slopes()`: unit-level (conditional) estimates. #' * `avg_slopes()`: average (marginal) estimates. #' #' The `newdata` argument and the `datagrid()` function can be used to control where statistics are evaluated in the predictor space: "at observed values", "at the mean", "at representative values", etc. #' #' See the slopes vignette and package website for worked examples and case studies: #' #' * #' * #' #' @details #' A "slope" or "marginal effect" is the partial derivative of the regression equation #' with respect to a variable in the model. This function uses automatic #' differentiation to compute slopes for a vast array of models, #' including non-linear models with transformations (e.g., polynomials). #' Uncertainty estimates are computed using the delta method. #' #' @param model Model object #' @param variables Focal variables #' * `NULL`: compute slopes or comparisons for all the variables in the model object (can be slow). #' * Character vector: subset of variables (usually faster). #' @param newdata Grid of predictor values at which we evaluate the slopes. #' + Warning: Please avoid modifying your dataset between fitting the model and calling a `marginaleffects` function. This can sometimes lead to unexpected results. #' + `NULL` (default): Unit-level slopes for each observed value in the dataset (empirical distribution). The dataset is retrieved using [insight::get_data()], which tries to extract data from the environment. This may produce unexpected results if the original data frame has been altered since fitting the model. #' + [datagrid()] call to specify a custom grid of regressors. For example: #' - `newdata = datagrid(cyl = c(4, 6))`: `cyl` variable equal to 4 and 6 and other regressors fixed at their means or modes. #' - See the Examples section and the [datagrid()] documentation. #' + [subset()] call with a single argument to select a subset of the dataset used to fit the model, ex: `newdata = subset(treatment == 1)` #' + [dplyr::filter()] call with a single argument to select a subset of the dataset used to fit the model, ex: `newdata = filter(treatment == 1)` #' + string: #' - "mean": Slopes evaluated when each predictor is held at its mean or mode. #' - "median": Slopes evaluated when each predictor is held at its median or mode. #' - "balanced": Slopes evaluated on a balanced grid with every combination of categories and numeric variables held at their means. #' - "tukey": Slopes evaluated at Tukey's 5 numbers. #' - "grid": Slopes evaluated on a grid of representative numbers (Tukey's 5 numbers and unique values of categorical predictors). #' @param vcov Type of uncertainty estimates to report (e.g., for robust standard errors). Acceptable values: #' * FALSE: Do not compute standard errors. This can speed up computation considerably. #' * TRUE: Unit-level standard errors using the default `vcov(model)` variance-covariance matrix. #' * String which indicates the kind of uncertainty estimates to return. #' - Heteroskedasticity-consistent: `"HC"`, `"HC0"`, `"HC1"`, `"HC2"`, `"HC3"`, `"HC4"`, `"HC4m"`, `"HC5"`. See `?sandwich::vcovHC` #' - Heteroskedasticity and autocorrelation consistent: `"HAC"` #' - Mixed-Models degrees of freedom: "satterthwaite", "kenward-roger" #' - Other: `"NeweyWest"`, `"KernHAC"`, `"OPG"`. See the `sandwich` package documentation. #' * One-sided formula which indicates the name of cluster variables (e.g., `~unit_id`). This formula is passed to the `cluster` argument of the `sandwich::vcovCL` function. #' * Square covariance matrix #' * Function which returns a covariance matrix (e.g., `stats::vcov(model)`) #' @param conf_level numeric value between 0 and 1. Confidence level to use to build a confidence interval. #' @param type string indicates the type (scale) of the predictions used to #' compute contrasts or slopes. This can differ based on the model #' type, but will typically be a string such as: "response", "link", "probs", #' or "zero". When an unsupported string is entered, the model-specific list of #' acceptable values is returned in an error message. When `type` is `NULL`, the #' first entry in the error message is used by default. #' @param slope string indicates the type of slope or (semi-)elasticity to compute: #' - "dydx": dY/dX #' - "eyex": dY/dX * Y / X #' - "eydx": dY/dX * Y #' - "dyex": dY/dX / X #' - Y is the predicted value of the outcome; X is the observed value of the predictor. #' @param wts logical, string or numeric: weights to use when computing average predictions, contrasts or slopes. These weights only affect the averaging in `avg_*()` or with the `by` argument, and not unit-level estimates. See `?weighted.mean` #' + string: column name of the weights variable in `newdata`. When supplying a column name to `wts`, it is recommended to supply the original data (including the weights variable) explicitly to `newdata`. #' + numeric: vector of length equal to the number of rows in the original data or in `newdata` (if supplied). #' + FALSE: Equal weights. #' + TRUE: Extract weights from the fitted object with `insight::find_weights()` and use them when taking weighted averages of estimates. Warning: `newdata=datagrid()` returns a single average weight, which is equivalent to using `wts=FALSE` #' @param hypothesis specify a hypothesis test or custom contrast using a numeric value, vector, or matrix; a string equation; string; a formula, or a function. #' + Numeric: #' - Single value: the null hypothesis used in the computation of Z and p (before applying `transform`). #' - Vector: Weights to compute a linear combination of (custom contrast between) estimates. Length equal to the number of rows generated by the same function call, but without the `hypothesis` argument. #' - Matrix: Each column is a vector of weights, as describe above, used to compute a distinct linear combination of (contrast between) estimates. The column names of the matrix are used as labels in the output. #' + String equation to specify linear or non-linear hypothesis tests. If the `term` column uniquely identifies rows, terms can be used in the formula. Otherwise, use `b1`, `b2`, etc. to identify the position of each parameter. The `b*` wildcard can be used to test hypotheses on all estimates. If a named vector is used, the names are used as labels in the output. Examples: #' - `hp = drat` #' - `hp + drat = 12` #' - `b1 + b2 + b3 = 0` #' - `b* / b1 = 1` #' + String: #' - "pairwise": pairwise differences between estimates in each row. #' - "reference": differences between the estimates in each row and the estimate in the first row. #' - "sequential": difference between an estimate and the estimate in the next row. #' - "meandev": difference between an estimate and the mean of all estimates. #' - "meanotherdev": difference between an estimate and the mean of all other estimates, excluding the current one. #' - "revpairwise", "revreference", "revsequential": inverse of the corresponding hypotheses, as described above. #' + Formula: #' - `comparison ~ pairs | group` #' - Left-hand side determines the type of comparison to conduct: `difference` or `ratio`. If the left-hand side is empty, `difference` is chosen. #' - Right-hand side determines the pairs of estimates to compare: `reference`, `sequential`, or `meandev` #' - Optional: Users can supply grouping variables after a vertical bar to conduct comparisons withing subsets. #' - Examples: #' + `~ reference` #' + `ratio ~ pairwise` #' + `difference ~ pairwise | groupid` #' + Function: #' - Accepts an argument `x`: object produced by a `marginaleffects` function or a data frame with column `rowid` and `estimate` #' - Returns a data frame with columns `term` and `estimate` (mandatory) and `rowid` (optional). #' - The function can also accept optional input arguments: `newdata`, `by`, `draws`. #' - This function approach will not work for Bayesian models or with bootstrapping. In those cases, it is easy to use `posterior_draws()` to extract and manipulate the draws directly. #' + See the Examples section below and the vignette: https://marginaleffects.com/vignettes/hypothesis.html #' @param p_adjust Adjust p-values for multiple comparisons: "holm", "hochberg", "hommel", "bonferroni", "BH", "BY", or "fdr". See [stats::p.adjust] #' @param df Degrees of freedom used to compute p values and confidence intervals. A single numeric value between 1 and `Inf`. When `df` is `Inf`, the normal distribution is used. When `df` is finite, the `t` distribution is used. See [insight::get_df] for a convenient function to extract degrees of freedom. Ex: `slopes(model, df = insight::get_df(model))` #' @param eps NULL or numeric value which determines the step size to use when #' calculating numerical derivatives: (f(x+eps)-f(x))/eps. When `eps` is #' `NULL`, the step size is 0.0001 multiplied by the difference between #' the maximum and minimum values of the variable with respect to which we #' are taking the derivative. Changing `eps` may be necessary to avoid #' numerical problems in certain models. #' @param numderiv string or list of strings indicating the method to use to for the numeric differentiation used in to compute delta method standard errors. #' + "fdforward": finite difference method with forward differences #' + "fdcenter": finite difference method with central differences (default) #' + "richardson": Richardson extrapolation method #' + Extra arguments can be specified by passing a list to the `numDeriv` argument, with the name of the method first and named arguments following, ex: `numderiv=list("fdcenter", eps = 1e-5)`. When an unknown argument is used, `marginaleffects` prints the list of valid arguments for each method. #' @param ... Additional arguments are passed to the `predict()` method #' supplied by the modeling package.These arguments are particularly useful #' for mixed-effects or bayesian models (see the online vignettes on the #' `marginaleffects` website). Available arguments can vary from model to #' model, depending on the range of supported arguments by each modeling #' package. See the "Model-Specific Arguments" section of the #' `?slopes` documentation for a non-exhaustive list of available #' arguments. #' @inheritParams comparisons #' #' @details #' Numerical derivatives for the `slopes` function are calculated #' using a simple epsilon difference approach: \eqn{\partial Y / \partial X = (f(X + \varepsilon/2) - f(X-\varepsilon/2)) / \varepsilon}{dY/dX = (f(X + e/2) - f(X-e/2)) / e}, #' where f is the `predict()` method associated with the model class, and #' \eqn{\varepsilon}{e} is determined by the `eps` argument. #' @template deltamethod #' @template model_specific_arguments #' @template bayesian #' @template equivalence #' @template type #' @template parallel #' @template references #' @template order_of_operations #' @template options #' #' @return A `data.frame` with one row per observation (per term/group) and several columns: #' * `rowid`: row number of the `newdata` data frame #' * `type`: prediction type, as defined by the `type` argument #' * `group`: (optional) value of the grouped outcome (e.g., categorical outcome models) #' * `term`: the variable whose marginal effect is computed #' * `dydx`: slope of the outcome with respect to the term, for a given combination of predictor values #' * `std.error`: standard errors computed by via the delta method. #' * `p.value`: p value associated to the `estimate` column. The null is determined by the `hypothesis` argument (0 by default), and p values are computed before applying the `transform` argument. For models of class `feglm`, `Gam`, `glm` and `negbin`, p values are computed on the link scale by default unless the `type` argument is specified explicitly. #' * `s.value`: Shannon information transforms of p values. How many consecutive "heads" tosses would provide the same amount of evidence (or "surprise") against the null hypothesis that the coin is fair? The purpose of S is to calibrate the analyst's intuition about the strength of evidence encoded in p against a well-known physical phenomenon. See Greenland (2019) and Cole et al. (2020). #' * `conf.low`: lower bound of the confidence interval (or equal-tailed interval for bayesian models) #' * `conf.high`: upper bound of the confidence interval (or equal-tailed interval for bayesian models) #' #' See `?print.marginaleffects` for printing options. #' #' @examplesIf interactive() || isTRUE(Sys.getenv("R_DOC_BUILD") == "true") #' @examples #' # Unit-level (conditional) Marginal Effects #' mod <- glm(am ~ hp * wt, data = mtcars, family = binomial) #' mfx <- slopes(mod) #' head(mfx) #' #' # Average Marginal Effect (AME) #' avg_slopes(mod, by = TRUE) #' #' #' # Marginal Effect at the Mean (MEM) #' slopes(mod, newdata = datagrid()) #' #' # Marginal Effect at User-Specified Values #' # Variables not explicitly included in `datagrid()` are held at their means #' slopes(mod, newdata = datagrid(hp = c(100, 110))) #' #' # Group-Average Marginal Effects (G-AME) #' # Calculate marginal effects for each observation, and then take the average #' # marginal effect within each subset of observations with different observed #' # values for the `cyl` variable: #' mod2 <- lm(mpg ~ hp * cyl, data = mtcars) #' avg_slopes(mod2, variables = "hp", by = "cyl") #' #' # Marginal Effects at User-Specified Values (counterfactual) #' # Variables not explicitly included in `datagrid()` are held at their #' # original values, and the whole dataset is duplicated once for each #' # combination of the values in `datagrid()` #' mfx <- slopes(mod, #' newdata = datagrid( #' hp = c(100, 110), #' grid_type = "counterfactual")) #' head(mfx) #' #' # Heteroskedasticity robust standard errors #' mfx <- slopes(mod, vcov = sandwich::vcovHC(mod)) #' head(mfx) #' #' # hypothesis test: is the `hp` marginal effect at the mean equal to the `drat` marginal effect #' mod <- lm(mpg ~ wt + drat, data = mtcars) #' #' slopes( #' mod, #' newdata = "mean", #' hypothesis = "wt = drat") #' #' # same hypothesis test using row indices #' slopes( #' mod, #' newdata = "mean", #' hypothesis = "b1 - b2 = 0") #' #' # same hypothesis test using numeric vector of weights #' slopes( #' mod, #' newdata = "mean", #' hypothesis = c(1, -1)) #' #' # two custom contrasts using a matrix of weights #' lc <- matrix( #' c( #' 1, -1, #' 2, 3), #' ncol = 2) #' colnames(lc) <- c("Contrast A", "Contrast B") #' slopes( #' mod, #' newdata = "mean", #' hypothesis = lc) #' #' @export slopes <- function(model, newdata = NULL, variables = NULL, type = NULL, by = FALSE, vcov = TRUE, conf_level = 0.95, slope = "dydx", wts = FALSE, hypothesis = NULL, equivalence = NULL, p_adjust = NULL, df = Inf, eps = NULL, numderiv = "fdforward", ...) { dots <- list(...) # very early, before any use of newdata # if `newdata` is a call to `typical` or `counterfactual`, insert `model` scall <- rlang::enquo(newdata) newdata <- sanitize_newdata_call(scall, newdata, model, by = by) # build call: match.call() doesn't work well in *apply() call_attr <- c( list( name = "slopes", model = model, newdata = newdata, variables = variables, type = type, vcov = vcov, by = by, conf_level = conf_level, slope = slope, wts = wts, hypothesis = hypothesis, df = df, eps = eps), list(...)) call_attr <- do.call("call", call_attr) # slopes() does not support a named list of variables like comparisons() checkmate::assert_character(variables, null.ok = TRUE) # slope valid <- c("dydx", "eyex", "eydx", "dyex", "dydxavg", "eyexavg", "eydxavg", "dyexavg") checkmate::assert_choice(slope, choices = valid) # sanity checks and pre-processing model <- sanitize_model(model = model, newdata = newdata, wts = wts, vcov = vcov, by = by, calling_function = "marginaleffects", ...) sanity_dots(model = model, calling_function = "marginaleffects", ...) type <- sanitize_type(model = model, type = type, calling_function = "slopes") ############### sanity checks are over # Bootstrap out <- inferences_dispatch( INF_FUN = slopes, model = model, newdata = newdata, vcov = vcov, variables = variables, type = type, conf_level = conf_level, by = by, wts = wts, slope = slope, hypothesis = hypothesis, ...) if (!is.null(out)) { return(out) } out <- comparisons( model, newdata = newdata, variables = variables, vcov = vcov, conf_level = conf_level, type = type, wts = wts, hypothesis = hypothesis, equivalence = equivalence, df = df, p_adjust = p_adjust, by = by, eps = eps, numderiv = numderiv, comparison = slope, cross = FALSE, # secret arguments internal_call = TRUE, ...) data.table::setDT(out) attr(out, "vcov.type") <- get_vcov_label(vcov) attr(out, "newdata") <- newdata # recall attr(out, "call") <- call_attr # class data.table::setDF(out) class(out) <- setdiff(class(out), "comparisons") class(out) <- c("slopes", "marginaleffects", class(out)) return(out) } #' Average slopes (aka Average partial derivatives, marginal effects, or trends) #' @describeIn slopes Average slopes #' @export #' avg_slopes <- function(model, newdata = NULL, variables = NULL, type = NULL, by = TRUE, vcov = TRUE, conf_level = 0.95, slope = "dydx", wts = FALSE, hypothesis = NULL, equivalence = NULL, p_adjust = NULL, df = Inf, eps = NULL, numderiv = "fdforward", ...) { # order of the first few paragraphs is important # if `newdata` is a call to `typical` or `counterfactual`, insert `model` # should probably not be nested too deeply in the call stack since we eval.parent() (not sure about this) scall <- rlang::enquo(newdata) newdata <- sanitize_newdata_call(scall, newdata, model, by = by) # Bootstrap out <- inferences_dispatch( INF_FUN = avg_slopes, model = model, newdata = newdata, vcov = vcov, variables = variables, type = type, conf_level = conf_level, by = by, wts = wts, slope = slope, hypothesis = hypothesis, ...) if (!is.null(out)) { return(out) } out <- slopes( model = model, newdata = newdata, variables = variables, type = type, vcov = vcov, conf_level = conf_level, by = by, slope = slope, wts = wts, hypothesis = hypothesis, equivalence = equivalence, p_adjust = p_adjust, df = df, eps = eps, numderiv = numderiv, ...) return(out) } marginaleffects/R/tinytest.R0000644000176200001440000001235714631452335015631 0ustar liggesusers#' `tinytest` helper #' #' @export #' @keywords internal expect_slopes <- function( object, n_unique = NULL, pct_na = 5, se = TRUE, ...) { insight::check_if_installed("tinytest") object <- hush(slopes(object, ...)) diff <- "" # class fail_class <- !isTRUE(checkmate::check_class(object, "slopes")) if (fail_class) { msg <- sprintf("Wrong class: `%s`.", class(object)[1]) diff <- c(diff, msg) } # tidy() tid <- hush(tidy(object)) fail_tidy <- !isTRUE(checkmate::check_data_frame(tid)) if (fail_tidy) { msg <- "tidy() failed to return a data frame." diff <- c(diff, msg) } # na fail_na <- isTRUE(hush(mean(is.na(object$estimate)) * 100 > pct_na)) if (fail_na) { msg <- sprintf("More than %s of missing values.", pct_na) diff <- c(diff, msg) } # unique fail_unique <- isTRUE(hush(length(unique(object$estimate)) < n_unique - 1)) if (fail_unique) { msg <- sprintf("Fewer than %s unique values.", n_unique) diff <- c(diff, msg) } # unique if (isTRUE(se) && !"std.error" %in% colnames(object)) { msg <- sprintf("Fewer than %s unique values.", n_unique) diff <- c(diff, msg) fail_se <- TRUE } else { fail_se <- FALSE } # diff message diff <- paste(diff, collapse = "\n") # pass/fail fail <- fail_class || fail_tidy || fail_na || fail_unique || fail_se # tinytest object out <- tinytest::tinytest( result = !fail, call = sys.call(sys.parent(1)), diff = diff) return(out) } #' `tinytest` helper #' #' @export #' @keywords internal expect_predictions <- function(object, se = TRUE, n_row = NULL, n_col = NULL) { insight::check_if_installed("tinytest") diff <- "" # class fail_class <- !isTRUE(checkmate::check_class(object, "predictions")) if (fail_class) { msg <- sprintf("Wrong class: `%s`.", class(object)[1]) diff <- c(diff, msg) } # std.error if (isTRUE(se) && !"std.error" %in% colnames(object)) { msg <- "No standard error." diff <- c(diff, msg) fail_se <- TRUE } else { fail_se <- FALSE } # rows and cols if (isTRUE(n_row > nrow(object))) { msg <- sprintf("Number of rows: %s", nrow(object)) diff <- c(diff, msg) fail_row <- TRUE } else { fail_row <- FALSE } if (isTRUE(n_col > ncol(object))) { msg <- sprintf("Number of columns: %s", ncol(object)) diff <- c(diff, msg) fail_col <- TRUE } else { fail_col <- FALSE } # diff message diff <- paste(diff, collapse = "\n") # pass/fail fail <- fail_class || fail_se || fail_row || fail_col # tinytest object out <- tinytest::tinytest( result = !fail, call = sys.call(sys.parent(1)), diff = diff) return(out) } #' `tinytest` helper #' #' @export #' @keywords internal expect_margins <- function(results, margins_object, se = TRUE, tolerance = 1e-5, verbose = FALSE) { insight::check_if_installed("tinytest") is_equal <- function(x, y) { all(abs((x - y) / x) < tolerance) } results$type <- NULL margins_object <- data.frame(margins_object) term_names <- unique(results$term) flag <- TRUE # dydx for (tn in term_names) { unknown <- results[results$term == tn, "estimate"] lab <- paste0("dydx_", tn) if (lab %in% colnames(margins_object)) { known <- as.numeric(margins_object[, lab]) tmp <- is_equal(known, unknown) if (isFALSE(tmp)) { flag <- FALSE if (isTRUE(verbose)) print(sprintf("dydx: %s", tn)) } } } # std.error if (isTRUE(se) && "std.error" %in% colnames(results)) { for (tn in term_names) { lab_se <- paste0("SE_dydx_", tn) lab_var <- paste0("Var_dydx_", tn) if (lab_se %in% colnames(margins_object)) { unknown <- results[results$term == tn, "std.error"] known <- as.numeric(margins_object[, lab_se]) tmp <- is_equal(known, unknown) if (isFALSE(tmp)) { flag <- FALSE if (isTRUE(verbose)) print(sprintf("se: %s", tn)) } } else if (lab_var %in% colnames(margins_object)) { unknown <- results[results$term == tn, "std.error"] known <- sqrt(as.numeric(margins_object[, lab_var])) tmp <- is_equal(known, unknown) if (isFALSE(tmp)) { flag <- FALSE if (isTRUE(verbose)) print(sprintf("Var: %s", tn)) } } else { flag <- FALSE if (isTRUE(verbose)) print(sprintf("missing column: %s", lab)) } } } # tinytest object out <- tinytest::tinytest( result = flag, call = sys.call(sys.parent(1)), diff = diff) return(out) }marginaleffects/R/methods_dataframe.R0000644000176200001440000000122514631452335017405 0ustar liggesusers#' @include get_coef.R #' @rdname get_coef #' @export get_coef.data.frame <- function(model, ...) { checkmate::assert_data_frame(model) if (!"estimate" %in% colnames(model)) { insight::format_error("The model object is a data.frame but doesn't contain the column 'estimate'. Make sure these columns are present") } out <- model$estimate if ("term" %in% colnames(model)) { names(out) <- model$term } else { names(out) <- seq_along(out) } return(out) } #' @include set_coef.R #' @rdname set_coef #' @export set_coef.data.frame <- function(model, coefs, ...) { model$estimate = coefs return(model) } marginaleffects/R/methods_brms.R0000644000176200001440000001104114631452335016421 0ustar liggesusers#' @include sanity_model.R #' @rdname sanitize_model_specific #' @export sanitize_model_specific.brmsfit <- function(model, ...) { insight::check_if_installed("collapse", minimum_version = "1.9.0") # terms: brmsfit objects do not have terms immediately available te <- tryCatch(attr(stats::terms(stats::formula(model)$formula), "term.labels"), error = function(e) NULL) if (any(grepl("^factor\\(", te))) { stop("The `factor()` function cannot be used in the model formula of a `brmsfit` model. Please convert your variable to a factor before fitting the model, or use the `mo()` function to specify monotonic variables (see the `brms` vignette on monotonic variables).", call. = FALSE) } return(model) } #' @rdname get_coef #' @export get_coef.brmsfit <- function(model, ...) { out <- insight::get_parameters(model) out <- collapse::dapply(out, MARGIN = 2, FUN = collapse::fmedian) return(out) } #' @include get_predict.R #' @rdname get_predict #' @export get_predict.brmsfit <- function(model, newdata = insight::get_data(model), type = "response", ...) { checkmate::assert_choice(type, choices = c("response", "link", "prediction", "average")) if (type == "link") { insight::check_if_installed("rstantools") draws <- rstantools::posterior_linpred( model, newdata = newdata, ...) } else if (type == "response") { insight::check_if_installed("rstantools") draws <- rstantools::posterior_epred( model, newdata = newdata, ...) } else if (type == "prediction") { insight::check_if_installed("rstantools") draws <- rstantools::posterior_predict( model, newdata = newdata, ...) } else if (type == "average") { insight::check_if_installed("brms") draws <- brms::pp_average( model, newdata = newdata, summary = FALSE, ...) } if ("rowid_internal" %in% colnames(newdata)) { idx <- newdata[["rowid_internal"]] } else if ("rowid" %in% colnames(newdata)) { idx <- newdata[["rowid"]] } else { idx <- 1:nrow(newdata) } # resp_subset sometimes causes dimension mismatch if (length(dim(draws)) == 2 && nrow(newdata) != ncol(draws)) { msg <- sprintf("Dimension mismatch: There are %s parameters in the posterior draws but %s observations in `newdata` (or the original dataset).", ncol(draws), nrow(newdata)) insight::format_error(msg) } # 1d outcome if (length(dim(draws)) == 2) { med <- collapse::dapply(draws, MARGIN = 2, FUN = collapse::fmedian) out <- data.frame( rowid = idx, group = "main_marginaleffect", estimate = med) # multi-dimensional outcome } else if (length(dim(draws)) == 3) { out <- apply(draws, c(2, 3), stats::median) levnames <- dimnames(draws)[[3]] if (is.null(levnames)) { colnames(out) <- seq_len(ncol(out)) } else { colnames(out) <- levnames } out <- data.frame( rowid = rep(idx, times = ncol(out)), group = rep(colnames(out), each = nrow(out)), estimate = c(out)) out$group <- group_to_factor(out$group, model) } else { stop("marginaleffects cannot extract posterior draws from this model. Please report this problem to the Bug tracker with a reporducible example: https://github.com/vincentarelbundock/marginaleffects/issues", call. = FALSE) } # group for multi-valued outcome if (length(dim(draws)) == 3) { draws <- lapply(1:dim(draws)[3], function(i) draws[, , i]) draws <- do.call("cbind", draws) } attr(out, "posterior_draws") <- t(draws) return(out) } #' @include get_group_names.R #' @rdname get_group_names #' @export get_group_names.brmsfit <- function(model, ...) { if (!is.null(model$family) && "cumulative" %in% model$family) { out <- unique(insight::get_response(model)) } else { out <- "main_marginaleffect" } return(out) } #' @rdname get_vcov #' @export get_vcov.brmsfit <- function(model, vcov = NULL, ...) { if (!is.null(vcov) && !is.logical(vcov)) { insight::format_warning("The `vcov` argument is not supported for models of this class.") } return(NULL) } marginaleffects/R/methods_Rchoice.R0000644000176200001440000000031714631452335017036 0ustar liggesusers#' @rdname set_coef #' @export set_coef.hetprob <- function(model, coefs, ...) { model[["estimate"]][names(coefs)] <- coefs model } #' @rdname set_coef #' @export set_coef.ivpml <- set_coef.hetprob marginaleffects/R/sanity.R0000644000176200001440000000467114631452335015255 0ustar liggesuserssanity_equivalence_p_adjust <- function(equivalence, p_adjust) { if (!is.null(equivalence) && !is.null(p_adjust)) { insight::format_error("The `equivalence` and `p_adjust` arguments cannot be used together.") } checkmate::assert_choice(p_adjust, choices = stats::p.adjust.methods, null.ok = TRUE) } sanity_df <- function(df, x) { checkmate::assert( checkmate::check_number(df, lower = 1), checkmate::check_numeric(df, len = nrow(x))) } sanity_predict_vector <- function(pred, model, newdata, type) { if (!isTRUE(checkmate::check_atomic_vector(pred)) && !isTRUE(checkmate::check_array(pred, d = 1))) { msg <- sprintf( '`predict(model, type = "%s")` was called on a model of class `%s`, but this command did not produce the expected outcome: A numeric vector of length %s. This can sometimes happen when users try compute a marginal effect for some models with grouped or multivariate outcome which are not supported yet by `marginaleffects` package. Please consult your modeling package documentation to learn what alternative `type` arguments are accepted by the `predict` method, or file a feature request on Github: https://github.com/vincentarelbundock/marginaleffects/issues', type, class(model)[1], nrow(newdata)) stop(msg, call. = FALSE) } } sanity_predict_numeric <- function(pred, model, newdata, type) { if (!isTRUE(checkmate::check_numeric(pred))) { msg <- sprintf( '`predict(model, type = "%s")` was called on a model of class `%s`, but this command did not produce the expected outcome: A numeric vector of length %s. This can sometimes happen when users try compute a marginal effect for an outcome type which is unsupported, or which cannot be differentiated. Please consult your modeling package documentation to learn what alternative `type` arguments are accepted by the `predict` method.', type, class(model)[1], nrow(newdata)) stop(msg, call. = FALSE) } } # OBSOLETE CHECKS KEPT FOR POSTERITY # sanitize_return_data <- function() { # return_data <- getOption("marginaleffects_return_data", default = TRUE) # checkmate::assert_flag(return_data) # return(return_data) # } # sanitize_numDeriv_method <- function() { # numDeriv_method <- getOption("marginaleffects_numDeriv_method", default = "simple") # checkmate::assert_choice(numDeriv_method, choices = c("simple", "complex", "Richardson")) # return(numDeriv_method) # } marginaleffects/R/plot_build.R0000644000176200001440000001277214631452335016104 0ustar liggesusersplot_preprocess <- function(dat, v_x, v_color = NULL, v_facet_1 = NULL, v_facet_2 = NULL, condition = NULL, modeldata = NULL) { for (v in names(condition$condition)) { fun <- function(x, lab) { idx <- match(x, sort(unique(x))) factor(lab[idx], levels = lab) } if (identical(condition$condition[[v]], "threenum")) { dat[[v]] <- fun(dat[[v]], c("-SD", "Mean", "+SD")) } else if (identical(condition$condition[[v]], "minmax")) { dat[[v]] <- fun(dat[[v]], c("Min", "Max")) } else if (identical(condition$condition[[v]], "quartile")) { dat[[v]] <- fun(dat[[v]], c("Q1", "Q2", "Q3")) } } if (get_variable_class(modeldata, v_x, "categorical")) { dat[[v_x]] <- factor(dat[[v_x]]) } # colors, linetypes, and facets are categorical attributes if (isTRUE(v_color %in% colnames(dat))) { dat[[v_color]] <- factor(dat[[v_color]]) } if (isTRUE(v_facet_1 %in% colnames(dat))) { dat[[v_facet_1]] <- factor(dat[[v_facet_1]]) } if (isTRUE(v_facet_2 %in% colnames(dat))) { dat[[v_facet_2]] <- factor(dat[[v_facet_2]]) } return(dat) } plot_build <- function( dat, v_x, v_color = NULL, v_facet_1 = NULL, v_facet_2 = NULL, dv = NULL, modeldata = NULL, points = 0, rug = FALSE, gray = FALSE) { checkmate::assert_flag(rug) checkmate::assert_flag(gray) # create index before building ggplot to make sure it is available dat$marginaleffects_term_index <- get_unique_index(dat, term_only = TRUE) multi_variables <- isTRUE(length(unique(dat$marginaleffects_term_index)) > 1) p <- ggplot2::ggplot() if (points > 0 && !get_variable_class(modeldata, v_x, "categorical") && !get_variable_class(modeldata, dv, "categorical")) { if (!is.null(v_color) && get_variable_class(modeldata, v_color, "categorical")) { p <- p + ggplot2::geom_point( data = modeldata, alpha = points, ggplot2::aes(x = .data[[v_x]], y = .data[[dv]], color = factor(.data[[v_color]]))) } else { p <- p + ggplot2::geom_point( data = modeldata, alpha = points, ggplot2::aes(x = .data[[v_x]], y = .data[[dv]])) } } if (isTRUE(rug)) { p <- p + ggplot2::geom_rug(data = modeldata, ggplot2::aes(x = .data[[v_x]])) if (!is.null(dv)) { p <- p + ggplot2::geom_rug(data = modeldata, ggplot2::aes(y = .data[[dv]])) } } aes_args <- list( x = substitute(.data[[v_x]]), y = substitute(estimate) ) if ("conf.low" %in% colnames(dat)) { aes_args$ymin <- substitute(conf.low) aes_args$ymax <- substitute(conf.high) } aes_args_ribbon <- aes_args aes_args_ribbon$fill <- aes_args$color aes_args_ribbon$color <- NULL # discrete x-axis if (is.factor(dat[[v_x]])) { if (!is.null(v_color)) { if (gray) { aes_args$shape <- substitute(factor(.data[[v_color]])) } else { aes_args$color <- substitute(factor(.data[[v_color]])) } } aes_obj <- do.call(ggplot2::aes, aes_args) if ("conf.low" %in% colnames(dat)) { p <- p + ggplot2::geom_pointrange( data = dat, mapping = aes_obj, position = ggplot2::position_dodge(.15)) } else { p <- p + ggplot2::geom_point( data = dat, mapping = aes_obj, position = ggplot2::position_dodge(.15)) } # continuous x-axis } else { if (!is.null(v_color)) { if (gray) { aes_args$linetype <- substitute(factor(.data[[v_color]])) aes_args_ribbon$linetype <- substitute(factor(.data[[v_color]])) } else { aes_args$color <- substitute(factor(.data[[v_color]])) aes_args_ribbon$fill <- substitute(factor(.data[[v_color]])) } } aes_obj_ribbon <- do.call(ggplot2::aes, aes_args_ribbon) aes_args$ymin <- aes_args$ymax <- NULL aes_obj <- do.call(ggplot2::aes, aes_args) if ("conf.low" %in% colnames(dat)) { p <- p + ggplot2::geom_ribbon(data = dat, aes_obj_ribbon, alpha = .1) p <- p + ggplot2::geom_line(data = dat, aes_obj) } p <- p + ggplot2::geom_line(data = dat, aes_obj) } # facets: 3rd and 4th variable and/or multiple effects ## If pass two facets then make facet grid if (!is.null(v_facet_1) && !is.null(v_facet_2)) { fo <- stats::as.formula(paste(v_facet_2, "~", ifelse(multi_variables, "marginaleffects_term_index +", ""), v_facet_1)) p <- p + ggplot2::facet_grid(fo, scales = "free", labeller = function(x){ lapply(ggplot2::label_both(x), gsub, pattern = "marginaleffects_term_index: ", replacement="") }) ## if pass only 1 facet then facet_wrap } else if (!is.null(v_facet_1) && is.null(v_facet_2)) { fo <- stats::as.formula(paste("~", ifelse(multi_variables, "marginaleffects_term_index +", ""), v_facet_1)) p <- p + ggplot2::facet_wrap(fo, scales = "free") } else if (multi_variables) { fo <- stats::as.formula("~ marginaleffects_term_index") p <- p + ggplot2::facet_wrap(fo, scales = "free") } return(p) }marginaleffects/R/get_contrast_data_factor.R0000644000176200001440000002113314631452335020761 0ustar liggesusersget_contrast_data_factor <- function(model, newdata, variable, cross, first_cross, modeldata, ...) { if (is.factor(newdata[[variable$name]])) { levs <- levels(newdata[[variable$name]]) convert_to_factor <- TRUE } else if (get_variable_class(newdata, variable$name, "binary")) { levs <- variable$value convert_to_factor <- FALSE } else { msg <- "The `%s` variable is treated as a categorical (factor) variable, but the original data is of class %s. It is safer and faster to convert such variables to factor before fitting the model and calling a `marginaleffects` function." msg <- sprintf(msg, variable$name, class(newdata[[variable$name]])[1]) warn_once(msg, "marginaleffects_warning_factor_on_the_fly_conversion") if (is.factor(modeldata[[variable$name]])) { levs <- levels(modeldata[[variable$name]]) convert_to_factor <- TRUE } else { levs <- sort(unique(modeldata[[variable$name]])) convert_to_factor <- FALSE } } # string shortcuts flag <- checkmate::check_choice(variable$value, c("reference", "revreference", "pairwise", "revpairwise", "sequential", "revsequential", "all", "minmax")) if (isTRUE(flag)) { levs_idx <- contrast_categories_shortcuts(levs, variable, interaction) # custom data frame or function } else if (isTRUE(checkmate::check_function(variable$value)) || isTRUE(checkmate::check_data_frame(variable$value))) { out <- contrast_categories_custom(variable, newdata) return(out) # vector of two values } else if (isTRUE(checkmate::check_atomic_vector(variable$value, len = 2))) { if (is.character(variable$value)) { tmp <- modeldata[[variable$name]] if (any(!variable$value %in% as.character(tmp))) { msg <- "Some of the values supplied to the `variables` argument were not found in the dataset." insight::format_error(msg) } idx <- match(variable$value, as.character(tmp)) levs_idx <- data.table::data.table(lo = tmp[idx[1]], hi = tmp[idx[[2]]]) } else if (is.numeric(variable$value)) { tmp <- newdata[[variable$name]] if (convert_to_factor) { levs_idx <- data.table::data.table( lo = factor(as.character(variable$value[1]), levels = levels(tmp)), hi = factor(as.character(variable$value[2]), levels = levels(tmp))) } else { levs_idx <- data.table::data.table(lo = variable$value[1], hi = variable$value[2]) } } else { levs_idx <- data.table::data.table(lo = variable$value[1], hi = variable$value[2]) } } tmp <- contrast_categories_processing(first_cross, levs_idx, levs, variable, newdata) lo <- tmp[[1]] hi <- tmp[[2]] original <- tmp[[3]] if (is.factor(newdata[[variable$name]]) || isTRUE(convert_to_factor)) { lo[[variable$name]] <- factor(lo[["marginaleffects_contrast_lo"]], levels = levs) hi[[variable$name]] <- factor(hi[["marginaleffects_contrast_hi"]], levels = levs) } else { lo[[variable$name]] <- lo[["marginaleffects_contrast_lo"]] hi[[variable$name]] <- hi[["marginaleffects_contrast_hi"]] } contrast_label <- hi$marginaleffects_contrast_label contrast_null <- hi$marginaleffects_contrast_hi == hi$marginaleffects_contrast_lo tmp <- !grepl("^marginaleffects_contrast", colnames(lo)) lo <- lo[, tmp, with = FALSE] hi <- hi[, tmp, with = FALSE] out <- list(rowid = original$rowid, lo = lo, hi = hi, original = original, ter = rep(variable$name, nrow(lo)), # lo can be different dimension than newdata lab = contrast_label, contrast_null = contrast_null) return(out) } contrast_categories_shortcuts <- function(levs, variable, interaction) { # index contrast orders based on variable$value if (isTRUE(variable$value %in% c("reference", "revreference"))) { # null contrasts are interesting with interactions if (!isTRUE(interaction)) { levs_idx <- data.table::data.table(lo = levs[1], hi = levs[2:length(levs)]) } else { levs_idx <- data.table::data.table(lo = levs[1], hi = levs) } } else if (isTRUE(variable$value %in% c("pairwise", "revpairwise"))) { levs_idx <- CJ(lo = levs, hi = levs, sorted = FALSE) # null contrasts are interesting with interactions if (!isTRUE(interaction)) { levs_idx <- levs_idx[levs_idx$hi != levs_idx$lo, ] levs_idx <- levs_idx[match(levs_idx$lo, levs) < match(levs_idx$hi, levs), ] } } else if (isTRUE(variable$value %in% c("sequential", "revsequential"))) { levs_idx <- data.table::data.table(lo = levs[1:(length(levs) - 1)], hi = levs[2:length(levs)]) } else if (isTRUE(variable$value == "all")) { levs_idx <- CJ(lo = levs, hi = levs, sorted = FALSE) } else if (isTRUE(variable$value == "minmax")) { levs_idx <- data.table::data.table(lo = levs[1], hi = levs[length(levs)]) } if (isTRUE(variable$value %in% c("revreference", "revpairwise", "revsequential"))) { levs_idx <- levs_idx[, .(lo = hi, hi = lo)] } return(levs_idx) } contrast_categories_df <- function(variable) { # manual data frame if (all(c("low", "high") %in% colnames(variable$value))) { low <- variable$value$low high <- variable$value$high } else if (all(c("lo", "hi") %in% colnames(variable$value))) { low <- variable$value$low high <- variable$value$high } else { low <- variable$value[[1]] high <- variable$value[[2]] } levs_idx <- data.table::data.table( lo = low, hi = high ) return(levs_idx) } contrast_categories_processing <- function(first_cross, levs_idx, levs, variable, newdata) { # internal option applied to the first of several contrasts when # interaction=TRUE to avoid duplication. when only the first contrast # flips, we get a negative sign, but if first increases and second # decreases, we get different total effects. if (isTRUE(first_cross)) { idx <- match(levs_idx$hi, levs) >= match(levs_idx$lo, levs) if (sum(idx) > 0) { levs_idx <- levs_idx[idx, , drop = FALSE] } } levs_idx$isNULL <- levs_idx$hi == levs_idx$lo levs_idx$label <- suppressWarnings(tryCatch( sprintf(variable$label, levs_idx$hi, levs_idx$lo), error = function(e) variable$label)) levs_idx <- stats::setNames(levs_idx, paste0("marginaleffects_contrast_", colnames(levs_idx))) if (!"marginaleffects_contrast_label" %in% colnames(levs_idx) || all(levs_idx$marginaleffects_contrast_label == "custom")) { levs_idx[, "marginaleffects_contrast_label" := paste0(marginaleffects_contrast_hi, ", ", marginaleffects_contrast_lo)] } lo <- hi <- cjdt(list(newdata, levs_idx)) original <- data.table::rbindlist(rep(list(newdata), nrow(levs_idx))) return(list(lo, hi, original)) } contrast_categories_custom <- function(variable, newdata) { original <- newdata if (!"rowid" %in% colnames(original)) { original$rowid <- seq_len(nrow(original)) } hi <- lo <- original if (isTRUE(checkmate::check_function(variable$value))) { variables_df <- variable$value(newdata[[variable$name]]) } else if (isTRUE(checkmate::check_data_frame(variable$value))) { variables_df <- variable$value } checkmate::assert_data_frame(variables_df, nrows = nrow(original)) if (all(c("low", "high") %in% colnames(variables_df))) { lo[[variable$name]] <- variables_df[["low"]] hi[[variable$name]] <- variables_df[["high"]] } else if (all(c("lo", "hi") %in% colnames(variables_df))) { lo[[variable$name]] <- variables_df[["lo"]] hi[[variable$name]] <- variables_df[["hi"]] } else { lo[[variable$name]] <- variables_df[[1]] hi[[variable$name]] <- variables_df[[2]] } out <- list( rowid = original$rowid, lo = lo, hi = hi, original = original, ter = rep(variable$name, nrow(lo)), # lo can be different dimension than newdata lab = "custom", contrast_null = rep(FALSE, nrow(lo)) ) return(out) } marginaleffects/R/sanitize_hypothesis.R0000644000176200001440000000225514631452335020047 0ustar liggesuserssanitize_hypothesis <- function(hypothesis, ...) { if (isTRUE(checkmate::check_formula(hypothesis))) { hypothesis <- sanitize_hypothesis_formula(hypothesis) } checkmate::assert( checkmate::check_character(hypothesis, pattern = "="), checkmate::check_choice(hypothesis, choices = c("pairwise", "reference", "sequential", "meandev", "meanotherdev", "revpairwise", "revreference", "revsequential")), checkmate::check_numeric(hypothesis), checkmate::check_matrix(hypothesis), checkmate::check_function(hypothesis), checkmate::check_null(hypothesis)) hnull <- 0 if (isTRUE(checkmate::check_character(hypothesis, pattern = "="))) { out <- paste(gsub("=", "-(", hypothesis), ")") attr(out, "label") <- hypothesis hypothesis <- out } else if (isTRUE(checkmate::check_matrix(hypothesis))) { attr(hypothesis, "label") <- colnames(hypothesis) } else if (isTRUE(checkmate::check_numeric(hypothesis, len = 1))) { hnull <- hypothesis hypothesis <- NULL } out <- list( "hypothesis" = hypothesis, "hypothesis_null" = hnull ) return(out) } marginaleffects/R/posterior_draws.R0000644000176200001440000001024214631452335017163 0ustar liggesusers#' Extract Posterior Draws or Bootstrap Resamples from `marginaleffects` Objects #' #' @param x An object produced by a `marginaleffects` package function, such as `predictions()`, `avg_slopes()`, `hypotheses()`, etc. #' @param shape string indicating the shape of the output format: #' * "long": long format data frame #' * "DxP": Matrix with draws as rows and parameters as columns #' * "PxD": Matrix with draws as rows and parameters as columns #' * "rvar": Random variable datatype (see `posterior` package documentation). #' @return A data.frame with `drawid` and `draw` columns. #' @export posterior_draws <- function(x, shape = "long") { checkmate::assert_choice(shape, choices = c("long", "DxP", "PxD", "rvar")) # tidy.comparisons() sometimes already saves draws in a nice long format draws <- attr(x, "posterior_draws") if (inherits(draws, "posterior_draws")) return(draws) if (is.null(attr(x, "posterior_draws"))) { warning('This object does not include a "posterior_draws" attribute. The `posterior_draws` function only supports bayesian models produced by the `marginaleffects` or `predictions` functions of the `marginaleffects` package.', call. = FALSE) return(x) } if (nrow(draws) != nrow(x)) { stop('The number of parameters in the object does not match the number of parameters for which posterior draws are available.', call. = FALSE) } if (shape %in% c("PxD", "DxP")) { row.names(draws) <- paste0("b", seq_len(nrow(draws))) colnames(draws) <- paste0("draw", seq_len(ncol(draws))) } if (shape == "PxD") { return(draws) } if (shape == "DxP") { return(t(draws)) } if (shape == "rvar") { insight::check_if_installed("posterior") draws <- t(draws) if (!is.null(attr(x, "nchains"))) { x[["rvar"]] <- posterior::rvar(draws, nchains = attr(x, "nchains")) } else { x[["rvar"]] <- posterior::rvar(draws) } return(x) } if (shape == "long") { draws <- data.table(draws) setnames(draws, as.character(seq_len(ncol(draws)))) for (v in colnames(x)) { draws[[v]] <- x[[v]] } out <- melt( draws, id.vars = colnames(x), variable.name = "drawid", value.name = "draw") cols <- unique(c("drawid", "draw", "rowid", colnames(out))) cols <- intersect(cols, colnames(out)) setcolorder(out, cols) data.table::setDF(out) return(out) } } average_draws <- function(data, index, draws, byfun = NULL) { insight::check_if_installed("collapse", minimum_version = "1.9.0") w <- data[["marginaleffects_wts_internal"]] if (all(is.na(w))) { w <- NULL } if (is.null(index)) { index <- intersect(colnames(data), "type") } if (length(index) > 0) { g <- collapse::GRP(data, by = index) if (is.null(byfun)) { draws <- collapse::fmean( draws, g = g, w = w, drop = FALSE) } else { draws <- collapse::BY( draws, g = g, FUN = byfun, drop = FALSE) } out <- data.table( g[["groups"]], average = collapse::dapply(draws, MARGIN = 1, FUN = collapse::fmedian)) } else { if (is.null(byfun)) { draws <- collapse::fmean( draws, w = w, drop = FALSE) } else { draws <- collapse::BY( draws, g = g, FUN = byfun, drop = FALSE) } out <- data.table(average = collapse::dapply(draws, MARGIN = 1, FUN = collapse::fmedian)) } setnames(out, old = "average", new = "estimate") attr(out, "posterior_draws") <- draws return(out) } #' `posteriordraws()` is an alias to `posterior_draws()` #' #' This alias is kept for backward compatibility and because some users may prefer that name. #' #' @inherit posterior_draws #' @keywords internal #' @export posteriordraws <- posterior_drawsmarginaleffects/R/methods_aod.R0000644000176200001440000000256014631452335016227 0ustar liggesusers#' @rdname get_predict #' @export get_predict.glimML <- function(model, newdata = insight::get_data(model), type = "response", ...) { insight::check_if_installed("aod") out <- aod::predict(model, newdata = newdata, type = type, ...) out <- data.frame( rowid = 1:nrow(newdata), estimate = out) return(out) } #' @rdname set_coef #' @export set_coef.glimML <- function(model, coefs, ...) { # in basic model classes coefficients are named vector model@fixed.param[names(coefs)] <- coefs model } #' @rdname get_vcov #' @export get_vcov.glimML <- function(model, vcov = NULL, ...) { insight::check_if_installed("aod") if (!is.null(vcov) && !is.logical(vcov)) { stop("The `vcov` argument is not supported for this kind of model.") } aod::vcov(model) } #' @rdname sanitize_model_specific sanitize_model_specific.glimML <- function(model, ...) { mdat <- get_modeldata(model, additional_variables = FALSE) if (isTRUE("character" %in% attr(mdat, "marginaleffects_variable_class"))) { insight::format_error("This function does not support character predictors. Please convert them to factors before fitting the model.") } return(model) } marginaleffects/R/methods_pscl.R0000644000176200001440000000236514631452335016430 0ustar liggesusers#' @include set_coef.R #' @rdname set_coef #' @export set_coef.hurdle <- function(model, coefs, ...) { # in pscl::hurdle, coefficients are held in a named list: # model$coefficients. Each element of the list is a vector which # corresponds to one equation (e.g., "zero" or "response"). When calling # "coef(model)", the equation label is prefixed to the term name with an # underscore. out <- model for (lab in names(out$coefficients)) { idx <- paste0(lab, "_", names(out$coefficients[[lab]])) idx <- match(idx, names(coefs)) # probably too conservative if (anyNA(idx)) { stop("Mismatched coefficients names. Please check the `marginaleffects::`set_coef.hurdle` or `set_coef.zeroinfl` function.", call. = FALSE) } out$coefficients[[lab]] <- stats::setNames(coefs[idx], names(out$coefficients[[lab]])) } return(out) } #' @rdname set_coef #' @export set_coef.zeroinfl <- set_coef.hurdle #' @rdname get_group_names #' @export get_group_names.hurdle <- function(model, type = "count", ...) { if (type == "prob") { out <- colnames(stats::predict(model, type = "prob")) } else { out <- "main_marginaleffect" } return(out) } marginaleffects/R/predictions.R0000644000176200001440000006621214632657453016301 0ustar liggesusers#' Predictions #' #' @description #' Outcome predicted by a fitted model on a specified scale for a given combination of values of the predictor variables, such as their observed values, their means, or factor levels (a.k.a. "reference grid"). #' #' * `predictions()`: unit-level (conditional) estimates. #' * `avg_predictions()`: average (marginal) estimates. #' #' The `newdata` argument and the `datagrid()` function can be used to control where statistics are evaluated in the predictor space: "at observed values", "at the mean", "at representative values", etc. #' #' See the predictions vignette and package website for worked examples and case studies: #' * #' * #' #' @rdname predictions #' @param model Model object #' @param variables Counterfactual variables. #' * Output: #' - `predictions()`: The entire dataset is replicated once for each unique combination of `variables`, and predictions are made. #' - `avg_predictions()`: The entire dataset is replicated, predictions are made, and they are marginalized by `variables` categories. #' - Warning: This can be expensive in large datasets. #' - Warning: Users who need "conditional" predictions should use the `newdata` argument instead of `variables`. #' * Input: #' - `NULL`: computes one prediction per row of `newdata` #' - Character vector: the dataset is replicated once of every combination of unique values of the variables identified in `variables`. #' - Named list: names identify the subset of variables of interest and their values. For numeric variables, the `variables` argument supports functions and string shortcuts: #' + A function which returns a numeric value #' + Numeric vector: Contrast between the 2nd element and the 1st element of the `x` vector. #' + "iqr": Contrast across the interquartile range of the regressor. #' + "sd": Contrast across one standard deviation around the regressor mean. #' + "2sd": Contrast across two standard deviations around the regressor mean. #' + "minmax": Contrast between the maximum and the minimum values of the regressor. #' + "threenum": mean and 1 standard deviation on both sides #' + "fivenum": Tukey's five numbers #' @param newdata Grid of predictor values at which we evaluate predictions. #' + Warning: Please avoid modifying your dataset between fitting the model and calling a `marginaleffects` function. This can sometimes lead to unexpected results. #' + `NULL` (default): Unit-level predictions for each observed value in the dataset (empirical distribution). The dataset is retrieved using [insight::get_data()], which tries to extract data from the environment. This may produce unexpected results if the original data frame has been altered since fitting the model. #' + string: #' - "mean": Predictions evaluated when each predictor is held at its mean or mode. #' - "median": Predictions evaluated when each predictor is held at its median or mode. #' - "balanced": Predictions evaluated on a balanced grid with every combination of categories and numeric variables held at their means. #' - "tukey": Predictions evaluated at Tukey's 5 numbers. #' - "grid": Predictions evaluated on a grid of representative numbers (Tukey's 5 numbers and unique values of categorical predictors). #' + [datagrid()] call to specify a custom grid of regressors. For example: #' - `newdata = datagrid(cyl = c(4, 6))`: `cyl` variable equal to 4 and 6 and other regressors fixed at their means or modes. #' - See the Examples section and the [datagrid()] documentation. #' + [subset()] call with a single argument to select a subset of the dataset used to fit the model, ex: `newdata = subset(treatment == 1)` #' + [dplyr::filter()] call with a single argument to select a subset of the dataset used to fit the model, ex: `newdata = filter(treatment == 1)` #' @param byfun A function such as `mean()` or `sum()` used to aggregate #' estimates within the subgroups defined by the `by` argument. `NULL` uses the #' `mean()` function. Must accept a numeric vector and return a single numeric #' value. This is sometimes used to take the sum or mean of predicted #' probabilities across outcome or predictor #' levels. See examples section. #' @param type string indicates the type (scale) of the predictions used to #' compute contrasts or slopes. This can differ based on the model #' type, but will typically be a string such as: "response", "link", "probs", #' or "zero". When an unsupported string is entered, the model-specific list of #' acceptable values is returned in an error message. When `type` is `NULL`, the #' first entry in the error message is used by default. #' @param transform A function applied to unit-level adjusted predictions and confidence intervals just before the function returns results. For bayesian models, this function is applied to individual draws from the posterior distribution, before computing summaries. #' #' @template deltamethod #' @template model_specific_arguments #' @template bayesian #' @template equivalence #' @template type #' @template order_of_operations #' @template parallel #' @template references #' @template options #' #' @return A `data.frame` with one row per observation and several columns: #' * `rowid`: row number of the `newdata` data frame #' * `type`: prediction type, as defined by the `type` argument #' * `group`: (optional) value of the grouped outcome (e.g., categorical outcome models) #' * `estimate`: predicted outcome #' * `std.error`: standard errors computed using the delta method. #' * `p.value`: p value associated to the `estimate` column. The null is determined by the `hypothesis` argument (0 by default), and p values are computed before applying the `transform` argument. For models of class `feglm`, `Gam`, `glm` and `negbin`, p values are computed on the link scale by default unless the `type` argument is specified explicitly. #' * `s.value`: Shannon information transforms of p values. How many consecutive "heads" tosses would provide the same amount of evidence (or "surprise") against the null hypothesis that the coin is fair? The purpose of S is to calibrate the analyst's intuition about the strength of evidence encoded in p against a well-known physical phenomenon. See Greenland (2019) and Cole et al. (2020). #' * `conf.low`: lower bound of the confidence interval (or equal-tailed interval for bayesian models) #' * `conf.high`: upper bound of the confidence interval (or equal-tailed interval for bayesian models) #' #' See `?print.marginaleffects` for printing options. #' #' @examplesIf interactive() || isTRUE(Sys.getenv("R_DOC_BUILD") == "true") #' @examples #' # Adjusted Prediction for every row of the original dataset #' mod <- lm(mpg ~ hp + factor(cyl), data = mtcars) #' pred <- predictions(mod) #' head(pred) #' #' # Adjusted Predictions at User-Specified Values of the Regressors #' predictions(mod, newdata = datagrid(hp = c(100, 120), cyl = 4)) #' #' m <- lm(mpg ~ hp + drat + factor(cyl) + factor(am), data = mtcars) #' predictions(m, newdata = datagrid(FUN_factor = unique, FUN_numeric = median)) #' #' # Average Adjusted Predictions (AAP) #' library(dplyr) #' mod <- lm(mpg ~ hp * am * vs, mtcars) #' #' avg_predictions(mod) #' #' predictions(mod, by = "am") #' #' # Conditional Adjusted Predictions #' plot_predictions(mod, condition = "hp") #' #' # Counterfactual predictions with the `variables` argument #' # the `mtcars` dataset has 32 rows #' #' mod <- lm(mpg ~ hp + am, data = mtcars) #' p <- predictions(mod) #' head(p) #' nrow(p) #' #' # average counterfactual predictions #' avg_predictions(mod, variables = "am") #' #' # counterfactual predictions obtained by replicating the entire for different #' # values of the predictors #' p <- predictions(mod, variables = list(hp = c(90, 110))) #' nrow(p) #' #' #' # hypothesis test: is the prediction in the 1st row equal to the prediction in the 2nd row #' mod <- lm(mpg ~ wt + drat, data = mtcars) #' #' predictions( #' mod, #' newdata = datagrid(wt = 2:3), #' hypothesis = "b1 = b2") #' #' # same hypothesis test using row indices #' predictions( #' mod, #' newdata = datagrid(wt = 2:3), #' hypothesis = "b1 - b2 = 0") #' #' # same hypothesis test using numeric vector of weights #' predictions( #' mod, #' newdata = datagrid(wt = 2:3), #' hypothesis = c(1, -1)) #' #' # two custom contrasts using a matrix of weights #' lc <- matrix(c( #' 1, -1, #' 2, 3), #' ncol = 2) #' predictions( #' mod, #' newdata = datagrid(wt = 2:3), #' hypothesis = lc) #' #' #' # `by` argument #' mod <- lm(mpg ~ hp * am * vs, data = mtcars) #' predictions(mod, by = c("am", "vs")) #' #' library(nnet) #' nom <- multinom(factor(gear) ~ mpg + am * vs, data = mtcars, trace = FALSE) #' #' # first 5 raw predictions #' predictions(nom, type = "probs") |> head() #' #' # average predictions #' avg_predictions(nom, type = "probs", by = "group") #' #' by <- data.frame( #' group = c("3", "4", "5"), #' by = c("3,4", "3,4", "5")) #' #' predictions(nom, type = "probs", by = by) #' #' # sum of predicted probabilities for combined response levels #' mod <- multinom(factor(cyl) ~ mpg + am, data = mtcars, trace = FALSE) #' by <- data.frame( #' by = c("4,6", "4,6", "8"), #' group = as.character(c(4, 6, 8))) #' predictions(mod, newdata = "mean", byfun = sum, by = by) #' #' @inheritParams slopes #' @inheritParams comparisons #' @export predictions <- function(model, newdata = NULL, variables = NULL, vcov = TRUE, conf_level = 0.95, type = NULL, by = FALSE, byfun = NULL, wts = FALSE, transform = NULL, hypothesis = NULL, equivalence = NULL, p_adjust = NULL, df = Inf, numderiv = "fdforward", ...) { dots <- list(...) if ("transform_post" %in% names(dots)) { transform <- dots[["transform_post"]] insight::format_warning("The `transform_post` argument is deprecated. Use `transform` instead.") } # very early, before any use of newdata # if `newdata` is a call to `typical` or `counterfactual`, insert `model` scall <- rlang::enquo(newdata) newdata <- sanitize_newdata_call(scall, newdata, model, by = by) if ("cross" %in% names(dots)) { insight::format_error("The `cross` argument is not available in this function.") } # extracting modeldata repeatedly is slow. # checking dots allows marginalmeans to pass modeldata to predictions. if (isTRUE(by)) { modeldata <- get_modeldata(model, additional_variables = FALSE, modeldata = dots[["modeldata"]], wts = wts) } else { modeldata <- get_modeldata(model, additional_variables = by, modeldata = dots[["modeldata"]], wts = wts) } # build call: match.call() doesn't work well in *apply() # after sanitize_newdata_call call_attr <- c(list( name = "predictions", model = model, newdata = newdata, variables = variables, vcov = vcov, conf_level = conf_level, type = type, by = by, byfun = byfun, wts = wts, transform = transform, hypothesis = hypothesis, df = df), dots) if ("modeldata" %in% names(dots)) { call_attr[["modeldata"]] <- modeldata } call_attr <- do.call("call", call_attr) # sanity checks sanity_dots(model = model, ...) numderiv <- sanitize_numderiv(numderiv) sanity_df(df, newdata) sanity_equivalence_p_adjust(equivalence, p_adjust) model <- sanitize_model( model = model, newdata = newdata, wts = wts, vcov = vcov, by = by, calling_function = "predictions", ...) tmp <- sanitize_hypothesis(hypothesis, ...) hypothesis <- tmp$hypothesis hypothesis_null <- tmp$hypothesis_null # multiple imputation if (inherits(model, c("mira", "amest"))) { out <- process_imputation(model, call_attr) return(out) } # if type is NULL, we backtransform if relevant type_string <- sanitize_type( model = model, type = type, by = by, calling_function = "predictions") if (identical(type_string, "invlink(link)")) { if (is.null(hypothesis)) { type_call <- "link" } else { type_call <- "response" type_string <- "response" insight::format_warning('The `type="invlink"` argument is not available unless `hypothesis` is `NULL` or a single number. The value of the `type` argument was changed to "response" automatically. To suppress this warning, use `type="response"` explicitly in your function call.') } } else { type_call <- type_string } # save the original because it gets converted to a named list, which breaks # user-input sanity checks transform_original <- transform transform <- sanitize_transform(transform) conf_level <- sanitize_conf_level(conf_level, ...) newdata <- sanitize_newdata( model = model, newdata = newdata, modeldata = modeldata, by = by, wts = wts) # after sanitize_newdata sanity_by(by, newdata) # after sanity_by newdata <- dedup_newdata( model = model, newdata = newdata, wts = wts, by = by, byfun = byfun) if (isFALSE(wts) && "marginaleffects_wts_internal" %in% colnames(newdata)) { wts <- "marginaleffects_wts_internal" } # analogous to comparisons(variables=list(...)) if (!is.null(variables)) { args <- list( "model" = model, "newdata" = newdata, "grid_type" = "counterfactual") tmp <- sanitize_variables( variables = variables, model = model, newdata = newdata, modeldata = modeldata, calling_function = "predictions" )$conditional for (v in tmp) { args[[v$name]] <- v$value } newdata <- do.call("datagrid", args) # the original rowids are no longer valid after averaging et al. newdata[["rowid"]] <- NULL } character_levels <- attr(newdata, "newdata_character_levels") # trust newdata$rowid if (!"rowid" %in% colnames(newdata)) { newdata[["rowid"]] <- seq_len(nrow(newdata)) } # mlogit models sometimes returns an `idx` column that is impossible to `rbind` if (inherits(model, "mlogit") && inherits(newdata[["idx"]], "idx")) { newdata[["idx"]] <- NULL } # padding destroys `newdata` attributes, so we save them newdata_attr_cache <- get_marginaleffects_attributes(newdata, include_regex = "^newdata") # mlogit uses an internal index that is very hard to track, so we don't # support `newdata` and assume no padding the `idx` column is necessary for # `get_predict` but it breaks binding, so we can't remove it in # sanity_newdata and we can't rbind it with padding # pad factors: `model.matrix` breaks when factor levels are missing if (inherits(model, "mlogit")) { padding <- data.frame() } else { padding <- complete_levels(newdata, character_levels) if (nrow(padding) > 0) { newdata <- rbindlist(list(padding, newdata)) } } if (is.null(by) || isFALSE(by)) { vcov_tmp <- vcov } else { vcov_tmp <- FALSE } ############### sanity checks are over # Bootstrap out <- inferences_dispatch( INF_FUN = predictions, model = model, newdata = newdata, vcov = vcov, variables = variables, type = type_string, by = by, conf_level = conf_level, byfun = byfun, wts = wts, transform = transform_original, hypothesis = hypothesis, ...) if (!is.null(out)) { return(out) } # pre-building the model matrix can speed up repeated predictions newdata <- get_model_matrix_attribute(model, newdata) # main estimation args <- list( model = model, newdata = newdata, type = type_call, hypothesis = hypothesis, wts = wts, by = by, byfun = byfun) args <- utils::modifyList(args, dots) tmp <- do.call(get_predictions, args) hyp_by <- attr(tmp, "hypothesis_function_by") # two cases when tmp is a data.frame # get_predict gets us rowid with the original rows if (inherits(tmp, "data.frame")) { setnames(tmp, old = c("Predicted", "SE", "CI_low", "CI_high"), new = c("estimate", "std.error", "conf.low", "conf.high"), skip_absent = TRUE) } else { tmp <- data.frame(newdata$rowid, type, tmp) colnames(tmp) <- c("rowid", "estimate") if ("rowidcf" %in% colnames(newdata)) { tmp[["rowidcf"]] <- newdata[["rowidcf"]] } } # issue #1105: hypothesis may change the meaning of rows, so we don't want to force-merge `newdata` if (!"rowid" %in% colnames(tmp) && nrow(tmp) == nrow(newdata) && is.null(hypothesis)) { tmp$rowid <- newdata$rowid } # degrees of freedom if (isTRUE(vcov == "satterthwaite") || isTRUE(vcov == "kenward-roger")) { df <- tryCatch( # df_per_observation is an undocumented argument introduced in 0.18.4.7 to preserve backward incompatibility insight::get_df(model, data = newdata, type = vcov, df_per_observation = TRUE), error = function(e) NULL) if (isTRUE(length(df) == nrow(tmp))) { tmp$df <- df } } # bayesian posterior draws draws <- attr(tmp, "posterior_draws") V <- NULL J <- NULL if (!isFALSE(vcov)) { V <- get_vcov(model, vcov = vcov, type = type, ...) # Delta method if (!"std.error" %in% colnames(tmp) && is.null(draws)) { if (isTRUE(checkmate::check_matrix(V))) { # vcov = FALSE to speed things up fun <- function(...) { get_predictions(..., wts = wts, verbose = FALSE)$estimate } args <- list( model, newdata = newdata, vcov = V, type = type_call, FUN = fun, J = J, hypothesis = hypothesis, by = by, byfun = byfun, numderiv = numderiv) args <- utils::modifyList(args, dots) se <- do.call(get_se_delta, args) if (is.numeric(se) && length(se) == nrow(tmp)) { J <- attr(se, "jacobian") attr(se, "jacobian") <- NULL tmp[["std.error"]] <- se } } } tmp <- get_ci( tmp, conf_level = conf_level, vcov = vcov, draws = draws, estimate = "estimate", null_hypothesis = hypothesis_null, df = df, model = model, p_adjust = p_adjust, ...) } out <- data.table::data.table(tmp) data.table::setDT(newdata) # expensive: only do this inside jacobian if necessary if (!inherits(model, "mclogit")) { # weird case. probably a cleaner way but lazy now... out <- merge_by_rowid(out, newdata) } # save weights as attribute and not column marginaleffects_wts_internal <- out[["marginaleffects_wts_internal"]] out[["marginaleffects_wts_internal"]] <- NULL # bycols if (isTRUE(checkmate::check_data_frame(by))) { bycols <- setdiff(colnames(by), "by") } else { bycols <- by } # sort rows: do NOT sort rows because it breaks hypothesis b1, b2, b3 indexing. # clean columns stubcols <- c( "rowid", "rowidcf", "term", "group", "hypothesis", bycols, "estimate", "std.error", "statistic", "p.value", "s.value", "conf.low", "conf.high", "marginaleffects_wts", sort(grep("^predicted", colnames(newdata), value = TRUE))) cols <- intersect(stubcols, colnames(out)) cols <- unique(c(cols, colnames(out))) out <- out[, ..cols] attr(out, "posterior_draws") <- draws # equivalence tests out <- equivalence(out, equivalence = equivalence, df = df, ...) # after rename to estimate / after assign draws if (identical(type_string, "invlink(link)")) { linv <- tryCatch(insight::link_inverse(model), error = function(e) identity) out <- backtransform(out, transform = linv) } out <- backtransform(out, transform = transform) data.table::setDF(out) class(out) <- c("predictions", class(out)) out <- set_marginaleffects_attributes(out, attr_cache = newdata_attr_cache) attr(out, "model") <- model attr(out, "type") <- type_string attr(out, "model_type") <- class(model)[1] attr(out, "vcov.type") <- get_vcov_label(vcov) attr(out, "jacobian") <- J attr(out, "vcov") <- V attr(out, "newdata") <- newdata attr(out, "weights") <- marginaleffects_wts_internal attr(out, "conf_level") <- conf_level attr(out, "by") <- by attr(out, "call") <- call_attr attr(out, "hypothesis_by") <- hyp_by attr(out, "transform_label") <- names(transform)[1] attr(out, "transform") <- transform[[1]] # save newdata for use in recall() attr(out, "newdata") <- newdata if (inherits(model, "brmsfit")) { insight::check_if_installed("brms") attr(out, "nchains") <- brms::nchains(model) } if ("group" %in% names(out) && all(out$group == "main_marginaleffect")) { out$group <- NULL } return(out) } # wrapper used only for standard_error_delta get_predictions <- function(model, newdata, type, by = NULL, byfun = byfun, hypothesis = NULL, verbose = TRUE, wts = FALSE, ...) { out <- myTryCatch(get_predict( model, newdata = newdata, type = type, ...)) if (inherits(out$value, "data.frame")) { out <- out$value } else { # tidymodels if (inherits(out$error, "rlang_error") && isTRUE(grepl("the object should be", out$error$message))) { insight::format_error(out$error$message) } msg <- "Unable to compute predicted values with this model. You can try to supply a different dataset to the `newdata` argument." if (!is.null(out$error)) { msg <- c(paste(msg, "This error was also raised:"), "", out$error$message) } if (inherits(out$value, "try-error")) { msg <- c(paste(msg, "", "This error was also raised:"), "", as.character(out$value)) } msg <- c(msg, "", "Bug Tracker: https://github.com/vincentarelbundock/marginaleffects/issues") insight::format_error(msg) } if (!"rowid" %in% colnames(out) && "rowid" %in% colnames(newdata) && nrow(out) == nrow(newdata)) { out$rowid <- newdata$rowid } # extract attributes before setDT draws <- attr(out, "posterior_draws") data.table::setDT(out) # unpad factors before averaging # trust `newdata` rowid more than `out` because sometimes `get_predict()` will add a positive index even on padded data # HACK: the padding indexing rowid code is still a mess # Do not merge `newdata` with `hypothesis`, because it may have the same # number of rows but represent different quantities if ("rowid" %in% colnames(newdata) && nrow(newdata) == nrow(out) && is.null(hypothesis)) { out$rowid <- newdata$rowid } # unpad if ("rowid" %in% colnames(out)) draws <- subset(draws, out$rowid > 0) if ("rowid" %in% colnames(out)) out <- subset(out, rowid > 0) if ("rowid" %in% colnames(newdata)) newdata <- subset(newdata, rowid > 0) # expensive: only do this inside the jacobian if necessary if (!isFALSE(wts) || !isTRUE(checkmate::check_flag(by, null.ok = TRUE)) || inherits(model, "mclogit")) { # not sure why sorting is so finicky here out <- merge_by_rowid(out, newdata) } # by: auto group if (isTRUE(checkmate::check_character(by))) { by <- intersect(c("group", by), colnames(out)) } # averaging by groups out <- get_by( out, draws = draws, newdata = newdata, by = by, byfun = byfun, verbose = verbose, ...) draws <- attr(out, "posterior_draws") # hypothesis tests using the delta method out <- get_hypothesis(out, hypothesis = hypothesis, by = by, newdata = newdata, draws = draws) # WARNING: we cannot sort rows at the end because `get_hypothesis()` is # applied in the middle, and it must already be sorted in the final order, # otherwise, users cannot know for sure what is going to be the first and # second rows, etc. out <- sort_columns(out, newdata, by) return(out) } #' Average predictions #' @describeIn predictions Average predictions #' @export #' avg_predictions <- function(model, newdata = NULL, variables = NULL, vcov = TRUE, conf_level = 0.95, type = NULL, by = TRUE, byfun = NULL, wts = FALSE, transform = NULL, hypothesis = NULL, equivalence = NULL, p_adjust = NULL, df = Inf, numderiv = "fdforward", ...) { # order of the first few paragraphs is important # if `newdata` is a call to `typical` or `counterfactual`, insert `model` scall <- rlang::enquo(newdata) newdata <- sanitize_newdata_call(scall, newdata, model, by = by) # group by focal variable automatically unless otherwise stated if (isTRUE(by)) { if (isTRUE(checkmate::check_character(variables))) { by <- variables } else if (isTRUE(checkmate::check_list(variables, names = "named"))) { by <- names(variables) } } # Bootstrap out <- inferences_dispatch( INF_FUN = avg_predictions, model = model, newdata = newdata, vcov = vcov, variables = variables, type = type, by = by, conf_level = conf_level, byfun = byfun, wts = wts, transform = transform, hypothesis = hypothesis, ...) if (!is.null(out)) { return(out) } out <- predictions( model = model, newdata = newdata, variables = variables, vcov = vcov, conf_level = conf_level, type = type, by = by, byfun = byfun, wts = wts, transform = transform, hypothesis = hypothesis, equivalence = equivalence, p_adjust = p_adjust, df = df, ...) return(out) } marginaleffects/R/methods_nlme.R0000644000176200001440000000022614631452335016414 0ustar liggesusers#' @rdname set_coef #' @export set_coef.lme <- function(model, coefs, ...) { model[["coefficients"]][["fixed"]][names(coefs)] <- coefs model }marginaleffects/R/comparisons.R0000644000176200001440000006611414632657760016315 0ustar liggesusers#' Comparisons Between Predictions Made With Different Regressor Values #' #' @description #' Predict the outcome variable at different regressor values (e.g., college #' graduates vs. others), and compare those predictions by computing a difference, #' ratio, or some other function. `comparisons()` can return many quantities of #' interest, such as contrasts, differences, risk ratios, changes in log odds, lift, #' slopes, elasticities, etc. #' #' * `comparisons()`: unit-level (conditional) estimates. #' * `avg_comparisons()`: average (marginal) estimates. #' #' `variables` identifies the focal regressors whose "effect" we are interested in. `comparison` determines how predictions with different regressor values are compared (difference, ratio, odds, etc.). The `newdata` argument and the `datagrid()` function control where statistics are evaluated in the predictor space: "at observed values", "at the mean", "at representative values", etc. #' #' See the comparisons vignette and package website for worked examples and case studies: #' #' * #' * #' #' @inheritParams slopes #' @inheritParams predictions #' @param variables Focal variables #' * `NULL`: compute comparisons for all the variables in the model object (can be slow). #' * Character vector: subset of variables (usually faster). #' * Named list: names identify the subset of variables of interest, and values define the type of contrast to compute. Acceptable values depend on the variable type: #' - Factor or character variables: #' * "reference": Each factor level is compared to the factor reference (base) level #' * "all": All combinations of observed levels #' * "sequential": Each factor level is compared to the previous factor level #' * "pairwise": Each factor level is compared to all other levels #' * "minmax": The highest and lowest levels of a factor. #' * "revpairwise", "revreference", "revsequential": inverse of the corresponding hypotheses. #' * Vector of length 2 with the two values to compare. #' * Data frame with the same number of rows as `newdata`, with two columns of "lo" and "hi" values to compare. #' * Function that accepts a vector and returns a data frame with two columns of "lo" and "hi" values to compare. See examples below. #' - Logical variables: #' * NULL: contrast between TRUE and FALSE #' * Data frame with the same number of rows as `newdata`, with two columns of "lo" and "hi" values to compare. #' * Function that accepts a vector and returns a data frame with two columns of "lo" and "hi" values to compare. See examples below. #' - Numeric variables: #' * Numeric of length 1: Forward contrast for a gap of `x`, computed between the observed value and the observed value plus `x`. Users can set a global option to get a "center" or "backward" contrast instead: `options(marginaleffects_contrast_direction="center")` #' * Numeric vector of length 2: Contrast between the largest and the smallest elements of the `x` vector. #' * Data frame with the same number of rows as `newdata`, with two columns of "lo" and "hi" values to compare. #' * Function that accepts a vector and returns a data frame with two columns of "lo" and "hi" values to compare. See examples below. #' * "iqr": Contrast across the interquartile range of the regressor. #' * "sd": Contrast across one standard deviation around the regressor mean. #' * "2sd": Contrast across two standard deviations around the regressor mean. #' * "minmax": Contrast between the maximum and the minimum values of the regressor. #' - Examples: #' + `variables = list(gear = "pairwise", hp = 10)` #' + `variables = list(gear = "sequential", hp = c(100, 120))` #' + `variables = list(hp = \(x) data.frame(low = x - 5, high = x + 10))` #' + See the Examples section below for more. #' @param newdata Grid of predictor values at which we evaluate the comparisons. #' + Warning: Avoid modifying your dataset between fitting the model and calling a `marginaleffects` function. This can sometimes lead to unexpected results. #' + `NULL` (default): Unit-level contrasts for each observed value in the dataset (empirical distribution). The dataset is retrieved using [insight::get_data()], which tries to extract data from the environment. This may produce unexpected results if the original data frame has been altered since fitting the model. #' + data frame: Unit-level contrasts for each row of the `newdata` data frame. #' + string: #' - "mean": Contrasts at the Mean. Contrasts when each predictor is held at its mean or mode. #' - "median": Contrasts at the Median. Contrasts when each predictor is held at its median or mode. #' - "balanced": Contrasts evaluated on a balanced grid with every combination of categories and numeric variables held at their means. #' - "tukey": Contrasts at Tukey's 5 numbers. #' - "grid": Contrasts on a grid of representative numbers (Tukey's 5 numbers and unique values of categorical predictors). #' + [datagrid()] call to specify a custom grid of regressors. For example: #' - `newdata = datagrid(cyl = c(4, 6))`: `cyl` variable equal to 4 and 6 and other regressors fixed at their means or modes. #' - `newdata = datagrid(mpg = fivenum)`: `mpg` variable held at Tukey's five numbers (using the `fivenum` function), and other regressors fixed at their means or modes. #' - See the Examples section and the [datagrid] documentation. #' + [subset()] call with a single argument to select a subset of the dataset used to fit the model, ex: `newdata = subset(treatment == 1)` #' + [dplyr::filter()] call with a single argument to select a subset of the dataset used to fit the model, ex: `newdata = filter(treatment == 1)` #' @param comparison How should pairs of predictions be compared? Difference, ratio, odds ratio, or user-defined functions. #' * string: shortcuts to common contrast functions. #' - Supported shortcuts strings: `r paste(names(marginaleffects:::comparison_function_dict), collapse = ", ")` #' - See the Comparisons section below for definitions of each transformation. #' * function: accept two equal-length numeric vectors of adjusted predictions (`hi` and `lo`) and returns a vector of contrasts of the same length, or a unique numeric value. #' - See the Transformations section below for examples of valid functions. #' @param transform string or function. Transformation applied to unit-level estimates and confidence intervals just before the function returns results. Functions must accept a vector and return a vector of the same length. Support string shortcuts: "exp", "ln" #' @param equivalence Numeric vector of length 2: bounds used for the two-one-sided test (TOST) of equivalence, and for the non-inferiority and non-superiority tests. See Details section below. #' @param by Aggregate unit-level estimates (aka, marginalize, average over). Valid inputs: #' - `FALSE`: return the original unit-level estimates. #' - `TRUE`: aggregate estimates for each term. #' - Character vector of column names in `newdata` or in the data frame produced by calling the function without the `by` argument. #' - Data frame with a `by` column of group labels, and merging columns shared by `newdata` or the data frame produced by calling the same function without the `by` argument. #' - See examples below. #' - For more complex aggregations, you can use the `FUN` argument of the `hypotheses()` function. See that function's documentation and the Hypothesis Test vignettes on the `marginaleffects` website. #' @param cross #' * `FALSE`: Contrasts represent the change in adjusted predictions when one predictor changes and all other variables are held constant. #' * `TRUE`: Contrasts represent the changes in adjusted predictions when all the predictors specified in the `variables` argument are manipulated simultaneously (a "cross-contrast"). #' @template deltamethod #' @template model_specific_arguments #' @template comparison_functions #' @template bayesian #' @template equivalence #' @template type #' @template order_of_operations #' @template parallel #' @template references #' @template options #' #' @return A `data.frame` with one row per observation (per term/group) and several columns: #' * `rowid`: row number of the `newdata` data frame #' * `type`: prediction type, as defined by the `type` argument #' * `group`: (optional) value of the grouped outcome (e.g., categorical outcome models) #' * `term`: the variable whose marginal effect is computed #' * `dydx`: slope of the outcome with respect to the term, for a given combination of predictor values #' * `std.error`: standard errors computed by via the delta method. #' * `p.value`: p value associated to the `estimate` column. The null is determined by the `hypothesis` argument (0 by default), and p values are computed before applying the `transform` argument. #' * `s.value`: Shannon information transforms of p values. How many consecutive "heads" tosses would provide the same amount of evidence (or "surprise") against the null hypothesis that the coin is fair? The purpose of S is to calibrate the analyst's intuition about the strength of evidence encoded in p against a well-known physical phenomenon. See Greenland (2019) and Cole et al. (2020). #' * `conf.low`: lower bound of the confidence interval (or equal-tailed interval for bayesian models) #' * `conf.high`: upper bound of the confidence interval (or equal-tailed interval for bayesian models) #' #' See `?print.marginaleffects` for printing options. #' #' @examplesIf interactive() || isTRUE(Sys.getenv("R_DOC_BUILD") == "true") #' @examples #' library(marginaleffects) #' #' # Linear model #' tmp <- mtcars #' tmp$am <- as.logical(tmp$am) #' mod <- lm(mpg ~ am + factor(cyl), tmp) #' avg_comparisons(mod, variables = list(cyl = "reference")) #' avg_comparisons(mod, variables = list(cyl = "sequential")) #' avg_comparisons(mod, variables = list(cyl = "pairwise")) #' #' # GLM with different scale types #' mod <- glm(am ~ factor(gear), data = mtcars) #' avg_comparisons(mod, type = "response") #' avg_comparisons(mod, type = "link") #' #' # Contrasts at the mean #' comparisons(mod, newdata = "mean") #' #' # Contrasts between marginal means #' comparisons(mod, newdata = "marginalmeans") #' #' # Contrasts at user-specified values #' comparisons(mod, newdata = datagrid(am = 0, gear = tmp$gear)) #' comparisons(mod, newdata = datagrid(am = unique, gear = max)) #' #' m <- lm(mpg ~ hp + drat + factor(cyl) + factor(am), data = mtcars) #' comparisons(m, variables = "hp", newdata = datagrid(FUN_factor = unique, FUN_numeric = median)) #' #' # Numeric contrasts #' mod <- lm(mpg ~ hp, data = mtcars) #' avg_comparisons(mod, variables = list(hp = 1)) #' avg_comparisons(mod, variables = list(hp = 5)) #' avg_comparisons(mod, variables = list(hp = c(90, 100))) #' avg_comparisons(mod, variables = list(hp = "iqr")) #' avg_comparisons(mod, variables = list(hp = "sd")) #' avg_comparisons(mod, variables = list(hp = "minmax")) #' #' # using a function to specify a custom difference in one regressor #' dat <- mtcars #' dat$new_hp <- 49 * (dat$hp - min(dat$hp)) / (max(dat$hp) - min(dat$hp)) + 1 #' modlog <- lm(mpg ~ log(new_hp) + factor(cyl), data = dat) #' fdiff <- \(x) data.frame(x, x + 10) #' avg_comparisons(modlog, variables = list(new_hp = fdiff)) #' #' # Adjusted Risk Ratio: see the contrasts vignette #' mod <- glm(vs ~ mpg, data = mtcars, family = binomial) #' avg_comparisons(mod, comparison = "lnratioavg", transform = exp) #' #' # Adjusted Risk Ratio: Manual specification of the `comparison` #' avg_comparisons( #' mod, #' comparison = function(hi, lo) log(mean(hi) / mean(lo)), #' transform = exp) # #' # cross contrasts #' mod <- lm(mpg ~ factor(cyl) * factor(gear) + hp, data = mtcars) #' avg_comparisons(mod, variables = c("cyl", "gear"), cross = TRUE) #' #' # variable-specific contrasts #' avg_comparisons(mod, variables = list(gear = "sequential", hp = 10)) #' #' # hypothesis test: is the `hp` marginal effect at the mean equal to the `drat` marginal effect #' mod <- lm(mpg ~ wt + drat, data = mtcars) #' #' comparisons( #' mod, #' newdata = "mean", #' hypothesis = "wt = drat") #' #' # same hypothesis test using row indices #' comparisons( #' mod, #' newdata = "mean", #' hypothesis = "b1 - b2 = 0") #' #' # same hypothesis test using numeric vector of weights #' comparisons( #' mod, #' newdata = "mean", #' hypothesis = c(1, -1)) #' #' # two custom contrasts using a matrix of weights #' lc <- matrix(c( #' 1, -1, #' 2, 3), #' ncol = 2) #' comparisons( #' mod, #' newdata = "mean", #' hypothesis = lc) #' #' # Effect of a 1 group-wise standard deviation change #' # First we calculate the SD in each group of `cyl` #' # Second, we use that SD as the treatment size in the `variables` argument #' library(dplyr) #' mod <- lm(mpg ~ hp + factor(cyl), mtcars) #' tmp <- mtcars %>% #' group_by(cyl) %>% #' mutate(hp_sd = sd(hp)) #' avg_comparisons(mod, #' variables = list(hp = function(x) data.frame(x, x + tmp$hp_sd)), #' by = "cyl") #' #' # `by` argument #' mod <- lm(mpg ~ hp * am * vs, data = mtcars) #' comparisons(mod, by = TRUE) #' #' mod <- lm(mpg ~ hp * am * vs, data = mtcars) #' avg_comparisons(mod, variables = "hp", by = c("vs", "am")) #' #' library(nnet) #' mod <- multinom(factor(gear) ~ mpg + am * vs, data = mtcars, trace = FALSE) #' by <- data.frame( #' group = c("3", "4", "5"), #' by = c("3,4", "3,4", "5")) #' comparisons(mod, type = "probs", by = by) #' #' @export comparisons <- function(model, newdata = NULL, variables = NULL, comparison = "difference", type = NULL, vcov = TRUE, by = FALSE, conf_level = 0.95, transform = NULL, cross = FALSE, wts = FALSE, hypothesis = NULL, equivalence = NULL, p_adjust = NULL, df = Inf, eps = NULL, numderiv = "fdforward", ...) { dots <- list(...) # backward compatibility if ("transform_post" %in% names(dots)) { transform <- dots[["transform_post"]] insight::format_warning("The `transform_post` argument is deprecated. Use `transform` instead.") } if ("transform_pre" %in% names(dots)) { comparison <- dots[["transform_pre"]] insight::format_warning("The `transform_pre` argument is deprecated. Use `comparison` instead.") } # very early, before any use of newdata # if `newdata` is a call to `typical` or `counterfactual`, insert `model` scall <- rlang::enquo(newdata) newdata <- sanitize_newdata_call(scall, newdata, model, by = by) # extracting modeldata repeatedly is slow. # checking dots allows marginalmeans to pass modeldata to predictions. if (isTRUE(by)) { modeldata <- get_modeldata(model, additional_variables = FALSE, modeldata = dots[["modeldata"]], wts = wts) } else { modeldata <- get_modeldata(model, additional_variables = by, modeldata = dots[["modeldata"]], wts = wts) } # build call: match.call() doesn't work well in *apply() # after sanitize_newdata_call call_attr <- c(list( name = "comparisons", model = model, newdata = newdata, variables = variables, type = type, vcov = vcov, by = by, conf_level = conf_level, comparison = comparison, transform = transform, cross = cross, wts = wts, hypothesis = hypothesis, equivalence = equivalence, p_adjust = p_adjust, df = df), dots) if ("modeldata" %in% names(dots)) { call_attr[["modeldata"]] <- modeldata } call_attr <- do.call("call", call_attr) # required by stubcols later, but might be overwritten bycols <- NULL # sanity checks sanity_dots(model, ...) sanity_df(df, newdata) conf_level <- sanitize_conf_level(conf_level, ...) checkmate::assert_number(eps, lower = 1e-10, null.ok = TRUE) numderiv <- sanitize_numderiv(numderiv) sanity_equivalence_p_adjust(equivalence, p_adjust) model <- sanitize_model( model = model, newdata = newdata, wts = wts, vcov = vcov, by = by, calling_function = "comparisons", ...) cross <- sanitize_cross(cross, variables, model) type <- sanitize_type(model = model, type = type, calling_function = "comparisons") sanity_comparison(comparison) # multiple imputation if (inherits(model, c("mira", "amest"))) { out <- process_imputation(model, call_attr) return(out) } # transforms comparison_label <- transform_label <- NULL if (is.function(comparison)) { comparison_label <- deparse(substitute(comparison)) } if (is.function(transform)) { transform_label <- deparse(substitute(transform)) transform <- sanitize_transform(transform) names(transform) <- transform_label } else { transform <- sanitize_transform(transform) transform_label <- names(transform) } marginalmeans <- isTRUE(checkmate::check_choice(newdata, choices = "marginalmeans")) newdata <- sanitize_newdata( model = model, newdata = newdata, modeldata = modeldata, by = by, wts = wts) # after sanitize_newdata sanity_by(by, newdata) # after sanity_by newdata <- dedup_newdata( model = model, newdata = newdata, wts = wts, by = by, cross = cross, comparison = comparison) if (isFALSE(wts) && "marginaleffects_wts_internal" %in% colnames(newdata)) { wts <- "marginaleffects_wts_internal" } # after sanitize_newdata # after dedup_newdata variables_list <- sanitize_variables( model = model, newdata = newdata, modeldata = modeldata, variables = variables, cross = cross, by = by, comparison = comparison, eps = eps) # get dof before transforming the vcov arg # get_df() produces a weird warning on non lmerMod. We can skip them # because get_vcov() will produce an informative error later. if (inherits(model, "lmerMod") && (isTRUE(hush(vcov %in% c("satterthwaite", "kenward-roger"))))) { # predict.lmerTest requires the DV dv <- insight::find_response(model) if (!dv %in% colnames(newdata)) { newdata[[dv]] <- mean(insight::get_response(model)) } if (!isTRUE(hush(is.infinite(df)))) { insight::format_error('The `df` argument is not supported when `vcov` is "satterthwaite" or "kenward-roger".') } # df_per_observation is an undocumented argument introduced in 0.18.4.7 to preserve backward incompatibility df <- insight::get_df(model, type = vcov, data = newdata, df_per_observation = TRUE) } vcov_false <- isFALSE(vcov) vcov.type <- get_vcov_label(vcov) vcov <- get_vcov(model, vcov = vcov, type = type, ...) predictors <- variables_list$conditional ############### sanity checks are over # Bootstrap out <- inferences_dispatch( INF_FUN = comparisons, model = model, newdata = newdata, vcov = vcov, variables = variables, type = type, by = by, conf_level = conf_level, cross = cross, comparison = comparison, transform = transform, wts = wts, hypothesis = hypothesis, eps = eps, ...) if (!is.null(out)) { return(out) } # after inferences dispatch tmp <- sanitize_hypothesis(hypothesis, ...) hypothesis <- tmp$hypothesis hypothesis_null <- tmp$hypothesis_null # compute contrasts and standard errors args <- list(model = model, newdata = newdata, variables = predictors, cross = cross, marginalmeans = marginalmeans, modeldata = modeldata) dots[["modeldata"]] <- NULL # dont' pass twice args <- c(args, dots) contrast_data <- do.call("get_contrast_data", args) args <- list(model, newdata = newdata, variables = predictors, type = type, original = contrast_data[["original"]], hi = contrast_data[["hi"]], lo = contrast_data[["lo"]], wts = contrast_data[["original"]][["marginaleffects_wts_internal"]], by = by, marginalmeans = marginalmeans, cross = cross, hypothesis = hypothesis, modeldata = modeldata) args <- c(args, dots) mfx <- do.call("get_contrasts", args) hyp_by <- attr(mfx, "hypothesis_function_by") # bayesian posterior if (!is.null(attr(mfx, "posterior_draws"))) { draws <- attr(mfx, "posterior_draws") J <- NULL # standard errors via delta method } else if (!vcov_false && isTRUE(checkmate::check_matrix(vcov))) { idx <- intersect(colnames(mfx), c("group", "term", "contrast")) idx <- mfx[, (idx), drop = FALSE] args <- list(model, vcov = vcov, type = type, FUN = get_se_delta_contrasts, newdata = newdata, index = idx, variables = predictors, marginalmeans = marginalmeans, hypothesis = hypothesis, hi = contrast_data$hi, lo = contrast_data$lo, original = contrast_data$original, by = by, eps = eps, cross = cross, numderiv = numderiv) args <- c(args, dots) se <- do.call("get_se_delta", args) J <- attr(se, "jacobian") attr(se, "jacobian") <- NULL mfx$std.error <- as.numeric(se) draws <- NULL # no standard error } else { J <- draws <- NULL } # merge original data back in if ((is.null(by) || isFALSE(by)) && "rowid" %in% colnames(mfx)) { if ("rowid" %in% colnames(newdata)) { idx <- c("rowid", "rowidcf", "term", "contrast", "by", setdiff(colnames(contrast_data$original), colnames(mfx))) idx <- intersect(idx, colnames(contrast_data$original)) tmp <- contrast_data$original[, ..idx, drop = FALSE] # contrast_data is duplicated to compute contrasts for different terms or pairs bycols <- intersect(colnames(tmp), colnames(mfx)) idx <- duplicated(tmp, by = bycols) tmp <- tmp[!idx] mfx <- merge(mfx, tmp, all.x = TRUE, by = bycols, sort = FALSE) # HACK: relies on NO sorting at ANY point } else { idx <- setdiff(colnames(contrast_data$original), colnames(mfx)) mfx <- data.table(mfx, contrast_data$original[, ..idx]) } } # meta info mfx <- get_ci( mfx, conf_level = conf_level, df = df, draws = draws, estimate = "estimate", null_hypothesis = hypothesis_null, p_adjust = p_adjust, model = model) # clean rows and columns # WARNING: we cannot sort rows at the end because `get_hypothesis()` is # applied in the middle, and it must already be sorted in the final order, # otherwise, users cannot know for sure what is going to be the first and # second rows, etc. mfx <- sort_columns(mfx, newdata, by) # bayesian draws attr(mfx, "posterior_draws") <- draws # equivalence tests mfx <- equivalence(mfx, equivalence = equivalence, df = df, ...) # after draws attribute mfx <- backtransform(mfx, transform) # save as attribute and not column if (any(!is.na(mfx[["marginaleffects_wts_internal"]]))) { marginaleffects_wts_internal <- mfx[["marginaleffects_wts_internal"]] } else { marginaleffects_wts_internal <- NULL } mfx[["marginaleffects_wts_internal"]] <- NULL out <- mfx data.table::setDF(out) out <- set_marginaleffects_attributes( out, get_marginaleffects_attributes(newdata, include_regex = "^newdata.*class|explicit|matrix|levels")) # other attributes attr(out, "newdata") <- newdata attr(out, "call") <- call_attr attr(out, "type") <- type attr(out, "model_type") <- class(model)[1] attr(out, "model") <- model attr(out, "variables") <- predictors attr(out, "jacobian") <- J attr(out, "vcov") <- vcov attr(out, "vcov.type") <- vcov.type attr(out, "weights") <- marginaleffects_wts_internal attr(out, "comparison") <- comparison attr(out, "transform") <- transform[[1]] attr(out, "comparison_label") <- comparison_label attr(out, "hypothesis_by") <- hyp_by attr(out, "transform_label") <- transform_label attr(out, "conf_level") <- conf_level attr(out, "by") <- by if (inherits(model, "brmsfit")) { insight::check_if_installed("brms") attr(out, "nchains") <- brms::nchains(model) } class(out) <- c("comparisons", class(out)) return(out) } #' Average comparisons #' @describeIn comparisons Average comparisons #' @export #' avg_comparisons <- function(model, newdata = NULL, variables = NULL, type = NULL, vcov = TRUE, by = TRUE, conf_level = 0.95, comparison = "difference", transform = NULL, cross = FALSE, wts = FALSE, hypothesis = NULL, equivalence = NULL, p_adjust = NULL, df = Inf, eps = NULL, numderiv = "fdforward", ...) { # order of the first few paragraphs is important # if `newdata` is a call to `typical` or `counterfactual`, insert `model` scall <- rlang::enquo(newdata) newdata <- sanitize_newdata_call(scall, newdata, model, by = by) # Bootstrap out <- inferences_dispatch( INF_FUN = avg_comparisons, model = model, newdata = newdata, vcov = vcov, variables = variables, type = type, by = by, cross = cross, conf_level = conf_level, comparison = comparison, transform = transform, wts = wts, hypothesis = hypothesis, eps = eps, ...) if (!is.null(out)) { return(out) } out <- comparisons( model = model, newdata = newdata, variables = variables, type = type, vcov = vcov, by = by, conf_level = conf_level, comparison = comparison, transform = transform, cross = cross, wts = wts, hypothesis = hypothesis, equivalence = equivalence, p_adjust = p_adjust, df = df, eps = eps, ...) return(out) } marginaleffects/R/methods_AER.R0000644000176200001440000000042214631452335016066 0ustar liggesusers#' @include set_coef.R #' @rdname set_coef #' @export set_coef.tobit <- set_coef.default # Note: needed because otherwise set.coef.survreg() would be called, # which requires different treatment (see insight:::get_parameters.tobit() # vs insight:::get_parameters.survreg()) marginaleffects/R/methods.R0000644000176200001440000000202414631452335015377 0ustar liggesusers#' @noRd #' @export vcov.comparisons <- function(object, ...) { attr(object, "jacobian") %*% attr(object, "vcov") %*% t(attr(object, "jacobian")) } #' @noRd #' @export vcov.predictions <- vcov.comparisons #' @noRd #' @export vcov.hypotheses <- vcov.comparisons #' @noRd #' @export vcov.slopes <- vcov.comparisons #' @noRd #' @export vcov.marginalmeans <- vcov.comparisons #' @export #' @noRd coef.comparisons <- function(object, ...) { if (!is.null(object$estimate)) { out <- object$estimate if (is.null(names(out))) { lab <- tryCatch(get_term_labels(object), error = function(e) NULL) if (length(lab) == length(out)) { out <- stats::setNames(out, lab) } } return(out) } else { stop("The input object does not contain an 'estimate' element.") } } #' @export #' @noRd coef.slopes <- coef.comparisons #' @export #' @noRd coef.marginalmeans <- coef.comparisons #' @export #' @noRd coef.predictions <- coef.comparisons #' @export #' @noRd coef.hypotheses <- coef.comparisonsmarginaleffects/R/get_hypothesis.R0000644000176200001440000003463414631452335017006 0ustar liggesusers get_hypothesis <- function( x, hypothesis, by = NULL, newdata = NULL, draws = NULL) { if (is.null(hypothesis)) return(x) if (isTRUE(checkmate::check_choice(hypothesis, "meandev"))) { hypothesis <- function(x) { out <- x out$estimate <- out$estimate - mean(out$estimate) out$hypothesis <- "Mean deviation" return(out) } } else if (isTRUE(checkmate::check_choice(hypothesis, "meanotherdev"))) { hypothesis <- function(x) { out <- x s <- sum(out$estimate) m_other <- (s - out$estimate) / (nrow(x) - 1) out$estimate <- out$estimate - m_other out$hypothesis <- "Mean deviation (other)" return(out) } } if (is.function(hypothesis)) { if (!is.null(draws)) { msg <- "The `hypothesis` argument does not support function for models with draws. You can use `posterior_draws()` to extract draws and manipulate them directly instead." insight::format_error(msg) } if ("rowid" %in% colnames(x) && "rowid" %in% colnames(newdata)) { x <- merge(x, newdata, all.x = TRUE, by = intersect(colnames(x), colnames(newdata))) } else if (isTRUE(nrow(x) == nrow(newdata))) { x <- cbind(x, newdata) } attr(x, "variables_datagrid") <- attr(newdata, "variables_datagrid") attr(x, "by") <- if (is.character(by)) by else names(by) argnames <- names(formals(hypothesis)) if (!"x" %in% argnames) insight::format_error("The `hypothesis` function must accept an `x` argument.") if (any(!argnames %in% c("x", "draws"))) { msg <- "The allowable arguments for the `hypothesis` function are: `x` and `draws`" insight::format_error(msg) } args <- list(x = x, newdata = newdata, by = by, draws = draws) args <- args[names(args) %in% argnames] out <- do.call(hypothesis, args) at <- attr(out, "hypothesis_function_by") # sanity msg <- "The `hypothesis` argument function must return a data frame with `term` (or `hypothesis`) and `estimate` columns." if (inherits(out, "data.frame")) { if (!all(c("term", "estimate") %in% colnames(out)) && !all(c("hypothesis", "estimate") %in% colnames(out))) { insight::format_error(msg) } } else if (isTRUE(checkmate::check_numeric(out))) { if (isTRUE(checkmate::check_data_frame(x, nrows = length(out))) && "term" %in% colnames(out)) { out <- data.frame(term = out$term, estimate = out) } else { out <- data.frame(term = seq_along(out), estimate = out) } } else { insight::format_error(msg) } attr(out, "hypothesis_function_by") <- at return(out) } lincom <- NULL # lincom: numeric vector or matrix if (isTRUE(checkmate::check_numeric(hypothesis))) { if (isTRUE(checkmate::check_atomic_vector(hypothesis))) { checkmate::assert_numeric(hypothesis, len = nrow(x)) lincom <- as.matrix(hypothesis) } else if (isTRUE(checkmate::check_matrix(hypothesis))) { lincom <- hypothesis } } # lincom: string shortcuts valid <- c("pairwise", "reference", "sequential", "revpairwise", "revreference", "revsequential") if (isTRUE(hypothesis %in% valid)) { safe <- isFALSE(getOption("marginaleffects_safe", default = TRUE)) if (nrow(x) > 25 && !safe) { msg <- 'The "pairwise", "reference", and "sequential" options of the `hypotheses` argument are not supported for `marginaleffects` commands which generate more than 25 rows of results. Use the `newdata`, `by`, and/or `variables` arguments to compute a smaller set of results on which to conduct hypothesis tests.' insight::format_error(msg) } } if (isTRUE(hypothesis == "reference")) { lincom <- lincom_reference(x, by) } else if (isTRUE(hypothesis == "revreference")) { lincom <- lincom_revreference(x, by) } else if (isTRUE(hypothesis == "sequential")) { lincom <- lincom_sequential(x, by) } else if (isTRUE(hypothesis == "revsequential")) { lincom <- lincom_revsequential(x, by) } else if (isTRUE(hypothesis == "pairwise")) { lincom <- lincom_pairwise(x, by) } else if (isTRUE(hypothesis == "revpairwise")) { lincom <- lincom_revpairwise(x, by) } lincom <- sanitize_lincom(lincom, x) # matrix hypothesis if (isTRUE(checkmate::check_matrix(lincom))) { out <- lincom_multiply(x, lincom) return(out) # string hypothesis } else if (is.character(hypothesis)) { out_list <- draws_list <- list() lab <- attr(hypothesis, "label") tmp <- expand_wildcard(hypothesis, nrow(x), lab) hypothesis <- tmp[[1]] labs <- tmp[[2]] for (i in seq_along(hypothesis)) { out_list[[i]] <- eval_string_hypothesis(x, hypothesis[i], labs[i]) draws_list[[i]] <- attr(out_list[[i]], "posterior_draws") } out <- do.call(rbind, out_list) attr(out, "posterior_draws") <- do.call(rbind, draws_list) attr(out, "label") <- if (!is.null(attr(labs, "names"))) { attr(labs, "names") } else { labs } return(out) } insight::format_error("`hypotheses` is broken. Please report this bug: https://github.com/vincentarelbundock/marginaleffects/issues.") } get_hypothesis_row_labels <- function(x, by = NULL) { lab <- grep("^term$|^by$|^group$|^value$|^contrast$|^contrast_", colnames(x), value = TRUE) lab <- Filter(function(z) length(unique(x[[z]])) > 1, lab) if (isTRUE(checkmate::check_character(by))) { lab <- unique(c(lab, by)) } if (length(lab) == 0) { lab <- NULL } else { lab_df <- data.frame(x)[, lab, drop = FALSE] idx <- vapply(lab_df, FUN = function(x) length(unique(x)) > 1, FUN.VALUE = logical(1)) if (sum(idx) > 0) { lab <- apply(lab_df[, idx, drop = FALSE], 1, paste, collapse = ", ") } else { lab <- apply(lab_df, 1, paste, collapse = ", ") } } # wrap in parentheses to avoid a-b-c-d != (a-b)-(c-d) if (any(grepl("-", lab))) { lab <- sprintf("(%s)", lab) } return(lab) } sanitize_lincom <- function(lincom, x) { if (isTRUE(checkmate::check_matrix(lincom))) { checkmate::assert_matrix(lincom, nrows = nrow(x)) if (is.null(colnames(lincom))) { colnames(lincom) <- rep("custom", ncol(lincom)) } } return(lincom) } lincom_revreference <- function(x, by) { lincom <- -1 * diag(nrow(x)) lincom[1, ] <- 1 lab <- get_hypothesis_row_labels(x, by = by) if (length(lab) == 0 || anyDuplicated(lab) > 0) { lab <- sprintf("Row 1 - Row %s", seq_len(ncol(lincom))) } else { lab <- sprintf("%s - %s", lab[1], lab) } colnames(lincom) <- lab lincom <- lincom[, 2:ncol(lincom), drop = FALSE] return(lincom) } lincom_reference <- function(x, by) { lincom <- diag(nrow(x)) lincom[1, ] <- -1 lab <- get_hypothesis_row_labels(x, by = by) if (length(lab) == 0 || anyDuplicated(lab) > 0) { lab <- sprintf("Row %s - Row 1", seq_len(ncol(lincom))) } else { lab <- sprintf("%s - %s", lab, lab[1]) } colnames(lincom) <- lab lincom <- lincom[, 2:ncol(lincom), drop = FALSE] return(lincom) } lincom_revsequential <- function(x, by) { lincom <- matrix(0, nrow = nrow(x), ncol = nrow(x) - 1) lab <- get_hypothesis_row_labels(x, by = by) if (length(lab) == 0 || anyDuplicated(lab) > 0) { lab <- sprintf("Row %s - Row %s", seq_len(ncol(lincom)), seq_len(ncol(lincom)) + 1) } else { lab <- sprintf("%s - %s", lab[seq_len(ncol(lincom))], lab[seq_len(ncol(lincom)) + 1]) } for (i in seq_len(ncol(lincom))) { lincom[i:(i + 1), i] <- c(1, -1) } colnames(lincom) <- lab return(lincom) } lincom_sequential <- function(x, by) { lincom <- matrix(0, nrow = nrow(x), ncol = nrow(x) - 1) lab <- get_hypothesis_row_labels(x, by = by) if (length(lab) == 0 || anyDuplicated(lab) > 0) { lab <- sprintf("Row %s - Row %s", seq_len(ncol(lincom)) + 1, seq_len(ncol(lincom))) } else { lab <- sprintf("%s - %s", lab[seq_len(ncol(lincom)) + 1], lab[seq_len(ncol(lincom))]) } for (i in seq_len(ncol(lincom))) { lincom[i:(i + 1), i] <- c(-1, 1) } colnames(lincom) <- lab return(lincom) } lincom_revpairwise <- function(x, by) { lab_row <- get_hypothesis_row_labels(x, by = by) lab_col <- NULL flag <- length(lab_row) == 0 || anyDuplicated(lab_row) > 0 mat <- list() for (i in seq_len(nrow(x))) { for (j in 2:nrow(x)) { if (i < j) { tmp <- matrix(0, nrow = nrow(x), ncol = 1) tmp[i, ] <- -1 tmp[j, ] <- 1 mat <- c(mat, list(tmp)) if (isTRUE(flag)) { lab_col <- c(lab_col, sprintf("Row %s - Row %s", j, i)) } else { lab_col <- c(lab_col, sprintf("%s - %s", lab_row[j], lab_row[i])) } } } } lincom <- do.call("cbind", mat) colnames(lincom) <- lab_col return(lincom) } lincom_pairwise <- function(x, by) { lab_row <- get_hypothesis_row_labels(x, by = by) lab_col <- NULL flag <- length(lab_row) == 0 || anyDuplicated(lab_row) > 0 mat <- list() for (i in seq_len(nrow(x))) { for (j in 2:nrow(x)) { if (i < j) { tmp <- matrix(0, nrow = nrow(x), ncol = 1) tmp[j, ] <- -1 tmp[i, ] <- 1 mat <- c(mat, list(tmp)) if (isTRUE(flag)) { lab_col <- c(lab_col, sprintf("Row %s - Row %s", i, j)) } else { lab_col <- c(lab_col, sprintf("%s - %s", lab_row[i], lab_row[j])) } } } } lincom <- do.call("cbind", mat) colnames(lincom) <- lab_col return(lincom) } lincom_multiply <- function(x, lincom) { # bayesian draws <- attr(x, "posterior_draws") if (!is.null(draws)) { draws <- t(as.matrix(lincom)) %*% draws out <- data.table( term = colnames(lincom), tmp = apply(draws, 1, stats::median)) setnames(out, old = "tmp", new = "estimate") attr(out, "posterior_draws") <- draws # frequentist } else { out <- data.table( term = colnames(lincom), tmp = as.vector(x[["estimate"]] %*% lincom)) setnames(out, old = "tmp", new = "estimate") } out <- out[out$term != "1 - 1", , drop = FALSE] return(out) } eval_string_hypothesis <- function(x, hypothesis, lab) { # row indices: `hypotheses` includes them, but `term` does not if (isTRUE(grepl("\\bb\\d+\\b", hypothesis)) && !any(grepl("\\bb\\d+\\b", x[["term"]]))) { bmax <- regmatches(lab, gregexpr("\\bb\\d+\\b", lab))[[1]] bmax <- tryCatch(max(as.numeric(gsub("b", "", bmax))), error = function(e) 0) if (bmax > nrow(x)) { msg <- "%s cannot be used in `hypothesis` because the call produced just %s estimate(s). Try executing the exact same command without the `hypothesis` argument to see which estimates are available for hypothesis testing." msg <- sprintf(msg, paste0("b", bmax), nrow(x)) insight::format_error(msg) } for (i in seq_len(nrow(x))) { tmp <- paste0("marginaleffects__", i) hypothesis <- gsub(paste0("b", i), tmp, hypothesis) } rowlabels <- paste0("marginaleffects__", seq_len(nrow(x))) # term names } else { if (!"term" %in% colnames(x) || anyDuplicated(x$term) > 0) { msg <- c( 'To use term names in a `hypothesis` string, the same function call without `hypothesis` argument must produce a `term` column with unique row identifiers. You can use `b1`, `b2`, etc. indices instead of term names in the `hypotheses` string Ex: "b1 + b2 = 0" Alternatively, you can use the `newdata`, `variables`, or `by` arguments:', "", "mod <- lm(mpg ~ am * vs + cyl, data = mtcars)", 'comparisons(mod, newdata = "mean", hypothesis = "b1 = b2")', 'comparisons(mod, newdata = "mean", hypothesis = "am = vs")', 'comparisons(mod, variables = "am", by = "cyl", hypothesis = "pairwise")') insight::format_error(msg) } rowlabels <- x$term } eval_string_function <- function(vec, hypothesis, rowlabels) { envir <- parent.frame() void <- sapply( seq_along(vec), function(i) { assign(rowlabels[i], vec[i], envir = envir) }) out <- eval(parse(text = hypothesis), envir = envir) return(out) } if (!is.null(attr(lab, "names"))) { lab = attr(lab, "names") } else { lab = gsub("\\s+", "", lab) } draws <- attr(x, "posterior_draws") if (!is.null(draws)) { insight::check_if_installed("collapse", minimum_version = "1.9.0") tmp <- apply( draws, MARGIN = 2, FUN = eval_string_function, hypothesis = hypothesis, rowlabels = rowlabels) draws <- matrix(tmp, ncol = ncol(draws)) out <- data.table( term = lab, tmp = collapse::dapply(draws, MARGIN = 1, FUN = collapse::fmedian)) } else { out <- eval_string_function( x[["estimate"]], hypothesis = hypothesis, rowlabels = rowlabels) out <- data.table( term = lab, tmp = out) } setnames(out, old = "tmp", new = "estimate") attr(out, "posterior_draws") <- draws return(out) } expand_wildcard <- function(hyp, bmax, lab) { # Find all occurrences of b* bstar_indices <- gregexpr("b\\*", hyp)[[1]] if (bstar_indices[1] == -1) return(list(hyp, lab)) bstar_count <- length(bstar_indices) if (bstar_count > 1) { insight::format_error("Error: More than one 'b*' substring found.") } # Replace b* with b1, b2, b3, ..., bmax labs <- character(bmax) result <- character(bmax) for (i in 1:bmax) { result[i] <- sub("b\\*", paste0("b", i), hyp) labs[i] <- sub("b\\*", paste0("b", i), lab) } return(list(result, labs)) } marginaleffects/R/broom.R0000644000176200001440000000436114631452335015060 0ustar liggesusers#' @importFrom generics tidy #' @export generics::tidy #' @importFrom generics glance #' @export generics::glance #' tidy helper #' #' @noRd #' @export tidy.comparisons <- function(x, ...) { insight::check_if_installed("tibble") out <- tibble::as_tibble(x) if (!"term" %in% names(out)) { lab <- seq_len(nrow(out)) if ("group" %in% colnames(out) || is.character(attr(x, "by"))) { tmp <- c("group", attr(x, "by")) tmp <- Filter(function(j) j %in% colnames(x), tmp) if (length(tmp) > 0) { tmp <- do.call(paste, out[, tmp]) if (anyDuplicated(tmp)) { tmp <- paste(seq_len(nrow(out)), tmp) } lab <- tmp } } out[["term"]] <- lab } return(out) } #' tidy helper #' #' @noRd #' @export tidy.slopes <- tidy.comparisons #' tidy helper #' #' @noRd #' @export tidy.predictions <- tidy.comparisons #' tidy helper #' #' @noRd #' @export tidy.hypotheses <- tidy.comparisons #' tidy helper #' #' @noRd #' @export tidy.marginalmeans <- function(x, ...) { insight::check_if_installed("tibble") tibble::as_tibble(x) } #' @noRd #' @export glance.slopes <- function(x, ...) { insight::check_if_installed("insight") insight::check_if_installed("modelsummary") model <- tryCatch(attr(x, "model"), error = function(e) NULL) if (is.null(model) || isTRUE(checkmate::check_string(model))) { model <- tryCatch(attr(x, "call")[["model"]], error = function(e) NULL) } gl <- suppressMessages(suppressWarnings(try( modelsummary::get_gof(model, ...), silent = TRUE))) if (inherits(gl, "data.frame")) { out <- data.frame(gl) } else { out <- NULL } vcov.type <- attr(x, "vcov.type") if (is.null(out) && !is.null(vcov.type)) { out <- data.frame("vcov.type" = vcov.type) } else if (!is.null(out)) { out[["vcov.type"]] <- vcov.type } out <- tibble::as_tibble(out) return(out) } #' @noRd #' @export glance.predictions <- glance.slopes #' @noRd #' @export glance.comparisons <- glance.slopes #' @noRd #' @export glance.hypotheses <- glance.slopes #' @noRd #' @export glance.marginalmeans <- glance.slopesmarginaleffects/R/methods_survey.R0000644000176200001440000000552014631452335017020 0ustar liggesusers#' @include get_coef.R #' @rdname get_coef #' @export get_coef.svyolr <- function(model, ...) { out <- insight::get_parameters(model) out <- stats::setNames(out$Estimate, out$Parameter) return(out) } #' @include set_coef.R #' @rdname set_coef #' @export set_coef.svyolr <- function(model, coefs, ...) { # in basic model classes coefficients are named vector idx <- match(names(model$coefficients), names(coefs)) model[["coefficients"]] <- coefs[idx] idx <- match(names(model$zeta), names(coefs)) model[["zeta"]] <- coefs[idx] model } #' @include get_group_names.R #' @rdname get_group_names #' @export get_group_names.svyolr <- function(model, ...) { resp <- insight::get_response(model) if (is.factor(resp)) { out <- levels(resp) } else { out <- unique(resp) } return(out) } #' @include get_predict.R #' @rdname get_predict #' @export get_predict.svyolr <- function(model, newdata = insight::get_data(model), type = "probs", ...) { type <- sanitize_type(model, type, calling_function = "predictions") # hack: 1-row newdata returns a vector, so get_predict.default does not learn about groups if (nrow(newdata) == 1) { hack <- TRUE newdata <- newdata[c(1, 1), , drop = FALSE] newdata$rowid[1] <- -Inf } else { hack <- FALSE } out <- get_predict.default(model, newdata = newdata, type = type, ...) # hack out <- out[out$rowid != -Inf, ] return(out) } #' @include get_predict.R #' @rdname get_predict #' @export get_predict.svyglm <- function(model, newdata = insight::get_data(model), type = "response", se.fit = FALSE, ...) { estimate <- stats::predict(model, newdata = newdata, type = type, se.fit = se.fit) rowid <- attr(estimate, "names") if (is.null(rowid)) { rowid <- seq_len(estimate) } else { # rowid might be character, but survey::predict() requires non-negative integers rowid <- seq_along(rowid) } out <- data.frame(rowid, estimate = as.numeric(estimate)) row.names(out) <- NULL return(out) } #' @include sanity_model.R #' @rdname sanitize_model_specific #' @export sanitize_model_specific.svyolr <- function(model, wts = FALSE, by = FALSE, ...) { if (isFALSE(wts) && !isFALSE(by)) { warning("With models of this class, it is normally good practice to specify weights using the `wts` argument. Otherwise, weights will be ignored in the computation of quantities of interest.", call. = FALSE) } return(model) } #' @include sanity_model.R #' @rdname sanitize_model_specific #' @export sanitize_model_specific.svyglm <- sanitize_model_specific.svyolr marginaleffects/R/methods_biglm.R0000644000176200001440000000203514631452335016553 0ustar liggesusers#' @rdname get_predict #' @export get_predict.biglm <- function(model, newdata = insight::get_data(model), type = "response", ...) { type <- sanitize_type(model, type, calling_function = "predictions") type_base <- unname(type) out <- stats::predict( model, newdata = newdata, type = type) out <- as.vector(out) out <- data.frame( rowid = seq_along(out), estimate = out) return(out) } #' @rdname get_vcov #' @export get_vcov.biglm <- function(model, vcov = NULL, ...) { if (!isFALSE(vcov)) { insight::format_warning(c("The `vcov` argument is not supported for this model type. Set `vcov=FALSE` to silence this warning, and visit this link to learn why standard errors for this model are not yet supported and how you can help:", "https://github.com/vincentarelbundock/marginaleffects/issues/387")) } return(FALSE) } marginaleffects/R/bootstrap_boot.R0000644000176200001440000000530314631452335016777 0ustar liggesusersbootstrap_boot <- function(model, INF_FUN, ...) { # attached by `inferences()` conf_type <- attr(model, "inferences_conf_type") checkmate::assert_choice(conf_type, choices = c("perc", "norm", "basic", "bca")) # bootstrap using the original data and call modcall <- insight::get_call(model) modeldata <- get_modeldata(model, additional_variables = FALSE) # evaluate the {marginaleffects} call to get output without inferences() # use ... because arguments are not the same for different {marginaleffects} functions dots <- list(...) dots[["vcov"]] <- FALSE # avoid recursion attr(model, "inferences_method") <- NULL out <- do.call(INF_FUN, c(list(model), dots)) # default confidence level may be implicit in original call, but we need numeric if (is.null(dots[["conf_level"]])) { conf_level <- 0.95 } else { conf_level <- dots[["conf_level"]] } bootfun <- function(data, indices) { d <- data[indices, , drop = FALSE] modcall[["data"]] <- d modboot <- eval(modcall) modboot <- eval(modboot) args <- c(list(modboot, modeldata = d), dots) out <- do.call(INF_FUN, args)$estimate return(out) } args <- list("data" = modeldata, "statistic" = bootfun) args <- c(args, attr(model, "inferences_dots")) args <- args[unique(names(args))] B <- do.call(boot::boot, args) # print.boot prints an ugly nested call B$call <- match.call() # HACK: boot::boot() output is non-standard. There must be a better way! # NG: just compute them manually as the SD of the bootstrap distribution pr <- utils::capture.output(print(B)) pr <- pr[(grep("^Bootstrap Statistics :", pr) + 1):length(pr)] pr <- gsub("std. error", "std.error", pr) pr <- paste(pr, collapse = "\n") pr <- utils::read.table(text = pr, header = TRUE) out$std.error <- pr$std.error # extract from weird boot.ci() list (inspired from `broom::tidy.broom` under MIT) ci_list <- lapply(seq_along(B$t0), boot::boot.ci, boot.out = B, conf = conf_level, type = conf_type) pos <- pmatch(conf_type, names(ci_list[[1]])) if (conf_type == "norm") { cols <- 2:3 } else { cols <- 4:5 } ci <- lapply(ci_list, function(x) x[[pos]]) ci <- do.call("rbind", ci)[, cols] # add CI to original {marginaleffects} call if (is.matrix(ci)) { out$conf.low <- ci[, 1] out$conf.high <- ci[, 2] } else { out$conf.low <- ci[1] out$conf.high <- ci[2] } attr(out, "inferences") <- B attr(out, "posterior_draws") <- t(B$t) return(out) } marginaleffects/R/sanity_model.R0000644000176200001440000001005414631452335016425 0ustar liggesusers#' Method to raise model-specific warnings and errors #' #' @inheritParams slopes #' @return A warning, an error, or nothing #' @rdname sanitize_model_specific #' @keywords internal sanitize_model_specific <- function (model, ...) { UseMethod("sanitize_model_specific", model) } #' @rdname sanitize_model_specific sanitize_model_specific.default <- function(model, vcov = NULL, calling_function = "marginaleffects", ...) { return(model) } sanity_model_supported_class <- function(model) { checkmate::assert_character( getOption("marginaleffects_model_classes", default = NULL), null.ok = TRUE) custom_classes <- getOption("marginaleffects_model_classes", default = NULL) custom_classes <- as.list(custom_classes) supported <- append(custom_classes, list( "afex_aov", "amest", #package: Amelia "bart", # package: dbarts "betareg", "bglmerMod", "blmerMod", # "bife", "biglm", c("bigglm", "biglm"), "brglmFit", "brmsfit", c("bracl", "brmultinom", "brglmFit"), c("brnb", "negbin", "glm"), c("clogit", "coxph"), "clm", c("clmm2", "clm2"), "coxph", "crch", "flexsurvreg", # package: flexsurv "fixest", "flic", "flac", c("Gam", "glm", "lm"), # package: gam c("gam", "glm", "lm"), # package: mgcv c("gamlss", "gam", "glm", "lm"), # package: gamlss c("geeglm", "gee", "glm"), c("Gls", "rms", "gls"), "glm", "gls", "glmerMod", "glmrob", "glmmTMB", c("glmmPQL", "lme"), "glimML", "glmx", "hetprob", "hurdle", "hxlr", "ivreg", "iv_robust", "ivpml", "Learner", "lm", "lme", "lmerMod", "lmerModLmerTest", "lmrob", "lmRob", "lm_robust", # "logitr", "loess", "logistf", c("lrm", "lm"), c("lrm", "rms", "glm"), c("mblogit", "mclogit"), c("mclogit", "lm"), "MCMCglmm", "mhurdle", "mira", "mlogit", "model_fit", c("multinom", "nnet"), "mvgam", c("negbin", "glm", "lm"), "nls", c("ols", "rms", "lm"), c("orm", "rms"), c("oohbchoice", "dbchoice"), "phylolm", "phyloglm", c("plm", "panelmodel"), "polr", "Rchoice", "rendo.base", "rlmerMod", "rq", c("scam", "glm", "lm"), c("selection", "selection", "list"), "speedglm", "speedlm", "stanreg", "survreg", "svyolr", c("tobit", "survreg"), "tobit1", "truncreg", "workflow", "zeroinfl")) flag <- FALSE for (sup in supported) { if (!is.null(sup) && isTRUE(all(sup %in% class(model)))) { flag <- TRUE } } if (isFALSE(flag)) { support <- paste(sort(unique(sapply(supported, function(x) x[1]))), collapse = ", ") msg <- c( sprintf('Models of class "%s" are not supported. Supported model classes include:', class(model)[1]), "", support, "", "New modeling packages can usually be supported by `marginaleffects` if they include a working `predict()` method. If you believe that this is the case, please file a feature request on Github: https://github.com/vincentarelbundock/marginaleffects/issues") msg <- insight::format_message(msg) stop(msg, call. = FALSE) } } sanitize_model <- function(model, newdata = NULL, vcov = NULL, by = FALSE, ...) { model <- sanitize_model_specific(model, vcov = vcov, newdata = newdata, by = by, ...) sanity_model_supported_class(model) return(model) } marginaleffects/R/methods_plm.R0000644000176200001440000000131614631452335016252 0ustar liggesusers#' @include sanity_model.R #' @rdname sanitize_model_specific #' @keywords internal sanitize_model_specific.plm <- function(model, ...) { if ("within" %in% model$args$model) { stop('The `plm::predict` function does not appear to support the `newdata` argument when `plm(model="within")`. Therefore, `marginaleffects` cannot support "within" models, even if it supports many other models produced by the `plm` package. You may want to try the `fixest` package instead.', call. = FALSE) } return(model) } #' @rdname sanitize_model_specific sanitize_model_specific.plm <- function(model, ...) { insight::check_if_installed("insight", minimum_version = "0.17.1") return(model) } marginaleffects/R/bootstrap_fwb.R0000644000176200001440000000365314631452335016620 0ustar liggesusersbootstrap_fwb <- function(model, INF_FUN, ...) { # attached by `inferences()` conf_type <- attr(model, "inferences_conf_type") checkmate::assert_choice(conf_type, choices = c("perc", "norm", "basic", "bc", "bca")) # bootstrap using the original data and call modeldata <- get_modeldata(model, additional_variables = FALSE) # evaluate the {marginaleffects} call to get output without inferences() # use ... because arguments are not the same for different {marginaleffects} functions dots <- list(...) dots[["vcov"]] <- FALSE # avoid recursion attr(model, "inferences_method") <- NULL out <- do.call(INF_FUN, c(list(model), dots)) # default confidence level may be implicit in original call, but we need numeric if (is.null(dots[["conf_level"]])) { conf_level <- 0.95 } else { conf_level <- dots[["conf_level"]] } bootfun <- function(data, w) { # If model has weights, multiply them by random weights if (!is.null(w0 <- stats::weights(model))) w <- w * w0 # Update the model's call and evaluate modboot <- stats::update(model, weights = w, evaluate = TRUE) # {marginaleffects} function needs to incorporate weights if # averaging. May be a problem if other weights supplied to # `wts` argument. dots[["wts"]] <- w args <- c(list(modboot), dots) out <- do.call(INF_FUN, args)$estimate return(out) } args <- list("data" = modeldata, "statistic" = bootfun) args <- c(args, attr(model, "inferences_dots")) args <- args[unique(names(args))] B <- do.call(fwb::fwb, args) # print.boot prints an ugly nested call B$call <- match.call() # Extract SEs and CIs fwb_summary <- summary(B, conf = conf_level, ci.type = conf_type) out$std.error <- fwb_summary[, "Std. Error"] out$conf.low <- fwb_summary[, 3] out$conf.high <- fwb_summary[, 4] attr(out, "inferences") <- B attr(out, "posterior_draws") <- t(B$t) return(out) } marginaleffects/R/modelarchive.R0000644000176200001440000000105214631452335016376 0ustar liggesusers# unexported functions for use in tests modelarchive_model <- function(name) { tmp <- tempfile() url <- paste0("https://raw.github.com/vincentarelbundock/modelarchive/main/data/", name, ".rds") try(utils::download.file(url, tmp, quiet = TRUE), silent = TRUE) out <- try(readRDS(tmp), silent = TRUE) return(out) } modelarchive_data <- function(name) { dat <- sprintf( "https://raw.githubusercontent.com/vincentarelbundock/modelarchive/main/data-raw/%s.csv", name) out <- utils::read.csv(dat) return(out) }marginaleffects/R/sort.R0000644000176200001440000000233414631452335014727 0ustar liggesusers sort_columns <- function(x, newdata = data.frame(), by = NULL) { if (!inherits(x, "data.table")) { data.table::setDT(x) } if (isTRUE(checkmate::check_character(by))) { bycols <- by } else if (isTRUE(checkmate::check_data_frame(by))) { bycols <- colnames(by) } else { bycols <- NULL } stubcols <- c( "rowid", "rowidcf", "term", "group", "hypothesis", "by", grep("^contrast", colnames(x), value = TRUE), bycols, "estimate", "std.error", "statistic", "p.value", "s.value", "conf.low", "conf.high", attr(newdata, "newdata_variables_datagrid"), "marginaleffects_wts", sort(grep("^predicted", colnames(newdata), value = TRUE))) cols <- intersect(stubcols, colnames(x)) cols <- unique(c(cols, colnames(x))) x <- x[, ..cols] if ("group" %in% names(x) && all(x$group == "main_marginaleffect")) { x$group <- NULL } # return contrast column only when relevant if ("contrast" %in% colnames(x)) { x[is.na(contrast), "contrast" := ""] x[contrast == "dydx", "contrast" := "dY/dX"] if (all(x$contrast == "dY/dX")) { x[, "contrast" := NULL] } } return(x) }marginaleffects/R/methods_rms.R0000644000176200001440000000167514631452335016273 0ustar liggesusers#' @rdname get_vcov #' @export get_vcov.orm <- function(model, vcov = NULL, ...) { if (!is.null(vcov) && !isTRUE(checkmate::check_flag(vcov))) { msg <- "The `vcov` argument is not supported for models of this class." insight::format_error(msg) } out <- stats::vcov(model, intercepts = "all") return(out) } #' @rdname get_predict #' @export get_predict.rms <- function(model, newdata = insight::get_data(model), type = NULL, ...) { if (is.null(type)) { type <- sanitize_type(model, type, calling_function = "predictions") } # {rms} predict methods break on additional arguments get_predict.default(model, newdata = newdata, type = type) } #' @rdname get_predict #' @export get_predict.orm <- get_predict.rms #' @rdname get_predict #' @export get_predict.lrm <- get_predict.rms #' @rdname get_predict #' @export get_predict.ols <- get_predict.rmsmarginaleffects/R/methods_dbarts.R0000644000176200001440000000275614631452335016752 0ustar liggesusers#' @include get_predict.R #' @rdname get_predict #' @export get_predict.bart <- function(model, newdata = NULL, ...) { args <- c( list( object = model, newdata = newdata), list(...)) p <- do.call(stats::predict, args) p_med <- collapse::fmedian(p) if ("rowid" %in% colnames(newdata) && nrow(newdata) == length(p_med)) { out <- data.frame( rowid = newdata$rowid, group = "main_marginaleffect", estimate = p_med ) } else { out <- data.frame( rowid = seq_along(length(p_med)), group = "main_marginaleffect", estimate = p_med ) } attr(out, "posterior_draws") <- t(p) return(out) } #' @include sanity_model.R #' @rdname sanitize_model_specific #' @export sanitize_model_specific.bart <- function(model, ...) { insight::check_if_installed("collapse", minimum_version = "1.9.0") if (!isTRUE(as.character(insight::get_call(model))[1] %in% c("bart2", "dbarts::bart2"))) { msg <- "`marginaleffects` only supports models estimated using the formula interface in `bart2()` function, not the matrix input in `bart()`." insight::format_error(msg) } return(model) } #' @rdname get_vcov #' @export get_vcov.bart <- function(model, vcov = NULL, ...) { if (!is.null(vcov) && !is.logical(vcov)) { insight::format_warning("The `vcov` argument is not supported for models of this class.") } return(NULL) }marginaleffects/R/myTryCatch.R0000644000176200001440000000072314631452335016027 0ustar liggesusers# License: https://creativecommons.org/licenses/by-sa/3.0/ # Source: https://stackoverflow.com/a/24569739/342331 myTryCatch <- function(expr) { warn <- err <- NULL value <- withCallingHandlers( tryCatch(expr, error = function(e) { err <<- e NULL }), warning = function(w) { warn <<- w invokeRestart("muffleWarning") } ) list(value = value, warning = warn, error = err) } marginaleffects/R/sanity_dots.R0000644000176200001440000000775214631452335016311 0ustar liggesusers# This function is very strict. sanity_dots <- function(model, calling_function = NULL, ...) { dots <- list(...) if (isTRUE(calling_function == "marginaleffects")) { # comparison: this would break `dydx` normalization # interaction: cross countrast+slope do not make sense # transform: should we really be back-transforming slopes? unsupported <- c("comparison", "transform", "cross", "transform_pre", "transform_post") unsupported <- intersect(names(dots), unsupported) if (length(unsupported) > 0) { msg <- sprintf( "These arguments are supported by the `comparisons()` function but not by the `slopes()` function: %s", paste(unsupported, collapse = ", ")) stop(msg, call. = FALSE) } } # deprecated if ("interaction" %in% names(dots)) { msg <- "The `interaction` argument has been deprecated. Please use `cross` instead." insight::format_warning(msg) } valid <- list() # mixed effects valid[["merMod"]] <- valid[["lmerMod"]] <- valid[["glmerMod"]] <- valid[["lmerModLmerTest"]] <- c("include_random", "re.form", "allow.new.levels", "random.only") valid[["brmsfit"]] <- c("draw_ids", "nlpar", "ndraws", "re_formula", "allow_new_levels", "sample_new_levels", "dpar", "resp") valid[["brmsfit_multiple"]] <- valid[["brmsfit"]] valid[["selection"]] <- c("part") # sampleSelection valid[["glmmTMB"]] <- c("re.form", "allow.new.levels", "zitype") # glmmTMB valid[["bam"]] <- c("exclude") # mgcv valid[["gam"]] <- c("exclude") # mgcv valid[["rlmerMod"]] <- c("re.form", "allow.new.levels") valid[["gamlss"]] <- c("what", "safe") # gamlss valid[["lme"]] <- c("level") # nlme::lme valid[["bife"]] <- c("alpha_new", "corrected") # nlme::lme valid[["process_error"]] <- # mvgam::mvgam # flexsurv valid[["flexsurvreg"]] <- c("times", "p", "start") white_list <- c( "conf.int", "modeldata", "internal_call", "df", "transform", "comparison", "side", "delta", "null", "equivalence", "draw", "flag", # internal dev "transform_pre", "transform_post", # backward compatibility everywhere "variables_grid", # backward compatibility in marginal_means() "at" # topmodels procast ) model_class <- class(model)[1] good <- NULL if (model_class %in% names(valid)) { good <- valid[[model_class]] } backward_compatibility <- c("conf.level") good <- c(good, backward_compatibility) bad <- setdiff(names(dots), c(good, white_list)) if (length(bad) > 0) { if (model_class %in% names(valid)) { msg <- sprintf("These arguments are not known to be supported for models of class `%s`: %s. These arguments are known to be valid: %s. All arguments are still passed to the model-specific prediction function, but users are encouraged to check if the argument is indeed supported by their modeling package. Please file a request on Github if you believe that an unknown argument should be added to the `marginaleffects` white list of known arguments, in order to avoid raising this warning: https://github.com/vincentarelbundock/marginaleffects/issues", model_class, paste(bad, collapse = ", "), paste(valid[[model_class]], collapse = ", ")) } else { msg <- sprintf("These arguments are not known to be supported for models of class `%s`: %s. All arguments are still passed to the model-specific prediction function, but users are encouraged to check if the argument is indeed supported by their modeling package. Please file a request on Github if you believe that an unknown argument should be added to the `marginaleffects` white list of known arguments, in order to avoid raising this warning: https://github.com/vincentarelbundock/marginaleffects/issues", model_class, paste(bad, collapse = ", ")) } warning(msg, call. = FALSE) } } marginaleffects/R/datagrid.R0000644000176200001440000005133614631452335015525 0ustar liggesusers#' Data grids #' #' @description #' Generate a data grid of user-specified values for use in the `newdata` argument of the `predictions()`, `comparisons()`, and `slopes()` functions. This is useful to define where in the predictor space we want to evaluate the quantities of interest. Ex: the predicted outcome or slope for a 37 year old college graduate. #' #' @param ... named arguments with vectors of values or functions for user-specified variables. #' + Functions are applied to the variable in the `model` dataset or `newdata`, and must return a vector of the appropriate type. #' + Character vectors are automatically transformed to factors if necessary. #' +The output will include all combinations of these variables (see Examples below.) #' @param model Model object #' @param newdata data.frame (one and only one of the `model` and `newdata` arguments can be used.) #' @param by character vector with grouping variables within which `FUN_*` functions are applied to create "sub-grids" with unspecified variables. #' @param response Logical should the response variable be included in the grid, even if it is not specified explicitly. #' @param FUN_character the function to be applied to character variables. #' @param FUN_factor the function to be applied to factor variables. This only applies if the variable in the original data is a factor. For variables converted to factor in a model-fitting formula, for example, `FUN_character` is used. #' @param FUN_logical the function to be applied to logical variables. #' @param FUN_integer the function to be applied to integer variables. #' @param FUN_binary the function to be applied to binary variables. #' @param FUN_numeric the function to be applied to numeric variables. #' @param FUN_other the function to be applied to other variable types. #' @param grid_type character. Determines the functions to apply to each variable. The defaults can be overridden by defining individual variables explicitly in `...`, or by supplying a function to one of the `FUN_*` arguments. #' * "mean_or_mode": Character, factor, logical, and binary variables are set to their modes. Numeric, integer, and other variables are set to their means. #' * "balanced": Each unique level of character, factor, logical, and binary variables are preserved. Numeric, integer, and other variables are set to their means. Warning: When there are many variables and many levels per variable, a balanced grid can be very large. In those cases, it is better to use `grid_type="mean_or_mode"` and to specify the unique levels of a subset of named variables explicitly. #' * "counterfactual": the entire dataset is duplicated for each combination of the variable values specified in `...`. Variables not explicitly supplied to `datagrid()` are set to their observed values in the original dataset. #' @details #' If `datagrid` is used in a `predictions()`, `comparisons()`, or `slopes()` call as the #' `newdata` argument, the model is automatically inserted in the `model` argument of `datagrid()` #' call, and users do not need to specify either the `model` or `newdata` arguments. The same behavior will occur when the value supplied to `newdata=` is a function call which starts with "datagrid". This is intended to allow users to create convenience shortcuts like: #' #' \preformatted{ #' library(marginaleffects) #' mod <- lm(mpg ~ am + vs + factor(cyl) + hp, mtcars) #' datagrid_bal <- function(...) datagrid(..., grid_type = "balanced") #' predictions(model, newdata = datagrid_bal(cyl = 4)) #' } #' #' #' If users supply a model, the data used to fit that model is retrieved using #' the `insight::get_data` function. #' @return #' A `data.frame` in which each row corresponds to one combination of the named #' predictors supplied by the user via the `...` dots. Variables which are not #' explicitly defined are held at their mean or mode. #' @export #' @examples #' # The output only has 2 rows, and all the variables except `hp` are at their #' # mean or mode. #' datagrid(newdata = mtcars, hp = c(100, 110)) #' #' # We get the same result by feeding a model instead of a data.frame #' mod <- lm(mpg ~ hp, mtcars) #' datagrid(model = mod, hp = c(100, 110)) #' #' # Use in `marginaleffects` to compute "Typical Marginal Effects". When used #' # in `slopes()` or `predictions()` we do not need to specify the #' #`model` or `newdata` arguments. #' slopes(mod, newdata = datagrid(hp = c(100, 110))) #' #' # datagrid accepts functions #' datagrid(hp = range, cyl = unique, newdata = mtcars) #' comparisons(mod, newdata = datagrid(hp = fivenum)) #' #' # The full dataset is duplicated with each observation given counterfactual #' # values of 100 and 110 for the `hp` variable. The original `mtcars` includes #' # 32 rows, so the resulting dataset includes 64 rows. #' dg <- datagrid(newdata = mtcars, hp = c(100, 110), grid_type = "counterfactual") #' nrow(dg) #' #' # We get the same result by feeding a model instead of a data.frame #' mod <- lm(mpg ~ hp, mtcars) #' dg <- datagrid(model = mod, hp = c(100, 110), grid_type = "counterfactual") #' nrow(dg) datagrid <- function( ..., model = NULL, newdata = NULL, by = NULL, grid_type = "mean_or_mode", response = FALSE, FUN_character = NULL, FUN_factor = NULL, FUN_logical = NULL, FUN_numeric = NULL, FUN_integer = NULL, FUN_binary = NULL, FUN_other = NULL) { dots <- list(...) # backward compatibility: 20231220 if (identical(grid_type, "typical")) { grid_type <- "mean_or_mode" } # sanity checkmate::assert_choice(grid_type, choices = c("mean_or_mode", "balanced", "counterfactual")) checkmate::assert_function(FUN_character, null.ok = TRUE) checkmate::assert_function(FUN_factor, null.ok = TRUE) checkmate::assert_function(FUN_logical, null.ok = TRUE) checkmate::assert_function(FUN_binary, null.ok = TRUE) checkmate::assert_function(FUN_integer, null.ok = TRUE) checkmate::assert_function(FUN_numeric, null.ok = TRUE) checkmate::assert_function(FUN_other, null.ok = TRUE) checkmate::assert_character(by, null.ok = TRUE) checkmate::assert_data_frame(newdata, null.ok = TRUE) checkmate::assert_flag(response) if (grid_type == "mean_or_mode") { if (is.null(FUN_character)) FUN_character <- get_mode if (is.null(FUN_logical)) FUN_logical <- get_mode if (is.null(FUN_factor)) FUN_factor <- get_mode if (is.null(FUN_binary)) FUN_binary <- get_mode if (is.null(FUN_numeric)) FUN_numeric <- function(x) mean(x, na.rm = TRUE) if (is.null(FUN_other)) FUN_other <- function(x) mean(x, na.rm = TRUE) if (is.null(FUN_integer)) FUN_integer <- function(x) round(mean(x, na.rm = TRUE)) } else if (grid_type == "balanced") { if (is.null(FUN_character)) FUN_character <- unique if (is.null(FUN_logical)) FUN_logical <- unique # not just levels(), because that is string, and sorts badly ex: "2" vs "10" if (is.null(FUN_factor)) FUN_factor <- function(k) sort(unique(k)) if (is.null(FUN_binary)) FUN_binary <- unique if (is.null(FUN_numeric)) FUN_numeric <- function(x) mean(x, na.rm = TRUE) if (is.null(FUN_other)) FUN_other <- function(x) mean(x, na.rm = TRUE) if (is.null(FUN_integer)) FUN_integer <- function(x) round(mean(x, na.rm = TRUE)) } else if (grid_type == "counterfactual") { if (!is.null(by)) { insight::format_error("The `by` argument is not supported for counterfactual grids.") } args <- list( model = model, newdata = newdata) args <- c(dots, args) out <- do.call("datagridcf_internal", args) return(out) } if (!is.null(by)) { if (is.null(newdata) && is.null(model)) { insight::format_error("One of `newdata` and `model` must not be `NULL`.") } if (is.null(newdata)) { newdata <- get_modeldata(model, additional_variables = by) } if (!all(by %in% colnames(newdata))) { insight::format_error("All elements of `by` must match column names in `newdata`.") } data.table::setDT(newdata) idx <- subset(newdata, select = by) newdata_list <- split(newdata, idx, keep.by = TRUE) for (i in seq_along(newdata_list)) { args <- c(list(...), list( model = model, newdata = newdata_list[[i]], response = response, FUN_character = FUN_character, FUN_factor = FUN_factor, FUN_logical = FUN_logical, FUN_binary = FUN_binary, FUN_numeric = FUN_numeric, FUN_integer = FUN_integer, FUN_other = FUN_other, by = by)) for (b in by) { args[[b]] <- unique } newdata_list[[i]] <- do.call(datagrid_engine, args) } # Issue 1058: missing attributes with `by` at <- attributes(newdata_list[[1]]) out <- data.table::rbindlist(newdata_list) data.table::setDF(out) # Issue 1058: missing attributes with `by` # overwriting everything corrupts the data frame for (n in names(at)) { if (!n %in% names(attributes(out))) { attr(out, n) <- at[[n]] } } return(out) } out <- datagrid_engine(..., model = model, newdata = newdata, response = response, FUN_character = FUN_character, FUN_factor = FUN_factor, FUN_logical = FUN_logical, FUN_binary = FUN_binary, FUN_numeric = FUN_numeric, FUN_integer = FUN_integer, FUN_other = FUN_other) if (!"rowid" %in% colnames(out)) { out$rowid <- seq_len(nrow(out)) } return(out) } datagrid_engine <- function( ..., model = NULL, newdata = NULL, response = response, FUN_character = get_mode, # need to be explicit for numeric variables transfered to factor in model formula FUN_factor = get_mode, FUN_logical = get_mode, FUN_binary = get_mode, FUN_numeric = function(x) mean(x, na.rm = TRUE), FUN_integer = function(x) round(mean(x, na.rm = TRUE)), FUN_other = function(x) mean(x, na.rm = TRUE), by = NULL) { dots <- list(...) tmp <- prep_datagrid(..., model = model, newdata = newdata, by = by) at <- tmp$at dat <- tmp$newdata variables_all <- tmp$all variables_manual <- names(at) variables_automatic <- tmp$automatic # usually we don't want the response in the grid, but # sometimes there are two responses and we need one of them: # brms::brm(y | trials(n) ~ x + w + z) if (!is.null(model) && isFALSE(response)) { resp <- insight::find_response(model) if (inherits(model, "brmsfit")) { fl <- as.character(stats::formula(model)) matches <- regexpr("trials\\(.*?\\)", fl) extracted <- regmatches(fl, matches)[1] if (isFALSE(is.na(extracted[1]))) { extracted <- gsub("trials\\((.*)\\)", "\\1", extracted) } else { extracted <- NULL } extracted <- unlist(extracted) resp <- setdiff(resp, extracted) } variables_automatic <- setdiff(variables_automatic, resp) } if (length(variables_automatic) > 0) { idx <- intersect(variables_automatic, colnames(dat)) dat_automatic <- dat[, ..idx, drop = FALSE] dat_automatic <- stats::na.omit(dat_automatic) out <- list() # na.omit destroys attributes, and we need the "factor" attribute # created by insight::get_data for (n in names(dat_automatic)) { if (get_variable_class(dat, n, c("factor", "strata", "cluster")) || n %in% tmp[["cluster"]]) { if (is.factor(dat_automatic[[n]])) { out[[n]] <- FUN_factor(dat_automatic[[n]]) } else { out[[n]] <- FUN_character(dat_automatic[[n]]) } } else if (get_variable_class(dat, n, "binary")) { out[[n]] <- FUN_binary(dat_automatic[[n]]) } else if (get_variable_class(dat, n, "logical")) { out[[n]] <- FUN_logical(dat_automatic[[n]]) } else if (get_variable_class(dat, n, "character")) { out[[n]] <- FUN_character(dat_automatic[[n]]) } else if (get_variable_class(dat, n, "numeric")) { if (is.integer(dat_automatic[[n]])) { out[[n]] <- FUN_integer(dat_automatic[[n]]) } else { out[[n]] <- FUN_numeric(dat_automatic[[n]]) } } else { out[[n]] <- FUN_other(dat_automatic[[n]]) } } } else { out <- list() } if (!is.null(at)) { for (n in names(at)) { out[n] <- at[n] } } # unique before counting out <- lapply(out, unique) # warn on very large prediction grid num <- as.numeric(sapply(out, length)) # avoid integer overflow num <- Reduce(f = "*", num) if (isTRUE(num > 1e9)) { stop("You are trying to create a prediction grid with more than 1 billion rows, which is likely to exceed the memory and computational power available on your local machine. Presumably this is because you are considering many variables with many levels. All of the functions in the `marginaleffects` package include arguments to specify a restricted list of variables over which to create a prediction grid.", call. = FALSE) } fun <- data.table::CJ args <- c(out, list(sorted = FALSE)) out <- do.call("fun", args) # na.omit destroys attributes, and we need the "factor" attribute # created by insight::get_data for (n in names(out)) { attr(out, "marginaleffects_variable_class") <- attr(dat, "marginaleffects_variable_class") } # better to assume "standard" class as output data.table::setDF(out) attr(out, "variables_datagrid") <- names(dots) return(out) } datagridcf_internal <- function( ..., model = NULL, newdata = NULL) { dots <- list(...) if (length(dots) == 0) { insight::format_error("Users must specify variable values when `grid_type='counterfactual'") } tmp <- prep_datagrid(..., model = model, newdata = newdata) at <- tmp$at dat <- tmp$newdata variables_all <- tmp$all variables_manual <- names(at) variables_automatic <- c(tmp$automatic, "marginaleffects_wts_internal", "rowid_dedup") # `at` -> `data.frame` at <- lapply(at, unique) fun <- data.table::CJ args <- c(at, list(sorted = FALSE)) at <- do.call("fun", args) rowid <- data.frame(rowidcf = seq_len(nrow(dat))) if (length(variables_automatic) > 0) { idx <- intersect(variables_automatic, colnames(dat)) dat_automatic <- dat[, ..idx, drop = FALSE] dat_automatic[, rowidcf := rowid$rowidcf] setcolorder(dat_automatic, c("rowidcf", setdiff(names(dat_automatic), "rowidcf"))) # cross-join 2 data.tables, faster than merging two dataframes out <- cjdt(list(dat_automatic, at)) } else { out <- merge(rowid, at, all = TRUE) } data.table::setDF(out) attr(out, "variables_datagrid") <- names(out) return(out) } prep_datagrid <- function(..., model = NULL, newdata = NULL, by = NULL) { checkmate::assert_data_frame(newdata, null.ok = TRUE) at <- list(...) # e.g., mlogit vignette we plot by group, but group is of length 0 because # we don't know how many groups there are until we make the first # prediction. for (i in seq_along(at)) { if (length(at[[i]]) == 0) { at[[i]] <- NULL } } # if (!is.null(model) & !is.null(newdata)) { # msg <- "One of the `model` or `newdata` arguments must be `NULL`." # stop(msg, call. = FALSE) # } if (is.null(model) & is.null(newdata)) { msg <- "The `model` and `newdata` arguments are both `NULL`. When calling `datagrid()` *inside* the `slopes()` or `comparisons()` functions, the `model` and `newdata` arguments can both be omitted. However, when calling `datagrid()` on its own, users must specify either the `model` or the `newdata` argument (but not both)." insight::format_error(msg) } if (!is.null(model)) { variables_list <- insight::find_variables(model) variables_all <- unlist(variables_list, recursive = TRUE) # weights are not extracted by default variables_all <- c(variables_all, insight::find_weights(model)) } else if (!is.null(newdata)) { variables_list <- NULL variables_all <- colnames(newdata) newdata <- set_variable_class(modeldata = newdata, model = model) } variables_manual <- names(at) variables_automatic <- setdiff(variables_all, variables_manual) # fill in missing data after sanity checks if (is.null(newdata)) { newdata <- get_modeldata(model, additional_variables = FALSE) } attr_variable_classes <- attr(newdata, "marginaleffects_variable_class") # subset columns, otherwise it can be ultra expensive to compute summaries for every variable if (!is.null(model)) { variables_sub <- c( hush(insight::find_variables(model, flatten = TRUE)), hush(unlist(insight::find_weights(model), use.names = FALSE))) # glmmTMB needs weights column for predictions variables_sub <- c(variables_sub, variables_manual) variables_sub <- c(variables_sub, c("marginaleffects_wts_internal", "rowid_dedup")) variables_sub <- intersect(colnames(newdata), variables_sub) if (length(variables_sub) > 0) { newdata <- subset(newdata, select = variables_sub) } } # check `at` names variables_missing <- setdiff(names(at), c(variables_all, "group", by)) if (length(variables_missing) > 0) { warning(sprintf("Some of the variable names are missing from the model data: %s", paste(variables_missing, collapse = ", ")), call. = FALSE) } idx <- vapply(newdata, is.matrix, logical(1L)) if (any(idx)) { if (any(names(newdata)[idx] %in% variables_all)) { insight::format_warning("Matrix columns are not supported as predictors and are therefore omitted. This may prevent computation of the quantities of interest. You can construct your own prediction dataset and supply it explicitly to the `newdata` argument. This issue can happen when using functions like `scale()`, which returns matrices rather than vectors. Convert your column to a vector before fitting you model.") } newdata <- newdata[, !idx, drop = FALSE] } # restore attributes after subsetting attr(newdata, "marginaleffects_variable_class") <- attr_variable_classes # check `at` elements and convert them to factor as needed for (n in names(at)) { # functions first otherwise we try to coerce functions to character if (is.function(at[[n]])) { modeldata <- attr(newdata, "newdata_modeldata") if (!is.null(modeldata) && n %in% colnames(modeldata)) { at[[n]] <- at[[n]](modeldata[[n]]) } else { at[[n]] <- at[[n]](newdata[[n]]) } } # not an "else" situation because we want to process the output of functions too if (is.factor(newdata[[n]]) || isTRUE(get_variable_class(newdata, n, "factor"))) { if (is.factor(newdata[[n]])) { levs <- levels(newdata[[n]]) } else { levs <- as.character(sort(unique(newdata[[n]]))) } at[[n]] <- as.character(at[[n]]) if (!all(at[[n]] %in% c(levs, NA))) { msg <- sprintf('The "%s" element of the `at` list corresponds to a factor variable. The values entered in the `at` list must be one of the factor levels: "%s".', n, paste(levels(newdata[[n]]), collapse = '", "')) stop(msg, call. = FALSE) } else { at[[n]] <- factor(at[[n]], levels = levs) } } } # cluster identifiers will eventually be treated as factors if (!is.null(model)) { v <- insight::find_variables(model) v <- unlist(v[names(v) %in% c("cluster", "strata")], recursive = TRUE) variables_cluster <- c(v, insight::find_random(model, flatten = TRUE)) } else { variables_cluster <- NULL } data.table::setDT(newdata) out <- list("newdata" = newdata, "at" = at, "all" = variables_all, "manual" = variables_manual, "automatic" = variables_automatic, "cluster" = variables_cluster) return(out) } marginaleffects/R/methods_ordinal.R0000644000176200001440000000410214631452335017106 0ustar liggesusers#' @rdname get_predict #' @export get_predict.clm <- function(model, newdata = insight::get_data(model), type = "prob", ...) { # `predict.clm()` only makes predictions for the observed response group of # each observation in `newdata`. When we remove the response from # `newdata`, `predict.clm()` makes predictions for all levels, which is # what we want. resp <- insight::find_response(model) # otherwise `predict.clm` does not see some columns (mystery) data.table::setDF(newdata) newdata <- newdata[, setdiff(colnames(newdata), resp), drop = FALSE] pred <- stats::predict(model, newdata = newdata, type = type) contenders <- c("fit", "eta1", "eta2", "cprob1", "cprob2") tmp <- NULL for (con in contenders) { if (is.null(tmp) && con %in% names(pred)) { tmp <- pred[[con]] } } pred <- tmp out <- data.frame( group = rep(colnames(pred), each = nrow(pred)), estimate = c(pred)) out$group <- group_to_factor(out$group, model) # often an internal call if ("rowid" %in% colnames(newdata)) { out$rowid <- rep(newdata$rowid, times = ncol(pred)) } else { out$rowid <- rep(1:nrow(pred), times = ncol(pred)) } return(out) } #' @include get_group_names.R #' @rdname get_group_names #' @export get_group_names.clm <- get_group_names.polr #' @include sanity_model.R #' @rdname sanitize_model_specific #' @keywords internal sanitize_model_specific.clm <- function(model, ...) { # Corner case: The `predict.clm` method does not make predictions when the # response was transformed to a factor in the formula AND the response is # missing from `newdata`. lhs <- names(attr(stats::terms(model), "dataClasses"))[1] if (isTRUE(grepl("^factor\\(", lhs))) { stop("The response variable should not be transformed to a factor in the formula. Please convert the variable to factor before fitting your model.", call. = FALSE) } return(model) } marginaleffects/R/sanitize_interaction.R0000644000176200001440000000140414631452335020162 0ustar liggesuserssanitize_cross <- function(cross, variables, model) { # cross: flip NULL to TRUE if there are interactions in the formula # and FALSE otherwise checkmate::assert_flag(cross, null.ok = FALSE) if (isTRUE(cross) && is.null(variables)) { msg <- "When `cross = TRUE`, you must use the `variables` argument to specify which variables should be interacted." insight::format_error(msg) } if (isTRUE(checkmate::check_flag(cross))) { return(cross) } inter <- try(insight::find_interactions(model, flatten = TRUE), silent = TRUE) # variables is length 1 means we don't want an interaction if (length(variables) > 1 && isTRUE(length(inter) > 0)) { return(TRUE) } else { return(FALSE) } } marginaleffects/R/methods_lme4.R0000644000176200001440000000344714631452335016332 0ustar liggesusers#' @include set_coef.R #' @rdname set_coef #' @keywords internal #' @export set_coef.merMod <- function(model, coefs, ...) { # in 'merMod', predictions work the slot called "beta", which is unnamed # `fixef(model)` returns the same thing named beta <- methods::slot(model, "beta") beta[match(names(coefs), names(lme4::fixef(model)))] <- as.numeric(coefs) methods::slot(model, "beta") <- beta model } #' @include get_coef.R #' @rdname get_coef #' @export get_coef.merMod <- function(model, ...) { lme4::fixef(model) } #' @rdname get_predict #' @export get_predict.merMod <- function(model, newdata = insight::get_data(model), type = "response", ...) { get_predict.default(model, newdata = newdata, type = type, ...) } #' @rdname set_coef #' @export set_coef.lmerModLmerTest <- set_coef.merMod #' @rdname get_coef #' @export get_coef.lmerModLmerTest <- get_coef.merMod #' @rdname get_predict #' @export get_predict.lmerModLmerTest <- get_predict.merMod #' @rdname set_coef #' @export set_coef.lmerMod <- set_coef.merMod #' @rdname get_coef #' @export get_coef.lmerMod <- get_coef.merMod #' @rdname get_predict #' @export get_predict.lmerMod <- get_predict.merMod #' @rdname sanitize_model_specific #' @export sanitize_model_specific.merMod <- function(model, re.form = NULL, ...) { # re.form=NA if (!isTRUE(is.na(re.form))) { msg <- "For this model type, `marginaleffects` only takes into account the uncertainty in fixed-effect parameters. You can use the `re.form=NA` argument to acknowledge this explicitly and silence this warning." insight::format_warning(msg) } return(model) } marginaleffects/R/sanitize_comparison.R0000644000176200001440000001070714631452335020023 0ustar liggesuserswmean <- function(x, w) { stats::weighted.mean(x, w) } comparison_function_dict <- list( # default = difference between predictions "difference" = function(hi, lo) hi - lo, "differenceavg" = function(hi, lo) mean(hi - lo), "differenceavgwts" = function(hi, lo, w) wmean(hi - lo, w), # slopes and elasticities "dydx" = function(hi, lo, eps) (hi - lo) / eps, "eyex" = function(hi, lo, eps, y, x) (hi - lo) / eps * (x / y), "eydx" = function(hi, lo, eps, y, x) ((hi - lo) / eps) / y, "dyex" = function(hi, lo, eps, x) ((hi - lo) / eps) * x, # average slopes and elasticities "dydxavg" = function(hi, lo, eps) mean((hi - lo) / eps), "eyexavg" = function(hi, lo, eps, y, x) mean((hi - lo) / eps * (x / y)), "eydxavg" = function(hi, lo, eps, y, x) mean(((hi - lo) / eps) / y), "dyexavg" = function(hi, lo, eps, x) mean(((hi - lo) / eps) * x), "dydxavgwts" = function(hi, lo, eps, w) wmean((hi - lo) / eps, w), "eyexavgwts" = function(hi, lo, eps, y, x, w) wmean((hi - lo) / eps * (x / y), w), "eydxavgwts" = function(hi, lo, eps, y, x, w) wmean(((hi - lo) / eps) / y, w), "dyexavgwts" = function(hi, lo, eps, x, w) wmean(((hi - lo) / eps) * x, w), # ratios "ratio" = function(hi, lo) hi / lo, "ratioavg" = function(hi, lo) mean(hi) / mean(lo), "ratioavgwts" = function(hi, lo, w) wmean(hi, w) / wmean(lo, w), "lnratio" = function(hi, lo) log(hi / lo), "lnratioavg" = function(hi, lo) log(mean(hi) / mean(lo)), "lnratioavgwts" = function(hi, lo, w) log(wmean(hi, w) / wmean(lo, w)), "lnor" = function(hi, lo) log((hi / (1 - hi)) / (lo / (1 - lo))), "lnoravg" = function(hi, lo) log((mean(hi) / (1 - mean(hi))) / (mean(lo) / (1 - mean(lo)))), "lnoravgwts" = function(hi, lo, w) log((wmean(hi, w) / (1 - wmean(hi, w))) / (wmean(lo, w) / (1 - wmean(lo, w)))), # others "lift" = function(hi, lo) (hi - lo) / lo, "liftavg" = function(hi, lo) (mean(hi - lo)) / mean(lo), "expdydx" = function(hi, lo, eps) ((exp(hi) - exp(lo)) / exp(eps)) / eps, "expdydxavg" = function(hi, lo, eps) mean(((exp(hi) - exp(lo)) / exp(eps)) / eps), "expdydxavgwts" = function(hi, lo, eps, w) wmean(((exp(hi) - exp(lo)) / exp(eps)) / eps, w) ) comparison_label_dict <- list( "difference" = "%s - %s", "differenceavg" = "mean(%s) - mean(%s)", "differenceavgwts" = "mean(%s) - mean(%s)", "dydx" = "dY/dX", "eyex" = "eY/eX", "eydx" = "eY/dX", "dyex" = "dY/eX", "dydxavg" = "mean(dY/dX)", "eyexavg" = "mean(eY/eX)", "eydxavg" = "mean(eY/dX)", "dyexavg" = "mean(dY/eX)", "dydxavg" = "mean(dY/dX)", "eyexavg" = "mean(eY/eX)", "eydxavg" = "mean(eY/dX)", "dyexavg" = "mean(dY/eX)", "dydxavgwts" = "mean(dY/dX)", "eyexavgwts" = "mean(eY/eX)", "eydxavgwts" = "mean(eY/dX)", "dyexavgwts" = "mean(dY/eX)", "ratio" = "%s / %s", "ratioavg" = "mean(%s) / mean(%s)", "ratioavgwts" = "mean(%s) / mean(%s)", "lnratio" = "ln(%s / %s)", "lnratioavg" = "ln(mean(%s) / mean(%s))", "lnratioavgwts" = "ln(mean(%s) / mean(%s))", "lnor" = "ln(odds(%s) / odds(%s))", "lnoravg" = "ln(odds(%s) / odds(%s))", "lnoravgwts" = "ln(odds(%s) / odds(%s))", "lift" = "lift", "liftavg" = "liftavg", "expdydx" = "exp(dY/dX)" ) sanity_comparison <- function(comparison) { # wts versions are used internally but not available directly to users valid <- names(comparison_function_dict) valid <- valid[!grepl("wts$", valid)] checkmate::assert( checkmate::check_choice(comparison, choices = valid), checkmate::check_function(comparison)) } sanitize_transform <- function(x) { good <- c("exp", "ln") # issue #1115: sanitize_transform() wraps `transform` into a named list, so the assertion may fail when using `inferences()` if (isTRUE(checkmate::check_list(x, names = "named"))) { checkmate::assert( checkmate::check_choice(x[[1]], choices = good, null.ok = TRUE), checkmate::check_function(x[[1]])) x <- x[[1]] } else { checkmate::assert( checkmate::check_choice(x, choices = good, null.ok = TRUE), checkmate::check_function(x)) } if (is.null(x)) { return(x) } else if (is.function(x)) { out <- list(x) names(out) <- deparse(substitute(x)) } else if (x == "exp") { out <- list("exp" = exp) } else if (x == "ln") { out <- list("ln" = log) } return(out) } marginaleffects/R/plot_slopes.R0000644000176200001440000001133314631452335016302 0ustar liggesusers#' Plot Conditional or Marginal Slopes #' #' @description #' Plot slopes on the y-axis against values of one or more predictors (x-axis, colors/shapes, and facets). #' #' The `by` argument is used to plot marginal slopes, that is, slopes made on the original data, but averaged by subgroups. This is analogous to using the `by` argument in the `slopes()` function. #' #' The `condition` argument is used to plot conditional slopes, that is, slopes computed on a user-specified grid. This is analogous to using the `newdata` argument and `datagrid()` function in a `slopes()` call. All variables whose values are not specified explicitly are treated as usual by `datagrid()`, that is, they are held at their mean or mode (or rounded mean for integers). This includes grouping variables in mixed-effects models, so analysts who fit such models may want to specify the groups of interest using the `condition` argument, or supply model-specific arguments to compute population-level estimates. See details below. #' See the "Plots" vignette and website for tutorials and information on how to customize plots: #' #' * https://marginaleffects.com/vignettes/plot.html #' * https://marginaleffects.com #' #' @param variables Name of the variable whose marginal effect (slope) we want to plot on the y-axis. #' @param condition Conditional slopes #' + Character vector (max length 4): Names of the predictors to display. #' + Named list (max length 4): List names correspond to predictors. List elements can be: #' - Numeric vector #' - Function which returns a numeric vector or a set of unique categorical values #' - Shortcut strings for common reference values: "minmax", "quartile", "threenum" #' + 1: x-axis. 2: color/shape. 3: facet (wrap if no fourth variable, otherwise cols of grid). 4: facet (rows of grid). #' + Numeric variables in positions 2 and 3 are summarized by Tukey's five numbers `?stats::fivenum`. #' @param rug TRUE displays tick marks on the axes to mark the distribution of raw data. #' @param gray FALSE grayscale or color plot #' @param draw `TRUE` returns a `ggplot2` plot. `FALSE` returns a `data.frame` of the underlying data. #' @param newdata When `newdata` is `NULL`, the grid is determined by the `condition` argument. When `newdata` is not `NULL`, the argument behaves in the same way as in the `slopes()` function. #' @inheritParams slopes #' @template model_specific_arguments #' @return A `ggplot2` object #' @export #' @examples #' library(marginaleffects) #' mod <- lm(mpg ~ hp * drat * factor(am), data = mtcars) #' #' plot_slopes(mod, variables = "hp", condition = "drat") #' #' plot_slopes(mod, variables = "hp", condition = c("drat", "am")) #' #' plot_slopes(mod, variables = "hp", condition = list("am", "drat" = 3:5)) #' #' plot_slopes(mod, variables = "am", condition = list("hp", "drat" = range)) #' #' plot_slopes(mod, variables = "am", condition = list("hp", "drat" = "threenum")) #' plot_slopes <- function(model, variables = NULL, condition = NULL, by = NULL, newdata = NULL, type = "response", vcov = NULL, conf_level = 0.95, wts = FALSE, slope = "dydx", rug = FALSE, gray = FALSE, draw = TRUE, ...) { dots <- list(...) if ("effect" %in% names(dots)) { if (is.null(variables)) { variables <- dots[["effect"]] } else { insight::format_error("The `effect` argument has been renamed to `variables`.") } } if (inherits(model, "mira") && is.null(newdata)) { msg <- "Please supply a data frame to the `newdata` argument explicitly." insight::format_error(msg) } # order of the first few paragraphs is important # if `newdata` is a call to `typical` or `counterfactual`, insert `model` # should probably not be nested too deeply in the call stack since we eval.parent() (not sure about this) scall <- rlang::enquo(newdata) newdata <- sanitize_newdata_call(scall, newdata, model) valid <- c("dydx", "eyex", "eydx", "dyex") checkmate::assert_choice(slope, choices = valid) out <- plot_comparisons( model, variables = variables, condition = condition, by = by, newdata = newdata, type = type, vcov = vcov, conf_level = conf_level, wts = wts, draw = draw, rug = rug, gray = gray, comparison = slope, ...) if (inherits(out, "ggplot")) { out <- out + ggplot2::labs(x = condition[1], y = "Slope") } return(out) } marginaleffects/R/package.R0000644000176200001440000000251114631452335015330 0ustar liggesusers# https://stackoverflow.com/questions/9439256/how-can-i-handle-r-cmd-check-no-visible-binding-for-global-variable-notes-when#comment20826625_12429344 # 2012 hadley says "globalVariables is a hideous hack and I will never use it" # 2014 hadley updates his own answer with globalVariables as one of "two solutions" #' @importFrom Rcpp evalCpp #' @useDynLib marginaleffects #' @import data.table utils::globalVariables(c( "marginaleffects_contrast_hi", "marginaleffects_contrast_lo", "..bycols", "..to_keep", "..cols", "..idx_by", "..idx_hi", "..cl", "..idx_lo", ".data", "..idx_or", "..idx", "..idx1", "..idx2", "..nonfocal", "rowidcf", "elast", "..tmp", "..variables_grid", "..w", "marginaleffects_lab", "marginaleffects_ter", "..label_columns", "marginaleffects_internal_label", ".", "tmp_idx", "comparison", "condition_variable", "conf_int", "conf_level", "conf.high", "conf.low", "contrast", "draw", "dydx", "eps", "estimates", "estimate", "formatBicLL", "gn", "group", "logLik", "m", "marginaleffects_function", "marginaleffects_wts_internal", "marginalmean", "model", "N", "p.value", "part", "patterns", "position", "predicted_hi", "predicted_lo", "predicted_or", "predicted", "rowid", "rowidunique", "hi", "lo", "section", "stars_note", "statistic", "statistic1", "std.error", "term", "ticks", "tmp_grp", "comparison_idx", "value", "where", "wts"))marginaleffects/R/sanitize_vcov.R0000644000176200001440000000243714631452335016627 0ustar liggesuserssanitize_vcov <- function(model, vcov) { # TRUE generates a warning in `insight::get_varcov` for some models if (isTRUE(checkmate::check_flag(vcov))) { return(NULL) } # no vcov matrix for bayesian models if (inherits(model, c("brmsfit", "stanreg", "bart"))) { return(NULL) } # strings should be case-insensitive vcov_strings <- c("stata", "robust", "HC", "HC0", "HC1", "HC2", "HC3", "HC4", "HC4m", "HC5", "HAC", "NeweyWest", "kernHAC", "OPG", "satterthwaite", "kenward-roger") if (isTRUE(checkmate::check_choice(hush(tolower(vcov)), choices = tolower(vcov_strings)))) { idx <- match(tolower(vcov), tolower(vcov_strings)) return(vcov_strings[idx]) } checkmate::assert( checkmate::check_null(vcov), checkmate::check_function(vcov), checkmate::check_matrix(vcov), checkmate::check_formula(vcov), checkmate::check_choice(vcov, choices = vcov_strings)) out <- vcov if (isTRUE(checkmate::check_function(out))) { out <- hush(out(model)) } if (isTRUE(checkmate::check_matrix(out))) { if (ncol(out) != nrow(out)) { stop("The `vcov` matrix must be square.", call. = FALSE) } } return(out) }marginaleffects/R/methods_mgcv.R0000644000176200001440000000016614631452335016420 0ustar liggesusers#' @rdname get_coef #' @export get_coef.gam <- function(model, ...) { out <- model$coefficients return(out) } marginaleffects/R/methods_scam.R0000644000176200001440000000221314631452335016402 0ustar liggesusers#' @rdname set_coef #' @export set_coef.scam <- function(model, coefs, ...) { # in basic model classes coefficients are named vector model[["coefficients.t"]][names(coefs)] <- coefs model } #' @rdname get_coef #' @export get_coef.scam <- function(model, ...) { model$coefficients.t } #' @rdname get_vcov #' @export get_vcov.scam <- function(model, vcov = NULL, ...) { if (isTRUE(checkmate::check_matrix(vcov))) { return(vcov) } # email from developer Natalya Pya # "one of the elements of the returned 'scam' object is 'Vp.t' which is an # estimated covariance matrix for the reparametrized parameters, # 'model$coefficients.t'." if (!is.null(vcov) && !is.logical(vcov)) { stop("The `vcov` argument is not supported for models of class `scam`.", .call = FALSE) } V <- model$Vp.t b <- model$coefficients.t if (length(b) != nrow(V)) { stop("The size of the variance-covariance matrix does not match the length of the coefficients vector.", call. = FALSE) } colnames(V) <- row.names(V) <- names(b) return(V) } marginaleffects/R/methods_tidymodels.R0000644000176200001440000000464114631452335017643 0ustar liggesuserssupported_engine <- function(x) { insight::check_if_installed("parsnip") tmp <- parsnip::extract_fit_engine(x) flag <- inherits(try(sanitize_model(tmp), silent = TRUE), "try-error") return(!flag) } #' @include set_coef.R #' @rdname set_coef #' @export set_coef.model_fit <- function(model, coefs, ...) { if (!"fit" %in% names(model)) { return(model) } model$fit <- set_coef(model$fit, coefs, ...) return(model) } #' @include set_coef.R #' @rdname set_coef #' @export set_coef.workflow <- function(model, coefs, ...) { if ("fit" %in% names(model) && "fit" %in% names(model$fit)) { model$fit$fit <- set_coef(model$fit$fit, coefs, ...) } return(model) } #' @include get_predict.R #' @rdname get_predict #' @keywords internal #' @export get_predict.model_fit <- function(model, newdata, type = NULL, ...) { out <- stats::predict(model, new_data = newdata, type = type) if (type == "numeric") { v <- intersect(c(".pred", ".pred_res"), colnames(out))[1] out <- data.frame(rowid = seq_along(out), estimate = out[[v]]) } else if (type == "class") { out <- data.frame(rowid = seq_along(out), estimate = out[[".pred_class"]]) } else if (type == "prob") { colnames(out) <- substr(colnames(out), 7, nchar(colnames(out))) out$rowid <- seq_len(nrow(out)) out <- data.table::melt( out, id.vars = "rowid", variable.name = "group", value.name = "estimate") } return(out) } #' @include get_predict.R #' @rdname get_predict #' @keywords internal #' @export get_predict.workflow <- get_predict.model_fit #' @include get_vcov.R #' @rdname get_vcov #' @keywords internal #' @export get_vcov.model_fit <- function(model, type = NULL, ...) { if (isTRUE(type == "class")) { return(FALSE) } if (isTRUE(supported_engine(model))) { tmp <- parsnip::extract_fit_engine(model) out <- get_vcov(tmp) } else { out <- FALSE } return(out) } #' @include get_vcov.R #' @rdname get_vcov #' @keywords internal #' @export get_vcov.workflow <- get_vcov.model_fit #' @include get_coef.R #' @rdname get_coef #' @keywords internal #' @export get_coef.workflow <- function(model, ...) { if (isTRUE(supported_engine(model))) { tmp <- parsnip::extract_fit_engine(model) out <- get_coef(tmp) } else { out <- NULL } return(out) } marginaleffects/R/utils.R0000644000176200001440000001041314631452335015075 0ustar liggesusersget_unique_index <- function(x, term_only = FALSE) { idx <- c("term", "contrast", grep("^contrast_", colnames(x), value = TRUE)) if (!term_only) { by <- attr(x, "by") if (isTRUE(checkmate::check_data_frame(by))) { idx <- c(idx, colnames(by)) } else { idx <- c(idx, by) } explicit <- attr(x, "newdata_explicit") if (isTRUE(checkmate::check_character(explicit))) { idx <- explicit } } idx <- intersect(unique(idx), colnames(x)) if (length(idx) == 0) { return(NULL) } else if (length(idx) == 1) { return(x[[idx]]) } out <- x[, idx, drop = FALSE] for (i in ncol(out):2) { if (length(unique(out[[i]])) == 1) { out[[i]] <- NULL } } out <- apply(out, 1, paste, collapse = ", ") return(out) } get_marginaleffects_attributes <- function(x, exclude = NULL, include = NULL, include_regex = NULL) { out <- list() attr_names <- names(attributes(x)) attr_names <- setdiff(attr_names, exclude) if (!is.null(include)) attr_names <- intersect(attr_names, include) if (!is.null(include_regex)) attr_names <- attr_names[grepl(include_regex, attr_names)] for (n in attr_names) { out[[n]] <- attr(x, n) } return(out) } set_marginaleffects_attributes <- function(x, attr_cache, prefix = "") { for (n in names(attr_cache)) { attr(x, paste0(prefix, n)) <- attr_cache[[n]] } return(x) } warn_once <- function(msg, id) { msg <- c(msg, "", "This warning appears once per session.") if (isTRUE(getOption(id, default = TRUE))) { insight::format_warning(msg, call. = FALSE) opts <- list(FALSE) names(opts) <- id options(opts) } } # Cross join a list of data tables # Source: https://github.com/Rdatatable/data.table/issues/1717#issuecomment-545758165 cjdt <- function(dtlist) { Reduce(function(DT1, DT2) cbind(DT1, DT2[rep(1:.N, each = nrow(DT1))]), dtlist) } # recurse up. mostly useful for `tinytest` # this is dumb, but it's late and i don't feel like thinking about this evalup <- function(xcall) { out <- myTryCatch(eval(xcall)) if (inherits(out$error, "simpleError")) { msg <- out$error$message out <- NULL } else { msg <- NULL out <- out$value } for (i in 1:10) { if (is.null(out)) { out <- hush(eval(xcall, parent.frame(i))) } } if (is.null(out) && !is.null(msg)) stop(msg) return(out) } merge_by_rowid <- function(x, y) { # return data # very import to avoid sorting, otherwise bayesian draws won't fit predictions # merge only with rowid; not available for hypothesis mergein <- setdiff(colnames(y), colnames(x)) if ("rowid" %in% colnames(x) && "rowid" %in% colnames(y) && length(mergein) > 0) { idx <- c("rowid", mergein) if (!data.table::is.data.table(y)) { data.table::setDT(y) tmp <- y[, ..idx] } else { tmp <- y[, ..idx] } # TODO: this breaks in mclogit. maybe there's a more robust merge # solution for weird grouped data. But it seems fine because # `predictions()` output does include the original predictors. out <- tryCatch( merge(x, tmp, by = "rowid", sort = FALSE), error = function(e) x) } else { out <- x } return(out) } # faster than all(x %in% 0:1) is_binary <- function(x) { isTRUE(checkmate::check_integerish( x, null.ok = TRUE, upper = 1, lower = 0, any.missing = FALSE) ) } sub_named_vector <- function(x, y) { # issue 1005 xlab <- gsub("^`|`$", "", names(x)) ylab <- gsub("^`|`$", "", names(y)) idx <- match(ylab, xlab) if (length(stats::na.omit(idx)) > 0) { x[stats::na.omit(idx)] <- y[!is.na(idx)] } else if (length(y) == length(x)) { return(y) } else { stop("set_coef() substitution error. Please report on Github with a reproducible example: https://github.com/vincentarelbundock/marginaleffects/issues", call. = FALSE) } return(x) } group_to_factor <- function(group, model) { dv <- try(insight::get_response(model), silent = TRUE) if (inherits(dv, "factor")) { group <- factor(group, levels(dv)) } return(group) }marginaleffects/R/methods_tobit1.R0000644000176200001440000000057314631452335016670 0ustar liggesusers#' @rdname get_predict #' @export get_predict.tobit1 <- function(model, newdata = insight::get_data(model), type = "response", ...) { out <- stats::predict(model, what = type, newdata = newdata) out <- data.frame(rowid = seq_len(length(out)), estimate = out) return(out) } marginaleffects/R/methods_survival.R0000644000176200001440000000162414631452335017337 0ustar liggesusers#' @include set_coef.R #' @rdname set_coef #' @export set_coef.survreg <- function(model, coefs, ...) { #Reverse engineering insight::get_get_parameters.survreg(), #which uses summary.survreg() nvar0 <- length(model$coefficients) nvar <- nrow(model$var) if (nvar > nvar0) { model[["coefficients"]][] <- coefs[-nvar0] model[["scale"]][] <- exp(coefs[nvar0]) } else { model$coefficients[] <- coefs } model } #' @rdname get_predict #' @export get_predict.coxph <- function(model, newdata = insight::get_data(model), type = "lp", ...) { out <- stats::predict(model, newdata = newdata, type = type, ...) out <- data.frame(rowid = seq_len(nrow(newdata)), estimate = out) return(out) } marginaleffects/R/sanitize_hypothesis_formula.R0000644000176200001440000000222114631452335021565 0ustar liggesuserssanitize_hypothesis_formula <- function(hypothesis) { insight::check_if_installed("Formula") hypothesis <- Formula::Formula(hypothesis) if (!length(hypothesis)[1] %in% 0:1) { insight::format_error("The left-hand side of the `hypothesis` formula must be of length 0 or 1.") } if (!length(hypothesis)[2] %in% 1:2) { insight::format_error("The right-hand side of the `hypothesis` formula must have 1 or two parts, separated by |") } if (length(hypothesis)[1] == 0) { hypothesis <- stats::update(hypothesis, difference ~ .) } if (length(hypothesis)[2] == 1) { by <- NULL } else { by <- all.vars(stats::formula(hypothesis, lhs = 0, rhs = 2)) } lhs <- all.vars(stats::formula(hypothesis, rhs = 0)) rhs <- all.vars(stats::formula(hypothesis, lhs = 0, rhs = 1)) checkmate::assert_choice(lhs, c("difference", "ratio"), .var.name = "left-hand side of `hypothesis` formula") checkmate::assert_choice(rhs, c("reference", "sequential", "meandev"), .var.name = "Right-hand side of `hypothesis` formula") out <- specify_hypothesis( hypothesis = rhs, comparison = lhs, by = by, internal = TRUE) return(out) } marginaleffects/R/hypotheses.R0000644000176200001440000003516214631452335016140 0ustar liggesusers#' (Non-)Linear Tests for Null Hypotheses, Joint Hypotheses, Equivalence, Non Superiority, and Non Inferiority #' #' @description #' Uncertainty estimates are calculated as first-order approximate standard errors for linear or non-linear functions of a vector of random variables with known or estimated covariance matrix. In that sense, [`hypotheses`] emulates the behavior of the excellent and well-established [car::deltaMethod] and [car::linearHypothesis] functions, but it supports more models; requires fewer dependencies; expands the range of tests to equivalence and superiority/inferiority; and offers convenience features like robust standard errors. #' #' To learn more, read the hypothesis tests vignette, visit the #' package website, or scroll down this page for a full list of vignettes: #' #' * #' * #' #' Warning #1: Tests are conducted directly on the scale defined by the `type` argument. For some models, it can make sense to conduct hypothesis or equivalence tests on the `"link"` scale instead of the `"response"` scale which is often the default. #' #' Warning #2: For hypothesis tests on objects produced by the `marginaleffects` package, it is safer to use the `hypothesis` argument of the original function. Using `hypotheses()` may not work in certain environments, in lists, or when working programmatically with *apply style functions. #' #' Warning #3: The tests assume that the `hypothesis` expression is (approximately) normally distributed, which for non-linear functions of the parameters may not be realistic. More reliable confidence intervals can be obtained using the \code{inferences()} function with `method = "boot"`. #' #' @inheritParams comparisons #' @param model Model object or object generated by the `comparisons()`, `slopes()`, or `predictions()` functions. #' @param joint Joint test of statistical significance. The null hypothesis value can be set using the `hypothesis` argument. #' - FALSE: Hypotheses are not tested jointly. #' - TRUE: All parameters are tested jointly. #' - String: A regular expression to match parameters to be tested jointly. `grep(joint, perl = TRUE)` #' - Character vector of parameter names to be tested. Characters refer to the names of the vector returned by `coef(object)`. #' - Integer vector of indices. Which parameters positions to test jointly. #' @param joint_test A character string specifying the type of test, either "f" or "chisq". The null hypothesis is set by the `hypothesis` argument, with default null equal to 0 for all parameters. #' @param df Degrees of freedom used to compute p values and confidence intervals. A single numeric value between 1 and `Inf`. When using `joint_test="f"`, the `df` argument should be a numeric vector of length 2. #' #' @section Joint hypothesis tests: #' The test statistic for the joint Wald test is calculated as (R * theta_hat - r)' * inv(R * V_hat * R') * (R * theta_hat - r) / Q, #' where theta_hat is the vector of estimated parameters, V_hat is the estimated covariance matrix, R is a Q x P matrix for testing Q hypotheses on P parameters, #' r is a Q x 1 vector for the null hypothesis, and Q is the number of rows in R. If the test is a Chi-squared test, the test statistic is not normalized. #' #' The p-value is then calculated based on either the F-distribution (for F-test) or the Chi-squared distribution (for Chi-squared test). #' For the F-test, the degrees of freedom are Q and (n - P), where n is the sample size and P is the number of parameters. #' For the Chi-squared test, the degrees of freedom are Q. #' #' @template equivalence #' @examples #' library(marginaleffects) #' mod <- lm(mpg ~ hp + wt + factor(cyl), data = mtcars) #' #' hypotheses(mod) #' #' # Test of equality between coefficients #' hypotheses(mod, hypothesis = "hp = wt") #' #' # Non-linear function #' hypotheses(mod, hypothesis = "exp(hp + wt) = 0.1") #' #' # Robust standard errors #' hypotheses(mod, hypothesis = "hp = wt", vcov = "HC3") #' #' # b1, b2, ... shortcuts can be used to identify the position of the #' # parameters of interest in the output of #' hypotheses(mod, hypothesis = "b2 = b3") #' #' # wildcard #' hypotheses(mod, hypothesis = "b* / b2 = 1") #' #' # term names with special characters have to be enclosed in backticks #' hypotheses(mod, hypothesis = "`factor(cyl)6` = `factor(cyl)8`") #' #' mod2 <- lm(mpg ~ hp * drat, data = mtcars) #' hypotheses(mod2, hypothesis = "`hp:drat` = drat") #' #' # predictions(), comparisons(), and slopes() #' mod <- glm(am ~ hp + mpg, data = mtcars, family = binomial) #' cmp <- comparisons(mod, newdata = "mean") #' hypotheses(cmp, hypothesis = "b1 = b2") #' #' mfx <- slopes(mod, newdata = "mean") #' hypotheses(cmp, hypothesis = "b2 = 0.2") #' #' pre <- predictions(mod, newdata = datagrid(hp = 110, mpg = c(30, 35))) #' hypotheses(pre, hypothesis = "b1 = b2") #' #' # The `hypothesis` argument can be used to compute standard errors for fitted values #' mod <- glm(am ~ hp + mpg, data = mtcars, family = binomial) #' #' f <- function(x) predict(x, type = "link", newdata = mtcars) #' p <- hypotheses(mod, hypothesis = f) #' head(p) #' #' f <- function(x) predict(x, type = "response", newdata = mtcars) #' p <- hypotheses(mod, hypothesis = f) #' head(p) #' #' # Complex aggregation #' # Step 1: Collapse predicted probabilities by outcome level, for each individual #' # Step 2: Take the mean of the collapsed probabilities by group and `cyl` #' library(dplyr) #' library(MASS) #' library(dplyr) #' #' dat <- transform(mtcars, gear = factor(gear)) #' mod <- polr(gear ~ factor(cyl) + hp, dat) #' #' aggregation_fun <- function(x) { #' predictions(x, vcov = FALSE) |> #' mutate(group = ifelse(group %in% c("3", "4"), "3 & 4", "5")) |> #' summarize(estimate = sum(estimate), .by = c("rowid", "cyl", "group")) |> #' summarize(estimate = mean(estimate), .by = c("cyl", "group")) |> #' rename(term = cyl) #' } #' #' hypotheses(mod, hypothesis = aggregation_fun) #' #' # Equivalence, non-inferiority, and non-superiority tests #' mod <- lm(mpg ~ hp + factor(gear), data = mtcars) #' p <- predictions(mod, newdata = "median") #' hypotheses(p, equivalence = c(17, 18)) #' #' mfx <- avg_slopes(mod, variables = "hp") #' hypotheses(mfx, equivalence = c(-.1, .1)) #' #' cmp <- avg_comparisons(mod, variables = "gear", hypothesis = "pairwise") #' hypotheses(cmp, equivalence = c(0, 10)) #' #' # joint hypotheses: character vector #' model <- lm(mpg ~ as.factor(cyl) * hp, data = mtcars) #' hypotheses(model, joint = c("as.factor(cyl)6:hp", "as.factor(cyl)8:hp")) #' #' # joint hypotheses: regular expression #' hypotheses(model, joint = "cyl") #' #' # joint hypotheses: integer indices #' hypotheses(model, joint = 2:3) #' #' # joint hypotheses: different null hypotheses #' hypotheses(model, joint = 2:3, hypothesis = 1) #' hypotheses(model, joint = 2:3, hypothesis = 1:2) #' #' # joint hypotheses: marginaleffects object #' cmp <- avg_comparisons(model) #' hypotheses(cmp, joint = "cyl") #' #' @export hypotheses <- function( model, hypothesis = NULL, vcov = NULL, conf_level = 0.95, df = NULL, equivalence = NULL, joint = FALSE, joint_test = "f", numderiv = "fdforward", ...) { if (isTRUE(attr(model, "hypotheses_call"))) { msg <- "The `hypotheses()` function cannot be called twice on the same object." insight::format_error(msg) } dots <- list(...) # deprecation if ("FUN" %in% names(dots)) { msg <- "`FUN` is deprecated. Please supply your function to the `hypothesis` argument instead." if (is.null(hypothesis)) { hypothesis <- dots[["FUN"]] insight::format_warning(msg) } else { insight::format_error(msg) } } call_attr <- c(list( name = "hypotheses", model = model, hypothesis = hypothesis, vcov = vcov, conf_level = conf_level, df = df, equivalence = equivalence, joint = joint, joint_test = joint_test, numderiv = numderiv), dots) if ("modeldata" %in% names(dots)) { call_attr[["modeldata"]] <- dots[["modeldata"]] } call_attr <- do.call("call", call_attr) ## Bootstrap # restore an already sanitized hypothesis if necessary hypothesis <- if(is.null(attr(hypothesis, "label"))){ hypothesis } else{ attr(hypothesis, "label") } # Apply inferences method out <- inferences_dispatch( INF_FUN = hypotheses, model=model, hypothesis = hypothesis, vcov = vcov, conf_level = conf_level, df = df, equivalence = equivalence, joint = joint, joint_test = joint_test, numderiv = numderiv, ...) if (!is.null(out)) { return(out) } ## Done with Bootstrap if (!isFALSE(joint)) { out <- joint_test(object = model, joint_index = joint, joint_test = joint_test, hypothesis = hypothesis, df = df) return(out) } # after joint_test if (is.null(df)) df <- Inf args <- list( conf_level = conf_level, vcov = vcov, df = df, equivalence = equivalence) # keep this NULL in case `hypothesis` was used in the previous call args[["hypothesis"]] <- hypothesis if (length(dots) > 0) { args <- c(args, dots) } xcall <- substitute(model) if (is.symbol(xcall)) { model <- eval(xcall, envir = parent.frame()) } else if (is.call(xcall)) { internal <- c( "predictions", "avg_predictions", "comparisons", "avg_comparisons", "slopes", "avg_slopes", "marginal_means") # mfx object if (as.character(xcall)[[1]] %in% internal) { args[["x"]] <- model out <- do.call(recall, args) if (!is.null(out)) { class(out) <- c("hypotheses", class(out)) return(out) } # non-mfx object } else { model <- eval(xcall, envir = parent.frame()) } } # marginaleffects objects: recall() if (inherits(model, c("predictions", "comparisons", "slopes", "marginalmeans"))) { args[["x"]] <- attr(model, "call") out <- do.call(recall, args) if (!is.null(out)) { class(out) <- c("hypotheses", class(out)) return(out) } } numderiv = sanitize_numderiv(numderiv) # after re-evaluation tmp <- sanitize_hypothesis(hypothesis, ...) hypothesis <- tmp$hypothesis hypothesis_null <- tmp$hypothesis_null vcov_false <- isFALSE(vcov) vcov <- get_vcov(model = model, vcov = vcov) vcov.type <- get_vcov_label(vcov = vcov) FUNouter <- function(model, hypothesis) { if (inherits(model, c("predictions", "slopes", "comparisons"))) { out <- model } else if (isTRUE(checkmate::check_numeric(model))) { out <- data.frame(term = seq_along(out), estimate = out) } else if (inherits(model, "data.frame")) { out <- model if (any(!c("term", "estimate") %in% colnames(out))) { msg <- "`hypothesis` function must return a data.frame with two columns named `term` and `estimate`." insight::format_error(msg) } # unknown model } else if (!is.function(hypothesis)) { out <- insight::get_parameters(model, ...) idx <- intersect(colnames(model), c("term", "group", "estimate")) colnames(out)[1:2] <- c("term", "estimate") # unknown model but user-supplied hypothesis function } else { out <- model } tmp <- get_hypothesis(out, hypothesis = hypothesis) out <- tmp$estimate if (!is.null(attr(tmp, "label"))) { attr(out, "label") <- attr(tmp, "label") } else { attr(out, "label") <- tmp$term } if ("group" %in% colnames(tmp)) { attr(out, "grouplab") <- tmp[["group"]] } return(out) } b <- FUNouter(model = model, hypothesis = hypothesis) # bayesian posterior if (!is.null(attr(b, "posterior_draws"))) { draws <- attr(b, "posterior_draws") J <- NULL se <- rep(NA, length(b)) # standard errors via delta method } else if (!vcov_false && isTRUE(checkmate::check_matrix(vcov))) { args <- list(model = model, vcov = vcov, hypothesis = hypothesis, FUN = FUNouter, numderiv = numderiv) args <- c(args, dots) se <- do.call("get_se_delta", args) J <- attr(se, "jacobian") attr(se, "jacobian") <- NULL draws <- NULL # no standard error } else { J <- draws <- NULL se <- rep(NA, length(b)) } hyplab <- attr(b, "label") if (!is.null(hypothesis)) { if (is.null(hyplab)) { hyplab <- attr(hypothesis, "label") } if (!is.null(hyplab)) { out <- data.frame( term = hyplab, estimate = b, std.error = se) } else { out <- data.frame( term = "custom", estimate = b, std.error = se) } } else { if (!is.null(hyplab) && length(hyplab) == length(b)) { out <- data.frame( term = hyplab, estimate = b, std.error = se) } else { out <- data.frame( term = paste0("b", seq_along(b)), estimate = b, std.error = se) } } # Remove std.error column when not computing st.errors and in bootstrap if(vcov_false) { out$std.error <- NULL } out[["group"]] <- attr(b, "grouplab") out <- get_ci( out, conf_level = conf_level, vcov = vcov, draws = draws, estimate = "estimate", null_hypothesis = hypothesis_null, df = df, model = model, ...) if (!is.null(equivalence)) { out <- equivalence( out, df = df, equivalence = equivalence) } out <- sort_columns(out) class(out) <- c("hypotheses", "deltamethod", class(out)) attr(out, "posterior_draws") <- draws attr(out, "model") <- model attr(out, "model_type") <- class(model)[1] attr(out, "jacobian") <- J attr(out, "call") <- call_attr attr(out, "vcov") <- vcov attr(out, "vcov.type") <- vcov.type attr(out, "conf_level") <- conf_level # Issue #1102: hypotheses() should not be called twice on the same object attr(out, "hypotheses_call") <- TRUE return(out) } marginaleffects/R/complete_levels.R0000644000176200001440000000352714631452335017127 0ustar liggesusers#' Create a data.frame with all factor or character levels #' #' `model.matrix` breaks when `newdata` includes a factor #' variable, but not all levels are present in the data. This is bad for us #' because we often want to get predictions with one (or few) rows, where some #' factor levels are inevitably missing. #' @keywords internal complete_levels <- function(x, character_levels = NULL) { checkmate::assert_data_frame(x) # fixest returned an empty list() if (is.null(character_levels) || length(character_levels) == 0) { return(data.frame()) } # store variables with missing factors or characters vault <- list() for (v in colnames(x)) { if (is.factor(x[[v]])) { if (!all(levels(x[[v]]) %in% x[[v]])) { vault[[v]] <- factor(levels(x[[v]]), levels = levels(x[[v]])) } } else if (is.character(x[[v]])) { if (v %in% names(character_levels)) { vault[[v]] <- character_levels[[v]] } } } # create padding if (length(vault) > 0) { # HACK: Some models use a character variable with many levels (e.g., # mixed-effects groups). This creates a massive padding dataset, and making # predictions can become very expensive. if (isTRUE(sum(sapply(vault, length)) > 100)) return(data.frame()) padding <- utils::head(x, 1) data.table::setDT(padding) for (v in names(vault)) { padding[[v]] <- NULL } fun <- data.table::CJ gr <- do.call("fun", vault) padding <- cjdt(list(padding, gr)) to_keep <- colnames(x) padding[, ..to_keep] setcolorder(padding, to_keep) data.table::setDF(padding) } else { padding <- data.frame() } padding$rowid <- -1 * padding$rowid return(padding) } marginaleffects/R/get_model_matrix_attribute.R0000644000176200001440000000177014631452335021351 0ustar liggesusersget_model_matrix_attribute <- function(model, newdata = NULL) { # supported models (no inheritance) if (!isTRUE(class(model)[1] %in% c("lm", "glm", "rq"))) { return(newdata) } # stats::model.matrix creates all-0 columns with splines::bs() and other functions # this may be too aggressive, but it avoids all functions flag <- any(grepl("\\(", setdiff(names(get_coef(model)), "(Intercept)"))) if (isTRUE(flag)) { return(newdata) } # we don't support offsets, so revert to stats::predict() if (!is.null(model[["offset"]])) { return(newdata) } # subset variables for listwise deletion vars <- unlist(insight::find_predictors(model), use.names = FALSE) vars <- c(vars, unlist(insight::find_response(model), use.names = FALSE)) vars <- intersect(vars, colnames(newdata)) MM <- hush(get_model_matrix(model, newdata = data.frame(newdata)[, vars])) attr(newdata, "marginaleffects_model_matrix") <- MM return(newdata) } marginaleffects/R/ci.R0000644000176200001440000001615214631452335014336 0ustar liggesusersget_ci <- function( x, conf_level, df = NULL, draws = NULL, vcov = TRUE, null_hypothesis = 0, p_adjust = NULL, model = NULL, ...) { checkmate::assert_number(null_hypothesis) if (!is.null(draws)) { out <- get_ci_draws( x, conf_level = conf_level, draws = draws, model = model) return(out) } required <- c("estimate", "std.error") if (!inherits(x, "data.frame") || any(!required %in% colnames(x))) { return(x) } normal <- FALSE if (!"df" %in% colnames(x)) { if (identical(df, Inf)) { normal <- TRUE # 1 or matching length } else if (length(df) %in% c(1, nrow(x))) { x[["df"]] <- df normal <- FALSE # multiple, such as rbind() contrast terms } else if (length(df) < nrow(x) && "rowid" %in% colnames(x)) { rowids <- unique(x$rowid) if (length(rowids) == length(df)) { rowids <- data.table(rowid = rowids, df = df) x <- merge(x, rowids, all.x = TRUE, by = "rowid", sort = FALSE) } else { insight::format_error("The degrees of freedom argument was ignored.") } # mismatch } else { insight::format_error("Satterthwaite and Kenward-Roger corrections are not supported in this command.") } } p_overwrite <- !"p.value" %in% colnames(x) || null_hypothesis != 0 || identical(vcov, "satterthwaite") || identical(vcov, "kenward-roger") z_overwrite <- !"statistic" %in% colnames(x) || null_hypothesis != 0 || p_overwrite ci_overwrite <- !"conf.low" %in% colnames(x) && "std.error" %in% colnames(x) && is.null(p_adjust) if (z_overwrite) { x[["statistic"]] <- (x[["estimate"]] - null_hypothesis) / x[["std.error"]] if (normal) { x[["p.value"]] <- 2 * stats::pnorm(-abs(x$statistic)) } else { x[["p.value"]] <- 2 * stats::pt(-abs(x$statistic), df = x[["df"]]) } } if (ci_overwrite) { alpha <- 1 - conf_level if (normal) { critical <- abs(stats::qnorm(alpha / 2)) } else { critical <- abs(stats::qt(alpha / 2, df = x[["df"]])) } x[["conf.low"]] <- x[["estimate"]] - critical * x[["std.error"]] x[["conf.high"]] <- x[["estimate"]] + critical * x[["std.error"]] } if (!is.null(p_adjust) && "p.value" %in% colnames(x)) { x$p.value <- stats::p.adjust(x$p.value, method = p_adjust) } # s-value if ("p.value" %in% colnames(x)) { x$s.value <- -log2(x$p.value) } return(x) } get_ci_draws <- function(x, conf_level, draws, model = NULL) { checkmate::check_number(conf_level, lower = 1e-10, upper = 1 - 1e-10) critical <- (1 - conf_level) / 2 # faster known case if (inherits(model, "inferences_simulation")) { insight::check_if_installed("collapse", minimum_version = "1.9.0") CIs <- collapse::dapply(draws, MARGIN = 1, FUN = collapse::fquantile, probs = c(critical, 1 - critical)) x$std.error <- collapse::dapply(draws, MARGIN = 1, FUN = collapse::fsd) x$conf.low <- CIs[, 1] x$conf.high <- CIs[, 2] return(x) } else if (identical("eti", getOption("marginaleffects_posterior_interval", default = "eti")) && identical("median", getOption("marginaleffects_posterior_center", default = "median"))) { insight::check_if_installed("collapse", minimum_version = "1.9.0") # Issue #1017 if (nrow(draws) > 0) { CIs <- collapse::dapply(draws, MARGIN = 1, FUN = collapse::fquantile, probs = c(critical, .5, 1 - critical)) x$estimate <- CIs[, 2] x$conf.low <- CIs[, 1] x$conf.high <- CIs[, 3] } return(x) } # faster known case if (identical("eti", getOption("marginaleffects_posterior_interval", default = "eti")) && identical("mean", getOption("marginaleffects_posterior_center", default = "median"))) { insight::check_if_installed("collapse", minimum_version = "1.9.0") Bs <- collapse::dapply(draws, MARGIN = 1, FUN = collapse::fmean) CIs <- collapse::dapply(draws, MARGIN = 1, FUN = collapse::fquantile, probs = c(critical, 1 - critical)) x$estimate <- Bs x$conf.low <- CIs[, 1] x$conf.high <- CIs[, 2] return(x) } # option name change FUN_INTERVAL <- getOption("marginaleffects_posterior_interval") if (is.null(FUN_INTERVAL)) { FUN_INTERVAL <- getOption("marginaleffects_credible_interval", default = "eti") } checkmate::assert_choice(FUN_INTERVAL, choices = c("eti", "hdi")) if (FUN_INTERVAL == "hdi") { FUN_INTERVAL <- get_hdi } else { FUN_INTERVAL <- get_eti } FUN_CENTER <- getOption("marginaleffects_posterior_center", default = stats::median) checkmate::assert( checkmate::check_choice(FUN_CENTER, choices = c("mean", "median")), checkmate::check_function(FUN_CENTER) ) if (identical(FUN_CENTER, "mean")) { FUN_CENTER <- mean } else if (identical(FUN_CENTER, "median")) { FUN_CENTER <- stats::median } CIs <- t(apply(draws, 1, FUN_INTERVAL, credMass = conf_level)) Bs <- apply(draws, 1, FUN_CENTER) # comparison returns a single value if (nrow(x) < nrow(CIs)) { CIs <- unique(CIs) Bs <- unique(Bs) } x[["estimate"]] <- Bs x[["conf.low"]] <- CIs[, "lower"] x[["conf.high"]] <- CIs[, "upper"] return(x) } get_eti <- function(object, credMass = 0.95, ...) { checkmate::assert_numeric(object) checkmate::assert_number(credMass) checkmate::assert_true(credMass > 0) checkmate::assert_true(credMass < 1) critical <- (1 - credMass) / 2 out <- stats::quantile(object, probs = c(critical, 1 - critical)) out <- stats::setNames(out, c("lower", "upper")) return(out) } # this is only used for tests to match emmeans. we use ETI as default for bayesian models. get_hdi <- function(object, credMass = 0.95, ...) { result <- c(NA_real_, NA_real_) if (is.numeric(object)) { attributes(object) <- NULL x <- sort.int(object, method = "quick") # removes NA/NaN, but not Inf n <- length(x) if (n > 0) { # exclude <- ceiling(n * (1 - credMass)) # Not always the same as... exclude <- n - floor(n * credMass) # Number of values to exclude low.poss <- x[1:exclude] # Possible lower limits... upp.poss <- x[(n - exclude + 1):n] # ... and corresponding upper limits best <- which.min(upp.poss - low.poss) # Combination giving the narrowest interval if (length(best)) { result <- c(low.poss[best], upp.poss[best]) } else { tmp <- range(x) if (length(tmp) == 2) { result <- tmp } } } } names(result) <- c("lower", "upper") return(result) } marginaleffects/R/get_group_names.R0000644000176200001440000000062214631452335017114 0ustar liggesusers#' Get levels of the outcome variable in grouped or multivariate models #' #' @inheritParams slopes #' @return A character vector #' @rdname get_group_names #' @keywords internal #' @export get_group_names <- function (model, ...) { UseMethod("get_group_names", model) } #' @rdname get_group_names #' @export get_group_names.default <- function(model, ...) { return("main_marginaleffect") } marginaleffects/R/methods_gamlss.R0000644000176200001440000002400214631452335016745 0ustar liggesusers#' @include get_coef.R #' @rdname get_coef #' @export get_coef.gamlss <- function(model, ...){ dots <- list(...) if (is.null(dots$what)) stop("Argument `what` indicating the parameter of interest is missing.") out <- stats::coef(model, what = dots$what) return(out) } #' @include get_predict.R #' @rdname get_predict #' @export get_predict.gamlss <- function( model, newdata = insight::get_data(model), type = "response", ...) { # Get predictions dots <- list(...) if (is.null(dots$what)) { msg <- sprintf( "Please specifiy a `what` argument with one of these values: %s", paste(model$parameter, collapse = ", ")) stop(msg, call. = FALSE) } # if (!isTRUE(checkmate::check_flag(vcov, null.ok = TRUE))) { # msg <- "The `vcov` argument is not supported for models of this class." # stop(msg, call. = FALSE) # } # predict.gamlss() breaks when `newdata` includes unknown variables origindata <- insight::get_data(model) originvars <- colnames(origindata) data.table::setDF(newdata) index <- which(colnames(newdata) %in% originvars) tmp <- newdata[, index] hush(out <- predict_gamlss(model, newdata = tmp, type = type, data = origindata, ...)) if ("rowid" %in% colnames(newdata)) { out <- data.frame(rowid = newdata$rowid, estimate = out) } else { out <- data.frame(rowid = seq_along(out), estimate = out) } return(out) } #' @include get_vcov.R #' @rdname get_vcov #' @export get_vcov.gamlss <- function(model, ...){ dots <- list(...) if (is.null(dots$what)) { msg <- sprintf( "Please specifiy a `what` argument with one of these values: %s", paste(model$parameter, collapse = ", ")) stop(msg, call. = FALSE) } p <- match(dots$what, model$parameters) vc <- stats::vcov(model, what = dots$what) index <- which(cumsum(rownames(vc) == "(Intercept)") == p) out <- vc[index, index, drop = FALSE] return(out) } #' @include set_coef.R #' @rdname set_coef #' @export set_coef.gamlss <- function(model, coefs, ...){ dots <- list(...) if (is.null(dots$what)) stop("Argument `what` indicating the parameter of interest is missing.") p <- paste0(dots$what, ".coefficients") model[[p]][names(coefs)] <- coefs out <- model return(out) } # Modified predict method from the R-package gamlss # Renamed with underscore to avoid conflict with exported method from the package. predict_gamlss <- function(object, what = c("mu", "sigma", "nu", "tau"), parameter = NULL, newdata = NULL, type = c("link", "response", "terms"), safe = TRUE, terms = NULL, se.fit = FALSE, data = NULL, ...) { concat <- function(..., names = NULL) { tmp <- list(...) if (is.null(names)) { names <- names(tmp) } if (is.null(names)) { names <- sapply(as.list(match.call()), deparse)[-1] } if (any(sapply(tmp, is.matrix) | sapply(tmp, is.data.frame))) { len <- sapply(tmp, function(x) c(dim(x), 1)[1]) len[is.null(len)] <- 1 data <- rbind(...) } else { len <- sapply(tmp, length) data <- unlist(tmp) } namelist <- factor(rep(names, len), levels = names) return(data.frame(data, source = namelist)) } if (is.null(newdata)) { predictor <- gamlss::lpred(object, what = what, type = type, terms = terms, se.fit = se.fit, ...) return(predictor) } if (se.fit) { warning(" se.fit = TRUE is not supported for new data values at the moment \n") } if (!(inherits(newdata, "data.frame"))) { stop("newdata must be a data frame ") } what <- if (!is.null(parameter)) { match.arg(parameter, choices = c( "mu", "sigma", "nu", "tau")) } else { match.arg(what) } type <- match.arg(type) Call <- object$call data <- data1 <- if (is.null(data)) { if (!is.null(Call$data)) { eval(Call$data) } else { stop("define the original data using the option data") } } else { data } data <- data[match(names(newdata), names(data))] data <- concat(data, newdata) parform <- stats::formula(object, what) if (length(parform) == 3) { parform[2] <- NULL } Terms <- terms(parform) offsetVar <- if (!is.null(off.num <- attr(Terms, "offset"))) { eval(attr(Terms, "variables")[[off.num + 1]], data) } m <- stats::model.frame(Terms, data, xlev = object[[paste(what, "xlevels", sep = ".")]]) X <- stats::model.matrix(Terms, data, contrasts = object$contrasts) y <- object[[paste(what, "lp", sep = ".")]] w <- object[[paste(what, "wt", sep = ".")]] onlydata <- data$source == "data" smo.mat <- object[[paste(what, "s", sep = ".")]] if (!is.null(off.num)) { y <- (y - offsetVar[onlydata]) } if (!is.null(smo.mat)) { n.smooths <- dim(smo.mat)[2] y <- (y - smo.mat %*% rep(1, n.smooths)) } # Modified from the original prediction function. if (safe) { refit <- stats::lm.wfit(X[onlydata, , drop = FALSE], y, w) if (abs(sum(stats::resid(refit))) > 0.1 || abs(sum(stats::coef(object, what = what) - stats::coef(refit), na.rm = TRUE)) > 1e-05) { warning(paste("There is a discrepancy between the original and the re-fit", " \n used to achieve 'safe' predictions \n ", sep = "")) } coef <- refit$coef } else { coef <- stats::coef(object, what = what) } nX <- dimnames(X) rownames <- nX[[1]][!onlydata] nrows <- sum(!onlydata) nac <- is.na(coef) assign.coef <- attr(X, "assign") collapse <- type != "terms" Xpred <- X[!onlydata, ] Xpred <- matrix(Xpred, nrow = nrows) if (!collapse) { aa <- attr(X, "assign") ll <- attr(Terms, "term.labels") if (attr(Terms, "intercept") > 0) { ll <- c("(Intercept)", ll) } aaa <- factor(aa, labels = ll) asgn <- split(order(aa), aaa) hasintercept <- attr(Terms, "intercept") > 0 p <- refit$qr$rank p1 <- seq(len = p) piv <- refit$qr$pivot[p1] if (hasintercept) { asgn$"(Intercept)" <- NULL avx <- colMeans(X[onlydata, ]) termsconst <- sum(avx[piv] * coef[piv]) } nterms <- length(asgn) pred <- matrix(ncol = nterms, nrow = nrows) dimnames(pred) <- list(rownames(newdata), names(asgn)) if (hasintercept) { Xpred <- sweep(Xpred, 2, avx) } unpiv <- rep.int(0, NCOL(Xpred)) unpiv[piv] <- p1 for (i in seq(1, nterms, length = nterms)) { iipiv <- asgn[[i]] ii <- unpiv[iipiv] iipiv[ii == 0] <- 0 pred[, i] <- if (any(iipiv > 0)) { Xpred[, iipiv, drop = FALSE] %*% coef[iipiv] } else { 0 } } attr(pred, "constant") <- if (hasintercept) { termsconst } else { 0 } if (!is.null(terms)) { pred <- pred[, terms, drop = FALSE] } } else { pred <- drop(Xpred[, !nac, drop = FALSE] %*% coef[!nac]) if (!is.null(off.num) && collapse) { pred <- pred + offsetVar[!onlydata] } } if (!is.null(smo.mat)) { cat("new prediction", "\n") smooth.labels <- dimnames(smo.mat)[[2]] pred.s <- array(0, c(nrows, n.smooths), list( names(pred), dimnames(smo.mat)[[2]])) smooth.calls <- lapply(m[smooth.labels], attr, "call") data <- subset(m, onlydata, drop = FALSE) attr(data, "class") <- NULL new.m <- subset(m, !onlydata, drop = FALSE) attr(new.m, "class") <- NULL residuals <- if (!is.null(off.num)) { object[[paste(what, "wv", sep = ".")]] - object[[paste(what, "lp", sep = ".")]] + offsetVar[onlydata] } else { object[[paste(what, "wv", sep = ".")]] - object[[paste(what, "lp", sep = ".")]] } for (TT in smooth.labels) { if (is.matrix(m[[TT]])) { nm <- names(attributes(m[[TT]])) attributes(data[[TT]]) <- attributes(m[[TT]])[nm[-c( 1, 2)]] } else { attributes(data[[TT]]) <- attributes(m[[TT]]) } Call <- smooth.calls[[TT]] Call$xeval <- substitute(new.m[[TT]], list(TT = TT)) z <- residuals + smo.mat[, TT] pred.s[, TT] <- eval(Call) } if (type == "terms") { pred[, smooth.labels] <- pred[, smooth.labels] + pred.s[, smooth.labels] } else { pred <- drop(pred + pred.s %*% rep(1, n.smooths)) } } if (type == "response") { if (methods::is(eval(parse(text = object$family[[1]])), "gamlss.family")) { pred <- eval(parse(text = object$family[[1]]))[[paste(what, "linkinv", sep = ".")]](pred) } else { pred <- gamlss.dist::gamlss.family(eval(parse(text = paste(stats::family(object)[1], "(", what, ".link=", eval(parse(text = (paste("object$", what, ".link", sep = "")))), ")", sep = ""))))[[paste(what, "linkinv", sep = ".")]](pred) } } pred } marginaleffects/R/get_contrast_data_character.R0000644000176200001440000000566114631452335021447 0ustar liggesusersget_contrast_data_character <- function(model, newdata, variable, cross, first_cross, modeldata, ...) { # factors store all levels, but characters do not, so we need to extract the # original data from the model. tmp <- modeldata # unsupported by insight (e.g., numpyro) if (is.null(tmp)) { tmp <- newdata } levs <- sort(unique(tmp[[variable$name]])) # string shortcuts flag <- checkmate::check_choice(variable$value, c("reference", "revreference", "pairwise", "revpairwise", "sequential", "revsequential", "all", "minmax")) if (isTRUE(flag)) { levs_idx <- contrast_categories_shortcuts(levs, variable, interaction) # custom data frame or function } else if (isTRUE(checkmate::check_function(variable$value)) || isTRUE(checkmate::check_data_frame(variable$value))) { out <- contrast_categories_custom(variable, newdata) return(out) # vector of two values } else if (isTRUE(checkmate::check_atomic_vector(variable$value, len = 2))) { if (is.character(variable$value)) { tmp <- modeldata[[variable$name]] if (any(!variable$value %in% as.character(tmp))) { msg <- "Some of the values supplied to the `variables` argument were not found in the dataset." insight::format_error(msg) } idx <- match(variable$value, as.character(tmp)) levs_idx <- data.table::data.table(lo = tmp[idx[1]], hi = tmp[idx[[2]]]) } else if (is.numeric(variable$value)) { tmp <- newdata[[variable$name]] levs_idx <- data.table::data.table( lo = as.character(variable$value[1]), hi = as.character(variable$value[2])) } else { levs_idx <- data.table::data.table(lo = variable$value[1], hi = variable$value[2]) } } tmp <- contrast_categories_processing(first_cross, levs_idx, levs, variable, newdata) lo <- tmp[[1]] hi <- tmp[[2]] original <- tmp[[3]] lo[[variable$name]] <- lo[["marginaleffects_contrast_lo"]] hi[[variable$name]] <- hi[["marginaleffects_contrast_hi"]] contrast_label <- hi$marginaleffects_contrast_label contrast_null <- hi$marginaleffects_contrast_hi == hi$marginaleffects_contrast_lo tmp <- !grepl("^marginaleffects_contrast", colnames(lo)) lo <- lo[, tmp, with = FALSE] hi <- hi[, tmp, with = FALSE] out <- list(rowid = original$rowid, lo = lo, hi = hi, original = original, ter = rep(variable$name, nrow(lo)), # lo can be different dimension than newdata lab = contrast_label, contrast_null = contrast_null) return(out) } marginaleffects/R/sanitize_conf_level.R0000644000176200001440000000077114631452335017765 0ustar liggesuserssanitize_conf_level <- function(conf_level, ...) { # periods in arg name are bad style because of s3, but we want to accept both because `broom` uses `conf_level` dots <- list(...) if ("conf.level" %in% names(dots)) { conf_level <- dots[["conf.level"]] } checkmate::assert( checkmate::check_numeric(conf_level, len = 1), checkmate::check_true(conf_level > 0), checkmate::check_true(conf_level < 1), combine = "and") return(conf_level) } marginaleffects/R/get_predict.R0000644000176200001440000000737614631452335016244 0ustar liggesusers#' Get predicted values from a model object (internal function) #' #' @return A data.frame of predicted values with a number of rows equal to the #' number of rows in `newdata` and columns "rowid" and "estimate". A "group" #' column is added for multivariate models or models with categorical outcomes. #' @rdname get_predict #' @inheritParams slopes #' @keywords internal #' @export get_predict <- function(model, newdata, type, ...) { UseMethod("get_predict", model) } #' @rdname get_predict #' @export get_predict.default <- function(model, newdata = insight::get_data(model), type = "response", ...) { dots <- list(...) if (is.null(type)) { type <- sanitize_type(model = model, type = type) } # some predict methods raise warnings on unused arguments unused <- c("normalize_dydx", "eps", "numDeriv_method", "internal_call", "draw", "modeldata", "transform_pre", "transform_post", "flag") dots <- dots[setdiff(names(dots), unused)] # first argument in the predict methods is not always named "x" or "model" dots[["newdata"]] <- newdata dots[["type"]] <- type args <- c(list(model), dots) # `pred` is a secret argument called by `predict.lm` to turn a numeric vector into a data frame with correct `rowid` if ("pred" %in% names(dots)) { pred <- dots[["pred"]] } else { fun <- stats::predict pred <- suppressWarnings(do.call(fun, args)) } # 1-d array to vector (e.g., {mgcv}) if (is.array(pred) && length(dim(pred)) == 1) { pred <- as.vector(pred) } # 1-d array to vector (e.g., Gam from {gam}) if (is.array(pred) && length(dim(pred)) == 3 && dim(pred)[1] == 1 && dim(pred)[2] == 1 && dim(pred)[3] > 1) { pred <- as.vector(pred) } # phylolm if (isTRUE(checkmate::check_matrix(pred, ncols = 1))) { pred <- drop(pred) } # atomic vector if (isTRUE(checkmate::check_atomic_vector(pred))) { # strip weird attributes added by some methods (e.g., predict.svyglm) if (length(pred) == nrow(newdata)) { # as.numeric is slow with large objects and we can't use is.numeric # to run it conditionally because objects of class "svystat" are # already numeric class(pred) <- "numeric" if ("rowid" %in% colnames(newdata)) { out <- list( rowid = newdata$rowid, estimate = pred) } else { out <- list(rowid = seq_len(length(pred)), estimate = pred) } } # matrix with outcome levels as columns } else if (is.matrix(pred)) { if (is.null(colnames(pred))) { colnames(pred) <- seq_len(ncol(pred)) } # internal calls always includes "rowid" as a column in `newdata` if ("rowid" %in% colnames(newdata)) { out <- list( rowid = rep(newdata[["rowid"]], times = ncol(pred)), group = rep(colnames(pred), each = nrow(pred)), estimate = c(pred)) } else { out <- list( rowid = rep(seq_len(nrow(pred)), times = ncol(pred)), group = rep(colnames(pred), each = nrow(pred)), estimate = c(pred)) } out$group <- group_to_factor(out$group, model) } else { stop(sprintf("Unable to extract predictions of type %s from a model of class %s. Please report this problem, along with reproducible code and data on Github: https://github.com/vincentarelbundock/marginaleffects/issues", type, class(model)[1]), call. = FALSE) } data.table::setDF(out) return(out) } marginaleffects/R/bootstrap_simulation.R0000644000176200001440000000205714631452335020223 0ustar liggesusersbootstrap_simulation <- function(model, INF_FUN, vcov, ...) { insight::check_if_installed("MASS") dots <- list(...) B <- get_coef(model) V <- get_vcov(model, vcov = vcov) R <- attr(model, "inferences_R") coefmat <- MASS::mvrnorm(R, mu = B, Sigma = V) # avoid recursion args <- dots args[["vcov"]] <- FALSE attr(model, "inferences_method") <- NULL delta <- do.call(INF_FUN, c(list(model), args)) inner_fun <- function(i = NULL) { args <- dots mod_tmp <- set_coef(model, coefmat[i, ]) attr(mod_tmp, "inferences_method") <- NULL args[["model"]] <- mod_tmp args[["vcov"]] <- FALSE do.call(INF_FUN, args)$estimate } draws <- lapply(seq_len(nrow(coefmat)), inner_fun) draws <- do.call("cbind", draws) out <- get_ci(delta, draws = draws, conf_level = args$conf_level) # do not use simulation mean as point estimate # https://doi.org/10.1017/psrm.2023.8 out$estimate <- delta$estimate attr(out, "posterior_draws") <- draws return(out) } marginaleffects/R/get_contrasts.R0000644000176200001440000004413214631452335016621 0ustar liggesusersget_contrasts <- function(model, newdata, type, variables, original, lo, hi, wts = FALSE, marginalmeans, by = NULL, hypothesis = NULL, cross = FALSE, verbose = TRUE, deltamethod = FALSE, ...) { settings_init() # some predict() methods need data frames and will convert data.tables # internally, which can be very expensive if done many times. we do it once # here. data.table::setDF(lo) data.table::setDF(hi) data.table::setDF(original) # brms models need to be combined to use a single seed when sample_new_levels="gaussian" if (inherits(model, c("brmsfit", "bart"))) { if (!"rowid" %in% colnames(lo)) { lo$rowid <- hi$rowid <- seq_len(nrow(lo)) } both <- rbindlist(list(lo, hi)) pred_both <- myTryCatch(get_predict( model, type = type, newdata = both, ...)) # informative error in case of allow.new.levels level breakage if (inherits(pred_both[["error"]], "simpleError")) { insight::format_error(pred_both[["error"]][["message"]]) } else { pred_both <- pred_both[["value"]] } data.table::setDT(pred_both) pred_both[, "lo" := seq_len(.N) <= .N / 2, by = "group"] pred_lo <- pred_both[pred_both$lo, .(rowid, group, estimate), drop = FALSE] pred_hi <- pred_both[!pred_both$lo, .(rowid, group, estimate), drop = FALSE] data.table::setDF(pred_lo) data.table::setDF(pred_hi) draws <- attr(pred_both, "posterior_draws") draws_lo <- draws[pred_both$lo, , drop = FALSE] draws_hi <- draws[!pred_both$lo, , drop = FALSE] attr(pred_lo, "posterior_draws") <- draws_lo attr(pred_hi, "posterior_draws") <- draws_hi } else { pred_lo <- myTryCatch(get_predict( model, type = type, newdata = lo, ...)) # tidymodels if (inherits(pred_lo$error, "rlang_error") && isTRUE(grepl("the object should be", pred_lo$error$message))) { insight::format_error(pred_lo$error$message) } else { pred_lo <- pred_lo[["value"]] } pred_hi <- myTryCatch(get_predict( model, type = type, newdata = hi, ...)) # otherwise we keep the full error object instead of extracting the value if (inherits(pred_hi$value, "data.frame")) { pred_hi <- pred_hi$value } else { pred_hi <- pred_hi$error } } # predict() takes up 2/3 of the wall time. This call is only useful when we # compute elasticities, or for the main estimate, not for standard errors, # so we probably save 1/3 of that 2/3. elasticities <- c( # "dydx", # useless and expensive "eyex", "eydx", "dyex", # "dydxavg", # useless and expensive "eyexavg", "eydxavg", "dyexavg") fun <- function(x) { out <- checkmate::check_choice(x$comparison, choices = elasticities) isTRUE(out) } tmp <- Filter(fun, variables) if (!isTRUE(deltamethod) || length(tmp) > 0) { pred_or <- myTryCatch(get_predict( model, type = type, newdata = original, ...))[["value"]] } else { pred_or <- NULL } # lots of indexing later requires a data.table data.table::setDT(original) if (!inherits(pred_hi, "data.frame") || !inherits(pred_lo, "data.frame") || !inherits(pred_or, c("data.frame", "NULL")) || all(is.na(pred_lo$estimate))) { msg <- "Unable to compute predicted values with this model. This error can arise when `insight::get_data()` is unable to extract the dataset from the model object, or when the data frame was modified since fitting the model. You can try to supply a different dataset to the `newdata` argument." if (inherits(pred_hi, c("try-error", "error"))) { msg <-c(msg, "", "In addition, this error message was raised:", "", as.character(pred_hi)) } msg <- c(msg, "", "Bug Tracker: https://github.com/vincentarelbundock/marginaleffects/issues") insight::format_error(msg) } # output data.frame out <- pred_lo data.table::setDT(out) # univariate outcome: # original is the "composite" data that we constructed by binding terms and # compute predictions. It includes a term column, which we need to # replicate for each group. out[, "marginaleffects_wts_internal" := NA_real_] # default (probably almost always overwritten) mult <- nrow(out) / nrow(original) regex <- "^term$|rowid_dedup|^group$|^contrast|^marginaleffects_wts_internal$" if (isTRUE(mult == 1)) { for (v in grep(regex, colnames(original), value = TRUE)) { out[, (v) := original[[v]]] } # group or multivariate outcomes } else if (isTRUE(mult > 1)) { for (v in grep(regex, colnames(original), value = TRUE)) { out[, (v) := rep(original[[v]], times = mult)] } # cross-contrasts or weird cases } else { out <- merge(out, newdata, by = "rowid", all.x = TRUE, sort = FALSE) if (isTRUE(nrow(out) == nrow(lo))) { tmp <- data.table(lo)[, .SD, .SDcols = patterns("^contrast|marginaleffects_wts_internal")] out <- cbind(out, tmp) idx <- c("rowid", grep("^contrast", colnames(out), value = TRUE), colnames(out)) idx <- unique(idx) out <- out[, ..idx] } } if (!"term" %in% colnames(out)) { out[, "term" := "cross"] } # by if (isTRUE(checkmate::check_data_frame(by))) { bycols <- "by" data.table::setDT(by) tmp <- setdiff(intersect(colnames(out), colnames(by)), "by") if (length(tmp) == 0) { if (all(colnames(by) %in% c("by", colnames(newdata)))) { nd <- c("rowid", setdiff(colnames(by), "by")) nd <- newdata[, nd, drop = FALSE] out <- merge(out, nd, by = "rowid", sort = FALSE) tmp <- setdiff(intersect(colnames(out), colnames(by)), "by") } else { insight::format_error("The column in `by` must be present in `newdata`.") } } # harmonize column types for (v in colnames(by)) { if (isTRUE(is.character(out[[v]])) && isTRUE(is.numeric(by[[v]]))) { by[[v]] <- as.character(by[[v]]) } else if (isTRUE(is.numeric(out[[v]])) && isTRUE(is.character(by[[v]]))) { by[[v]] <- as.numeric(by[[v]]) } } out[by, by := by, on = tmp] by <- "by" } else if (isTRUE(by)) { regex <- "^term$|^contrast_?|^group$" by <- grep(regex, colnames(out), value = TRUE) by <- unique(by) } else if (isTRUE(checkmate::check_character(by))) { regex <- "^term$|^contrast_?|^group$" by <- c(by, grep(regex, colnames(out), value = TRUE)) by <- unique(by) } # comparison function could be different for different terms # sanitize_variables() ensures all functions are identical when there are cross fun_list <- sapply(names(variables), function(x) variables[[x]][["function"]]) fun_list[["cross"]] <- fun_list[[1]] # elasticity requires the original (properly aligned) predictor values # this will discard factor variables which are duplicated, so in principle # it should be the "correct" size # also need `x` when `x` is in the signature of the `comparison` custom function FUN <- function(z) { (is.character(z$comparison) && z$comparison %in% elasticities) || (is.function(z$comparison) && "x" %in% names(formals(z$comparison))) } elasticities <- Filter(FUN, variables) elasticities <- lapply(elasticities, function(x) x$name) if (length(elasticities) > 0) { # assigning a subset of "original" to "idx1" takes time and memory # better to do this here for most columns and add the "v" column only # in the loop if (!is.null(original)) { idx1 <- c("rowid", "rowidcf", "term", "group", grep("^contrast", colnames(original), value = TRUE)) idx1 <- intersect(idx1, colnames(original)) idx1 <- original[, ..idx1] } for (v in names(elasticities)) { idx2 <- unique(c("rowid", "term", "group", by, grep("^contrast", colnames(out), value = TRUE))) idx2 <- intersect(idx2, colnames(out)) # discard other terms to get right length vector idx2 <- out[term == v, ..idx2] # original is NULL when cross=TRUE if (!is.null(original)) { # if not first iteration, need to remove previous "v" and "elast" if (v %in% colnames(idx1)) { idx1[, (v) := NULL] } if ("elast" %in% colnames(idx1)) { idx1[, elast := NULL] } idx1[, (v) := original[[v]]] setnames(idx1, old = v, new = "elast") on_cols <- intersect(colnames(idx1), colnames(idx2)) idx2 <- unique(merge(idx2, idx1, by = on_cols, sort = FALSE)[, elast := elast]) } elasticities[[v]] <- idx2$elast } } draws <- attr(pred_lo, "posterior_draws") # frequentist if (is.null(draws)) { draws_lo <- draws_hi <- draws_or <- NULL # bayes } else { draws_lo <- attr(pred_lo, "posterior_draws") draws_hi <- attr(pred_hi, "posterior_draws") draws_or <- attr(pred_or, "posterior_draws") } data.table::setDT(pred_hi) out[, predicted_lo := pred_lo[["estimate"]]] out[, predicted_hi := pred_hi[["estimate"]]] if (!is.null(pred_or)) { data.table::setDT(pred_or) out[, predicted := pred_or[["estimate"]]] } else { out[, predicted := NA_real_] } idx <- grep("^contrast|^group$|^term$|^type$|^comparison_idx$", colnames(out), value = TRUE) # when `by` is a character vector, we sometimes modify the comparison # function on the fly to use the `avg` version. this is important and # convenient because some of the statistics are non-collapsible, so we can't # average them at the very end. when `by` is a data frame, we do this only # at the very end. # TODO: What is the UI for this? Doesn't make sense to have different functions. if (isTRUE(checkmate::check_character(by))) { tmp <- intersect(colnames(newdata), c(by, colnames(out))) if (length(tmp) > 1) { tmp <- subset(newdata, select = tmp) out <- merge(out, tmp, all.x = TRUE, sort = FALSE) idx <- unique(c(idx, by)) } } # we feed these columns to safefun(), even if they are useless for categoricals if (!"marginaleffects_wts_internal" %in% colnames(out)) out[, "marginaleffects_wts_internal" := NA] if (isTRUE(marginalmeans)) { out <- out[, .( predicted_lo = mean(predicted_lo), predicted_hi = mean(predicted_hi), predicted = mean(predicted), marginaleffects_wts_internal = mean(marginaleffects_wts_internal)), keyby = idx] } # safe version of comparison # unknown arguments # singleton vs vector # different terms use different functions safefun <- function(hi, lo, y, n, term, cross, wts, tmp_idx, newdata) { tn <- term[1] eps <- variables[[tn]]$eps # when cross=TRUE, sanitize_comparison enforces a single function if (isTRUE(cross)) { fun <- fun_list[[1]] } else { fun <- fun_list[[tn]] } args <- list( "hi" = hi, "lo" = lo, "y" = y, "eps" = eps, "w" = wts, "newdata" = newdata) # sometimes x is exactly the same length, but not always args[["x"]] <- elasticities[[tn]][tmp_idx] args <- args[names(args) %in% names(formals(fun))] con <- try(do.call("fun", args), silent = TRUE) if (!isTRUE(checkmate::check_numeric(con, len = n)) && !isTRUE(checkmate::check_numeric(con, len = 1))) { msg <- sprintf("The function supplied to the `comparison` argument must accept two numeric vectors of predicted probabilities of length %s, and return a single numeric value or a numeric vector of length %s, with no missing value.", n, n) #nolint insight::format_error(msg) } if (length(con) == 1) { con <- c(con, rep(NA_real_, length(hi) - 1)) settings_set("marginaleffects_safefun_return1", TRUE) } return(con) } # need a temp index for group-by operations when elasticities is a vector of length equal to full rows of `out` tmp <- grep("^term$|^contrast|^group$", colnames(out), value = TRUE) if (length(tmp) > 0) { out[, tmp_idx := 1:.N, by = tmp] } else { out[, tmp_idx := 1:.N] } # bayesian if (!is.null(draws)) { # drop missing otherwise get_averages() fails when trying to take a # simple mean idx_na <- !is.na(out$predicted_lo) out <- stats::na.omit(out, cols = "predicted_lo") # TODO: performance is probably terrrrrible here, but splitting is # tricky because grouping rows are not always contiguous, and the order # of rows is **extremely** important because draws don't have the # indices that would allow us to align them back with `out` draws <- draws[idx_na, , drop = FALSE] if (isTRUE(checkmate::check_character(by, min.len = 1))) { by_idx <- subset(out, select = intersect(by, colnames(out))) by_idx <- do.call(paste, c(by_idx, sep = "|")) } else { by_idx <- out$term } # loop over columns (draws) and term names because different terms could use different functions for (tn in unique(by_idx)) { for (i in seq_len(ncol(draws))) { idx <- by_idx == tn draws[idx, i] <- safefun( hi = draws_hi[idx, i], lo = draws_lo[idx, i], y = draws_or[idx, i], n = sum(idx), term = out$term[idx], cross = cross, wts = out$marginaleffects_wts_internal[idx], tmp_idx = out$tmp_idx[idx], newdata = newdata) } } # function returns unique value idx <- !is.na(draws[, 1]) draws <- draws[idx, , drop = FALSE] # if comparison returns a single value, then we padded with NA. That # also means we don't want `rowid` otherwise we will merge and have # useless duplicates. if (any(!idx)) { if (settings_equal("marginaleffects_safefun_return1", TRUE)) { out[, "rowid" := NULL] } out <- out[idx, , drop = FALSE] } FUN_CENTER <- getOption("marginaleffects_posterior_center", default = stats::median) out[, "estimate" := apply(draws, 1, FUN_CENTER)] # frequentist } else { out <- stats::na.omit(out, cols = "predicted_lo") # We want to write the "estimate" column in-place because it safer # than group-merge; there were several bugs related to this in the past. # safefun() returns 1 value and NAs when the function retunrs a # singleton. idx <- intersect(idx, colnames(out)) out[, "estimate" := safefun( hi = predicted_hi, lo = predicted_lo, y = predicted, n = .N, term = term, cross = cross, wts = marginaleffects_wts_internal, tmp_idx = tmp_idx, newdata = newdata), keyby = idx] out[, tmp_idx := NULL] # if comparison returns a single value, then we padded with NA. That # also means we don't want `rowid` otherwise we will merge and have # useless duplicates. if (anyNA(out$estimate)) { if (settings_equal("marginaleffects_safefun_return1", TRUE)) { out[, "rowid" := NULL] } } out <- stats::na.omit(out, cols = "estimate") } # clean if ("rowid_dedup" %in% colnames(out)) { out[, "rowid_dedup" := NULL] } # averaging by groups # sometimes this work is already done # if `by` is a column name, then we have merged-in a data frame earlier auto_mean_fun_sub <- any(grepl("^mean\\(", unique(out$contrast))) if (nrow(out) > 1) { if (!auto_mean_fun_sub && !(is.null(by) || isFALSE(by)) && any(grepl("^contrast[_]?", colnames(out)))) { out <- get_by( out, draws = draws, newdata = newdata, by = by, verbose = verbose) draws <- attr(out, "posterior_draws") } else { bycols <- c(by, "group", "term", "^contrast[_]?") bycols <- paste(bycols, collapse = "|") bycols <- grep(bycols, colnames(out), value = TRUE) } } # issue #531: uncertainty estimates from get_predict() sometimes get retained, but they are not overwritten later by get_ci() # drop by reference for speed bad <- intersect( colnames(out), c("conf.low", "conf.high", "std.error", "statistic", "p.value")) if (length(bad) > 0) { out[, (bad) := NULL] } # before get_hypothesis attr(out, "posterior_draws") <- draws # hypothesis tests using the delta method out <- get_hypothesis(out, hypothesis, by = by, newdata = original, draws = draws) # reset settings settings_rm("marginaleffects_safefun_return1") # output attr(out, "original") <- original return(out) } marginaleffects/R/get_jacobian.R0000644000176200001440000000760614631452335016354 0ustar liggesusersget_jacobian <- function(func, x, numderiv) { numDeriv_options <- getOption("marginaleffects_numDeriv", default = NULL) if (is.null(numDeriv_options)) { method <- numderiv[[1]] numderiv[[1]] <- NULL numderiv[["func"]] <- func numderiv[["x"]] <- x if (identical(method, "richardson")) { df <- do.call(get_jacobian_richardson, numderiv) } else if (identical(method, "fdforward")) { df <- do.call(get_jacobian_fdforward, numderiv) } else if (identical(method, "fdcenter")) { df <- do.call(get_jacobian_fdcenter, numderiv) } } else { insight::check_if_installed("numDeriv") numDeriv_options[["func"]] <- func numDeriv_options[["x"]] <- x ndFUN <- get("jacobian", asNamespace("numDeriv")) df <- do.call(ndFUN, numDeriv_options) } return(df) } get_jacobian_fdforward <- function(func, x, eps = NULL) { # old version. probably not optimal. Keep for posterity. # h <- max(1e-8, 1e-4 * min(abs(x), na.rm = TRUE)) baseline <- func(x) inner_loop <- function(i, ...) { if (is.null(eps)) { h <- max(abs(x[i]) * sqrt(.Machine$double.eps), 1e-10) } else { h <- eps } dx <- x dx[i] <- dx[i] + h out <- (func(dx) - baseline) / h return(out) } if (isTRUE(getOption("marginaleffects_parallel", default = FALSE))) { insight::check_if_installed("future.apply") df <- future.apply::future_lapply(seq_along(x), inner_loop, future.seed = TRUE) df <- do.call("cbind", df) } else { df <- matrix(NA_real_, length(baseline), length(x)) for (i in seq_along(x)) { df[, i] <- inner_loop(i) } } return(df) } get_jacobian_fdcenter <- function(func, x, eps = NULL) { baseline <- func(x) inner_loop <- function(i, ...) { if (is.null(eps)) { h <- max(abs(x[i]) * sqrt(.Machine$double.eps), 1e-10) } else { h <- eps } dx_hi <- dx_lo <- x dx_hi[i] <- dx_hi[i] + h / 2 dx_lo[i] <- dx_lo[i] - h / 2 out <- (func(dx_hi) - func(dx_lo)) / h } if (isTRUE(getOption("marginaleffects_parallel", default = FALSE))) { insight::check_if_installed("future.apply") df <- future.apply::future_lapply(seq_along(x), inner_loop, future.seed = TRUE) df <- do.call("cbind", df) } else { df <- matrix(NA_real_, length(baseline), length(x)) for (i in seq_along(x)) { df[, i] <- inner_loop(i) } } return(df) } # Code adapted from the `numDeriv` package by Paul Gilbert and Ravi Varadhan # GPL-3: https://cran.r-project.org/package=numDeriv get_jacobian_richardson <- function( func, x, eps = 1e-4, d = 1e-4, zero_tol = sqrt(.Machine$double.eps / 7e-7), side = NULL, r = 4, v = 2, ...) { n <- length(x) f <- func(x, ...) a <- array(NA, c(length(f), r, n)) h <- abs(d * x) + eps * (abs(x) < zero_tol) pna <- (side == 1) & !is.na(side) # double these on plus side mna <- (side == -1) & !is.na(side) # double these on minus side for (k in 1:r) { # successively reduce h ph <- mh <- h ph[pna] <- 2 * ph[pna] ph[mna] <- 0 mh[mna] <- 2 * mh[mna] mh[pna] <- 0 for (i in 1:n) { a[, k, i] <- (func(x + ph * (i == seq(n)), ...) - func(x - mh * (i == seq(n)), ...)) / (2 * h[i]) # if((k != 1)) a[,(abs(a[,(k-1),i]) < 1e-20)] <- 0 #some func are unstable near zero } h <- h / v # Reduced h by 1/v. } for (m in 1:(r - 1)) { a <- (a[, 2:(r + 1 - m), , drop = FALSE] * (4^m) - a[, 1:(r - m), , drop = FALSE]) / (4^m - 1) } # drop second dim of a, which is now 1 (but not other dim's even if they are 1 return(array(a, dim(a)[c(1, 3)])) } marginaleffects/R/sanitize_variables.R0000644000176200001440000004243314631452335017622 0ustar liggesusers# input: character vector or named list # output: named list of lists where each element represents a variable with: name, value, function, label sanitize_variables <- function(variables, model, newdata, # need for NumPyro where `find_variables()`` does not work modeldata, comparison = NULL, by = NULL, cross = FALSE, calling_function = "comparisons", eps = NULL) { checkmate::assert( checkmate::check_null(variables), checkmate::check_character(variables, min.len = 1, names = "unnamed"), checkmate::check_list(variables, min.len = 1, names = "unique"), combine = "or") # extensions with no `get_data()` if (is.null(modeldata) || nrow(modeldata) == 0) { modeldata <- set_variable_class(newdata, model) no_modeldata <- TRUE } else { no_modeldata <- FALSE } # variables is NULL: get all variable names from the model if (is.null(variables)) { # mhurdle names the variables weirdly if (inherits(model, "mhurdle")) { predictors <- insight::find_predictors(model, flatten = TRUE) predictors <- list(conditional = predictors) } else { predictors <- insight::find_variables(model) } # unsupported models like pytorch if (length(predictors) == 0 || (length(predictors) == 1 && names(predictors) == "response")) { dv <- hush(unlist(insight::find_response(model, combine = FALSE), use.names = FALSE)) predictors <- setdiff(hush(colnames(newdata)), c(dv, "rowid")) } else { known <- c("fixed", "conditional", "zero_inflated", "scale", "nonlinear") if (any(known %in% names(predictors))) { predictors <- predictors[known] # sometimes triggered by multivariate brms models where we get nested # list: predictors$gear$hp } else { predictors <- unlist(predictors, recursive = TRUE, use.names = FALSE) predictors <- unique(predictors) } # flatten predictors <- unique(unlist(predictors, recursive = TRUE, use.names = FALSE)) } } else { predictors <- variables } # character -> list if (isTRUE(checkmate::check_character(predictors))) { predictors <- stats::setNames(rep(list(NULL), length(predictors)), predictors) } # reserved keywords # Issue #697: we used to allow "group", as long as it wasn't in # `variables`, but this created problems with automatic `by=TRUE`. Perhaps # I could loosen this, but there are many interactions, and the lazy way is # just to forbid entirely. reserved <- c( "rowid", "group", "term", "contrast", "estimate", "std.error", "statistic", "conf.low", "conf.high", "p.value", "p.value.nonsup", "p.value.noninf", "by") # if no modeldata is available, we use `newdata`, but that often has a # `rowid` column. This used to break the extensions.Rmd vignette. if (no_modeldata) { reserved <- setdiff(reserved, "rowid") } bad <- unique(intersect(c(names(predictors), colnames(modeldata)), reserved)) if (length(bad) > 0) { msg <- c( "These variable names are forbidden to avoid conflicts with the outputs of `marginaleffects`:", sprintf("%s", paste(sprintf('"%s"', bad), collapse = ", ")), "Please rename your variables before fitting the model.") insight::format_error(msg) } # when comparisons() only inludes one focal predictor, we don't need to specify it in `newdata` # when `variables` is numeric, we still need to include it, because in # non-linear model the contrast depend on the starting value of the focal # variable. found <- colnames(newdata) if (calling_function == "comparisons") { v <- NULL if (isTRUE(checkmate::check_string(variables))) { v <- variables } else if (isTRUE(checkmate::check_list(variables, len = 1, names = "named"))) { v <- names(variables)[1] } flag <- get_variable_class(modeldata, variable = v, compare = "categorical") if (!is.null(v) && isTRUE(flag)) { found <- c(found, v) } } # matrix predictors mc <- attr(newdata, "newdata_matrix_columns") if (length(mc) > 0 && any(names(predictors) %in% mc)) { predictors <- predictors[!names(predictors) %in% mc] insight::format_warning("Matrix columns are not supported. Use the `variables` argument to specify valid predictors, or use a function like `drop()` to convert your matrix columns into vectors.") } # missing variables miss <- setdiff(names(predictors), found) predictors <- predictors[!names(predictors) %in% miss] if (length(miss) > 0) { msg <- sprintf( "These variables were not found: %s. Try specifying the `newdata` argument explicitly and make sure the missing variable is included.", paste(miss, collapse = ", ")) insight::format_warning(msg) } # sometimes `insight` returns interaction component as if it were a constituent variable idx <- !grepl(":", names(predictors)) predictors <- predictors[idx] # anything left? if (length(predictors) == 0) { msg <- "There is no valid predictor variable. Please change the `variables` argument or supply a new data frame to the `newdata` argument." insight::format_error(msg) } # functions to values # only for predictions; get_contrast_data_numeric handles this for comparisons() # do this before NULL-to-defaults so we can fill it in with default in case of failure if (calling_function == "predictions") { for (v in names(predictors)) { if (is.function(predictors[[v]])) { tmp <- hush(predictors[[v]](modeldata[[v]])) if (is.null(tmp)) { msg <- sprintf("The `%s` function produced invalid output when applied to the dataset used to fit the model.", v) insight::format_warning(msg) } predictors[[v]] <- hush(predictors[[v]](modeldata[[v]])) } } } # NULL to defaults for (v in names(predictors)) { if (is.null(predictors[[v]])) { if (get_variable_class(modeldata, v, "binary")) { predictors[[v]] <- 0:1 } else if (get_variable_class(modeldata, v, "numeric")) { if (calling_function == "comparisons") { predictors[[v]] <- 1 } else if (calling_function == "predictions") { v_unique <- unique(modeldata[[v]]) if (length(v_unique) < 6) { predictors[[v]] <- v_unique } else { predictors[[v]] <- stats::fivenum(modeldata[[v]]) } } } else { if (calling_function == "comparisons") { predictors[[v]] <- "reference" } else if (calling_function == "predictions") { # TODO: warning when this is too large. Here or elsewhere? predictors[[v]] <- unique(modeldata[[v]]) } } } } # shortcuts and validity for (v in names(predictors)) { if (isTRUE(checkmate::check_data_frame(predictors[[v]], nrows = nrow(newdata)))) { # do nothing, but don't take the other validity check branches } else if (get_variable_class(modeldata, v, "binary")) { if (!isTRUE(checkmate::check_numeric(predictors[[v]])) || !is_binary(predictors[[v]])) { msg <- sprintf("The `%s` variable is binary. The corresponding entry in the `variables` argument must be 0 or 1.", v) insight::format_error(msg) } # get_contrast_data requires both levels if (calling_function == "comparisons") { if (length(predictors[[v]]) != 2) { msg <- sprintf("The `%s` variable is binary. The corresponding entry in the `variables` argument must be a vector of length 2.", v) insight::format_error(msg) } } } else if (get_variable_class(modeldata, v, "numeric")) { if (calling_function == "comparisons") { # For comparisons(), the string shortcuts are processed in contrast_data_* functions because we need fancy labels. # Eventually it would be nice to consolidate, but that's a lot of work. valid_str <- c("iqr", "minmax", "sd", "2sd") flag <- isTRUE(checkmate::check_numeric(predictors[[v]], min.len = 1, max.len = 2)) || isTRUE(checkmate::check_choice(predictors[[v]], choices = valid_str)) || isTRUE(checkmate::check_function(predictors[[v]])) if (!isTRUE(flag)) { msg <- "The %s element of the `variables` argument is invalid." msg <- sprintf(msg, v) insight::format_error(msg) } } else if (calling_function == "predictions") { # string shortcuts if (identical(predictors[[v]], "iqr")) { predictors[[v]] <- stats::quantile(modeldata[[v]], probs = c(.25, .75), na.rm = TRUE) } else if (identical(predictors[[v]], "minmax")) { predictors[[v]] <- c(min(modeldata[[v]], na.rm = TRUE), max(modeldata[[v]], na.rm = TRUE)) } else if (identical(predictors[[v]], "sd")) { s <- stats::sd(modeldata[[v]], na.rm = TRUE) m <- mean(modeldata[[v]], na.rm = TRUE) predictors[[v]] <- c(m - s / 2, m + s / 2) } else if (identical(predictors[[v]], "2sd")) { s <- stats::sd(modeldata[[v]], na.rm = TRUE) m <- mean(modeldata[[v]], na.rm = TRUE) predictors[[v]] <- c(m - s, m + s) } else if (identical(predictors[[v]], "threenum")) { s <- stats::sd(modeldata[[v]], na.rm = TRUE) m <- mean(modeldata[[v]], na.rm = TRUE) predictors[[v]] <- c(m - s, m, m + s) } else if (identical(predictors[[v]], "fivenum")) { predictors[[v]] <- stats::fivenum } else if (is.character(predictors[[v]])) { msg <- sprintf('%s is a numeric variable. The summary shortcuts supported by the variables argument are: "iqr", "minmax", "sd", "2sd", "threenum", "fivenum".', v) insight::format_error(msg) } } } else { if (calling_function == "comparisons") { valid <- c("reference", "sequential", "pairwise", "all", "revpairwise", "revsequential", "revreference") # minmax needs an actual factor in the original data to guarantee correct order of levels. if (is.factor(modeldata[[v]])) { valid <- c(valid, "minmax") } flag1 <- checkmate::check_choice(predictors[[v]], choices = valid) flag2 <- checkmate::check_vector(predictors[[v]], len = 2) flag3 <- checkmate::check_data_frame(predictors[[v]], nrows = nrow(newdata), ncols = 2) flag4 <- checkmate::check_function(predictors[[v]]) flag5 <- checkmate::check_data_frame(predictors[[v]]) if (!isTRUE(flag1) && !isTRUE(flag2) && !isTRUE(flag3) && !isTRUE(flag4) && !isTRUE(flag5)) { msg <- "The %s element of the `variables` argument must be a vector of length 2 or one of: %s" msg <- sprintf(msg, v, paste(valid, collapse = ", ")) insight::format_error(msg) } } else if (calling_function == "predictions") { if (is.character(predictors[[v]]) || is.factor(predictors[[v]])) { if (!all(as.character(predictors[[v]]) %in% as.character(modeldata[[v]]))) { invalid <- intersect( as.character(predictors[[v]]), c("pairwise", "reference", "sequential", "revpairwise", "revreference", "revsequential")) if (length(invalid) > 0) { msg <- "These values are only supported by the `variables` argument in the `comparisons()` function: %s" msg <- sprintf(msg, paste(invalid, collapse = ", ")) } else { msg <- "Some elements of the `variables` argument are not in their original data. Check this variable: %s" msg <- sprintf(msg, v) } insight::format_error(msg) } } } } } # sometimes weights don't get extracted by `find_variables()` w <- tryCatch(insight::find_weights(model), error = function(e) NULL) w <- intersect(w, colnames(newdata)) others <- w # goals: # allow multiple function types: slopes() uses both difference and dydx # when comparison is defined, use that if it works or turn back to defaults # predictors list elements: name, value, function, label if (is.null(comparison)) { fun_numeric <- fun_categorical <- comparison_function_dict[["difference"]] lab_numeric <- lab_categorical <- comparison_label_dict[["difference"]] } else if (is.function(comparison)) { fun_numeric <- fun_categorical <- comparison lab_numeric <- lab_categorical <- "custom" } else if (is.character(comparison)) { # switch to the avg version when there is a `by` function if ((isTRUE(checkmate::check_character(by)) || isTRUE(by)) && !isTRUE(grepl("avg$", comparison))) { comparison <- paste0(comparison, "avg") } # weights if user requests `avg` or automatically switched if (isTRUE(grepl("avg$", comparison)) && "marginaleffects_wts_internal" %in% colnames(newdata)) { comparison <- paste0(comparison, "wts") } fun_numeric <- fun_categorical <- comparison_function_dict[[comparison]] lab_numeric <- lab_categorical <- comparison_label_dict[[comparison]] if (isTRUE(grepl("dydxavgwts|eyexavgwts|dyexavgwts|eydxavgwts", comparison))) { fun_categorical <- comparison_function_dict[["differenceavgwts"]] lab_categorical <- comparison_label_dict[["differenceavgwts"]] } else if (isTRUE(grepl("dydxavg|eyexavg|dyexavg|eydxavg", comparison))) { fun_categorical <- comparison_function_dict[["differenceavg"]] lab_categorical <- comparison_label_dict[["differenceavg"]] } else if (isTRUE(grepl("dydx$|eyex$|dyex$|eydx$", comparison))) { fun_categorical <- comparison_function_dict[["difference"]] lab_categorical <- comparison_label_dict[["difference"]] } } for (v in names(predictors)) { if (get_variable_class(modeldata, v, "numeric") && !get_variable_class(modeldata, v, "binary")) { fun <- fun_numeric lab <- lab_numeric } else { fun <- fun_categorical lab <- lab_categorical } predictors[[v]] <- list( "name" = v, "function" = fun, "label" = lab, "value" = predictors[[v]], "comparison" = comparison) } # epsilon for finite difference for (v in names(predictors)) { if (!is.null(eps)) { predictors[[v]][["eps"]] <- eps } else if (is.numeric(modeldata[[v]])) { predictors[[v]][["eps"]] <- 1e-4 * diff(range(modeldata[[v]], na.rm = TRUE, finite = TRUE)) } else { predictors[[v]]["eps"] <- list(NULL) } } # can't take the slope of an outcome, except in weird brms models (issue #1006) if (!inherits(model, "brmsfit") || !isTRUE(length(model$formula$forms) > 1)) { dv <- hush(unlist(insight::find_response(model, combine = FALSE), use.names = FALSE)) # sometimes insight doesn't work if (length(dv) > 0) { predictors <- predictors[setdiff(names(predictors), dv)] } } if (length(predictors) == 0) { insight::format_error("There is no valid predictor variable. Please make sure your model includes predictors and use the `variables` argument.") } # interaction: get_contrasts() assumes there is only one function when interaction=TRUE if (isTRUE(interaction)) { for (p in predictors) { flag <- !identical(p[["function"]], predictors[[1]][["function"]]) if (flag) { stop("When `interaction=TRUE` all variables must use the same contrast function.", call. = FALSE) } } } # sort variables alphabetically predictors <- predictors[sort(names(predictors))] others <- others[sort(names(others))] # output out <- list(conditional = predictors, others = others) return(out) } marginaleffects/R/get_coef.R0000644000176200001440000000113314631452335015507 0ustar liggesusers#' Get a named vector of coefficients from a model object (internal function) #' #' @inheritParams slopes #' @return A named vector of coefficients. The names must match those of the variance matrix. #' @rdname get_coef #' @keywords internal #' @export get_coef <- function (model, ...) { UseMethod("get_coef", model) } #' @rdname get_coef #' @export get_coef.default <- function(model, ...) { ## faster # out <- stats::coef(model) # more general out <- insight::get_parameters(model, component = "all") out <- stats::setNames(out$Estimate, out$Parameter) return(out) } marginaleffects/R/settings.R0000644000176200001440000000305314631452335015577 0ustar liggesusersmarginaleffects_settings <- new.env() settings_cache <- function(setti) { out <- list() for (s in setti) { out[[s]] <- settings_get(s) } return(out) } settings_restore <- function(cache) { for (n in names(cache)) { settings_set(n, cache[[n]]) } } settings_init <- function(settings = NULL) { settings_rm() default_settings <- list( marginaleffects_safefun_return1 = FALSE ) checkmate::assert_list(settings, null.ok = TRUE, names = "unique") if (!is.null(settings)) { settings <- c(settings, default_settings) } for (i in seq_along(settings)) { settings_set(names(settings)[i], settings[[i]]) } } settings_get <- function(name) { if (name %in% names(marginaleffects_settings)) { get(name, envir = marginaleffects_settings) } else { NULL } } settings_set <- function(name, value) { assign(name, value = value, envir = marginaleffects_settings) } settings_rm <- function(name = NULL) { if (is.null(name)) { rm(list = names(marginaleffects_settings), envir = marginaleffects_settings) } else if ("name" %in% names(marginaleffects_settings)) { rm(list = name, envir = marginaleffects_settings) } } settings_equal <- function(name, comparison) { k <- settings_get(name) if (!is.null(k) && length(comparison) == 1 && k == comparison) { out <- TRUE } else if (!is.null(k) && length(comparison) > 1 && k %in% comparison) { out <- TRUE } else { out <- FALSE } return(out) } marginaleffects/R/hypothesis_helper.R0000644000176200001440000001177014631452335017502 0ustar liggesusers#' (EXPERIMENTAL) This experimental function will soon be deprecated. Please supply a formula or function to the `hypothesis` argument to conduct (group-wise) hypothesis tests. #' #' @param hypothesis String or Function. Compute a test statistic. #' - String: "reference" or "sequential" #' - Function: Accepts a single argument named `estimate` and returns a numeric vector. #' @param by Character vector. Variable names which indicate subgroups in which the `hypothesis` function should be applied. #' @param label Function. Accepts a vector of row labels and combines them to create hypothesis labels. #' @param label_columns Character vector. Column names to use for hypothesis labels. Default is `c("group", "term", "rowid", attr(x, "variables_datagrid"), attr(x, "by"))`. #' @param comparison String. "ratio" or "difference" #' @param internal Logical. Raises a deprecation warning when FALSE. #' @return `specify_hypothesis()` is a "function factory", which means that executing it will return a function suitable for use in the `hypothesis` argument of a `marginaleffects` function. #' @export specify_hypothesis <- function( hypothesis = "reference", comparison = "difference", label = NULL, label_columns = NULL, by = c("term", "group", "contrast"), internal = FALSE) { if (!isTRUE(internal)) { insight::format_warning("The `specify_hypothesis()` function was marked as experimental and will be deprecate. Use the formula interface to the `hypothesis` argument to specify group-wise hypothesis tests.") } checkmate::assert_choice(comparison, c("ratio", "difference")) checkmate::assert_character(by, null.ok = TRUE) checkmate::assert_function(label, null.ok = TRUE) checkmate::assert_character(label_columns, null.ok = TRUE) checkmate::assert( checkmate::check_function(hypothesis), checkmate::check_choice(hypothesis, choices = c("reference", "sequential", "meandev")) ) if (is.null(label)) label <- function(x) "custom" if (identical(hypothesis, "reference")) { if (comparison == "difference") { hypothesis <- function(x) (x - x[1])[2:length(x)] label <- function(x) sprintf("(%s) - (%s)", x, x[1])[2:length(x)] } else { hypothesis <- function(x) (x / x[1])[2:length(x)] label <- function(x) sprintf("(%s) / (%s)", x, x[1])[2:length(x)] } } else if (identical(hypothesis, "sequential")) { if (comparison == "difference") { hypothesis <- function(x) (x - data.table::shift(x))[2:length(x)] label = function(x) sprintf("(%s) - (%s)", x, data.table::shift(x))[2:length(x)] } else { hypothesis <- function(x) (x / data.table::shift(x))[2:length(x)] label = function(x) sprintf("(%s) / (%s)", x, data.table::shift(x))[2:length(x)] } } else if (identical(hypothesis, "meandev")) { hypothesis <- function(x) x - mean(x) label <- function(x) sprintf("(%s) - Avg", x) } fun <- function(x) { x <- data.table::copy(x) estimate <- x$estimate # automatic by argument if (is.null(by)) { by <- grep("^term$|^contrast|^group$", colnames(x), value = TRUE) if (length(by) == 0) by <- NULL } else { bad <- setdiff(by, c(colnames(x), "term", "group", "contrast", "rowid")) if (length(bad) > 0) { msg <- sprintf("Missing column(s): %s", paste(bad, collapse = ", ")) insight::format_error(msg) } by <- intersect(by, colnames(x)) if (length(by) == 0) by <- NULL } # row labels if (!"rowid" %in% colnames(x)) x[, "rowid" := seq_len(.N)] if (is.null(label_columns)) { # TODO check if we need rowid # label_columns <- c("group", "term", "rowid", attr(x, "variables_datagrid"), attr(x, "by")) label_columns <- c("group", "term", attr(x, "variables_datagrid"), attr(x, "by")) } label_columns <- setdiff(label_columns, setdiff(by, "rowid")) label_columns <- intersect(label_columns, colnames(x)) if (length(label_columns) == 0) label_columns <- "rowid" tmp <- x[, ..label_columns] for (col in label_columns) { if (length(unique(tmp[[col]])) == 1) { tmp[, (col) := NULL] } else { tmp[, (col) := sprintf("%s[%s]", col, tmp[[col]])] } } tmp <- apply(tmp, 1, paste, collapse = ", ") x[, marginaleffects_internal_label := tmp] if (is.null(by)) { out <- x[, list( hypothesis = label(marginaleffects_internal_label), estimate = hypothesis(estimate))] } else { out <- x[, list( hypothesis = label(marginaleffects_internal_label), estimate = hypothesis(estimate)), by = by] } attr(out, "hypothesis_function_by") <- by return(out) } return(fun) } marginaleffects/R/methods_mlr3.R0000644000176200001440000000115714631452335016342 0ustar liggesusers#' @include get_predict.R #' @rdname get_predict #' @keywords internal #' @export get_predict.Learner <- function(model, newdata, type = NULL, ...) { if (!is.null(type) && !type %in% model$predict_types) { msg <- sprintf("Valid `type` values: %s", paste(model$predict_types, collapse = ", ")) insight::format_error(msg) } out <- drop(stats::predict(model, newdata = newdata, predict_type = type)) out <- data.frame(rowid = seq_along(out), estimate = out) return(out) } #' @include get_vcov.R #' @rdname get_vcov #' @export get_vcov.Learner <- function(model, ...) { return(FALSE) }marginaleffects/R/plot_comparisons.R0000644000176200001440000001502614631452335017335 0ustar liggesusers#' Plot Conditional or Marginal Comparisons #' #' @description #' Plot comparisons on the y-axis against values of one or more predictors (x-axis, colors/shapes, and facets). #' #' The `by` argument is used to plot marginal comparisons, that is, comparisons made on the original data, but averaged by subgroups. This is analogous to using the `by` argument in the `comparisons()` function. #' #' The `condition` argument is used to plot conditional comparisons, that is, comparisons made on a user-specified grid. This is analogous to using the `newdata` argument and `datagrid()` function in a `comparisons()` call. All variables whose values are not specified explicitly are treated as usual by `datagrid()`, that is, they are held at their mean or mode (or rounded mean for integers). This includes grouping variables in mixed-effects models, so analysts who fit such models may want to specify the groups of interest using the `condition` argument, or supply model-specific arguments to compute population-level estimates. See details below. #' #' See the "Plots" vignette and website for tutorials and information on how to customize plots: #' #' * https://marginaleffects.com/vignettes/plot.html #' * https://marginaleffects.com #' #' @param variables Name of the variable whose contrast we want to plot on the y-axis. #' @param draw `TRUE` returns a `ggplot2` plot. `FALSE` returns a `data.frame` of the underlying data. #' @inheritParams comparisons #' @param newdata When `newdata` is `NULL`, the grid is determined by the `condition` argument. When `newdata` is not `NULL`, the argument behaves in the same way as in the `comparisons()` function. #' @inheritParams plot_slopes #' @inheritParams slopes #' @template model_specific_arguments #' @return A `ggplot2` object #' @export #' @examples #' mod <- lm(mpg ~ hp * drat * factor(am), data = mtcars) #' #' plot_comparisons(mod, variables = "hp", condition = "drat") #' #' plot_comparisons(mod, variables = "hp", condition = c("drat", "am")) #' #' plot_comparisons(mod, variables = "hp", condition = list("am", "drat" = 3:5)) #' #' plot_comparisons(mod, variables = "am", condition = list("hp", "drat" = range)) #' #' plot_comparisons(mod, variables = "am", condition = list("hp", "drat" = "threenum")) plot_comparisons <- function(model, variables = NULL, condition = NULL, by = NULL, newdata = NULL, type = "response", vcov = NULL, conf_level = 0.95, wts = FALSE, comparison = "difference", transform = NULL, rug = FALSE, gray = FALSE, draw = TRUE, ...) { dots <- list(...) if ("effect" %in% names(dots)) { if (is.null(variables)) { variables <- dots[["effect"]] } else { insight::format_error("The `effect` argument has been renamed to `variables`.") } } if ("transform_post" %in% names(dots)) { # backward compatibility transform <- dots[["transform_post"]] } if (inherits(model, "mira") && is.null(newdata)) { msg <- "Please supply a data frame to the `newdata` argument explicitly." insight::format_error(msg) } # order of the first few paragraphs is important scall <- rlang::enquo(newdata) newdata <- sanitize_newdata_call(scall, newdata, model, by = by) if (!isFALSE(wts) && is.null(by)) { insight::format_error("The `wts` argument requires a `by` argument.") } checkmate::assert_character(by, null.ok = TRUE, max.len = 3, min.len = 1, names = "unnamed") if ((!is.null(condition) && !is.null(by)) || (is.null(condition) && is.null(by))) { msg <- "One of the `condition` and `by` arguments must be supplied, but not both." insight::format_error(msg) } # sanity check checkmate::assert( checkmate::check_character(variables, names = "unnamed"), checkmate::check_list(variables, names = "unique"), .var.name = "variables") modeldata <- get_modeldata( model, additional_variables = c(names(condition), by), wts = wts) # mlr3 and tidymodels if (is.null(modeldata) || nrow(modeldata) == 0) { modeldata <- newdata } # conditional if (!is.null(condition)) { condition <- sanitize_condition(model, condition, variables, modeldata = modeldata) v_x <- condition$condition1 v_color <- condition$condition2 v_facet_1 <- condition$condition3 v_facet_2 <- condition$condition4 datplot <- comparisons( model, newdata = condition$newdata, type = type, vcov = vcov, conf_level = conf_level, by = FALSE, wts = wts, variables = variables, comparison = comparison, transform = transform, cross = FALSE, modeldata = modeldata, ...) } # marginal if (!is.null(by)) { newdata <- sanitize_newdata( model = model, newdata = newdata, modeldata = modeldata, by = by, wts = wts) datplot <- comparisons( model, by = by, newdata = newdata, type = type, vcov = vcov, conf_level = conf_level, variables = variables, wts = wts, comparison = comparison, transform = transform, cross = FALSE, modeldata = modeldata, ...) v_x <- by[[1]] v_color <- hush(by[[2]]) v_facet_1 <- hush(by[[3]]) v_facet_2 <- hush(by[[4]]) } datplot <- plot_preprocess(datplot, v_x = v_x, v_color = v_color, v_facet_1 = v_facet_1, v_facet_2 = v_facet_2, condition = condition, modeldata = modeldata) # return immediately if the user doesn't want a plot if (isFALSE(draw)) { out <- as.data.frame(datplot) attr(out, "posterior_draws") <- attr(datplot, "posterior_draws") return(out) } # ggplot2 insight::check_if_installed("ggplot2") p <- plot_build(datplot, v_x = v_x, v_color = v_color, v_facet_1 = v_facet_1, v_facet_2 = v_facet_2, gray = gray, rug = rug, modeldata = modeldata) p <- p + ggplot2::labs(x = v_x, y = sprintf("Comparison")) return(p) } marginaleffects/R/methods_robustlmm.R0000644000176200001440000000155514631452335017513 0ustar liggesusers#' @rdname set_coef #' @export set_coef.rlmerMod <- function(model, coefs, ...) { model@beta <- coefs model } #' @rdname get_predict #' @export get_predict.rlmerMod <- function(model, newdata = insight::get_data(model), type = "response", ...) { args <- list(...) # some predict methods raise warnings on unused arguments unused <- c("type", "normalize_dydx", "step_size", "numDeriv_method", "conf_level", "conf.level", "internal_call", "return_format", "vcov", "eps", "modeldata") args <- args[setdiff(names(args), unused)] args[["object"]] <- model args[["newdata"]] <- newdata out <- data.frame(rowid = seq_len(nrow(newdata)), estimate = do.call("predict", args)) return(out) } marginaleffects/R/get_model_matrix.R0000644000176200001440000000134114631452335017260 0ustar liggesusers#' Get a named model matrix #' #' @inheritParams slopes #' @rdname get_model_matrix #' @keywords internal #' @export get_model_matrix <- function(model, newdata) { UseMethod("get_model_matrix", model) } #' @rdname get_model_matrix #' @keywords internal #' @export get_model_matrix.default <- function(model, newdata) { # faster if (class(model)[1] %in% c("lm", "glm")) { out <- hush(stats::model.matrix(model, data = newdata)) # more general } else { out <- hush(insight::get_modelmatrix(model, data = newdata)) } beta <- get_coef(model) if (!isTRUE(nrow(out) == nrow(newdata)) || !isTRUE(ncol(out) == length(beta))) { return(NULL) } else { return(out) } }marginaleffects/R/imputation.R0000644000176200001440000000413614631452335016133 0ustar liggesusersprocess_imputation <- function(x, call_attr, marginal_means = FALSE) { insight::check_if_installed("mice") if (inherits(x, "mira")) { x <- x$analyses } else if (inherits(x, "amest")) { x <- x } mfx_list <- vector("list", length(x)) for (i in seq_along(x)) { calltmp <- call_attr calltmp[["model"]] <- x[[i]] # not sure why but this breaks marginal_means on "modeldata specified twice" if (isFALSE(marginal_means)) { calltmp[["modeldata"]] <- get_modeldata( x[[i]], additional_variables = FALSE) } mfx_list[[i]] <- evalup(calltmp) if (i == 1) { out <- mfx_list[[1]] } mfx_list[[i]]$term <- seq_len(nrow(mfx_list[[i]])) class(mfx_list[[i]]) <- c("marginaleffects_mids", class(mfx_list[[i]])) } mipool <- mice::pool(mfx_list) for (col in c("estimate", "statistic", "p.value", "conf.low", "conf.high")) { if (col %in% colnames(out) && col %in% colnames(mipool$pooled)) { out[[col]] <- mipool$pooled[[col]] } else { out[[col]] <- NULL } } if ("df" %in% colnames(mipool$pooled)) { out$df <- mipool$pooled$df } out$std.error <- sqrt(mipool$pooled$t) out <- get_ci( out, vcov = call_attr[["vcov"]], conf_level = call_attr[["conf_level"]], df = mipool$pooled$df) attr(out, "inferences") <- mipool attr(out, "model") <- mice::pool(lapply(mfx_list, attr, "model")) return(out) } #' tidy helper #' #' @noRd #' @export tidy.marginaleffects_mids <- function(x, ...) { if (!"std.error" %in% colnames(x)) { insight::format_error('The output does not include a `std.error` column. Some models do not generate standard errors when estimates are backtransformed (e.g., GLM models). One solution is to use `type="response"` for those models.') } out <- as.data.frame(x[, c("estimate", "std.error")]) out$term <- seq_len(nrow(out)) return(out) } #' glance helper #' #' @noRd #' @export glance.marginaleffects_mids <- function(x, ...) { data.frame() } marginaleffects/R/type_dictionary.R0000644000176200001440000000532314631452335017147 0ustar liggesusers #' internal function to build the type dictionary #' #' @noRd type_dictionary_build <- function() { text <- 'class,type other,response other,class other,link bam,response bam,link bart,ev bart,ppd betareg,response betareg,link betareg,precision betareg,quantile betareg,variance bife,response bife,link bracl,probs brglmFit,response brglmFit,link brmsfit,response brmsfit,link brmsfit,prediction brmsfit,average brmultinom,probs brmultinom,class clm,prob clm,cum.prob clm,linear.predictor clogit,expected clogit,lp clogit,risk clogit,survival coxph,expected coxph,lp coxph,risk coxph,survival crch,response crch,location crch,scale crch,density hetprob,pr hetprob,xb hxlr,location hxlr,cumprob hxlr,scale hxlr,density ivpml,pr ivpml,xb flexsurvreg,response, flexsurvreg,mean, flexsurvreg,link, flexsurvreg,lp, flexsurvreg,linear, flexsurvreg,rmst, flexsurvreg,survival, flexsurvreg,hazard, flexsurvreg,cumhaz, fixest,invlink(link) fixest,response fixest,link hurdle,response hurdle,prob hurdle,count hurdle,zero iv_robust,response lm,response gam,response gam,link Gam,invlink(link) Gam,response Gam,link geeglm,response geeglm,link Gls,lp glimML,response glimML,link glm,invlink(link) glm,response glm,link glmerMod,response glmerMod,link glmrob,response glmrob,link glmmTMB,response glmmTMB,link glmmTMB,conditional glmmTMB,zprob glmmTMB,zlink glmmTMB,disp glmmPQL,response glmmPQL,link glmx,response ivreg,response lmerMod,response lmerModLmerTest,response lmrob,response lm_robust,response lrm,fitted lrm,lp lrm,mean mblogit,response mblogit,latent mblogit,link mclogit,response mclogit,latent mclogit,link MCMCglmm,response model_fit,numeric model_fit,prob model_fit,class workflow,numeric workflow,prob workflow,class multinom,probs multinom,latent mhurdle,E mhurdle,Ep mhurdle,p mlogit,response mvgam,response mvgam,link mvgam,expected mvgam,detection mvgam,latent_N negbin,invlink(link) negbin,response negbin,link ols,lp "oohbchoice", "probability", "oohbchoice", "utility", orm,fitted orm,mean orm,lp polr,probs rendo.base,response rendo.base,link rlm,response selection,response selection,link selection,unconditional speedlm,response speedglm,response speedglm,link stanreg,response stanreg,link survreg,response survreg,link survreg,quantile svyglm,response svyglm,link svyolr,probs tobit,response tobit1,expvalue tobit1,linpred tobit1,prob zeroinfl,response zeroinfl,prob zeroinfl,count zeroinfl,zero' out <- utils::read.csv( text = text, colClasses = c("character", "character")) for (i in 1:2) { out[[i]] <- trimws(out[[i]]) } return(out) } #' type dictionary #' #' insight::get_predict accepts a `predict` argument #' stats::predict accepts a `type` argument #' this dictionary converts #' @noRd type_dictionary <- type_dictionary_build() marginaleffects/R/methods_mlogit.R0000644000176200001440000000265614631452335016765 0ustar liggesusers#' @rdname get_predict #' @export get_predict.mlogit <- function(model, newdata, ...) { mat <- stats::predict(model, newdata = as.data.frame(newdata)) if (isTRUE(checkmate::check_atomic_vector(mat))) { out <- data.table(rowid = seq_along(mat), group = names(mat), estimate = mat) } else { out <- data.table(rowid = rep(seq_len(nrow(mat)), rep = ncol(mat)), group = rep(colnames(mat), each = nrow(mat)), estimate = as.vector(mat)) } setkey(out, rowid, group) if ("term" %in% colnames(newdata)) { out[, "term" := newdata[["term"]]] } # do not convert to factor because DV is often "yes" or "no" while the "group" is outcome levels. # out$group <- group_to_factor(out$group, model) return(out) } #' @include sanity_model.R #' @rdname sanitize_model_specific #' @keywords internal sanitize_model_specific.mlogit <- function(model, newdata, ...) { if (!is.null(newdata)) { nchoices <- length(unique(model$model$idx[, 2])) if (!isTRUE(nrow(newdata) %% nchoices == 0)) { msg <- sprintf("The `newdata` argument for `mlogit` models must be a data frame with a number of rows equal to a multiple of the number of choices: %s.", nchoices) stop(msg, call. = FALSE) } } return(model) } marginaleffects/R/get_contrast_data.R0000644000176200001440000001604614631452335017432 0ustar liggesusersget_contrast_data <- function(model, newdata, variables, cross, modeldata = NULL, ...) { lo <- hi <- ter <- lab <- original <- rowid <- list() # after variable class assignment if (is.null(modeldata)) { modeldata <- attr(newdata, "newdata_modeldata") } # sometimes needed for extensions when get_data doesn't work if (is.null(modeldata) || nrow(modeldata) == 0) { modeldata <- newdata } # safety need for extensions not supported by `insight` variable_classes <- attr(newdata, "newdata_variable_class") if (length(variable_classes) == 0) { newdata <- set_variable_class(newdata, model) variable_classes <- attr(newdata, "marginaleffects_variable_class") } if (length(attr(modeldata, "marginaleffects_variable_class")) == 0) { modeldata <- set_variable_class(modeldata, model) } if (any(c("factor", "character") %in% variable_classes)) { first_cross <- names(variable_classes[variable_classes %in% c("factor", "character")])[1] } else { first_cross <- NULL } # must use `as.data.table()` because `setDT()` does not handle columns with # more dimensions (e.g., "idx" in {mlogit}) newdata <- as.data.table(newdata) for (v in variables) { args <- list( model = model, newdata = newdata, variable = v, cross = cross, first_cross = identical(v$name, first_cross), modeldata = modeldata) args <- append(args, list(...)) # logical and character before factor used to be important; but I don't think so anymore if (get_variable_class(modeldata, v$name, "logical")) { fun <- get_contrast_data_logical } else if (get_variable_class(modeldata, v$name, "character")) { fun <- get_contrast_data_character } else if (get_variable_class(modeldata, v$name, "categorical")) { fun <- get_contrast_data_factor } else if (get_variable_class(modeldata, v$name, "numeric")) { fun <- get_contrast_data_numeric } else { msg <- sprintf("Class of the `%s` variable is class is not supported.", v$name) stop(msg, call. = FALSE) } tmp <- do.call("fun", args) lo[[v$name]] <- tmp$lo if (isTRUE(cross)) { lo[[v$name]][[paste0("null_contrast_", v$name)]] <- tmp$contrast_null } hi[[v$name]] <- tmp$hi ter[[v$name]] <- tmp$ter lab[[v$name]] <- tmp$lab original[[v$name]] <- tmp$original rowid[[v$name]] <- tmp$rowid } clean <- function(x) { for (col in colnames(x)) { # tobit1 introduces AsIs columns if (inherits(x[[col]], "AsIs")) { x[[col]] <- as.numeric(x[[col]]) } # plm creates c("pseries", "numeric"), but when get_contrast_data # assigns +1 numeric, we lose the inheritance if (inherits(x[[col]], "pseries")) { x[[col]] <- as.numeric(x[[col]]) } # strip labelled data which break rbindlist() cl <- class(x[[col]]) if (length(cl) == 2 && cl[1] == "labelled") { class(x[[col]]) <- class(x[[col]])[2] } # mlogit uses a `newdata` with one row per unit-choice and returns # an `idx` column with the choice label in second position if (inherits(model, "mlogit") && inherits(x[[col]], "idx")) { x[[col]] <- NULL } } return(x) } lo <- lapply(lo, clean) hi <- lapply(hi, clean) original <- lapply(original, clean) # single contrast if (!isTRUE(cross)) { lo <- rbindlist(lo, fill = TRUE) hi <- rbindlist(hi, fill = TRUE) original <- rbindlist(original, fill = TRUE) # long names to avoid user-supplied colname conflict marginaleffects_ter <- unlist(ter, use.names = FALSE) marginaleffects_lab <- unlist(lab, use.names = FALSE) lo[, "term" := marginaleffects_ter] hi[, "term" := marginaleffects_ter] original[, "term" := marginaleffects_ter] lo[, "contrast" := marginaleffects_lab] hi[, "contrast" := marginaleffects_lab] original[, "contrast" := marginaleffects_lab] # cross contrast } else { # drop variables for which we have contrasts for (i in seq_along(lo)) { if (i == 1) { # keep rowid and original data only in one of the datasets idx_lo <- setdiff(names(variables), names(lo)[i]) idx_hi <- setdiff(names(variables), names(hi)[i]) idx_or <- setdiff(names(variables), names(hi)[i]) } else { # exclude rowid and variables excluded from `variables`, for # which we do not compute cross-contrasts contrast_null <- grep("rowid|^null_contrast_", colnames(lo[[i]]), value = TRUE) idx_lo <- c(setdiff(names(lo[[i]]), c(contrast_null, names(variables))), setdiff(names(variables), names(lo)[[i]])) idx_hi <- c(setdiff(names(hi[[i]]), c(contrast_null, names(variables))), setdiff(names(variables), names(hi)[[i]])) idx_or <- c(setdiff(names(original[[i]]), c(contrast_null, names(variables))), setdiff(names(variables), names(original)[[i]])) } lo[[i]] <- data.table(lo[[i]])[, !..idx_lo] hi[[i]] <- data.table(hi[[i]])[, !..idx_hi] original[[i]] <- data.table(original[[i]])[, !..idx_or] lo[[i]][[paste0("contrast_", names(lo)[i])]] <- lab[[i]] hi[[i]][[paste0("contrast_", names(hi)[i])]] <- lab[[i]] original[[i]][[paste0("contrast_", names(original)[i])]] <- lab[[i]] } fun <- function(x, y) merge(x, y, all = TRUE, allow.cartesian = TRUE, sort = FALSE) lo <- Reduce("fun", lo) hi <- Reduce("fun", hi) original <- Reduce("fun", original) # faster to rbind, but creates massive datasets. need cartesian join on rowid # lo <- cjdt(lo) # hi <- cjdt(hi) # if there are fewer null_contrast_* columns, then there is at least # one always non-null variable type, so we keep everything idx <- grepl("^null_contrast_", colnames(lo)) idx_df <- lo[, ..idx] lo <- lo[, !..idx] if (sum(idx) == length(variables)) { idx <- rowSums(idx_df) < ncol(idx_df) lo <- lo[idx] hi <- hi[idx] original <- original[idx] } } # get_predict() is much faster if we only build the model matrix once lo <- get_model_matrix_attribute(model, lo) hi <- get_model_matrix_attribute(model, hi) original <- get_model_matrix_attribute(model, original) out <- list(lo = lo, hi = hi, original = original) return(out) } marginaleffects/R/methods_glmmTMB.R0000755000176200001440000000405214631452335016764 0ustar liggesusers#' @include get_predict.R #' @rdname get_predict #' @keywords internal #' @export get_predict.glmmTMB <- function(model, newdata = insight::get_data(model), type = "response", newparams = NULL, ...) { if (inherits(vcov, "vcov.glmmTMB")) { vcov <- vcov[[1]] } # hack to avoid re-optimization # see https://github.com/vincentarelbundock/marginaleffects/issues/1064 b_vec <- model$obj$env$parList()$b if (length(b_vec)>0) { model$modelInfo$map$b <- factor(rep(NA,length(b_vec))) } np <- model$fit$par if (!is.null(newparams)) { np[1:length(newparams)] <- newparams } out <- get_predict.default( model = model, newdata = newdata, type = type, allow.new.levels = TRUE, # otherwise we get errors in marginal_means() newparams = np, ...) return(out) } #' @include get_vcov.R #' @rdname get_vcov #' @export get_vcov.glmmTMB <- function(model, ...) { out <- stats::vcov(model, full = TRUE) return(out) } #' @include get_coef.R #' @rdname get_coef #' @export get_coef.glmmTMB <- function(model, ...) { glmmTMB::fixef(model)$cond } #' @include set_coef.R #' @rdname set_coef #' @export set_coef.glmmTMB <- function(model, coefs, ...) { # use predict(`newparams`) for this kind of model return(model) } #' @rdname sanitize_model_specific sanitize_model_specific.glmmTMB <- function(model, vcov = TRUE, re.form = NULL, ...) { # re.form=NA if (!isTRUE(checkmate::check_flag(vcov))) { msg <- "For this model type, `vcov` must be `TRUE` or `FALSE`." insight::format_error(msg) } if (!isTRUE(is.na(re.form))) { msg <- "For this model type, `marginaleffects` only takes into account the uncertainty in fixed-effect parameters. You can use the `re.form=NA` argument to acknowledge this explicitly and silence this warning." insight::format_warning(msg) } return(model) } marginaleffects/R/get_se_delta.R0000644000176200001440000001124714631452335016362 0ustar liggesusersget_se_delta_marginalmeans <- function(model, variables, newdata, type, cross = FALSE, ...) { get_marginalmeans( model = model, variables = variables, newdata = newdata, type = type, cross = cross, ... )$estimate } get_se_delta_contrasts <- function(model, variables, newdata, type, hypothesis, lo, hi, original, cross, ...) { get_contrasts(model, newdata = newdata, variables = variables, type = type, hypothesis = hypothesis, lo = lo, hi = hi, original = original, cross = cross, verbose = FALSE, deltamethod = TRUE, ... )$estimate } #' Compute standard errors using the delta method #' #' @inheritParams slopes #' @param FUN a function which accepts a `model` and other inputs and returns a #' vector of estimates (marginal effects, marginal means, etc.) #' @param index data.frame over which we aggregate J_mean (matches tidy() output) #' @return vector of standard errors #' @noRd get_se_delta <- function(model, vcov, FUN, type = NULL, newdata = NULL, index = NULL, eps = NULL, J = NULL, hypothesis = NULL, numderiv = NULL, ...) { # delta method does not work for these models bad <- c("brmsfit", "stanreg", "bart") if (any(bad %in% class(model))) { return(NULL) } coefs <- get_coef(model, ...) # TODO: this is a terrible sanity check # some vcov methods return an unnamed matrix, some have duplicate names flag <- anyDuplicated(colnames(vcov)) == 0 || anyDuplicated(names(coefs)) == 0 if (flag && !is.null(dimnames(vcov)) && all(names(coefs) %in% colnames(vcov))) { bnames <- intersect(names(coefs), colnames(vcov)) vcov <- vcov[bnames, bnames, drop = FALSE] colnames(vcov) <- row.names(vcov) <- names(coefs) coefs <- coefs[bnames] } # input: named vector of coefficients # output: gradient inner <- function(x) { names(x) <- names(coefs) model_tmp <- set_coef(model, x, ...) # do not pass NULL arguments. Important for `deltam` to allow users to supply FUN without ... args <- c(list(model = model_tmp, hypothesis = hypothesis), list(...)) if (inherits(model, "gamlss")) args[["safe"]] <- FALSE if (!is.null(eps)) args[["eps"]] <- eps if (!is.null(type)) args[["type"]] <- type if (!is.null(newdata)) args[["newdata"]] <- newdata if (!is.null(J)) args[["J"]] <- J if (!is.null(eps)) args[["eps"]] <- eps if (inherits(model, "glmmTMB")) { args$newparams <- x } g <- do.call("FUN", args) return(g) } if (is.null(J) || !is.null(hypothesis)) { args <- list( func = inner, x = coefs, numderiv = numderiv) J <- do.call("get_jacobian", args) colnames(J) <- names(get_coef(model, ...)) } # align J and V: This might be a problematic hack, but I have not found examples yet. V <- vcov if (!isTRUE(ncol(J) == ncol(V))) { beta <- get_coef(model, ...) # Issue #718: ordinal::clm in test-pkg-ordinal.R if (anyNA(beta) && anyDuplicated(names(beta)) && ncol(J) > ncol(V) && ncol(J) == length(beta) && length(stats::na.omit(beta)) == ncol(V)) { J <- J[, !is.na(beta), drop = FALSE] } else { cols <- intersect(colnames(J), colnames(V)) if (length(cols) == 0) { insight::format_error("The jacobian does not match the variance-covariance matrix.") } V <- V[cols, cols, drop = FALSE] J <- J[, cols, drop = FALSE] } } # Var(dydx) = J Var(beta) J' # computing the full matrix is memory-expensive, and we only need the diagonal # algebra trick: https://stackoverflow.com/a/42569902/342331 se <- sqrt(rowSums(tcrossprod(J, V) * J)) se[se == 0] <- NA_real_ attr(se, "jacobian") <- J return(se) } marginaleffects/R/methods_sampleSelection.R0000644000176200001440000000142014631452335020605 0ustar liggesusers# TODO: heckit standard errors are not available because `vcov` is block diagonal with NAs #' @rdname get_coef #' @export get_coef.selection <- function(model, ...) { # sampleSelection::selection if (as.list(model$call)[[1]] == "selection") { out <- model$estimate # sampleSelection::heckit } else if (as.list(model$call)[[1]] == "heckit") { out <- model$coefficients } return(out) } #' @rdname set_coef #' @export set_coef.selection <- function(model, coefs, ...) { # sampleSelection::selection if (as.list(model$call)[[1]] == "selection") { model[["estimate"]] <- coefs # sampleSelection::heckit } else if (as.list(model$call)[[1]] == "heckit") { model[["coefficients"]] <- coefs } return(model) } marginaleffects/R/methods_MCMCglmm.R0000644000176200001440000000167114631452335017062 0ustar liggesusers#' @rdname get_predict #' @export get_predict.MCMCglmm <- function( model, newdata, type = "response", ndraws = 1000, ...) { ndraws_mod <- nrow(model$VCV) if (ndraws < ndraws_mod) { idx <- sample(seq_len(ndraws_mod), ndraws) } else { idx <- seq_len(ndraws_mod) } draws <- lapply(idx, function(i) stats::predict(model, newdata = newdata, it = i, ...)) draws <- do.call("cbind", draws) out <- data.frame( rowid = seq_len(nrow(newdata)), estimate = apply(draws, MARGIN = 1, FUN = stats::median)) attr(out, "posterior_draws") <- draws return(out) } #' @rdname get_vcov #' @export get_vcov.MCMCglmm <- function(model, vcov = NULL, ...) { if (!is.null(vcov) && !is.logical(vcov)) { insight::format_warning("The `vcov` argument is not supported for models of this class.") } return(NULL) }marginaleffects/R/methods_crch.R0000644000176200001440000000422014631452335016376 0ustar liggesusers#' @include set_coef.R #' @rdname set_coef #' @export set_coef.crch <- function(model, coefs, ...) { # coefs are split between location coefs (which can be length 0) and scale coefs # (which must be length > 0 and always start with "(scale)_" due to get_parameters(), # to match with get_varcov(., component = "all") output). In crch object, these # are stored as two elements in a list, with scale coefs lacking the "(scale)_" # prefix, so we remove it. location_coefs <- coefs[!startsWith(names(coefs), "(scale)_")] scale_coefs <- coefs[startsWith(names(coefs), "(scale)_")] names(scale_coefs) <- sub("(scale)_", "", names(scale_coefs), fixed = TRUE) if (length(location_coefs) > 0) { model[["coefficients"]]$location[names(location_coefs)] <- location_coefs } model[["coefficients"]]$scale[names(scale_coefs)] <- scale_coefs model } #' @include get_predict.R #' @rdname get_predict #' @export get_predict.crch <- function(model, newdata = NULL, type = "location", ...) { pred <- stats::predict(model, newdata = newdata, type = type) sanity_predict_vector(pred = pred, model = model, newdata = newdata, type = type) sanity_predict_numeric(pred = pred, model = model, newdata = newdata, type = type) out <- data.frame( rowid = 1:nrow(newdata), estimate = pred) return(out) } #' @include set_coef.R #' @rdname set_coef #' @export set_coef.hxlr <- function(model, coefs, ...) { # in crch::hxlr, coefficients are held in: # model$coefficients$intercept # model$coefficients$location # model$coefficients$scale # # note: there are no prefixes in coef() output, so coefs may have same name out <- model idx_int <- length(model$coefficients$intercept) idx_loc <- length(model$coefficients$location) out$coefficients$intercept[] <- coefs[1:idx_int] out$coefficients$location[] <- coefs[idx_int + 1:idx_loc] out$coefficients$scale[] <- coefs[(idx_int + idx_loc + 1):length(coefs)] return(out) } #' @export #' @noRd get_predict.hxlr <- get_predict.crch marginaleffects/R/get_vcov.R0000644000176200001440000001130314631452335015550 0ustar liggesusers#' Get a named variance-covariance matrix from a model object (internal function) #' #' @inheritParams slopes #' @return A named square matrix of variance and covariances. The names must match the coefficient names. #' @rdname get_vcov #' @keywords internal #' @export get_vcov <- function(model, ...) { UseMethod("get_vcov", model) } #' @rdname get_vcov #' @export get_vcov.default <- function(model, vcov = NULL, ...) { if (isFALSE(vcov)) { return(NULL) } vcov <- sanitize_vcov(model = model, vcov = vcov) if (isTRUE(checkmate::check_matrix(vcov))) { return(vcov) } # {insight} args <- get_varcov_args(model, vcov) args[["x"]] <- model args[["component"]] <- "all" # 1st try: with arguments fun <- get("get_varcov", asNamespace("insight")) out <- myTryCatch(do.call("fun", args)) # 2nd try: without arguments if (!isTRUE(checkmate::check_matrix(out$value, min.rows = 1))) { out <- myTryCatch(insight::get_varcov(model)) if (isTRUE(checkmate::check_matrix(out$value, min.rows = 1))) { msg <- "Unable to extract a variance-covariance matrix using this `vcov` argument. Standard errors are computed using the default variance instead. Perhaps the model or argument is not supported by the `sandwich` ('HC0', 'HC3', ~clusterid, etc.) or `clubSandwich` ('CR0', etc.) packages. If you believe that the model is supported by one of these two packages, you can open a feature request on Github." insight::format_warning(msg) } } if (!isTRUE(checkmate::check_matrix(out$value, min.rows = 1))) { msg <- "Unable to extract a variance-covariance matrix from this model." warning(msg, call. = FALSE) return(NULL) # valid matrix with warning } else if (!is.null(out$warning)) { warning(out$warning$message, call. = FALSE) } out <- out[["value"]] # problem: no row.names if (is.null(row.names(out))) { coefs <- get_coef(model) if (ncol(out) == length(coefs)) { termnames <- names(stats::coef(model)) if (length(termnames) == ncol(out)) { colnames(out) <- termnames row.names(out) <- termnames } } else { return(NULL) } } # problem: duplicate colnames if (anyDuplicated(colnames(out)) == 0) { coefs <- get_coef(model, ...) # 1) Check above is needed for `AER::tobit` and others where `out` # includes Log(scale) but `coef` does not Dangerous for `oridinal::clm` # and others where there are important duplicate column names in # `out`, and selecting with [,] repeats the first instance. # 2) Sometimes out has more columns than coefs if (all(names(coefs) %in% colnames(out))) { out <- out[names(coefs), names(coefs), drop = FALSE] } } return(out) # NOTES: # survival::coxph with 1 regressor produces a vector } #' Take a `summary()` style `vcov` argument and convert it to #' `insight::get_varcov()` #' #' @keywords internal get_varcov_args <- function(model, vcov) { if (is.null(vcov) || isTRUE(checkmate::check_matrix(vcov))) { out <- list() return(out) } if (isTRUE(checkmate::check_formula(vcov))) { out <- list("vcov" = "vcovCL", "vcov_args" = list("cluster" = vcov)) return(out) } if (isTRUE(vcov == "satterthwaite") || isTRUE(vcov == "kenward-roger")) { if (!isTRUE(inherits(model, "lmerMod")) && !isTRUE(inherits(model, "lmerModTest"))) { msg <- 'Satterthwaite and Kenward-Roger corrections are only available for linear mixed effects models.' stop(msg, call. = FALSE) } if (isTRUE(vcov == "satterthwaite")) { return(list()) } else { return(list(vcov = "kenward-roger")) } } out <- switch(vcov, "stata" = list(vcov = "HC2"), "robust" = list(vcov = "HC3"), "bootstrap" = list(vcov = "BS"), "outer-product" = list(vcov = "OPG"), list(vcov = vcov)) return(out) } get_vcov_label <- function(vcov) { if (is.null(vcov)) vcov <- "" if (!is.character(vcov)) return(NULL) out <- switch(vcov, "stata" = "Stata", "robust" = "Robust", "kenward-roger" = "Kenward-Roger", "satterthwaite" = "Satterthwaite", "HC" = , "HC0" = , "HC1" = , "HC2" = , "HC3" = , "HC4" = , "HC4m" = , "HC5" = , "HAC" = , "OPG" = vcov, "NeweyWest" = "Newey-West", "kernHAC" = "Kernel HAC", vcov ) return(out) } marginaleffects/R/get_contrast_data_numeric.R0000644000176200001440000001067014631452335021151 0ustar liggesusersget_contrast_data_numeric <- function(model, newdata, variable, modeldata, ...) { h <- variable[["eps"]] s <- m <- NA if (is.numeric(modeldata[[variable$name]])) { s <- stats::sd(modeldata[[variable$name]], na.rm = TRUE) m <- mean(modeldata[[variable$name]], na.rm = TRUE) } x <- newdata[[variable$name]] xmd <- modeldata[[variable$name]] make_label <- function(lab, val) { if (identical(lab, "custom")) return(lab) args <- append(list(lab), as.list(val)) out <- tryCatch( do.call("sprintf", args), error = function(e) lab) return(out) } # slope # by default variable$value, so we need to check this first slopes <- c( "dY/dX", "eY/eX", "eY/dX", "dY/eX", "mean(dY/dX)", "mean(eY/eX)", "mean(eY/dX)", "mean(dY/eX)") # manual high if (isTRUE(checkmate::check_data_frame(variable$value))) { if (all(c("low", "high") %in% colnames(variable$value))) { low <- variable$value$low high <- variable$value$high } else { low <- variable$value[[1]] high <- variable$value[[2]] } lab <- "manual" } else if (isTRUE(variable$label %in% slopes)) { low <- x - h / 2 high <- x + h / 2 lab <- variable$label } else if (identical(variable$label, "exp(dY/dX)")) { low <- x - h / 2 high <- x + h / 2 lab <- "exp(dY/dX)" # contrast_label is designed for categorical predictors # numeric contrasts first } else if (isTRUE(checkmate::check_numeric(variable$value, len = 1))) { direction <- getOption("marginaleffects_contrast_direction", default = "forward") if (isTRUE(direction == "center")) { low <- x - variable$value / 2 high <- x + variable$value / 2 } else if (isTRUE(direction == "backward")) { low <- x - variable$value high <- x } else { low <- x high <- x + variable$value } # wrap in parentheses, unless mean() because there are already parentheses # important to display ratios of x+1, etc. # label should not be `(mpg+1) - mpg` because that is misleading for centered contrast if (!isTRUE(grepl("mean", variable$label))) { lab <- sprintf("+%s", variable$value) } else { lab <- sprintf("mean(+%s)", variable$value) } } else if (isTRUE(checkmate::check_numeric(variable$value, len = 2))) { variable$value <- sort(variable$value) low <- variable$value[1] high <- variable$value[2] gap <- diff(variable$value) lab <- make_label(variable$label, rev(variable$value)) # character contrasts } else if (identical(variable$value, "sd")) { low <- m - s / 2 high <- m + s / 2 lab <- c("x + sd/2", "x - sd/2") if (!isTRUE(grepl("mean", variable$label))) { lab <- sprintf("(%s)", lab) } lab <- make_label(variable$label, lab) } else if (identical(variable$value, "2sd")) { low <- m - s high <- m + s lab <- c("x + sd", "x - sd") if (!isTRUE(grepl("mean", variable$label))) { lab <- sprintf("(%s)", lab) } lab <- make_label(variable$label, lab) } else if (identical(variable$value, "iqr")) { low <- stats::quantile(xmd, probs = .25, na.rm = TRUE) high <- stats::quantile(xmd, probs = .75, na.rm = TRUE) lab <- make_label(variable$label, c("Q3", "Q1")) } else if (identical(variable$value, "minmax")) { low <- min(xmd, na.rm = TRUE) high <- max(xmd, na.rm = TRUE) lab <- make_label(variable$label, c("Max", "Min")) } else if (isTRUE(checkmate::check_function(variable$value))) { tmp <- variable$value(x) low <- tmp[, 1] high <- tmp[, 2] lab <- "custom" } lo <- hi <- newdata lo[[variable$name]] <- low hi[[variable$name]] <- high out <- list(rowid = seq_len(nrow(newdata)), lo = lo, hi = hi, original = newdata, ter = rep(variable$name, nrow(newdata)), lab = rep(lab, nrow(newdata))) return(out) } marginaleffects/R/methods_flexsurv.R0000644000176200001440000000217414631452335017343 0ustar liggesusers#' @rdname set_coef #' @export set_coef.flexsurvreg <- function(model, coefs, ...) { out <- model out$res[, 1] <- coefs out$coefficients <- coefs return(out) } #' @rdname get_predict #' @export get_predict.flexsurvreg <- function(model, newdata, type, ...) { preds <- stats::predict( object = model, newdata = newdata, type = type, ... ) if (ncol(preds) == 1L) { if (names(preds) == '.pred') { gp <- unlist(lapply(preds$.pred, function(x) {x[, 1, drop = TRUE]})) val <- unlist(lapply(preds$.pred, function(x) {x[, 2, drop = TRUE]})) out <- data.frame( rowid = seq_len(nrow(preds)), group = as.vector(gp), estimate = as.vector(val) ) out$group <- group_to_factor(out$group, model) return(out) } out <- data.frame( rowid = seq_len(nrow(preds)), estimate = as.vector(preds[, 1, drop = TRUE]) ) return(out) } out <- data.frame( rowid = seq_len(nrow(preds)), group = as.vector(preds[, 1, drop = TRUE]), estimate = as.vector(preds[, 2, drop = TRUE]) ) out$group <- group_to_factor(out$group, model) out } marginaleffects/R/sanitize_numderiv.R0000644000176200001440000000176414631452335017505 0ustar liggesuserssanitize_numderiv <- function(numderiv) { checkmate::assert( checkmate::check_choice(numderiv, c("richardson", "fdforward", "fdcenter")), checkmate::check_list(numderiv, min.len = 1) ) if (isTRUE(checkmate::check_string(numderiv))) { numderiv <- list(numderiv) } if (length(numderiv) > 1) { if (numderiv[[1]] %in% c("fdforward", "fdcenter")) { if (any(!names(numderiv)[2:length(numderiv)] %in% "eps")) { stop("The only valid argument for this numeric differentiation method is `eps`.") } } else if (numderiv[[1]] == "richardson") { valid <- c("eps", "d", "zero_tol", "size", "r", "v") if (any(!names(numderiv)[2:length(numderiv)] %in% valid)) { stop(sprintf("The only valid arguments for this numeric differentiation method are: %s. See `?numDeriv::grad` for details.", paste(valid, collapse = ", ")), call. = FALSE) } } } return(numderiv) }marginaleffects/R/sanitize_newdata.R0000644000176200001440000002707014632657667017315 0ustar liggesuserssanitize_newdata_call <- function(scall, newdata = NULL, model, by = NULL) { if (rlang::quo_is_call(scall)) { if (grepl("^datagrid", rlang::call_name(scall))) { if (!"model" %in% rlang::call_args_names(scall)) { scall <- rlang::call_modify(scall, model = model) } } else if (isTRUE(rlang::call_name(scall) == "subset")) { argnames <- rlang::call_args_names(scall) if (!"x" %in% argnames && length(argnames) == 1) { tmp <- get_modeldata(model, additional_variables = by) scall <- rlang::call_modify(scall, x = tmp) } } else if (isTRUE(rlang::call_name(scall) == "filter")) { argnames <- rlang::call_args_names(scall) if (!".data" %in% argnames && length(argnames) == 1) { tmp <- get_modeldata(model, additional_variables = by) scall <- rlang::call_modify(scall, .data = tmp) } } else if (rlang::call_name(scall) %in% "visualisation_matrix") { if (!"x" %in% rlang::call_args_names(scall)) { scall <- rlang::call_modify(scall, x = get_modeldata) } } out <- rlang::eval_tidy(scall) } else { out <- newdata } return(out) } build_newdata <- function(model, newdata, by, modeldata) { if (isTRUE(checkmate::check_data_frame(by))) { by <- setdiff(colnames(by), "by") } else if (isTRUE(checkmate::check_flag(by))) { by <- NULL } args <- list(model = model) for (b in by) { args[[b]] <- unique } newdata_explicit <- TRUE # NULL -> modeldata if (is.null(newdata)) { newdata <- modeldata newdata_explicit <- FALSE # string -> datagrid() } else if (identical(newdata, "mean")) { newdata <- do.call("datagrid", args) } else if (identical(newdata, "median")) { args[["FUN_numeric"]] <- args[["FUN_integer"]] <- args[["FUN_logical"]] <- function(x) stats::median(x, na.rm = TRUE) newdata <- do.call("datagrid", args) } else if (identical(newdata, "tukey")) { args[["FUN_numeric"]] <- function(x) stats::fivenum(x, na.rm = TRUE) newdata <- do.call("datagrid", args) } else if (identical(newdata, "grid")) { args[["FUN_numeric"]] <- function(x) stats::fivenum(x, na.rm = TRUE) args[["FUN_factor"]] <- args[["FUN_character"]] <- args[["FUN_logical"]] <- unique newdata <- do.call("datagrid", args) # grid with all unique values of categorical variables, and numerics at their means } else if (isTRUE(newdata %in% c("balanced", "marginalmeans"))) { args[["grid_type"]] <- "balanced" newdata <- do.call("datagrid", args) # Issue #580: outcome should not duplicate grid rows dv <- hush(insight::find_response(model)) if (isTRUE(dv %in% colnames(newdata))) { newdata[[dv]] <- get_mean_or_mode(newdata[[dv]]) newdata <- unique(newdata) } } if (!inherits(newdata, "data.frame")) { msg <- "Unable to extract the data from model of class `%s`. This can happen in a variety of cases, such as when a `marginaleffects` package function is called from inside a user-defined function, or using an `*apply()`-style operation on a list. Please supply a data frame explicitly via the `newdata` argument." msg <- sprintf(msg, class(model)[1]) insight::format_error(msg) } # otherwise we get a warning in setDT() if (inherits(model, "mlogit") && isTRUE(inherits(modeldata[["idx"]], "idx"))) { modeldata$idx <- NULL } # required by some model-fitting functions data.table::setDT(modeldata) # required for the type of column indexing to follow data.table::setDF(newdata) out <- list( "newdata" = newdata, "newdata_explicit" = newdata_explicit, "modeldata" = modeldata ) return(out) } add_wts_column <- function(wts, newdata, model) { # weights must be available in the `comparisons()` function, NOT in # `tidy()`, because comparisons will often duplicate newdata for # multivariate outcomes and the like. We need to track which row matches # which. if (isFALSE(wts)) { return(newdata) } else if (isTRUE(wts)) { wtsname <- insight::find_weights(model) if (!is.character(wtsname) || length(wtsname) != 1 || !wtsname %in% colnames(newdata)) { msg <- "Unable to retrieve weights automatically from the model. Please specify `wts` argument explicitly." insight::format_error(msg) } else { newdata[["marginaleffects_wts_internal"]] <- newdata[[wtsname]] return(newdata) } } if (!isFALSE(wts)) { flag1 <- isTRUE(checkmate::check_string(wts)) && isTRUE(wts %in% colnames(newdata)) flag2 <- isTRUE(checkmate::check_numeric(wts, len = nrow(newdata))) if (!flag1 && !flag2) { msg <- sprintf("The `wts` argument must be a numeric vector of length %s, or a string which matches a column name in `newdata`. If you did not supply a `newdata` explicitly, `marginaleffects` extracted it automatically from the model object, and the `wts` variable may not have been available. The easiest strategy is often to supply a data frame such as the original data to `newdata` explicitly, and to make sure that it includes an appropriate column of weights, identified by the `wts` argument.", nrow(newdata)) stop(msg, call. = FALSE) } } # weights: before sanitize_variables if (!isFALSE(wts) && isTRUE(checkmate::check_string(wts))) { newdata[["marginaleffects_wts_internal"]] <- newdata[[wts]] } else { newdata[["marginaleffects_wts_internal"]] <- wts } return(newdata) } set_newdata_attributes <- function(model, modeldata, newdata, newdata_explicit) { attr(newdata, "newdata_explicit") <- newdata_explicit # column classes mc <- Filter(function(x) is.matrix(modeldata[[x]]), colnames(modeldata)) cl <- Filter(function(x) is.character(modeldata[[x]]), colnames(modeldata)) cl <- lapply(modeldata[, ..cl], unique) vc <- attributes(modeldata)$marginaleffects_variable_class column_attributes <- list( "matrix_columns" = mc, "character_levels" = cl, "variable_class" = vc) newdata <- set_marginaleffects_attributes(newdata, column_attributes, prefix = "newdata_") # {modelbased} sometimes attaches useful attributes exclude <- c("class", "row.names", "names", "data", "reference") modelbased_attributes <- get_marginaleffects_attributes(newdata, exclude = exclude) newdata <- set_marginaleffects_attributes(newdata, modelbased_attributes, prefix = "newdata_") # original data attr(newdata, "newdata_modeldata") <- modeldata if (is.null(attr(newdata, "marginaleffects_variable_class"))) { newdata <- set_variable_class(newdata, model = model) } return(newdata) } clean_newdata <- function(model, newdata) { # rbindlist breaks on matrix columns idx <- sapply(newdata, function(x) class(x)[1] == "matrix") if (any(idx)) { # Issue #363 # unpacking matrix columns works with {mgcv} but breaks {mclogit} if (inherits(model, "gam")) { newdata <- unpack_matrix_cols(newdata) } else { newdata <- newdata[, !idx, drop = FALSE] } } # we will need this to merge the original data back in, and it is better to # do it in a centralized upfront way. if (!"rowid" %in% colnames(newdata)) { newdata$rowid <- seq_len(nrow(newdata)) } # mlogit: each row is an individual-choice, but the index is not easily # trackable, so we pre-sort it here, and the sort in `get_predict()`. We # need to cross our fingers, but this probably works. if (inherits(model, "mlogit") && isTRUE(inherits(newdata[["idx"]], "idx"))) { idx <- list(newdata[["idx"]][, 1], newdata[["idx"]][, 2]) newdata <- newdata[order(newdata[["idx"]][, 1], newdata[["idx"]][, 2]), ] } # placeholder response resp <- insight::find_response(model) if (isTRUE(checkmate::check_character(resp, len = 1)) && !resp %in% colnames(newdata)) { y <- hush(insight::get_response(model)) # protect df or matrix response if (isTRUE(checkmate::check_atomic_vector(y))) { newdata[[resp]] <- y[1] } } return(newdata) } sanitize_newdata <- function(model, newdata, by, modeldata, wts) { if (!identical(newdata, "marginalmeans")) { # soft deprecation trick checkmate::assert( checkmate::check_data_frame(newdata, null.ok = TRUE), checkmate::check_choice(newdata, choices = c("mean", "median", "tukey", "grid", "balanced")), combine = "or") } tmp <- build_newdata(model = model, newdata = newdata, by = by, modeldata = modeldata) newdata <- tmp[["newdata"]] modeldata <- tmp[["modeldata"]] newdata_explicit <- tmp[["newdata_explicit"]] newdata <- clean_newdata(model, newdata) if (is.null(wts)) wts <- FALSE newdata <- add_wts_column(newdata = newdata, wts = wts, model = model) newdata <- set_newdata_attributes( model = model, modeldata = modeldata, newdata = newdata, newdata_explicit = newdata_explicit) # # sort rows of output when the user explicitly calls `by` or `datagrid()` # # otherwise, we return the same data frame in the same order, but # # here it makes sense to sort for a clean output. # sortcols <- attr(newdata, "newdata_variables_datagrid") # if (isTRUE(checkmate::check_character(by))) { # sortcols <- c(by, sortcols) # } # sortcols <- intersect(sortcols, colnames(newdata)) out <- data.table::copy(newdata) # if (length(sortcols) > 0) { # data.table::setorderv(out, cols = sortcols) # } # return(out) } dedup_newdata <- function(model, newdata, by, wts, comparison = "difference", cross = FALSE, byfun = NULL) { # issue #1113: elasticities should skip dedup because it is difficult to align x and y elasticities <- c("eyexavg", "eydxavg", "dyexavg") if (isTRUE(checkmate::check_choice(comparison, elasticities))) { return(data.table(newdata)) } elasticities <- c("eyex", "eydx", "dyex") if (!isFALSE(by) && isTRUE(checkmate::check_choice(comparison, elasticities))) { return(data.table(newdata)) } flag <- isTRUE(checkmate::check_string(comparison, pattern = "avg")) if (!flag && ( isFALSE(by) || # weights only make sense when we are marginalizing !isFALSE(wts) || !is.null(byfun) || !isFALSE(cross) || isFALSE(getOption("marginaleffects_dedup", default = TRUE)))) { return(newdata) } vclass <- attr(newdata, "marginaleffects_variable_class") # copy to allow mod by reference later without overwriting newdata out <- data.table(newdata) dv <- hush(unlist(insight::find_response(model), use.names = FALSE)) if (isTRUE(checkmate::check_string(dv)) && dv %in% colnames(out)) { out[, (dv) := NULL] vclass <- vclass[names(vclass) != dv] } if ("rowid" %in% colnames(out)) { out[, "rowid" := NULL] } categ <- c("factor", "character", "logical", "strata", "cluster", "binary") if (!all(vclass %in% categ)) { return(newdata) } cols <- colnames(out) out <- out[, .("marginaleffects_wts_internal" = .N), by = cols] data.table::setDF(out) out[["rowid_dedup"]] <- seq_len(nrow(out)) attr(out, "marginaleffects_variable_class") <- vclass return(out) } marginaleffects/R/bootstrap_rsample.R0000644000176200001440000000473514631452335017507 0ustar liggesusersbootstrap_rsample <- function(model, INF_FUN, ...) { # attached by `inferences()` conf_type <- attr(model, "inferences_conf_type") checkmate::assert_choice(conf_type, choices = c("perc", "bca")) # attached by `inferences()` conf_type <- attr(model, "inferences_conf_type") checkmate::assert_choice(conf_type, choices = c("perc", "norm", "basic", "bca")) # bootstrap using the original data and call modcall <- insight::get_call(model) modeldata <- get_modeldata(model, additional_variables = FALSE) data.table::setDF(modeldata) # evaluate the {marginaleffects} call to get output without inferences() # use ... because arguments are not the same for different {marginaleffects} functions dots <- list(...) dots[["vcov"]] <- FALSE # avoid recursion attr(model, "inferences_method") <- NULL out <- do.call(INF_FUN, c(list(model), dots)) # default confidence level may be implicit in original call, but we need numeric if (is.null(dots[["conf_level"]])) { conf_level <- 0.95 } else { conf_level <- dots[["conf_level"]] } bootfun <- function(data, ...) { modcall[["data"]] <- data modboot <- eval(modcall) modboot <- eval(modboot) args <- c(list(modboot, modeldata = data$data), dots) out <- do.call(INF_FUN, args) out <- tidy(out) # `rsample` averages by `term` columns; we don't use it anyway and assume things line up out$term <- seq_len(nrow(out)) return(out) } args <- attr(model, "inferences_dots") args[["data"]] <- modeldata args[["apparent"]] <- TRUE # require for "bca" splits <- do.call(rsample::bootstraps, args) splits$estimates <- lapply(splits$splits, bootfun) if (isTRUE(conf_type == "bca")) { ci <- rsample::int_bca( splits, statistics = estimates, .fn = bootfun, alpha = 1 - conf_level) } else { ci <- rsample::int_pctl( splits, statistics = estimates, alpha = 1 - conf_level) } out$conf.low <- ci$.lower out$conf.high <- ci$.upper attr(out, "inferences") <- splits draws <- lapply(splits$estimates, function(x) as.matrix(x[, "estimate", drop = FALSE])) draws[[length(draws)]] <- NULL # apparent=TRUE appended the original estimates to the end draws <- do.call("cbind", draws) colnames(draws) <- NULL attr(out, "posterior_draws") <- draws return(out) } marginaleffects/R/conformal.R0000755000176200001440000001003314631452335015716 0ustar liggesusersget_conformal_score <- function(x, score) { response_name <- insight::find_response(attr(x, "model")) response <- x[[response_name]] if (!is.numeric(response) && score != "softmax") { insight::format_error('The response must be numeric. Did you want to use `conformal_score="softmax"`?') } if (score == "residual_abs") { out <- abs(response - x$estimate) } else if (score == "residual_sq") { out <- (response - x$estimate)^2 } else if(score == "softmax") { model <- attr(x, "model") response <- x[[insight::find_response(model)]] if (is.numeric(response) && is_binary(response)) { # See p.4 of Angelopoulos, Anastasios N., and Stephen Bates. 2022. “A # Gentle Introduction to Conformal Prediction and Distribution-Free # Uncertainty Quantification.” arXiv. # https://doi.org/10.48550/arXiv.2107.07511. # 1 minus the softmax output of the true class out <- ifelse(response == 1, 1 - x$estimate, x$estimate) } else if ("group" %in% colnames(x)) { # HACK: is this fragile? I think `group` should always be character. idx <- as.character(response) == as.character(x$group) out <- 1 - x$estimate[idx] } else { insight::format_error("Failed to compute the conformity score.") } } return(out) } get_conformal_bounds <- function(x, score, conf_level) { model <- attr(x, "model") response_name <- insight::find_response(model) response <- x[[response_name]] d <- min(score[score > stats::quantile(score, probs = conf_level)]) if ("group" %in% colnames(x)) { q <- stats::quantile(score, probs = (length(score) + 1) * conf_level / length(score)) out <- x[x$estimate > (1 - q),] data.table::setDT(out) out <- out[, .(pred.set = list(unique(group))), by = c("rowid", response_name)] setorder(out, rowid) data.table::setDF(out) class(out) <- c("predictions", class(out)) attr(out, "variables_datagrid") <- response_name return(out) } else { # continuous outcome: conformity half-width x$pred.low <- x$estimate - d x$pred.high <- x$estimate + d } return(x) } conformal_split <- function(x, test, calibration, score, conf_level, ...) { # calibration # use original model---fitted on the training set---to make predictions in the calibration set # p_calib is the `predictions()` call, which we re-evaluate on newdata=calibration p_calib <- attr(x, "call") p_calib[["newdata"]] <- calibration p_calib[["vcov"]] <- FALSE # faster p_calib <- eval(p_calib) score <- get_conformal_score(p_calib, score = score) # test # use original model to make predictions in the test set p_test <- attr(x, "call") p_test[["newdata"]] <- test p_test <- eval(p_test) # bounds out <- get_conformal_bounds(p_test, score = score, conf_level = conf_level) return(out) } conformal_cv_plus <- function(x, test, R, score, conf_level, ...) { # cross-validation train <- get_modeldata(attr(x, "model")) idx <- sample(seq_len(nrow(train)), nrow(train)) idx <- split(idx, ceiling(seq_along(idx) / (length(idx) / R))) scores <- NULL for (i in idx) { data_cv <- train[-i,] # re-fit the original model on training sets withholding the CV fold model_cv <- stats::update(attr(x, "model"), data = data_cv) # use the updated model to make out-of-fold predictions # call_cv is the `predictions()` call, which we re-evaluate in-fold: newdata=train[i,] call_cv <- attr(x, "call") call_cv[["model"]] <- model_cv call_cv[["newdata"]] <- train[i,] call_cv[["vcov"]] <- FALSE # faster pred_cv <- eval(call_cv) # save the scores form each fold scores <- c(scores, get_conformal_score(pred_cv, score = score)) } # test out <- attr(x, "call") out[["newdata"]] <- test out <- eval(out) # bounds out <- get_conformal_bounds(out, score = scores, conf_level = conf_level) return(out) } marginaleffects/src/0000755000176200001440000000000014632712537014205 5ustar liggesusersmarginaleffects/src/RcppExports.cpp0000644000176200001440000000224014632674171017201 0ustar liggesusers// Generated by using Rcpp::compileAttributes() -> do not edit by hand // Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 #include #include using namespace Rcpp; #ifdef RCPP_USE_GLOBAL_ROSTREAM Rcpp::Rostream& Rcpp::Rcout = Rcpp::Rcpp_cout_get(); Rcpp::Rostream& Rcpp::Rcerr = Rcpp::Rcpp_cerr_get(); #endif // eigenMatMult SEXP eigenMatMult(const Eigen::Map A, Eigen::Map B); RcppExport SEXP _marginaleffects_eigenMatMult(SEXP ASEXP, SEXP BSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< const Eigen::Map >::type A(ASEXP); Rcpp::traits::input_parameter< Eigen::Map >::type B(BSEXP); rcpp_result_gen = Rcpp::wrap(eigenMatMult(A, B)); return rcpp_result_gen; END_RCPP } static const R_CallMethodDef CallEntries[] = { {"_marginaleffects_eigenMatMult", (DL_FUNC) &_marginaleffects_eigenMatMult, 2}, {NULL, NULL, 0} }; RcppExport void R_init_marginaleffects(DllInfo *dll) { R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } marginaleffects/src/eigen.cpp0000644000176200001440000000033214631452336015773 0ustar liggesusers// [[Rcpp::depends(RcppEigen)]] #include // [[Rcpp::export]] SEXP eigenMatMult(const Eigen::Map A, Eigen::Map B){ Eigen::VectorXd C = A * B; return Rcpp::wrap(C); } marginaleffects/NAMESPACE0000644000176200001440000001316314631452335014635 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method(coef,comparisons) S3method(coef,hypotheses) S3method(coef,marginalmeans) S3method(coef,predictions) S3method(coef,slopes) S3method(get_coef,afex_aov) S3method(get_coef,betareg) S3method(get_coef,bracl) S3method(get_coef,brmsfit) S3method(get_coef,brmultinom) S3method(get_coef,data.frame) S3method(get_coef,default) S3method(get_coef,gam) S3method(get_coef,gamlss) S3method(get_coef,glmmTMB) S3method(get_coef,lmerMod) S3method(get_coef,lmerModLmerTest) S3method(get_coef,mblogit) S3method(get_coef,merMod) S3method(get_coef,mlm) S3method(get_coef,multinom) S3method(get_coef,nls) S3method(get_coef,polr) S3method(get_coef,scam) S3method(get_coef,selection) S3method(get_coef,svyolr) S3method(get_coef,workflow) S3method(get_group_names,bracl) S3method(get_group_names,brmsfit) S3method(get_group_names,clm) S3method(get_group_names,default) S3method(get_group_names,hurdle) S3method(get_group_names,mblogit) S3method(get_group_names,mlm) S3method(get_group_names,multinom) S3method(get_group_names,polr) S3method(get_group_names,svyolr) S3method(get_mean_or_mode,character) S3method(get_mean_or_mode,data.frame) S3method(get_mean_or_mode,default) S3method(get_mean_or_mode,factor) S3method(get_mean_or_mode,logical) S3method(get_model_matrix,default) S3method(get_predict,Learner) S3method(get_predict,MCMCglmm) S3method(get_predict,afex_aov) S3method(get_predict,bart) S3method(get_predict,betareg) S3method(get_predict,bife) S3method(get_predict,biglm) S3method(get_predict,brmsfit) S3method(get_predict,brmultinom) S3method(get_predict,clm) S3method(get_predict,coxph) S3method(get_predict,crch) S3method(get_predict,default) S3method(get_predict,fixest) S3method(get_predict,flexsurvreg) S3method(get_predict,gamlss) S3method(get_predict,glimML) S3method(get_predict,glm) S3method(get_predict,glmmPQL) S3method(get_predict,glmmTMB) S3method(get_predict,hxlr) S3method(get_predict,lm) S3method(get_predict,lmerMod) S3method(get_predict,lmerModLmerTest) S3method(get_predict,lrm) S3method(get_predict,mblogit) S3method(get_predict,merMod) S3method(get_predict,mhurdle) S3method(get_predict,mlogit) S3method(get_predict,model_fit) S3method(get_predict,multinom) S3method(get_predict,ols) S3method(get_predict,orm) S3method(get_predict,polr) S3method(get_predict,rlmerMod) S3method(get_predict,rms) S3method(get_predict,rq) S3method(get_predict,stanreg) S3method(get_predict,svyglm) S3method(get_predict,svyolr) S3method(get_predict,tobit1) S3method(get_predict,workflow) S3method(get_vcov,Learner) S3method(get_vcov,MCMCglmm) S3method(get_vcov,afex_aov) S3method(get_vcov,bart) S3method(get_vcov,biglm) S3method(get_vcov,brmsfit) S3method(get_vcov,default) S3method(get_vcov,gamlss) S3method(get_vcov,glimML) S3method(get_vcov,glmmTMB) S3method(get_vcov,mhurdle) S3method(get_vcov,model_fit) S3method(get_vcov,orm) S3method(get_vcov,scam) S3method(get_vcov,workflow) S3method(glance,comparisons) S3method(glance,hypotheses) S3method(glance,marginaleffects_mids) S3method(glance,marginalmeans) S3method(glance,predictions) S3method(glance,slopes) S3method(knitr::knit_print,comparisons) S3method(knitr::knit_print,hypotheses) S3method(knitr::knit_print,marginaleffects) S3method(knitr::knit_print,predictions) S3method(knitr::knit_print,slopes) S3method(plot,comparisons) S3method(plot,predictions) S3method(plot,slopes) S3method(print,comparisons) S3method(print,hypotheses) S3method(print,marginaleffects) S3method(print,predictions) S3method(print,slopes) S3method(sanitize_model_specific,bart) S3method(sanitize_model_specific,brmsfit) S3method(sanitize_model_specific,mblogit) S3method(sanitize_model_specific,merMod) S3method(sanitize_model_specific,svyglm) S3method(sanitize_model_specific,svyolr) S3method(set_coef,afex_aov) S3method(set_coef,betareg) S3method(set_coef,crch) S3method(set_coef,data.frame) S3method(set_coef,default) S3method(set_coef,flexsurvreg) S3method(set_coef,gamlss) S3method(set_coef,glimML) S3method(set_coef,glm) S3method(set_coef,glmmPQL) S3method(set_coef,glmmTMB) S3method(set_coef,glmx) S3method(set_coef,hetprob) S3method(set_coef,hurdle) S3method(set_coef,hxlr) S3method(set_coef,ivpml) S3method(set_coef,lm) S3method(set_coef,lme) S3method(set_coef,lmerMod) S3method(set_coef,lmerModLmerTest) S3method(set_coef,merMod) S3method(set_coef,mlm) S3method(set_coef,model_fit) S3method(set_coef,multinom) S3method(set_coef,nls) S3method(set_coef,polr) S3method(set_coef,rlmerMod) S3method(set_coef,scam) S3method(set_coef,selection) S3method(set_coef,survreg) S3method(set_coef,svyolr) S3method(set_coef,tobit) S3method(set_coef,workflow) S3method(set_coef,zeroinfl) S3method(tidy,comparisons) S3method(tidy,hypotheses) S3method(tidy,marginaleffects_mids) S3method(tidy,marginalmeans) S3method(tidy,predictions) S3method(tidy,slopes) S3method(vcov,comparisons) S3method(vcov,hypotheses) S3method(vcov,marginalmeans) S3method(vcov,predictions) S3method(vcov,slopes) export(avg_comparisons) export(avg_predictions) export(avg_slopes) export(comparisons) export(datagrid) export(datagridcf) export(deltamethod) export(expect_margins) export(expect_predictions) export(expect_slopes) export(get_coef) export(get_group_names) export(get_model_matrix) export(get_predict) export(get_vcov) export(glance) export(hypotheses) export(inferences) export(marginal_means) export(marginaleffects) export(marginalmeans) export(meffects) export(plot_comparisons) export(plot_predictions) export(plot_slopes) export(posterior_draws) export(posteriordraws) export(predictions) export(set_coef) export(slopes) export(specify_hypothesis) export(tidy) import(data.table) importFrom(Rcpp,evalCpp) importFrom(generics,glance) importFrom(generics,tidy) useDynLib(marginaleffects) marginaleffects/NEWS.md0000644000176200001440000011734614632712433014523 0ustar liggesusers# News ## 0.21.0 New: * `hypothesis` accepts formulas like: `ratio ~ sequential | group` * Allow reverse binary contrasts: comparisons(mod, variables = list(am = 1:0, vs = 0:1)). Thanks to K. Henry for report #1137. * `options(marginaleffects_safe = FALSE)` disables some safety checks and allows unadvisable (but potentially) useful features like *many* pairwise comparisons. Thanks to D.Locke for the feature request. * `newdata="balanced"` is a shortcut to produce estimates at combinations of all categorical predictors, holding numeric predictors at their means. Equivalent to `datagrid(grid_type="balanced")` Misc: * Deprecation warning for `specify_hypothesis()`. This function was clearly marked as experimental, and has been available only for one release. It was a bad idea. Users should supply a custom function or a formula to the `hypothesis` argument. The new formula interface, in particular, makes it very easy to conduct group-wise hypothesis tests. Bugs: * Fix regression in `mlogit` models due to factor conversion. This raised an error before returning result, so there is no numerical danger. * `survey` package models work when `row.names(model)` is not coercible to integers. Thanks to @ngreifer for report #1131. ## 0.20.1 * The `comparison` argument of the `comparisons()` function is automatically switched to the `avg` version of the function shortcuts when calling `avg_comparisons()` or setting `by=TRUE`. For example, `comparison="ratio"` becomes `comparison="ratioavg"` when calling `avg_comparisons()`. Note that `comparison="ratioavg"` is equivalent to: `comparison = \(hi,lo) mean(hi)/mean(lo)` * Fixed a bug ("non-conformable arguments") when using `survreg` objects from `survival::survreg()`. * Fixed bug in `inferences()` for GLM models and `type="invlink"`, where the wrong scale would be reported for confidence intervals. ## 0.20.0 Breaking changes: * The order of the `group` column is preserved when the original variable is a factor. This may change the order of output, which could have an effect on hypothesis tests using the `hypothesis="b1=b3"` syntax. New: * New *experimental* function: `specify_hypothesis()` returns functions to be used in the `hypothesis` argument of `predictions()`, `comparisons()`, and `slopes()`. This convenience function can be used to specify complex aggregations and estimands for hypothesis tests (ex: by subgroups or with custom functions). * `hypothesis` argument accepts "meandev" and "meanotherdev" to compute deviations from the mean estimate. * Do not raise extraneous warning for `survey` package models when the `by` argument is not used. * Informative error when `hypotheses()` is called twice on the same object. * `print("tinytable")` adds footnotes to the table with columns and type information. Bugs: * `mlogit` `predict()` method does not play well with `data.table`. Thanks to @andrewheiss for report #1086. * Avoid merging `newdata` in `predictions()` when `hypothesis` can change the meaning of rows. Avoid Issue #1105 reported by @strengejacke. * `inferences()` did not work with the `transform` argument. Thanks to Demetri Pananos for report #1115. ## 0.19.0 Breaking changes: * `datagrid()` no longer includes the response variable by default when it is not explicitly specified by the user. Use the new `response` argument to include it. * `datagrid(grid_type="balanced")` returns factors ordered by level rather than by order of appearance in the original data. * Order of some rows in the output may differ when using `datagrid()`. Necessary to fix issue #1079 (see below). New modeling packages supported: * `flexsurv`: Thanks to @mattwarkentin for code contributions in PR #781. https://cran.r-project.org/web/packages/flexsurv/index.html * `REndo`: https://cran.r-project.org/web/packages/REndo/index.html New: * `wts=TRUE` tries to retrieves weights used in a weighted fit such as `lm()` with the `weights` argument or a model fitted using the `survey` package. Thanks to @ngreifer for feature request * `print.marginaleffects()` supports `style="tinytable"`, which returns a `tinytable` object. Call `print(avg_slopes(model))` to get a nice printed table in Quarto or Rmarkdown documents, via Typst, LaTeX or HTML. Default print format can be set using: `options(marginaleffects_print_style="tinytable")` * `hypothesis` argument accepts a function which takes a `marginaleffects` data frame and returns a transformed data frame with `term` and `estimate` columns. * `datagrid()` gets a `response` argument (default is `FALSE`) to control if the response variable is included or excluded from the grid-building process. * The `base::subset()` and `dplyr::filter()` functions can be called with a single argument in `newdata` to select a subset of rows from the dataset used to fit the model. - Ex: avg_comparisons(fit, variables = "treatment", newdata = subset(treatment == 1))` * Better warning for unsupported arguments. * `df` argument in `hypotheses()` accepts a vector of length 2 to control degrees of freedom in F tests. * `nlme::lme()` objects raise a warning about degrees of freedom. Thanks to and @stefgehrig and @huftis for discussion in Issue #960. Major bugs: * Some results could be mislabelled with factor variables used in combination with `datagrid()` or `condition`. Thanks to @snhansen for report #1079. * `glmmTMB` models now report correct standard errors, and raise a warning that these standard errors only account for uncertainty in fixed effect parameters. Thanks to contributors to Issue #1024 and especially to @bbolker for discussion and solution. Minor bugs: * Uninformative error when a custom `comparison` function returns `NA` in bayesian models. Thanks to @Sandhu-SS for report #1017. * `datagrid()` returns an object with full attributes when `by` is used. Thanks to @Sandhu-SS for report #1058. * `inferences(method="simulation")` with `inferences()` function. Thanks to @davidarmstrong for report #1054. ## 0.18.0 This release represents a major step towards 1.0.0. Some functions are renamed and now raise deprecation warnings. After 1.0.0, the API will become much more stable, and any change will have to be very deliberate with much lead time and deprecation delays. Breaking changes: * `tidy()` no longer takes the average of estimates in the original model object. Users who want an aggregate estimate should call the relevant `avg_*()` function, or use the `by` argument explicitly. The previous behavior led to unexpected behavior and increased code complexity a lot. * `summary()` methods are removed. These have never provided any additional information; they just reprinted the output already available with the standard print method. At least the default `summary()` for data frames (which is now triggered on `marginaleffects` object) provides a different view on the content of the object. * `plot_cco()`, `plot_cme()`, and `plot_cap()` were renamed in version 0.9.0, one year ago. They are now fully removed from the package. New: * `datagrid(grid_type = "balanced")` creates a balanced grid with all unique values of categorical predictors. This can be used with `predictions()` to compute marginal means as in the `emmeans` package. * `mvgam` package support (multivariate generalized additive models) Deprecation warnings: * `deltamethod()` has been named `hypotheses()` for a while. We now issue a deprecation warning and it will be removed eventually. * `datagridcf()` will eventually be deprecated and removed from the package. We will raise a warning for at least one year before removing the function. Identical results can be obtained with `datagrid(..., grid_type="counterfactual")` * `marginal_means()` will eventually be deprecated and removed from the package. We will raise a warning for at least one year before removing the function. Identical results can be obtained using the `predictions()` function and the `grid_type="balanced"` argument of `datagrid()`. Examples are in the marginal means vignette on the website. Minor: * Better warning messages for unsupported matrix columns, enhancing user experience and troubleshooting. * Various improvements to documentation. * Typos * Repository hosts model objects for easier testing. Bug fixes: * Error on `hypotheses(joint = "string")` for `comparisons()` objects (no result was returned). Thanks to @BorgeJorge for report #981. * Enhanced support for multi-equation Bayesian models with `brms` models. Thanks to @winterstat for report #1006. * Parameter names with spaces could break standard errors. Thanks to @Lefty2021 for report #1005. ## 0.17.0 Breaking changes: * The `comparisons()` now uses "forward contrasts" by default for numeric predictors, instead of "centered contrasts". This can lead to small numerical differences in non-linear models. * The `variables` argument of the `comparisons()` function no longer accepts numeric vectors unless they are of length 2, specifying the low and high contrast values. This is to avoid ambiguity between the two vector version. Users should supply a data frame or a function instead. This is nearly as easy, and removes ambiguity. New supported packages: * `dbarts`: https://cran.r-project.org/package=dbarts * `mvgam`: https://nicholasjclark.github.io/mvgam/ Not available on CRAN yet, but this package maintains its own `marginaleffects` support function. * `rms::Gls`: https://cran.r-project.org/package=rms Misc: * `comparisons()`: The `variables` argument now accepts functions and data frames for factor, character, and logical variables. * Deprecation warning for: `plot_cap()`, `plot_cme()`, and `plot_cco()`. These function names will be removed in version 1.0.0. * `options(modelsummary_factory_default=...)` is respected in Quarto and Rmarkdown documents. Bugs: * `wts` argument now respected in `avg_slopes()` for binary variables. Thanks to @trose64 for report #961 * Custom functions in the `comparison` argument of `comparisons()` did not supply the correct `x` vector length for bayesian models when the `by` argument is used. Thanks to @Sandhu-SS for report #931. * Add support for two facet variables (through `facet_grid`) when plotting using `condition` * `comparisons()`: When `variables` is a vector of length two and `newdata` has exactly two columns, there was ambiguity between custom vectors and length two vector of contrasts. Bug reported by C. Rainey on Twitter. * Superfluous warning with `fixest::fenegbin`. ## 0.16.0 Machine learning support: * `tidymodels` package * `mlr3` package Misc: * New vignettes: - Inverse Probability Weighting - Machine Learning - Matching * Add support for `hypotheses()` to `inferences()`. Thanks to @Tristan-Siegfried for code contribution #908. * Support `survival::survreg()`. Thanks to Carlisle Rainey for Report #911. * `column_names` argument in `print.marginaleffects()` to suppress the printed column names at the bottom of the printout. * The function supplied to the `comparison` argument of the `comparisons()` function can now operate on `x` and on `newdata` directly (e.g., to check the number of observations). * More informative errors from `predict()`. Bugs: * Some `gamlss` models generated an error related to the `what` argument. Thanks to @DHLocke for Issue #933 ## 0.15.1 * `hypotheses()`: The `FUN` argument handles `group` columns gracefully. * Native support for `Amelia` for multiple imputation. Documentation: * New section on "Complex aggregations" in the Hypothesis testing vignette. Bug fix: * Results of the `predictions()` function could be inaccurate when (a) running version 0.15.0, (b) `type` is `NULL` or `invlink(link)`, (c) model is `glm()`, and (d) the `hypothesis` argument is non-numeric. Thanks to @strengejacke for report [#903](https://github.com/vincentarelbundock/marginaleffects/issues/903) ## 0.15.0 New: * Conformal prediction via `inferences()` * `hypothesis` argument now accepts multiple string formulas. * The `type` argument now accepts an explicit `invlink(link)` value instead of silently back-transforming. Users are no longer pointed to `type_dictionary`. Instead, they should call their function with a bad `type` value, and they will obtain a list of valid types. The default `type` value is printed in the output. This is useful because the default `type` value is `NULL`, so the user often does not explicitly decide. * Allow install with Rcpp 1.0.0 and greater. Support new models: * `survey::svyolr()` Misc: * `inferences(method="simulation")` uses the original point estimate rather than the mean of the simulation distribution. Issue #851. * Better documentation and error messages for `newdata=NULL` * Some performance improvements for `predictions()` and `marginalmeans()` (#880, #882, @etiennebacher). Bug fix: * `newdata="median"` returned mean of binary variables. Thanks to @jkhanson1970 for report #896. ## 0.14.0 Breaking changes: * Row order of the output changes for some objects. Rows are not sorted alphabetically by `term`, `by`, and variables explicitly supplied to `datagrid`. This can affect hypothesis tests computed using the b1, b2, b3, and other indices. * New procedure `numderiv` argument use a different procedure to select the step size used in the finite difference numeric derivative used to compute standard errors: abs(x) * sqrt(.Machine$double.eps). The numerical results may not be exactly identical to previous versions of `marginaleffects`, but the step size should be adequate in a broader variety of cases. Note that users can use the `numderiv` argument for more control on numeric differentiation, as documented. * `bife` models are no longer supported pending investigation in weird results in the tests. Looking for volunteers write more thorough tests. New: * Support: `logistf` package. * Support: `DCchoice` package. * Support: `stats::nls` * `hypotheses()` can now accept raw data frame, which gives a lot of flexibility for custom contrasts and functions. See the Hypothesis vignette for an example. * `numderiv` argument allows users to use finite difference (center or forward) or Richardson's method to compute the numerical derivatives used in the calculation of standard errors. Bug fixes: * `inferences()` supports the `cross` argument for `comparisons()` objects. Thanks to Kirill Solovev for report #856. * `splines::bs()` in formulas could produce incorrect results due to weirdness in `stats::model.matrix()`. Thanks to @chiungming for report #831. * `mgcv` with `ocat` are now supported. Thanks to Lorenzo Fabbri for Issue #844. * `quantreg` problem with `rowid` merge did not affect estimates but did not return the full original data. Issue #829. * `get_modeldata()` extracts weights variable when available. * `predictions()` is no longer broken in some `inferences()` calls. Issue #853 * Inaccurate averaging with `comparison=differenceavg` some models where all predictors are categorical. Thanks to Karl Ove Hufthammer for report #865. Misc: * Major refactor to simplify the code base and make maintenance easier. ## 0.13.0 Breaking change: * `glmmTMB`: Standard errors are no longer supported because they may have been erroneous. Follow Issue #810 on Github for developments: https://github.com/vincentarelbundock/marginaleffects/issues/810 New: * `hypothesis` argument accepts wildcards: `hypothesis = "b*=b1"` * `s.value` column in all output: Shannon transforms for p values. See Greenland (2019). * `marginal_means` supports `mira` (`mice` objects). * `comparisons()`: The `variables` arguments now accepts arbitrary numeric vectors of length equal to the number of rows in `newdata`. This allows users to specify fully custom treatment sizes. In the documentation examples, we show how to estimate the difference for a 1 standard deviation shift in a regressor, where the standard deviation is calculated on a group-wise basis. * `comparisons()`: the `variables` argument now accepts "revpairwise", "revsequential", "revreference" for factor and character variables. * `comparisons()`: the `comparison` argument now accept "lift" and "liftavg". Performance: * Computing elasticities for linear models is now up to 30% faster (#787, @etiennebacher). Bug fixes: * Better handling of environments when `newdata` is a function call. Thanks to @jcccf for report #814 and to @capnrefsmmat for the proposed fix using the `rlang` package. * Degrees of freedom mismatch for joint hypothesis tests. Thanks to @snhansen for report #789. ## 0.12.0 Breaking change: * Row order of output has changed for many calls, especially those using the `by` argument. This may break hypothesis tests conducted by indexing `b1`, `b2`, etc. This was necessary to fix Issue #776. Thanks to @marcora for the report. New: * `hypotheses()`: Joint hypothesis tests (F and Chi-square) with the `joint` and `joint_test` arguments. * `vcov.hypotheses` method. * `wts` is now available in `plot_predictions()`, `plot_comparisons()`, and `plot_slopes()`. Bug: * Wrong order of rows in bayesian models with `by` argument. Thanks to @shirdekel for report #782. ## 0.11.2 * `vcov()` and `coef()` methods for `marginaleffects` objects. * Strings in `wts` are accepted with the `by` argument. * `predictions()` and `avg_predictions()` no longer use an automatic backtransformation for GLM models unless `hypothesis` is `NULL`. * `vcov()` can be used to retrieve a full variance-covariance matrix from objects produced by `comparisons()`, `slopes()`, `predictions()`, or `marginal_means()` objects. * When processing objects obtained using `mice` multiple imputation, the pooled model using `mice::pool` is attached to the `model` attribute of the output. This means that functions like `modelsummary::modelsummary()` will not erroneously report goodness-of-fit statistics from just a single model and will instead appropriately report the statistics for the pooled model. Thanks to @Tristan-Siegfried for PR #740. * More informative error messages on some prediction problems. Thanks to @andymilne for Report #751. Performance: * `inferences()` is now up to 17x faster and much more memory-efficient when `method` is `"boot"` or `"rsample"` (#770, #771, @etiennebacher). Bugs: * `brms` models with `nl=TRUE` and a single predictor generated an error. Thanks to @Tristan-Siegried for Report #759. * `avg_predictions()`: Incorrect group-wise averaging when all predictors are categorical, the `variables` variable is used, and we are averaging with `avg_` or the `by` argument. Thanks to BorgeJorge for report #766. * Bug when `datagrid()` when called inside a user-written function. Thanks to @NickCH-K for report #769 and to @capnrefsmmat for the diagnostics. ## 0.11.1 Breaking change: * Row orders are now more consistent, but may have changed from previous version. This could affect results from `hypothesis` with `b1`, `b2`, ... indexing. Support new models: * `nlme::lme()` * `phylolm::phylolm()` * `phylolm::phyloglm()` New: * Vignette on 2x2 experimental designs. Thanks to Demetri Pananos. * `comparisons()` accepts data frames with two numeric columns ("low" and "high") to specify fully customizable contrasts. * `datagrid()` gets a new `by` argument to create apply grid-making functions within groups. * `plot_*()` gain a `newdata` argument for use with `by`. Bug: * `comparisons(comparison = "lnratioavg")` ignored `wts` argument. Thanks to Demetri Pananos for report #737. * `ordinal::clm()`: incorrect standard errors when location and scale parameters are the same. Thanks to MrJerryTAO for report #718. * Incorrect label for "2sd" comparisons. Thanks to Andy Milne for report #720. * Invalid factor levels in `datagrid()` means `newdata` argument gets ignored. Thanks to Josh Errickson for report #721. * Error in models with only categorical predictors and the `by` argument. Thanks to Sam Brilleman for report #723. * Elasticities are now supported for `ordinal::clm()` models. Thanks to MrJerryTAO for report #729. * `glmmTMB` models with zero-inflated components are supported. Thanks to @Helsinki-Ronan and @strengejacke for report #734. ## 0.11.0 Breaking changes: * `type` column is replaced by `type` attribute. * `predictions()` only works with officially supported model types (same list as `comparisons()` and `slopes()`). Renamed arguments (backward compatibility is preserved): * `transform_pre` -> `comparison` * `transform_post` -> `transform` New: * `p_adjust` argument: Adjust p-values for multiple comparisons. * `equivalence` argument available everywhere. Performance: * Much faster results in `avg_*()` functions for models with only categorical predictors and many rows of data, using deduplication and weights instead of unit-level estimates. * Faster predictions in `lm()` and `glm()` models using `RcppEigen`. * Bayesian models with many rows. Thanks to Etienne Bacher. #694 * Faster predictions, especially with standard errors and large datasets. Bugs: * Multiple imputation with `mira` objects was not pooling all datasets. Thanks to @Generalized for report #711. * Support for more models with offsets. Thanks to @mariofiorini for report #705. * Error on `predictions()` with `by` and `wts`. Thanks to Noah Greifer for report #695. * `afex`: some models generated errors. Thanks to Daniel Lüdecke for report #696. * `group` column name is always forbidden. Thanks to Daniel Lüdecke for report #697. * Blank graphs in `plot_comparisons()` with a list in `variables`. * `type="link"` produced an error with some categorical `brms` models. Thanks to @shirdekel for report #703. * Error on `predictions(variables = ...)` for `glmmTMB` models. Thanks to Daniel Lüdecke for report #707. * `by` with user-specified function in `comparison` and factor predictor did not aggregate correctly. Thanks to @joaotedde for report #715. * `ordinal::clm`: Support `cum.prob` and `linear.predictor` prediction types. Thanks to @MrJerryTAO for report #717. ## 0.10.0 Performance: * 2-4x faster execution for many calls. Thanks to Etienne Bacher. New models supported: * `MCMCglmm::MCMCglmm` * `Rchoice::hetprob` * `Rchoice::ivpml` * Multiple imputation using `mice` and any package which can return a list of imputed data frames (e.g., `Amelia`, `missRanger`, etc.) Plot improvements: * New `by` argument to display marginal estimates by subgroup. * New `rug` argument to display tick marks in the margins. * New `points` argument in `plot_predictions()` to display a scatter plot. * New `gray` argument to plot in grayscale using line types and shapes instead of color. * The `effect` argument is renamed to `variables` in `plot_slopes()` and `plot_comparisons()`. This improves consistency with the analogous `slopes()` and `comparisons()` functions. * The plotting vignette was re-written. Other: * Support multiple imputation with `mice` `mira` objects. The multiple imputation vignette was rewritten. * The `variables_grid` argument in `marginal_means()` is renamed `newdata`. Backward compatibility is maintained. * `avg_*()` returns an informative error when `vcov` is "satterthwaite" or "kenward-roger" * "satterthwaite" and "kenward-roger" are now supported when `newdata` is not `NULL` * Informative error when `hypothesis` includes a `b#` larger than the available number of estimates. * `avg_predictions(model, variables = "x")` computes average counterfactual predictions by subgroups of `x` * `datagrid()` and `plot_*()` functions are faster in datasets with many extraneous columns. * In `predictions(type = NULL)` with `glm()` and `Gam()` we first make predictions on the link scale and then backtransform them. Setting `type="response"` explicitly makes predictions directly on the response scale without backtransformation. * Standard errors now supported for more `glmmTMB` models. * Use the `numDeriv` package for numeric differentiation in the calculation of delta method standard error. A global option can now be passed to `numDeriv::jacobian`: - `options(marginaleffects_numDeriv = list(method = "simple", method.args = list(eps = 1e-6)))` - `options(marginaleffects_numDeriv = list(method = "Richardson", method.args = list(eps = 1e-6)))` - `options(marginaleffects_numDeriv = NULL)` * Print: - Print fewer significant digits. - `print.marginaleffects` now prints all columns supplied to `newdata` - Less redundant labels when using `hypothesis` * Many improvements to documentation. Bugfixes: * Standard errors could be inaccurate in models with non-linear components (and interactions) when some of the coefficients were very small. This was related to the step size used for numerical differentiation for the delta method. Issue #684. * `avg_predictions(by =)` did not work when the dataset included a column named `term`. Issue #683. * `brms` models with multivariate outcome collapsed categories in `comparisons()`. Issue #639. * `hypotheses()` now works on lists and in calls to `lapply()`, `purrr::map()`, etc. Issue #660. ## 0.9.0 Breaking changes: * All functions return an `estimate` column instead of the function-specific `predicted`, `comparisons`, `dydx`, etc. This change only affects unit-level estimates, and not average estimates, which already used the `estimate` column name. * The `transform_avg` argument in `tidy()` deprecated. Use `transform_post` instead. * `plot_*(draw=FALSE)` now return the actual variable names supplied to the `condition` argument, rather than the opaque "condition1", "condition2", etc. New models supported: * `blme` package. New features: * New functions: `avg_predictions()`, `avg_comparisons()`, `avg_slopes()` * Equivalence, non-inferiority, and non-superiority tests with the `hypotheses()` function and `equivalence` argument. * New experimental `inferences()` function: simulation-based inferences and bootstrap using the `boot`, `rsample`, and `fwb` package. * New `df` argument to set degrees of freedom manually for p and CI. * Pretty `print()` for all objects. * `by` argument - `TRUE` returns average (marginal) predictions, comparisons, or slopes. - Supports bayesian models. * `hypothesis` argument - Numeric value sets the null used in calculating Z and p. - Example: `comparisons(mod, transform_pre = "ratio", hypothesis = 1)` * All arguments from the main functions are now available through `tidy()`, and `summary()`: `conf_level`, `transform_post`, etc. * Bayesian posterior distribution summaries (median, mean, HDI, quantiles) can be customized using global options. See `?comparisons` Renamed functions (backward-compatibility is maintained by keeping the old function names as aliases): * `marginaleffects()` -> `slopes()` * `posteriordraws()` -> `posterior_draws()` * `marginalmeans()` -> `marginal_means()` * `plot_cap()` -> `plot_predictions()` * `plot_cme()` -> `plot_slopes()` * `plot_cco()` -> `plot_comparisons()` Bug fixes: * Incorrect results: In 0.8.1, `plot_*()` the `threenum` and `minmax` labels did not correspond to the correct numeric values. * Fix corner case for slopes when the dataset includes infinite values. * `mlogit` error with factors. * The `vcov` argument now accepts functions for most models. Other: * Removed major performance bottleneck for `slopes()` ## 0.8.1 * `deltamethod()` can run hypothesis tests on objects produced by the `comparisons()`, `marginaleffects()`, `predictions()`, and `marginalmeans()` functions. This feature relies on `match.call()`, which means it may not always work when used programmatically, inside functions and nested environments. It is generally safer and more efficient to use the `hypothesis` argument. * `plot_cme()` and `plot_cco()` accept lists with user-specified values for the regressors, and can display nice labels for shortcut string-functions like "threenum" or "quartile". * `posterior_draws`: new `shape` argument to return MCMC draws in various formats, including the new `rvar` structure from the `posterior` package. * `transform_avg` function gets printed in `summary()` output. * `transform_post` and `transform_avg` support string shortcuts: "exp" and "ln" * Added support for `mlm` models from `lm()`. Thanks to Noah Greifer. Bug fixes: * `hypothesis` argument with bayesian models and `tidy()` used to raise an error. * Missing values for some regressors in the `comparisons()` output for `brms` models. ## 0.8.0 Breaking change: * The `interaction` argument is deprecated and replaced by the `cross` argument. This is to reduce ambiguity with respect to the `interaction` argument in `emmeans`, which does something completely different, akin to the difference-in-differences illustrated in the Interactions vignette. 71 classes of models supported, including the new: * `rms::ols` * `rms::lrm` * `rms::orm` New features: * Plots: `plot_cme()`, `plot_cap()`, and `plot_cco()` are now much more flexible in specifying the comparisons to display. The `condition` argument accepts lists, functions, and shortcuts for common reference values, such as "minmax", "threenum", etc. * `variables` argument of the `comparisons()` function is more flexible: - Accepts functions to specify custom differences in numeric variables (e.g., forward and backward differencing). - Can specify pairs of factors to compare in the `variables` argument of the `comparisons` function. * `variables` argument of the `predictions()` function is more flexible: - Accepts shortcut strings, functions, and vectors of arbitrary length. * Integrate out random effects in bayesian `brms` models (see Bayesian analysis vignette) New vignettes: * Experiments * Extending marginal effects * Integrating out random effects in bayesian models Bug fixes and minor improvements: * The default value of `conf_level` in `summary()` and `tidy()` is now `NULL`, which inherits the `conf_level` value in the original `comparisons`/`marginaleffects`/`predictions` calls. * Fix typo in function names for missing "lnratioavgwts" * Interactions with `fixest::i()` are parsed properly as categorical variables * For `betareg` objects, inference can now be done on all coefficients using `deltamethod()`. previously only the location coefficients were available. * For objects from `crch` package, a number of bugs have been fixed; standard errors should now be correct for `deltamethod()`, `marginaleffects()`, etc. * Fixed a bug in the `tidy()` function for `glmmTMB` models without random effects, which caused all t statistics to be identical. ## 0.7.1 * New supported model class: `gamlss`. Thanks to Marcio Augusto Diniz. * `marginalmeans()` accepts a `wts` argument with values: "equal", "proportional", "cells". * `by` argument - accepts data frames for complex groupings. - in `marginalmeans` only accepts data frames. - accepts "group" to group by response level. - works with bayesian models. * `byfun` argument for the `predictions()` function to aggregate using different functions. * `hypothesis` argument - The matrix column names are used as labels for hypothesis tests. - Better labels with "sequential", "reference", "pairwise". - new shortcuts "revpairwise", "revsequential", "revreference" * `wts` argument is respected in `by` argument and with `*avg` shortcuts in the `transform_pre` argument. * `tidy.predictions()` and `tidy.marginalmeans()` get a new `transform_avg` argument. * New vignettes: - Unit-level contrasts in logistic regressions. Thanks to @arthur-albuquerque. - Python Numpy models in `marginaleffects`. Thanks to timpipeseek. - Bootstrap example in standard errors vignette. ## 0.7.0 Breaking changes: * `by` is deprecated in `summary()` and `tidy()`. Use the same `by` argument in the main functions instead: `comparisons()`, `marginaleffects()`, `predictions()` * Character vectors are no longer supported in the `variables` argument of the `predictions()` function. Use `newdata="fivenum"` or "grid", "mean", or "median" instead. Critical bug fix: * Contrasts with interactions were incorrect in version 0.6.0. The error should have been obvious to most analysts in most cases (weird-looking alignment). Thanks to @vmikk. New supported packages and models: * `survival::clogit` * `biglm`: The main quantities can be computed, but not the delta method standard errors. See https://github.com/vincentarelbundock/marginaleffects/issues/387 New vignette: * Elasticity * Frequently Asked Questions New features: * Elasticity and semi-elasticity using the new `slope` argument in `marginaleffects()`: eyex, dyex, eydx * `datagrid()` accepts functions: `datagrid(newdata = mtcars, hp = range, mpg = fivenum, wt = sd)` * New `datagridcf()` function to create counterfactual datasets. This is a shortcut to the `datagrid()` function with default to `grid_type = "counterfactual"` * New `by` arguments in `predictions()`, `comparisons()`, `marginaleffects()` * New `newdata` shortcuts: "tukey", "grid" * New string shortcuts for `transform_pre` in `comparisons()` * `marginalmeans()` now back transforms confidence intervals when possible. * `vcov` argument string shortcuts are now case-insensitive * The default contrast in `comparisons()` for binary predictors is now a difference between 1 and 0, rather than +1 relative to baseline. * documentation improvements ## 0.6.0 New supported packages and models: * `tidymodels` objects of class `tidy_model` are supported if the fit engine is supported by `marginaleffects`. New function: * `deltamethod()`: Hypothesis tests on functions of parameters * `plot_cco()`: Plot conditional contrasts New arguments: * `hypothesis` for hypothesis tests and custom contrasts * `transform_post` in `predictions()` * `wts` argument in `predictions()` only affects average predictions in `tidy()` or `summary()`. New or improved vignettes: * Hypothesis Tests and Custom Contrasts using the Delta Method: https://marginaleffects.com/vignettes/hypothesis.html * Multiple Imputation: https://marginaleffects.com/vignettes/multiple_imputation.html * Causal Inference with the g-Formula: https://marginaleffects.com/vignettes/gcomputation.html (Thanks to Rohan Kapre for the idea) Deprecated or renamed arguments: * `contrast_factor` and `contrast_numeric` arguments are deprecated in `comparisons()`. Use a named list in the `variables` argument instead. Backward compatibility is maintained. * The `transform_post` argument in `tidy()` and `summary()` is renamed to `transform_avg` to disambiguate against the argument of the same name in `comparisons()`. Backward compatibility is preserved. Misc: * `tidy.predictions()` computes standard errors using the delta method for average predictions * Support `gam` models with matrix columns. * `eps` in `marginaleffects()` is now "adaptive" by default: it equals 0.0001 multiplied the range of the predictor variable * `comparisons()` now supports "log of marginal odds ratio" in the `transform_pre` argument. Thanks to Noah Greifer. * New `transform_pre` shortcuts: dydx, expdydx * `tidy.predictions()` computes standard errors and confidence intervals for linear models or GLM on the link scale. ## 0.5.0 Breaking changes: * `type` no longer accepts a character vector. Must be a single string. * `conf.int` argument deprecated. Use `vcov = FALSE` instead. New supported packages and models: * `mlogit` * `mhurdle` * `tobit1` * `glmmTMB` New features: * `interaction` argument in `comparisons()` to compute interactions between contrasts (cross-contrasts). * `by` argument in `tidy()` and `summary()` computes group-average marginal effects and comparisons. * `transform_pre` argument can define custom contrasts between adjusted predictions (e.g., log adjusted risk ratios). Available in `comparisons()`. * `transform_post` argument allows back transformation before returning the final results. Available in `comparisons()`, `marginalmeans()`, `summary()`, `tidy()`. * The `variables` argument of the `comparisons()` function accepts a named list to specify variable-specific contrast types. * Robust standard errors with the `vcov` argument. This requires version 0.17.1 of the `insight` package. - `sandwich` package shortcuts: `vcov = "HC3"`, `"HC2"`, `"NeweyWest"`, and more. - Mixed effects models: `vcov = "satterthwaite"` or `"kenward-roger"` - One-sided formula to clusters: `vcov = ~cluster_variable` - Variance-covariance matrix - Function which returns a named squared matrix * `marginalmeans()` allows interactions * Bayesian Model Averaging for `brms` models using `type = "average"`. See vignette on the `marginaleffects` website. * `eps` argument for step size of numerical derivative * `marginaleffects` and `comparisons` now report confidence intervals by default. * New dependency on the `data.table` package yields substantial performance improvements. * More informative error messages and warnings * Bug fixes and performance improvements New pages on the `marginaleffects` website: https://marginaleffects.com/ * Alternative software packages * Robust standard errors (and more) * Performance tips * Tables and plots * Multinomial Logit and Discrete Choice Models * Generalized Additive Models * Mixed effects models (Bayesian and Frequentist) * Transformations and Custom Contrasts: Adjusted Risk Ratio Example Argument name changes (backward compatibility is preserved: * Everywhere: - `conf.level` -> `conf_level` * `datagrid()`: - `FUN.factor` -> `FUN_factor` (same for related arguments) - `grid.type` -> `grid_type` ## 0.4.1 New supported packages and models: * `stats::loess` * `sampleSelection::selection` * `sampleSelection::heckit` Misc: * `mgcv::bam` models allow `exclude` argument. * Gam models allow `include_smooth` argument. * New tests * Bug fixes ## 0.4.0 New function: * `comparisons()` computes contrasts Misc: * Speed optimizations * `predictions()` and `plot_cap()` include confidence intervals for linear models * More robust handling of in-formula functions: factor(), strata(), mo() * Do not overwrite user's `ggplot2::theme_set()` call ## 0.3.4 * Bug fixes ## 0.3.3 New supported models: * `mclogit::mclogit` * `robust::lmRob` * `robustlmm::rlmer` * `fixest` confidence intervals in `predictions` Misc: * Support `modelbased::visualisation_matrix` in `newdata` without having to specify `x` explicitly. * `tidy.predictions()` and `summary.predictions()` methods. * Documentation improvements. * CRAN test fixes ## 0.3.2 Support for new models and packages: * `brglm2::bracl` * `mclogit::mblogit` * `scam::scam` * `lmerTest::lmer` Misc: * Drop `numDeriv` dependency, but make it available via a global option: options("marginaleffects_numDeriv" = list(method = "Richardson", method.args = list(eps = 1e-5, d = 0.0001))) * Bugfixes * Documentation improvements * CRAN tests ## 0.3.1 documentation bugfix ## 0.3.0 Breaking changes: * `predictions` returns predictions for every observation in the original dataset instead of `newdata=datagrid()`. * `marginalmeans` objects have new column names, as do the corresponding `tidy` and `summary` outputs. New supported packages and models: * `brms::brm` * `rstanarm::stanglm` * `brglm2::brmultinom` * `MASS::glmmPQL` * `aod::betabin` Misc: * `datagrid` function supersedes `typical` and `counterfactual` with the `grid.type` argument. The `typical` and `counterfactual` functions will remain available and exported, but their use is not encouraged. * `posterior_draws` function can be applied to a `predictions` or a `marginaleffects` object to extract draws from the posterior distribution. * `marginalmeans` standard errors are now computed using the delta method. * `predictions` standard errors are now computed using the delta method when they are not available from `insight::get_predicted`. * New vignette on Bayesian models with `brms` * New vignette on Mixed effects models with `lme4` * If the `data.table` package is installed, `marginaleffects` will automatically use it to speed things up. * Contrast definition reported in a separate column of `marginaleffects` output. * Safer handling of the `type` argument. * Comprehensive list of supported and tests models on the website. * Many bug fixes * Many new tests, including several against `emmeans` ## 0.2.0 Breaking change: * `data` argument becomes `newdata` in all functions. New supported packages and models: * `lme4:glmer.nb` * `mgcv::gam` * `ordinal::clm` * `mgcv` `marginalmeans`: * New `variables_grid` argument `predictions`: * Support `mgcv` `plot_cap` * New `type` argument Misc: * New validity checks and tests ## 0.1.0 First release. Bravo! Thanks to Marco Avina Mendoza, Resul Umit, and all those who offered comments and suggestions. marginaleffects/inst/0000755000176200001440000000000014632712540014365 5ustar liggesusersmarginaleffects/inst/CITATION0000644000176200001440000000116514631452335015527 0ustar liggesusers bibentry(bibtype = "Article", title = "How to Interpret Statistical Models Using {marginaleffects} in {R} and {Python}", author = c( person(given = "Vincent", family = "Arel-Bundock", email = "vincent.arel-bundock@umontreal.ca"), person(given = "Noah", family = "Greifer", email = "ngreifer@iq.harvard.edu"), person(given = "Andrew", family = "Heiss", email = "aheiss@gsu.edu") ), year = "Forthcoming", journal = "Journal of Statistical Software", header = "To cite marginaleffects in publications use:" ) marginaleffects/inst/COPYRIGHTS0000644000176200001440000000354414631452335016013 0ustar liggesusersCopyright (c) 2022, Vincent Arel-Bundock ######################## Functions in `R/methods_gamlss.R` file were adatped from the `gamlss` package for `R`. Copyright (c) 2022, Mikis Stasinopoulos [aut, cre, cph] shared under the GPL3 License. ######################## Functions in the `R/get_hdi.R` file were extracted from the `HDInterval` package for `R`. Copyright (c) 2020, Mike Meredith and John Kruschke, shared under the GPL3 License. ######################## Some of the methods in the `R/mean_or_mode.R` file were adapted from the `prediction` R package, copyright Thomas J. Leeper, shared under the MIT License (copied below). Tests in the `tests/testhat/test-analytical.R` were adapted from the `margins` R package, copyright Thomas J. Leeper (2018), shared under the MIT License (copied below). Copyright (c) 2016-2018, Thomas J. Leeper. MIT License Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. marginaleffects/inst/WORDLIST0000644000176200001440000000426414632712433015566 0ustar liggesusersAAP AAPs AFAICT AME APM ARD Aaditya Adelie Adelies Anastasios Angelopoulos Arel Augusto Avina BH Beaumais Boca BorgeJorge Brilleman Bundock CMD CRC Candes Carlisle Codecov Customizable Demetri Diniz Dowd DxP EMMs ETI Ep Epidemiologic Errickson Estimand Estimands Fabbri Foygel GLMMs Gam Gentoos Greifer HC HDI Hedeker Heiss Hernán Heteroskedasticity Hufthammer IPW Isager J'VJ JM JVJ Kapre Kirill Krinsky Kurz LLC Lakens Leeper Lenth Lifecycle Lüdecke MEM MER MFX MRP Marcio MrJerryTAO NHEFS Nafa NumPyro Numpy ORs Ove Pananos PxD RCTs RDatasets Rainey Ramdas Randas Raton Rcpp Rdatasets Rdatatable Resul Rina Rmarkdown Robb Rohan Scheel Solovev Stata Stata's StataCorp Stata’s TLDR TOST Tibshirani Tomz Typst Umit Wittenberg XGBoost Xu aje al arXiv arXivhttp args arxiv backtransform backtransformation backtransforming backtransforms bayesian bc bca bonferroni brms bugfix cdot chisq cme coercible confounders cran cumhaz cumprob customclass customizable cv dX dY datagrid deduplication demeaned dev differenceavg differenceavgwts differencing disp doi dydx dydxavg dydxavgwts dyex dyexavg dyexavglnratioavgwts dyexavgwts elasticities emmeans eps estimand estimands et ev expdydx expdydxavg expdydxavgwts exponentiate exponentiating expvalue eydx eydxavg eydxavgwts eyex eyexavg eyexavgwts fdcenter fdforward fdr fivenum frac fwb geoms get_hdi ggeffects github grayscale grey heteroskedasticity hochberg holm hommel http https incrementing interpretability interpretable inv invlink io iqr issuecomment jacobian jacobians jacobiansmbox kenward knitr kwaa lift liftavg linpred listwise lm lme ln lnor lnoravg lnoravgwts lnratio lnratioavg lnratioavgwts lp marginalmeans mbox meandev meanotherdev methodologists minmax mislabelled modelbased nd newdata numDeriv pairwise param perc plasminogen poisson ppd pre preprint probs programmatically quartile ratioavg ratioavgwts regressand regressors’ reimplement revpairwise revreference revsequential richardson rmst rowid rsample rvar satterthwaite sd semilog sensical sequential softmax streptokinase tPA th threenum tidiers timpipeseek tinytable tukey typst unadvisable underspecified unintuitive untransformed varepsilon vcovHC vincentarelbundock wmean xb zlink zprob ’s marginaleffects/README.md0000644000176200001440000001374314632712433014700 0ustar liggesusers

How to interpret statistical models in R and Python




The parameters of a statistical model can sometimes be difficult to interpret substantively, especially when that model includes non-linear components, interactions, or transformations. Analysts who fit such complex models often seek to transform raw parameter estimates into quantities that are easier for domain experts and stakeholders to understand, such as predictions, contrasts, risk differences, ratios, odds, lift, slopes, and so on. Unfortunately, computing these quantities—along with associated standard errors—can be a tedious and error-prone task. This problem is compounded by the fact that modeling packages in `R` and `Python` produce objects with varied structures, which hold different information. This means that end-users often have to write customized code to interpret the estimates obtained by fitting Linear, GLM, GAM, Bayesian, Mixed Effects, and other model types. This can lead to wasted effort, confusion, and mistakes, and it can hinder the implementation of best practices. ## Book [This free online book](https://marginaleffects.com/) introduces a conceptual framework to clearly define statistical quantities of interest, and shows how to estimate those quantities using the `marginaleffects` package for `R` and `Python`. The techniques introduced herein can enhance the interpretability of [over 100 classes of statistical and machine learning models](https://marginaleffects.com/vignettes/supported_models.html), including linear, GLM, GAM, mixed-effects, bayesian, categorical outcomes, XGBoost, and more. With a single unified interface, users can compute and plot many estimands, including: - Predictions (aka fitted values or adjusted predictions) - Comparisons such as contrasts, risk differences, risk ratios, odds, etc. - Slopes (aka marginal effects or partial derivatives) - Marginal means - Linear and non-linear hypothesis tests - Equivalence tests - Uncertainty estimates using the delta method, bootstrapping, simulation, or conformal inference. - Much more! [The Marginal Effects Zoo](https://marginaleffects.com/) book includes over 30 chapters of tutorials, case studies, and technical notes. It covers a wide range of topics, including how the `marginaleffects` package can facilitate the analysis of: - Experiments - Observational data - Causal inference with G-Computation - Machine learning models - Bayesian modeling - Multilevel regression with post-stratification (MRP) - Missing data - Matching - Inverse probability weighting - Conformal prediction [Get started by clicking here!](https://marginaleffects.com/vignettes/get_started.html) ## Article Our article on `marginaleffects` is provisionally accepted for publication by the *Journal of Statistical Software*. You can read [the preprint here.](https://marginaleffects.com/files/marginaleffects_arel-bundock_greifer_heiss_jss5115.pdf) To cite `marginaleffects` in publications please use: Arel-Bundock V, Greifer N, Heiss A (Forthcoming). “How to Interpret Statistical Models Using marginaleffects in R and Python.” *Journal of Statistical Software*. A BibTeX entry for LaTeX users is: ``` {latex} @Article{, title = {How to Interpret Statistical Models Using {marginaleffects} in {R} and {Python}}, author = {Vincent Arel-Bundock and Noah Greifer and Andrew Heiss}, year = {Forthcoming}, journal = {Journal of Statistical Software}, } ``` ## Software The `marginaleffects` package for `R` and `Python` offers a single point of entry to easily interpret the results of [over 100 classes of models,](https://marginaleffects.com/vignettes/supported_models.html) using a simple and consistent user interface. Its benefits include: - *Powerful:* It can compute and plot predictions; comparisons (contrasts, risk ratios, etc.); slopes; and conduct hypothesis and equivalence tests for over 100 different classes of models in `R`. - *Simple:* All functions share a simple and unified interface. - *Documented*: Each function is thoroughly documented with abundant examples. The Marginal Effects Zoo website includes 20,000+ words of vignettes and case studies. - *Efficient:* [Some operations](https://marginaleffects.com/vignettes/performance.html) can be up to 1000 times faster and use 30 times less memory than with the `margins` package. - *Valid:* When possible, [numerical results are checked](https://marginaleffects.com/vignettes/supported_models.html) against alternative software like `Stata` or other `R` packages. - *Thin:* The `R` package requires relatively few dependencies. - *Standards-compliant:* `marginaleffects` follows “tidy” principles and returns simple data frames that work with all standard `R` functions. The outputs are easy to program with and feed to other packages like [`ggplot2`](https://marginaleffects.com/vignettes/plot.html) or [`modelsummary`.](https://marginaleffects.com/vignettes/tables.html) - *Extensible:* Adding support for new models is very easy, often requiring less than 10 lines of new code. Please submit [feature requests on Github.](https://github.com/vincentarelbundock/marginaleffects/issues) - *Active development*: Bugs are fixed promptly. marginaleffects/man/0000755000176200001440000000000014631452336014166 5ustar liggesusersmarginaleffects/man/datagrid.Rd0000644000176200001440000001262314631452336016240 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datagrid.R \name{datagrid} \alias{datagrid} \title{Data grids} \usage{ datagrid( ..., model = NULL, newdata = NULL, by = NULL, grid_type = "mean_or_mode", response = FALSE, FUN_character = NULL, FUN_factor = NULL, FUN_logical = NULL, FUN_numeric = NULL, FUN_integer = NULL, FUN_binary = NULL, FUN_other = NULL ) } \arguments{ \item{...}{named arguments with vectors of values or functions for user-specified variables. \itemize{ \item Functions are applied to the variable in the \code{model} dataset or \code{newdata}, and must return a vector of the appropriate type. \item Character vectors are automatically transformed to factors if necessary. +The output will include all combinations of these variables (see Examples below.) }} \item{model}{Model object} \item{newdata}{data.frame (one and only one of the \code{model} and \code{newdata} arguments can be used.)} \item{by}{character vector with grouping variables within which \verb{FUN_*} functions are applied to create "sub-grids" with unspecified variables.} \item{grid_type}{character. Determines the functions to apply to each variable. The defaults can be overridden by defining individual variables explicitly in \code{...}, or by supplying a function to one of the \verb{FUN_*} arguments. \itemize{ \item "mean_or_mode": Character, factor, logical, and binary variables are set to their modes. Numeric, integer, and other variables are set to their means. \item "balanced": Each unique level of character, factor, logical, and binary variables are preserved. Numeric, integer, and other variables are set to their means. Warning: When there are many variables and many levels per variable, a balanced grid can be very large. In those cases, it is better to use \code{grid_type="mean_or_mode"} and to specify the unique levels of a subset of named variables explicitly. \item "counterfactual": the entire dataset is duplicated for each combination of the variable values specified in \code{...}. Variables not explicitly supplied to \code{datagrid()} are set to their observed values in the original dataset. }} \item{response}{Logical should the response variable be included in the grid, even if it is not specified explicitly.} \item{FUN_character}{the function to be applied to character variables.} \item{FUN_factor}{the function to be applied to factor variables. This only applies if the variable in the original data is a factor. For variables converted to factor in a model-fitting formula, for example, \code{FUN_character} is used.} \item{FUN_logical}{the function to be applied to logical variables.} \item{FUN_numeric}{the function to be applied to numeric variables.} \item{FUN_integer}{the function to be applied to integer variables.} \item{FUN_binary}{the function to be applied to binary variables.} \item{FUN_other}{the function to be applied to other variable types.} } \value{ A \code{data.frame} in which each row corresponds to one combination of the named predictors supplied by the user via the \code{...} dots. Variables which are not explicitly defined are held at their mean or mode. } \description{ Generate a data grid of user-specified values for use in the \code{newdata} argument of the \code{predictions()}, \code{comparisons()}, and \code{slopes()} functions. This is useful to define where in the predictor space we want to evaluate the quantities of interest. Ex: the predicted outcome or slope for a 37 year old college graduate. } \details{ If \code{datagrid} is used in a \code{predictions()}, \code{comparisons()}, or \code{slopes()} call as the \code{newdata} argument, the model is automatically inserted in the \code{model} argument of \code{datagrid()} call, and users do not need to specify either the \code{model} or \code{newdata} arguments. The same behavior will occur when the value supplied to \verb{newdata=} is a function call which starts with "datagrid". This is intended to allow users to create convenience shortcuts like: \preformatted{ library(marginaleffects) mod <- lm(mpg ~ am + vs + factor(cyl) + hp, mtcars) datagrid_bal <- function(...) datagrid(..., grid_type = "balanced") predictions(model, newdata = datagrid_bal(cyl = 4)) } If users supply a model, the data used to fit that model is retrieved using the \code{insight::get_data} function. } \examples{ # The output only has 2 rows, and all the variables except `hp` are at their # mean or mode. datagrid(newdata = mtcars, hp = c(100, 110)) # We get the same result by feeding a model instead of a data.frame mod <- lm(mpg ~ hp, mtcars) datagrid(model = mod, hp = c(100, 110)) # Use in `marginaleffects` to compute "Typical Marginal Effects". When used # in `slopes()` or `predictions()` we do not need to specify the #`model` or `newdata` arguments. slopes(mod, newdata = datagrid(hp = c(100, 110))) # datagrid accepts functions datagrid(hp = range, cyl = unique, newdata = mtcars) comparisons(mod, newdata = datagrid(hp = fivenum)) # The full dataset is duplicated with each observation given counterfactual # values of 100 and 110 for the `hp` variable. The original `mtcars` includes # 32 rows, so the resulting dataset includes 64 rows. dg <- datagrid(newdata = mtcars, hp = c(100, 110), grid_type = "counterfactual") nrow(dg) # We get the same result by feeding a model instead of a data.frame mod <- lm(mpg ~ hp, mtcars) dg <- datagrid(model = mod, hp = c(100, 110), grid_type = "counterfactual") nrow(dg) } marginaleffects/man/get_varcov_args.Rd0000644000176200001440000000063614631452336017635 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/get_vcov.R \name{get_varcov_args} \alias{get_varcov_args} \title{Take a \code{summary()} style \code{vcov} argument and convert it to \code{insight::get_varcov()}} \usage{ get_varcov_args(model, vcov) } \description{ Take a \code{summary()} style \code{vcov} argument and convert it to \code{insight::get_varcov()} } \keyword{internal} marginaleffects/man/plot_predictions.Rd0000644000176200001440000002351114631452336020040 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot_predictions.R \name{plot_predictions} \alias{plot_predictions} \title{Plot Conditional or Marginal Predictions} \usage{ plot_predictions( model, condition = NULL, by = NULL, newdata = NULL, type = NULL, vcov = NULL, conf_level = 0.95, wts = FALSE, transform = NULL, points = 0, rug = FALSE, gray = FALSE, draw = TRUE, ... ) } \arguments{ \item{model}{Model object} \item{condition}{Conditional predictions \itemize{ \item Character vector (max length 4): Names of the predictors to display. \item Named list (max length 4): List names correspond to predictors. List elements can be: \itemize{ \item Numeric vector \item Function which returns a numeric vector or a set of unique categorical values \item Shortcut strings for common reference values: "minmax", "quartile", "threenum" } \item 1: x-axis. 2: color/shape. 3: facet (wrap if no fourth variable, otherwise cols of grid). 4: facet (rows of grid). \item Numeric variables in positions 2 and 3 are summarized by Tukey's five numbers \code{?stats::fivenum} }} \item{by}{Marginal predictions \itemize{ \item Character vector (max length 3): Names of the categorical predictors to marginalize across. \item 1: x-axis. 2: color. 3: facets. }} \item{newdata}{When \code{newdata} is \code{NULL}, the grid is determined by the \code{condition} argument. When \code{newdata} is not \code{NULL}, the argument behaves in the same way as in the \code{predictions()} function.} \item{type}{string indicates the type (scale) of the predictions used to compute contrasts or slopes. This can differ based on the model type, but will typically be a string such as: "response", "link", "probs", or "zero". When an unsupported string is entered, the model-specific list of acceptable values is returned in an error message. When \code{type} is \code{NULL}, the first entry in the error message is used by default.} \item{vcov}{Type of uncertainty estimates to report (e.g., for robust standard errors). Acceptable values: \itemize{ \item FALSE: Do not compute standard errors. This can speed up computation considerably. \item TRUE: Unit-level standard errors using the default \code{vcov(model)} variance-covariance matrix. \item String which indicates the kind of uncertainty estimates to return. \itemize{ \item Heteroskedasticity-consistent: \code{"HC"}, \code{"HC0"}, \code{"HC1"}, \code{"HC2"}, \code{"HC3"}, \code{"HC4"}, \code{"HC4m"}, \code{"HC5"}. See \code{?sandwich::vcovHC} \item Heteroskedasticity and autocorrelation consistent: \code{"HAC"} \item Mixed-Models degrees of freedom: "satterthwaite", "kenward-roger" \item Other: \code{"NeweyWest"}, \code{"KernHAC"}, \code{"OPG"}. See the \code{sandwich} package documentation. } \item One-sided formula which indicates the name of cluster variables (e.g., \code{~unit_id}). This formula is passed to the \code{cluster} argument of the \code{sandwich::vcovCL} function. \item Square covariance matrix \item Function which returns a covariance matrix (e.g., \code{stats::vcov(model)}) }} \item{conf_level}{numeric value between 0 and 1. Confidence level to use to build a confidence interval.} \item{wts}{logical, string or numeric: weights to use when computing average predictions, contrasts or slopes. These weights only affect the averaging in \verb{avg_*()} or with the \code{by} argument, and not unit-level estimates. See \code{?weighted.mean} \itemize{ \item string: column name of the weights variable in \code{newdata}. When supplying a column name to \code{wts}, it is recommended to supply the original data (including the weights variable) explicitly to \code{newdata}. \item numeric: vector of length equal to the number of rows in the original data or in \code{newdata} (if supplied). \item FALSE: Equal weights. \item TRUE: Extract weights from the fitted object with \code{insight::find_weights()} and use them when taking weighted averages of estimates. Warning: \code{newdata=datagrid()} returns a single average weight, which is equivalent to using \code{wts=FALSE} }} \item{transform}{A function applied to unit-level adjusted predictions and confidence intervals just before the function returns results. For bayesian models, this function is applied to individual draws from the posterior distribution, before computing summaries.} \item{points}{Number between 0 and 1 which controls the transparency of raw data points. 0 (default) does not display any points.} \item{rug}{TRUE displays tick marks on the axes to mark the distribution of raw data.} \item{gray}{FALSE grayscale or color plot} \item{draw}{\code{TRUE} returns a \code{ggplot2} plot. \code{FALSE} returns a \code{data.frame} of the underlying data.} \item{...}{Additional arguments are passed to the \code{predict()} method supplied by the modeling package.These arguments are particularly useful for mixed-effects or bayesian models (see the online vignettes on the \code{marginaleffects} website). Available arguments can vary from model to model, depending on the range of supported arguments by each modeling package. See the "Model-Specific Arguments" section of the \code{?slopes} documentation for a non-exhaustive list of available arguments.} } \value{ A \code{ggplot2} object or data frame (if \code{draw=FALSE}) } \description{ Plot predictions on the y-axis against values of one or more predictors (x-axis, colors/shapes, and facets). The \code{by} argument is used to plot marginal predictions, that is, predictions made on the original data, but averaged by subgroups. This is analogous to using the \code{by} argument in the \code{predictions()} function. The \code{condition} argument is used to plot conditional predictions, that is, predictions made on a user-specified grid. This is analogous to using the \code{newdata} argument and \code{datagrid()} function in a \code{predictions()} call. All variables whose values are not specified explicitly are treated as usual by \code{datagrid()}, that is, they are held at their mean or mode (or rounded mean for integers). This includes grouping variables in mixed-effects models, so analysts who fit such models may want to specify the groups of interest using the \code{condition} argument, or supply model-specific arguments to compute population-level estimates. See details below. See the "Plots" vignette and website for tutorials and information on how to customize plots: \itemize{ \item https://marginaleffects.com/vignettes/plot.html \item https://marginaleffects.com } } \section{Model-Specific Arguments}{ Some model types allow model-specific arguments to modify the nature of marginal effects, predictions, marginal means, and contrasts. Please report other package-specific \code{predict()} arguments on Github so we can add them to the table below. https://github.com/vincentarelbundock/marginaleffects/issues\tabular{llll}{ Package \tab Class \tab Argument \tab Documentation \cr \code{brms} \tab \code{brmsfit} \tab \code{ndraws} \tab \link[brms:posterior_predict.brmsfit]{brms::posterior_predict} \cr \tab \tab \code{re_formula} \tab \link[brms:posterior_predict.brmsfit]{brms::posterior_predict} \cr \code{lme4} \tab \code{merMod} \tab \code{re.form} \tab \link[lme4:predict.merMod]{lme4::predict.merMod} \cr \tab \tab \code{allow.new.levels} \tab \link[lme4:predict.merMod]{lme4::predict.merMod} \cr \code{glmmTMB} \tab \code{glmmTMB} \tab \code{re.form} \tab \link[glmmTMB:predict.glmmTMB]{glmmTMB::predict.glmmTMB} \cr \tab \tab \code{allow.new.levels} \tab \link[glmmTMB:predict.glmmTMB]{glmmTMB::predict.glmmTMB} \cr \tab \tab \code{zitype} \tab \link[glmmTMB:predict.glmmTMB]{glmmTMB::predict.glmmTMB} \cr \code{mgcv} \tab \code{bam} \tab \code{exclude} \tab \link[mgcv:predict.bam]{mgcv::predict.bam} \cr \code{robustlmm} \tab \code{rlmerMod} \tab \code{re.form} \tab \link[robustlmm:rlmerMod-class]{robustlmm::predict.rlmerMod} \cr \tab \tab \code{allow.new.levels} \tab \link[robustlmm:rlmerMod-class]{robustlmm::predict.rlmerMod} \cr \code{MCMCglmm} \tab \code{MCMCglmm} \tab \code{ndraws} \tab \cr } } \section{Prediction types}{ The \code{type} argument determines the scale of the predictions used to compute quantities of interest with functions from the \code{marginaleffects} package. Admissible values for \code{type} depend on the model object. When users specify an incorrect value for \code{type}, \code{marginaleffects} will raise an informative error with a list of valid \code{type} values for the specific model object. The first entry in the list in that error message is the default type. The \code{invlink(link)} is a special type defined by \code{marginaleffects}. It is available for some (but not all) models and functions. With this link type, we first compute predictions on the link scale, then we use the inverse link function to backtransform the predictions to the response scale. This is useful for models with non-linear link functions as it can ensure that confidence intervals stay within desirable bounds, ex: 0 to 1 for a logit model. Note that an average of estimates with \code{type="invlink(link)"} will not always be equivalent to the average of estimates with \code{type="response"}. Some of the most common \code{type} values are: response, link, E, Ep, average, class, conditional, count, cum.prob, cumhaz, cumprob, density, detection, disp, ev, expected, expvalue, fitted, hazard, invlink(link), latent, latent_N, linear, linear.predictor, linpred, location, lp, mean, numeric, p, ppd, pr, precision, prediction, prob, probability, probs, quantile, risk, rmst, scale, survival, unconditional, utility, variance, xb, zero, zlink, zprob } \examples{ mod <- lm(mpg ~ hp + wt, data = mtcars) plot_predictions(mod, condition = "wt") mod <- lm(mpg ~ hp * wt * am, data = mtcars) plot_predictions(mod, condition = c("hp", "wt")) plot_predictions(mod, condition = list("hp", wt = "threenum")) plot_predictions(mod, condition = list("hp", wt = range)) } marginaleffects/man/get_predict.Rd0000644000176200001440000002111014632674174016750 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/get_predict.R, R/methods_MASS.R, % R/methods_MCMCglmm.R, R/methods_afex.R, R/methods_aod.R, % R/methods_betareg.R, R/methods_bife.R, R/methods_biglm.R, R/methods_nnet.R, % R/methods_brglm2.R, R/methods_brms.R, R/methods_crch.R, R/methods_dbarts.R, % R/methods_fixest.R, R/methods_flexsurv.R, R/methods_gamlss.R, % R/methods_glmmTMB.R, R/methods_lme4.R, R/methods_mclogit.R, % R/methods_mhurdle.R, R/methods_mlogit.R, R/methods_mlr3.R, % R/methods_ordinal.R, R/methods_quantreg.R, R/methods_rms.R, % R/methods_robustlmm.R, R/methods_rstanarm.R, R/methods_stats.R, % R/methods_survey.R, R/methods_survival.R, R/methods_tidymodels.R, % R/methods_tobit1.R \name{get_predict} \alias{get_predict} \alias{get_predict.default} \alias{get_predict.polr} \alias{get_predict.glmmPQL} \alias{get_predict.MCMCglmm} \alias{get_predict.afex_aov} \alias{get_predict.glimML} \alias{get_predict.betareg} \alias{get_predict.bife} \alias{get_predict.biglm} \alias{get_predict.multinom} \alias{get_predict.brmultinom} \alias{get_predict.brmsfit} \alias{get_predict.crch} \alias{get_predict.bart} \alias{get_predict.fixest} \alias{get_predict.flexsurvreg} \alias{get_predict.gamlss} \alias{get_predict.glmmTMB} \alias{get_predict.merMod} \alias{get_predict.lmerModLmerTest} \alias{get_predict.lmerMod} \alias{get_predict.mblogit} \alias{get_predict.mhurdle} \alias{get_predict.mlogit} \alias{get_predict.Learner} \alias{get_predict.clm} \alias{get_predict.rq} \alias{get_predict.rms} \alias{get_predict.orm} \alias{get_predict.lrm} \alias{get_predict.ols} \alias{get_predict.rlmerMod} \alias{get_predict.stanreg} \alias{get_predict.lm} \alias{get_predict.glm} \alias{get_predict.svyolr} \alias{get_predict.svyglm} \alias{get_predict.coxph} \alias{get_predict.model_fit} \alias{get_predict.workflow} \alias{get_predict.tobit1} \title{Get predicted values from a model object (internal function)} \usage{ get_predict(model, newdata, type, ...) \method{get_predict}{default}(model, newdata = insight::get_data(model), type = "response", ...) \method{get_predict}{polr}(model, newdata = insight::get_data(model), type = "probs", ...) \method{get_predict}{glmmPQL}(model, newdata = insight::get_data(model), type = "response", ...) \method{get_predict}{MCMCglmm}(model, newdata, type = "response", ndraws = 1000, ...) \method{get_predict}{afex_aov}(model, newdata = NULL, ...) \method{get_predict}{glimML}(model, newdata = insight::get_data(model), type = "response", ...) \method{get_predict}{betareg}(model, newdata, ...) \method{get_predict}{bife}(model, newdata = insight::get_data(model), type = "response", ...) \method{get_predict}{biglm}(model, newdata = insight::get_data(model), type = "response", ...) \method{get_predict}{multinom}(model, newdata = insight::get_data(model), type = "probs", ...) \method{get_predict}{brmultinom}(model, newdata = insight::get_data(model), type = "probs", ...) \method{get_predict}{brmsfit}(model, newdata = insight::get_data(model), type = "response", ...) \method{get_predict}{crch}(model, newdata = NULL, type = "location", ...) \method{get_predict}{bart}(model, newdata = NULL, ...) \method{get_predict}{fixest}(model, newdata = insight::get_data(model), type = "response", ...) \method{get_predict}{flexsurvreg}(model, newdata, type, ...) \method{get_predict}{gamlss}(model, newdata = insight::get_data(model), type = "response", ...) \method{get_predict}{glmmTMB}( model, newdata = insight::get_data(model), type = "response", newparams = NULL, ... ) \method{get_predict}{merMod}(model, newdata = insight::get_data(model), type = "response", ...) \method{get_predict}{lmerModLmerTest}(model, newdata = insight::get_data(model), type = "response", ...) \method{get_predict}{lmerMod}(model, newdata = insight::get_data(model), type = "response", ...) \method{get_predict}{mblogit}(model, newdata = insight::get_data(model), type = "response", ...) \method{get_predict}{mhurdle}(model, newdata = insight::get_data(model), type = "response", ...) \method{get_predict}{mlogit}(model, newdata, ...) \method{get_predict}{Learner}(model, newdata, type = NULL, ...) \method{get_predict}{clm}(model, newdata = insight::get_data(model), type = "prob", ...) \method{get_predict}{rq}(model, newdata = insight::get_data(model), type = NULL, ...) \method{get_predict}{rms}(model, newdata = insight::get_data(model), type = NULL, ...) \method{get_predict}{orm}(model, newdata = insight::get_data(model), type = NULL, ...) \method{get_predict}{lrm}(model, newdata = insight::get_data(model), type = NULL, ...) \method{get_predict}{ols}(model, newdata = insight::get_data(model), type = NULL, ...) \method{get_predict}{rlmerMod}(model, newdata = insight::get_data(model), type = "response", ...) \method{get_predict}{stanreg}(model, newdata = insight::get_data(model), type = "response", ...) \method{get_predict}{lm}(model, newdata = insight::get_data(model), type = "response", ...) \method{get_predict}{glm}(model, newdata = insight::get_data(model), type = "response", ...) \method{get_predict}{svyolr}(model, newdata = insight::get_data(model), type = "probs", ...) \method{get_predict}{svyglm}( model, newdata = insight::get_data(model), type = "response", se.fit = FALSE, ... ) \method{get_predict}{coxph}(model, newdata = insight::get_data(model), type = "lp", ...) \method{get_predict}{model_fit}(model, newdata, type = NULL, ...) \method{get_predict}{workflow}(model, newdata, type = NULL, ...) \method{get_predict}{tobit1}(model, newdata = insight::get_data(model), type = "response", ...) } \arguments{ \item{model}{Model object} \item{newdata}{Grid of predictor values at which we evaluate the slopes. \itemize{ \item Warning: Please avoid modifying your dataset between fitting the model and calling a \code{marginaleffects} function. This can sometimes lead to unexpected results. \item \code{NULL} (default): Unit-level slopes for each observed value in the dataset (empirical distribution). The dataset is retrieved using \code{\link[insight:get_data]{insight::get_data()}}, which tries to extract data from the environment. This may produce unexpected results if the original data frame has been altered since fitting the model. \item \code{\link[=datagrid]{datagrid()}} call to specify a custom grid of regressors. For example: \itemize{ \item \code{newdata = datagrid(cyl = c(4, 6))}: \code{cyl} variable equal to 4 and 6 and other regressors fixed at their means or modes. \item See the Examples section and the \code{\link[=datagrid]{datagrid()}} documentation. } \item \code{\link[=subset]{subset()}} call with a single argument to select a subset of the dataset used to fit the model, ex: \code{newdata = subset(treatment == 1)} \item \code{\link[dplyr:filter]{dplyr::filter()}} call with a single argument to select a subset of the dataset used to fit the model, ex: \code{newdata = filter(treatment == 1)} \item string: \itemize{ \item "mean": Slopes evaluated when each predictor is held at its mean or mode. \item "median": Slopes evaluated when each predictor is held at its median or mode. \item "balanced": Slopes evaluated on a balanced grid with every combination of categories and numeric variables held at their means. \item "tukey": Slopes evaluated at Tukey's 5 numbers. \item "grid": Slopes evaluated on a grid of representative numbers (Tukey's 5 numbers and unique values of categorical predictors). } }} \item{type}{string indicates the type (scale) of the predictions used to compute contrasts or slopes. This can differ based on the model type, but will typically be a string such as: "response", "link", "probs", or "zero". When an unsupported string is entered, the model-specific list of acceptable values is returned in an error message. When \code{type} is \code{NULL}, the first entry in the error message is used by default.} \item{...}{Additional arguments are passed to the \code{predict()} method supplied by the modeling package.These arguments are particularly useful for mixed-effects or bayesian models (see the online vignettes on the \code{marginaleffects} website). Available arguments can vary from model to model, depending on the range of supported arguments by each modeling package. See the "Model-Specific Arguments" section of the \code{?slopes} documentation for a non-exhaustive list of available arguments.} } \value{ A data.frame of predicted values with a number of rows equal to the number of rows in \code{newdata} and columns "rowid" and "estimate". A "group" column is added for multivariate models or models with categorical outcomes. } \description{ Get predicted values from a model object (internal function) } \keyword{internal} marginaleffects/man/plot_slopes.Rd0000644000176200001440000002163314631452336017025 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot_slopes.R \name{plot_slopes} \alias{plot_slopes} \title{Plot Conditional or Marginal Slopes} \usage{ plot_slopes( model, variables = NULL, condition = NULL, by = NULL, newdata = NULL, type = "response", vcov = NULL, conf_level = 0.95, wts = FALSE, slope = "dydx", rug = FALSE, gray = FALSE, draw = TRUE, ... ) } \arguments{ \item{model}{Model object} \item{variables}{Name of the variable whose marginal effect (slope) we want to plot on the y-axis.} \item{condition}{Conditional slopes \itemize{ \item Character vector (max length 4): Names of the predictors to display. \item Named list (max length 4): List names correspond to predictors. List elements can be: \itemize{ \item Numeric vector \item Function which returns a numeric vector or a set of unique categorical values \item Shortcut strings for common reference values: "minmax", "quartile", "threenum" } \item 1: x-axis. 2: color/shape. 3: facet (wrap if no fourth variable, otherwise cols of grid). 4: facet (rows of grid). \item Numeric variables in positions 2 and 3 are summarized by Tukey's five numbers \code{?stats::fivenum}. }} \item{by}{Aggregate unit-level estimates (aka, marginalize, average over). Valid inputs: \itemize{ \item \code{FALSE}: return the original unit-level estimates. \item \code{TRUE}: aggregate estimates for each term. \item Character vector of column names in \code{newdata} or in the data frame produced by calling the function without the \code{by} argument. \item Data frame with a \code{by} column of group labels, and merging columns shared by \code{newdata} or the data frame produced by calling the same function without the \code{by} argument. \item See examples below. \item For more complex aggregations, you can use the \code{FUN} argument of the \code{hypotheses()} function. See that function's documentation and the Hypothesis Test vignettes on the \code{marginaleffects} website. }} \item{newdata}{When \code{newdata} is \code{NULL}, the grid is determined by the \code{condition} argument. When \code{newdata} is not \code{NULL}, the argument behaves in the same way as in the \code{slopes()} function.} \item{type}{string indicates the type (scale) of the predictions used to compute contrasts or slopes. This can differ based on the model type, but will typically be a string such as: "response", "link", "probs", or "zero". When an unsupported string is entered, the model-specific list of acceptable values is returned in an error message. When \code{type} is \code{NULL}, the first entry in the error message is used by default.} \item{vcov}{Type of uncertainty estimates to report (e.g., for robust standard errors). Acceptable values: \itemize{ \item FALSE: Do not compute standard errors. This can speed up computation considerably. \item TRUE: Unit-level standard errors using the default \code{vcov(model)} variance-covariance matrix. \item String which indicates the kind of uncertainty estimates to return. \itemize{ \item Heteroskedasticity-consistent: \code{"HC"}, \code{"HC0"}, \code{"HC1"}, \code{"HC2"}, \code{"HC3"}, \code{"HC4"}, \code{"HC4m"}, \code{"HC5"}. See \code{?sandwich::vcovHC} \item Heteroskedasticity and autocorrelation consistent: \code{"HAC"} \item Mixed-Models degrees of freedom: "satterthwaite", "kenward-roger" \item Other: \code{"NeweyWest"}, \code{"KernHAC"}, \code{"OPG"}. See the \code{sandwich} package documentation. } \item One-sided formula which indicates the name of cluster variables (e.g., \code{~unit_id}). This formula is passed to the \code{cluster} argument of the \code{sandwich::vcovCL} function. \item Square covariance matrix \item Function which returns a covariance matrix (e.g., \code{stats::vcov(model)}) }} \item{conf_level}{numeric value between 0 and 1. Confidence level to use to build a confidence interval.} \item{wts}{logical, string or numeric: weights to use when computing average predictions, contrasts or slopes. These weights only affect the averaging in \verb{avg_*()} or with the \code{by} argument, and not unit-level estimates. See \code{?weighted.mean} \itemize{ \item string: column name of the weights variable in \code{newdata}. When supplying a column name to \code{wts}, it is recommended to supply the original data (including the weights variable) explicitly to \code{newdata}. \item numeric: vector of length equal to the number of rows in the original data or in \code{newdata} (if supplied). \item FALSE: Equal weights. \item TRUE: Extract weights from the fitted object with \code{insight::find_weights()} and use them when taking weighted averages of estimates. Warning: \code{newdata=datagrid()} returns a single average weight, which is equivalent to using \code{wts=FALSE} }} \item{slope}{string indicates the type of slope or (semi-)elasticity to compute: \itemize{ \item "dydx": dY/dX \item "eyex": dY/dX * Y / X \item "eydx": dY/dX * Y \item "dyex": dY/dX / X \item Y is the predicted value of the outcome; X is the observed value of the predictor. }} \item{rug}{TRUE displays tick marks on the axes to mark the distribution of raw data.} \item{gray}{FALSE grayscale or color plot} \item{draw}{\code{TRUE} returns a \code{ggplot2} plot. \code{FALSE} returns a \code{data.frame} of the underlying data.} \item{...}{Additional arguments are passed to the \code{predict()} method supplied by the modeling package.These arguments are particularly useful for mixed-effects or bayesian models (see the online vignettes on the \code{marginaleffects} website). Available arguments can vary from model to model, depending on the range of supported arguments by each modeling package. See the "Model-Specific Arguments" section of the \code{?slopes} documentation for a non-exhaustive list of available arguments.} } \value{ A \code{ggplot2} object } \description{ Plot slopes on the y-axis against values of one or more predictors (x-axis, colors/shapes, and facets). The \code{by} argument is used to plot marginal slopes, that is, slopes made on the original data, but averaged by subgroups. This is analogous to using the \code{by} argument in the \code{slopes()} function. The \code{condition} argument is used to plot conditional slopes, that is, slopes computed on a user-specified grid. This is analogous to using the \code{newdata} argument and \code{datagrid()} function in a \code{slopes()} call. All variables whose values are not specified explicitly are treated as usual by \code{datagrid()}, that is, they are held at their mean or mode (or rounded mean for integers). This includes grouping variables in mixed-effects models, so analysts who fit such models may want to specify the groups of interest using the \code{condition} argument, or supply model-specific arguments to compute population-level estimates. See details below. See the "Plots" vignette and website for tutorials and information on how to customize plots: \itemize{ \item https://marginaleffects.com/vignettes/plot.html \item https://marginaleffects.com } } \section{Model-Specific Arguments}{ Some model types allow model-specific arguments to modify the nature of marginal effects, predictions, marginal means, and contrasts. Please report other package-specific \code{predict()} arguments on Github so we can add them to the table below. https://github.com/vincentarelbundock/marginaleffects/issues\tabular{llll}{ Package \tab Class \tab Argument \tab Documentation \cr \code{brms} \tab \code{brmsfit} \tab \code{ndraws} \tab \link[brms:posterior_predict.brmsfit]{brms::posterior_predict} \cr \tab \tab \code{re_formula} \tab \link[brms:posterior_predict.brmsfit]{brms::posterior_predict} \cr \code{lme4} \tab \code{merMod} \tab \code{re.form} \tab \link[lme4:predict.merMod]{lme4::predict.merMod} \cr \tab \tab \code{allow.new.levels} \tab \link[lme4:predict.merMod]{lme4::predict.merMod} \cr \code{glmmTMB} \tab \code{glmmTMB} \tab \code{re.form} \tab \link[glmmTMB:predict.glmmTMB]{glmmTMB::predict.glmmTMB} \cr \tab \tab \code{allow.new.levels} \tab \link[glmmTMB:predict.glmmTMB]{glmmTMB::predict.glmmTMB} \cr \tab \tab \code{zitype} \tab \link[glmmTMB:predict.glmmTMB]{glmmTMB::predict.glmmTMB} \cr \code{mgcv} \tab \code{bam} \tab \code{exclude} \tab \link[mgcv:predict.bam]{mgcv::predict.bam} \cr \code{robustlmm} \tab \code{rlmerMod} \tab \code{re.form} \tab \link[robustlmm:rlmerMod-class]{robustlmm::predict.rlmerMod} \cr \tab \tab \code{allow.new.levels} \tab \link[robustlmm:rlmerMod-class]{robustlmm::predict.rlmerMod} \cr \code{MCMCglmm} \tab \code{MCMCglmm} \tab \code{ndraws} \tab \cr } } \examples{ library(marginaleffects) mod <- lm(mpg ~ hp * drat * factor(am), data = mtcars) plot_slopes(mod, variables = "hp", condition = "drat") plot_slopes(mod, variables = "hp", condition = c("drat", "am")) plot_slopes(mod, variables = "hp", condition = list("am", "drat" = 3:5)) plot_slopes(mod, variables = "am", condition = list("hp", "drat" = range)) plot_slopes(mod, variables = "am", condition = list("hp", "drat" = "threenum")) } marginaleffects/man/specify_hypothesis.Rd0000644000176200001440000000322114631452336020374 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hypothesis_helper.R \name{specify_hypothesis} \alias{specify_hypothesis} \title{(EXPERIMENTAL) This experimental function will soon be deprecated. Please supply a formula or function to the \code{hypothesis} argument to conduct (group-wise) hypothesis tests.} \usage{ specify_hypothesis( hypothesis = "reference", comparison = "difference", label = NULL, label_columns = NULL, by = c("term", "group", "contrast"), internal = FALSE ) } \arguments{ \item{hypothesis}{String or Function. Compute a test statistic. \itemize{ \item String: "reference" or "sequential" \item Function: Accepts a single argument named \code{estimate} and returns a numeric vector. }} \item{comparison}{String. "ratio" or "difference"} \item{label}{Function. Accepts a vector of row labels and combines them to create hypothesis labels.} \item{label_columns}{Character vector. Column names to use for hypothesis labels. Default is \code{c("group", "term", "rowid", attr(x, "variables_datagrid"), attr(x, "by"))}.} \item{by}{Character vector. Variable names which indicate subgroups in which the \code{hypothesis} function should be applied.} \item{internal}{Logical. Raises a deprecation warning when FALSE.} } \value{ \code{specify_hypothesis()} is a "function factory", which means that executing it will return a function suitable for use in the \code{hypothesis} argument of a \code{marginaleffects} function. } \description{ (EXPERIMENTAL) This experimental function will soon be deprecated. Please supply a formula or function to the \code{hypothesis} argument to conduct (group-wise) hypothesis tests. } marginaleffects/man/complete_levels.Rd0000644000176200001440000000104414631452336017636 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/complete_levels.R \name{complete_levels} \alias{complete_levels} \title{Create a data.frame with all factor or character levels} \usage{ complete_levels(x, character_levels = NULL) } \description{ \code{model.matrix} breaks when \code{newdata} includes a factor variable, but not all levels are present in the data. This is bad for us because we often want to get predictions with one (or few) rows, where some factor levels are inevitably missing. } \keyword{internal} marginaleffects/man/posterior_draws.Rd0000644000176200001440000000165414631452336017711 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/posterior_draws.R \name{posterior_draws} \alias{posterior_draws} \title{Extract Posterior Draws or Bootstrap Resamples from \code{marginaleffects} Objects} \usage{ posterior_draws(x, shape = "long") } \arguments{ \item{x}{An object produced by a \code{marginaleffects} package function, such as \code{predictions()}, \code{avg_slopes()}, \code{hypotheses()}, etc.} \item{shape}{string indicating the shape of the output format: \itemize{ \item "long": long format data frame \item "DxP": Matrix with draws as rows and parameters as columns \item "PxD": Matrix with draws as rows and parameters as columns \item "rvar": Random variable datatype (see \code{posterior} package documentation). }} } \value{ A data.frame with \code{drawid} and \code{draw} columns. } \description{ Extract Posterior Draws or Bootstrap Resamples from \code{marginaleffects} Objects } marginaleffects/man/get_model_matrix.Rd0000644000176200001440000000424414632674174020013 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/get_model_matrix.R \name{get_model_matrix} \alias{get_model_matrix} \alias{get_model_matrix.default} \title{Get a named model matrix} \usage{ get_model_matrix(model, newdata) \method{get_model_matrix}{default}(model, newdata) } \arguments{ \item{model}{Model object} \item{newdata}{Grid of predictor values at which we evaluate the slopes. \itemize{ \item Warning: Please avoid modifying your dataset between fitting the model and calling a \code{marginaleffects} function. This can sometimes lead to unexpected results. \item \code{NULL} (default): Unit-level slopes for each observed value in the dataset (empirical distribution). The dataset is retrieved using \code{\link[insight:get_data]{insight::get_data()}}, which tries to extract data from the environment. This may produce unexpected results if the original data frame has been altered since fitting the model. \item \code{\link[=datagrid]{datagrid()}} call to specify a custom grid of regressors. For example: \itemize{ \item \code{newdata = datagrid(cyl = c(4, 6))}: \code{cyl} variable equal to 4 and 6 and other regressors fixed at their means or modes. \item See the Examples section and the \code{\link[=datagrid]{datagrid()}} documentation. } \item \code{\link[=subset]{subset()}} call with a single argument to select a subset of the dataset used to fit the model, ex: \code{newdata = subset(treatment == 1)} \item \code{\link[dplyr:filter]{dplyr::filter()}} call with a single argument to select a subset of the dataset used to fit the model, ex: \code{newdata = filter(treatment == 1)} \item string: \itemize{ \item "mean": Slopes evaluated when each predictor is held at its mean or mode. \item "median": Slopes evaluated when each predictor is held at its median or mode. \item "balanced": Slopes evaluated on a balanced grid with every combination of categories and numeric variables held at their means. \item "tukey": Slopes evaluated at Tukey's 5 numbers. \item "grid": Slopes evaluated on a grid of representative numbers (Tukey's 5 numbers and unique values of categorical predictors). } }} } \description{ Get a named model matrix } \keyword{internal} marginaleffects/man/get_coef.Rd0000644000176200001440000000534214631452336016234 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/get_coef.R, R/methods_MASS.R, R/methods_afex.R, % R/methods_betareg.R, R/methods_nnet.R, R/methods_brglm2.R, R/methods_brms.R, % R/methods_dataframe.R, R/methods_gamlss.R, R/methods_glmmTMB.R, % R/methods_lme4.R, R/methods_mclogit.R, R/methods_mgcv.R, R/methods_mlm.R, % R/methods_sampleSelection.R, R/methods_scam.R, R/methods_stats.R, % R/methods_survey.R, R/methods_tidymodels.R \name{get_coef} \alias{get_coef} \alias{get_coef.default} \alias{get_coef.polr} \alias{get_coef.afex_aov} \alias{get_coef.betareg} \alias{get_coef.multinom} \alias{get_coef.brmultinom} \alias{get_coef.bracl} \alias{get_coef.brmsfit} \alias{get_coef.data.frame} \alias{get_coef.gamlss} \alias{get_coef.glmmTMB} \alias{get_coef.merMod} \alias{get_coef.lmerModLmerTest} \alias{get_coef.lmerMod} \alias{get_coef.mblogit} \alias{get_coef.gam} \alias{get_coef.mlm} \alias{get_coef.selection} \alias{get_coef.scam} \alias{get_coef.nls} \alias{get_coef.svyolr} \alias{get_coef.workflow} \title{Get a named vector of coefficients from a model object (internal function)} \usage{ get_coef(model, ...) \method{get_coef}{default}(model, ...) \method{get_coef}{polr}(model, ...) \method{get_coef}{afex_aov}(model, ...) \method{get_coef}{betareg}(model, ...) \method{get_coef}{multinom}(model, ...) \method{get_coef}{brmultinom}(model, ...) \method{get_coef}{bracl}(model, ...) \method{get_coef}{brmsfit}(model, ...) \method{get_coef}{data.frame}(model, ...) \method{get_coef}{gamlss}(model, ...) \method{get_coef}{glmmTMB}(model, ...) \method{get_coef}{merMod}(model, ...) \method{get_coef}{lmerModLmerTest}(model, ...) \method{get_coef}{lmerMod}(model, ...) \method{get_coef}{mblogit}(model, ...) \method{get_coef}{gam}(model, ...) \method{get_coef}{mlm}(model, ...) \method{get_coef}{selection}(model, ...) \method{get_coef}{scam}(model, ...) \method{get_coef}{nls}(model, ...) \method{get_coef}{svyolr}(model, ...) \method{get_coef}{workflow}(model, ...) } \arguments{ \item{model}{Model object} \item{...}{Additional arguments are passed to the \code{predict()} method supplied by the modeling package.These arguments are particularly useful for mixed-effects or bayesian models (see the online vignettes on the \code{marginaleffects} website). Available arguments can vary from model to model, depending on the range of supported arguments by each modeling package. See the "Model-Specific Arguments" section of the \code{?slopes} documentation for a non-exhaustive list of available arguments.} } \value{ A named vector of coefficients. The names must match those of the variance matrix. } \description{ Get a named vector of coefficients from a model object (internal function) } \keyword{internal} marginaleffects/man/expect_slopes.Rd0000644000176200001440000000045214631452336017333 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tinytest.R \name{expect_slopes} \alias{expect_slopes} \title{\code{tinytest} helper} \usage{ expect_slopes(object, n_unique = NULL, pct_na = 5, se = TRUE, ...) } \description{ \code{tinytest} helper } \keyword{internal} marginaleffects/man/inferences.Rd0000644000176200001440000001243114631452336016577 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/inferences.R \name{inferences} \alias{inferences} \title{(EXPERIMENTAL) Bootstrap, Conformal, and Simulation-Based Inference} \usage{ inferences( x, method, R = 1000, conf_type = "perc", conformal_test = NULL, conformal_calibration = NULL, conformal_score = "residual_abs", ... ) } \arguments{ \item{x}{Object produced by one of the core \code{marginaleffects} functions.} \item{method}{String \itemize{ \item "delta": delta method standard errors \item "boot" package \item "fwb": fractional weighted bootstrap \item "rsample" package \item "simulation" from a multivariate normal distribution (Krinsky & Robb, 1986) \item "mi" multiple imputation for missing data \item "conformal_split": prediction intervals using split conformal prediction (see Angelopoulos & Bates, 2022) \item "conformal_cv+": prediction intervals using cross-validation+ conformal prediction (see Barber et al., 2020) }} \item{R}{Number of resamples, simulations, or cross-validation folds.} \item{conf_type}{String: type of bootstrap interval to construct. \itemize{ \item \code{boot}: "perc", "norm", "basic", or "bca" \item \code{fwb}: "perc", "norm", "basic", "bc", or "bca" \item \code{rsample}: "perc" or "bca" \item \code{simulation}: argument ignored. }} \item{conformal_test}{Data frame of test data for conformal prediction.} \item{conformal_calibration}{Data frame of calibration data for split conformal prediction (\verb{method="conformal_split}).} \item{conformal_score}{String. Warning: The \code{type} argument in \code{predictions()} must generate predictions which are on the same scale as the outcome variable. Typically, this means that \code{type} must be "response" or "probs". \itemize{ \item "residual_abs" or "residual_sq" for regression tasks (numeric outcome) \item "softmax" for classification tasks (when \code{predictions()} returns a \code{group} columns, such as multinomial or ordinal logit models. }} \item{...}{\itemize{ \item If \code{method="boot"}, additional arguments are passed to \code{boot::boot()}. \item If \code{method="fwb"}, additional arguments are passed to \code{fwb::fwb()}. \item If \code{method="rsample"}, additional arguments are passed to \code{rsample::bootstraps()}. \item Additional arguments are ignored for all other methods. }} } \value{ A \code{marginaleffects} object with simulation or bootstrap resamples and objects attached. } \description{ Warning: This function is experimental. It may be renamed, the user interface may change, or the functionality may migrate to arguments in other \code{marginaleffects} functions. Apply this function to a \code{marginaleffects} object to change the inferential method used to compute uncertainty estimates. } \details{ When \code{method="simulation"}, we conduct simulation-based inference following the method discussed in Krinsky & Robb (1986): \enumerate{ \item Draw \code{R} sets of simulated coefficients from a multivariate normal distribution with mean equal to the original model's estimated coefficients and variance equal to the model's variance-covariance matrix (classical, "HC3", or other). \item Use the \code{R} sets of coefficients to compute \code{R} sets of estimands: predictions, comparisons, slopes, or hypotheses. \item Take quantiles of the resulting distribution of estimands to obtain a confidence interval and the standard deviation of simulated estimates to estimate the standard error. } When \code{method="fwb"}, drawn weights are supplied to the model fitting function's \code{weights} argument; if the model doesn't accept non-integer weights, this method should not be used. If weights were included in the original model fit, they are extracted by \code{\link[=weights]{weights()}} and multiplied by the drawn weights. These weights are supplied to the \code{wts} argument of the estimation function (e.g., \code{comparisons()}). } \section{References}{ Krinsky, I., and A. L. Robb. 1986. “On Approximating the Statistical Properties of Elasticities.” Review of Economics and Statistics 68 (4): 715–9. King, Gary, Michael Tomz, and Jason Wittenberg. "Making the most of statistical analyses: Improving interpretation and presentation." American journal of political science (2000): 347-361 Dowd, Bryan E., William H. Greene, and Edward C. Norton. "Computation of standard errors." Health services research 49.2 (2014): 731-750. Angelopoulos, Anastasios N., and Stephen Bates. 2022. "A Gentle Introduction to Conformal Prediction and Distribution-Free Uncertainty Quantification." arXiv. https://doi.org/10.48550/arXiv.2107.07511. Barber, Rina Foygel, Emmanuel J. Candes, Aaditya Ramdas, and Ryan J. Tibshirani. 2020. “Predictive Inference with the Jackknife+.” arXiv. http://arxiv.org/abs/1905.02928. } \examples{ \dontrun{ library(marginaleffects) library(magrittr) set.seed(1024) mod <- lm(Sepal.Length ~ Sepal.Width * Species, data = iris) # bootstrap avg_predictions(mod, by = "Species") \%>\% inferences(method = "boot") avg_predictions(mod, by = "Species") \%>\% inferences(method = "rsample") # Fractional (bayesian) bootstrap avg_slopes(mod, by = "Species") \%>\% inferences(method = "fwb") \%>\% posterior_draws("rvar") \%>\% data.frame() # Simulation-based inference slopes(mod) \%>\% inferences(method = "simulation") \%>\% head() } } marginaleffects/man/marginalmeans.Rd0000644000176200001440000000100314631452336017265 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/deprecated.R \name{marginalmeans} \alias{marginalmeans} \title{Deprecated function} \usage{ marginalmeans( model, variables = NULL, newdata = NULL, vcov = TRUE, conf_level = 0.95, type = NULL, transform = NULL, cross = FALSE, hypothesis = NULL, equivalence = NULL, p_adjust = NULL, df = Inf, wts = "equal", by = NULL, numderiv = "fdforward", ... ) } \description{ Deprecated function } \keyword{internal} marginaleffects/man/get_group_names.Rd0000644000176200001440000000443214631452336017636 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/get_group_names.R, R/methods_MASS.R, % R/methods_nnet.R, R/methods_brglm2.R, R/methods_brms.R, R/methods_mclogit.R, % R/methods_mlm.R, R/methods_ordinal.R, R/methods_pscl.R, R/methods_survey.R \name{get_group_names} \alias{get_group_names} \alias{get_group_names.default} \alias{get_group_names.polr} \alias{get_group_names.multinom} \alias{get_group_names.bracl} \alias{get_group_names.brmsfit} \alias{get_group_names.mblogit} \alias{get_group_names.mlm} \alias{get_group_names.clm} \alias{get_group_names.hurdle} \alias{get_group_names.svyolr} \title{Get levels of the outcome variable in grouped or multivariate models} \usage{ get_group_names(model, ...) \method{get_group_names}{default}(model, ...) \method{get_group_names}{polr}(model, ...) \method{get_group_names}{multinom}(model, ...) \method{get_group_names}{bracl}(model, ...) \method{get_group_names}{brmsfit}(model, ...) \method{get_group_names}{mblogit}(model, type, ...) \method{get_group_names}{mlm}(model, ...) \method{get_group_names}{clm}(model, ...) \method{get_group_names}{hurdle}(model, type = "count", ...) \method{get_group_names}{svyolr}(model, ...) } \arguments{ \item{model}{Model object} \item{...}{Additional arguments are passed to the \code{predict()} method supplied by the modeling package.These arguments are particularly useful for mixed-effects or bayesian models (see the online vignettes on the \code{marginaleffects} website). Available arguments can vary from model to model, depending on the range of supported arguments by each modeling package. See the "Model-Specific Arguments" section of the \code{?slopes} documentation for a non-exhaustive list of available arguments.} \item{type}{string indicates the type (scale) of the predictions used to compute contrasts or slopes. This can differ based on the model type, but will typically be a string such as: "response", "link", "probs", or "zero". When an unsupported string is entered, the model-specific list of acceptable values is returned in an error message. When \code{type} is \code{NULL}, the first entry in the error message is used by default.} } \value{ A character vector } \description{ Get levels of the outcome variable in grouped or multivariate models } \keyword{internal} marginaleffects/man/meffects.Rd0000644000176200001440000000034714631452336016255 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/deprecated.R \name{meffects} \alias{meffects} \title{Deprecated function} \usage{ meffects(...) } \description{ Deprecated function } \keyword{internal} marginaleffects/man/expect_predictions.Rd0000644000176200001440000000046314631452336020353 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tinytest.R \name{expect_predictions} \alias{expect_predictions} \title{\code{tinytest} helper} \usage{ expect_predictions(object, se = TRUE, n_row = NULL, n_col = NULL) } \description{ \code{tinytest} helper } \keyword{internal} marginaleffects/man/expect_margins.Rd0000644000176200001440000000051414631452336017465 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tinytest.R \name{expect_margins} \alias{expect_margins} \title{\code{tinytest} helper} \usage{ expect_margins( results, margins_object, se = TRUE, tolerance = 1e-05, verbose = FALSE ) } \description{ \code{tinytest} helper } \keyword{internal} marginaleffects/man/predictions.Rd0000644000176200001440000006512714632674174017022 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/predictions.R \name{predictions} \alias{predictions} \alias{avg_predictions} \title{Predictions} \usage{ predictions( model, newdata = NULL, variables = NULL, vcov = TRUE, conf_level = 0.95, type = NULL, by = FALSE, byfun = NULL, wts = FALSE, transform = NULL, hypothesis = NULL, equivalence = NULL, p_adjust = NULL, df = Inf, numderiv = "fdforward", ... ) avg_predictions( model, newdata = NULL, variables = NULL, vcov = TRUE, conf_level = 0.95, type = NULL, by = TRUE, byfun = NULL, wts = FALSE, transform = NULL, hypothesis = NULL, equivalence = NULL, p_adjust = NULL, df = Inf, numderiv = "fdforward", ... ) } \arguments{ \item{model}{Model object} \item{newdata}{Grid of predictor values at which we evaluate predictions. \itemize{ \item Warning: Please avoid modifying your dataset between fitting the model and calling a \code{marginaleffects} function. This can sometimes lead to unexpected results. \item \code{NULL} (default): Unit-level predictions for each observed value in the dataset (empirical distribution). The dataset is retrieved using \code{\link[insight:get_data]{insight::get_data()}}, which tries to extract data from the environment. This may produce unexpected results if the original data frame has been altered since fitting the model. \item string: \itemize{ \item "mean": Predictions evaluated when each predictor is held at its mean or mode. \item "median": Predictions evaluated when each predictor is held at its median or mode. \item "balanced": Predictions evaluated on a balanced grid with every combination of categories and numeric variables held at their means. \item "tukey": Predictions evaluated at Tukey's 5 numbers. \item "grid": Predictions evaluated on a grid of representative numbers (Tukey's 5 numbers and unique values of categorical predictors). } \item \code{\link[=datagrid]{datagrid()}} call to specify a custom grid of regressors. For example: \itemize{ \item \code{newdata = datagrid(cyl = c(4, 6))}: \code{cyl} variable equal to 4 and 6 and other regressors fixed at their means or modes. \item See the Examples section and the \code{\link[=datagrid]{datagrid()}} documentation. } \item \code{\link[=subset]{subset()}} call with a single argument to select a subset of the dataset used to fit the model, ex: \code{newdata = subset(treatment == 1)} \item \code{\link[dplyr:filter]{dplyr::filter()}} call with a single argument to select a subset of the dataset used to fit the model, ex: \code{newdata = filter(treatment == 1)} }} \item{variables}{Counterfactual variables. \itemize{ \item Output: \itemize{ \item \code{predictions()}: The entire dataset is replicated once for each unique combination of \code{variables}, and predictions are made. \item \code{avg_predictions()}: The entire dataset is replicated, predictions are made, and they are marginalized by \code{variables} categories. \item Warning: This can be expensive in large datasets. \item Warning: Users who need "conditional" predictions should use the \code{newdata} argument instead of \code{variables}. } \item Input: \itemize{ \item \code{NULL}: computes one prediction per row of \code{newdata} \item Character vector: the dataset is replicated once of every combination of unique values of the variables identified in \code{variables}. \item Named list: names identify the subset of variables of interest and their values. For numeric variables, the \code{variables} argument supports functions and string shortcuts: \itemize{ \item A function which returns a numeric value \item Numeric vector: Contrast between the 2nd element and the 1st element of the \code{x} vector. \item "iqr": Contrast across the interquartile range of the regressor. \item "sd": Contrast across one standard deviation around the regressor mean. \item "2sd": Contrast across two standard deviations around the regressor mean. \item "minmax": Contrast between the maximum and the minimum values of the regressor. \item "threenum": mean and 1 standard deviation on both sides \item "fivenum": Tukey's five numbers } } }} \item{vcov}{Type of uncertainty estimates to report (e.g., for robust standard errors). Acceptable values: \itemize{ \item FALSE: Do not compute standard errors. This can speed up computation considerably. \item TRUE: Unit-level standard errors using the default \code{vcov(model)} variance-covariance matrix. \item String which indicates the kind of uncertainty estimates to return. \itemize{ \item Heteroskedasticity-consistent: \code{"HC"}, \code{"HC0"}, \code{"HC1"}, \code{"HC2"}, \code{"HC3"}, \code{"HC4"}, \code{"HC4m"}, \code{"HC5"}. See \code{?sandwich::vcovHC} \item Heteroskedasticity and autocorrelation consistent: \code{"HAC"} \item Mixed-Models degrees of freedom: "satterthwaite", "kenward-roger" \item Other: \code{"NeweyWest"}, \code{"KernHAC"}, \code{"OPG"}. See the \code{sandwich} package documentation. } \item One-sided formula which indicates the name of cluster variables (e.g., \code{~unit_id}). This formula is passed to the \code{cluster} argument of the \code{sandwich::vcovCL} function. \item Square covariance matrix \item Function which returns a covariance matrix (e.g., \code{stats::vcov(model)}) }} \item{conf_level}{numeric value between 0 and 1. Confidence level to use to build a confidence interval.} \item{type}{string indicates the type (scale) of the predictions used to compute contrasts or slopes. This can differ based on the model type, but will typically be a string such as: "response", "link", "probs", or "zero". When an unsupported string is entered, the model-specific list of acceptable values is returned in an error message. When \code{type} is \code{NULL}, the first entry in the error message is used by default.} \item{by}{Aggregate unit-level estimates (aka, marginalize, average over). Valid inputs: \itemize{ \item \code{FALSE}: return the original unit-level estimates. \item \code{TRUE}: aggregate estimates for each term. \item Character vector of column names in \code{newdata} or in the data frame produced by calling the function without the \code{by} argument. \item Data frame with a \code{by} column of group labels, and merging columns shared by \code{newdata} or the data frame produced by calling the same function without the \code{by} argument. \item See examples below. \item For more complex aggregations, you can use the \code{FUN} argument of the \code{hypotheses()} function. See that function's documentation and the Hypothesis Test vignettes on the \code{marginaleffects} website. }} \item{byfun}{A function such as \code{mean()} or \code{sum()} used to aggregate estimates within the subgroups defined by the \code{by} argument. \code{NULL} uses the \code{mean()} function. Must accept a numeric vector and return a single numeric value. This is sometimes used to take the sum or mean of predicted probabilities across outcome or predictor levels. See examples section.} \item{wts}{logical, string or numeric: weights to use when computing average predictions, contrasts or slopes. These weights only affect the averaging in \verb{avg_*()} or with the \code{by} argument, and not unit-level estimates. See \code{?weighted.mean} \itemize{ \item string: column name of the weights variable in \code{newdata}. When supplying a column name to \code{wts}, it is recommended to supply the original data (including the weights variable) explicitly to \code{newdata}. \item numeric: vector of length equal to the number of rows in the original data or in \code{newdata} (if supplied). \item FALSE: Equal weights. \item TRUE: Extract weights from the fitted object with \code{insight::find_weights()} and use them when taking weighted averages of estimates. Warning: \code{newdata=datagrid()} returns a single average weight, which is equivalent to using \code{wts=FALSE} }} \item{transform}{A function applied to unit-level adjusted predictions and confidence intervals just before the function returns results. For bayesian models, this function is applied to individual draws from the posterior distribution, before computing summaries.} \item{hypothesis}{specify a hypothesis test or custom contrast using a numeric value, vector, or matrix; a string equation; string; a formula, or a function. \itemize{ \item Numeric: \itemize{ \item Single value: the null hypothesis used in the computation of Z and p (before applying \code{transform}). \item Vector: Weights to compute a linear combination of (custom contrast between) estimates. Length equal to the number of rows generated by the same function call, but without the \code{hypothesis} argument. \item Matrix: Each column is a vector of weights, as describe above, used to compute a distinct linear combination of (contrast between) estimates. The column names of the matrix are used as labels in the output. } \item String equation to specify linear or non-linear hypothesis tests. If the \code{term} column uniquely identifies rows, terms can be used in the formula. Otherwise, use \code{b1}, \code{b2}, etc. to identify the position of each parameter. The \verb{b*} wildcard can be used to test hypotheses on all estimates. If a named vector is used, the names are used as labels in the output. Examples: \itemize{ \item \code{hp = drat} \item \code{hp + drat = 12} \item \code{b1 + b2 + b3 = 0} \item \verb{b* / b1 = 1} } \item String: \itemize{ \item "pairwise": pairwise differences between estimates in each row. \item "reference": differences between the estimates in each row and the estimate in the first row. \item "sequential": difference between an estimate and the estimate in the next row. \item "meandev": difference between an estimate and the mean of all estimates. \item "meanotherdev": difference between an estimate and the mean of all other estimates, excluding the current one. \item "revpairwise", "revreference", "revsequential": inverse of the corresponding hypotheses, as described above. } \item Formula: \itemize{ \item \code{comparison ~ pairs | group} \item Left-hand side determines the type of comparison to conduct: \code{difference} or \code{ratio}. If the left-hand side is empty, \code{difference} is chosen. \item Right-hand side determines the pairs of estimates to compare: \code{reference}, \code{sequential}, or \code{meandev} \item Optional: Users can supply grouping variables after a vertical bar to conduct comparisons withing subsets. \item Examples: \itemize{ \item \code{~ reference} \item \code{ratio ~ pairwise} \item \code{difference ~ pairwise | groupid} } } \item Function: \itemize{ \item Accepts an argument \code{x}: object produced by a \code{marginaleffects} function or a data frame with column \code{rowid} and \code{estimate} \item Returns a data frame with columns \code{term} and \code{estimate} (mandatory) and \code{rowid} (optional). \item The function can also accept optional input arguments: \code{newdata}, \code{by}, \code{draws}. \item This function approach will not work for Bayesian models or with bootstrapping. In those cases, it is easy to use \code{posterior_draws()} to extract and manipulate the draws directly. } \item See the Examples section below and the vignette: https://marginaleffects.com/vignettes/hypothesis.html }} \item{equivalence}{Numeric vector of length 2: bounds used for the two-one-sided test (TOST) of equivalence, and for the non-inferiority and non-superiority tests. See Details section below.} \item{p_adjust}{Adjust p-values for multiple comparisons: "holm", "hochberg", "hommel", "bonferroni", "BH", "BY", or "fdr". See \link[stats:p.adjust]{stats::p.adjust}} \item{df}{Degrees of freedom used to compute p values and confidence intervals. A single numeric value between 1 and \code{Inf}. When \code{df} is \code{Inf}, the normal distribution is used. When \code{df} is finite, the \code{t} distribution is used. See \link[insight:get_df]{insight::get_df} for a convenient function to extract degrees of freedom. Ex: \code{slopes(model, df = insight::get_df(model))}} \item{numderiv}{string or list of strings indicating the method to use to for the numeric differentiation used in to compute delta method standard errors. \itemize{ \item "fdforward": finite difference method with forward differences \item "fdcenter": finite difference method with central differences (default) \item "richardson": Richardson extrapolation method \item Extra arguments can be specified by passing a list to the \code{numDeriv} argument, with the name of the method first and named arguments following, ex: \code{numderiv=list("fdcenter", eps = 1e-5)}. When an unknown argument is used, \code{marginaleffects} prints the list of valid arguments for each method. }} \item{...}{Additional arguments are passed to the \code{predict()} method supplied by the modeling package.These arguments are particularly useful for mixed-effects or bayesian models (see the online vignettes on the \code{marginaleffects} website). Available arguments can vary from model to model, depending on the range of supported arguments by each modeling package. See the "Model-Specific Arguments" section of the \code{?slopes} documentation for a non-exhaustive list of available arguments.} } \value{ A \code{data.frame} with one row per observation and several columns: \itemize{ \item \code{rowid}: row number of the \code{newdata} data frame \item \code{type}: prediction type, as defined by the \code{type} argument \item \code{group}: (optional) value of the grouped outcome (e.g., categorical outcome models) \item \code{estimate}: predicted outcome \item \code{std.error}: standard errors computed using the delta method. \item \code{p.value}: p value associated to the \code{estimate} column. The null is determined by the \code{hypothesis} argument (0 by default), and p values are computed before applying the \code{transform} argument. For models of class \code{feglm}, \code{Gam}, \code{glm} and \code{negbin}, p values are computed on the link scale by default unless the \code{type} argument is specified explicitly. \item \code{s.value}: Shannon information transforms of p values. How many consecutive "heads" tosses would provide the same amount of evidence (or "surprise") against the null hypothesis that the coin is fair? The purpose of S is to calibrate the analyst's intuition about the strength of evidence encoded in p against a well-known physical phenomenon. See Greenland (2019) and Cole et al. (2020). \item \code{conf.low}: lower bound of the confidence interval (or equal-tailed interval for bayesian models) \item \code{conf.high}: upper bound of the confidence interval (or equal-tailed interval for bayesian models) } See \code{?print.marginaleffects} for printing options. } \description{ Outcome predicted by a fitted model on a specified scale for a given combination of values of the predictor variables, such as their observed values, their means, or factor levels (a.k.a. "reference grid"). \itemize{ \item \code{predictions()}: unit-level (conditional) estimates. \item \code{avg_predictions()}: average (marginal) estimates. } The \code{newdata} argument and the \code{datagrid()} function can be used to control where statistics are evaluated in the predictor space: "at observed values", "at the mean", "at representative values", etc. See the predictions vignette and package website for worked examples and case studies: \itemize{ \item \url{https://marginaleffects.com/vignettes/predictions.html} \item \url{https://marginaleffects.com/} } } \section{Functions}{ \itemize{ \item \code{avg_predictions()}: Average predictions }} \section{Standard errors using the delta method}{ Standard errors for all quantities estimated by \code{marginaleffects} can be obtained via the delta method. This requires differentiating a function with respect to the coefficients in the model using a finite difference approach. In some models, the delta method standard errors can be sensitive to various aspects of the numeric differentiation strategy, including the step size. By default, the step size is set to \code{1e-8}, or to \code{1e-4} times the smallest absolute model coefficient, whichever is largest. \code{marginaleffects} can delegate numeric differentiation to the \code{numDeriv} package, which allows more flexibility. To do this, users can pass arguments to the \code{numDeriv::jacobian} function through a global option. For example: \itemize{ \item \code{options(marginaleffects_numDeriv = list(method = "simple", method.args = list(eps = 1e-6)))} \item \code{options(marginaleffects_numDeriv = list(method = "Richardson", method.args = list(eps = 1e-5)))} \item \code{options(marginaleffects_numDeriv = NULL)} } See the "Standard Errors and Confidence Intervals" vignette on the \code{marginaleffects} website for more details on the computation of standard errors: https://marginaleffects.com/vignettes/uncertainty.html Note that the \code{inferences()} function can be used to compute uncertainty estimates using a bootstrap or simulation-based inference. See the vignette: https://marginaleffects.com/vignettes/bootstrap.html } \section{Model-Specific Arguments}{ Some model types allow model-specific arguments to modify the nature of marginal effects, predictions, marginal means, and contrasts. Please report other package-specific \code{predict()} arguments on Github so we can add them to the table below. https://github.com/vincentarelbundock/marginaleffects/issues\tabular{llll}{ Package \tab Class \tab Argument \tab Documentation \cr \code{brms} \tab \code{brmsfit} \tab \code{ndraws} \tab \link[brms:posterior_predict.brmsfit]{brms::posterior_predict} \cr \tab \tab \code{re_formula} \tab \link[brms:posterior_predict.brmsfit]{brms::posterior_predict} \cr \code{lme4} \tab \code{merMod} \tab \code{re.form} \tab \link[lme4:predict.merMod]{lme4::predict.merMod} \cr \tab \tab \code{allow.new.levels} \tab \link[lme4:predict.merMod]{lme4::predict.merMod} \cr \code{glmmTMB} \tab \code{glmmTMB} \tab \code{re.form} \tab \link[glmmTMB:predict.glmmTMB]{glmmTMB::predict.glmmTMB} \cr \tab \tab \code{allow.new.levels} \tab \link[glmmTMB:predict.glmmTMB]{glmmTMB::predict.glmmTMB} \cr \tab \tab \code{zitype} \tab \link[glmmTMB:predict.glmmTMB]{glmmTMB::predict.glmmTMB} \cr \code{mgcv} \tab \code{bam} \tab \code{exclude} \tab \link[mgcv:predict.bam]{mgcv::predict.bam} \cr \code{robustlmm} \tab \code{rlmerMod} \tab \code{re.form} \tab \link[robustlmm:rlmerMod-class]{robustlmm::predict.rlmerMod} \cr \tab \tab \code{allow.new.levels} \tab \link[robustlmm:rlmerMod-class]{robustlmm::predict.rlmerMod} \cr \code{MCMCglmm} \tab \code{MCMCglmm} \tab \code{ndraws} \tab \cr } } \section{Bayesian posterior summaries}{ By default, credible intervals in bayesian models are built as equal-tailed intervals. This can be changed to a highest density interval by setting a global option: \code{options("marginaleffects_posterior_interval" = "eti")} \code{options("marginaleffects_posterior_interval" = "hdi")} By default, the center of the posterior distribution in bayesian models is identified by the median. Users can use a different summary function by setting a global option: \code{options("marginaleffects_posterior_center" = "mean")} \code{options("marginaleffects_posterior_center" = "median")} When estimates are averaged using the \code{by} argument, the \code{tidy()} function, or the \code{summary()} function, the posterior distribution is marginalized twice over. First, we take the average \emph{across} units but \emph{within} each iteration of the MCMC chain, according to what the user requested in \code{by} argument or \code{tidy()/summary()} functions. Then, we identify the center of the resulting posterior using the function supplied to the \code{"marginaleffects_posterior_center"} option (the median by default). } \section{Equivalence, Inferiority, Superiority}{ \eqn{\theta} is an estimate, \eqn{\sigma_\theta} its estimated standard error, and \eqn{[a, b]} are the bounds of the interval supplied to the \code{equivalence} argument. Non-inferiority: \itemize{ \item \eqn{H_0}{H0}: \eqn{\theta \leq a}{\theta <= a} \item \eqn{H_1}{H1}: \eqn{\theta > a} \item \eqn{t=(\theta - a)/\sigma_\theta}{t=(\theta - a)/\sigma_\theta} \item p: Upper-tail probability } Non-superiority: \itemize{ \item \eqn{H_0}{H0}: \eqn{\theta \geq b}{\theta >= b} \item \eqn{H_1}{H1}: \eqn{\theta < b} \item \eqn{t=(\theta - b)/\sigma_\theta}{t=(\theta - b)/\sigma_\theta} \item p: Lower-tail probability } Equivalence: Two One-Sided Tests (TOST) \itemize{ \item p: Maximum of the non-inferiority and non-superiority p values. } Thanks to Russell V. Lenth for the excellent \code{emmeans} package and documentation which inspired this feature. } \section{Prediction types}{ The \code{type} argument determines the scale of the predictions used to compute quantities of interest with functions from the \code{marginaleffects} package. Admissible values for \code{type} depend on the model object. When users specify an incorrect value for \code{type}, \code{marginaleffects} will raise an informative error with a list of valid \code{type} values for the specific model object. The first entry in the list in that error message is the default type. The \code{invlink(link)} is a special type defined by \code{marginaleffects}. It is available for some (but not all) models and functions. With this link type, we first compute predictions on the link scale, then we use the inverse link function to backtransform the predictions to the response scale. This is useful for models with non-linear link functions as it can ensure that confidence intervals stay within desirable bounds, ex: 0 to 1 for a logit model. Note that an average of estimates with \code{type="invlink(link)"} will not always be equivalent to the average of estimates with \code{type="response"}. Some of the most common \code{type} values are: response, link, E, Ep, average, class, conditional, count, cum.prob, cumhaz, cumprob, density, detection, disp, ev, expected, expvalue, fitted, hazard, invlink(link), latent, latent_N, linear, linear.predictor, linpred, location, lp, mean, numeric, p, ppd, pr, precision, prediction, prob, probability, probs, quantile, risk, rmst, scale, survival, unconditional, utility, variance, xb, zero, zlink, zprob } \section{Order of operations}{ Behind the scenes, the arguments of \code{marginaleffects} functions are evaluated in this order: \enumerate{ \item \code{newdata} \item \code{variables} \item \code{comparison} and \code{slopes} \item \code{by} \item \code{vcov} \item \code{hypothesis} \item \code{transform} } } \section{Parallel computation}{ The \code{slopes()} and \code{comparisons()} functions can use parallelism to speed up computation. Operations are parallelized for the computation of standard errors, at the model coefficient level. There is always considerable overhead when using parallel computation, mainly involved in passing the whole dataset to the different processes. Thus, parallel computation is most likely to be useful when the model includes many parameters and the dataset is relatively small. Warning: In many cases, parallel processing will not be useful at all. To activate parallel computation, users must load the \code{future.apply} package, call \code{plan()} function, and set a global option. For example: \if{html}{\out{
}}\preformatted{library(future.apply) plan("multicore", workers = 4) options(marginaleffects_parallel = TRUE) slopes(model) }\if{html}{\out{
}} To disable parallelism in \code{marginaleffects} altogether, you can set a global option: \if{html}{\out{
}}\preformatted{options(marginaleffects_parallel = FALSE) }\if{html}{\out{
}} } \section{Global options}{ The behavior of \code{marginaleffects} functions can be modified by setting global options. Disable some safety checks: \if{html}{\out{
}}\preformatted{options(marginaleffects_safe = FALSE)` }\if{html}{\out{
}} } \examples{ \dontshow{if (interactive() || isTRUE(Sys.getenv("R_DOC_BUILD") == "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} \dontshow{\}) # examplesIf} # Adjusted Prediction for every row of the original dataset mod <- lm(mpg ~ hp + factor(cyl), data = mtcars) pred <- predictions(mod) head(pred) # Adjusted Predictions at User-Specified Values of the Regressors predictions(mod, newdata = datagrid(hp = c(100, 120), cyl = 4)) m <- lm(mpg ~ hp + drat + factor(cyl) + factor(am), data = mtcars) predictions(m, newdata = datagrid(FUN_factor = unique, FUN_numeric = median)) # Average Adjusted Predictions (AAP) library(dplyr) mod <- lm(mpg ~ hp * am * vs, mtcars) avg_predictions(mod) predictions(mod, by = "am") # Conditional Adjusted Predictions plot_predictions(mod, condition = "hp") # Counterfactual predictions with the `variables` argument # the `mtcars` dataset has 32 rows mod <- lm(mpg ~ hp + am, data = mtcars) p <- predictions(mod) head(p) nrow(p) # average counterfactual predictions avg_predictions(mod, variables = "am") # counterfactual predictions obtained by replicating the entire for different # values of the predictors p <- predictions(mod, variables = list(hp = c(90, 110))) nrow(p) # hypothesis test: is the prediction in the 1st row equal to the prediction in the 2nd row mod <- lm(mpg ~ wt + drat, data = mtcars) predictions( mod, newdata = datagrid(wt = 2:3), hypothesis = "b1 = b2") # same hypothesis test using row indices predictions( mod, newdata = datagrid(wt = 2:3), hypothesis = "b1 - b2 = 0") # same hypothesis test using numeric vector of weights predictions( mod, newdata = datagrid(wt = 2:3), hypothesis = c(1, -1)) # two custom contrasts using a matrix of weights lc <- matrix(c( 1, -1, 2, 3), ncol = 2) predictions( mod, newdata = datagrid(wt = 2:3), hypothesis = lc) # `by` argument mod <- lm(mpg ~ hp * am * vs, data = mtcars) predictions(mod, by = c("am", "vs")) library(nnet) nom <- multinom(factor(gear) ~ mpg + am * vs, data = mtcars, trace = FALSE) # first 5 raw predictions predictions(nom, type = "probs") |> head() # average predictions avg_predictions(nom, type = "probs", by = "group") by <- data.frame( group = c("3", "4", "5"), by = c("3,4", "3,4", "5")) predictions(nom, type = "probs", by = by) # sum of predicted probabilities for combined response levels mod <- multinom(factor(cyl) ~ mpg + am, data = mtcars, trace = FALSE) by <- data.frame( by = c("4,6", "4,6", "8"), group = as.character(c(4, 6, 8))) predictions(mod, newdata = "mean", byfun = sum, by = by) } \references{ \itemize{ \item Greenland S. 2019. "Valid P-Values Behave Exactly as They Should: Some Misleading Criticisms of P-Values and Their Resolution With S-Values." The American Statistician. 73(S1): 106–114. \item Cole, Stephen R, Jessie K Edwards, and Sander Greenland. 2020. "Surprise!" American Journal of Epidemiology 190 (2): 191–93. https://doi.org/10.1093/aje/kwaa136 } } marginaleffects/man/reexports.Rd0000644000176200001440000000066714631452336016521 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/broom.R \docType{import} \name{reexports} \alias{reexports} \alias{tidy} \alias{glance} \title{Objects exported from other packages} \keyword{internal} \description{ These objects are imported from other packages. Follow the links below to see their documentation. \describe{ \item{generics}{\code{\link[generics]{glance}}, \code{\link[generics]{tidy}}} }} marginaleffects/man/get_vcov.Rd0000644000176200001440000000756114631452336016302 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/get_vcov.R, R/methods_MCMCglmm.R, % R/methods_afex.R, R/methods_aod.R, R/methods_biglm.R, R/methods_brms.R, % R/methods_dbarts.R, R/methods_gamlss.R, R/methods_glmmTMB.R, % R/methods_mhurdle.R, R/methods_mlr3.R, R/methods_rms.R, R/methods_scam.R, % R/methods_tidymodels.R \name{get_vcov} \alias{get_vcov} \alias{get_vcov.default} \alias{get_vcov.MCMCglmm} \alias{get_vcov.afex_aov} \alias{get_vcov.glimML} \alias{get_vcov.biglm} \alias{get_vcov.brmsfit} \alias{get_vcov.bart} \alias{get_vcov.gamlss} \alias{get_vcov.glmmTMB} \alias{get_vcov.mhurdle} \alias{get_vcov.Learner} \alias{get_vcov.orm} \alias{get_vcov.scam} \alias{get_vcov.model_fit} \alias{get_vcov.workflow} \title{Get a named variance-covariance matrix from a model object (internal function)} \usage{ get_vcov(model, ...) \method{get_vcov}{default}(model, vcov = NULL, ...) \method{get_vcov}{MCMCglmm}(model, vcov = NULL, ...) \method{get_vcov}{afex_aov}(model, vcov = NULL, ...) \method{get_vcov}{glimML}(model, vcov = NULL, ...) \method{get_vcov}{biglm}(model, vcov = NULL, ...) \method{get_vcov}{brmsfit}(model, vcov = NULL, ...) \method{get_vcov}{bart}(model, vcov = NULL, ...) \method{get_vcov}{gamlss}(model, ...) \method{get_vcov}{glmmTMB}(model, ...) \method{get_vcov}{mhurdle}(model, vcov = NULL, ...) \method{get_vcov}{Learner}(model, ...) \method{get_vcov}{orm}(model, vcov = NULL, ...) \method{get_vcov}{scam}(model, vcov = NULL, ...) \method{get_vcov}{model_fit}(model, type = NULL, ...) \method{get_vcov}{workflow}(model, type = NULL, ...) } \arguments{ \item{model}{Model object} \item{...}{Additional arguments are passed to the \code{predict()} method supplied by the modeling package.These arguments are particularly useful for mixed-effects or bayesian models (see the online vignettes on the \code{marginaleffects} website). Available arguments can vary from model to model, depending on the range of supported arguments by each modeling package. See the "Model-Specific Arguments" section of the \code{?slopes} documentation for a non-exhaustive list of available arguments.} \item{vcov}{Type of uncertainty estimates to report (e.g., for robust standard errors). Acceptable values: \itemize{ \item FALSE: Do not compute standard errors. This can speed up computation considerably. \item TRUE: Unit-level standard errors using the default \code{vcov(model)} variance-covariance matrix. \item String which indicates the kind of uncertainty estimates to return. \itemize{ \item Heteroskedasticity-consistent: \code{"HC"}, \code{"HC0"}, \code{"HC1"}, \code{"HC2"}, \code{"HC3"}, \code{"HC4"}, \code{"HC4m"}, \code{"HC5"}. See \code{?sandwich::vcovHC} \item Heteroskedasticity and autocorrelation consistent: \code{"HAC"} \item Mixed-Models degrees of freedom: "satterthwaite", "kenward-roger" \item Other: \code{"NeweyWest"}, \code{"KernHAC"}, \code{"OPG"}. See the \code{sandwich} package documentation. } \item One-sided formula which indicates the name of cluster variables (e.g., \code{~unit_id}). This formula is passed to the \code{cluster} argument of the \code{sandwich::vcovCL} function. \item Square covariance matrix \item Function which returns a covariance matrix (e.g., \code{stats::vcov(model)}) }} \item{type}{string indicates the type (scale) of the predictions used to compute contrasts or slopes. This can differ based on the model type, but will typically be a string such as: "response", "link", "probs", or "zero". When an unsupported string is entered, the model-specific list of acceptable values is returned in an error message. When \code{type} is \code{NULL}, the first entry in the error message is used by default.} } \value{ A named square matrix of variance and covariances. The names must match the coefficient names. } \description{ Get a named variance-covariance matrix from a model object (internal function) } \keyword{internal} marginaleffects/man/slopes.Rd0000644000176200001440000006272714632674174016007 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/slopes.R \name{slopes} \alias{slopes} \alias{avg_slopes} \title{Slopes (aka Partial derivatives, Marginal Effects, or Trends)} \usage{ slopes( model, newdata = NULL, variables = NULL, type = NULL, by = FALSE, vcov = TRUE, conf_level = 0.95, slope = "dydx", wts = FALSE, hypothesis = NULL, equivalence = NULL, p_adjust = NULL, df = Inf, eps = NULL, numderiv = "fdforward", ... ) avg_slopes( model, newdata = NULL, variables = NULL, type = NULL, by = TRUE, vcov = TRUE, conf_level = 0.95, slope = "dydx", wts = FALSE, hypothesis = NULL, equivalence = NULL, p_adjust = NULL, df = Inf, eps = NULL, numderiv = "fdforward", ... ) } \arguments{ \item{model}{Model object} \item{newdata}{Grid of predictor values at which we evaluate the slopes. \itemize{ \item Warning: Please avoid modifying your dataset between fitting the model and calling a \code{marginaleffects} function. This can sometimes lead to unexpected results. \item \code{NULL} (default): Unit-level slopes for each observed value in the dataset (empirical distribution). The dataset is retrieved using \code{\link[insight:get_data]{insight::get_data()}}, which tries to extract data from the environment. This may produce unexpected results if the original data frame has been altered since fitting the model. \item \code{\link[=datagrid]{datagrid()}} call to specify a custom grid of regressors. For example: \itemize{ \item \code{newdata = datagrid(cyl = c(4, 6))}: \code{cyl} variable equal to 4 and 6 and other regressors fixed at their means or modes. \item See the Examples section and the \code{\link[=datagrid]{datagrid()}} documentation. } \item \code{\link[=subset]{subset()}} call with a single argument to select a subset of the dataset used to fit the model, ex: \code{newdata = subset(treatment == 1)} \item \code{\link[dplyr:filter]{dplyr::filter()}} call with a single argument to select a subset of the dataset used to fit the model, ex: \code{newdata = filter(treatment == 1)} \item string: \itemize{ \item "mean": Slopes evaluated when each predictor is held at its mean or mode. \item "median": Slopes evaluated when each predictor is held at its median or mode. \item "balanced": Slopes evaluated on a balanced grid with every combination of categories and numeric variables held at their means. \item "tukey": Slopes evaluated at Tukey's 5 numbers. \item "grid": Slopes evaluated on a grid of representative numbers (Tukey's 5 numbers and unique values of categorical predictors). } }} \item{variables}{Focal variables \itemize{ \item \code{NULL}: compute slopes or comparisons for all the variables in the model object (can be slow). \item Character vector: subset of variables (usually faster). }} \item{type}{string indicates the type (scale) of the predictions used to compute contrasts or slopes. This can differ based on the model type, but will typically be a string such as: "response", "link", "probs", or "zero". When an unsupported string is entered, the model-specific list of acceptable values is returned in an error message. When \code{type} is \code{NULL}, the first entry in the error message is used by default.} \item{by}{Aggregate unit-level estimates (aka, marginalize, average over). Valid inputs: \itemize{ \item \code{FALSE}: return the original unit-level estimates. \item \code{TRUE}: aggregate estimates for each term. \item Character vector of column names in \code{newdata} or in the data frame produced by calling the function without the \code{by} argument. \item Data frame with a \code{by} column of group labels, and merging columns shared by \code{newdata} or the data frame produced by calling the same function without the \code{by} argument. \item See examples below. \item For more complex aggregations, you can use the \code{FUN} argument of the \code{hypotheses()} function. See that function's documentation and the Hypothesis Test vignettes on the \code{marginaleffects} website. }} \item{vcov}{Type of uncertainty estimates to report (e.g., for robust standard errors). Acceptable values: \itemize{ \item FALSE: Do not compute standard errors. This can speed up computation considerably. \item TRUE: Unit-level standard errors using the default \code{vcov(model)} variance-covariance matrix. \item String which indicates the kind of uncertainty estimates to return. \itemize{ \item Heteroskedasticity-consistent: \code{"HC"}, \code{"HC0"}, \code{"HC1"}, \code{"HC2"}, \code{"HC3"}, \code{"HC4"}, \code{"HC4m"}, \code{"HC5"}. See \code{?sandwich::vcovHC} \item Heteroskedasticity and autocorrelation consistent: \code{"HAC"} \item Mixed-Models degrees of freedom: "satterthwaite", "kenward-roger" \item Other: \code{"NeweyWest"}, \code{"KernHAC"}, \code{"OPG"}. See the \code{sandwich} package documentation. } \item One-sided formula which indicates the name of cluster variables (e.g., \code{~unit_id}). This formula is passed to the \code{cluster} argument of the \code{sandwich::vcovCL} function. \item Square covariance matrix \item Function which returns a covariance matrix (e.g., \code{stats::vcov(model)}) }} \item{conf_level}{numeric value between 0 and 1. Confidence level to use to build a confidence interval.} \item{slope}{string indicates the type of slope or (semi-)elasticity to compute: \itemize{ \item "dydx": dY/dX \item "eyex": dY/dX * Y / X \item "eydx": dY/dX * Y \item "dyex": dY/dX / X \item Y is the predicted value of the outcome; X is the observed value of the predictor. }} \item{wts}{logical, string or numeric: weights to use when computing average predictions, contrasts or slopes. These weights only affect the averaging in \verb{avg_*()} or with the \code{by} argument, and not unit-level estimates. See \code{?weighted.mean} \itemize{ \item string: column name of the weights variable in \code{newdata}. When supplying a column name to \code{wts}, it is recommended to supply the original data (including the weights variable) explicitly to \code{newdata}. \item numeric: vector of length equal to the number of rows in the original data or in \code{newdata} (if supplied). \item FALSE: Equal weights. \item TRUE: Extract weights from the fitted object with \code{insight::find_weights()} and use them when taking weighted averages of estimates. Warning: \code{newdata=datagrid()} returns a single average weight, which is equivalent to using \code{wts=FALSE} }} \item{hypothesis}{specify a hypothesis test or custom contrast using a numeric value, vector, or matrix; a string equation; string; a formula, or a function. \itemize{ \item Numeric: \itemize{ \item Single value: the null hypothesis used in the computation of Z and p (before applying \code{transform}). \item Vector: Weights to compute a linear combination of (custom contrast between) estimates. Length equal to the number of rows generated by the same function call, but without the \code{hypothesis} argument. \item Matrix: Each column is a vector of weights, as describe above, used to compute a distinct linear combination of (contrast between) estimates. The column names of the matrix are used as labels in the output. } \item String equation to specify linear or non-linear hypothesis tests. If the \code{term} column uniquely identifies rows, terms can be used in the formula. Otherwise, use \code{b1}, \code{b2}, etc. to identify the position of each parameter. The \verb{b*} wildcard can be used to test hypotheses on all estimates. If a named vector is used, the names are used as labels in the output. Examples: \itemize{ \item \code{hp = drat} \item \code{hp + drat = 12} \item \code{b1 + b2 + b3 = 0} \item \verb{b* / b1 = 1} } \item String: \itemize{ \item "pairwise": pairwise differences between estimates in each row. \item "reference": differences between the estimates in each row and the estimate in the first row. \item "sequential": difference between an estimate and the estimate in the next row. \item "meandev": difference between an estimate and the mean of all estimates. \item "meanotherdev": difference between an estimate and the mean of all other estimates, excluding the current one. \item "revpairwise", "revreference", "revsequential": inverse of the corresponding hypotheses, as described above. } \item Formula: \itemize{ \item \code{comparison ~ pairs | group} \item Left-hand side determines the type of comparison to conduct: \code{difference} or \code{ratio}. If the left-hand side is empty, \code{difference} is chosen. \item Right-hand side determines the pairs of estimates to compare: \code{reference}, \code{sequential}, or \code{meandev} \item Optional: Users can supply grouping variables after a vertical bar to conduct comparisons withing subsets. \item Examples: \itemize{ \item \code{~ reference} \item \code{ratio ~ pairwise} \item \code{difference ~ pairwise | groupid} } } \item Function: \itemize{ \item Accepts an argument \code{x}: object produced by a \code{marginaleffects} function or a data frame with column \code{rowid} and \code{estimate} \item Returns a data frame with columns \code{term} and \code{estimate} (mandatory) and \code{rowid} (optional). \item The function can also accept optional input arguments: \code{newdata}, \code{by}, \code{draws}. \item This function approach will not work for Bayesian models or with bootstrapping. In those cases, it is easy to use \code{posterior_draws()} to extract and manipulate the draws directly. } \item See the Examples section below and the vignette: https://marginaleffects.com/vignettes/hypothesis.html }} \item{equivalence}{Numeric vector of length 2: bounds used for the two-one-sided test (TOST) of equivalence, and for the non-inferiority and non-superiority tests. See Details section below.} \item{p_adjust}{Adjust p-values for multiple comparisons: "holm", "hochberg", "hommel", "bonferroni", "BH", "BY", or "fdr". See \link[stats:p.adjust]{stats::p.adjust}} \item{df}{Degrees of freedom used to compute p values and confidence intervals. A single numeric value between 1 and \code{Inf}. When \code{df} is \code{Inf}, the normal distribution is used. When \code{df} is finite, the \code{t} distribution is used. See \link[insight:get_df]{insight::get_df} for a convenient function to extract degrees of freedom. Ex: \code{slopes(model, df = insight::get_df(model))}} \item{eps}{NULL or numeric value which determines the step size to use when calculating numerical derivatives: (f(x+eps)-f(x))/eps. When \code{eps} is \code{NULL}, the step size is 0.0001 multiplied by the difference between the maximum and minimum values of the variable with respect to which we are taking the derivative. Changing \code{eps} may be necessary to avoid numerical problems in certain models.} \item{numderiv}{string or list of strings indicating the method to use to for the numeric differentiation used in to compute delta method standard errors. \itemize{ \item "fdforward": finite difference method with forward differences \item "fdcenter": finite difference method with central differences (default) \item "richardson": Richardson extrapolation method \item Extra arguments can be specified by passing a list to the \code{numDeriv} argument, with the name of the method first and named arguments following, ex: \code{numderiv=list("fdcenter", eps = 1e-5)}. When an unknown argument is used, \code{marginaleffects} prints the list of valid arguments for each method. }} \item{...}{Additional arguments are passed to the \code{predict()} method supplied by the modeling package.These arguments are particularly useful for mixed-effects or bayesian models (see the online vignettes on the \code{marginaleffects} website). Available arguments can vary from model to model, depending on the range of supported arguments by each modeling package. See the "Model-Specific Arguments" section of the \code{?slopes} documentation for a non-exhaustive list of available arguments.} } \value{ A \code{data.frame} with one row per observation (per term/group) and several columns: \itemize{ \item \code{rowid}: row number of the \code{newdata} data frame \item \code{type}: prediction type, as defined by the \code{type} argument \item \code{group}: (optional) value of the grouped outcome (e.g., categorical outcome models) \item \code{term}: the variable whose marginal effect is computed \item \code{dydx}: slope of the outcome with respect to the term, for a given combination of predictor values \item \code{std.error}: standard errors computed by via the delta method. \item \code{p.value}: p value associated to the \code{estimate} column. The null is determined by the \code{hypothesis} argument (0 by default), and p values are computed before applying the \code{transform} argument. For models of class \code{feglm}, \code{Gam}, \code{glm} and \code{negbin}, p values are computed on the link scale by default unless the \code{type} argument is specified explicitly. \item \code{s.value}: Shannon information transforms of p values. How many consecutive "heads" tosses would provide the same amount of evidence (or "surprise") against the null hypothesis that the coin is fair? The purpose of S is to calibrate the analyst's intuition about the strength of evidence encoded in p against a well-known physical phenomenon. See Greenland (2019) and Cole et al. (2020). \item \code{conf.low}: lower bound of the confidence interval (or equal-tailed interval for bayesian models) \item \code{conf.high}: upper bound of the confidence interval (or equal-tailed interval for bayesian models) } See \code{?print.marginaleffects} for printing options. } \description{ Partial derivative of the regression equation with respect to a regressor of interest. \itemize{ \item \code{slopes()}: unit-level (conditional) estimates. \item \code{avg_slopes()}: average (marginal) estimates. } The \code{newdata} argument and the \code{datagrid()} function can be used to control where statistics are evaluated in the predictor space: "at observed values", "at the mean", "at representative values", etc. See the slopes vignette and package website for worked examples and case studies: \itemize{ \item \url{https://marginaleffects.com/vignettes/slopes.html} \item \url{https://marginaleffects.com/} } } \details{ A "slope" or "marginal effect" is the partial derivative of the regression equation with respect to a variable in the model. This function uses automatic differentiation to compute slopes for a vast array of models, including non-linear models with transformations (e.g., polynomials). Uncertainty estimates are computed using the delta method. Numerical derivatives for the \code{slopes} function are calculated using a simple epsilon difference approach: \eqn{\partial Y / \partial X = (f(X + \varepsilon/2) - f(X-\varepsilon/2)) / \varepsilon}{dY/dX = (f(X + e/2) - f(X-e/2)) / e}, where f is the \code{predict()} method associated with the model class, and \eqn{\varepsilon}{e} is determined by the \code{eps} argument. } \section{Functions}{ \itemize{ \item \code{avg_slopes()}: Average slopes }} \section{Standard errors using the delta method}{ Standard errors for all quantities estimated by \code{marginaleffects} can be obtained via the delta method. This requires differentiating a function with respect to the coefficients in the model using a finite difference approach. In some models, the delta method standard errors can be sensitive to various aspects of the numeric differentiation strategy, including the step size. By default, the step size is set to \code{1e-8}, or to \code{1e-4} times the smallest absolute model coefficient, whichever is largest. \code{marginaleffects} can delegate numeric differentiation to the \code{numDeriv} package, which allows more flexibility. To do this, users can pass arguments to the \code{numDeriv::jacobian} function through a global option. For example: \itemize{ \item \code{options(marginaleffects_numDeriv = list(method = "simple", method.args = list(eps = 1e-6)))} \item \code{options(marginaleffects_numDeriv = list(method = "Richardson", method.args = list(eps = 1e-5)))} \item \code{options(marginaleffects_numDeriv = NULL)} } See the "Standard Errors and Confidence Intervals" vignette on the \code{marginaleffects} website for more details on the computation of standard errors: https://marginaleffects.com/vignettes/uncertainty.html Note that the \code{inferences()} function can be used to compute uncertainty estimates using a bootstrap or simulation-based inference. See the vignette: https://marginaleffects.com/vignettes/bootstrap.html } \section{Model-Specific Arguments}{ Some model types allow model-specific arguments to modify the nature of marginal effects, predictions, marginal means, and contrasts. Please report other package-specific \code{predict()} arguments on Github so we can add them to the table below. https://github.com/vincentarelbundock/marginaleffects/issues\tabular{llll}{ Package \tab Class \tab Argument \tab Documentation \cr \code{brms} \tab \code{brmsfit} \tab \code{ndraws} \tab \link[brms:posterior_predict.brmsfit]{brms::posterior_predict} \cr \tab \tab \code{re_formula} \tab \link[brms:posterior_predict.brmsfit]{brms::posterior_predict} \cr \code{lme4} \tab \code{merMod} \tab \code{re.form} \tab \link[lme4:predict.merMod]{lme4::predict.merMod} \cr \tab \tab \code{allow.new.levels} \tab \link[lme4:predict.merMod]{lme4::predict.merMod} \cr \code{glmmTMB} \tab \code{glmmTMB} \tab \code{re.form} \tab \link[glmmTMB:predict.glmmTMB]{glmmTMB::predict.glmmTMB} \cr \tab \tab \code{allow.new.levels} \tab \link[glmmTMB:predict.glmmTMB]{glmmTMB::predict.glmmTMB} \cr \tab \tab \code{zitype} \tab \link[glmmTMB:predict.glmmTMB]{glmmTMB::predict.glmmTMB} \cr \code{mgcv} \tab \code{bam} \tab \code{exclude} \tab \link[mgcv:predict.bam]{mgcv::predict.bam} \cr \code{robustlmm} \tab \code{rlmerMod} \tab \code{re.form} \tab \link[robustlmm:rlmerMod-class]{robustlmm::predict.rlmerMod} \cr \tab \tab \code{allow.new.levels} \tab \link[robustlmm:rlmerMod-class]{robustlmm::predict.rlmerMod} \cr \code{MCMCglmm} \tab \code{MCMCglmm} \tab \code{ndraws} \tab \cr } } \section{Bayesian posterior summaries}{ By default, credible intervals in bayesian models are built as equal-tailed intervals. This can be changed to a highest density interval by setting a global option: \code{options("marginaleffects_posterior_interval" = "eti")} \code{options("marginaleffects_posterior_interval" = "hdi")} By default, the center of the posterior distribution in bayesian models is identified by the median. Users can use a different summary function by setting a global option: \code{options("marginaleffects_posterior_center" = "mean")} \code{options("marginaleffects_posterior_center" = "median")} When estimates are averaged using the \code{by} argument, the \code{tidy()} function, or the \code{summary()} function, the posterior distribution is marginalized twice over. First, we take the average \emph{across} units but \emph{within} each iteration of the MCMC chain, according to what the user requested in \code{by} argument or \code{tidy()/summary()} functions. Then, we identify the center of the resulting posterior using the function supplied to the \code{"marginaleffects_posterior_center"} option (the median by default). } \section{Equivalence, Inferiority, Superiority}{ \eqn{\theta} is an estimate, \eqn{\sigma_\theta} its estimated standard error, and \eqn{[a, b]} are the bounds of the interval supplied to the \code{equivalence} argument. Non-inferiority: \itemize{ \item \eqn{H_0}{H0}: \eqn{\theta \leq a}{\theta <= a} \item \eqn{H_1}{H1}: \eqn{\theta > a} \item \eqn{t=(\theta - a)/\sigma_\theta}{t=(\theta - a)/\sigma_\theta} \item p: Upper-tail probability } Non-superiority: \itemize{ \item \eqn{H_0}{H0}: \eqn{\theta \geq b}{\theta >= b} \item \eqn{H_1}{H1}: \eqn{\theta < b} \item \eqn{t=(\theta - b)/\sigma_\theta}{t=(\theta - b)/\sigma_\theta} \item p: Lower-tail probability } Equivalence: Two One-Sided Tests (TOST) \itemize{ \item p: Maximum of the non-inferiority and non-superiority p values. } Thanks to Russell V. Lenth for the excellent \code{emmeans} package and documentation which inspired this feature. } \section{Prediction types}{ The \code{type} argument determines the scale of the predictions used to compute quantities of interest with functions from the \code{marginaleffects} package. Admissible values for \code{type} depend on the model object. When users specify an incorrect value for \code{type}, \code{marginaleffects} will raise an informative error with a list of valid \code{type} values for the specific model object. The first entry in the list in that error message is the default type. The \code{invlink(link)} is a special type defined by \code{marginaleffects}. It is available for some (but not all) models and functions. With this link type, we first compute predictions on the link scale, then we use the inverse link function to backtransform the predictions to the response scale. This is useful for models with non-linear link functions as it can ensure that confidence intervals stay within desirable bounds, ex: 0 to 1 for a logit model. Note that an average of estimates with \code{type="invlink(link)"} will not always be equivalent to the average of estimates with \code{type="response"}. Some of the most common \code{type} values are: response, link, E, Ep, average, class, conditional, count, cum.prob, cumhaz, cumprob, density, detection, disp, ev, expected, expvalue, fitted, hazard, invlink(link), latent, latent_N, linear, linear.predictor, linpred, location, lp, mean, numeric, p, ppd, pr, precision, prediction, prob, probability, probs, quantile, risk, rmst, scale, survival, unconditional, utility, variance, xb, zero, zlink, zprob } \section{Parallel computation}{ The \code{slopes()} and \code{comparisons()} functions can use parallelism to speed up computation. Operations are parallelized for the computation of standard errors, at the model coefficient level. There is always considerable overhead when using parallel computation, mainly involved in passing the whole dataset to the different processes. Thus, parallel computation is most likely to be useful when the model includes many parameters and the dataset is relatively small. Warning: In many cases, parallel processing will not be useful at all. To activate parallel computation, users must load the \code{future.apply} package, call \code{plan()} function, and set a global option. For example: \if{html}{\out{
}}\preformatted{library(future.apply) plan("multicore", workers = 4) options(marginaleffects_parallel = TRUE) slopes(model) }\if{html}{\out{
}} To disable parallelism in \code{marginaleffects} altogether, you can set a global option: \if{html}{\out{
}}\preformatted{options(marginaleffects_parallel = FALSE) }\if{html}{\out{
}} } \section{Order of operations}{ Behind the scenes, the arguments of \code{marginaleffects} functions are evaluated in this order: \enumerate{ \item \code{newdata} \item \code{variables} \item \code{comparison} and \code{slopes} \item \code{by} \item \code{vcov} \item \code{hypothesis} \item \code{transform} } } \section{Global options}{ The behavior of \code{marginaleffects} functions can be modified by setting global options. Disable some safety checks: \if{html}{\out{
}}\preformatted{options(marginaleffects_safe = FALSE)` }\if{html}{\out{
}} } \examples{ \dontshow{if (interactive() || isTRUE(Sys.getenv("R_DOC_BUILD") == "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} \dontshow{\}) # examplesIf} # Unit-level (conditional) Marginal Effects mod <- glm(am ~ hp * wt, data = mtcars, family = binomial) mfx <- slopes(mod) head(mfx) # Average Marginal Effect (AME) avg_slopes(mod, by = TRUE) # Marginal Effect at the Mean (MEM) slopes(mod, newdata = datagrid()) # Marginal Effect at User-Specified Values # Variables not explicitly included in `datagrid()` are held at their means slopes(mod, newdata = datagrid(hp = c(100, 110))) # Group-Average Marginal Effects (G-AME) # Calculate marginal effects for each observation, and then take the average # marginal effect within each subset of observations with different observed # values for the `cyl` variable: mod2 <- lm(mpg ~ hp * cyl, data = mtcars) avg_slopes(mod2, variables = "hp", by = "cyl") # Marginal Effects at User-Specified Values (counterfactual) # Variables not explicitly included in `datagrid()` are held at their # original values, and the whole dataset is duplicated once for each # combination of the values in `datagrid()` mfx <- slopes(mod, newdata = datagrid( hp = c(100, 110), grid_type = "counterfactual")) head(mfx) # Heteroskedasticity robust standard errors mfx <- slopes(mod, vcov = sandwich::vcovHC(mod)) head(mfx) # hypothesis test: is the `hp` marginal effect at the mean equal to the `drat` marginal effect mod <- lm(mpg ~ wt + drat, data = mtcars) slopes( mod, newdata = "mean", hypothesis = "wt = drat") # same hypothesis test using row indices slopes( mod, newdata = "mean", hypothesis = "b1 - b2 = 0") # same hypothesis test using numeric vector of weights slopes( mod, newdata = "mean", hypothesis = c(1, -1)) # two custom contrasts using a matrix of weights lc <- matrix( c( 1, -1, 2, 3), ncol = 2) colnames(lc) <- c("Contrast A", "Contrast B") slopes( mod, newdata = "mean", hypothesis = lc) } \references{ \itemize{ \item Greenland S. 2019. "Valid P-Values Behave Exactly as They Should: Some Misleading Criticisms of P-Values and Their Resolution With S-Values." The American Statistician. 73(S1): 106–114. \item Cole, Stephen R, Jessie K Edwards, and Sander Greenland. 2020. "Surprise!" American Journal of Epidemiology 190 (2): 191–93. https://doi.org/10.1093/aje/kwaa136 } } marginaleffects/man/set_coef.Rd0000644000176200001440000000676214631452336016257 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/set_coef.R, R/methods_AER.R, R/methods_MASS.R, % R/methods_Rchoice.R, R/methods_afex.R, R/methods_aod.R, R/methods_betareg.R, % R/methods_nnet.R, R/methods_crch.R, R/methods_dataframe.R, % R/methods_flexsurv.R, R/methods_gamlss.R, R/methods_glmmTMB.R, % R/methods_glmx.R, R/methods_lme4.R, R/methods_mlm.R, R/methods_nlme.R, % R/methods_pscl.R, R/methods_robustlmm.R, R/methods_sampleSelection.R, % R/methods_scam.R, R/methods_stats.R, R/methods_survey.R, % R/methods_survival.R, R/methods_tidymodels.R \name{set_coef} \alias{set_coef} \alias{set_coef.default} \alias{set_coef.tobit} \alias{set_coef.polr} \alias{set_coef.glmmPQL} \alias{set_coef.hetprob} \alias{set_coef.ivpml} \alias{set_coef.afex_aov} \alias{set_coef.glimML} \alias{set_coef.betareg} \alias{set_coef.multinom} \alias{set_coef.crch} \alias{set_coef.hxlr} \alias{set_coef.data.frame} \alias{set_coef.flexsurvreg} \alias{set_coef.gamlss} \alias{set_coef.glmmTMB} \alias{set_coef.glmx} \alias{set_coef.merMod} \alias{set_coef.lmerModLmerTest} \alias{set_coef.lmerMod} \alias{set_coef.mlm} \alias{set_coef.lme} \alias{set_coef.hurdle} \alias{set_coef.zeroinfl} \alias{set_coef.rlmerMod} \alias{set_coef.selection} \alias{set_coef.scam} \alias{set_coef.glm} \alias{set_coef.lm} \alias{set_coef.nls} \alias{set_coef.svyolr} \alias{set_coef.survreg} \alias{set_coef.model_fit} \alias{set_coef.workflow} \title{Internal function to set coefficients} \usage{ set_coef(model, coefs, ...) \method{set_coef}{default}(model, coefs, ...) \method{set_coef}{tobit}(model, coefs, ...) \method{set_coef}{polr}(model, coefs, ...) \method{set_coef}{glmmPQL}(model, coefs, ...) \method{set_coef}{hetprob}(model, coefs, ...) \method{set_coef}{ivpml}(model, coefs, ...) \method{set_coef}{afex_aov}(model, coefs, ...) \method{set_coef}{glimML}(model, coefs, ...) \method{set_coef}{betareg}(model, coefs, ...) \method{set_coef}{multinom}(model, coefs, ...) \method{set_coef}{crch}(model, coefs, ...) \method{set_coef}{hxlr}(model, coefs, ...) \method{set_coef}{data.frame}(model, coefs, ...) \method{set_coef}{flexsurvreg}(model, coefs, ...) \method{set_coef}{gamlss}(model, coefs, ...) \method{set_coef}{glmmTMB}(model, coefs, ...) \method{set_coef}{glmx}(model, coefs, ...) \method{set_coef}{merMod}(model, coefs, ...) \method{set_coef}{lmerModLmerTest}(model, coefs, ...) \method{set_coef}{lmerMod}(model, coefs, ...) \method{set_coef}{mlm}(model, coefs, ...) \method{set_coef}{lme}(model, coefs, ...) \method{set_coef}{hurdle}(model, coefs, ...) \method{set_coef}{zeroinfl}(model, coefs, ...) \method{set_coef}{rlmerMod}(model, coefs, ...) \method{set_coef}{selection}(model, coefs, ...) \method{set_coef}{scam}(model, coefs, ...) \method{set_coef}{glm}(model, coefs, ...) \method{set_coef}{lm}(model, coefs, ...) \method{set_coef}{nls}(model, coefs, ...) \method{set_coef}{svyolr}(model, coefs, ...) \method{set_coef}{survreg}(model, coefs, ...) \method{set_coef}{model_fit}(model, coefs, ...) \method{set_coef}{workflow}(model, coefs, ...) } \arguments{ \item{model}{object to modify} \item{coefs}{vector of coefficients to insert in the model object} } \value{ Model object of the same class as the \code{model} argument, but with different stored coefficients. } \description{ Set the coefficients in a model to different values and return the modified object (internal function) } \details{ To compute the variance of marginal effects we need to take the Jacobian with } \keyword{internal} marginaleffects/man/posteriordraws.Rd0000644000176200001440000000166114631452336017550 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/posterior_draws.R \name{posteriordraws} \alias{posteriordraws} \title{\code{posteriordraws()} is an alias to \code{posterior_draws()}} \usage{ posteriordraws(x, shape = "long") } \arguments{ \item{x}{An object produced by a \code{marginaleffects} package function, such as \code{predictions()}, \code{avg_slopes()}, \code{hypotheses()}, etc.} \item{shape}{string indicating the shape of the output format: \itemize{ \item "long": long format data frame \item "DxP": Matrix with draws as rows and parameters as columns \item "PxD": Matrix with draws as rows and parameters as columns \item "rvar": Random variable datatype (see \code{posterior} package documentation). }} } \value{ A data.frame with \code{drawid} and \code{draw} columns. } \description{ This alias is kept for backward compatibility and because some users may prefer that name. } \keyword{internal} marginaleffects/man/marginaleffects.Rd0000644000176200001440000000037414631452336017613 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/deprecated.R \name{marginaleffects} \alias{marginaleffects} \title{Deprecated function} \usage{ marginaleffects(...) } \description{ Deprecated function } \keyword{internal} marginaleffects/man/deltamethod.Rd0000644000176200001440000000036014631452336016746 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/deprecated.R \name{deltamethod} \alias{deltamethod} \title{Deprecated function} \usage{ deltamethod(...) } \description{ Deprecated function } \keyword{internal} marginaleffects/man/comparisons.Rd0000644000176200001440000010103214632674174017016 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/comparisons.R \name{comparisons} \alias{comparisons} \alias{avg_comparisons} \title{Comparisons Between Predictions Made With Different Regressor Values} \usage{ comparisons( model, newdata = NULL, variables = NULL, comparison = "difference", type = NULL, vcov = TRUE, by = FALSE, conf_level = 0.95, transform = NULL, cross = FALSE, wts = FALSE, hypothesis = NULL, equivalence = NULL, p_adjust = NULL, df = Inf, eps = NULL, numderiv = "fdforward", ... ) avg_comparisons( model, newdata = NULL, variables = NULL, type = NULL, vcov = TRUE, by = TRUE, conf_level = 0.95, comparison = "difference", transform = NULL, cross = FALSE, wts = FALSE, hypothesis = NULL, equivalence = NULL, p_adjust = NULL, df = Inf, eps = NULL, numderiv = "fdforward", ... ) } \arguments{ \item{model}{Model object} \item{newdata}{Grid of predictor values at which we evaluate the comparisons. \itemize{ \item Warning: Avoid modifying your dataset between fitting the model and calling a \code{marginaleffects} function. This can sometimes lead to unexpected results. \item \code{NULL} (default): Unit-level contrasts for each observed value in the dataset (empirical distribution). The dataset is retrieved using \code{\link[insight:get_data]{insight::get_data()}}, which tries to extract data from the environment. This may produce unexpected results if the original data frame has been altered since fitting the model. \item data frame: Unit-level contrasts for each row of the \code{newdata} data frame. \item string: \itemize{ \item "mean": Contrasts at the Mean. Contrasts when each predictor is held at its mean or mode. \item "median": Contrasts at the Median. Contrasts when each predictor is held at its median or mode. \item "balanced": Contrasts evaluated on a balanced grid with every combination of categories and numeric variables held at their means. \item "tukey": Contrasts at Tukey's 5 numbers. \item "grid": Contrasts on a grid of representative numbers (Tukey's 5 numbers and unique values of categorical predictors). } \item \code{\link[=datagrid]{datagrid()}} call to specify a custom grid of regressors. For example: \itemize{ \item \code{newdata = datagrid(cyl = c(4, 6))}: \code{cyl} variable equal to 4 and 6 and other regressors fixed at their means or modes. \item \code{newdata = datagrid(mpg = fivenum)}: \code{mpg} variable held at Tukey's five numbers (using the \code{fivenum} function), and other regressors fixed at their means or modes. \item See the Examples section and the \link{datagrid} documentation. } \item \code{\link[=subset]{subset()}} call with a single argument to select a subset of the dataset used to fit the model, ex: \code{newdata = subset(treatment == 1)} \item \code{\link[dplyr:filter]{dplyr::filter()}} call with a single argument to select a subset of the dataset used to fit the model, ex: \code{newdata = filter(treatment == 1)} }} \item{variables}{Focal variables \itemize{ \item \code{NULL}: compute comparisons for all the variables in the model object (can be slow). \item Character vector: subset of variables (usually faster). \item Named list: names identify the subset of variables of interest, and values define the type of contrast to compute. Acceptable values depend on the variable type: \itemize{ \item Factor or character variables: \itemize{ \item "reference": Each factor level is compared to the factor reference (base) level \item "all": All combinations of observed levels \item "sequential": Each factor level is compared to the previous factor level \item "pairwise": Each factor level is compared to all other levels \item "minmax": The highest and lowest levels of a factor. \item "revpairwise", "revreference", "revsequential": inverse of the corresponding hypotheses. \item Vector of length 2 with the two values to compare. \item Data frame with the same number of rows as \code{newdata}, with two columns of "lo" and "hi" values to compare. \item Function that accepts a vector and returns a data frame with two columns of "lo" and "hi" values to compare. See examples below. } \item Logical variables: \itemize{ \item NULL: contrast between TRUE and FALSE \item Data frame with the same number of rows as \code{newdata}, with two columns of "lo" and "hi" values to compare. \item Function that accepts a vector and returns a data frame with two columns of "lo" and "hi" values to compare. See examples below. } \item Numeric variables: \itemize{ \item Numeric of length 1: Forward contrast for a gap of \code{x}, computed between the observed value and the observed value plus \code{x}. Users can set a global option to get a "center" or "backward" contrast instead: \code{options(marginaleffects_contrast_direction="center")} \item Numeric vector of length 2: Contrast between the largest and the smallest elements of the \code{x} vector. \item Data frame with the same number of rows as \code{newdata}, with two columns of "lo" and "hi" values to compare. \item Function that accepts a vector and returns a data frame with two columns of "lo" and "hi" values to compare. See examples below. \item "iqr": Contrast across the interquartile range of the regressor. \item "sd": Contrast across one standard deviation around the regressor mean. \item "2sd": Contrast across two standard deviations around the regressor mean. \item "minmax": Contrast between the maximum and the minimum values of the regressor. } \item Examples: \itemize{ \item \code{variables = list(gear = "pairwise", hp = 10)} \item \code{variables = list(gear = "sequential", hp = c(100, 120))} \item \verb{variables = list(hp = \\(x) data.frame(low = x - 5, high = x + 10))} \item See the Examples section below for more. } } }} \item{comparison}{How should pairs of predictions be compared? Difference, ratio, odds ratio, or user-defined functions. \itemize{ \item string: shortcuts to common contrast functions. \itemize{ \item Supported shortcuts strings: difference, differenceavg, differenceavgwts, dydx, eyex, eydx, dyex, dydxavg, eyexavg, eydxavg, dyexavg, dydxavgwts, eyexavgwts, eydxavgwts, dyexavgwts, ratio, ratioavg, ratioavgwts, lnratio, lnratioavg, lnratioavgwts, lnor, lnoravg, lnoravgwts, lift, liftavg, expdydx, expdydxavg, expdydxavgwts \item See the Comparisons section below for definitions of each transformation. } \item function: accept two equal-length numeric vectors of adjusted predictions (\code{hi} and \code{lo}) and returns a vector of contrasts of the same length, or a unique numeric value. \itemize{ \item See the Transformations section below for examples of valid functions. } }} \item{type}{string indicates the type (scale) of the predictions used to compute contrasts or slopes. This can differ based on the model type, but will typically be a string such as: "response", "link", "probs", or "zero". When an unsupported string is entered, the model-specific list of acceptable values is returned in an error message. When \code{type} is \code{NULL}, the first entry in the error message is used by default.} \item{vcov}{Type of uncertainty estimates to report (e.g., for robust standard errors). Acceptable values: \itemize{ \item FALSE: Do not compute standard errors. This can speed up computation considerably. \item TRUE: Unit-level standard errors using the default \code{vcov(model)} variance-covariance matrix. \item String which indicates the kind of uncertainty estimates to return. \itemize{ \item Heteroskedasticity-consistent: \code{"HC"}, \code{"HC0"}, \code{"HC1"}, \code{"HC2"}, \code{"HC3"}, \code{"HC4"}, \code{"HC4m"}, \code{"HC5"}. See \code{?sandwich::vcovHC} \item Heteroskedasticity and autocorrelation consistent: \code{"HAC"} \item Mixed-Models degrees of freedom: "satterthwaite", "kenward-roger" \item Other: \code{"NeweyWest"}, \code{"KernHAC"}, \code{"OPG"}. See the \code{sandwich} package documentation. } \item One-sided formula which indicates the name of cluster variables (e.g., \code{~unit_id}). This formula is passed to the \code{cluster} argument of the \code{sandwich::vcovCL} function. \item Square covariance matrix \item Function which returns a covariance matrix (e.g., \code{stats::vcov(model)}) }} \item{by}{Aggregate unit-level estimates (aka, marginalize, average over). Valid inputs: \itemize{ \item \code{FALSE}: return the original unit-level estimates. \item \code{TRUE}: aggregate estimates for each term. \item Character vector of column names in \code{newdata} or in the data frame produced by calling the function without the \code{by} argument. \item Data frame with a \code{by} column of group labels, and merging columns shared by \code{newdata} or the data frame produced by calling the same function without the \code{by} argument. \item See examples below. \item For more complex aggregations, you can use the \code{FUN} argument of the \code{hypotheses()} function. See that function's documentation and the Hypothesis Test vignettes on the \code{marginaleffects} website. }} \item{conf_level}{numeric value between 0 and 1. Confidence level to use to build a confidence interval.} \item{transform}{string or function. Transformation applied to unit-level estimates and confidence intervals just before the function returns results. Functions must accept a vector and return a vector of the same length. Support string shortcuts: "exp", "ln"} \item{cross}{\itemize{ \item \code{FALSE}: Contrasts represent the change in adjusted predictions when one predictor changes and all other variables are held constant. \item \code{TRUE}: Contrasts represent the changes in adjusted predictions when all the predictors specified in the \code{variables} argument are manipulated simultaneously (a "cross-contrast"). }} \item{wts}{logical, string or numeric: weights to use when computing average predictions, contrasts or slopes. These weights only affect the averaging in \verb{avg_*()} or with the \code{by} argument, and not unit-level estimates. See \code{?weighted.mean} \itemize{ \item string: column name of the weights variable in \code{newdata}. When supplying a column name to \code{wts}, it is recommended to supply the original data (including the weights variable) explicitly to \code{newdata}. \item numeric: vector of length equal to the number of rows in the original data or in \code{newdata} (if supplied). \item FALSE: Equal weights. \item TRUE: Extract weights from the fitted object with \code{insight::find_weights()} and use them when taking weighted averages of estimates. Warning: \code{newdata=datagrid()} returns a single average weight, which is equivalent to using \code{wts=FALSE} }} \item{hypothesis}{specify a hypothesis test or custom contrast using a numeric value, vector, or matrix; a string equation; string; a formula, or a function. \itemize{ \item Numeric: \itemize{ \item Single value: the null hypothesis used in the computation of Z and p (before applying \code{transform}). \item Vector: Weights to compute a linear combination of (custom contrast between) estimates. Length equal to the number of rows generated by the same function call, but without the \code{hypothesis} argument. \item Matrix: Each column is a vector of weights, as describe above, used to compute a distinct linear combination of (contrast between) estimates. The column names of the matrix are used as labels in the output. } \item String equation to specify linear or non-linear hypothesis tests. If the \code{term} column uniquely identifies rows, terms can be used in the formula. Otherwise, use \code{b1}, \code{b2}, etc. to identify the position of each parameter. The \verb{b*} wildcard can be used to test hypotheses on all estimates. If a named vector is used, the names are used as labels in the output. Examples: \itemize{ \item \code{hp = drat} \item \code{hp + drat = 12} \item \code{b1 + b2 + b3 = 0} \item \verb{b* / b1 = 1} } \item String: \itemize{ \item "pairwise": pairwise differences between estimates in each row. \item "reference": differences between the estimates in each row and the estimate in the first row. \item "sequential": difference between an estimate and the estimate in the next row. \item "meandev": difference between an estimate and the mean of all estimates. \item "meanotherdev": difference between an estimate and the mean of all other estimates, excluding the current one. \item "revpairwise", "revreference", "revsequential": inverse of the corresponding hypotheses, as described above. } \item Formula: \itemize{ \item \code{comparison ~ pairs | group} \item Left-hand side determines the type of comparison to conduct: \code{difference} or \code{ratio}. If the left-hand side is empty, \code{difference} is chosen. \item Right-hand side determines the pairs of estimates to compare: \code{reference}, \code{sequential}, or \code{meandev} \item Optional: Users can supply grouping variables after a vertical bar to conduct comparisons withing subsets. \item Examples: \itemize{ \item \code{~ reference} \item \code{ratio ~ pairwise} \item \code{difference ~ pairwise | groupid} } } \item Function: \itemize{ \item Accepts an argument \code{x}: object produced by a \code{marginaleffects} function or a data frame with column \code{rowid} and \code{estimate} \item Returns a data frame with columns \code{term} and \code{estimate} (mandatory) and \code{rowid} (optional). \item The function can also accept optional input arguments: \code{newdata}, \code{by}, \code{draws}. \item This function approach will not work for Bayesian models or with bootstrapping. In those cases, it is easy to use \code{posterior_draws()} to extract and manipulate the draws directly. } \item See the Examples section below and the vignette: https://marginaleffects.com/vignettes/hypothesis.html }} \item{equivalence}{Numeric vector of length 2: bounds used for the two-one-sided test (TOST) of equivalence, and for the non-inferiority and non-superiority tests. See Details section below.} \item{p_adjust}{Adjust p-values for multiple comparisons: "holm", "hochberg", "hommel", "bonferroni", "BH", "BY", or "fdr". See \link[stats:p.adjust]{stats::p.adjust}} \item{df}{Degrees of freedom used to compute p values and confidence intervals. A single numeric value between 1 and \code{Inf}. When \code{df} is \code{Inf}, the normal distribution is used. When \code{df} is finite, the \code{t} distribution is used. See \link[insight:get_df]{insight::get_df} for a convenient function to extract degrees of freedom. Ex: \code{slopes(model, df = insight::get_df(model))}} \item{eps}{NULL or numeric value which determines the step size to use when calculating numerical derivatives: (f(x+eps)-f(x))/eps. When \code{eps} is \code{NULL}, the step size is 0.0001 multiplied by the difference between the maximum and minimum values of the variable with respect to which we are taking the derivative. Changing \code{eps} may be necessary to avoid numerical problems in certain models.} \item{numderiv}{string or list of strings indicating the method to use to for the numeric differentiation used in to compute delta method standard errors. \itemize{ \item "fdforward": finite difference method with forward differences \item "fdcenter": finite difference method with central differences (default) \item "richardson": Richardson extrapolation method \item Extra arguments can be specified by passing a list to the \code{numDeriv} argument, with the name of the method first and named arguments following, ex: \code{numderiv=list("fdcenter", eps = 1e-5)}. When an unknown argument is used, \code{marginaleffects} prints the list of valid arguments for each method. }} \item{...}{Additional arguments are passed to the \code{predict()} method supplied by the modeling package.These arguments are particularly useful for mixed-effects or bayesian models (see the online vignettes on the \code{marginaleffects} website). Available arguments can vary from model to model, depending on the range of supported arguments by each modeling package. See the "Model-Specific Arguments" section of the \code{?slopes} documentation for a non-exhaustive list of available arguments.} } \value{ A \code{data.frame} with one row per observation (per term/group) and several columns: \itemize{ \item \code{rowid}: row number of the \code{newdata} data frame \item \code{type}: prediction type, as defined by the \code{type} argument \item \code{group}: (optional) value of the grouped outcome (e.g., categorical outcome models) \item \code{term}: the variable whose marginal effect is computed \item \code{dydx}: slope of the outcome with respect to the term, for a given combination of predictor values \item \code{std.error}: standard errors computed by via the delta method. \item \code{p.value}: p value associated to the \code{estimate} column. The null is determined by the \code{hypothesis} argument (0 by default), and p values are computed before applying the \code{transform} argument. \item \code{s.value}: Shannon information transforms of p values. How many consecutive "heads" tosses would provide the same amount of evidence (or "surprise") against the null hypothesis that the coin is fair? The purpose of S is to calibrate the analyst's intuition about the strength of evidence encoded in p against a well-known physical phenomenon. See Greenland (2019) and Cole et al. (2020). \item \code{conf.low}: lower bound of the confidence interval (or equal-tailed interval for bayesian models) \item \code{conf.high}: upper bound of the confidence interval (or equal-tailed interval for bayesian models) } See \code{?print.marginaleffects} for printing options. } \description{ Predict the outcome variable at different regressor values (e.g., college graduates vs. others), and compare those predictions by computing a difference, ratio, or some other function. \code{comparisons()} can return many quantities of interest, such as contrasts, differences, risk ratios, changes in log odds, lift, slopes, elasticities, etc. \itemize{ \item \code{comparisons()}: unit-level (conditional) estimates. \item \code{avg_comparisons()}: average (marginal) estimates. } \code{variables} identifies the focal regressors whose "effect" we are interested in. \code{comparison} determines how predictions with different regressor values are compared (difference, ratio, odds, etc.). The \code{newdata} argument and the \code{datagrid()} function control where statistics are evaluated in the predictor space: "at observed values", "at the mean", "at representative values", etc. See the comparisons vignette and package website for worked examples and case studies: \itemize{ \item \url{https://marginaleffects.com/vignettes/comparisons.html} \item \url{https://marginaleffects.com/} } } \section{Functions}{ \itemize{ \item \code{avg_comparisons()}: Average comparisons }} \section{Standard errors using the delta method}{ Standard errors for all quantities estimated by \code{marginaleffects} can be obtained via the delta method. This requires differentiating a function with respect to the coefficients in the model using a finite difference approach. In some models, the delta method standard errors can be sensitive to various aspects of the numeric differentiation strategy, including the step size. By default, the step size is set to \code{1e-8}, or to \code{1e-4} times the smallest absolute model coefficient, whichever is largest. \code{marginaleffects} can delegate numeric differentiation to the \code{numDeriv} package, which allows more flexibility. To do this, users can pass arguments to the \code{numDeriv::jacobian} function through a global option. For example: \itemize{ \item \code{options(marginaleffects_numDeriv = list(method = "simple", method.args = list(eps = 1e-6)))} \item \code{options(marginaleffects_numDeriv = list(method = "Richardson", method.args = list(eps = 1e-5)))} \item \code{options(marginaleffects_numDeriv = NULL)} } See the "Standard Errors and Confidence Intervals" vignette on the \code{marginaleffects} website for more details on the computation of standard errors: https://marginaleffects.com/vignettes/uncertainty.html Note that the \code{inferences()} function can be used to compute uncertainty estimates using a bootstrap or simulation-based inference. See the vignette: https://marginaleffects.com/vignettes/bootstrap.html } \section{Model-Specific Arguments}{ Some model types allow model-specific arguments to modify the nature of marginal effects, predictions, marginal means, and contrasts. Please report other package-specific \code{predict()} arguments on Github so we can add them to the table below. https://github.com/vincentarelbundock/marginaleffects/issues\tabular{llll}{ Package \tab Class \tab Argument \tab Documentation \cr \code{brms} \tab \code{brmsfit} \tab \code{ndraws} \tab \link[brms:posterior_predict.brmsfit]{brms::posterior_predict} \cr \tab \tab \code{re_formula} \tab \link[brms:posterior_predict.brmsfit]{brms::posterior_predict} \cr \code{lme4} \tab \code{merMod} \tab \code{re.form} \tab \link[lme4:predict.merMod]{lme4::predict.merMod} \cr \tab \tab \code{allow.new.levels} \tab \link[lme4:predict.merMod]{lme4::predict.merMod} \cr \code{glmmTMB} \tab \code{glmmTMB} \tab \code{re.form} \tab \link[glmmTMB:predict.glmmTMB]{glmmTMB::predict.glmmTMB} \cr \tab \tab \code{allow.new.levels} \tab \link[glmmTMB:predict.glmmTMB]{glmmTMB::predict.glmmTMB} \cr \tab \tab \code{zitype} \tab \link[glmmTMB:predict.glmmTMB]{glmmTMB::predict.glmmTMB} \cr \code{mgcv} \tab \code{bam} \tab \code{exclude} \tab \link[mgcv:predict.bam]{mgcv::predict.bam} \cr \code{robustlmm} \tab \code{rlmerMod} \tab \code{re.form} \tab \link[robustlmm:rlmerMod-class]{robustlmm::predict.rlmerMod} \cr \tab \tab \code{allow.new.levels} \tab \link[robustlmm:rlmerMod-class]{robustlmm::predict.rlmerMod} \cr \code{MCMCglmm} \tab \code{MCMCglmm} \tab \code{ndraws} \tab \cr } } \section{comparison argument functions}{ The following transformations can be applied by supplying one of the shortcut strings to the \code{comparison} argument. \code{hi} is a vector of adjusted predictions for the "high" side of the contrast. \code{lo} is a vector of adjusted predictions for the "low" side of the contrast. \code{y} is a vector of adjusted predictions for the original data. \code{x} is the predictor in the original data. \code{eps} is the step size to use to compute derivatives and elasticities.\tabular{ll}{ Shortcut \tab Function \cr difference \tab \(hi, lo) hi - lo \cr differenceavg \tab \(hi, lo) mean(hi - lo) \cr dydx \tab \(hi, lo, eps) (hi - lo)/eps \cr eyex \tab \(hi, lo, eps, y, x) (hi - lo)/eps * (x/y) \cr eydx \tab \(hi, lo, eps, y, x) ((hi - lo)/eps)/y \cr dyex \tab \(hi, lo, eps, x) ((hi - lo)/eps) * x \cr dydxavg \tab \(hi, lo, eps) mean((hi - lo)/eps) \cr eyexavg \tab \(hi, lo, eps, y, x) mean((hi - lo)/eps * (x/y)) \cr eydxavg \tab \(hi, lo, eps, y, x) mean(((hi - lo)/eps)/y) \cr dyexavg \tab \(hi, lo, eps, x) mean(((hi - lo)/eps) * x) \cr ratio \tab \(hi, lo) hi/lo \cr ratioavg \tab \(hi, lo) mean(hi)/mean(lo) \cr lnratio \tab \(hi, lo) log(hi/lo) \cr lnratioavg \tab \(hi, lo) log(mean(hi)/mean(lo)) \cr lnor \tab \(hi, lo) log((hi/(1 - hi))/(lo/(1 - lo))) \cr lnoravg \tab \(hi, lo) log((mean(hi)/(1 - mean(hi)))/(mean(lo)/(1 - mean(lo)))) \cr lift \tab \(hi, lo) (hi - lo)/lo \cr liftavg \tab \(hi, lo) (mean(hi - lo))/mean(lo) \cr expdydx \tab \(hi, lo, eps) ((exp(hi) - exp(lo))/exp(eps))/eps \cr expdydxavg \tab \(hi, lo, eps) mean(((exp(hi) - exp(lo))/exp(eps))/eps) \cr } } \section{Bayesian posterior summaries}{ By default, credible intervals in bayesian models are built as equal-tailed intervals. This can be changed to a highest density interval by setting a global option: \code{options("marginaleffects_posterior_interval" = "eti")} \code{options("marginaleffects_posterior_interval" = "hdi")} By default, the center of the posterior distribution in bayesian models is identified by the median. Users can use a different summary function by setting a global option: \code{options("marginaleffects_posterior_center" = "mean")} \code{options("marginaleffects_posterior_center" = "median")} When estimates are averaged using the \code{by} argument, the \code{tidy()} function, or the \code{summary()} function, the posterior distribution is marginalized twice over. First, we take the average \emph{across} units but \emph{within} each iteration of the MCMC chain, according to what the user requested in \code{by} argument or \code{tidy()/summary()} functions. Then, we identify the center of the resulting posterior using the function supplied to the \code{"marginaleffects_posterior_center"} option (the median by default). } \section{Equivalence, Inferiority, Superiority}{ \eqn{\theta} is an estimate, \eqn{\sigma_\theta} its estimated standard error, and \eqn{[a, b]} are the bounds of the interval supplied to the \code{equivalence} argument. Non-inferiority: \itemize{ \item \eqn{H_0}{H0}: \eqn{\theta \leq a}{\theta <= a} \item \eqn{H_1}{H1}: \eqn{\theta > a} \item \eqn{t=(\theta - a)/\sigma_\theta}{t=(\theta - a)/\sigma_\theta} \item p: Upper-tail probability } Non-superiority: \itemize{ \item \eqn{H_0}{H0}: \eqn{\theta \geq b}{\theta >= b} \item \eqn{H_1}{H1}: \eqn{\theta < b} \item \eqn{t=(\theta - b)/\sigma_\theta}{t=(\theta - b)/\sigma_\theta} \item p: Lower-tail probability } Equivalence: Two One-Sided Tests (TOST) \itemize{ \item p: Maximum of the non-inferiority and non-superiority p values. } Thanks to Russell V. Lenth for the excellent \code{emmeans} package and documentation which inspired this feature. } \section{Prediction types}{ The \code{type} argument determines the scale of the predictions used to compute quantities of interest with functions from the \code{marginaleffects} package. Admissible values for \code{type} depend on the model object. When users specify an incorrect value for \code{type}, \code{marginaleffects} will raise an informative error with a list of valid \code{type} values for the specific model object. The first entry in the list in that error message is the default type. The \code{invlink(link)} is a special type defined by \code{marginaleffects}. It is available for some (but not all) models and functions. With this link type, we first compute predictions on the link scale, then we use the inverse link function to backtransform the predictions to the response scale. This is useful for models with non-linear link functions as it can ensure that confidence intervals stay within desirable bounds, ex: 0 to 1 for a logit model. Note that an average of estimates with \code{type="invlink(link)"} will not always be equivalent to the average of estimates with \code{type="response"}. Some of the most common \code{type} values are: response, link, E, Ep, average, class, conditional, count, cum.prob, cumhaz, cumprob, density, detection, disp, ev, expected, expvalue, fitted, hazard, invlink(link), latent, latent_N, linear, linear.predictor, linpred, location, lp, mean, numeric, p, ppd, pr, precision, prediction, prob, probability, probs, quantile, risk, rmst, scale, survival, unconditional, utility, variance, xb, zero, zlink, zprob } \section{Order of operations}{ Behind the scenes, the arguments of \code{marginaleffects} functions are evaluated in this order: \enumerate{ \item \code{newdata} \item \code{variables} \item \code{comparison} and \code{slopes} \item \code{by} \item \code{vcov} \item \code{hypothesis} \item \code{transform} } } \section{Parallel computation}{ The \code{slopes()} and \code{comparisons()} functions can use parallelism to speed up computation. Operations are parallelized for the computation of standard errors, at the model coefficient level. There is always considerable overhead when using parallel computation, mainly involved in passing the whole dataset to the different processes. Thus, parallel computation is most likely to be useful when the model includes many parameters and the dataset is relatively small. Warning: In many cases, parallel processing will not be useful at all. To activate parallel computation, users must load the \code{future.apply} package, call \code{plan()} function, and set a global option. For example: \if{html}{\out{
}}\preformatted{library(future.apply) plan("multicore", workers = 4) options(marginaleffects_parallel = TRUE) slopes(model) }\if{html}{\out{
}} To disable parallelism in \code{marginaleffects} altogether, you can set a global option: \if{html}{\out{
}}\preformatted{options(marginaleffects_parallel = FALSE) }\if{html}{\out{
}} } \section{Global options}{ The behavior of \code{marginaleffects} functions can be modified by setting global options. Disable some safety checks: \if{html}{\out{
}}\preformatted{options(marginaleffects_safe = FALSE)` }\if{html}{\out{
}} } \examples{ \dontshow{if (interactive() || isTRUE(Sys.getenv("R_DOC_BUILD") == "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} \dontshow{\}) # examplesIf} library(marginaleffects) # Linear model tmp <- mtcars tmp$am <- as.logical(tmp$am) mod <- lm(mpg ~ am + factor(cyl), tmp) avg_comparisons(mod, variables = list(cyl = "reference")) avg_comparisons(mod, variables = list(cyl = "sequential")) avg_comparisons(mod, variables = list(cyl = "pairwise")) # GLM with different scale types mod <- glm(am ~ factor(gear), data = mtcars) avg_comparisons(mod, type = "response") avg_comparisons(mod, type = "link") # Contrasts at the mean comparisons(mod, newdata = "mean") # Contrasts between marginal means comparisons(mod, newdata = "marginalmeans") # Contrasts at user-specified values comparisons(mod, newdata = datagrid(am = 0, gear = tmp$gear)) comparisons(mod, newdata = datagrid(am = unique, gear = max)) m <- lm(mpg ~ hp + drat + factor(cyl) + factor(am), data = mtcars) comparisons(m, variables = "hp", newdata = datagrid(FUN_factor = unique, FUN_numeric = median)) # Numeric contrasts mod <- lm(mpg ~ hp, data = mtcars) avg_comparisons(mod, variables = list(hp = 1)) avg_comparisons(mod, variables = list(hp = 5)) avg_comparisons(mod, variables = list(hp = c(90, 100))) avg_comparisons(mod, variables = list(hp = "iqr")) avg_comparisons(mod, variables = list(hp = "sd")) avg_comparisons(mod, variables = list(hp = "minmax")) # using a function to specify a custom difference in one regressor dat <- mtcars dat$new_hp <- 49 * (dat$hp - min(dat$hp)) / (max(dat$hp) - min(dat$hp)) + 1 modlog <- lm(mpg ~ log(new_hp) + factor(cyl), data = dat) fdiff <- \(x) data.frame(x, x + 10) avg_comparisons(modlog, variables = list(new_hp = fdiff)) # Adjusted Risk Ratio: see the contrasts vignette mod <- glm(vs ~ mpg, data = mtcars, family = binomial) avg_comparisons(mod, comparison = "lnratioavg", transform = exp) # Adjusted Risk Ratio: Manual specification of the `comparison` avg_comparisons( mod, comparison = function(hi, lo) log(mean(hi) / mean(lo)), transform = exp) # cross contrasts mod <- lm(mpg ~ factor(cyl) * factor(gear) + hp, data = mtcars) avg_comparisons(mod, variables = c("cyl", "gear"), cross = TRUE) # variable-specific contrasts avg_comparisons(mod, variables = list(gear = "sequential", hp = 10)) # hypothesis test: is the `hp` marginal effect at the mean equal to the `drat` marginal effect mod <- lm(mpg ~ wt + drat, data = mtcars) comparisons( mod, newdata = "mean", hypothesis = "wt = drat") # same hypothesis test using row indices comparisons( mod, newdata = "mean", hypothesis = "b1 - b2 = 0") # same hypothesis test using numeric vector of weights comparisons( mod, newdata = "mean", hypothesis = c(1, -1)) # two custom contrasts using a matrix of weights lc <- matrix(c( 1, -1, 2, 3), ncol = 2) comparisons( mod, newdata = "mean", hypothesis = lc) # Effect of a 1 group-wise standard deviation change # First we calculate the SD in each group of `cyl` # Second, we use that SD as the treatment size in the `variables` argument library(dplyr) mod <- lm(mpg ~ hp + factor(cyl), mtcars) tmp <- mtcars \%>\% group_by(cyl) \%>\% mutate(hp_sd = sd(hp)) avg_comparisons(mod, variables = list(hp = function(x) data.frame(x, x + tmp$hp_sd)), by = "cyl") # `by` argument mod <- lm(mpg ~ hp * am * vs, data = mtcars) comparisons(mod, by = TRUE) mod <- lm(mpg ~ hp * am * vs, data = mtcars) avg_comparisons(mod, variables = "hp", by = c("vs", "am")) library(nnet) mod <- multinom(factor(gear) ~ mpg + am * vs, data = mtcars, trace = FALSE) by <- data.frame( group = c("3", "4", "5"), by = c("3,4", "3,4", "5")) comparisons(mod, type = "probs", by = by) } \references{ \itemize{ \item Greenland S. 2019. "Valid P-Values Behave Exactly as They Should: Some Misleading Criticisms of P-Values and Their Resolution With S-Values." The American Statistician. 73(S1): 106–114. \item Cole, Stephen R, Jessie K Edwards, and Sander Greenland. 2020. "Surprise!" American Journal of Epidemiology 190 (2): 191–93. https://doi.org/10.1093/aje/kwaa136 } } marginaleffects/man/plot_comparisons.Rd0000644000176200001440000002351614631452336020057 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot_comparisons.R \name{plot_comparisons} \alias{plot_comparisons} \title{Plot Conditional or Marginal Comparisons} \usage{ plot_comparisons( model, variables = NULL, condition = NULL, by = NULL, newdata = NULL, type = "response", vcov = NULL, conf_level = 0.95, wts = FALSE, comparison = "difference", transform = NULL, rug = FALSE, gray = FALSE, draw = TRUE, ... ) } \arguments{ \item{model}{Model object} \item{variables}{Name of the variable whose contrast we want to plot on the y-axis.} \item{condition}{Conditional slopes \itemize{ \item Character vector (max length 4): Names of the predictors to display. \item Named list (max length 4): List names correspond to predictors. List elements can be: \itemize{ \item Numeric vector \item Function which returns a numeric vector or a set of unique categorical values \item Shortcut strings for common reference values: "minmax", "quartile", "threenum" } \item 1: x-axis. 2: color/shape. 3: facet (wrap if no fourth variable, otherwise cols of grid). 4: facet (rows of grid). \item Numeric variables in positions 2 and 3 are summarized by Tukey's five numbers \code{?stats::fivenum}. }} \item{by}{Aggregate unit-level estimates (aka, marginalize, average over). Valid inputs: \itemize{ \item \code{FALSE}: return the original unit-level estimates. \item \code{TRUE}: aggregate estimates for each term. \item Character vector of column names in \code{newdata} or in the data frame produced by calling the function without the \code{by} argument. \item Data frame with a \code{by} column of group labels, and merging columns shared by \code{newdata} or the data frame produced by calling the same function without the \code{by} argument. \item See examples below. \item For more complex aggregations, you can use the \code{FUN} argument of the \code{hypotheses()} function. See that function's documentation and the Hypothesis Test vignettes on the \code{marginaleffects} website. }} \item{newdata}{When \code{newdata} is \code{NULL}, the grid is determined by the \code{condition} argument. When \code{newdata} is not \code{NULL}, the argument behaves in the same way as in the \code{comparisons()} function.} \item{type}{string indicates the type (scale) of the predictions used to compute contrasts or slopes. This can differ based on the model type, but will typically be a string such as: "response", "link", "probs", or "zero". When an unsupported string is entered, the model-specific list of acceptable values is returned in an error message. When \code{type} is \code{NULL}, the first entry in the error message is used by default.} \item{vcov}{Type of uncertainty estimates to report (e.g., for robust standard errors). Acceptable values: \itemize{ \item FALSE: Do not compute standard errors. This can speed up computation considerably. \item TRUE: Unit-level standard errors using the default \code{vcov(model)} variance-covariance matrix. \item String which indicates the kind of uncertainty estimates to return. \itemize{ \item Heteroskedasticity-consistent: \code{"HC"}, \code{"HC0"}, \code{"HC1"}, \code{"HC2"}, \code{"HC3"}, \code{"HC4"}, \code{"HC4m"}, \code{"HC5"}. See \code{?sandwich::vcovHC} \item Heteroskedasticity and autocorrelation consistent: \code{"HAC"} \item Mixed-Models degrees of freedom: "satterthwaite", "kenward-roger" \item Other: \code{"NeweyWest"}, \code{"KernHAC"}, \code{"OPG"}. See the \code{sandwich} package documentation. } \item One-sided formula which indicates the name of cluster variables (e.g., \code{~unit_id}). This formula is passed to the \code{cluster} argument of the \code{sandwich::vcovCL} function. \item Square covariance matrix \item Function which returns a covariance matrix (e.g., \code{stats::vcov(model)}) }} \item{conf_level}{numeric value between 0 and 1. Confidence level to use to build a confidence interval.} \item{wts}{logical, string or numeric: weights to use when computing average predictions, contrasts or slopes. These weights only affect the averaging in \verb{avg_*()} or with the \code{by} argument, and not unit-level estimates. See \code{?weighted.mean} \itemize{ \item string: column name of the weights variable in \code{newdata}. When supplying a column name to \code{wts}, it is recommended to supply the original data (including the weights variable) explicitly to \code{newdata}. \item numeric: vector of length equal to the number of rows in the original data or in \code{newdata} (if supplied). \item FALSE: Equal weights. \item TRUE: Extract weights from the fitted object with \code{insight::find_weights()} and use them when taking weighted averages of estimates. Warning: \code{newdata=datagrid()} returns a single average weight, which is equivalent to using \code{wts=FALSE} }} \item{comparison}{How should pairs of predictions be compared? Difference, ratio, odds ratio, or user-defined functions. \itemize{ \item string: shortcuts to common contrast functions. \itemize{ \item Supported shortcuts strings: difference, differenceavg, differenceavgwts, dydx, eyex, eydx, dyex, dydxavg, eyexavg, eydxavg, dyexavg, dydxavgwts, eyexavgwts, eydxavgwts, dyexavgwts, ratio, ratioavg, ratioavgwts, lnratio, lnratioavg, lnratioavgwts, lnor, lnoravg, lnoravgwts, lift, liftavg, expdydx, expdydxavg, expdydxavgwts \item See the Comparisons section below for definitions of each transformation. } \item function: accept two equal-length numeric vectors of adjusted predictions (\code{hi} and \code{lo}) and returns a vector of contrasts of the same length, or a unique numeric value. \itemize{ \item See the Transformations section below for examples of valid functions. } }} \item{transform}{string or function. Transformation applied to unit-level estimates and confidence intervals just before the function returns results. Functions must accept a vector and return a vector of the same length. Support string shortcuts: "exp", "ln"} \item{rug}{TRUE displays tick marks on the axes to mark the distribution of raw data.} \item{gray}{FALSE grayscale or color plot} \item{draw}{\code{TRUE} returns a \code{ggplot2} plot. \code{FALSE} returns a \code{data.frame} of the underlying data.} \item{...}{Additional arguments are passed to the \code{predict()} method supplied by the modeling package.These arguments are particularly useful for mixed-effects or bayesian models (see the online vignettes on the \code{marginaleffects} website). Available arguments can vary from model to model, depending on the range of supported arguments by each modeling package. See the "Model-Specific Arguments" section of the \code{?slopes} documentation for a non-exhaustive list of available arguments.} } \value{ A \code{ggplot2} object } \description{ Plot comparisons on the y-axis against values of one or more predictors (x-axis, colors/shapes, and facets). The \code{by} argument is used to plot marginal comparisons, that is, comparisons made on the original data, but averaged by subgroups. This is analogous to using the \code{by} argument in the \code{comparisons()} function. The \code{condition} argument is used to plot conditional comparisons, that is, comparisons made on a user-specified grid. This is analogous to using the \code{newdata} argument and \code{datagrid()} function in a \code{comparisons()} call. All variables whose values are not specified explicitly are treated as usual by \code{datagrid()}, that is, they are held at their mean or mode (or rounded mean for integers). This includes grouping variables in mixed-effects models, so analysts who fit such models may want to specify the groups of interest using the \code{condition} argument, or supply model-specific arguments to compute population-level estimates. See details below. See the "Plots" vignette and website for tutorials and information on how to customize plots: \itemize{ \item https://marginaleffects.com/vignettes/plot.html \item https://marginaleffects.com } } \section{Model-Specific Arguments}{ Some model types allow model-specific arguments to modify the nature of marginal effects, predictions, marginal means, and contrasts. Please report other package-specific \code{predict()} arguments on Github so we can add them to the table below. https://github.com/vincentarelbundock/marginaleffects/issues\tabular{llll}{ Package \tab Class \tab Argument \tab Documentation \cr \code{brms} \tab \code{brmsfit} \tab \code{ndraws} \tab \link[brms:posterior_predict.brmsfit]{brms::posterior_predict} \cr \tab \tab \code{re_formula} \tab \link[brms:posterior_predict.brmsfit]{brms::posterior_predict} \cr \code{lme4} \tab \code{merMod} \tab \code{re.form} \tab \link[lme4:predict.merMod]{lme4::predict.merMod} \cr \tab \tab \code{allow.new.levels} \tab \link[lme4:predict.merMod]{lme4::predict.merMod} \cr \code{glmmTMB} \tab \code{glmmTMB} \tab \code{re.form} \tab \link[glmmTMB:predict.glmmTMB]{glmmTMB::predict.glmmTMB} \cr \tab \tab \code{allow.new.levels} \tab \link[glmmTMB:predict.glmmTMB]{glmmTMB::predict.glmmTMB} \cr \tab \tab \code{zitype} \tab \link[glmmTMB:predict.glmmTMB]{glmmTMB::predict.glmmTMB} \cr \code{mgcv} \tab \code{bam} \tab \code{exclude} \tab \link[mgcv:predict.bam]{mgcv::predict.bam} \cr \code{robustlmm} \tab \code{rlmerMod} \tab \code{re.form} \tab \link[robustlmm:rlmerMod-class]{robustlmm::predict.rlmerMod} \cr \tab \tab \code{allow.new.levels} \tab \link[robustlmm:rlmerMod-class]{robustlmm::predict.rlmerMod} \cr \code{MCMCglmm} \tab \code{MCMCglmm} \tab \code{ndraws} \tab \cr } } \examples{ mod <- lm(mpg ~ hp * drat * factor(am), data = mtcars) plot_comparisons(mod, variables = "hp", condition = "drat") plot_comparisons(mod, variables = "hp", condition = c("drat", "am")) plot_comparisons(mod, variables = "hp", condition = list("am", "drat" = 3:5)) plot_comparisons(mod, variables = "am", condition = list("hp", "drat" = range)) plot_comparisons(mod, variables = "am", condition = list("hp", "drat" = "threenum")) } marginaleffects/man/figures/0000755000176200001440000000000014631452336015632 5ustar liggesusersmarginaleffects/man/figures/zoo_header.png0000644000176200001440000157144314631452336020476 0ustar liggesusersPNG  IHDRo%zTXtRaw profile type exifxmQ[ =aqLbfz($M2eF@+.}{xuaHi\r&Xb᪎Iz8_s{kja xĽ XͲ< D8T" K^{-;`n@lPIH3%O7ӆ&Ko/cOzTXtRaw profile type iptcx,(IR# .c #K D4dCD 07@H.+`Iy:iCCPICC profilex}=H@_SKEvP" EjVL.& IZpc⬫ ~8;8)HK -b=8ǻ{wP/3nD\dW+EeIR=||jbO$1ô7g6m>qex¤ ?r]segtj8L,XicV45i∪/d >-8bKGD pHYs.#.#x?vtIME #b IDATxy-]of@ DrhCH%$ F$&H*6')\v\H`A@(SN*qbUXa+S1 E2bhf}~>UާO?{%,JRթ:uռڽNUNXU%uJ:Iݼ[ApnmfvBDp\;SN`UEA8nUkgU !y3a]_c}`ssV׹j1 j]ݑqO;_=O?Ktpu\yg?{{>`>ue1QYy!:uU; ή9J˹j1Z@XwfVAp{:G \joK_m7#;F@.UI}Ym,1+;g>=ɻ[3ɪy;lَlk_g:.K`egK?0`2CQ_2Ypi/gݹmcѭv'7;;Ekl*v4\vォp;-ߴ6;p\Xr qlw_|ד<7ɯe^ rAphKcr;Yo,@S[عz^nus}Vm}d9؎ۛ` * y 44Osϭ֝Ͻ!7gG~Jדz:C.Ywe3%N{w&M;1Qr,p¦8LպYn 6aU|N6Ǧ6|XN%]ځroy{+Wxpt/[JwJSyb1h o˳Ƕ`gz[w}ecM-\wPO$vUdol=~y񏶖C۾T{//'o\7+8gGX)˕)(ԭ6 $PY?oofܲss>#>EjNϻ|Jk{w-CN_?}1mɌyCZeZur׫S՜YTzd=\g~IT8< IfW`wtu.(PhhW|Zy>mFܞ wv׭wO*?;76}v}D4cP9j${Zsw?cL;WO7SmR<5& f5vٻZϙN\Dp19`߲I;}wwo_SϾ%iae}y2vKl2;к,]΃9+[|yʾNZr6Xrn%]rI~ʔwp螛FMXI~cka4١gp*~ueќ`~cʭ AW9;F{VLDs!wgsmf]'48N ͗΃ji{򡩆s;g-54caG[ۖV>wλ`aib9I=w6f-J.X_+In4sMjg34wݝ3gyv77ٿ/in,Is׫}˹`;$Yֳ&>_e٬Nҗn4hN b&yXa3?zE3.X!ˀ-gnJc%S}Gp97hs?twL|gR}3[[%fu7'Z2.A l_ɨ ΃0yM);d? {>(Si$zZ٧ohRrbGyq=*1v0ίOד:׾c7 H$YGi=~~w4! 啔גVCQN&e#Q*ad@A>Pr"{n#,˵bwKpzp:uM6v7ϕ{mgoKYrמpߵl0m$}<q<E ii*-2i/ngpaY'flz,X?(, 89QUO}^MuN2=6 x}Ay~OC9 ~[h] wd$W'==k^I9}%MsxdnyM:E -$٦u`Wi;ж,L;sӒ.?+9S X%yUuI^Yc$gKcy>ćCu<|I=8ŒXVi?;Pp}\T,r(sTz*-9[7ciT.S=nN=hzw 3[uh_;{UPY?fm{srbqY6ɱc@t;C~0mRO=|{<;tQQs:Ny+.9==k:s|imEvaz3Kf:|NS=P'!@>:j N^ [cD!>~nkI|o(\oqh ,$eӦw FM MJ:{gMɂ%~~Ʃ*emxeo}\LuMk{SnvZ|Hڛf˶:$ 7sl6e2f*p~v߼8U=f |/η78J3թzO:Z}>^s쾩󛔿uO~)k:qBil!syWg&y7-{r+3]&q#1NceIzîM5@3a`< W1yP.M 2uQy$m- tݮ.T](u쾎s~{ w6Y~o塍7`fc`=dc)9mud3gӒk}YusݡwJ:'uIՌ4-ٖAsw+;^Kp|{ 4 ̉wޘ[g/oܾyeNֶΉK[\|N23U) qܝȔ6Hk$:zvGB*eN̼ajƉS}g-%ympuoϜ׭ {f3ֳkt~Jւ֒UR+<º/l3CQ>V=|y;}|8stWK߶.ixiwlQ}}H27)[S~)gM%:p:Lms_$? ۙ 8( K* C'W-4{O %6ಥ%ikJq9pu}JV9J\isIޑIXPW(V$͎cg{|w3c͡9䝭uzas;D|hEɐ;k}oܛ/tꄫ$S56:~YKGΣkIGlomucg|m|d}t[U'Oss:q;7tsgցmzd]֤ի9º3 b9yJ_N>n/.'Տߩ' 3<(HIGMⰡs9d4[8JۜϘV.w~Q=r&>Ұm\Ґb )U|SRSSs+ߡ-`xunȾE0Ռ,;n^ze?i?o\X{9o0O$ߜM)ݥh'ͱdFܓO9F4\I0ܝO9q6͔;Y\򸳔aC䞉ܜuf1_h'^AS8DgNםXUFwyy"$ĜsGb+Ios_ۆ Op\1%'3*ޝseN7 fdhf췜{M_U[^ټwv&k[zN]u5D]:GI:Xz5>O;ǯN},w,*{˕c'$@A^g<2?b>ouY] ?C.AuUO B2ζ7zÙA[z*@?-+ի`ju⍡V'bHˣ%ʴj`YQso^Xl,$o-_2Z͋1:WEEI^\Չ7]}sQK?ۓICɗ p׋fA[nKpOIG;/ͩH ש n;ժ-;-i/À;'d3xOFbMzcyܟI򡙿P-E2.D(?#Ϝ>QiCN,='3y۝Dlc۪ Ҏݴc}jSzfKwV#{οq]/ޜxxg$N7@ycg*]+?ڞ)k=>^`k×||w[ڼ$Wgޓ[;=N | IDAT@})PߕNc]#0V M/uzvsc:QF_)n kvYJz"d;3߿/}D~@7>^ɲN|}߻YtbmhGnv\ tcSM<51pG2PzmML߫c~_y=u9q~8o(ĽyՌs}:y9vc_NE.K*e׉2?,/c<Ϊ?NWwWSm.+͎şץקyܘ8*81ه˗U|)9gۗ_ug*ؤGTuǡuP/Y׫ ~},oo(v ( f d5pP>hl|a*v. Q94-bicj (gq6,i0W.X}u7ؖu~W6ܣN2tNxm])o~IeJ._umUpv*,\ϒq7_G^Ӻiӗeåo?gpumÉtճO6 b? Xu;;8#!U&֭cJNNYmzoݰ3&r q<|$gipICX'"}V[!wcݒsCu}y'G/[CLyI+ٞ8}Ӻ̩}5˙՛^뫓L;x/}$`q>N_i^-O_s~'?*k$?׉˕ '6'_G~%yfiUz"k| u .Af Vi+ mTa/l#Na_gWrͩX>1DE~轒2_]+%ǜ82dCnu*6FqHKU;M {yCܳ}")}InO-yXOߛkA%$OYP9zӒxJ> K#NxXO'3bO6SZsF8J͈4]o/S6Aڏ_epLl_'Ks}0c;_ C#N'ǧR~s> Pם]>ϡLo }1QIǯj>eweM&ѯV5c$) Xx Uz}J},cu7}ms=9nvF[:оܼRx/uϟ8WSƮ[#Wr'صz[&-9#Sd=B;OlM8tg1w\$+־N2o6uk0%ϮFoα]Gh?^k#{{tpĒz¥C.oҗKow;?>*sGyJSQ?UhKnCGM/c3( ƿ^oR6KxvꓛG;%kf7n~owMĥbݥkFƶZfw>Yv׌-ǖ6%\¥G-i6 ~cu@c,}mʮE<.g|=CWP:HsUF2 _dئ4|]e~G*e'MOfE{l&jݶՉ''yRIOS~}lyH٬|.#TML06@'|B8|˵Go)WD/^PeՓǼeA.T}T'`<o-` gXV>\%yr\9#:b%,Q-]6Rq1AɱzM>fȎeby'?lR3(~rX^6d{Zt Iq-V ǖ$M,eN} rwel&ߤ_K63V,/:ƺq/=SA.1W=sQ_L~|T"}3 vZuemV2K:b콏ƧnLX~l4.mqD=ly93ozD\Lw^*nA~p'dafwY_Y65|͌zo7gd8n(d5 }d;\OedZB|X|8|tĒllVFwZ;"ETIiCAvʙ 9ݎFC'Ct"XR9^g-m8gVkngYK}1pQ~k$u[Px>:mIVw'yDh,'}M `y9ZMu[M90e8~qyXn{I뙾I/jl2 V8|l"^ez˔Ƨ`wL0Ոn*^Y qZ|6nczTiOyX=`l}\|df9b =pc`uҸI>}"Vl5[II?9ǛDzcu%FZ&z+3ǚ2B> 2|^{lb:9;9$wpplW*5;їvoLT2. fKG:6Bh@X,&n7N+[:Pz{>uvz.aGF>2vmF5v{Ƒcʹ`^^:QWZO*{^/,}}$?#جl{N&V/Y2T^35+*q2=x`_֎[Kbdy$[)H.2i 1g6e1elQacq$კu+LdeeEC>&ߤ|6 SV?(E_MfPdjD,ph8,P<g6iU3Us]#^M|g`{e'+:)?āpgy7ƛ9);CTXu*# ЎvjhNH!XtVx}}d/8%?rz \~&y%Ocix,vlg?O5&\zm5}f=ύŋu+^':8o~WW0 7bG~>?S5 $\DT:7&>3ކZD'vU֋#UwLr[7g<`Rrkz7xvlZ{ՙ>$ߗ{N|Rkw'Bt,( 7 P nS:ȾC}4 ^f̘J>cyo=l#:w2Pa:&)7Ms~qm3bgpY}UIC]'jmweS3Qܞ#I9o fgOo)ʅvys GG?kaSW3k_YeknoEjUuU9SWIR׹.:g\I]WdD`wmglb7vd]2(mx;4>zR~*6;U !j5ulj6{JcOxNV{yxa zB~Non%$ެ˧#zʪUA9qoS| ^Xz>_/jnxd2\C` n z #aT³lD4?R~Y:*: YR>Aivrߖ\c$>\塍#GU (Yn]K>.uL^ҙqh6Bu>`۱us㺱Ux=s^U#i g ,uIܿeK<8j9su?U+ĊA"yՔguсp YS%YURR_RRT_J:gw%VeU9RשmzGnwTyj`Je-HZ^@IоYIr[?}]UOl[W:SbƒXrjx3@?,QFۿ?ovkyuotl;>Rݘin,Rmzf=[iJS:g}w:zN5džiʚWd2oǦc{ݡ$%I>Qu}}tPp_ޜM\ufk 旯 {[p1<.f2B >nFw~%*6U'>KG5!pY]{ZֶG~oj:8q1GΙ]oCyג>g`3^]PL7-<Prt$y߸XdQxlaJvIs>m& g7 `ӑ\jޗ3UJ]Wv;nVpqP ;Jғ|S}3'/nҷoOS6\8ˮjK.T2ҜezO)W%xʼwcikWyVWs ygf,$5tnW;{_%c>3 K$*?߬׃Iy$Oxj:WVulʄ2F[fݓlU_g[= Is bR8`|պsc`r>Ӟ\9URWIE ;^,;N1X`lBi84,9ziOhWr\V鵽}MNon#MG_2kj"q7l5s1uۍyȩ*: ̟)#IG;{I{<}: #gWXap9oz=` {DgzЮnuoU8i)siKO% tz(CNklIrzygq[LyztL7bp1y8v6J-Iey eU.g311%j=pvs/Νcyma)G.K؍OK;YZY?Al8Z_y$oK әYN|*ןVY2z~s{]7n! /c|kwgjS8B^xs5IO g:Uשkuْmv t 5ywi^8PVhA3n'/:iuc߶|8MTcuvnQlwUgw>9K Wf?m .X]3ۥ,,sU>L}}EsS=x}VpIBI,; N[\`xN^wm `o}7x몮sY/˓Ϊ:9DX%?Ϯ>VZ$U/|M7|:֏3oinN5DK\C99rQ2*!o>1URM<6Xrv^ui"HE.U\_rb2n+v~8n|1>: N̈́6֐g>}xM=o : ౖiK;G*8ymԥJQh}8߲`hJcM$4Ck8/}/pTj+'>1΃|yúp)RW֝[_I;~cy3S'T(`;J:.˲/6]vR093{V]uP\m#ؗ|6@6<.ico{~[3Jr8!9U;m+9cxn=f]]:~}Qs_C^s-cn޻DʭUSu>P$3 >FFwl?$W>cOO4Y۝Iz.7|%ܮtb2SWz-j΃UW%Δ :=S1}wjȬ[-:WүVF*gURשn~:Y]GUU[鮪N+u7&UsͩF꺪jڪJRUժgֿCUN^2e{ܹa(?gSUϱ_9Ǝfy>v\W]Ci4;t }ldO߳l;?X>Sw5 Ű%1ᩖsb}|W#ĹXgvKsuLx7ElSvA8;S;]kzymUa}ނXM_0sH[?Z?;7~#睞<&?;b=8y~<4οߤ{U/*Ir+?Cw60QfI{3'fv='kݘ.]1kjԶOGkJ*g矫[VR?s9v-W439[: u$7߻Y\ޜNkvM;R*)cV?!w }]^sCv6TUݶ}Rov IDATcFv1Je)_Jgo*OC3THYpJGLfKg198e,pzwc>\P;Yj y!ӭ `sU2K/yڱۓ=1Ɩ$$/&yہy`[A)Uy{y$YY&~VuUWuWoUMw&b*0ӭ8j#:,\Qx\Pf\Pg G!â"Mw]՞qV Eəm4m/XW6R%9^cAƳ(^|>.hL1SɊs .r< gK8}e²ajL:].0! ~0ܶSgc~Cb "sYY:>CA9^k?{D-F.hױW\ĽZK׆ŰVe9KA C}vP0"9B=S-ucNhy5m]lcsDHרE#ßv2n=u[{G|Uj( AAU&VW!wgyARTm+1%Z b%= ݓQ1\/y%N rwΑ~A@,l5$4|*'OOf89m(pzc 9 Ve[poe?8^sEmD'⒏}/G-*;S7^\T \+*Pq (%ZwGp E%h+Ь=k>%TSS@}Vrd?~{Y7bތ" ;Ķg<ҳ^Α)8q۰0YEo :~8VDq}Q9k) n>Е\|8C>Vdtni;.<th,} j{ڊmPo+P;/8؇q+%W\ *ZaK<9َ{Ƭ֖3*Kk2-8PiqYB{|e߇Oo| ?E3sx^W^{׵r}pkc}u|^m*B~z0AbeuA.E~NنӦ0 uEa}.p~ 4Y5r ICc0_`"u@ ͐{Kov1+I7iAvY,$ Ʀ&M=)A Xk-<2,A-XV-9w?H !&3;?A{g=tU~6v^i^DʕQ瞋?9:Ÿz.licYu}غqQ3-#3&2nYĺ^?3<ەEx|휯>RM^+}]yݿ)o|N1뙇'1y }jCЛEi,Z m.; h&F'WL#>&lgJEbqvYҢHro]PO99Ӣ6ks XkđAt ?SbSN%^O pq>x|A\ALTӰޮ'^IJ|;/Sp*eAV`ُədWί0@BJnm{Kj1 ek՟mpbjr9[(բAl6 `sG| Υ)'BNS]N]dSiq63'u+I"#Eݼ(|6;AD>b\IՠaIp[Wjvr 4 hUO{nhHNx1L@գ'OLPt`>^GK nkpq캋E w>V%AAӐހĤbq賡Mz#AA,SNJo@FGiڿYb*!A1pmsW@l^pRk؏g;`Lh,cv,}U>({>Ǽ9*:`-xˬdx)TyPeVVE>NG 4g9lY`y~R7LoފCNHqPX-*m#GXqA`C˺$J~89,Oȯ t%NEҖ- [U!P_ ۔_} @tdϯBT:7* $/}cjmjOVN Ճ2G_Nq-ϡ=>kۘt+p}^v/_/vH/{0@R@ˮŋhon)Y^"->{(@T.˱m4NPN}' 'c(?{Wkxtyc*p(c ЍWK<,#s<.n{5bP#˚d_At#zd` O KC^Cֳ݁G;Xsr~/rcHvDB6L7v9N&jgvսԥsӡ_j8öêʶvB  ˎaSHBİݾ\WHA#[(Kf ًiG$;np1l>;u |:,HJ%-5>M艉 ﴗg `>ppbUPÇ1"sd;]=xYyq:?#` M.k4o 0Dh: $TBL ]rl(%/[s94cL|bTGR! 뛟ax͇gժsop|YَY-97p?p vP`pxW9Rp0ֵ4dP^]\wu6N?|?ym{.hVBo? zzX|ݶv/WSnԯ99ڦ" ifp9*e٧\c&#vpxM'` YStxQk.uXmm [mC %2Cs1nAAtc<;m Ч1ڭݑoGa{{R˚p^_ b-P}IMm;l_-ARnlpYcІ潯ow(r|IwbtjAanuMV\Y4tceWϷ^s*sS}6d*f>}S=ۉb;Ao ύךJC[e:׳k`^䁾k1/y;.cCq̷Ö3_&=Œ)o]r[cT|#~Ox(҂r}J!sU?P9~yG:yDž&#kt)hEm9 uL{|໸ 91~.MGf$ ,b  9:)Ab97Q<;"*R \wG_}BN@4$ mOT 3]xm'm|3~dPȪsT7,Vm8,L=o[!2j[2LѮ hiqR)mA&㱌 k;f5}*`\R_E/pNNkޏ}P[W;E@Q5UeU WoDY8!^gkUs*mɇ1WvY1wOuwwV"#>ӍR9ohm,S}1ys1W0 ٧ǎYv!WUdgnvX%8+].Y=  2:ijU&n bټ-՞~qL(l`'/|EY55} %={=(|5clc#bA`= 9hmN~3k5I@Q ̐Ac C>ϵU qp/]^\ohrA ,ދ ,q9X!b]CN1N!mYNZb/YЛϖ%!KeEhTڕ~h{U*_]օ OɄ~Rϔe*mhsL-=~pS ߫k+O:G|:.]FCvE!1k@?q̬Y׏ @,T":⛧ʱrjxKўl' 9Ea!{Po[D07܈ ЕE"U-N{x.踶+Rl {@u#t>mz2缋}z2C0:jw'X7=k*q*4Q$v[ X&oKߕm}Mw? A,s}G~(AQg׼hu76TA},K.N)Tʽsw8gΝ9B]#>:B}{ېo><{n̹\_9sT'}/S/ ˤAm,o̭cq,04czG kT 4sdDu3n,o=P簬%G: {>G:n޴x[׍A46k쒠_XV!RVLIJҔCB }`k_{z=^+/^6X]l`n)#֓$t5ke4 º|Yduh<A:& Olm>)7#.5eXb`M|!u6m>|a;*uh ڨ?*Pr1.8'6W(T)xb+Se V١ &#@^A>~xALq #Kw0&C 19;_?vQOs`Z7%0><}ܸSdwYzbs]=X+$Z}AA9.ޅFI{ bX dOLDA+ZBϖ|B{_0\}t˾9A@!9d>K*7 oŎ,d;wp)TlMw)߀9W.l|/+k]UY$BLHHq(:E3X* .*2cU-2b:Zܥ_1|@aQ{/tʺ(;ـ;t%ܐBw)c-!:ӇVLu)^1G3e=kN ®OTJY;T\wyniWCq.rS;z]S;!אU:NmJXN`aנ"qnKor< U$$VHUy40M}696Ak+tPHY{lE%bXܧm?4AALW6><}Xg beIp}Yv y*yx A+, ,梊@e{6p-EVUCBLz[2݅ͿZ\y9VKp_!uY)bBBDmI9?VpVQƼK E!PB9Md̛Z-U5F?gpK\ ྑ S_4a2g$>J~ wT%Xo*Ik'Ք\m3\K1Uy.T,Y#gqVmasbL,~]$X,G>߷̯{UeZ.4i ZF#Ǝy37c<-f͑xodp h;G1AKtYW؍AĊ[KZ  ,ǣ?J}~}6Rv X'xrD+Ǐy9.=̑ (6ػ]?`ʺArV݂r%"6'3@8st]w/| Ih0_ڸo6GT.u~}!<4W?u[N؃95-h -kZyӧ9[>]_T{g IDATZxJ+A @G|] 4%CY +ZGKھY3EˮH׼KvI V yS4c J&،8hҦKdF-e 6u͙/US Bcԧza1}%T[:H6/-1ۙ[M/' A|2N,]d! UQҺG{趋n7^푕[bdK[k] :?Ԁj|h#$V_7&6_xF_tކXx=AD d>>.S vwTA˪UA-^z fP L 9Rp8>92ɋ`1ms"Y~kf6mᯤh"&3nS 'u|lEe_5C]O*d}|)w.T:ꡟ]0|x榳ܸB_,vymn NfI9ήʆ&W,JT0 bꈱ(|2Ϫ9?*u amdzL/u{*i@x*ᚩve1*ɮ\X. ҉iɢ59NK\27X:ڗLXݿjeVLp^|&r=XCV brzߣRvbv,5PǭMONCWAD8h`Y.Ɋ@PLLeWܡSv.f35#+ A*QsZ6p~F!7h֖!w#6'f3%K:/Ǯ/J_Drd;D#9]A#ݐ5eB!CE&C,mkc>ļtV\S= "]t[Y> _oPSgc$"J֡s9];1clwFbi 0{ʱ>I,X|qz@t}(D_R a5Q_' V ѭAzˇ,C}=ů bFb +4SEgn[U!{ Z\ܼ&+ r =f=c?tn'ky8c_L:v8x.b}*iHβ1XAbXBxBRxLuU C(m¸4$cY tqO`` skLN륏5ЯـPw1ѮFncWCҒnQd3[5 |"f#;p(9:L=}8Oeq'b8J7O"- 6d9*h 41.r0A6,,<}V1~׿k3,NC9k~ gzN@x hD?"X';عs}bXעD; mxM;o.:ä=v} X1[xZ} b/0ȭ] !iOX@ Ě;sx2r~Y6Z@Z[cu6Y\׬v \m8*T;^t5djر%?XKgՕYt1d9澱V fK WmVgk_࿬i_};k{cE)ǟݹ:tGҾ,B7#֏[؂Se %N:UC` BƮ 2)}rXX[V5#u)ПAT_^@+ ej1ec`V!$ϐXL 1V, u ̋{5m{1LOOf'$v)T>~JY2:@q599aѬ9|EhW^QD 7._V=A ݟ#8+&Bt.,wɦ^}={fQ?& X*jG2d92o w{Y?lQWU:ۻ =s_!{q+*@rs<8ֵ Yc"ceqH1,B2e8֡+8ӢP 5h bXm|waYmIN"j }T3< 5F>W  ntiCL +ySJ)g(7v<K1&p8kGC4w*뱋-[BISx<'WRRڳCX  X-<뿿 /|t_S)rt!%y&AALG}wuȮeUER[/VDmՑ׌EBA|GonWgNHxۃTܮ}|¥]6Hy\s&x<'PBOic,dV s#N)|ʶ9(&G|zA55vss.c%Brߔ,6Fp 1:✵S+M6k{A-%%'4KlXֳ5 ^JzkS2KRrVɍ״|l%!DN h2AzNj/_ 1^N{~ X!ٻ9O*I~HL}[l2iI*|./|AkF4|{ H4pk?UdUߙʃk Gv!S Ӄ^ןiCunVc$]lU5vAX'1^REn}r"]Cӟ50fᶏ*S""~ݎ1BǤx02VlP:~rIS> u/8n꥟6dy-%N$ PW3&@X/^45iScmO0C1{H.2lE:"o#b(<yмjayy'/! s.&H']TwoDK^PΐAf%m(eAVvqiDb\{"F1+Q9+P]w6>~|`Sp:a}غi)vXhqijV#1v.zZd2blu^w SnfS1 ϧe14nfДr#2uԵ?uOD<9)R2EV*D-kon}T77:6}w䧶iگ~t ֛[5pCDN&` XA15\݃XA e'[Cz"Z VȨ^BYbD8xȡ+drlCɡR~FP*[!~ سN: QU2{ ?:mBWOT8WȑL`J?(ԖdKVlg]<3Gz*dEm;ALKB_MibxZA 2W6l##-"K b)6i ߱h{16&o= }(b=鎶ms٧,cC\k:ðlyܣ3}ѽ>dV3( s'_Ҷ*im; btTyn=(**Q :FM>٦ XjqƨADHV|?n+>VMv&\7m@wA1 nW _pCx+;>Ԫ nK2UdU5BV%o>r~2;ZT,+f?|~ܯX8~> 0{֯5,%*g/Klv _5ܕg.XKaK`YVhpk1l*A7Fwb*ZwncߧTb.g}#)_/ C+ţbh^aZ)G8lWZMO.:#,rӎB熅NFVuTb|J񩼱\e[ECDa}t@ X1{@D՞_{Ye\~Z.߫zEAP n 4SEv#q^n]`C" >Ƭ5U޹mⵛhx"I`BЇpcg b<̷@׶9+d#V 1.B|/ PlbgS]Hs%!Ёɺa-j¸2AMICa]tT^U}w5l~6[k"}6VKCt!XIƺKhWC'yYG94Bp#J;H ?DUEH ) ,p'.&w`I}`Az"cIK 3Si ;}.%<PqEUFAQElK>676q A<U|8rIz:4Sx`jKVe_Yj"r]i~l?Z+͘Z N ǿ-tȕilt:Zk|&s!Ք6O#ڌ]f *6M*Gx}! }V\,F-py&LczâOq>d!#t]P/NèhmhmK2>#)}*A:ic"t'710JX>AS}6/}?*t-n[}DxuZvEߞ)JAX*(6zO|ѥ{p"L揻 wW(TL8SpG"{,sYRS dkQ$N@+@]9r԰^eV\)Kjl.U }NSp^9F ƇG1a(weT7cV,Ba#> wQd}18W8? @a|]8o~hPiy6nMpj>yc^^3̏&EI?<:ƆAjӅm3xX%uY ҺvI blu.s5u,vypA}0Ϟw bMm0V (T"Z~',5j) =UvRA9xM87SH.՝OޗlA%HP ƥ6fHb۵*]c&~+=䴴{'y6dv.W1: o1V FX9c]evlg|jS0 w 7x"R9]N?]?׏߿E #A7B"D<+ɃؑO7 c2IЈ𜘒e̚Y TI7+ vbAsm֘~-saXm#¥k#fP ] E H\hV} דA+'_ ?Y}%#&¡}/ (. zI6/U`Z` Ue!Tp5s&y[^"QRz⸄ AE {J@0 -ۮyԢڐE6Bs#(gg Aۘ6GUy^b98DW= *@h_U}9.?#?~E5 {#n-+F[8O2EH TZ0IIteyv5FR:$#_C [)1kZ׳z]$&aJCrS5@1׆[ceeF;T)MD?Pk,5Q/i.>yP1Fc{We_pmA+'_k.#O(ȉ˚2:w;~qM\A S|*gzoAq9H+\R0ʈ)l]1_}pW'g_y-BmcXv] a0ecCϴUmk(o,t͞)ZjS^u|}=//?x5Gx )U?=&sƦLl]+F;bt7Ǽ~yŘ+-3Fg]+\_½ܨs#Z;jc5a^m{NAZl>~&=]ϐ ,NvJDA:ؠ+)?<=s,ܡ#>9- w+gSOC4+ 3@! @|\SPY1:ˈ8_5`uf>})CKȱ~< "T bt8&- keTyU:ޯ>QS#a65yxC v%ʰ.'3ȼ1e>f^=,cΈ.NIJe sL'P*C؟՛!yY&> X~: IDAT#P/X"Aq)}&h>}:Eeֻ赂XQ%91.{ep _˔A:A]AĚȆ!8ed= ]2;О1l}1_?ӓ Ȩ2q NLpPAe<Pqzm*|M-6 l/R6IZos(;LF9^km9/!OLP8́X|fy ~A2ƛ $s]kxҎՁxc4 { 3ԯwW)GZ2<:u<,N ~~1syp$[FX~E|78r@iuګ5]g Jo[6~~NF<Ѥ Bb@Y@A|iu1#ޒ>L:f "a`gc1u:\k׸ַ(-4µ])O\~6aOjhw V tQY" U  &hl%RN O; 秬w}ym6-o1>/A12fU1fϣp-0UYYIPxo'(̠@Lr!~{iqV -p\\c۲i͋||[d5הok}gs#WnHCS.cm^ӷ#~I XpzpeOx2|%6UT'O C;cr *V1IKu Kv^Bqc\)P%mU޷^np>B AXzOu\k;p)T" }p '࣎_M]*w~s ;Ge1s?ADZk klc!zm{&XpCN·_lvA`HˍgឪY"Gʵ|/ѓqռ& C0FV&)e+d6WeP3ZzpZ+LU.GLVzҘoIJwh}4=3>sֹErxqy;K6weF~HAHy5gZxNgJWmչ.Y2OSWPتq!z{qA+|xWr 6|[^Ks=wsfඨ_ xWAD?ȼT9|3ʹ8PUPHQ*ȪTE?c;36,:v ] QyuKI}R]?&coj~hTNYǴvYpuNP5JFlx1_Ba(UtL1Qެ_x/vQ"&ڻCNh!F{_cEYX9p6Jm9WלJX}s[z4QT7:jFzR&]reW٩ͧ8/\{-;ٹSa[%Rb21jFj)JFt>6|[P$3 3t+U%q̡Hv'b6[[k  ZF.qayTt}otewc@(_x}_ %ADqnc(TL4BT>8@ڍOؿ=qdS!&co|sgGطQf\k srs^"ih048&xe)˱SzenCK1WV)"P_ګ!"_7. $_\.LdȂ*gd6tln]s2#1($sh:eYc+=^mVsNb,q̣[{jC>uceq\FPu˫")K?8]!udEmsb]ʵ yf =̵zGxDN$Z>Q$UTkn⼛ҷg<mɮM|x§OXoC"f Rgz~&X&\H֒ K"eZ6Pd~/!dǐA)h;gce7`>k}CTYW4`XY]h@_|1~G;ǿ_% [٥w f];U Ar; Td24V1 V['y)ANӈ6=H%xMy~F]~6hզe-Y"Qs:yuه'b$: OE6Qå[Y#;ۺ h֍1yDܜ5 !-[\|[PW` aΫو7n!! {IX=sN:ɀ҇qG _ ,crl45s33x0.8(53|MNHsrt%WHujE(*w=ߠ} Ρ9=7:80h`Rn.rTv,=+#W,¡Z}в)9Ƶ{vgA.scr,겿j/#&75zжh`M&lͷKmw_Ur׏|(Ea@@-7Q8+pu)}Rn%XtTX}[]ϐ->gعYNqo6mչ7s%z.~4emuudb=މ¶k '.I,oDsmَg;RONF!$t1̻6L}X.sN2(lwVa{d/}~NI]u&UnH "lN1ƴ>R4۞җ}Xt[g_ѽʠϿ / Pp$ueTzJAcG_x[_:2KLp}zSkn}޳NJؑ;t\~?9yVp+|sy\c^f=@{w1$AXˉT7*AQKUdkU7 rW6c\9/a)f#F< Q~2~e܁1=։oY3uk7K>Ẇ5%[}!'+mOꑿАm|U3pr9Yתv|IqNwa;`A/6)׿ GK!VW7–drhN5P}$d3iΩ&umt< $ΝnR׿t שegWq^3mYؚg6qs̍-d.\ ]{"}f22ֽOG#T6FNjR&$1%]9D/*ObnwX?׳N6?,hSL_;c|E n|fٗl5*hsڼ/Wv!* t1$!Юl`F,}xl g[%0B=uއ](tVp$+.>=8(*PTFѾW`y!cUKVn5}e~s@n^pz)EK>{3d2\>%2=g3?@UTNMV߽ Nm4(| b:U'H7ݭ$/mW|ǀ6>CQW{]37Ѿ!iWE=ijw6UkAĤ fi㕷|WNvPT0*P=|J#b I:.}k>E@Z0 ȩ %bZq 03$3bhjn-7[+Y~=SH$'uж3[WͺW sw$О(*=|A|#/k_[S_h>kN1_ߪW6*OrC<] ö]hф6>ye͎NߚhQ6T8&?۶>.ӑc }.,zj]/7G͸G\"KSdPY:jm@m8RuFc_㍁ Z"k0=r#J 8lVhdV~u li1*FbeuZ%AL1R_yւy-{"1 >J٢y`UEK%C}U{`sn=69l! &C "vޤ29x9B5CU Q(a4ث1.R!jK1T92"1+@sb~}S nAոKv%K>+Zt^%ݿsNas-g\5 er-W㞾qGkؿ`5Dd6]ɟqURN|]}E\ܚjvw\YbtPǘM{Aoj`}bSb̯!*/Hzpnd7",_u3Yok>LK4+Ѯ[ԡ9RiQ[)pھRK?C9uѫ/*DO>S8}np O>}|9 ~xo۽+_Q0Q-zA1|ަ{ʒ[oW}Īûcɩ[#=QQ,jN=zJ6(#&z  Pup;v9l EKpp% cT}8:QƟAR~:{Q-ZtR!dž>*F*-뼛,Fw 3^r;q\2]cI7Db(pO"5F?j}{_IS_d_m욎%s=<.:sp9+'y{Xclԧ ueXS[FEGצl|,42:q6pEܻ QD]d}}?W퐨dMZs mPTs?bC8M(oYk(cb39O~esR#DQ50vׅ7A cLcGc16ߕ,#8U;c4:T~*GP8(;x838kJgd4{h- qc}e' H&Hc,2|AWhBU4:BJ%>-;ˤ.ZgoEIsd#ǹ6}S?oIԶ!ɯo,PZq _tEH-"K)kblIb𹍫|;mZ[Y1rli@!:dy N5(}<%"&  '<yLlEW;|kj@zХcK[o*/!rlí.cWy^Jn8hNmpebE蓱C8 ^sPD E@QoBlXߨK"SJYC=LP48¡Է̶.;[[!r,<ηr,[.g!eumΧenQ;d]Sa-28d%,F[ IDATٮy( _m6ZRoa8TX߈ :oH `iC]׬?`˝  ֑bWeX ,[4 Zd 1m})Sq)bH{-(*kZh_ݫ'92AUSFc;T:"e>[l ! uwsv 6rj^E׈)nA==Ƕu?v'/鹊"{]&&Ul616Nf['5Ŕ Xyb{OvvXpr{ 6 F8|en'ZίCa&i긓%!?FLxg)U^Et8LExj~v ݇JP:2ϼs56\V^sOaFV/W]5˸^V.ʬ0;'&8pLeF)!eЗJmiY dXM)1ұw{sކ"gK9튎@ZJCH,"_xi SQ hZn|*&(FwN!L+5+e7( 8jBѐT'|'#[_G!m"_u{dPqز[[ [*~|VR =E6]dkEYL C<=}%Vk!B(5Pj?xAk(+7:9}y27Wh$ -}Z;R䖃 \Υ7?ckzѽ\c=̩!}rH'}gp͋\BVDLIh UXs|?` *`530,C8jlsKsSFvNpLYN^А` VڊqHg 1E{L4`GeUI8>Ue0ߴ8O9~HZ( (_H{\@eVXtU* /ClϪf%$+k-% iKH6n}7:Jk@#;gQ|r[Ee*=w)U %$+u*)+AQlgzK`!`$#]E+4,2P2hl%Y@mb\)k`x</r Ak*/&ߩV:|>_[䈫Pe+z>"Y'9l_!:]hYz~?-& E BmqWhk x"$A,pL UB~ m=ıqi|Q,79z[.(by@H]_XӑuI @9wȪL}=eP6c"_X%߿Q [Pd#+c~̱S>h4?OjUJeJ2eHwc"*|G_Za ݴd$ƭXLWr.:1sݿ}<]#h iї̢y6/hwe>zЎx{Z,:aUzPmtM 6oSJ_;8WdU"aNeӇG:" V]F7ڈH;CfcX2.{ymBpuc~ϰsߡ/мɲ@n1+#OZ ko 5f=I'1ծ]ʊo0Zy m =qnw Ur }:d-eyS|{/QDT!*5Q,G&z;jtibtGv@$&(1M: ir/wgVڻWVr572|Mx;uto>:@V44/sЏk WVEJK^/lK9B*gRޏù,kXXRWj}{ 뜷xhQMkTb+9;Zk0a ^R[C}Prs-KW5d.jL$Ztɱ%lizuIAm1#cDCAN~oƕɆ[e_f3-v;k=˳ g3Ƀx{񙹮S3_zOgg}J4U{ڶ}LǨH5I6igZߵc֌v#,1 2 E#8[4i$ѥ&mtS’5Trd dEN|U`.,MP!HR|mϕx8$i5-t3Asi7Zd!k' AeyYf:Wwx_uu`=領Gu]2Gw]g=b2 ,K}{|uk/|A.$}e:t^f qF{cG3ny_χl8c|kLmݦh ~eHAQ+>b[?ay/:^sn{s/2Dm&*,x]1wc< uw(_>[A7[gD@mZ'/}s׸gk&#g"ͨhG)%4[/GB0Ӛ/֡Tw ыR:{?:TTҝw ^Fcĉ[@δָYCmM-\҄V))es$6IZ8V<s7BCO,JG %lsH/P M|\B,OBȽK*Ww}DdB "{7</AG  _[njcǿ ;H9:/@s%p58Hb׺VXp3?Lh5u[+Yϑkϯf ̽h=?s\Sl̉T?qo8DFW :Hݖ2ZrXvc>J]ȕLltp]mwq'ñ.prXyCCNxk9J@ (z<ܢF}াA.y8|dC研иh+w6M~pWJ;wlԩ/@}}˗O]N]- qxy?!Xߥk'ܛ9*ЖT>_5T1>UH /&A6WA?y1^_n*[kk+F댱\< <{~7;;g}7_#MkǿOp4^Q6mJp~dIq.Um[؄rֵHkUC{Aȁ"Ľb j1iaE1>+<|}[j1 bMv  p}/~<,5?fNOo(x~s?|9u/41Efu`,( ǹqɛo]}ho*>2kա=:B +DXoفPZXs#u.|O#Hsaaڈ A'mM-{R<Jd Oa]m:i~JD}?3&X:fcY<6+h[LV5Jsͻ:hȧ#侞2r~:1> 6ϯjǘ*Юyb!@lr3廘I!p׬c]9\ewϐ8ĮAPk 58Zc¼|=乜Az9t0Ask~V"B;J$Ai>S`Ő51KT^,]c\6@e67Ƨ!*ѧ3k Oh `;:˗6wk|V-<ɱ.%TbW PuOy$r}|T>CA7\ܭ}e)Z<)9Ǵٵ DƇ J`? DZ1dkxӼf_C%$]B6N9Z @P10 Ljw%t!)< 7$ᄵV]ʟbx. 8+VKG(4߷q%q,[)JGe\_`A"\RZMN5i6  8<C'LY0e^!VDAnhW%0 my^^+|~Gr73\^r7'zv}BakΡy1qg)Ld}s+sL{4fϽ#5>7fM؂I H#Z8"5 +ab:EaZ#3W!sQ 16|1hbJց8dS8e\[MYUrϵVт{j[v[I < nL,$gcǶ^;u*DVܨ9Z^ 0/8`cCu?BA4AAԋ9?y&p/=?W~|g,BAiVZ  uni_ ܸhnlM?xF\|ow4kz`^44yy>CrJH4w/)H_I9d7kUҿu%\~K 7AlEpB0f'Q {R[ ߯Tߔ6@n:hw5k$ ;5bv3[EcvܿmtܱKG+-HP?A|];@/#ՓޣnH{MUHJ };ڊߡǁvm.Q_SF~i"AAiL $`|K+c# }1Iac7 v׎q ;>7J )B)^x+/GKHZ6O'|Mm>~_tV'8@[w) 8(e|$R2<bV"pa:dIZHELW ԡK\Nkci>cKl{gpmD$7.-Wy! h\E:Y5+}98gY.ABg[|dU4WH}oUP~͵^v $>oﱹc-6  ')LOb 3l\FԵxv꽇bp&c$  ^3͙k{=Β&&c ̵ט+y}o u~.ǹ ]wMyvl%UĖFX+Q5|HX|խU`bK2iT2O?SoW\Zk]:@0h:JaSB%dDݩc0Tp {JI~}E j㶶B_Θ" [<{}DDxXh wLz WY ipɡ6WS;6?Ǭ?m;T5 t Ap Y%0Hk  %{A|'',  s;$|HmIt=t4Gl?x ymܖيq:.c uHؽG3,kJ|+`XoOx\Φ{1Y%Sojn}k)cC[Xk \(v~kcJʛ__i( 2@ IDATMt,qr %sL:CU MD7WR;Xzdľ8N}7MaCI}tx#Ffuq}/Z"ȡj19V2mSR[EEM[w}ՖD)-qr鉈D6^Z b+IPXNAAd[1o<~2Hc^5AA"lIkևpp}0sn9> r]vi1:]?l&spzOϻq9xv|--Z+NEA ub3_m$V3iU҆G 9=7T|{"աZ=b*乘dAW' MBCšlj:?L_p˪w_) b+H L!0ņl8&)[%<WjT_|5]`()ω% TG=2  ڴ6H ƀ|)\}vkA&ٗW] \#܈~ v^||Jl ݃,k޾pQV\8$?7x ]6<OzCWTn[uH6Ѩɯ ܱ<1*Q` a%=i%ZnAVm)M*e֜$F'ﵡ\ْs1:<=W` L509;x/.9V kceZU+?wp\ =I ֶޖ8Updm~ՙg ub{^atk%=\YewFw h|A[  ;/s;c^w2pS?/|s lwZ7'ʔ|kz~yC_,84{6v='P1^{f#|耘xխMNov V!"F*D/˴ Is;*꺮%+cd*y1PgE9<{`JV{C˸?U˦j'-?v.w[pVA]lc]1) =&zG;K}-)WW6n뱖7Shd-D⭮gsaF*X:}{{ wqym mz1fG(AAuy=UD:}S5AA9Jr-C>0^ 8CD>;s>:97ߓu\~ yizzR0Qqp{-8{U++6CfKoL-+B_+,tko/%9jZB>WJ 3v0??0Ge9+)[5`6zCJm>)T#W<%'q$ܫk7y} 7I(-# 'R*±הLl5@V` [l!K)B{{Rי[rg~m\uRpicȑG'ֺ{ME_ӮAD>+O)O g~k(?A!h8K,ںJܷ07x)t?0>b&qK퉿sѳ|^K۽?^]o1($spC7DsO*lAz{ (/cڮ/ GN}rث6 IW0`q I&5sa3Di]Hx2iJ8[WniZ cmCC0S2ۭ7hr!Q;Bs)ZU0[-gc0YN7s"O#%сy9`K1R"uْ8qHMnsQAXo'Z{X)AڶNMR5_۠K]9r 5[3DPW뱖=v{r 4v>]Azbuu,![:–ߴs/^oPC o p z3xk{*v&:|̭xkϜ:g>*Yg9|^Lbm C\t.G]p,@AI9'. "` ,7kx{Lfk|kk_#=u959WVZ{E09 οyGou?rs\ N 'J|-ɡDBiPeK)6O'B-uKm88n_9T+g$č.M=g{l4D~ [q6jZx_w͎}|ZGy8ZkK;11n%9t|,Qƿy]{bcd  {ap8!ŐϤ(CA!i6nv nX<&߿\r.?wJl>j`k L·*ig7Ў AALfCd$;Y[w ӸHB.#fᜐ'ujewp/ΕCtr\:$\Hb;)oAfHMr%[Sr-صbstX;ttobbOɺHypU& -}v;R_]O"7 '~y[dKBzbۃT/KBWC){!ُ#_/J|IU@HAD{g'2 H 6 Hl:Y/-Y zso|QgIcbUJ}/ick<A`Rּ;£Lլ 4hd 8\<!nA 7;7x$I P\΃6[gwd4JY?Crz~J2NB^{J- Ǡ2ίBk;n]SKIA347H,Rs[&Il,l#.ۗ#^Y9Vjkӈ==AJh}ʏd  5wKS ~ ߎf/1K [kN%sa^4gw=#^8vذ9ѕĞ ,v%:H׳ Dx<'0Hpge sϘޜvu`cSPb۶ -݆Ӥ=dc7kN؍ g MH}ܥbe*+k"Q^?kE-ڟ-X#܁>t*Z~ghtճ^96-u@=-^WV~" 0u KEGoXȍQ4vM^܀H5Xd&蹊-L)&#$_}m]Y$g}{i7'aIʦzﯵ~` %I*2]j<wzy $AqPN\vNh P1 ߹ɍj7&^d#&  ?q.Nj; <*$Le630^<e^\bhls;v?P~/Wnwꪖ1IzxvXz{@KK}.z h~q('zs/wn"wML׶HfP .-9?286K b%D[X¥s,-" J"+Uyg]tDrk~ٚ27zV!|IC.ܞ#CڅP}%HAD}j&>Apc6;B ɃH\(90ÈxBL2lӶi<*O'='o6F@֢j[İoɸ:HiY;-}Ojf;sɺL ,!\yDIN9v'Vl {{9N1ߩמh|rO ?|`{ڂu{ "E" evTZV*Jg ߾[xo|F@GPO]cDP XT|*`)C31H{':<)XRk|R譒tP~49^ Gh}U 0IC^ڸy} 67W* -KQlDIN[ˏb x?|sɹ^\_Ǟ< (eRuFuD?8~)Y0 $ z1q :ּǙcn1,ؽ.}\.~|oAI9A~C<Mp' Zj3<-ѹ"th,)6ߥ7'Ќnuk}W?j|@ d peЂmݹ:/&BGD> bf@ 6i>~7]om+v/o]L;p~?:洀.孮A_p푭 DtZ2?}nI#wW?ׂAIp#o1$sᵵZ \ %%AD~U '?v=rhb.?z% ".O!>U'LԪ"g\<9@{pLW MGGCGBV}!O6d_ s6{]AL _8l7ήԀ3T@'AZAHumM֖( lk1N\lۂ|@\kk2vg|vMyG7%X^{'1:Nv(|IΫ{K/x+H/xr&/Cǣl6KyddՈ|AUʤ*g umYfl{nǦAu۫dA{>%8Կ/o8}ל& "1qPƷIٞg #G?GxGOAfBR>D3e%jԓoyAD{z:VwHznװM{L.N#  *@h[YWwP{o9>]S{q(fkwkO=h7?ok\D׋ x ܺ2OX,K*u 黵 EPHNöju3Y9Kiv u>]qW~UN#u꺟[[`n[5!ܺ6K%z|ސ)xѕx):N~H,C9Y>5lڞٍ !|s a.%Aoɋ\yF-u>=xRh:nmLBO)CZ8@i=\R|ڗoPG IDATOiwp)-$B][W\r1 }Mo_B]pyжD>j& b9Y+W7pOɆYR{bo:mkT 7˸s=v@̵Mfaf|bzz|2- ^x`綴S*qs:EܵvIԷ%r iڪꌹ\)kVlk[?_nεٮ',I:qib+7uVxf#Dm e>XV; Kb6YI-Ȑq 01}Iu<พtwGۏ`b׋ xC '.CFlOklBv-3KN|3[z߽IbrplVxv(rNSw!N(hFJT+߼^e~%C{T'cQwK k)@@^CpB(=jao@rm\^1 XfG]B׶koX>R<*}ߏKc-;֯x;Cz*At 7x&GryɄ.v 5X7 μaKxXK?#䕘#d2텯o?-;n.$rCBeM@Tm~s-M(ܢQN-Tp?D^L|%ߟR| zR o1Lڭ{=im+- "b;n<߼v9#z?)+O+cIk0?)#:Z yC2cr11ߪ4־P@* Icҳ^g:Ć::MB!Yw/qQ'$s19׎pw;לzdײ:b.%]-kte.BUWK%g։)qI1BJ{Xn?U샎OKr`gkiz-NG9eqH@gϞq|=~b j;31ԫD ǧkju 9>rmzG!3g\^=RpRI)KO|rnSC=l~y=q,xz}h._:Awxwg$qua0]dseJwwD5 J^ {Β{r}qerA[ ? ?&w^Tys^%l~Wl3k vp PBk&g[k:.$=(8t;ݙN_!׹-wKL`[kng$:wұ*䘯uv'UzHъ|֩CH|A Jlj]!ּNj5UkKTM&&V"9 *7ԫD5cvǔp-I{]?~+8~3 ½HȲK- e-gUG,ISbDh:5bVR MYS.{#5$zֶ1JNgk{ڪalpD:Wl?ƺTpV6t>+2׽| غ2 hRkUAlVp(V&lq}IXw2ߖ̫N=UЪG"9@låqebs5uc~m[h8% ^YK/=8$g$DOtswx~iLQ]/@%=@,AA˸<ߪۮqyxSUt=3̟ΔMz 5."[~TpR=sD!ɁQms=rn;Z{ElE.[4@$FGV-6NjӹMR*r>t浲a9{✜ bK=^aBE?K=D#'9Z&C \}mQ\Hy&!5A$5H1%Xx.S3Rd) %osQ}\o8tZ;Fr E bn+~gps|oNSh"H]j~C]{ osu_pn>x$}rVڕe{MߓDFUj!2fpݡ*_/R["(:eK^'6m19Z8% ݱ jg* Xg!ZyJ0t<]SG" a[0 U%bXyr|եI9MR~oE2nP7j1 1o=^AisSlm|1p\xg,#&O%EǾCH} !߾ۺxw8Pp+/<|Cc4fIe̝2I(@@Z7Yy.U[ؠ<94um ͔Q )kT Y+; ".p`j@W kjL ?Ѿj "&=ړ,nsD k#7_ݫ;ߵ{npNI<ٶOڂ,Xܓ6[3Q+udY? D ĈG%p6olh m-r5_&/ ,gs@8pp$U Xh%C h?+T)ܜ\Hát(Alcc-6W @V{~G<|scRo1bi'yZR=C}IW !=JPJ$M%oZd57eKLѥki\BrHkږS7P) Xߋ( s#*R[r\rfq Vgj5d.(07Joj<d8詭}TWKtv_D8eå#D~[yJ9bj›5{bJ[HRc 1+'|3o]c>ɰP  zz.<=d#k;!Se<|nN!kf%qLAXAuI[ǧ֫)_t4?+<ͰW6 =R5:`{.kQ"v _!\Bmv&oY[J > U?_lк~ID8o=snffݭ79\%s{ͭSnl1 ;,~/A+u%Zډ@526>00()%Yoeϊ5&C)t[ZL-z"Et㒤H~N#ev ./p?,|j'kqo0,-z&{AD~BR,R-8?y\YW8ʲ͵?<""8-$ k1|9640Nt/<_=޼giõ`bBtXLVuגU9,J6[qG& 5[vytJf9`bחbo:9Hw XWpr%?$J`{г>T.R%#N-`]]rKtҳ1u' .AA1f1~qNFK<{?v $sczgknB['q_޻5I$GJv:] GI,ۑ%W!0ol[nm<oZKB 5V^r٭%\$>Άk*AIfxV[ʿ+fON!jJFمxp,"!Z 1~k?zLշƱۛ!5]L^vKr4\pAlrwxJP"Y"l r}t ͉Sdn$@D |Of݋B\q Y  wK|I0<`?#}7G>NurA[ׄdPG AuKc>vZL"f-|M e;Uwk|O]"ݡJ[驹1zaXpq%Qz+2.-+$'k6MmYG5c8 elP'bbW5:n#%ԉk?js@KΨ>}HcMD.׀f}Vsc-03f %p_h> q!g]9$A%+ЅÕX7=o۟%yp_ J|޸XYWSfh|ȉy/AlF:~_׏su=Gx Ax7?I  (E{A!-[(s AQ( n~ᴧye.[CbzI6x : 9 rt19&[u4WCڵa:СxRi&Lrt^՚U._yխ#‰xhcgVWZ8`4ՠ\l\Ws I[-Խ-$: ;$St !D G[-%nK%1k>Ukvf>5 7{dD9fd%T8k隐lӟ5/[6}S+r]%ZZ[']s2l>D-Ae gx_AXDyop !)~:0 IDAT;cqH,{}-tsi^Uhe  ַ1cg<\ ym^"xIc 4ApK;Is'W$˶12N:VvBCAҩH]KՁ(9v5:up$Sz:s4 B]aCjyC1!v  [J#A3Ң@hVԎ9xϦu"[NOI|ݟmY% Di_9QT'%JVJl{elSz9ẅ́߭ۚ;>=u $ q/<٢_Oq("d  Kks)\,xvFR\ b[cb}1AqYW>\}0Bh{_&ܗ,}6D_AG}q$$6R`J 18e!octj'RyF]Un{iÁNzr< 槵MW)jCC21O$;\1璹|Z׵j%kr>Z+b OڶKyR=`Pq-VO/]8ްq!Yo i "]W ~J A$(KH@=s'K\%:ZVlK2p٣e+{Ab1A?gD8!PqQ5IОc'Di$ƜfzllS0*\RI* Ncr-Ɇ[Ye\tۘ1d/XI7" ?p5`<*\-Wf|h=ɶ%95C}zlhmc/kCy :*cv-' -0{ b57}L,)5AQ7O]#\{{ fLt1[>Ag.7p D׋ zXhN]W/'W@$Uc;5><<#IxV~;[ZQX^! WOa h[ 0u)%s~<:%yS_|?:۴u,{Jlۂc^b/l:Դ'q%T (؟&gZ|DuU|A$FJvhڸMmZ UmɷKYs_BָO Vx~ADضK `H9j('_!v*{ ADyo)\zRcR+ą[Y&]^#ɃqqmЗL.HiOpHmhֵp`:kO~[0jg,xR՝ZB;Y+iW["JacjʒnήD[W0QŸ '},9,k1ו3̾[Sfw7"-Xٓp̚bƷ=m 6[Ǵ,n~jVfOґ{89XAGТ qjnPHe$ϻڰ}>z}9iKQ`lp$џ*[= g 4}QXu0Zs) @K_rFo 1%Tu.W2 &604gBD~7FS[YfW5gjpkI=/p!Ձ0_V"݉ͱR]ZkV AĮJ-v`AD{Sih{]د rԮS{;pj.5< 2HiAv_@Xv[Tex.ny ۥ3W'nqz 3AHAýnr9˒V5:&k.B3 >ͮ ǒ3_: zvIIƄg3!ڙu Alv $zHP0"NRrS-` e[؍׽DS\r\J%뻇o1SBYI WugڬQk:/'Kok r[{shM7@V%}9Koh%R@KOix H|՝X̕С{/ŠZMacd||̓[?1cl=m(n/A<Ɔ- nu0T5"k;Rk.Y ~ulH?ctp1f/S3~oN]㵱A6{`RA 9s=NNJ_;|g51с~<  .R}txU:V]`g&% ѩ$ʽ"(b.3| ~\ڰ=ѹ]3vܡuNA-%`\tnxH;zIWE g=GN6}>n 2t.Ayӱµ:X^m1澃f]ḛc{ JS~|A=8n,Yfے kt% mI)ȻjͿ]ek/ܥ^Fe09qS uAwֿo߶| E_T3z97ޝk2>VrmB7AK?҇-!b{{krX"N9>wL<ǻo|)n;߮g85{brKec/bpD3d,sCa:|z*f,֬"jnB, xㆆ\ (Uٺ]`7]i@W̃a'[%ɶajܼ S JHN9_ EuF\0a?7 /T*w؊h3|o<SO+ԗ-:EZ`DW4@+w K9%/9vD( Yeܭn,ٶD1Ч"9%B{ݦH2˼#IgU+/}~qq%2vuu\uG{5q_]z(:A6^WC77lyz"~zcpN׶}ytq$AG 0.Rd#k86y!`!,x2'NH76ds^rN*'otst"l>ԣmHuT]TW(ڣc]U)՝Z% 3{88A . X5dCCI(*?jcCg-|T/ RLYypuM}c;8/fn:2t9 !9U@nbZ9#_'tp5 AW*ȟ._k 2 {s$վIR\fSR xяxNlI)RLD~+Ic?w s^!=!ύۡO'|5q*Cq~Vk"l9Op\OA8u q V"A B)kVSZrT.Dt)iDRbӶ w͉t=q-1k bhZ=[XӺjcہcCkHÝ|:9쩓EHGD߾9<-8 9Z ';nqQ$CF#i(J+Ip+%D7_# ֒8SO >In:^SN'u B:^y֕ҎT/3\2P6B!זhVJ(t=l湇C nUꁻt[ "R/!R=w-?|7arq_S>lk0by0p^Eb[-U}ʗ<=)BPE_`Q{==$uݒYC PhfGPAsb\DD;Qgc^ľӄ{pH0аMAo-]]wN~_+5\Y?X`xvh ~4cϫ=?Bq-jO ]-L !h$d(B^ER|p(i. h+A*5TaM6hZ{~Xl.}5W\rPkZWIJil{8=-UV*Hyxo.ksJj`Q9&M0*5?fJ&tWmՈ餴unrT9L.I"|;#Β$>k{{y᜖ b\f3[<A*]Dף tŶ fOp1x8!FCob# dѷ J:[:׵ H0Km]I_\J0?[eHbJT։5ݽ\Սx~WΛש:׎ աTۣޥ!Km6' _jSEY A}Zx-,iP+v$KtJ >v -ұ:s qhTpk=>%zZK56)vՅ3>it_>C}2^<.ecT@l?!R A˶䰛Q\C5:iBzE㠽u%#]yQut~eC9g\w['Bl>?{hīnҭjƷ[)A-sw6=~k71}{ {` F\YU{G?D9ϭ ކoozQ 1Ð ?!?U'~fh6Vq܋t \ch b5!AeCz)QRK0h (9:ul_㸞着X$sPҞ:Pk AN&ɁZA;ח_s ;4MRF}h 2g !ے 5(TBc4(Q{`K o,ů5߶A% [` ]ݓj}pW %8_F}c2K Awu[mнn}H+ 8K(Y; AB;EOd9ί[Q(Qq VF/WPtN_hOt@N~xZileuݟ1aC@`35Hy\ߙ[:lz:'z-CDjBWɄJc=Aή`RڵКvԈKS} :Zf8O}kk9{=GAD6=ϓG2QµN+}VeP'='JEuނC B rέ(Fru҅֕@B,| s^'_<`$+WR{r%VׇW^M;޲#9 kK 6}p˹bt/L޹f Io؂JZp 2qRD۰%yPVĖc>^ǀ}< WPv%h+RSPQWw俾 L7AZcu9kkZ9֔?VI"hh\gplWW_ڷqɆm ZM"NDz_LƪÿL$x=>зsk[J;.}Ҫ%YC*+O(9f A_#AӚɃ#syR)#n~,_:/ n&Kg K".Yjk:]թ}M;0,RG.jojU}A+T]SE=ەS$֞~ [q[YfU{>G͝۴@${4Q4V~ϡ5{ /-ĒfҠӥQGԷ>Ǚ>\^>( *%y= uy7Pd"El+y'۪VLz!g.85Au@5 ngʘcp DYxdltc3fq نeCklWM~KaHχGS '[߾8D= $_%}3A?DY \w!$2XJ]){Ji0x0NJOw֒PGfac`!Agu9k aVOy=·់.% So8D~ٴ^ K5'=H6R*վ+Ӟuhs2k#>J׸#$kv^{l6Y[ƨ T-Nhdmr_AtrLBAbə+ u^|> xoM6/'jk',oQopYiZc֓Cs/3 rE]KThaAmA5Vt@6e2*P֥f}>OmgiWD؊(V;j7:Fk <ݝ ^%qYM><[idBL˸t8Ag毹WzVP Bm]}yn|GJfS>t6 YwGVm۱芮h>b1\niKhT"][v %ȹ7毿w _ 5{^Lt|{7k GtGW8w !Mߞȱ+NT#\+ ż^wx_|,PCa?1Ukґr'j +"{)ǽdᦀ%5?[w߾]Y[=%?qjv9sBH4]^] r)u1u<ELU<& w0;ve6  +c A8\=pܽ:{wp G'3f|^A@H6 K]%¨I+jt:឴FYKw_k \7Qַ؁Vϫ{jMfY~œIk3tl ō]pNaHU9o Ƴ \ SaCk-]4rֵnR>&dc1W{N~_O 2ED3m#O`cj9\mקG}*ktn$tD >\yl?SupJ[]c56(O1,)~غ}%J9snڿk=n7"uYoG)A~0S9x1乁l;ߜ994fޕx94/=xN_R?:`!A2)"]kv"m+UHrx8-`Mw:k8vL"LˁO؞Uq ]̩bs&ó٢nN٘صބRB l\Nk?K*A?J ?p-}aKK.{-u^(k7Qr߫(M\I' h x"dX~5,HDW XOY;x ]4es=n_v7u7~Ν5-wR~¿J8! έ 39L4ZR 1p{hO%Wvь xi}Jɢ30~':oq&5 &Vm4תR:vu^'yΆ--[1i3bcя1NEf d=p9|iF Π_)ҡsS֒% "j7[%ПC p6H^[*^/T/kd= aW.NéRw`^-ٯ\e:t'dHu+x?c&mø"}{)ᔾH{Ҟ\l!gb6gXئ\(`=²?~jPnCDCD)>\A,8xʿ~5]wKrv6xz=F\n/pwh\ վӧhz\n?&;X@H0$HFyDZ4Vxtbaݡ'|cg#BZw: =N9md]8r8( 亝鎱]uk8:J#WJjk6.l']g e):TH?(M{@W s—|j) b OÎ9[m>7._'q`.[wmǕbKڮݞKkRA-㲖# WM؉ Z0 #|_Ͱ ;A|o}bgSv8%󛛧_hkrr۠I)s5Qhw Xf{wŏXwgrq~ E)\:m|>~,>Κ]` ڐBW}%-UFߣk#? $w:%Q0/r(>}b|k\?TBAmk+)ہ0&Һ^ak>TTK_p{5>/47%4Ecc6݆3V}%lɷKph_U?A:AwRS_lQ ;yO)8\sٳO[wVM53<#3LK؃hdjɑk=uU#o |5 ]J)ޕ8CwkNYqj.R;anbA,gc,JR В3.:GNS㫱&\[NN=t7w2Н_%ͫ΂$b]–"rs'z庐Yq$bT?H'HZ7PMuk?_odJr6B[.JkFgS,M mu7vCʀ.eī[r0&[gϼU>}[WmzGXf7ضH_K-vu>Ե94^mNA b[4޴4w.99Z oJ2YcbŘRPKrtw^\&w(>V~Xr(]ñ|~ozgy o*tK2ysoưp]x?K~=I|bKt!Jŏ8(#&{.AZ1Acxkd;;{o=58S9;zwLEHx3e? o?,/]!:ArM%fXá35KX Fz]t\p;U&+݁یʞ !8gf''tuVATϑlV0\Cr0IdnԑbuY!;}8 ij_%P[KR(i^82_6\z9Yr #Gηq\G'nb0Prދ#!x\w-/nU| Vyc GI"zܟcyNrEK2 p ؎kcs\7+J>V7t|wx}Ύy\oxp/'{\ܪ}k; u ;*%Dd1ueg v/E?G].<%'GJft q:'xRL앓&lGi {jIx[Z|W¦KwOSEp. K#kJ1>>Qp+`h%nki[j+Ζ59V8Q兰fwX@ :ib56Ԝ#XΟS()> 4 bE5Aa0nC|)WEKIV˚\/Mc8w-?õkؙnjŒzm0KnJ%sWt]hK[nB~eWJ$j؟cA_K] $r?u;P> vz:;y\m6nE G.Ϯ>Gߜ.B ^8PO K ||U`߇<+'GYs$ "?h{5z.ﴙE2l\z,}MEu = "q=9j\woz;Kn@> |ig4<- nAS8V)CFojupMSc' -_¶5GOBrAn¢)͞Sv;Kb!w{3W1ܨ&H/Wo/3.߇IF* ٫W5H'Ƃ/wso|j~n bMao=TsHr^7NW@bq0לL݇ʄĥR ]Î>v<7nKiwwZsڇ}ͥuXX?k96 eC+僱bYimyħ4sF915a/9l1/؁ 1K9{pfrG[›r~H{K+PAPA wu$\%טZZDp"Uviwu>!״;K>! B' Jl/<͡_w ,oWv!ELֶ֧6^z-m#6y!fC ^ s(1L $Z L߶&ySHL]'A~浦EJҸpњ HƱn-dk).mq= Ě1;8fբqH;/wruAvq,&:4'|]3 r.7WJv9k,GiM5Y+&$3'>_rL5)Y}ټq.m }5|vSu}{ޮxY~rl؇CS%2C?H.B;t?Ma\qyr\o .>>NS9CJtJaIԮ( ®!&a׬=/gk<0}Fs@/ӊ8~. 19>W&M>sً"K#(|nW l>Q)IGظk7 #pMЩz'6^͙>2V~u|v sOnސWtAs@)1ډk  {c?[J{9  ^y&o*q=X| %UtFi%c7bNYWSI5j6vsNwn}iSʥƶ >'2fd Ϲ: m6~OFS@ ܼg_Aq ;)G[Q~ȯ));Aཡ-S/v8:,)v(a)RIkm;)H8Q]#-tKIACK_9^HA\zܺo}_8VWps۞?Hl?[ًLO#AX6 ;41?s oDaԵRM$A%{bEԽj@UpM\pv6 r/H0a[;5֗{ ֨1\XM$h~FH C[5vEֹdbxȞ lrvW=H]m\p3;֒{Ð|f!fIR=OƬ^sx:8 m(1nvVSĉ]ZC=rrhPGI!AMLuvwL_f#y.!r*Ox$=@hX4vL:%bnv _g=Ǖ1gr}?a\x8K5I39Alo9y/w`~n3r2btWt[^flN|`gb:G8S: Z`Kckgj3ӡ뺐S Isx{z{t n8J<|?8t]қ-թC{ЧKگa'ܔ2H,/>!a AϥNtj \ IDAT>7ҼsC_^JvMm"iMr<^kVx~8~.2지PBzoeq NN\b{o[-GO)]Q=|gS KߓaǐﱇP:MpIb>B۲=G&AMD+ĞrqTqm|6~*[Do8'O't'Č arBZk+ ֖UI<Զ|/:Xo&źY9*ĺ֛Ϭ_[\6w'Bbv].٨{OQ#wrv6{k[\[ .Ӏ]縜ԥh㇚V8aGG7-41=Koi7qAg(9+4Ɨ%%6bI~/('IDǜ D|H/q!X Wѵny?mL0j/6c|tNkk"j+g?5]K~c r jE5l|>XMj2hX$#uC5Zn[a~#'jxaj|K~x 1tTFw~k 7ZߜkG},InG<*Xz-l}<D>~)>& NXߜCPN w!aQ)/,RR>5,G{?*|Iȡ":Qĭt[pq{#%d$J*X]š3-`5ImviֵL{oz;TzB.3֌gr'yEX=1/_ ùY刚d~ۺf8?5Au'abx rOva0?~ D}GN>^~&^#^zk$7j#5O/9^ -dDΘ\W Hnv6JY)s: Mn! +r!k>.>/\C5#q4H}@Aej ROB&YJ %)*t %tKR$,9<&X)y-P = GkSX.tdාMj́}H6q:862Zv.#)H)[{u9E$acyxŘJZzCA|"j\]g>Hi,Tu'zHJO=rHKH#k> 9(mͶ54r`V˵%Ge4N pV &Ev n;xrx:*OLuHZϾc1՚l>:3r/uu߷ 6"M/iSĊ]$VEwh*vSno|åO&s*s_p?dΞ{6d ]b A-\,8H>_sG >"rLO1EV'.Zr#̜+.V4lL@ʣ(HJ$:Q8kި11 "5t 3[\JnvybCnPWm@(fj62Csѯ&163_焺e G!yŵ5 Nkk?&h6>жvt``l*5'&S;mD+?;wditX?\BocϿ 7$t ;HpGq󔜯s.jz_BJn0"^$b&i1թZI{NŹSv{?%[oͭz)A,{44 Ƹp*L"k9I%Ȅ.=*v~ @[R oM"&t‰`YC\Ru:du˹ڷ :ßIɷtz@ ]Ɔ b^ ׍t;L%ݔ-z%Uj1Fˬ97'VhX4"Vs.F ɟ%XG8EYumb.=.Z q.^t[}~ooe wH{2 %!7w2!AԧS{>_z_nMD-$0,>Ϯ9]fÐtW|ߞ " ,5C1q1 &X$T'1$8gEt(E}1UD0MʅG=6wok:cCdv tV3֭uU*t78%ƆQHu۱˄nz(-*x|FA,KI }'~T_]K}=mE]>v;?wʭ\Mc|9 wgxq :bVKf<пG :d2q?Cyt`ȧ6ӭx 8ž^o'AmEt*䶚B~9ZP*H8컅d[R.X?I_Yj_5H{w.^i@:֙{$R& [ :f.#A-: l@!ǵoS[;Z 5;ijuVIZ;æN?SjZ[Оn!oREreU%=f'ΩIڧ<^Sd- hQ~PzbLqGcq tIc}%^QydI:gZkK-믹&y 굧^R븤R6yXhnjRT1V=&kbAS_/90&IKOsֹķɝg$]W |ǝ_s&ʡ"y1A\'&!%Ե 85\k[A;kcb\EZC2JB_NU8U[U-b I[鐜;^S!#=LJ&j X՟t ^8ѯ!/2Q[ ʰt(e<xьa`$T!u!Aԡ?r7Ng\W_*a0IS t_cĎ#S_Z_sr͂Aļ,UD:0yi#|r:(,N#p7t-}6^ QԠ_ELnbtm۽xqx;Dfֻt-|MjL[}B=A@׮^,sKEP3xJ9ĵky]6Θџ.#@exs5֟{X7nOȔ/x BOu-F%$D|Vi!fNKN$6@H+6#ӳ?EX^W3>pkꉘ*Sr% |#Msqi?1r`m,V>b>?PȤAT&8ZʃClj%$\s|b:AŚNԼFqֻ!ccw/ ~BYS>׺68? O bw|X$uKe"ϜC||!LĒFl$]b`,.?` ̀ aǜ\Ň%o| d jksıRl/I %p ,M0pKB{_g 7Tx9Jua>3 ;IΏ] 0~ZϩEhTDPfZ ,VhYނد;2W^ļz$V)Gnѷ^92RMnsڅuO) > ONu@S{Ng)2{ J8WK ;jaQ`Zw ױu^5A;~au#IژuH/!| Mqw=7~,KnZ'b#_'PoM /, lɡ!æ1w`.G b-պ]mY$ yf^(zIw !ecX j^P} zC+e 5N,Vym.yQ7$mHg/$ĺq]I/|&ԁ[eNoq8G+W:p]x%0o!X粣h4o?U m9Agsc;`LsʝRf.k{$Kɱ^ɀD(9H ]ccf:͝M?(~gbk% 0AH̥$5 BBcK,!mk;ԖlvA\Mҝ{Jd/){6y(~J8V5Gp,-]XG!vck>Ē 。sG o%:y.+V})$y&܌xU%]`L]1d/5x9K]2y̗1>"[H l@=I{ L %Fedm^%7q 5uC Ao b99f9tTg""L"%gSFk-bǎ% |a5[;|#5 t ˛t+r n'8Ri8$S2f!cSͱko<'}D51kMsDES{^{C',i%6ȝyWAAc D0p%ZNj 5{;6ڠK*XulTĎ%q١\X= := c{}>vwyM~\,M&#|fYLlD}ocwoEDLЁ0TwӔ0_[\%Xϔ'y/E׵exPέk.P]Jlc֒ׄpl)xWcn|_F#[k r.#=ʻϕ - //X! {VLJ:p 3 $ulVjdJN{L02- %1;|D`S#AHy ^ty.aX9t`Sf6LD%Xmy]J;_4ٲEEc{t8*Z,_1 rJ@l :@S.T! Vϔyg.&tI5b]ZO_o&t(lJIoagnT*\ѧk0l]V}?:+v33q#Jo︉VqM؟;n>ƍݚc&?%<'y71B[aE ]csrnk|gߊx!Ogm0? .};ۑ[N$rXFE.H3>4xxߡ:L5c'}l9; mg IDAT YSߒkbuӧu^3k-fP5A:{'%1NN}RiIA~1lۢGXUb ]+._$ 4 [ضJVrI;+H:-t3|RZX>1ih[P755DYٗZqnK> j?XO6)jH)^:(}#ڍ~N/dVoQ[1/MwEVWMF}T?]$} gx/pްNsg:=&ؖ5:枓\ I"w-Pf*.y /1c{{.y9?TQr ,6Zk[ʯBs' $ATB̵֖6h'qbmWmk"jv^pʎTMbi>|B\%f#'ct1Y{xM&d\Sšlޏ+'}zASh&AwCw[wD 鄂}߉5w2WA1Ucc塖"DK#ӒLe>_ w"ލ}/7(I+M2sM:;l'wދ|Sb~La@% G b?v -?V:T"cyX&0u ,bSߑAbh`RaIfGC(AI5s) d0$L}Bn!.L谵HAε܇9J&AU{Aro5 C)XaC:AlVjxҕ2k?rŐx]ᷣnY~Z;K61k"r)Wi mn<w>'Jx{arJY%9Q9$Z,a4dYT!_`-P†GIA:Ks b 34w+p- ͉=/pX^ML _WrSҡWSfQz% v}"sZN/|b8#9EHx ͙}sg)hϜ<ax?g]s:kǓ~Y6\ 8Vcn< fژrnݐ7[>߰:Bv svr\#LXF6}z͞bm}ge8!^ sZΈ${J4K).ʶxPS(ʫK_ICe{Vwi/X{1/tiXUe6,e,)0ƗRɑdO!Kݎs룄_!/Kx_a4cy|3 O%K<&toC׹.tpqxeOKʾW;ӱK {߂ GMXK'/&S^X;^ .3_/o]pc R6qKaO'jm/ArzMq^͓n/RIS6 Gk^&V&FxA9<3k5F2^wrAyo[<42k+c$}kJP}#-9~f8ZW>c^t=b7b~DWycmFU|_{*&K<4{k7ߥQxn"#k9.VtɄwjb-ŰRix7K|Cb[egwR6 U}W89؄v?dv{8Ā21}iԸSh4:#[cx.76_/y )8\Au%6 n@#1A>g%Ovʀ@^RLh%5焅^`f)4 ۜ9789@(=&$m(JDk_؁n Ɯn<uaR~kCwmX(YI1c<48[i7 Qu)?m[u %|'cAkq!/asi| l JlA4ZmN%ef<{Hq W#vo2IAX&H60pHCJ̍f3VZ*VtLӧN ˒p|Wmƈ}?Wn&y-՛KF(;{jI];tޭINGD`'i_y6j{ {=;y.b({ǀDM>jpL:7Pr54 vh2ژ~S.eTpzr^4^rNkqU\GT)gtls딶c9),ζ"搗u#x 4rE׾FCn]X m+ܵ . AlT<C&ҘX!yONȑ|_nMrx\A]"{|šbm9 JB N^']Ϧضƞm] 2;wPW1 ʱ{(5%1j0"z%7ǚ)4~C. l+ֱ%sCBK`=n({T]pNq}rtG铺m-H"\ s ܟ84oy\i_ 7Gפ@dv?УݭMTm>rciu3+͏7%xҸӣשŦH3jvK66&k?'ko1E<y ^_ Gڱ7g9s iҟ 8_C|L|85[r̭Wc-LasIWĖk.sL8ུ*],3cͱ'bgG48X 4!ԥ%tOsdҒisYF"XpxRE'dN{ ȴ&'-u('ҡTby&H-Kb0a^ byn[ҾT;oitpD~0\8pWwB ʧt 3p 0JХϭhI][_XB˟Op0{Hߒzh*-'̍AnL6V 4ASx*ٖ:8wϨuVi}pBׅL;cr dp{2sZQwsK@ANh oBطkq_ 1aN~9+}Gh@%McRL`q^X˵6);{7g0\ õfP+wЎdZI lwF4y?)Urڄ Ms$ 7wl h1 @>+K:芠ì&B߶]&p ZqkOc-1_g8oGGksIfC@K|PV'v?ANSo` Y1PߩS?&/dvnRv uS91n7CX9%9 %b+]GC~gmZޤ{#uc_jֱWCNo[oxI%d|j<)e%(fjCr>t"{x A3  ~ |X"='K| O^AıI6'&$Mu5k_ f.s bҚԞL6Ub9Z| 曯xwrb)|"x{l_ )9A#[ MB, I|q})w&JD!%gDɔ,}%9rc5|ŵUBhW*WV1vP_g y+pmxڄ-+O qO~c ]ۺZV^X#,eu7Ea6΃Cx>oQߕI܀y 5[[{΢&Oa l.m:UW^ۣ!B޿Լ/'; Β+>),4[ eD{(A8R0v ,[s-ط=&,"g t]s mŝ5Q: e W bNZ`JN&8aK^eycgV,8 AoxM۷%T)oNJHXhvXA}-6ӞSL%j 㓷!L>tz ;ϿrWꃽ+(Au8)BU"FRkɜ6PUjY#h p9͡NOuR})Jg:YAo[xJ]߰fpNo6M :yҐ>?9Fq+C%{\%E7g򟶫ch մGf kko:E8;~*:8fK:R gJLk!fz~0)\#fEir%] Z>_!5{Mp ]ErsG~>EKCc%/#^vߣ&  Mʘہ!$pZuK+`WGNKGi)o 4G*AsqTR Z^Կg5nnIjJ$-]^Gj\tIk| z<6'95况j/'MG 7B. ,بPB_Ȋ^> uq(L$h)?AǵEB33<R΁aG=#l 6_(떛*v&T]k^P+X55D,Cb={dW۔|_Aԃԁh\LBC,^΁PTU2Yϲ}ulpbD”):2AD),ڥR v_YS'BSj\3o?J4OyW*t٥ɸ5㺼; PQ}NF_~?E8xEϏp9TہrDq,gT2ncPf b{?J>C[&k/\cƦ<$ ehk <u#=u&{9P>ݓ @IZNX Kb pk =u`1A-Xs\M#ƃ EW6nT!''HU4k(v}>? iYnv3U'{v 6<3KOAtrv>H h-{(ȣrߚbk= o&bsݸ٣>#%5{vn&w?]!.K4acƹ$R"u+qu%bw zV*f%WQkB#dWT`j1o1_{hfX'`A )=?]`3g-[Ԕdib-4"lmz} ]wQt)s觝BNXⰛ/%zKgov">`ØDxA8Sn5J  zl ŸsZ<8Mixȓb0 BWb [`<<]F{&؞xi#$rr9 mIĢ H{l-љ!G4 $fҎ%۶B'8ҒWrp&Y51㰤8COBIDMaפ s߀niړtVɕl˥SK./=oIΖV BccVƵ?^GSd)A)]~7݁*4bϜ| ] Qp>[|xp hmN;GA)u'½u]0WO1l'AlSb>[R,?p':@C#3/Bo|Pl &l8t/P9#| >bɀn tU}58C5*`$C[kcpm ]A)E؁ -B87T=  ֐\BɃZI*c2o=2Z9o܇qF%(c)WL&^ϒc*mnA[.E|Q.tI~Kx]5~ x< ɳ^ 8uxd́\k;OA &(^Zװf)>6K5# ]86^Pʜ[+y0vmcW\b{Ҍǿ=g :{DN[/.y@DH' 3 ځdb^Y`@>V^؃@HDM9g\ng.O֜9筭qYЧ&?.լʢ-n~ݦ%K~gMogHIAz[q]*=*ߏO%j/2*F b||e1sd$-kK1#Xw}.i "EBZ{ϡd>Zp c+7ahUScsy$u)UlA[:{WskdUY[ -⇨hv5R~&5*յ*9u#R~<|< G|XS׸eU~bvUŘה\AQ| D}'#>H|ߖ .>Z9i7/|&BzpJ b:A~kM~¿(䠥Cϟø_ rqR - XP= =&Iv ro-w{J t3ܣvs$n,s|vi@v̦AĖ{lHlC:85WnWUµ@D]rfhi Flډzcm@~|ҎA$mX{}+~XFM} vi5_'pr-Ds IDATnby9ut⠔DDDܪ{u5ُ>[ rŘ9(+ #m=gY([A |l>9 9v^~S-7_j V^w=7[[M~8yS4^M˜(ε %og&imMYؚ+ǸpQg8T+x_ g?UYVl8~Am <߃Ay౦\8Xߓ_I| YSbcn KkɛJK '=A>[y5\G|69#> J67 v vNus#6y8ߊ8yธ=׶C{BxqKZk &{K ^gٛ;@/ %d~=t9WAlKKagj'0X[sexE5Vɠ)8bMWWoj\p  (?|zm^!W -Hv ,-R=Y%2Fu?gY;7P9}7F\yO| 6"5Os<7BS2B, =[޹WÇCC0`rtK§^Uq*(N!sDK%Kp AV* oŸPWBj`hOSlA/C-my r9S)4SZǖilq"k IkNAA?1]WAĺiX#}m-Q07&dKAxxt]?yoཻ3k6Z M\ALqZ{ʜKǭk?K@w;NjEq*|# biXj/IĶjB]%hkFd/&wuvpz) &.N9|.  5S}{q_Aai4巶7n >_ŽEϼ7s5DMO{k)=HD|}?[Է-{!ߌqP bx}^v_Dh>L>h$ d8EJ(.Ed'b:[;%Km#>PlIeэ׉O@N\&A ,R)g }Nc%lj%|1@gȒnگlnnء(ߠQ2  ݹ})c5WAļi yaDN=qԽ?N1wA(_ĮhGWO_~;H؆0yu}ZHIZp2U/ܪUtiuߐ|ZLi"ܡ ͱ[\^pzdE~FCGV -WJW ~7|eOnS1|!+J2l{ Jz#@畟M'~ݡn2c~ј.+ bylٕU'k -;e&et_3@kps]ĵM/XW2)+X72807u|B 22AT-;7G9h^J|M' u+M|w sETI^9D)Ik!6X/ypxa\dSΟ@F| Tb(A[ʡ ]AϫĮŸn1E|xڅ'I Qi63? + 0wxbnN@q\dA8wb{% $ r)Nv\!zK?/9kŽǴN3g?qƦh8> gj쿛@<}w?H<%ދO|C~s9~Q_ӹH0 x,)9WW()^ruw t)szk+8TA_n8C5 AZRcl+yK2 ~k @ <DU :6A\ߧ g`Ĵu b (FŰK̋UnJ1r6R돼 ᕯ%^#[AQl4G4`$bܦY[ͽFB%tyf֠6.du Zek̝H=BA7?A1&-Ym@5~'nJ3Ԝ#js5cc Dj[SҹSF\w\46<9-?  4 m#Nic c,٤uA]$:g} uOl_V:raiMU*k{=*69^K\!"C˹QRh,'Gސێ=58)ry|vG" I>4KNtP|ƖV% *D[5_U٭u ޫq8?y/(86ڒ6>g_uo*8ÃMx,2m&0uraI_  mxH!VMO 6탦p^ܿ{-q@g7|]{OaQka70IGEx61eGuK]ó#}G#\bIxHqu/`}$W/ bA׭T :0Tx"vlY鐠HhDO%n4.(=/9V<A-b+Q,e~XdsƤɼ'-ِ'b"Jx&PM=p]B>TAiEX" jx>ajop=[% XL,өst יʱg ƀ@ўB -ar!`b3)ݞp3|*sNG<p ˦U*o !Z!F. Bw$ s:^Oxi\=دtn:nP^sw;@G2xIaAm Q`Q*zr(;F]2fz¡eډc.p=T>ȩ$)ArZs㠽kX:>A[6yO"$V|{$lmq?@ ֠u*e|oBk+B.>I }ؑnґA?)sh}8E!9A![>l]{Kt]dbo2 M:B][qi8c\'L#Hs *]K9|CV~֓n1냴(+y?;*޽G=~N4ͥZbkIPPK1x2QY#(DgӣkDG ]!;ܡ yvg:Uk߾k:yej׮V\T@|M)SX Y!{}ߊvcЧ4&~;<䪷F|a`ϔɄiH!qD7kG,0غn@]qN'9>1_-ue8n-K^3&rS >HgȾ]MӰig Lf;bIe1KHۡv+ex^ '=Sƺul/Zi5b"$2saBhޟ,uRJҧH.L)co NT?7(w4=6x 6\m݉JIϓtV^a Vd ㎵SVs]V["Wmb|D\J1.e[V[> L! 4Umt @U[ݡeNi;|-Momeۃ+I9N}u@\U=L7١s:w YI9ׯoyl6-{fzŻ(j=lIe/O L=ǭq[}&#/߶cnˊ{!I!'@/& aU']63h\ۉ~G3WH#2aR:H|$=[FEy:zcSwc@4P,R;H͝򝈍PNpPSWcoRaWw?$3uӾbH#i/KT!&9})}c>>|y}n1QlbJ}`& oM4~-=2-94M.'9vMavRb1/\m^9TB{ոGXiOb7KIOp//鱞SD_Vs4Mi9I:o4 }Zɿm[|]iksY p#u,U(㣒~To)X']nh=c罪H7]\LD[ek9muc*לz^/(n/J咾EI7cuTijƩ6FU|>1UUKꃰNzm!& %LJ_kr\érvȼ76;-qpA)R晉}\1{U);*W;<4N3]o1'@J3ׅgF#9souAB-^徯km<^ccK}>Z1s$BTʀ`ݧ$]&@HLJzWjhWu{_-U{*7#G2r]]x0$VTgӮJ (] mB>Tc6^]n>WU~1pF;`,[ZO|wa8Vݲz)αI>bצDF~bz] _ (>+Ϳ+Iul7]m㧖%,O|X½7@uSwK:1Ѻk v!.;g'vrvwrsND֋ugjwMUp3\w0&S $TNU8C,L:|>*$}w?^w'Է}_YT#tˠ7J=cOEz]KۨY]f 5MckC&{-U$1qwWl[7Xs%SݴXw[#^%] [}"O-Q9uWmI΂8R: )f#1KJܒ:S*ڥ:%;u.hC|7<^ J_[Uϩ6qV]Gf3SXL-?ۜʐ:CXƧ֩kjo!Vҳ8YEk6,O"ǒ~N<&_ Lq&J_c܁peq.y R=~O%@[+>oiдަ>SltL$=p׷mz}:m }mO}~[+N: m@[؈{n~x˖?O ϭ{m ?M9v4-=w51jߧ~:F8K},/bOʌ)] >7Tvz,ͅS<'j/ 7yߊ% (0ʊ]|$vbސ,wނf ^.۸k%@l3X|n8!?eh[gH mMS< }}zô*>ϡ~"(<26&9,FdqIxMXj̺/8q4&r<Ϫh1IUxL?_іV)o@~df դV;ٮ»ļ9ksV4&Q3TJL,Ф*^sIz"1HM:ɧRˤ Wh,vbc=1&c{OBDcL'HiO@іG\#騧=tJ:8@zw~v k28vc*uI={jUJz%5}y|6NT1΃껨|,eZL$'?ځKݲ$4n,Hzea[e]!)cuRt?clb9SS҆&b mr.;,8 ot}@-&ۡXjglYuNIRn⦘oNYwjDhJi&SXSAn?^0Kr뜄?M~3'M GY<2c~ VAU ľGvdKhLM*wVo[G+Jz&EcKU Ceh'Ħ(SwzJ|CvR6@_EV#K0/T9qNk7±ޛK}4-9=O<Ęʶ|ĆX(I,=(TIɏM&uMbq1:XSVHңżʿtXᆘ͟*:C&^V,L`KmFہx#M*Y)<8T7i>n;y򠉴}7lCumfd;B-eQS蓭^^ﳎ wo YC7m\Ol<\q U)'ɗoL Iiu|V⬓7W) 012Ӯ\}W!ev\Sq&nI9kZK$PzҦNM}U-c-& wWiX<'oocOդrzYwh㳫^?I`Y(٦]=~r<P!f_=]O;l/zχ#]IzޏUƄG7s a]j>D)4``@`z5:ω;POp0<[oPUwNpWqoaLQy=[k;n_wo(xa]W)AUWWZrucځ7M$ZkUo~@A$0|mSZO IIw?a1'sIivSRΟo1O,tbfg](鰧a$` ׂ(uЍ!7M_En,~V,;;~oZXMPn`Ny9''}w >6Vyb9zQv^T'+Uߥ yrlʖ$}A$8 кXِAkM ty-*HmTN7O$_bm;%Htƞ{ Yw؂ sY 0lJ}.`,XI,کXJz6T!\&N;+鐪 olO X?_OwqgHmTA_NV a7];E|tբg`%1k*M'|0S|7M}(l;4<ڟ@ tⱼ9 @>Tpz<1D^7v?]4'kSߊL,va~PH$4!jv_RcoW>9f[\)_0ʠ|ޕYUQ*p*~.vF]ZoAF]L)i}cjgM)53  \ҟIz?}S{S'Um %N0x0eU?Vzso0zqLu&B١+m[@\ E ҧ@$Xue=c_u-q>.J'%$' Ŭw-[>(]0k9cwEW;E"ei.И+] WY{e%TZk&ϭ4ͶLwʱaIk1"V’I՝uYbj:E\6_9IEb$0/J:92Sm )?.:XaUy9%߸yޟx{=[9q,˸` }l"90u%ӶeCv Dvmk h>/ҚT;Tnt#nz"ܿtڙ 3Yrw]iwFy.$[T-Z -ΡUylS !$u3_`eoU\B$Ƀ*rec?h} و#;&LQ\ yz,SmG^yse?`y8Nsi=,ԡe&FMN_{lm'sй&fpu75%[#}ciSL㩃Mi9Lv`,uRN)a{o{ n۶OE WX0%ԁ$9I.3/uW.Ա۴]N'^)_I:' Mn ƃ굡xb}w{ nc?}%oh"&TϘM_.mNxLM+3#iIwmV&]&O{ՎSzo]:x `_vo+/Ԭ<5o:fGڟVc}E$ #OZ*h=j]vce5Ǵ<1ZeOkTX,_iѧ 褓,%z0X m槡&5+sʯgd-}`Xm:^u5+K?屣 V_.=L/Uk~@{='7Zt__ޕt=P6ݟLXQNӷ bMjVAmMowq@8-'Wl3.k<Ӌces7Iϕtdm6bm;:@diM^p祫~:ɞkEiq?>Tw~+AxcØJ얺k18.?y֊]DNWt~l.BzeFobG;Q~͕z] w^[/iQ5rc vm;3DIU~V+$y:fb$9}y;=Hk7ij0:{YoA9M,Os<:(C4k=vy߱[~yb}S8/5O~̛\ʬz$+#k$ie}~껮ՕI{ ~[9bWAI)҃2l|JVO+Mǔݘ&1tK^Sk$] rIgu;SZ7}ϹQIr'mC{?t_,~Ji[2 ed]r);FL1$)豲U>I[\1!q7Vՙn:$}86ydFKGԗ)&sEQ}U7K `N1N,vonIk%JXfiVG}<$#I!霶3` b+x }qL쪞8_29nr2CoUAJAqouu獞׎~,JcniI֘wDc7\GZYcn|gM7c./7U=efWK]^{4KL ,O ak=HsXThB0YE\͍og$Y5N&Fu0{t&wҲ: OJzOSk:a %OBk}[Ez\>e+<|,u1P $=%']+Dƪ7;z*h&{x_u+ush@k a6g*ncy 6&!ik"a.m"ilUlϘ%~Yҝ[X,W} _I^v>_ܔɄ2/}Д?gVF=ҹk+&5r:zv^tL3F`Am&89WD'&/v F!# T4'`{s<@*FP|UEu vWHzot@Z8e6fQĎj^2n.~^II$;%:mr `()нC0 Y$f|iPUDplu}|G@|yFbP f #{?5WLh iOq'ӧ_\8#syf=c3Yݧ3{ZqFם3:u䨞$Zoy>:{2{far>Sb y5$LB#*W_AhlUyG# pMb1w۶zh"UxWIa/1vhWmg*x4PS󒞴o,{_;lKcBJ ]Y[@n.b 6 i6c`!3߸G XՑ,~I􉱷N=mY+#cɕnD'xgƙ]l]j*\s{z\{i-^y$'I#7Ξdoyrr0ItСCX7:@87/|qoჇJztb )ؚK2ډԃ)ǙQ,ALk1&o?Ao tppϼxu5/K IDATdX+I~{KvfޚҗrHw)gީ#9/gO+wfn%:qB~c=kM<.C9_tޠ=b \c`D/y'Auc=^/b5L+6[|ߑm%\)6ͳShϗ I[Rgvwۏw!؊<.)go{ q0Xn~}rqŵv|_.?ZXcnwZeH{D'%Yo*hjҿ'N-_yk@)O/3Nn>;*]"Pvc؁ VEV&r,ކSӇ etὲDBc"aYE,Alc.GcnIh x]0V~\yj5FVXͤ;|xaO6?_&IfdrL:{F;zͧ'SٹtRV'J4:/t1ŤFc#gfL ]gn@RL _ 7C #E$ܩ1C*?j=|Xgӷ0}y`GߑsZO |^c"0Yʽ4@un~z!O]8*}0 u&p_}SxW1Tyl\ kkw]?vX_U#騤'Hڕ+C򧯝hmGnz,gió!kSq;:NW]hỦU }0v /EW񑩈ш/0<]γwO?p9>0#ލMO_<9]H(JzVt;Un2k$#cd'LyV:|fjgn>vi6J蜹pl:mC+钣VzӛSX2\C`Uq_T4%ͦc=' b#,}/tFiզw;R^)J~I?#%}L=$o3XB>viwf"WϭLϨ[{ھOG9=nw:{؊<.[ b{CL9k:޽ƞ'P&R.:ktw|bG>R' =qG}@ʂLVz ^oU??O^??3Q~m*۵6)UjIz6gTױ];4@W\nRk%=GҷKz_VIwW0=+I$]9t/t; ܴmvLs| ~;>dgqWNαN{.lH/ut1vLq{}cdlj#YתzAIz(NfKeYDhZ{w=׷޿wP\(U~aʬ2HzQtEڔ n?"H՞V+}{qcZ|ڬ9p4rPRwUUiuj8.y|YIo}ZFӶkݑc~I[$Oҧ$ݥuk]hۘYcmAm&Sycߙ^lŃ]9e<:T*+@,_2ݫ3uҭѮ]෿oJ/dNY;^yB|#m8N\<`t$֋ӥYYceM˝Mu51b!u5 TE]OC$P5ZZU^–vHDң%}%?(z:iL -*vܮLxRn4iVKb>[Jc,P{&;M` cfp>6Qsl%';ג~Z ZOR* L%ng>,V' ybOì>GbnQ]P}"jz 8%{(f&%7h?p-ǎ;]~Q)72uHzGn}:Xt [OKz S:b+3/: 64Abj:+Ӓ~]3%]Q#C8V54{H;6];Cq:Ϡ8 ?ƃBX(P7Pۥ4W/1#VH2=;h k}+O$]mv-lEߤKHwFOx~Oס9JҞNA:}?*쮆P 7dT-l{ϹV u㠔R{~x#68dOޥd7HW߽WIw<9VNMEۨ/60nſ5y1mzv@4O< C?&RJ\SU2XnIXbk-S֚Y}CgSJw]~Bo?~X}'-ihzvld&}҇Xg{Z#_[k6Eڞt:w`PdB`9UHʓwzlbB_j6j=p}FAa02{=>($tnkuxIWJ:!騤_A/}G]N+_n1_TO)PuQLpaSviԷux+0|t%& xr)~A2P_⋾N(馑_h=S꺓+N?zǹ\OVƘwV1ʭ12vn^OHz#Hl |:4flB`er ?3SA]N)u㠪挤OJ]I"'.t$=J$=Z5.t\:mmym16)6MjoO}m @9E8PZ{IPY{%ش 6vE~e~w]Uhڵ^zf^vtѓ/΍WݛuVI7[v>tV:wKݺɵ=_fv2IoA~:C 2'"08&.^>gnLm}t@5y4m˧Vgbr̓KJOfvnɂKzֻ >NItJlہi΂M"t{a+vҍU=x>cu6chq\ (=08(/rs=vY~q?#T9<ԵFƨUp'gfzӇ'r{V\G>;7I_hDXYk.]v)E&(J4<&(nQg86Z\IkZwR~[phNJzj=YK%=h$R͟_Gh(V(&Цd)`uWѯ'>L| Rvi#ݪ۟_u W0:4TL굺1Z`LZ:6")ܲ!6c2 >t-:|:sμ]X^'hVol7 躁Zo• 4v7呼A 8ܕՓݶ/ ~]҇$S}bj~nHL鱒tXet֓t;tp\3<2"wb_KgmB1zmfM"ݒN]: O4`Xں/WgYcr |Tl\TRsXHj s(!+RXcL7Cr~g,4(GU`*uv|B(n r [`6>PEuoܟ I*O$O%Ϳw;֓ǁkl!?9Gp|8KƟI15o%.ڝ0%*Lyl;@~n{ܭu1zպ?Gm*A2AX$.lb}O03c6T_XWOh:j7Hu&XNUࠫ #ǹD ;9ʟ`JqUj[)r|QI.}2]89q~vS[[PyP6T̹ jvJ:oLuqO~o߄v9%C;{JXucL;Wej֍HDe\ ckl=tc6!\=2!t{*>fVQ)wMoP dنm$>ZYI6PH]9U`,Ulq=|mzTlExS?`|uouUJ`W1`N;a3`9[,Ki"K[a+FS4s~y3/bDYJcF1~Sh+:0S&5p ݼ7-}eāsƒat2縃/`Im1Cp)tC7^7|=RuwKS<[;g;WV~Xe~KsSߊ~3@1mԱvBi?c(N @?zT"PM 2(kD~ X&W{|RMWnkP'i9*\ݾjgm#ꬩ@b|?3Ѵ"nڧ@&Ϸ;0KJa7B`9u)! H[Sv$7o=cţ{.tDѱ@(1L `2ufYɺUcDL9 jj@;tPqK6u'Aocv#5,M 0+.woywqFq(Mec0ϲ*+?ԝ̱apg{A]լ/F!# W`nefŔұRo佱\[mut_)_ L6^xع-s6`uTSяrnZN+ۉh:7wW 6MzmG5`(/l|=>g es)i2:cqVjB^mih>TCȪπژ@,NLڶQlI[džl<םhj\'}4)/[ɟgz2ifh0{ns O7WE{dfu>K{?gڟĘUeU-v.cCc\um"^mׂmpu>㹆(≶]hGurJb$UBbI|r'X`P`~z+X:6gS݅0֩U=Z|}O0d {(LRP7j1ݒ|RP}s'oO^X;%uw\GM[^[9t-2߅&K߱{ɑKp/[M˂żb!bƔNJ%+ɍޱv (L  A۱do/όn[\`,WՍMa|7X3XM t3cXNjZL^آ&m9_6]츛N+߯fLqW\luyb|Tb}1r8ړw0’71Q8 3A)/WxU;t[ہзk"6[{]yVByk 1+0s@X5eݼ螓lb75A׵9٭O!u1ȿ'ɘH#ͭ7|zdk%1xh 4ڈ'SNLjL 1XVD}Vs N>M ri(3w0.#~9GW7`b܉>؎hBf/6t.Y߹.2ƓHyS:>t&S3[4j*gB|رm[r/OȰϹ|[z;fb0;4.;|e\2QL*00)3+ي1)yEN6#lUtD)$mo` ,ǜv , \U7×>s@Пn> Mz[6wڵ}|FwjC[~϶Ij$Q{Gk`//B,ӫbM{O|P1o `YVʖCVۮ61\)Ph%ZwuXb${SrLIhM;u1X:#ԙļV4Mj ZWw}3mRݢ|1-رб&~O }Wwz708ymןub"|$o[FK*IL0=99DyJub0:6`nc6n=`.B[Sr|h im|%Řijgl57ߘ1ݒ8b%qc~yKAYӅHz9鈱cB`yMɿnwL3@Ot7`7aW-˗Gړ/XH@FVQIL Дf4CcA܉n[=MB|8شSX_lՎf`ݝнNs\ڽ6_lc 7ԾoI ; veZIm IDATϖ" Q 3idVԑT<4jy&6ZI'Nw *['V u/&9&I-eFwt[$,IqeB_:б0㾕LiD? MUsܩ_Xv;#p ]+r_+ً&Y-PNPy񜛻}AcVj(:VޑqXyJ+Lw%Sˋ:7p@2Ih"u7Lbt,̪ mU;^Sy|a\?PҿVmE[O^x꟬Ȼ~Q10Cl{ob_n3m#$m:͕y^7|F?/M|'}` 0rGO丩cQ7=Cki:6޿ [roJWK9$BYƽSc2 n `ʳW4;͖yi+.ľk{tXTZ L웙1R,/6`w*,*I]۵3y^N| p.m$Zgm037 P8$B+AfOghnwm@s- Ŕ^vҽt&U_4ǔx}'(#f[ۖG]R?Y'ؾFcۚk|gShR~sN')K\9cmB#+[眶Aԭ ΁{.:?hQOI|0s`)0#1Y2N_9soݶI9׷s8g@2;[.s}wp{y0ׅ250g2D?~qݯ򎄹y&P_Q.b:h='v 1 Ḓ.4N:EҗT,RvK 8Vv45be ˈ/H(Рfa7 :ֽ1O4v $.-nW퀷4"=Lu [>\?kkWeJx;F.6ge P]n[_L6Mz'To>JFڕ##im"$I87Ξ6&] XvcglI[۽R{UEYUX &Kt *:=Mִ4mڶڗmiqQPeFddx8qoddgydɳD"}8ů3>Z dkGrWbI$I$I$I6WEl˕vs<*ZuiyN<7M5ۦgMjơkrSU±Uh=NGڦTxbNiqRWrًUțU הAx9e,isTT'6}t?uʄɃ9.86$I$I$I$Mmr[vx<iX }nYESk{E̋~ޖ 궒_ u]چt趬.v&w!~yN%9_ۮ=CC Ò$I$I$I4~mI\aC?眉jLS58iu†6qFUp[;m4wl^$n ;VRuɒq}cAzm8X8$I$I$I$i3lbsW$6?a]ܭ$WQ57iL]!6 뵭ퟤ:&+o_CSwgݫG&}?]j?]xK=$V*2>i/Wr-vF&O[s1]$I$I$I6GSդ YzBV7D>cxc8;ģkx[tm,=Uq;0Ee,h|Gy\ER$f:y6T,K@ѫ-noRI|l8v>pP-I$I$I$I;MI w{y(WQnO7qZ W7p#m#>vzZtfvJJl)WDDpFŲ@ؓ.AzZc/I$I$I$I4ֵEz{u" ($1Ub1M"oy]SImd:%ͳ*' <\5},Z}K 1Ę?9^l{_ UI]Cc=$I$I$I$ibcVL(G(ĵ0HlRۖbL*뗚P8yna.WL I$I$I$Iߓ7}EwiwFU:IIo7fTB b5U-)cyƺ~a}V{h]$O*tRľ% M*&Qn/@'\ rVäzX}p|C$I$I$I4N&38tt{M?.$ i8E+E ƫwҥ=Md#IȤ '8mWJY O0Iܹ<[#.C%!@M?ZO$I$I$I$IS5{c6v(Wo2@ZcWӵwnubcNp59ns' \wYlae$I#8]EǟUqB18Dbi\uwyǟp??I.4V!QɄMWH:<$I$I$IP}rsS*8|waGi]>s҂13p %i&:>K?[ibS|oK#ɓ M'/s fhtI#PqΉTGCM7/CELbq~"I$I$I$I415qy:͓Ij=I 5A:wo{C:ǭO O)=&}HZs&J*v}k mv/Fi@;{|&/%=!3Lvۈy5 8 %I$I$I$IQL~)Y+dWl(ߣ_R_ņmfcdž>'p#-/{4p@\ײˮZ-Pu4ۆ@WJ<[rt۶|H wɂYĽt H !a> 5'3! I$I$I$IA]ؾKק\a0|A^; i,ONvlIk_m7P1kfi~yc꓊̿**֝k,3R?x ֘%'B\P1Pl޺AzX rU  IDATwu}"@$bVe3l66$ $I$I$I4F]*U/ D޸A1Xfw}2O4E4}*i*y0uzI+W`Bi/z>mU彰e ݓۥ,vw]ҿmL Twʲ/km߶mW5c񭘜^#wF^{YaȒM;3$I$I$I$I;|n@{3sn[m;5WE is-Cd yUځe*,pV?X}4&J*>]UMFF!F*ao Y`rx#B,t!pލ9)J"%I$I$I$i#|~wålayǽX_ˉ}><~,v1 pMYN|nb' VD's]1 21Néˏ?UoyBHOqa*)a/OnC'n1/I$I$I$I]+V\*cSZwry=NjE`]}.qIj>vЎ}1WgOdԙ DV=ppՕ0;bnn$1\gL$;wn a/B| 6oW I$I$I$I\Uw/Ndm mVʹUa^}m|?a{XcUxYtl$IP-/ڥmmc$ɫ fUw*~+}*us9Ixs:d!FݸQXK=$I$I$I$i;RC$Ҧ-8Y^e&V nԿMK?S@Z~-KUӭL?$mI*:PVRL$Gu*pu*pr?qwy!C!1<~\8vxO<Us°I ?$I$I$I$m{W9d(1=^Aix| 1}-{-{ŏUK챼m$ItVLii`l?T+&}<ڳs!^w}f [&, /oi?"x|% .a $I$I$I$iʓnSJɦ]wnzYuq1 -˒fk$K6~G < Y&OxY,OU=`'-=dRpC_r3/?¿$3o|>W;WL/|e\]+>/'{vKq_Prc_H$I$I$Ik>`qŸ.Мj"4L)͕lbМ}ci}+ 5~dG22Σ$IIJ7} 臁bGjYJV1Fn̋xc/O p$1L^{+!^Kĸ%$:;y܎!1^_|9||O q+9nGbx.ۯy ;N| ptR=q'%M'Q}N$I$I$I)Oj޸şaq(wUL|q>C<&c/ Gu;/1ɃvoQImlXq H?yUwc<.b~-c{"OW$q$zI$I$I$IwHz=ppn$U}?e².y܁kإ3+B}}X},>y0c@lݘuU\~( W\]EhY'3er!C`TD,q0U$&/oP>Ip;J~|μfms9x>?3x˳%+^ ;9d xم+ WaqwD/I$I$I$Iiw^\>XMr\ni?v&v{4%tH?V ,^ao=Oڋ m42!6~Vt²NPlX22y}pKǓqwGHMB={|MĘU R$vL<`+毻w4|{px1񞳸x_c,a$ɉ7xbL&[+ spOntXzǗ$I$I$I$Or\<x#:jIaQ\MϪ.kMIp0幛hyߑ9^}!k>jƪu}YC? Xm$IZР8Pj*29@9˕)~Hc(#I$Ϻ/]tT(5Lch[7Ytc}W=$!YY+.m4Bۆ@uزLyetq>{Dbb "_Hb M#$lO_ XG8w d_ ,`6v䑏y[ھKa|,]K©8%'Ié=9*n%sL-7BroyI$I$I$I\۪ETW*< x 19=`x$dAKH'g8=au;c51ڷb!&39=幥G9&Ly$IhvUN|b7$O]ɮ"P}p.n#NJ+^x X%"{1I$I$I$I,'o>&5}7Muu9 n^Eq_K"нk庱U4kп^N^TzdEDNC2+%O>P_Vx2ЁlCRKM0N?WRd1q7ξ>t.Ϭ`˝-vBksxLyI$I$I$Ix5%{Y/őWCE~Opj+o.}2+3,?TW<\\ \EuB`G9}&05lʺKC:c1e+yaqV]Lqq^if{ &=eK!¾u\}IFxT4*O#_M}xNVTra|[ s%/{*~ӸC$%[Cɩ/:o< x*^'$I$I$I4>]獔^ M}{q^2+w4};+sYB?,Yx{ߏOgWlٙܶfߩ iԴm1!~WYw,!e8sec-[ӓ[hyU4][[q~+ZVBX>h>1< } oI~xkGb lơSx^ Bӱ|̥q3۴M$I$I$Iy~ }w{A@p0+CwE YAVdC Vl̝<x9*#'4ON=). !oyB:Mmo$K>[Xoixפhҟ c^y`9I6Ώ?QɌ#)p $i$'ϴap@ۇN7Ng<97ɳwtIHI2I&Ug9&FI$I$I$IH$¦* ?u4|e\P|Ufnrgd  PIVɇ>y ;sɏU_̶`Vy0;ĩ*vIZiK$I$I$IƩK"]SCdIzȿH9S4)%N=֣w3)=IyŏUn%{<|3p>m1Jy ln}d =>yܥ+hN^HYou8,'a]%#oQ^\ҷ5gS~=?oC)s,cb\|oPۓ/ǗOnqo$i'!  6a´Wٞ| ? C7?4 ^G./: NsHT@Z+?`8$I$I$IS7נnoB x%p^u$z\Ov=&Gu^\%1&iė[Ȫg˯VĘQDGovӆ̓z~ҔiiX$%>*YUk?x5gdJGVFֻ*iSM*CxBM쫊mH1W5^cjMUZNt-I҆ ؚ>[ [8?l=?MVmLN_pO~ [kɮ x' KKɪQ=|I<ǯ}Y&^^zld _@'IksiiV>of -e4$iMNTxt7F~;up|A}M=Qk^_޸%I$I$I$isT]m,kӖ}V녘%YBL܀3&UN<^<  0Oo ɒL姀GT m c;>uUI77Uہ%u>xInVg~,*⾕,I1ශ a/Sܦw8^cq(㼦9ߋɃu%IQe/_ۉ6ǰ}o%Yz||b$WDu']aB$I$I$I4>Uso%͚WwfIbzd<~Rd^;ys?,1iҚmVmGnOڥ5O&P8]y/ ,~&]O_?&O&c YY_#\Wӿo>p1/'-i fM$iC ~vI[obr([6^!\en&J$Is IDAT$I$IuNxڤiZO? o8Xm|x^5p%Yծr8y+NNn]78AZb>;9i'n^VէI{%Wa_6_&Ko{~o*/w2y}ʃr8ށ}$In|o}47ܾ}>$I$I$I$I=(喝8Ī߯l'-=w;oadm"*'tB:?m)iT-.C|-YڋwP]$&B)o_O^Q*.74c?xU,ѯi9>EV)jM5[.5=&twqv}IV}=2/$0G &- c8] ҥ`S?2\u 8Z*1 }[jI?q+݇FWU=­c-,wNz` $m|Ah!J㘶|6v$I$I$I$I.Q:q)1a-Jz%} z_OգwU,}BK܋'h cKZn@6|I d'?EV8DVysm';M&+I0зtLbey~ L^~x." rŶjur3QBI6P}kjN=1^ߓ-$I$I$IYuM:dC81kIq}/ O^GWXX^7Q_yj9-19,Xzd"]Vu\4][Kvly8zy5}M8|pGoDY>$K[ws:2w$^T+8p@.%-/RvY}ٟ2@(I(vb?, iۘm[G)I$I$I$IRy'U S$I$I$I$iB;.I%]NҞo[yg',ǐtI̜eߗHC{$0DZ $i4'V rէɱ\m5m9֒$I$I$Iuߝ,=I"Zp$+bT=KO^c#״IU+.s嶯mVҖMWaUO '>5WU+ L"v0tiXG2[܁I&JtA Ԙ.F$qhaK`A$I$I$I$INU. 2UYTJ *pQzM^L[uTctN4,YqI1v.!pqkoϻϑUs=Y?Ju 7bm ^C6-c^_OqIqI/^hĤ@KpW{(n4}p]507K׏e몋8sۇ^$I$I$I$i6t_i v]TX]9cN(ꮉ+]Yu.8yi-%L+.#TIk/^Bu£-ʢwMct㺇nj%yжR vU/S`ŲtAr!1ts.Ws@/I$I$I$It~7qe$.U g(79Ouƶ.10}`<.ϳoLXw<ﳿ_ѕ핞11Eh<.I7~nz{SDa?9ڟ$xݺv_9Ӊ +'/g_N|XՎ->.ļ*26}0-rMJVXS m?o;>4F/b9uY7oC9jM}P>aƎZ5;GqzEҸ4*=p{:= _u[Ɩ+:~%I$I$I$II;ʿWF2;)XL38V,o(ݘ{Onf=AZisvj.Weik9=?l{ƎUrW|N]kS]2`i./ۢ{IӋzo٦i$I#Օm^`|۲[Lcj\Axp/I$I$I$IiWP7WD4lUq[:fUs}X::ryAmpK yTFr޿I_oMŪS<.T$I$I$I$I8 .9նuC;^W1t|^:NZ簄3vlod)mH0p*dU\HYN0mރy0b۱M$I$I$ISX5 In4Ȅ)%I$I$I$IF($=WUMIi4% G`kAc>sUM$l(I]Ou KUU=kJ 2 {TWu,ǀ ҶKBo$I$I$I$IM9$IhۛYާڿIÔR?=y=zid 'mi.]td V{ٷO'P_$I$I$I$5s!oIM=ozmb87Pyc,IAXSaAAՠ#x1@إ)ؘ/ۧK$I$I$I$I$iHV%sq{&N >SU"BiYH0mmǀC->]$I$I$I$I$ICSUD&6`<7yK tf7e(&uELgJ ki,`%I$I$I$I$I4P(λMqnm\hۡؐ5ci A=Y20XJ:})7l3;߷ {K$I$I$I$I$i \U}IL}UH'..WK^AN\251-q/Wkz-M}$I$I$I$I$IDU2Zy=.΅]me^s¥i mWqyT!vUA}BsM"%I$I$I$I$I+&-pIqng+[8&I#,iABXŞ.`vI ݫq,~8$I$I$I$I$Iy[T`.|^=t0?TPǁ/I]R]ړe'u].V|c2K#Չݿ%I$I$I$I$IJuIj/ǀCe r$pIk0z*Kǎ˯eplg;[\{s*&J$I$I$I$I$i>\Wq`sM"\6!AԔ4ԁۮbWCTW,[nI$I$I$I$I$ Lq+^e-!ifIjj+$0B``-q@7VUK@|lņrVy I$I$I$I$IeVf˓\MvF Ċʃ8D@M~nۚ6:/ز$I$I$I$I$IZ|.sW 9oIn\6Bi@6qL1Y!Ӓ$I$I$I$I$Ie( ˶7I#fBI}pş&\u4'CM<i:}48q>$I$I$I$I$I|m}˔oK[yВFBI}q먜0٭O5A9u1$I$I$I$I$I??]?I5%M3xXU#ʏsO%ے$I$I$I$I$I^q|c-il$i+"Y5P1 N̄X,et1nWq%i}ߖ$I$I$I$I$IҚdΡ:0pďY:$$u(Ҡj ~ui㩤-ے$I$I$I$I$I0z;[0ۆ@RBqY|+s/uWW:$I$I$I$I$I]MI],$uW`2a"Y^ctg>:N*- .I$I$I$I$I*1y]l|4Y Me'Ɩ&s7A1tK4$I$I$I$I$IZ x{ӜUyIa9a*lI .K;QLVJ9xEv%p*bӠͶn>?v@ƶKbfx%I$I$I$I$I4d|q!WKqж$pIPUoUWr}$g.V l(I$I$I$I$I$ Gk:oUef-&N:^&%HfÆRN:~f{76ϥW5ty:ǀ3zO$I$I$I$I$IC=3v[L1pI stnRUl.c-jf$I$I$I$I$I|ss9910.TVts;fa^EҲW$I$I$I$I$I4y: lEl1b iLH4 *lE UIc$r&bJ$I$I$I$I$i"9dsBsX,%;!K"m*b#iC c%)^48 =$8*bj$I$I$I$I$Ia96m)ƞ% -K8x%/&juc`YJ*$I$I$I$I$IҪTUlJT[v81?h'p~$u60Xv2\ ~+-,$I$I$I$I$I4pFezMO]3q̜,I[:y 16ܪuAUx$Ą1Γ#}Gc#1sΓIs]۾$I$I$I$I$IV(WO\[\M/KݜcI$5%jjh a7Q"[ 'IG?NUq&IyǭAI$I$I$I$I$ ANjhW[Y:uM $I9K4xhbEUr ˠwMmDɫ30ͻzM\Grݜa&J$I$I$I$I$iyu „Po+ @(im%@RA]S5U "Vh3j1Eq(A^-".!{I!{!+&Cqq<&bdw3y%I$I$I$I$IJyPssyq˝ ;#]Iar9b%ڮXQNj4pqzu^ 6pzU\yK۶%m+L*μc$!p#;o8_}+8glBC$I$I$I$I$IES!Y:a k:ضN;&?;waaF <E 6a2:ȀF`/f9ABΉ!sl &6$%,% iFۿqo[nUu^9O/׿_ݺO!p6s^ePJUrz^2}^[R%Μ9Ͽ^2K>U|_Hu$)$70XX1_ms5J\^m9_3<ت$ڎs!@"wm*S9 IDATlLm_~ۺTJku]#Ϣ0)l!wQ\j[=|#2+J~*lwhH0x`̆[^7WRJUR5O|rnهYJr-ε{%gNx%s-O`Zw?k|`zjי Z7LŹX$ؖ1Qaqf'@opWx\:Ws>A,b Tܖ?4*ʬ\MU~-?Ύwuu,Kh"*El?wvIƙ[u^xN瞽fXu AI7#,mhkv{?;JZyYU)fJ]a<o>}_:g*G察..`t u ئjKJޘ?'Hеxnk@c[Z`@xIȔRn<|pyUR#(珵*ûߙCB1=)YžOƝ]^.R@4§$g$>oV|$Kc*)g)TywcsΞvW%i̯\Ml~2+ ?ߞRU-;K9{]p ۊtL"sˈ׼M<6csvk{cIK_dvՒ*e6KyXNnmޞ/{-yWYIf嶤<)W\lG>w0a|.7׮Z)xd厳#ӝC\lG:t>};$7:eY?XR7Ru#嗞q{~cwռt;WS+<;dj1*[C/<>9+l>7նFj\y\U?Xf?dnv]Hsp_Uո,Xb?7`t`BRR2[^/v'>v5*)E컫-ߕRNJNDzB0i>cTN[^"vh7Yx8G_t]p]X $Q<!T_@Հ@`wXygvg%9+$<ׁ0~~oљp#aIz,u6l48.s'N۲|D]:nB$˿<xX%z$VlzץKXA`RN_SUTU߯J?'/2?Aw;Kf9mU= 塱U!汊bBƩNk[.qg /h;sڸ'`~K.o`V&z)8]e,"q;&Ǧ-wZu.oph}8_6(w.9.sW' 'm?{H5C1 6oKWo[>#⺾16 n>gm[NYKay| +X1{EPe$qTuC8zUZ>`Է1sp$/kFy_ݲN4nO58iM^u_K^T53n=6vǬxk{zTe6cy!9j{_z6/9c }9Ւжͯzt/7jpukdºjdkWun}0߯:>88>!K};_{2:]6/ΠPc~]<ˋ> y5cSFpg1^OZ=̣hH;4Gט?(dാfoYs_C5?[n{O)\dV/f^q9YޔbB8z~ɁM{'eEj=ίKѧng-Ҧ9oOr[o("8,rd/[Gj5翞G6*r en4]C%e],Ѳu:F%ಬ: p~#smgЖ>|z8b~MՋ򺺳Uݷ&nnj*Xycu+ka5-#U,9eFЖ |~cn/b,_IrpNoT]Yʀ5۴obĮlI}I{_7x^y.H5dinS~3)AOfQWW;]`YxzRN`Np,hncS` (6r4#vsl䥙|p)(vuZ:XlH77١o:/ Uۋ z[<"3?{H{ܙm{^e ]%\sM3iޞY׫SH85nMk,?=$w]aD%FU0jV=5l3N]^_9S@雋OiϑF׷˓# y" g[ai fX4dP\Ǫv99pl1~/r1Gz[y?Qݷ21NL(=׻ ucYm~]}9WcdܖK]ύ^NϬ\. h]|mz]_<;:MUY9e125 榤S[d[mGsKdf +f,R\!FV=vcˮ^͖o{^!O}Ξ̎f2벿8]ŌX5@o1OV3<>]Gݐo1WE~sN[n9If>7O{#y\ i UQ 8EWz! lxp|]Z.q9X0ln p˼cD`Vfjβt>0Jڻ%2Ն%(\xp.o]Ń'KtSW~)KM`;wV;\9Ԁn[ƪU#9乧y i:^5,=&\=Jw䥵,n5Q@lR:y{{rx^ x#Êo<Ū6G\ӦҘmhK̉V`T#cyP:i6Ւ)"-pn<{۫7hc^?p : 2ڂ&tdXl6wݞgmi;U_mxB`Ƽ%k;c,MG` 7lwp]y{ʊz=.9E6cY˹xmcjc0MYpLp|y讣ueɚlk_pv6UKC\ՀΥcmL [Ujyo p9I `+c`i<$'ۋu$'[X7ZFB`ot ݮ&-c t 1vw)#p'o]Ւqk~š;$`=X_pVò'$сn}Z?p1ɹlW]8 m% , X<:9_i`C`b~v)Cq ._LWn_. ![  -i ~m\Uo^/bxŲ p c|iZM&4Ulgȋ8K浠8(*Utuc5"xlH>tNm=~*Sm]1K=,-XפLt|Tj}`u7SϽiYq 9ҿ=#w6>,XHxM7,̝:7v,|ab-$`K<[mq{xea=襀؆Ҹ de]˕u5jz]W?{yuhY[R@l V-F_r=Oڞr0=[q[ kT_ۼPP@l .+*g皪#ܵfc[70Yk`u͜*INLސFmSuin@+xCy{UMlMKDZg[= s\l,ӁyiAW}܂iXMjySs&@AǼ%8̒`d_E}N8 Z [7~:Uuj Z; B`a:n_[vW/DF^}I-봸H+A hP:?@iXi~Xk]U:[*b:ǧ6^#.).ısJ:Noټl7oן;=hQplsߓmymY#p),y%cw]αWϭ/\̿|iw$-OiY.<'wM'm],9'i)-`T=Vj\o̗k-KHB`aL0zXP n>mg^iC%VҼ] <~Au sn1rplm7k,V=X9XB.-ch.MʼxS|oK{>K>O5͓|^ ;W):2=}Fag 7+"E?ߋ+pO2_r~9ygYQU@/^Y&rV3SlIx%0_Nsf`+3'w`瑲$)F0Vߺpvך8UcYˢ9}w}0׷F@+mAՒ xBtlvʂc޼CŹY~.pB`Fiܞ/ FYt9:fࢶAvz6gO,@'q`[璲$d/;cHmT-svsʖףՊ)Wm?zwj{KNo;ǜUk䮘`bոn X1~ZЮm[CǨJrO9ːVu<k[j,VQVC*/ t!WeXf _7p$m) IDATyr%$YNs?7v[[`66΍G{-`Vw uTXZ֋9'\Ky{_m[C!-jS $Ir^Utv|=k} 2 K˱!$ϫ><SLx1'= ¬eؾFl|s:'%}\-9vZ?'#W2O{IV0Y-Mt^:r(%;U-@k;ֺf[e_v ?,%/zUϿHz~riy|H^.KۘvH ֆ}w !Lv/y|ŇwV2+%3[%OwKW0צ& .cVܷ:.3brDtvI]Y8l}'YJxV-"Y:>,FYW)_^~vi+k!&,' k%CCP@8c,=J $lʅmŏ_>ns_>k_إmoc5>(e54vE~A}u[]ƺ ɃWLI=?=Wה%ۭ=Xi?ڗ䴈;;{aXҲMf!XY]|2o\e49綵{FZ10S@pJ=֕. .o+z~6V:,˃WDSlS3}UՒcKgr<9籮Ckg|d|VEp1'@8ck =mdʝI99OY<`sIi x*+'y|5olZ 4Xe|.V&:E>pW^swM[a;NV-SРyUj󻾑1 tN4=ulŃՀڶfm(V>co2H@XEjk<`muSlPƗL`sUWtRl3pYxTI&s_WY(_e1?6v߫:?;W|BX\RZUC]S^lY֙YK\1M Q<4ՃrЮZ2$?_p5ccl5yq.2";7¿|\U栌GZ ۂ-p ]6~^^1؋(pqj{\V>e?E gRtCo~ۨ b zUH8@ 8|e.{x'^Vܷ͢¯tH]/@JG oC͐}% ,"_!)U$̣åm,/`bYI}v$_aZ$yNN-9I^ӎ7G={q=Xyg@Oi!S!YP9k R$7Ԟo(1U;sZ,(|VYݑî w9mԮ~A! )PocI>6+G( v,YO3ii,maIłƴ02'Ił6:YI1#Or{ye~6k I!/@:YtjI~/-OIo&aڊl>/$$` q`TI0 LdsǖOn~_^5f/xBe`yG`T|O@Q pٔ٘&￞W^/{}G^.P@Z3kk+}Y\CikRp,iI^Kƽ 1.Ir{=ȓz) v,,rq@;eo`} U#_I%ypG)p6|inCˮ.U`~|K_tr Ö?4\bm{7&-7w=vJr喜>I~Q@:Z1C=0qwoi;Kɦtd0E͢{jk~wXwUHX%y I$E阓1U1#gR<z4) `Y03/[ɮ&Ô@J9ֿ?|Q\sIM{I~?sݻT#[}E@+SRu$Z` LY佷OL$ԲG.\;[M+՝I>)ɧ$yj&yD?JI~"'?M>sI~%yY۶ ?$X8'ޕ}Ioɘܗw{y {678EDmm:=6ɻ| ?Ǵܕ䛒<8'(0Y紿irZWj<>`d>jc֜&ݵm$-=$WͻM+ŧ&$} |ͳ&w9`^9ӫNoZOoڱ)[\) +HdsK<0Q(ztO3IϝpW$$wǓS|rM8|U6ߏiB)juêg*?I-{~ɑ|`+q0R{C裀U<5k١&{$䛷'RS ;^նWw:z`X,Fй0K2sT<PdSDPI)fGwL/$8M;+)u ZD6mG~&oq(z) d6o-[ <!SB'<`فfw!%w۽䫓y_jm_eǿ!;h7/[zįk*XJ!`V=羂"F&L. ӓ4e$yD/2nS<uq˜oҷU4T_%rk pB`,m{-.\Y[> ^e-yZ>ZL7l=G ~v+{q-/I~v})-\\l~sl9sLB`f-d1=wal}{xIŝwf؊O8s7?챟vj؇jkKL<։`U@-9-"MݖM7ldpԻs?(Ex> Ksլ^xKx>珏=@ CkmW99 $SL> 3lqp-WӞg,$lއ;Ʒw/IMt"R@:lYu7Lpy@Im}GeIx?g`cn,ȣ.-i{rrj2s bΧE` C~"aI}HB&>4ɇqwrت?J;&1 {Lv-{HC$o:{%[XWu^ Cl`L7P@@3<ʴy:}Ii`'\̝n+$?gHՋޞOU 1ٻ"H!p@ `ywK;4[@lkI>˴;h׾u@5ɯ`&* T?$oNt }0'SWjYA`1bW}ߊ!` )$`v&m/{͓wI޳$50H_oӦJ$wb1Neܦ;@!pt,Z1Ez[حS $ߺ>M=+Z|?~:mq{?`]ͼ'0pqL.be[:\W@R5YحS 'Ieo_]YşK5_.S;-I^RzGz^綠Sr/_k@/>E8ةݎ3L:RoL$`9ɣM?l=仓)['Ŗ$i`5]u%9ӥUۗK?RmߡrzR%5ֿ_s;h 1|HN$L 5?MS7]r rº#s{Жr||ݟnHN KÖ/H5_-=* w%.~ݗ ߶3\":y 3S,x)oj`-zcvI/)9 m^ޒ{{Um8B]H&^P@Ri >N&SI$$c)h$k;;=1[4L<us"jR%}:( -Xb1A&cNaTIc 9-$h늩Ϋ ޟbQa_i5Y$B!06L:QoIro`dNs+Y3%͖߸q-?k>jU1~=c P&`*)9˫rP)9-,]+V-4KI B53=5$I$Ijwwk[x[C7iT |$UG"-E27( } $I$Iʪl0nqsT~ iҿg4;Yੑ$I$I$P3],n:W|k=yL6xH( %"$%qG7luH,8Q$I$IFqK7F!Fz$zǷP$I$IT'5>Ul6uۗ]]gwJ5ԕƑvKw~$I$I4Qtp{8.bf{'}^ %I$I$IZ}m\.ɌipXy뼳8zPҨvmI[;p%I$I -8`eS(8}~?_$I$I$I*5w32_ϯM^Ҵ rXbQ&.ZoQ$I$Iǰ ΈؿF9X/p!߼"I$I$IRLίnuk7yw:'-XGR_, 4$tne}hcBI$I$UKhA X" -x$I$I$IuZ]VAS͟q=JuWeEv J$I$ B ?xnc"I$I$IRLuԩSG2-M9oySḾ]R %:)[25ꒄM$I$IT!QvokGG+ >x;X@(I$I$IRfS/:kwwj$%FfV>v*lu9I$I$B B'bIkc0"I$I$IRs? M(WI׷KBIL@)YH&| I$IUm %.kf nځpJ$I$ITCt/{wk3n/ErEANӊ+%ERQ&0eMNz{~T$I$IRڽU[?>9lBI$I$IRUfݴ|W}IErEv{P0uj.Q֫`K$I$IjT..WӞ&t IDATcCRCt$I$I$NDuʾܙ~^-\e), 4&pg}. $I$I*?oQ =eZz=F$I$I$:h3n+e׳wd#%F-Ȕ9Q. $I$IyDoK^iM=XC a- $I$I$Qt2 .t9%ŰP8$mE# $I$IBG_ik{R-i$I$I$D b^͛~۹iJv;a_,$$I$IRB-G~MmGiZȟ:@(I$I$I6]3]ҋܤ)Z >vIC`2$6%5!f-M#/-O$I$I*(*YBX xI$I$Iʨۺp4SҹIMΡk%BIeIpZԼ!$vH~G I$I$B"ƾWy.ہP$I$I5e?}-ibBI, TK&$9Ea^xI$I$Uո:8vO_m#9{-I$I$ZH!Ԓ z +cG$I$I$JJ#oIRX@(ibZgwk$I$IRB-.xb iv $I$I$)&~=8lD۹u8wc׸KdQ'e֐J$I$IU7g ;xR <#p좂%v`-O$I$I$&y]tJ,O?ԵWւOiokw`HI, 4 SIL;3/$I$IRՕa8:bH U 8})S)I$I$I٬^pVuKs0yEvc[tT@AeF J$IFo#h`gۆ'@~_f䮃צ5.|M3 xxqK`^M}>7;wܭ̶tհBf|PK/}7p^8[;u\)`4|H=.}^>f=`4Tbmn[&{;~Wg>#}/n{[Jd&u]:Ͻ~jV]㙺C+I$I}ۜꮏN|Cg/{lu[ 36 %Z{Ú L|&xP$IFmW G,v\ϱӭw,8x6pᯍ^\ډ_A|e$ń?΢(  p)-ുbal0 3}Zl6Fc-E![t9:|qj[2.&7קI/<'=ʣs`'xm:w.J >d}KoSSc|~N]ٙSޖ>/J_;dg'I$6aig=[_Ar/rVȽnc$I*4_od{?$I"giaJAS%: `sU~ Lջΰ^bcGwtܲDek>pH$I"yGCܧ?RXK't^B!IZ>I1BzSb6|> \|xq |f9cFi }@%p\$7yżϼ4n5W$I*d?+>8I$UV+,OK"i&I*\@8x.p,I2^p#p(SԶ>x%*J=jJ%!ϱ{JKQCܯ_ӛ=cw>OIh\7=@R,A.ex?sBI7Iұ 8$Exo$BM_#G<^㰐$:ϑ%Yk◁%}~}}K$'Ȼ12[}@$2ʔMw I$j, *nF9mKb2AR\RbQlƻk >:yu3BeӢz͐SCґ؎`c+NGEdQz)xzN"`r4; ocyK燅$ay.>O_os:?Ulg$IRC5]O诙L -$IHPV E$I Jvg?NY ϣH2[6CܧR xN__,g?S?~ <~fiIwccomt諓큯索|0 qaCUc(sK I®2}}x:s{)`-%/ITc7eMtؿCŃU*,la$I~1:$@!G$IzBSR.ql!})823QΕmwCPQ:wٞRZx> yߎܷ=Y8dF*mz?sv;ta59[G+j\)$a1v+|$:ς1y9Y_lg$IRC*.3$75'm=xNv8$Imu l`?:$IT5C FR8XAHρk_wgGਫ਼fsC쎞ҹ4\~kN,VuI:Fx:l?>b~?3|Y##/9|$E ETfS%7_s ?Od7O13$Im=ub5/jH\H5nI:uR&H%IX@1iW78b4gaHHtjܼaDZ1Bёqx3 jVy.ܱ$:(b9ϲlh>>_%IjhWG|S:w^U [xP$UZٰ~TK$IUca=pIGibIN´6p.]<)!UÈϝۀٞ-ӈoS۷퀏 pvv̧G_i^^8H.3@̶8.V{~I琅$y>M3^iJgg$IRuN7]׽: nEegU %IRm>a'!$Iz(Ks+q1}5|-^TА\0'Ѿ kAR؈du>w6x<6Ykg;cWU>"mնߌq+<$:/59= ,433u_$Z==ݚV͎%&ޚnU>K$UJ>Av5䧟;LH$IUca=p}K(s$ؿKCtHFxΜ-wFgyװ%pVm] = y_"Y_9AE{#-Br#ϧM߹R%= xے̭jZ@l ϫw/ITaT7Jk8d6ݪ^@(ITiقnŃHx2I$Յ0m:52|vN_x5'tz.pp0Ia_HPb_ lQϵEGp7'YP f ?j KҏS Y:m <8ݶ )7$鄡fXAҥgIS~?x"`!&f"8pF;$CtZ hy;C H$a{?ɍ^>e(: lOr3MrW&IKo 4.}$ Yc \nS]O^ ?cyYIN$7ZKJ<;g$ź㘷UYy$ITٵ̭kwc ҏgvϨri#, TW4ȘA~~{o$Iz.eZv?Iׅv j6h`tۋ/,8m8xw$Y]9y]&Y|dQn˪";6 p"/xOhyQi,L0vQE+w~k ct~'Iqu0+ "?㸙Wz[ܐa?w$$)"}.M`OaCR7_NjفcK#*_ARx >>>I$U@*)S_{Z94w tz$7UI+Q$ Tڭ%dN?%kvI4Q$IR!waJAq;\>=QM$e-bE$u<;M;z8!2n:/pl9uᩁso].x̀ư 7x9~ $Ǔ BRQ5m7aǵxg:n.>`Ts5=WW{=WF<_ ׭&_iyVze&kt$}}}K$UA6W5]g?n_y$IjMb?Z]#J$ , QnArga]^KXfsk=UC:Ӝk8xAɎ $ۊY&@VDW&I$U0gS| `ė,F:<˃)vf>)·F 0p>}]'y{uW>ts YqmPy$<߰p3D=nJ{˨OH:nՉMp )pppFnۥh]Y269xɍ};{Xy433u_$b:5p]fW7~_P,L'v3Aз?*=<ӗ@ m1|d~x>2pf>vzUW`n'YU[Sn8I'*{*p Yv;pIqA3nFc!Iugx̀_?__$5Aki%I"Y@XE>b/hآ}&p7-jju Uً; ŭ־ j'V:Λew,{}"M o#?S3mOg<y~t&;F1uAs$7Y_)$E\yKۅb_WV<763u_$zukwx9mHkM=Oɝ$ITCaS.qyO)0.MBx t{cb \kӀ9vUu+},\Eqy]~_)6 (#|?w-\Iqk߭w:YNAs: I^HqrmBݼγR>>>_%IJߵ7šׇ]<uIԸD[`~v?]%I* }^'y4OPE ܼo) { ʱO̿#|GFuڮ ):a7?1 )$SXHRusr\ X8u}}}K$TouٵƨK2Bcmy$IMJd=auJ, $IRX@Xk'P4 +4?w"$vuUD4s}U SϏozڇja1jO0}li8\{3NqE:_979ڀ8M* V XHRuk_*^=ɼϼϼ}I U]'mqZxlGсppKVv I$IUaa=O1/рxX!ss]OxLba1:ӗC!d}=t-CZx^N*񚻍7tͥ$݇g~\@!8cN/}Ε4 ,52i!IAy y>/ITRSkwY@tVa1/6ܒ$I&E- $IRX@X1 ˊ>Fr&X [7 V'F^PM/%Q=8TQs=1<I?3r1x!.0uoa~fI`7E9GѼ"v4禎G /ITR-NѮe?p\󊺩%IIVWv>X@(IY@x|bh,6 Ǒqd%=?zs㲒L|O?[8x6$7I}lxo( WxfCsqتG~f!I9\<l輚 .8]\pkfCKtAN& ]EЦ&, 'a7ߒǶdy&ϧ9y¶oɼ}I6Nq,NkC6IF%Y1SI3I$Հ0ev^wq#csZN-6  IDAT)B;Dpxs;NB:<+q\xr (:l:교'rq !G?FI$iX, Q.,x!`Ⱈxֱs'⺾ XU$>bk Kt F_.S1E曤Q8:}r,(>I$H[݉[`;1V(5e.8v(q<-yq9L! 9%< Ɉ׳}?u v7;.}p{Cu"bznCf']YFҝ\_9ʼ}Iz?wր_}!0|b/ITa%S#E$Iz²I 5ݩ\ܟ-"f;pzDL$&#M9>p./)"B"rKx<śh|Zvghtk p+!E^|B\&\ɼ}IZΪ+zZ}|}WA[1$I N{%Gw 19>J$ITFð]lix8ץ[ǁq˩#k;*ٴS!~ 0sx\TPA&xg!F Ь7cŽa7AXH2ȞVIRa& 嵪STt2]nI$I E_I%5~Nw1¯3<*5?`LY 89C=9$plI)tO9;*z΋JRg#'neU#/^y$I(yo-#ڇu~n?O?(忧]s$IjL2. bݝ!I$U;n8|/"/% wfD5|^gXxySB>b~3߭N&qLhLQ.onx`'_4u>/I4Bt]߿{~;n}A7j^΃$qIhOJ$IU`a=l"b>ǾӗF.`!lu_#8-1,0/q1vqZ h{Sm {EjחGBb_I߯kyed$I2ϧ+X^.K?QXٟ yu5RfH*lRI$I\ "V{Q̢+>}1s a-ǵ(bX`qW?*q-Jʻ"pֆoG1 kxz_1OnAoRfM#>I$UlA`c]@w[1$"t)Hn11S?ᬹ|~S[^ e$V.iEr4a?G$If`O$0=`m <;b:}kF!lB%%?#qO`GF_Z!cf(fwj 63t}980t􈈱>pFP'$ wgs'>I$X/Sg:o6cv97ۑ\>8e"?ُ7uQm*փ [X@( nC2 |I\~:xP$IR0D̊v N| fF -t*{D?ĩїg;wTЅn?v{O> T;i]PY@(lInd7:OF[}&$I[~wNEct :j![!A ǝZ[2畔wSwux9k.RbmV @񫈱4|؄^{ I$iD.I,cͮ|yMv}:]nwC_+o G;ߠ~ŠyP҈X@( }_EϢ.?#13Q$If=b:<ާ {=pS&ȷ#ƾ5Z ~8vC`GO[/ {TEqWR=\H{ CWf'Mtyح 46M#>I$UO`,`|`pܶk^7f3ӏr>'RD8\ݩI}$ ʮ&J]u$I$F²DS&)/6Yh_LBGO'Y 0?5u@q7"tHg0c=bֆO]y$In;6k䷥$7xP]wm"^uZp>@иDRn_ )k|K$I'fal:v}FwcO4UgW}SU -QAb:=:xa]ir3pgX iuI$}~SsH]~UD-J+g=y9j[1u˩b-sOICc$\BOtxP$IU[X'07p_IR)Yc0|Z$P1qt7Q_wߨqځPf% S?N"`vU 461y@(>I$ec]7R~X=hb~?ZX<(i, 4N.\>}}N-&$I1wQc}nXy' -tBe`yW^]g ǝ]㴀PmvG8IsBI$IЭ S MLيMl:W> 26[tICgqjwI&rZ #y$I$UkLNh~'2%*B;Vw[S#)"* biscT&75  uXhC'MuwK$In14=ڇ=򏟒ʚȵXhowh I$IR,oqn <,pU*. qS.q-t`®q'*Ri]Y/2`Bn9(rC I$bk9mG~Y]5}/B+CGIZ:)9ڐ!݄L$ITwϋSW#>5 keZRc=c]ݝ.^8 o\tJ"ka kE]aZJs9I$InZSۆe5\Na5Vktt\{~% mC)O?Cv(I$IR<7b _a.$8vMjqE.#ki<ޘ"]x .҈s b xI$I+gVyu@zK\AI#d%o.ICLݿ4ɷɛ$I$f6]X;5OhӒ݁c [c݄R~jvZ2痤\`v{عod1I$I>LMOC56"715S?-n!T>I$Ilg`n5XNR931V@xIcg>p&c+zv .}!mc5|#ٝN$I$ c` .>8m2ywռ@(I'uлb %I$Iն[s _V6!l>Ec6|k*zFT C B;ہP$I$H,0/%nٯ cT7~FH؁Pzke>sZ>qku\$I) +ܕ.cwai.#)\~Jl\Cҁ1ĢA,^C,p[7mY@(I$IɯG~#kcVooN57ѝ0{n,:|FBI>|NlRPJ$ITfka#I05Ch" !Wqŏ}1av TU1lFRj'I$IȯG6CQZA{.R7imTu=v:o/˝_םK: %$\-Y.$I$ Qc.7YLk&v 8 pKqu%#~~IҸ(`{7˿>I$I4NM,"e $I$I=tjzpp u&΃z0M/=WJ !Ɲ;$\̭ק9wza3?eb.I$I"Z@8w~vS, l%5:QvY8 f/ªEQΙm+C b$q~b$ɼO$IF5ʮW.ޖ$7"p~$:v;wrIbqj V/ڛJ ۹D,y)$I$ʶ 7 Ɓc7~oko`qkIhcg>\9ןj9җʘ <x"+ɂ_+ K^7=4bO $I$IӘ].^ow7|Mssa?$EPҸnۙ)iLqՅ]<:%{$I$ULb¡YJ65| pܒ+GHM #XG;FqX2FcESۮO)c^68>\C(I}$I4ӽ֬KrfF$ qb2$_m;0LH:{ ${$I$UŃ!}piY@ &nxek5=f}) `7`OEO"&RS|]%r+`!$>I$i@-kp:;M[| :7wRo?xp\ d%ɼO$IFoto8֣D_t:JXLI%OIӸ`oI$IR<چB 4ە^vn[d3o&I1 y^x=^*"Ʈ]cO0$I>e ̛G~=^EbIb2$I$I!u A#؁pu_ Z`VbqhH:Ց xy#p&Mw~k94N3 %ٯMI$IX@XOkF]|1Y)pB5\[Z8kx3}-]"e^z/9}{6܊$=O-_T 6pqK[?YuzI23$I;5TY|6stt<>t:;ҏ^I`2&ĪS%I$Iga=e!~4f? U /Ƨ z$I>;| ,ǹ^c[OFBIU03NZ}(C$Ia1O3ZԔk}+IXxME K|]Ǹە/GG3k?~iS /RO?~TqV;$I$IȮU~ᨵoId@?owI%I$I*ec6|؁pz?&L]ȱ;ՠx Ϸ8x$I4HX iH}qiER,pB}I23$IZozV5yN%„!Tф.nIݤI$I$b:Z@(;8"H.Yw]ʪk^ ,"+/M_NERnLMF>ZH M֭p<6%)\)xxN1I}}$I4덳k]\s _{{VҸY@(Z|ECԑP$I2) \IcZдaq p؅9\[c^ <ݬAyy$I&djƆVwϳ$H哨!SQ$I$jb 7|؁=ذZศϛ#~Uӆ!@c<|ۘ5%8c}z/SF$I> H:w_ihjJBIUMZc]?%I$Iec75|؁p0sW0΃ڍ \L?!$ ȏ2.һ.17> XgǴIsI \dg'I$E7p %Lu*ku=$I$ML72 ?|}ν!B8΃Ia )٥\ | 8X˷Tz,q^ |3]?')?x:Hyy$IbzEMkKX4Jg Z!^>L]lL$I$IUr] 43YT?hh%`$,lE$g~˶T9~4ۀwu_K E@Db;'"ֳ y<,( z*,)r6A ,EXXdl67mx1;$dfߙ;o.7Ɵ+UDr]}hg ߢ|I}}$IR=C:B<Yc$uJzbLҗEHTr>\Rx;I$IR\^a^ ؖr?_3q;ruHR%BZ@8dnWf-boO]wpQ.I23$I0o|7,~Uc%Ԃ!ԃ)`^a] Vs9il,,-I3e. X{օ7.Z$I4t!p'C(l!5w (.}dk`_ܳ| f. }t&pw(I2$I%=F%͔,di&$a|$I$eIayu(fGf4w ^Wr> o <]/ɼϼO$Ij@ S1fBI}d$PWwẗ́4$I$浀Pj_B&;FN|cgGuzC, <XVq_]ynE۶_O ᮖdg'I$Yeד .PR_i#H<& s`vwH$I浀Pj4^Wrޓ뮫oO")i0%,ȓdg'I$d{N;1NPR$0W5i__.$I$ ȹI+[ȴI%[=u>ح|g?uEBmWV4V)i,/mYOIXyy$IԢėEU&ݧ BI}UHDb6Y,$IR@hB}e @׀J\fscKw:^qGWz8Isg3&=݆++߸k% y$ImEUmz'̹PRw&GxI$Ip\.9r`gC(ՅJλpX ]|]`H/'_P!D'9g >/gTH$I$eV] UדVff!a"AT_W"Dh$I$iHn.+9 ԚLv \ׇe%=|Zᇁյ6ۿV}-#ix;3mԴwU)?݅y$I}/N\O7XyNiPB~PLY@(벺&52Q$I4D`My- \׵D,1K+1_.CVr_@(` a$͍%{T\ιDg\~K/ClIT܂'Ue; Jy$IʧƷ4A8&ƷKҢX@(Q` lzM$I44VOjV^\gs2 ma'*XqJ!E=*̻x47O[Wē$ɼO$IWpH,k-|0u!9;\L-I=J[a2`6N$I4TD]A$5oے]G#cl:[rݽ./0 J!inH%I}$I"_}Ռ}(I`>%zvzݗl-m{pI$IR{Be V\'o; ۞%B  ?R $I$Is*98k\[N̼QԾNPRIEyŏ Xrf<60$I$̍+(C( k ]Oח؆ʝkUМG o*9ox.p$>I$i9Y|YsNBg|{|=b]l~>ǰH* %)f{ImEYOI$I >IaVa^ 2%[CI^@x ~CG ˀ:80Jy$I$`1`&wJ-#0="7EsN/Scc+, #&S2_nN%|n$I$uM]6@Mt@،U%oF^ |0=tp4kZX |Jy$I[S|6}Yb0gLކu[3rwbC , AU8u_YB<$I$o~ \[a# ԸL%͒I}aݎ-9^ }@ [yWБo)Jy$IkJ<6V3UT,T>IJAJ=Œ덯.PR9H-l˽`]‚_$I_0 ԸL+ De "X{(1/o+ l{Q~yxvjiJU7k $I$IqAn<6],8d,g\x3!p#QQsXV l@#, ԗ$+\Qrck^6뚖_]P2\xTn0|d'I$PQAeyE,3}NU|JwE)$u8gu L!I$I}GBQv l%=د xzVq76zs]*{4Qruw$I$IZoIn-v(X9'f\^!-, ɶYgk2O@z I$IR]|61Rc@جSK{LM `}]aS`n3XQreO$I$'k,exL\E NZXmz0c$vp^o˻bIg$g&;%YM%I$I}vZyfl[r>Nr %-[vlNvzض\ؼCFm(֝ $I$IZGVoR gpOYh)`F7x ܋ o.IPRe%eɤm֙ }QgDI$I3M!Q 7Jη $z~ kۼYyoo .BI2$I4Hkx0gY9y-0" v7]9~lXsI %uY-t:Z(Hn!/i/$IZITDXֽFvU 5|S>s$wۢ\3,ىFRU+;$>I$IzxnAsI$If*quKN>_z|,dS0}V1x~8Mi$, uaFf$:;9됕I$I$I}m?xajUpCh7ؒ=XVbnq-ʊ nmޠ¼zHw3x#N`$>I$I@vZ&5MI}~FݖIo_EGbۇIc$ϐvvRg3ڙP$Iw#QU% :>j1%+j5++̻4άa/d8%ɼO$I:_I⬂g5N:ぷH=6kyC-O\?BJ8njK %%yL:Æ!0}΃$I!w ?80J)[Еrr6y,\gZ}Mc2\hM>`*I}$IҜ[HTU(X@%p{ZaQc_:g]$lӤmx=˼*$7JUY-dp$$I$IwpRel`;0he @XYOK{"sD_ o020G{߬qyhծX$I4F-JK}W/KDAI!eѵQdI1XV29NXfNp.Jvθ..3+:G{$I$i XUa{/5"$C1hv l_N;+.*e tC o(#ny{o.~Dt} $I$iq~=!<7gҷ:).!g$I$oN!3~w{Ob1hv l;Y :;ؠ.*&`Yy6_Qa} 84\җru dE fu0 s$ ItIW ׋GI$IDEED{ p*p ځ/au,ՌGQt>X*]u6syN4ۉx+[  Q34g$I=Nܗ\F^׿ .b{7߮뿯q Lc% ‚!qaNVw;k$I$Is?ζ^ e:`" U)Xr|ukoXpź U^{_8wűg r͏Ӂ{t]<x5K5UҀI$[i.xJϟmG}<$} D6u[yy$ITRXp{wK8K7IImtҍ=abK\bH<zKRoY@(˂$$p1)I$Ic+ \òOt6%/N DuW`88e VZTr{+ j3ğUlyΎ{?GtFli =`n_@t2lI23$I8e |أr{D(86TӲO]kzl%Q1eKv _BGw,?ek5PqK3nuKQKoG꣝|\p<&]N=;I}}}$IJg|`7? eߍub\sh0=̲җ)QKRX@(>4iɧ$I$I}"ul)s%lUron;vigKj^ Na;v1ONo ds-pLAÁ'\Z`C#ɼϼO$IsDsЬ4,;we<̶jĬm_] b6Œ+~/ Ignɟ$I$IcO"-ӁiD]\㲯98v'JλgyF {LTp+OUB4|%:!'#}ɩGJ45/r~DGyHI23$Iॻ=dC||[a͏ M& a.I4D;05tN$IҬܸ5=-1|SWWc}jKb!ޞkxݗ`qBC׈6:Κlse}r;s]C x~yv+F-ڛȤϲG/p48tщ>沾/=yy>%I<*d.Z >:g{m,v$II沒Q+ɽ$I4K˺<XI?|}qx [qTS ]c~L;?fS{﹟GTu[ L au]gh)5'7h8Bk<4E13ﳀBI4/?YRǗ#'Sx%IԂt`{oSK$Id08, 8[I_<8XM? 9>as$)Wߩo u56'U?iҶR?B鞻gZXMYj݀'ǯN!cXE13ﳀBI44EEdm|0b飦Xy>m?J$ ;CBI$unpq٢ &ޠ۾{|\H? ^<\ئqroטek s>[a

8/67?m3cquݿ[tR7"?M, سE13ﳀBI4/fQ4L=d狍i814pK $parTQjz@I$I\s ?׶)~OB7  ؙrr/fWd}4x/Kw 5"j`'ƭ37~Hs]K3~3рKZ 孁]:ݗ7O4|,= (\dsMz;8-oI>?pO/lb ߁jYI}}$I6/* <1㱇,aFLȈI7H$PYF֝pÄQ$Ifa`j6"ؕkKuE4JV׍x(ͭê,>Vq9#_7 8^a=x/oO>nBK$I-a^`0.dm!DŽDCQߺP@7i>3-wcf$IRڢ6M$$I4K7NW%3vaj ᾆ/ɄNL'x(c%O}ٳ~c 9<^ ܩgT&7kx-8p࿈L|Ozwum<}}K$uX1ͳFeAL?~XC܊$ւ!4- I$I4B== ~M4DAIe;]cZs𹚖ulM<6^ð;OPel|8r܋QpfO>Ctx@yy$I:%3]zq9)^< g9YϬqp 㽳9Y˞e$Jtk頥=H%I$I~218hz^BUut>4mDX>or < o jkL;{ַ*~x"#҆?{zI}}$ITn ٍJc&%kqq /?7D'"Ed)Lo޲P I$I$IC6ȽOQEmŠ˰`FD$OX}xuDMM ?M%Ԡc⋀k ֻɃiy@pCC.ɼϼO$IWtE?lg[; u+p *'7z70ICKLΰ]$I$Ue` #=b OB;JD0Ԯ3xmmϰ|{.<8˨%_<8P-\xadg'INHw\KwGz$5h_9J- %uba_`絽f2,-$I$ͳ/u$8rn$w^\."llTr^;#뾌 a몼Ni^B4U=ZQ݀7,m:ߗp&*ux!Y5/z$ɼϼO$IݰǦ$YcoTe;ȉxeral C4| ?Nln`̋ a+5D(@XIm% RC 'Ё._.$I$I$I귇 a'xdy0|$I$"lY;>x,}O>2}*'~YWVȤR۞.I$u(i-:kDΔ1J%$I$I$Ibg]'Vد>I$Iqov}45"}Eb4mMxLAY0A $I$I$I* ~u֥I$IԈtWOݱܾۘI[BD]A,fUlgږ~'II@* '$AA-I$I$I$Mr~m: h$I$IjD83Cぃn_yJoߴsFj,AsB^OzK'JM (Jr-$I$I$IbllWr ag0﵆O$Iq_AwSIy6 9+a$Uf!'ᄄ$I$I$IZ+{봭ܷ$I$u;O{>+_¶mֶJX@(i)j)S$I$I$I%l^a _-0$I$5#=&X//rEI$I; Xz\xp`ӌm-@صujrB$i 9Tw I$I$Iٻ e,l;hvh$I$ImN05.Ӽ-Qq]^`#9F0k&K$IMn(u$ԜȄR$I$I$I]LoRE _,.+?o6$I$U2]XrߦM]z}~^$&%}|4sJ$I$I$i~'J]h:O$IVpxc$IzOJXI~@ǂBI$I$I$MT$u!́?Vؗ4$I$"=w!u;]׺ElsYۓ$IXI$I$I$i13 agPa?3J$Ij?".O-pI$IRe%#-ޛtf$T$I$I$IZ\MRƙ;XSa!$I$1㱽ҟz~8#&ma`t$IRMjÝNxcR$I$I$ITƿQm%qfvZfQ$I9&w}:AwjHnI*JW/2᯺mym*I$I$IŸ;Nhgb3h(I$IR-䂴LNacǏu|wI$ kӤBI$I$I$? c cP~9PJ$ITtQY_ -Ay)wC+"$IRupւ9B$I$I$Ie-P7 8}C)I$IRc6n ۓ5futb]1I$'P@Xƻ&$I$I$IZ!P &$I$I$Ié7f'Դ_v5$I$5.>:MzӀgsrZP֒$Iѥ7MH泒vI$I$I$mQJ \R x!$I$QYD* (?8=3bIc-I4]( XT$I$I$I5z lgheW5ہVI$IZ18 L}0ȸ1I$i ԁ$I$I$IjsՍ onA1$I$5.=+oILxL#&pTqK$Ь ӭG[$I$I$IU IDATwluz`{C=w $I$I31˂}Si"o(E$Izm(I$I$I'܀[Ӏ8 @[gz(K$IԊt7i^w wԵmc7t;oDc!$IROM:b䪉vQ/I$I$I$5+Ms7+=|%I$Ijx pSEq:Uٞ!vM؞ J$ N,mw!L󐕌J$I$I$Imx :x;`@ 8xb[F̀m݀wu`? $I$I35._osEU)P88ˁ b#I&AC-%I$I$IYy0pt.HEI$I:c/npEߕ1CL$I=O󒾠u$I$I$Ifi)*`%98X$I$sEvMbaܗ5F$IQ;PҍI$I$I$I:bGXt-Q29I$IfxlRAZՂ7ha;x0y$ITmBF %I$I$I4k;'د"fb$I$uFG0J1Wsq](c?H$iI|Q"ض4+P$I$I$I=&XWep8!%I$IRg X9v$Ijc[Q~ 1/A$I$I$Il py` N3]G$I^y%.3^v $II7͙,<(I$I$I.x)QW= ם>%I$IꃬutXܓm0?Ń=%I%¤BHI$I$I$G_nf> xp($I$IP4fwvVa]ڶ:[p$IҠd(#᝕AH$I$I$IM[<' s 3$I$RsyU-nz 4$u*Yv-V$I$I$Isb po@/i<V$IAz7ٶxmIMRޫ&hK$I$I$i.Dńu h_nwI$I4xQi5.hC=ݶHkc$i‡$u}*0/+)vhœt%I$I$I4`{BӖi5c *rf/I$IY`ºif}J|if?.89y(K<$IR9 o4u 63*I$I$I$I$I$I/Q<8kQ])I}̈́u43v;}ju}X~'sCmRrʕ)ΡNg:IN/Ԗ~$i0opPR1u _zo>cF/#mqmʅf םݝ]*²M̥9}7e>~m_P0ɶPtZ Sl}* Uc;L|oNX뷥} S9lۚ6R\O_< s=$0NcT,l*U~߮`\k+݊A8Tm6Vl|n<%ժ#n;ڼ]? \I@XM}o;quoXTvslp 7`?_OfamW3v4?plS\knߔDıϾ%w6ٳ ď7#۶㦴ߗrk֯PW[J\R%8Xqw*LM@v8K,]E0L/*(3.-盉[Z[?&8Xz} `54ω@ʱ`,;_Hnr$v_mjno+צ\?_z4z*rLs8F䀪OSnۦs?IAa7Ъ]@@ PK۷ކt2 C mkOt `?@m/5pM ځ@vzkv}$~s<e?.0;m* VCEo>abS0\$ŵϧMo{Jm/p۷ڎ%\dxQ>ןkY^o?[MapN׭Ir&W\RVzze zH w2\):mk3\֟+ۻ䵗1{IW.U#<%89α֚B Vmh=&#Q_n2 %s09oJy vN?yp׶Z&O]Ad]?zG r^Ym3YobpTL@|"-74xs$zf p@7 [ \/50%*_W9,Nk+Cr<-_V̽8Xd3 赥X-͊f`Jun&㺷POOsu Ǭq`@σzs),w}Hyy߷ } z+&wWSWJ8}w7I^[u{e.o׮\52w)poW 6#Aݥۜm!}:á*%n&. ~w?7WwFzp/"#-n;sͻ883L9m3mR7Vo kmpvϽsswwofv|x|1*)&/&yWsi -gLiGہ7C׼Ge|ny}{nǞ\[mnnXp45:uv% 3yRP> dRmƓ&]MM~볮$̦ns >V!lt77?9$1Is>9λ,$—p-Ad!1+6cwHe#5ͫd ,S~ᣅNxUAuK83; \u^㚑KM|h!>ۺ« DrP4LM0<$i&~ufƶ7wsAǔB8LmZ$sg^ƥ8c%kSI|w+)=3},JLO=?Z;+wz,k}e6[&/ODuNM<$qy/+mˮ^&nva G xy69 jԫ=q[￟{GNݲme_6dYtS)/U_JWж-/_88wSGD=&od]W`W 0ǶZ)rY1U:> CSY*,$>_M.^w8?pWep(+U›[o9:6ɭ+ciGuh7W׶Jmc )^>^Sڶ^ں6ub7 c@2!6 vB4'hsw`-}nPվ]nWږ#}S ƾ魣٦:6<5S nO[i>{6yK2u>>9;v;NH:"鬔\XGwH`:%xNX2ҏ>^'خ&wWRP/Hc׵\L ԃ}> V{m`Tj؆R8Tf$lb fYZ kZtts~6y$WM=nA*AT3ܩdL&#f QJv*1ZIrkm<nW]C蛱8?Ϲf~~e*%% UۮRec&OB8J6 kVyW\!I㙶&r=7sC?uT\[pvn##뭭zm{Jvdه3u(m }Ʀ抖9 t >GNc탹skj#?pډiFΟ~5ZտdM٦~կ9۵=¹5M'PG)]qf9ItzvO |Ï|wKӝ+}+W34?Jѽ6&W`emد'Lٮەۻ7Ǚ? }|R r{q6mMU%إ@9T}pޏ¾?mI5WWk1Tv? {m;Z])}Ct#% cmfZBf㪿\7#]8OMf}c )W><{?U\SJ&:sOS{WwP;x\Վ-.^ O9%}mJ D+r$q8F@1/c]:ڑe7=1'5 m-%_7&Isclj C`bpRmo׶p7yP.pJs ?N/p Ccjo|+W<9SOU:$]; }2ei_tIO1mI>W[v85-mPݾREСzJ2c`O]k s~zﵯasͧ&\@7(Mrk Z8$Z>#6W2vYۮP7=x\s}lS~F!\A|_9}[3ji9` ԒZ53׿wsÔ _EYuYۜV u߱lʶ#cf;a[^NGw?wi*};>ͭ=w7Gwe~quHP|JE*5WwcJ/(ƶvS|c\538MneNu];___>fzp7pwYKkn0кe# IDATmv8ԯ]QNSom_77oCםps*oǼ9}ן:6/*YrsTKEf"]wi3\޶nmsw2a;ħR٬9 ھo+H;ۑ1joV+t=9ԟKl}33yǚ323Stޞ|yKdwwr1\!-΁;}5'~`-sCAh;c:VI7,f#9X{zR`m65#5gL$?I6mNN!ܜk_7$yfv*rnwR٬'4GK6Vemm MKph\Ԝjӹi/Ǒ&$em*Lifl_|-Qo%7s*|Յ&ܜ9EJ ~~{|.I-H"&2t DSa2X-0}ocM}M.YxͽIjMq)_irM݉S+Nke^?n%yswډOrbFƁ @_<7{\ޞI?Ity$\gW^E~:$y oGs-y?lw>0HFӨYJkxLh'?g*ʽIUK"d651o~KzP:m8ާS?X;46@sv=)G&I>(Imq?䙺Y?1~ޯKk܆~H#3eܷme?c[*8?/rNy\0r8;/knUS$;sb|Y?tCM7?:k FN=7໎nAطGso>ݱ8ILO<4&EI6[s9~ $^4}j4hM%ح- eA)n@x]!Tܷ!Us|mS^Ifn?>Y?gƏ}:9ܠtz}klo{Y6RE/Y~aC)'ʽ#ʽcI[InO6/:4+GJ-=>l `۽sjJa:צr>oG~IgKSAI~,:Jܮ9Ww$_4b,9vҾί:,mD>j&\p,%O)9p(v{nsoR1VNpN:kιIr~KyB/nW+c} @OYkƪ+6 K8T@[qqf{S\R 73ߡ 9]0XgzJu %y@?gS ՝ozJks5͐ k Jwk `N;һoަͻnR!]m7ƞpAu&NN&XöЏAN|{XJ+~  (͏yyߵm|~U8.Cw^u_ގn+gv p$xWsm^CFK ؛B.t{A[+gcd;pԌ,6J9{N7#kI·Y?pSu9kK,A@T۰D>%.*%gMKp w}}j_7_\OJW/@y,z͗Xt8tRN-em^@6-a[|=nWrloJ!cCT$M"q?ݾ?^I$? IԹ9X$O$iIIu'g@!pJ$]x/Ç8kslcpؼK& Fa(IiM%m)%Z>pO\Kr乌 mo3[uq\vd>s%$yy'__rCߓ䇒܀._ bX77>~C3^,pD>jNm:N.緽1}L>Γ2~^:Oܠ#ﻒ|dH7rܤ68W`EjEN~&{w>'ylo}[}m& QxJ`v#!U)% %ԭBbJ[JP.OsȶB~Δv3r!ϧTwweB$9zI ɗm3)ag 2^ pC$½ڂRpUKYj`Jph3:ɡʅURN$|a\DZ)T3ᜬ%w_D*O#I>>ɿҥPMpJ%K?߯Pw$yjG:Ohoa !d)߬k7 H^0_j}=t<ț)Q?p>??lwskIq:^Ò  k<%͛f<\̍LϏ|qK$N#8m'߬w۹xoMUcSyƑZ¡=f;C%꧌csMm< ާI~o$g\T}nȏ'p^xwg_?8T?ͺd/g>;QBЌ%ЬMcĚ]j}a5tU5JcBۧ&6Ingzgi?9/Ip:v$u|FW8D3n%yQI/J9IV7$N'#\^WpcY>N׎,Wz5@ȹWZcڎv@- ״O8ER{F5ʹ$J{7zi"1fmsoEI/mI~T7p$.u~蹹(I~}'I%o&v] ύ4n]nh)'krx5@ȹkG5ߵKQKYRJv]~R[=֌] m+B*M_EVXPj{S鷱~ftoKP?$y|˝I,|a=`KGt#7hNQ?/*t\ʏL/u3`h|Jnm{mI8#Tq9v9>i mɵ1%n  k>I;Xr]%tWCi|n`̝u[m_e>.ͯG 8]wk+N)UϖrVto [N< ߮OΕvKgS燒v*N:ףIJg`\$'֭^uo˱9ѵuoa9nB>wnvhRʺ 2Kk.h=aþ޽~{`;W|zc`JZ[?"~SaIvza;/WXo%Y]$/8`LR;]847w^﾿κNJ6p$")&UZumlGK3Xy7v53ƟSځv/*kcv;:T l\_w߬3X5g6K]W<\|P{3sbzT<lI {'S+6G ʭ6~eY~jG=zXM*~.ЯrcY1jJ7#u7$ߧ3HOIr|e+XYϸZ&y>B7Yc;|dZv൱_DCvN33m9^$vo8ۙc[{1m a;pֿ#ܼg&y=$B ,W'y$F7 Ab_ܡ~wdm^xi̟X, pwt*tЎ)_6 'rЬ$'Ntuۑ=C>$u4)yd9XJl\m'=Xu~cK c&,KNl|nY/Za&&&wQXuF!ܛIJ& |6oF}=[۹]ǡ tߋm>?tx㦖8\K4:6b/<466g輺?+sjsxJERyݧyFoew:>]dze{@ ^J og<Ȯ)y8\,n~o+UUs W's]َfdRl*76? mo+RGK ^g`Q>.;|BGu% _s?]wfii;=ɝy @w:kLC-?W)o$>li{nrң8n&cC66:ul+9}$w+d۽Nݤ 8%={K~ݓ|́I~TW`M;c,krU\7??Gme,BcՒRZ J6̈́Vpnk0מ^씊K28Lx\ڑs-Aiٷ-JS+!1=rouXoJ$Y7`v+MI~`3Y<[ݜOA<X]@eM~JX`׿o{xumzCX;J71@Єr|GضҶfMo$O3ڙ.\Nb~S(K:To(izp?8^z`$B=]KH;ZSy|Oi_ݏ/g) -MN_>/wُCSC~ٛ$8KcܤeUQO?$_q:^u% џ_ם? 36we@&mۛ$zXSxT+v̈́%rw5%qcJh/εAX6몰yJ ~GvAori;Vqѹk<g&R|IF`pOHml{Si>(U;T)\ Ŷ=o)FMs_CRSI׌\7)'ƺcY`$O֒=1+VQ]G|˿%'C ]'ov]r1Otmwg&w~p67I,K!ܱ ~E}jTСյyOܽv&}3hRXF[M"=$O3m+n(lib[9Ǣ67w{$_r:>'J6w%ތ]=I}xm'W{ BI ;ړBJ wݮVZjS0Wd֬t>u[φ oNEbmJp3x0 IDAT7$yCIޤ+XżËpFsv{vWH!ԃRՔ vC6e6~Vᬠl.CI+ժn*OID8'iv+m G{۶oہKUevߜ]f^OYJn2n0.#cOrwuGpޞ[rW3] cɃS;I`罛R* @wTp`iXedc$Mf`{+fEPoR"87fY:&m $Uz\>J0gcd PҲS@#`*'pRO%\ pn?OYж8>E!ԃ`xi[J뾿HPWk<8ԴR>P~KL1ܶpq}pHs.k)\E[3RᶰN}( =`?$&yIJV4oNqU~e. 4lgnA{Xo2,B7Uj˂Vixw3 m3ԪϵS.&/Kﻷ}V:Kǔv>l29RhMN\ܗ M"sR9k3Np^e9lW%͓3J|e\$ ֊.Ta"_rJ@9%4֞*G);f_LIZjW|\ U{^}>$Cpo L3pՎۅmr"$9PŝfkmhdLUI{-w&}Q絹 \޿ؾhoX?m`Bך*۹7=} mo/&ہ>hg~g8h8>^lO;q]o^ P&CI8OT*}ȹ NI,XOL`eڹ'[IM34A@󂮥%F[3С@ CwI$OM=A-j󯈴/^t՞w߆N_ )*ہmo*U8'MOpIu|Iו=?ꃵYN&׮?ۯ !BI ϒ]պn`67QI \~eu&^~`2 )~?6bjZW:j²Mkи14.y7mFukqk߶oJm`$>`W$b4I^sꃡ$M q\9%Bݤn@u&ۓ=/H#αkδvhMyd^ 6U Pa`x2ѵt?'z&ys@wt]#Wo!>Efm6٭XPjru϶ʡjCVrh䛒<}/׍]ޗ1=q7Ǵ62)Xjs./b,Bl.tv7lrv}|"ݓ:δ_L}Dx.6 wj S?J ,Nطcf8qpn>5zS)I~˿#'Gt~(8Oya"_[Y禗wB[.I iI@@usd J}zjdDnz2p!&y}g \ ]S?tū<lGx3Tqq}CVp+\Ks1q֮6gIפ\phg%]|Ma7G9gK!ܮ_FRkβK B39/gWvki9͑ c^(~fԯ:v1ΕA|5Iz't%+n'|fmg:io.t_%ߒXPkg|?TfdT/l&:X I>M7By?'T^{6 AHX8 |Nn*%lW̌CAWo7So۽+M^jC-9Ti=}Z:ɽK>4aXXKvR"f30X; \K\g&y`Ny\@B;.0eX^I`B_u MztKҫ)1$<ƚ_\.~.ɻΗy.kmw;ߔi{CccQr CIy1N{ ɷ$u|[+XS@3C{9Ͻw{;}g *9wm/?}fRRKk787uaXڦ&Ƀ8fsO]WxIazPuX!ɷg]_M-{ u-I 䜂v$-یLpWf"Ejжm3MRMo3/Kcަ26mk'J Ʌ*PeI~˿:ɟЍ,\itin__\Κ|%'Ɯ)>3EA̛Xt'nJ2rʺ/2ߕ/tT4~j۔mCux6*/%!/*('o$t%+Пsן[yߔy~Kk_]~̯} @9H`dC2I6[oSj grfZ5¦Kaeuv;iɅy{J o_JV6I'᭥m]m?/Ns֝s?M!UߚXMT݉KHN-yhTƟlCX`Ec; c\x-=vp5ɯJ/#ɓs1Y)OJ$oMhn$WvnϾ~4s0u5OI~$|eN]91\ޞ׉܉܉vy{UI^yy?t/Cn *u/}tnXAb>aH+_s3VM!X$p>77]Xv6SYvM'7PzʮHk'4yzRHۓ.uIp. 3ɿN? |`'$/Lק/ɃImg$M_L&&eI~M.w$y$O<wbIyy1_׻%>a>:'$=.cߒr+ޖ$J&$?k8 7AmZ cs@TXdXzN-=nh \x|6+Ov۽oMo>cFs9S18+fưۋtGjzؒ5 d t o'k?& 77|(w$_

nm=xp,s ΋szrx78x:oL}9z>Gu`+ 8 CP$IN<Ц~psN1$IR:y >ѱ\VC,Ulw뾇 0E xqBIuY@:,l[yqnmI;|[ |XUhl[V/ے z[}^[<4%I4WׄA9:t65Α$IeQg9U AI#Fy51?c)+$,FԐsa$IҺ, T86M=:'h>6H? THhae^ˀk0y$i 60,}oBC0){ |dVi`HHf oʯu0w^o׶0B2K׆˯ \|; I .")8mϑ̺t4d5n$l#)L]1\C2e$3k^F2Cϭ%ӊa\W 3-\_tOu92ll?׹(ΰ7i[o4%$77Ix<8a$Ͳ/v:p!S<4%I:)[<7/.i73ݟI)ڤj1̊8 ׍ L?~/ƕYq>%I-mldf{/3CP+W; IDAT$ӊfInŃU;gg*, q:7y>GzyηknIz1I &5~"Q;y5iMɮ9H$)) '\7|S'̿ qn}+WsH $էygBF2dT_r7-݀g^38JR ԁy]&)! ;;o$sVmVy(I EyZ?<˴o\,fx2'+I15jMjiMڠEw[b/ x$I h6 әq%=z[az~?StXݽ1p1KV=<;$6\ |yalݧn݀㰎i)Me$IR'B8$7G1^1+c ч$IT. Y78#c%K %_=tl>!IB-mƹE7`lUDL {M72p+F)\ENcGjZI>^ `alMs.s R̮&)3CP${fU=Hn`,d:~_N TDZZ`5f 癁gX󜾻 BZ67b)>ӿ! f.y(IJy'lg;|t1Fu1>x$Iꂢ"E]xS)й8-R}먞~}E.IuY@E8'`r% .cb`o/EE#j|? + N&|冱B{8In2/4CP$Y=yݮ1\ǽFl\HwINh5*ƻ;% qW@Dg;~QN, $If6&O a={ Mohc?=jM*9N 㠀8JᩁmU= c#lL ,4 \3x^<4CIɎS-0p& ֦AǔJΨ*k,:(6wT׌ќNaӯqA$I벀PfaqnM?4vg+ @/Z3߬#g||( 0|j:}joB{4nInSC<$Ij FF?Ku+PzmQGgҶ-I豕.-pǙz֍diq:]UY_Fbg$If6-?J، [v46{q^c'T /бY@8{쨓z`C(/ XwFg5,yhJ$5FT5ϯo•w.x&iXTئs.ITۄOT%iZeQkǥ+*mSl󦛗$I, ԢYf`?඀_[F/a⾡1ѦD{Ow, -OR l$IoeqShOް<4%I*|eȼh}ٟasY{ǒJ:dCsWg~nLG̯&NW~mKc"I_cqN2;Ұ2nky쵘F8\QH$iz 0{Aj'\w['|1 \ӡ<$pczM0+ޤ3~OR݀wnU$7Wkm ei?aQ x;pyh$IW #.h<ᖩun(xX);j#e8'^}ȫ-;ǘKV37 lEYL㵤EͻfGK4ۧAƠ$(}$IRл[~lrf\NrΪ7STpݿ6ﵩQ$ , rV6dHfn5ZbzYG/[>{ٻ~T$3x>/62%>k$IR;q.WQ<Θ%1ɳ5B{ %IR5Fކԁ-VˮYۢ^?:$IR> lc岰873Gz')~4/@ n ̯J*`l_~%ٛd61B2+Ƥr p?8^yhJ$5ho%1-qڹ9ﺶs.InU3qͻ!t g_d۾ Լ[f^I#I$ 8*mƹqƀYX@lҁ'᳀lluX@|w0| ,l|06 DviyhJ$5Fz_8 1ΌQ b28Ł}*lxXIZ*4أJ&5SȻE$I`gn,l3MZ`?Ӯ^}0}qcI?3T:zخ&$9&mpIaw඀y)aؑS}C<$Ijઉqg>~-PTЩ ôEol`qN#lG}rcj8sm,zєh[`܂}$IRiVu? z/n3a SHZ-'\rq:Qb?I$s-7r93qn'\w3j9, 7w$lp/SGp>ald$8;iߨYvVēC$IQ١ƈIޘOƒ:a$u3+âB;Pcl1ҨaTr\ј v,"R: V5UmęYκ{6%vOv$Ih@(GHH[p̀' l H $-wu=ֿ }e? ƑCI_x's#鱞OO$Ik4ebqߦ(U]ٯ<` y\51dPb'Y$i}@8r-3禹 gi-ow)p>5alg$eܟbQsfthu5y(P$iaFcK{]HnRa %1$uRe26}+pMI+=U{ﮡ&ɛ%4)D- %UH$I=X#i~?6p!˧VX )Minp +QKrCI5^,k/C$I 3cGD$7~p)Վ c%, Tpp/;5<^kcK_4S\HvG K3ڮ׿ *W\y̮׼nm{S,I&Huk Ia[(pLVNNRʛ}=r8/XZ9ю4eJ$-D4c/{`p a2=1K4`\]ycrF:"u4hλ׸6`{B8'NR: YN)P~WOTq]n$I{5`'uo1<1`?2UFNƆOp(pt1o4r&upaS?pu3(<$I87. 7__Tq&jQy,I յKFKԠ}itgDs|Q -+먤gጧxG--U'zK$I, 툀uO$&7Y$M 6X)I91>x-C8/Mn jCGk7<$IWګE>iqSp܋\m$I 첖nD9>(Yjt\#}{4#σxI$I*wVvg޲:ad ) =Y3byw) ȷJ + {x V5/ Lp~~c<$IZX|d#M#Xgr(R<%|$3^4YM=Vg Ts{y&gk8..oGڎr?'I$IP` ׽! rzmݕOhJR3 ~z$Mj-I-q Xp.3<ǩKI) G]lLf %=~jkLG8Ƭ_(7hj/,e=>~I$IR ̀u>Cj{ΆPꥭsۀ™;%pǙ2%IԛqOҰHQq6\<%NP_<$Imd]5:*z,I$I㰀uaucu/~`ZH_K%u$%O[ c0s%f|y(P$i.N}7yH~M43U41*1ˎu,$I2q306ԥM4{V.*4)3jW]m'$I$i6?!ֽC1랎א+LXQ{>aE=F iٗI&(P$ILE$s+adzڟ:?:]??sP]0͆Li SG;61⻣E%Yqdg[$IT@` =&a/4Nǔk pJ67HR +p~i(maoRc.difyhJ$uAllhjϳ(.,77clΟcG%I1~C-Sz<{uz%s.\ew9-X-I$I*suh9]OF]v<]SBjOMalm8N--8Cx!ai2 \CI%gϛѤ'qm:o6[*`i_k/I=g!۠j4-Z)fb8s6Ե=mr:>e f Cze%I$IBMoݯa2rBAj3Ma;nkOC*uQ#ֿ8?h9 p]PT'(8wP]l }1׍ M9m)4?)}\ѩ{N<{Kc[$ITAZ@8} Xw߆K@ R+qJ{7噆Tj7nVi9b}C$Icw#lbz:;XYch\eTqLxRI5 qEq s~$6?t<(yOs:Qk$I$IYˀ{L-pBwЁR;|8J$p2Z۶<$`_>j([# |oAo^"Ij0 յͨnk0k\ܨឝ(ϕs ^f/C%rQ^G؍).#}P[[y(P$ib鱀_`yWUͷJ$If.7~kfuwl18OoN,> x0SY(eCJny(I4_I@>]xy{SQI)?@S8S4P,ew(}\_fެQ@C%l絍9TץU`t 1~Dqr$I$id&/6u6eJv$p_o[o&)&\橐fM>_ 0VH{o~soy(Ih _ KXcXڙP].)ܲxьׇYÊ 8FGE3SFy8:KF5Y5 %I$IyvfJʹ\—=k #hRyyJxp^H />< "Mݡ 6XrCp iC$Iޢ1|~*yE1}cە{y?[*I=f"]3nq]T0 F+*h͐8E^*˫kp%][Yà_{;$INھkz/޶}x.yj$H6')8tCZ=ox!`Iy(P$\~Gz,CS5\ GK IYfI~V8,&uB֋r:mͿ"ȝ(/&35r"}pRI$IR] A'mҀ};4J\l<\I/,i</c cn5 wscc$7M{ppS-no1l5Vg~3Co$Io591p :ss-If$u@3j.YN6Eu0B[^?q bX΢5֟H$IiYO%)PҀ}jO3K'IoON S-rZԍ$Ŵ~~Mᶀu76eJ˛%UGeU"I:B]QѠHVw25ԐO_ՅvM|Ir"ˆcA+-ΉxJ$I), TU.7| D2'A2Ca #>ө xs6^PvVH0`[C$I dp~p5oqH[2jlAMQAAG;i4~'ui.}&9#yUڹNo#|K$I hST)Kwv/=r/x `ˀMU#V넍桺$&y8 c^о_$?,0Pe y򊒲9"Yv>n Jw6oeBx)1{_ur}sE#q })$I$FH*@^ItA1_'6Vo&5? XHh_^+p<4- $IV6󧙟~?Jrzslԫ٨|]K,Q8u%4(z.I$If2$uugw|XӰ}=pM r mw., y(I.;.j s8I''ƾa$E, TWE5J]hY@$qk0nP(8ku}12[I$I33Jjs7OYn l҂->l'J{Zcy.$IxѸOxaSYL^ |>?wyt$IdN7yf2g;}Rrf wk/*y)Wfh]$I4, %m>K2;g5`ߞ Ӥzɬh{^l0ե<$IU4~$7ʎ|;ŅdԾYW IR^]|-jG=Ԅ|jkzwQyuՈ:EQϷ$I$]BD,>Isp7ht`͂i/{-WnՆҾVdAm~P]CI_E?CؾcϬGc13!jBt zɛkY$.Q>f |Iс]"%pZ' _#3v%I$IuO%n1$$#gJ[_|Ӣ9YA2m|P޳:<Cso_ ag{u"`y.$Io;f-II=v뿒?F21e7K%ǖ zP$yWIZֹ jWQufY;i$I !`][%n7@Ԭ>fiɌnh!i`R1|,/a{ <2%I?Rc7 3:Y#/:I]6_V . ݨ#1-tŔ(~5/{$I$IcF$y%iv.-> kF6>FgHi(mk桺$cF_?6F{t49esF~#*j /*9OP}kE|4fgYvxo3NN[w$I$MOHO%Bqd%5Mߙkm|տww X"ՆBgx!7Y\a<$I=7sX?=xqKqp"åh[jIz /Q w!jFyX^3iJi$I$i.N?65`}JjENG $3jNj-ɠȕ}նZ-pbyhٹ$IZ̃J>fhֿyIŬ;bs?7\.ysׁsl3KF, TߌqI-Oyv7Ě6ֹ a ]l<$I*;8x.K>x}dz<9u,{*I=f.]3z{ń)Ƨ({lU1I}&܅U# yNTnDv$I$Iǀu- T %Z=WM5 f(EX} is_l<$I=$rw\*yN"18V}x>~>'j Mw'ÑHTd6n89.hLF9GƲ4I-<WtFY6|^!F^ߒ$I)mTx+4m$q?phH 'uy(P$\vR2?g깃שSl L2~z Ww,uy,v搜g1Tfc5n~!w$I3f~hWQI.lgPzV6MR˵^7맷bՙxDvYPQhKXNC4 X9dO\^ڂf Ǟݟ.F_ER ~\7lFu=IqFep%9༧ctK*FQ` ƤJzB)6vޢ tQ㠠9j-iPq.6lg$\ d%;dq, $I$C!>I? xUvM2Jw/@T7YZA j㛇jJcCg^zyǔX!l9\")%3>ee_[-=;.AFQ<Fv=FqRLb(&zߓL^vyݽ0ڮ;`99.I$I*2w+C(7pFU xK6d Tn gn`4eJ$9;~7o"_19NtZc`O=Kk}v~p=&8ioU Gru@EIzB8kܴD%Z"6FO(~}y wEQɶי $I$@x !TA3:ʀaUbp"I6|PO!\`<$I1}+ u.p\6.?~'e)s=߷Az+,ɝ$R-"*pm8QD^o#Xtk-=Ql;~ΠsVVP3WY7 %,ѰW}:=7WpnL%O:E1ѱgtrc>*&\K~a\sQx\$I$iLw0J7OJ/mPjLg% l>B l<$I?g17.])h81ߗT/wb ]QE ăqb̏oq|| C@jg P$IꙢGX^03; _-2k^MH-Crv/[ xaԔ5Sw`M9yy(P$hizŠoqw<ͭ1:oR>.8oL$I5j$1nܥwhiͥlvZVbx,|3Fuiv`JoI$I&sxaT!Q7{륭em ,4/N_&\77eJ;e_6aHn1bYDS? O| <ǒSJD5]88N#c]8d^0Zg)¢_y/3<$I;1pc | cg%ufZ@O9`FIʀifSE^$iF|N MspVk'%+S$( vOHYl9ҝIǭǻ6 F/6zⶪw>m&ߙp;]\.;I$I&GF qxa4͜',n]Rcp+!~~S82 >ϿaWªv:M8j I$IR5p? Jxːghğ͜%-X//6>9Eqh/`nc]CI45k+(x{Yڭ1cÀb&I Fk;ǜ|}&A3/)_$nGIJށ>H$i@I3qn97y-9I_򰫇a:oVC7S5,XUZqɎvC<$I3.m]Ǹ5b֎}˺?_&l̻;˵Q8ņ,4\!5cid { {|+j7h$c[Rc~tZ'mAM$I$O~0:߀[4c8ï18hX}͌1Ȝ2$C>xh0c?'-2CP$ͪlVn&Uk5#p{}ge}czۺp#iv)owA,e:%$I lyv ,n_|Jb qsS<7 !s){qLz}o>)0e #I&xƹ^ni݁fcE$%9wz2:D>̈́|dߙ{ eq`O2Wxyh$iVԹ,nw~kL;堯_$ItjI.>O<{ĸV<ة1 Yʄn7^0nSaZ7'j$IBMmƹ63|gq8\G[f%I>S!z- ŭC)Ww0Ѡ׫n \]8)Ij,l3M̉0; 1qT~ JiML'KH$i˲Aڶ1wu#_1F, :CkĢpZ&_IFPfaqnM C΍wSUI?7-ܧ?d|Xiz m+p%)ؗO06DwF5F03GGy(I \ /Yp@ACƴ!$IԢGQ@$BҽBL1~ I;3n 1-&-k䮪b'`A'a$Id&6۰sKՆs`gt TBaJ!r遦FCad1Dөw_!/>0A1n"Cyc놌F<4%I =n.RO'i9OuIOJzuLs@t{+[Ɏn410;\mtPs;Nٹ3 }YA%IBMmƹ-N%],9|Ώk[ xqeo16m>TOO[Gg?~-{p"G_o CN|aT}x㽛 >k ?o$IŃ >^5pYٹmbʦ7(~yH$iײ{ 4- 'o5%x``$BIr :45&+)88A'^$Ie&6&/Ѽ冲{_0i7ܺzAE }|y6Sks1 1,K!©CO #}l8Y|yh$iFu؊ju~7)wZ$Ij >BY̶mc.߁p8 \mܗ_,$bL'xq ;M䅚LW\8%IBMmƹM2"9s`b]MRWodOS|c+-ْX}[]<{ܧ T;;>?0~gDsˁf|LFH<4%Ic,ls rm5YtZ|%ILu5uD\BpC&Տ_c ą;<;M9$&mUW$y, ԤYf4.o?0gHy(!⹛D`Dx)٤Euw)ߧ C6e,f+ UO?27d*[C?F5\bnV~81\OZL>CC<$I3<&,^_muxiZ_2}M[$%IԀHN">zۼkλ;SbB8# 0 =L:O:%ILj,l3mK#G,;ݣ[c<]Y\`7}SgSkǤ]} :d^~<^1d~`X] 2C; b[yhJ$Z,մ\Vkig r1$IEŎi-nֻs6p뚄7d{CdaNdt)< [lwI$54 یs[_b66~y|e-n1#Yߙayou&)I4U, ԤYfjՐV)39YGLINdNNIߐyN! f КNkG0&xaT =.| rJcR7y(IOj;u_Sx <=@|%IL,pB#IH=ă[n0̩c,%IZBMmƹNnd|=ӻ0FZ6\8e`c5H-2VxͣG!y mcnrSc4JyI$4 یs۝lgؼgZ$|#[)ͯ3]syS#?et]7%qYA<猿'#> pk3FxT{zK$k`ZT9af힇7U [8]T(\7Q$If4 ی48DS-ˑg|pȔ3}aw9 FS$v|;F_{3ޅ,&-=Z ;F8̘Z(㥆QS ;/Wma<.8XXe$IJ :#~m͍'9NǬ_![Pq]$Ick1<`eŀe8{ Gl=b f`>|'=aV$I`&6<-苘G-ŃIv1߽~,>x)c9oqW|Eo1M6=Z;SH?cjm:l%McaA-Vch<4%ILkYu%~bnܔ:,gqyqycXIbK͝sXU|/(4ݶׅ~YB3U0+rmx\I$5W-gc&ݤ`fg੦qnGgWѧfϱax^c~Ike9]A,>L3s詌ji̿p=~?9#+ߞs_ | Xfϑ.\;x#i7/-d^ \3oGvy?p5޻;_KZ )̛c5s'j{''OҜ9H}9۾|?q}n|~++ґY6cVzmhZ$g9nx/p)>yR6=rLs (,2CI^\[6[OMNbd>cZ [I?;H%O]wW Gr7~}cN֍3yd^UO8R@I$, l7 e4bcn>|sczU<x$p2.W".pu]I7peGH iq@vގÏ1WH mg[IZvBޏŋ7 n;w#j";HE/wZ_ryX2]#h5-I@R{1@ _bxᔟ3'~`Cb};pM6"i+Hh oy(It6|^Sssnw|$Ij`W۶ͱ@ܴ"1DbΠNDkI$iY@hYfgoӼ⩦/(S?Mn~Hf4_㶓L âێlmS~ެYG}5CI׎ni|{y㖏G$I3 1R)=A'mu; &ޙ ]\"1HYP+;d~I$IQ{%pCץyH;#4}P!T='; y-_Skɾt4 8"Үҟ4y(It|)w+e׽̯>V_׶VC I4o0#IY0,Ĵ t8`B< [8^TG^'$IҬ'xy7H;x!lF3ۥL}6kq|ZC㹚0ku|08s@63tm1'.m<4%IJ%Tlr곏s9cpJR;9PBC $q];,Y"d!C"a◔L-[$I$iD5>f8.io4v<ñ/ |ps+-{ݧ5u>{}ggכfSo!&"`!4'о3fx^ o$I:o8jH?|O{bӕ:Wc%Iy0< T`$*qx)s8SS I$*;ځpggc/3- ̛=/=^vx;[=fƱiFϧդݧ㼇$JCP$|ATպɶt 5uZ<5v"}<޷ Ioő}Y`$olc^ lo9y]NQMk;ӫԡ_jx p<4%Ij,!Ўga?sEY,(I3WR3D:Q! 1>yK87oᒽp)_+Bc h>S$I$U!u?ҿLH;}:~PS[<4˯'45">DRoCgdۙ˭_1iN^p3lj %UNʍ.k |l6$I輂2L0*?aߘ7vp=rm )•Լp1 ݨc8p⵷vx g'عGH 3s%I$IRlLZLx:Ḅ|ہoH4}g,Vv?$-Ll}i3 NZd>wٽ~0p'iEw ]ghk;4;e=8\:dl^!uU{O $M@Z~Q6Hn6.wxCP$iT<'^oʞk_pL]:| IԼ[wC Db 85knMsp&?D$I$zB-&`mŶ bN[4xi8g}.˥\ |?f$IdC$cIcOI? Nn<$IZV0RO^W,>KNb\'=i۲,GK$ !\vV㠫8΂9_Jb=k~%I$I$I$I$IڠZвuSo=帷}3|Muvm{=f볰yH/vljoԜIL@KU3=Ͽ8iȊ{h^$I$I$I$I$EYGoq`S.e𵑱})=UwMsrJ͝Ĩ!]#׾=w~v]a8BɄV$I$I$I$I$ɺEN'Se\c*Jq/l&*$MyC M|R)$NjM"-.1N1q7{ р'$I$I$I$I$-uk#_b`%%$pV&wLsʵŒ4$IjaKB$Hr*BC6$I$I$I$I$Ij_ի-׽mox5#ԈZuIR Y`#5cwI[Bs'wqCVŸvWdI$I$I$I$I$IjHZfu5c+ݿZ\8"Vju$IP;z1,I +~BBd<_?q-fjOp&b$I$I$I$I$Ijۀ9 #I ^]:T{0>=6n@jD&'ԌV =N'1O*2@KHK$I$I$I$I$5]ǨA{|e ʺ*] Ŗj9=&VPjDWr $@#8="wF;8:FM.fU1$I$I$I$I$Ijn^_5UV{|Ancwu5GYAc|$I$I$I$I$Ij:n㉺EҢRxPoF*e:%I dBY^P㾳52흄s/ Bp`X$I$I$I$I$iZGvtM}bO )zHRY@(5s@ L"Ϋk/҉V64lR+I$I$I$I$I4%JuKJ)_fAxۣ+%.z zHRCY@(5s@\ DŽf%qP anO(`I$I$I$I$ISJnjyAפ%xd@^$I$I$I$I$Kߢz}d'wʊ5o}7Wqk?~J ȁ0qҁբ@qEžN1|5G@n[K$I$I$I$I$N^v}bjxmmu^ Pj~p'ډE$?|7{g\$I$I$I$I$IjfqukV\1Z$ 8T9)p&~_;Lr1nR$I$I$I$I$5)_slqukg1kgԠ_W%sUwXq]1s[`m$EKڝw}sI$I$I$I$Ip/|]_kR{5f%I$I$I$I$IRӅeu9csJ 5Ij |'-qߵ}~$.%I$I$I$I$IR>^]]/+7}?_>?j<^3V\6 -Ku5r1o17Rm+X)(3mr{ N$&]ib XH ;bJ$I$I$I$I$-J?ۋֽ~KHk羿˞)dz!~+G"}h[K*?4, ;ebΎ]ĘֺD栳,lU̧9&I$I$I$I$IF~m*w$7<I-{۲8tuc[Vh7Ӳe9:kjc!,'7w~8$Ic`ԌI@OI3=H>;@0>u'?d2h~I$I$I$I$I&+C_XLW-)Kq.eqZ5-T@F`KvH '$%?Wrײ5l?Emu9pZb}-I CB x歚۽{ް/^ N1ؠA%yzL$I$I$I$I$I&ŭjc~y*;Ԍ]Q|x]/Zu_q.ˏxYTrs~YB?;;q;7xHBtH*KI$I$I$I$IDe]zh^u>Roea{+:αɉ+~#×b1Bu%߇kΪse9;1|\-Icf4@x0,a; 1šy_$H1qK$I$I$I$I$EPxD^_OMyq{&0xA||xuRGLQx/9BŹҔۇ&I<謚tNg 4r1g|1D/Uk!kSVV>NJy'I$I$I$I$I4)mUkpCK)_y{԰meә5$if'4 8S0.$i¸w8[B37MuP$I$I$I$I$M^ٺ٪5M}yϧy\c%ex~:TS4(:$Iځg؍pf/ }*'_ûߋsU/B(I$I$I$I$I&8+d[UTMin1Wc7|Z :=i^`݆;$ISזEm!Hr!1* ۚV,X/-O$M3_멍c$D#ɣ7p–yyn:sIgbj>'I$I$I$I$I4I] urr=kWMaΌsuy_C}-N$M d 0Лnݎx|x>MۍM\8 %I$I$I$I$I&X U}bIw$,wag"i?IhBHrZw<7GϹ1^s)I$I$I$I$I4)u:5ZlvӞ­5&yO3$IR`UE[w:Ib$!нvy1YH<7Sk$I$I$I$I$I&!T]_xZa{_iv:r[Nzm9GbN{'$Ij ,T _ W XHZ_#Wރ## 4VN ;$I$I$I$I$IjZв"K|~4kۧom8+K$MNٶpaQ7CWWD n^+v=1P]8$I$I$I$I$Ir+kؿ1^ y_1V[_H63qPs@bİI1Iĵ0n}zLV@haAe**I$I$I$I$I[UqمWT t{jA}?]v̝A{^$5BϠll/+v!\O[,:] g]A:$I$I$I$I$iY8judlGwJ7L^>)Vi|&+dy I>i)+tr@\x"]B.V3a#$?\;7?%I$I$I$I$IҤY;*Uk&Ϣ`(0lcgg9ٱw|cg{%yC -ۤ%.CnJ&/D$@օ8l5|nE'bWrW$/ҫW:`-n~J$I$I$I$IIʯ,6XXyya(m]!V9pmϮwp ˎ12eB< J7*rYjw۹Cӱ]w@$!!H !-%tz<$I$I$I$I$I$F 챪 eVjj*7HBcq`sn#/*|&/))S7,bI I$X}[J{~2I$I$I$I$Iq*[ޞ}kTꭹ\:Ͷm_pL̓z$IrBJ,-}=P^&ᶴ Hڄc m9Fr1D\)l5$I$I$I$I$i].T =G?pϭȃ:-ICMİq_/wmslm -ee͒$I$I$I$I$i\ &x-]$wj9wW U-$IZ 'tI1%\tBql:[t?pDX6X7ޒ$I$I$I$I$iܖ>wXmcfu|Xzi~}~I%OTb%q!ɺ xܒx!Î.W@q!1r} ])"t-I$I$I$I$IƩhh+M`gEUeŻ{ ǺSmi%I8t N, dƗ^Mӎ}l#vtvz $I$I$I$I$IR F߰gn)&^w k^뿟Kvy$iiY2e $#O'9B twqpՏr2?Q=J&O" ?1$I$I$I$I$IAM|n( &ˑ@yX-\d6WJZPr}>$Id~-@v` i| ѽm8K(젟q$I$I$I$I$Ic-Z8.b6v{䓚sncǿS#?_$i = eLH s ssl]=-u 167j:3p$I$I$I$I$IZI^Au[s ]=ʊ 6\$IzRi.uq s?:iBb gnFg,천3d/I$I$I$I$ITWbQUp浡hjk1<$_Ϩ 1oHjq1HDc8y&|g㹟dNWM;J$I$I$I$IQ}(_xy(_ lwlKay[eQ(yOXy٤}$I-ӡ']~7#HYHb$1BcleiXK$I$I$I$I}pŃǸba[r48Γ}2vymG3sm) ={Pމn4â$Ij`'j2#3"IZ4þ iԉ$I$I$I$I$IR^Fu{۵7[h樖uאvwffa)wG y^ې}$I-kD8Иdib ;c1h^iS$I$I$I$I$Zq}㭔Y}fM{Ӗxm۳m9W$yw, D$dZ"Z jr;K$I$I$I$I$IѮQ,[[Dؼ"NhkOƤS; 8f2ƥ_<7668O$i$ 4 X\$ @$1 f ]F05r{+|x2/I$I$I$I$I(3UrX kwgByԬ\[X59擴1w}EI^W}=HL?_|Uܑ⽛ y/;x K=7WffITkjagB#ɾ5S*;%j$I$I$I$I$IXU.w7 [P&U7S`Fɱc1|A&wFϛ}˕4+*IK8FsbbD1Hf`n\"1t;&N^X1a\[Ų^RiKez:'H$I$I$I$IF)@ՓGyku{~25wݖĻI,^?lٹ]]_+ILIϤߠb/>-,Ubc*4I1vcZ )ġ]UW{Ir$0Œ$I$I$I$IayUqBcuT\z䘇y3ο_iQUNgq`7._cMרC$W+M-1Dn!q!)[sşSܶmy-g]d< '!@B`274z_᪼m[mGYסFiި 26 4FmLs IrvUw:OU=Uy^Zkꩧg~V*krM7Wg`u񺅮nl]Sr}"6IW,p[oIOʷI㑧i Ira8k^Jrs,Tm2nhPv˻q?fV7}.}~ 3v PMslX'w;]c7)3t&OB}mMg (vbmv+Ip NR$&'c/r'q< ޿bTu\>wJ)=z|X>sU{ݼ4gi}>몄 T̯WÆdSU(:I$c l+)ަdAzx5ٖv{jYu_ra_fqNx4$%~h/M{汗KM\$gnk-"9X%"1ݕX_<4G_͢$묧>:Ku o<@`wk}]s".-U8W~H\*uxb_(Kݯ`bQ ':yG΋NS:~Mhn{Mp{}mrkob`serJh @W@ӵ&eY$s?T_b|>VLĂn֖Fgۣk*z_v⮤x$CUq0nqy'mSI ̒%'98EC?#w׌R _B~v@ڍ;{%1jy|~sXGIgYr!hJԣB.9<~kS0(ܕz>+%JsNћb!N"m:ql*3ޏ}, I1g .fI.5ﬥ/ҧg &wsؕN)ٖhhˋDaq@W##;67tDYVQ1}A.U\ZʖaRǴz S-AUR ŲxEӲV|?׷?Ԕ4;PI\wi71pHs%_(D(E{!Q^}}afnX<<}(5%G}zEQ5NrN֗iP]N)nws %j 9ܰ%TbM9/=׆/Iwe[%=aΪT8Y;Y0rZ`'a\3y==)%5cm\z~.)'2?]s\n~Hu@\J.}6D$OKI*dAS\)T! O%:f& $u|tP6munSIS9yIqj|A$D-kV"C;J__>|lWwI}QV5(4r^Vy鍛;\J'[[ǞCة(K7%i˲gTt+Y]{ܢB4_hvn 붇&MLū}:)F!22&oݣ$iYudYjO X H@o֎ᶓ&eɃYBay3d.=@G_S&I.o-ƺrC6;ۯY'g:y%} z|l$¶mib'H_h THZBI,@?@ĕ,g`|ND$vԞP=x OۧCyq⁄?w%yIʃWh~zL8_Эw,-OտY̲۶mPIym Q|Uc+H di_K1sS@4VV$Qfv-6tU boߖKWɎg.^B=ꙴz:ޕS:SMέNM_jܧ}`-xgcdt>)/J]vy`3 _kLIfVm&ng9v㻜-֦ϰqsFRs^"1k3L"c#޳YR-r%ݦL%iO~WҩR~-}u}ȔUC=Eҝ9'τmgB^ h h{TnO#}%m]dw_dn~ے%͞ =OZ#K%ɤu3ɗjXr~ m{9F]zu%,)ZTojhrL7%]ٿ*RQ=,-?/ӵX Hr;S=OOؓ؟d,q0\=hcK}$Od~z .LzMpڎwi,u:-A ۘXԩ1QƣxݙlVL댈OC,}|@%~%V"]֖FghÉ2.?>d]ۧ*SO#64r%K:W͢ml Th;m;IZձ}#T.DIF"֬6_7[saiь7%4=P~1%ϋ^F'ȾͫJ^m&sIOƅGtGtƶ5JS:w;}>Ifr?d'ӈp(QXUka=}X~Ϩ;Wxm^E/B5Efe|>1].ӕUnOY{.k7"6.ׯ-П I%OҿXG쯏w%rҧGԏFy+y]|֦϶U{qJ]/ί< "_I5zG?c6U(+|T_-4&/˗,,>aT3\)WW7M\$?{)zT>cϪI~)lmiri+ukveҳ6KuY'r!?҈u<$2wu( $6nDBӼR5%U֍DAY'֝90.aw%orm^G+HMw^&ؕ%g3W䛦{{~o.֞b䐘uy$@W1qZŨǁ5+:2lN;-}tlZY_g.ٯ_=QHK}cn5q4~hTyd5yA%q'mmi$+9,=5knreH tk&'&Yd"FҸPNb֖F3e yOB }&?@To`ϦCheju}eK% Ͳm}tmdUȾDyW^uHq4JI:xz$ 2y"rSaӐ r/yؗ!Bky=|SI&_T߆+ ŜHdN`5?VgM8BxT綶4:kC;0R*˒N7FY`Vpfl}]egۯ;eܐ|H_vVuW!18Z|[ZŪ IDATi[0c^ w<2ru嶮PQq1tUK%&9պH8ؓy/$)I;NW8X$-æmeI#Iz~J̵mvL,*+JYL yzys5ϙi@h*|UeڪkE!};-s$ U;4r`3-WRTm2yD;_|i(.|ޚmSd膱+#g2YI\dqӝh}'~İ/T/VaoR}V*Y&[Y^\{jsXF肭 fg-q"I,PyBS#q^oT !n|:څʫZouŶ++H'][&@P,KN4*m/C?)-$gA6I%ǾDe*Z=Dϟ舔L.FzM嶓tDWd۔(K"%% \v~M]vmsCw]z~)k")r7vYϛMrV'@YSX55|Ƈtt@8>ROgasW钞Vy]rs8'}/tPwA^Wtrؕܣmr7 GDܕlmittCׇvӴ}>RT,ɇ܈8,.BwOLzE<^,Ӭ@c|cB/%>r8(^݉~}~5NJUHs78w%w<$}A+t'IRw@'2YXfv9tU((bT#ql>k}9 XL-ra#IMN%M11c:w%r7w%\MqeɃ&I{{kFYc-Qb!HqN{)5++ZM.'qO\/RĤLT޿@$r _BpA 4Ϗӡ/I ._,};hT1%+wa- ]COܓm".?W/Ij]$[D;nO8SK4:j`;K b1>8PZľ-r&'rf9SP-fiIUtcaSK\ޓyI2:o7K]n& :~;گrRM2wy) &z&@siKfݝ痶LzPr3ʋI}~ǼImiR--k񓾯://SU&DL.nH zOӱE\1İۭ|.˚m^x͕ LڷAAI!|v~k;3[XxIBSI{eꪉ], '.g?X?u>U$>4tRD58lg%܋G+ucS"%J2 CbaeσYoʽR.VQ;+Ǥ=7^,8T," ˤ={@ss4rbr˄,r%{ ɥ%NիtYA7|?aS)%ib򇞡6f=˶q7|NAL\JG7erS'r\Nڱe`~˯Q2nڔζul|iC1ղXҫ*08b_;"vec|+~j*o$(Xr]'=i"%nk3с׵MVaMv^'٭oiT<7v%p%ms< :8A&um>piN{9m^8·J{g][ܠΗ5a]b<~LĔ [cobWi:S{a]"!O;CO_g @cXw~iF2RF+7ʯGp?vRޯscS908Ә*Uwh}q/]Rmv ,,Irq誜lS%]zڵ\Owo$r)Q_8Xic~ <~ȣ>evuy'fJݕ|/RjOp'ξo9fBZE6A_h{تlN볥pUI`57Jz \ҳ%SYb; msc@>=>yN54mZIsu`adί}r;}Ĕի4YJeMm!/*Ok{ <צM[ OP8-}KYxw~{yiYV&铚mV)4ӎ?UkyÒ>؎mB!0#4]'m7Frc1:>7lҁRꪕս\k!I1>sL5m^ Y}DB@*RK~Cm>I^^}fU6Ӧ؄ǹgZv>z }#]ɻGTڎOO%=N\xͱL00$\V-rd{mm+^mߒm!tw\Vy6K0,NղO'GsYίM۶][L !wc%&xT_!&oh1]mH`}SIг]-|;ge{)޿c12|>;]9/.i'VV:>~J(\T|\>RgJzhþ/ L Ei^8//.Kh >[>ob*}-bX}ZgvSbf݀[>Ydk[]V!ZMJL/؄d.D]ijK",Mu'-'8-{WڧMZ1۶ j\eƽ>H־ts+mj'A`s[5:z>c.m&{ Tqb`c]]NKK۾+n3&.m}Ku}&&10UIkac^s;=w@Z-~|OI:$㯮-WsnQ8NxUJ9vߢAM؏D =|[N]ʎ^sZxb@%]a\&sb[tDqʪ#ooϗzUcmK%ݚELm-Ecn(Z/H7_tBGu WҦvC}Dvz랖mXs࡚jֶ'K'ɣ#$Ɏ[JƦTC$ֽ?) ꊒMNkzu^39vuKmLZ|&LI**GmI#'u3IT!"no.znIw(K$Oҷ=Z๲eKkW~h_VU$ޙ%mv9N*}mmOj迡H}zi8YXn|;sHZr|&8+"&@}ڬ(+*0};~/MB9(nD?$)iUh'"sQ_~4?QWtbXymr5'm;z05M/xUա1NR%xEc%n@djN<4bm>0l uY4l,X|k[5IO􁁿|؟KUҩ-V9TsWٮI_IϨ9uctӼINYԾ2Ǻu{z޿(z> XIAEI7mb6uפ9rZk{ot2].zצ˾04$Pԡla,-.)b@5))1eg.k ӶO^9.]Mgu/ʺV SICދJh_bN:ı?:X}1́GnmldH<*V &ZOBqi&5?u||Ycwli*= gUM{y&p5}wa/?s1d`mX BMŧ^H:!_Bjb ptnְ4;b+*+_ێqxKl:F91M}?Ϛ?'T#5˸^&iݖtߕJ:Iқ4L"[h],pGc6)n[ҿm=g-g_H&>:_y߶D 4A+] @Ve@wJz_ &mC֣OxÀeNaʶ9фd-MmeɽJɕMO+ǰSDY]TSAUU./ܲRIK' ڥ.ثxO,Q-?zَ8yi=Fcۦ1W840XICq ,1ڱ)y-6A/S(Go bK5&iUO71_c54#d$!tm*2F]{'-`^Ik ima='itN-ض3 W@HFQ.Ύaں7±C~)٨kRR"ڍ5|cw?Tٮ4urIYy.t%o`nP[ƺYl.UW . znD4=1Pܓ4&c1(*>wҖ}{.jDtor~!'uQ?V~m%h[nbcG_]۪r8`uE: 2m07UKmӺwӠ  ; iP71;QY Ny[ҁ-H{5MM$BEFʪOh6}%=/9C6%5%,'K$C;Uib/yO~NyA1cݒ^DNBLN9m/&i^^hQ~{2]紕2WBegjO*v9Asqg+_%ֽmCm %JOaeIHmקM$驕>!M1]qNHzU0|yhHzZF`'mњ]Dͯ+Ee&&^ r'm0kK8dpf%vr*, @H5>3G!vnYZUv*m}wqItTSPkMOQDɳ$Wu!,-kh*ۅXA~]B-AM8leIj\mMVa'85jat*λa?j1LC%}^ͱtQIOa;xژ;mJ\c*'sO+z]U6df.g!ޣ, D\ Em[ϩൕ|dB8As`_,>(/Қ Γ ϗ+ubn[6^U7H@ݫ T_X9`~bϻ+j"7\XB%oJߋHג]~xM/NtXq5hjB}Vb[mJp$ צCyGOY˱_t{ga1 IΖtJ,7Jss#۳|:i*Sz~{Pā/r͒Á?)pQNq U%*逤Q>8jh 9ۚ j뒫0ugt` ?Li:v;(-qjw(M5 {[.Rclly7*j7iȴX~]Wħ.NQ}(I&_DE&mϽSeZEvjJ>o cU.1Ơ"8HM'{M 6@I"%<H}j ڶ.1ǶXhy緷*w1}$VMIc'䷷ʹp)1p~,Żi`;0bu}/wK:.3DuvI aZn}f( f]k:9%cDT@M1%:.m,钾p!&eIum}.>}y_or]z}=Cy*P}J⏱'E`.$fTurտi(ׄK6*_X(גc`:9YmJ^V:mʱfu1gEZS,s7,]iM_%qpyɺ/s#YI*NI >VZ k(y2HZl6uBl:xE;,O|_]?8e98aQa(A:`W 5v0V|O:AM@\l۾h=7Ʉi fM CGL{-}͢$vv9f@HzjsK+宔:۲ >@~/)&:$=tӇS?>CX`4]G'xi[iu,I_}4 iv+7zҹ'x)^ϠЦ*  V'nI?_{n%]ph[E=LxO~+Vh|I ߎد.ixDL2lP,.NEJ@b16i`LºY_p 1+^:Wyb\SjDqɽ=CCPh+)4G^TڼZ(%5}v_zG״7(JkܗKSX'ﺬ"ba5 .$ƶ_XFۺXSu,ۨ(Z}/j:C/ $>H.DE@O6%r@X7珽\M#ޮ 8Y/b]KGW\S m1qt|յ+sIioczsx䜖i"_; ĭw=VYE]҆ZQb.uZ~3Ik2-MG0ArQKo@"QdM#jelbYf|H}rc~ێ/j,ob$o-7퓟ٯFxK}|$ Q+!`d.-i.|]r)h$jOlkx;IӼ&I~N{%%%BU""йg.nx[&~YOk~}]`\|g7Im~|{MЏ؈I+7}Z`-D^cl 5M뽌|S`LŮ`aܵY*6nJԭ^ gLH.quqjo)%ˆuWԵfo[9VIUI/^Fc0e6f@S=w"7]$i쉻'G=v6~ַۛn;s]\ݪoMlmLκߘ~}̶/-sŢ\^-Z_Lpf_|?`ҷ_L1Z"c]U+'r7vY&뎹$wI3tIJMI[:J$P=FmдmU!>nۺd7"MG[ﻟBSwe{`bv?96>R/ZQbϊ~ (RĮ_}4UK48rs5ƴDUeoooêin:˙W& CCV e|oƵr=O,_|tS}ʅ[Ʀ QݯkLZ.oF[]XKWA+N[:ֶUKSuC=`n/q$K-iùb/\Y ޲m]|l@kؘ}ׁ;} 7{ڋj ]jy~r`YބaI~,c8bٗԝCc奥.o0Af~*wѓQr3%n,ۊ'.e 'J7^,ܳ35L~ ]!S F7@EY]Lu$]Yoq?&790sÖiuZ͹o? pVRB`3C?d]Isoy}LYt`}ھMl6)ϬuX7q.u/U[>ڊgc44^ԉe9Vxd-7q{j^;/{.{aeY%tOWGL le4S},5``\kJܕ84Ir{t饧э6XPhrȳc?X~+9*yЕ HkiwE~׬˴D"mYx}IphVJkKK$ ~;뚼]zΫ~vhi%s]rT-w]u+߷ho~S_r'oHKYn]߱"md}~rk{NɗS[M K%2&ٱ/Q"f]O@OML.8*sY"ab.%>҆'^w^}H%v {NޱoKH g P[1Tlmha$jIG6N&v!&>kj/v4T$`& VcH:S!*{ysz[[W r#}iu >O{er7'U$$v*URҠ\wZT8lAu@l] _lbZc6a5iNڠeZ˾UT*\ׁ5֖]b tU^qqCj}kֽ:2T]uSm 24I.uw{O +Y,쓟/|i~Q% }d  [;jEbʕG{"wsIgǟ'__?h5*ɕ+&D#%M="5`;T!.廇 ~ad*MIX6w(_qhJȗ[_MD?/RZEL,;@PKc.Ch׆3`Y6AоKX:MԱ>8@ElvSTk'hIEB)q3J/ ѕdn.=y [i$6^I}~m̔BmL;}}Z{<tҝ@&x׫Q^ DQQ+ރa(dH$]GUUv Oyy^ڻ^C O=~-ە$"`BMmi)t@\SQ*X~ly|ۂ ' fiۿ E\Xfmd&K6cӅ9(YӠz}k%!=KB&sf{\M6K r{?[soQmݮ:#  .FiضѦ"ݨ/.pڭ2Xa!g<&Ö^۠7BOc-!hk#y%~UIDpb6k>8hF*.6U+vn (IN=!_Р][of;.|v]V8L^?z48wqhMز_1պ@iēj#!7hUGTq N\dCt-ܔέQwQ%o;6wN5U [-2sevåVT~cnT B/Sn]?eAWk.h7^Wڪf*ڙh 8$\n4S'*ma]{߆yQ"A}k mB7lPUhi)DZY;uǣS0 Ms2_XAw|-6\?˲Gx셹60ʶZe4BBߦH/X~F2nNݶ%mo}ں IDAT;dt!=czÎWֆ\R}0s's^vLz$يd>nxK%ɺ׳'__0+/^p%⸆>!o&uSXAZoKʊ~NU&6?抂ufsKxs)I&dߣK{ usS!i\ﺛx׽dFN}QJ+co=M6F?U V>7-rtaz=?'3U!E{CtW.m.Bxs=<'cr`n;^\O.۩Wukk"]z΀̨o\/.!P(o*k %Xt((a HΤKնp~;3Em[v|sheg, (3gJ…2s_wDlߤIiBeUNB2e5ʼ$3:|b ZUZ=1lI;չͺf# aU_=l Hcnձ|[t3c(;8~!XeNIUuU s1ke6cp+?+`.[+I'3\}ݜMMk,mk˨:QpIz' .W}/ ڦyL)a,4\!C#:L}T0f4<[zN[$N݊>yoHدU$Iz  ,Ud'>Nخ;T.|(97IEzt'{}7 D>%-P[7X aSEPƒ6By~ܵ9}w" }",8/tTT Vl?_0׆ws0P6׺:~) qN٢drQ?@';ulgnޥz].< Z%35Y H|ZuH?UNY%ϖ$;E/j)٦l_d~&{2snҪwٱW+ ^%Pݑ?O|xP>Dz{ӝ % ]FLCf$T>bXw_ϺVp$ҿ_.:Ec*,ݟmا_QZN*wko՟HgÖmմ4iް\s:Vtu$&?UmEQv=yZ^C:}z٣/ՙSڱMPA",?y#Cū es~N~b ^rK9E\&}Xҧ7u)[bLSuԑ'lIEroU@ ໖AHQYNݼ= ܩWΛckIvdj.{0hR!,|v/_E.;ٵ'OЦK*OF9pZ6:PO'?m/_Ҩ_kiקGAB>ޕT\{YSg)8Nnŋj#c. RVD(κc.,ljXv2!2+i;LEX0Y$K_cUo.,< s̝k u֑fUL^2wJ\¶AՆmviGmV=yZ JC^Nk~լ9%J3-e XP[l˭]SutCnBqlSf.h(ۯMɮoH8M d_G}?dP@j2AM7#m%`T:,y||8j~#7d6 צ@\qf߿n:usܾ]WI2mW6y/iGu!s\3ہ`#$02̂pOɿam\U)UyFn<_>WMN*|6^LI^lQ>"]UtVh]_RE>SH6CiByIzaSnB:IڋEO˿VLlܤ/MZEBZ`2BS&N{ҥl 'Nҭ ٴ箊T -|&&~ֶe,P$ zezxEq%׉b[zmf~4p: |\ }^E#xq=* yimx0 N2~`=ݢU/X/@\{ TULCnNc[,:E,o>q] |~X21[YQtaݖ}.d*۴I;=Ѧgh7vM~m98>&s+:ckYJ]lO }$󊒀+oG_x\7g[g7ຄ]C*B?`wMLukó@f~?Nk+oSj%U-ćlZr,&}<n]:k897'T=IoV(*J&z.ۣgfۚ*J}j̷iIr90[ $slҝN>wty;O(io~us&:(^H[ѣ'F͙PY/ yv,^O!`sިyk_.eӯ!s'PF6ޭ깳 g'8?jMm;*Â}q.mߥ=v8>]3 |m5!Bs?p.)Շu֯8ŵ_un;^W/*hG:{v}nfjN1iRI7>_HYp*9uyv>{~7,c\9 ]<#^Xp}piEeym=w%ێ`vW0]޲*puB+Vnt2 tu(=Gx}{v,r~` }RZl<*] ER|yny>X|E*I?%ZF>~ӹe#ϟIaS>7UشuQZqz..L M6\GUy*ޟTV ;J۶`.“RM*QA1tpT!&tT%]W܁z]:: i3ݵئ*`D~TsU/Ǽm_"ajR5](/^)tu c jn]o&[;v˥|.0 msMWEG ,{7YNm׹3gӫVY N7!OiRa:u9@Jyo//y7G`S%Qp^8=gW%~V{7Uj>l!rI/C Xڐ qpt1 ԍs$8hJ;':I%<'vr~]6@U3a[m|n@pfs>@Y5?MvM tˑ%}X>9&;>ȭq&<‚ Q Ȅ|~~>^67"ռ~zG9}ezKjMYB-on/oW~K6m M·&GUP z]j=ߞLuXNq*$lYZk>{(֪Eۈ+nܐjnBC+}u:.u;n,ܡm&M4msfxBòE^ >I U{쏲0Ϫ>}E&ǥFI~|E__~lô*fwh :-Aa 8C-~U \~c, :*xe.ޝ׏--r-Nv^ +>O+&<:Yr~Yܹ7ۊ!< m |ި Rxj_0=U|SdoYxy7i:3@{פW90KUv r +,c-'K+6 1mÄZ8< ŁU4L]/?oE"{]\mpaY8عAKۊ+&EΛג9ɶvb5Cx-F2糶o\ Vӵ@"$N݇2~"S!^ƛ*IOj~1-w_4ƹu409O|Ͽj{Sh=X+i ۆ!~VÖ{kIB3#+ mu[%sfExlþӵ$LB^ m*3y+6\Sp~ײ]36SW!z/x?Uo#x?*rچ`}E焈cUKPahKzkzfFSip+ym7b]\,Ut{A@KY8uӰU'}LdYNf++FxQ =~0ximMz*:W/UR2rkVݮ]YQ1`j+nF׽m/aap hU`cIŘזmT^%̛m9!sT݀S\]ߌrdq9oԮ }Ձ0 8`ǝEqٔ (ʅ ˂ ymFWo& v.ymf]ѫ IDAT7:0mbܯl!YYbI'49S$7%E6Bѹ8]. 8&LZQ`8E``Y :w 4!P`C .&y.oܲ6%{mYU ߢwI]T~h~݈U]2P\Cjrsye`5::y,[^9x( <6@-I跋ǨK(p\BΆT68Wqrsu)tgzKGNXB8K>[FW5'dME:cwV>{iàcs7Up^{MnBӬ׹umCEdϩ]%Al هq{*w|8w,O`)XA!֩ np#Zf8$F,ZU\*Zȱoq<9Wl +Y2Lr{J$;Yګu6JdT>BATz&n= lC(_x7 _S*Mڈk6e:˹E w=f9=ge)ڧ--HaBȟ*waMs7X nAK~ Z0 &\>4h!BՅ{^9uo2UmEi_G<' ^KM$x8m|6 ;阆sKTQ63 k)+zg"aU{fxLJΗ_}K^ ([>91)j.T &rXq_.="ݜ5sOvdkƒʃ!hW3`RÀiU\Zо=z3E{iu(9Qƒõ*V1[/^C\Ue5O۝W6s߈^aOk# G߄#OO]"d9[ 㑒'D` Cczq4-Q3UœԱgA3֡:_q=9C+g"INƫmVUv\YQkut}ĥݡgd+2sgшϲ[ bM(ͯFX%.]w4U}R`er?mq+VmCǢL\`.N8/^!ԩ v] mf+w]cX6GIY.RݐmzvC7ff#e˲$or/3ԫX8_ SeVo4\0ja}*lҴoYƿ aGÜlں}ߴ_CCK`;XtnJ|N+ř{~dɛ$si+?dRʟ=k{Bȃz;l[Qm};[tҹHY- yN,;ݭl_.9ά;}3Iv1kǷz-Mn:F.9ڞO+ԟ yj>n>cF^[D ,_*;43݈bAH):꛷֬ ޥyXbYűq^CUnX\2\fN.§5!/f^B]/_:zH|n[|Ei9G^_a~z;{*ѩM>/yN}.G</Xae%=8g7M7es-sۮ|}lNiU{F.|Xe;"88m򏟷yU*yF nޚCqvĒ.U `UuA8;iVlzgYid> c"3^0&WsAp#0g'͎u@S ,ry&%]^%Ž9˙t̜( @i`np~nrz^Sj2'3g]ap xF65 oKSs4$=5]QܽXW<~}{R7Ҧ5c2Oc8xsJzmWؼ.,8>֡MA7wkV 4eAYWΪ#HT#욼) }Bzk=)0ZE++HoL:ua`^(2[\EV!KJ&L:mƓ$gN.=) hPυ8$P8|S5vs=uh`׫GLq ٌK> &.Df+k#n6ƼGWcy/*`Y%͒^WSTu=$2 XMOCm_}0gL_/:c, Z/pzaMNrU>n/nҠm^BSI7^^_yEz'OjjgLQI<%;t%'e+nmE$oMy)kZn_7 ZM%>Wh ԅ?cQ!񳼿V*ΙK:MȘ,5K"ǘxYXrMe4'3w.prL>;v6]kio,=VZ)2ݗ>,- 3p؛9ү0"?w9ۏ|N󧴎?$TuU096R.cz~@K4ʡڇMz~W6UWs\g٬k ~\sIy_-A_'WK7tu^) S:ڄQJ|6mpXلv6(33Xxђptٲ~hWG_WkZ|~$W/|:O]ʆknP > rB;$Odlڤ;ɂɺVpiݬ uns=]!^|7 0 MsV*7+s>}q?>-]3.8h²9ju(EZ mKk 6͏z/Wuj3'YM᎐ dN7E:d׿Efܛ\.<]䜷$rYH1 3u̢|pLw>s~ya[J7g$nNb67<Ǿ(nh3#B͖ q1U_6pw3jךF!qKz hT ou龹܌( 7X5?88*O }- [/ƒ}Z%߆ذ^ f0Hp|GOhYw0A;~].@T 4){Gӣ{ὴuׅYW~Xrʊ"eB`cKvg*%UEe< yU\(Hp8E]{Y`SʶBBUp;K;2oi=lm9pޙ[ rBm"[x^<w`. k3?/ŁphgZè`ٺl?Yɪ>Η4Oqˁ ZA0" 6/{܃0unP<כm Y7G:IKMuE[nW>[چxD)kcRtNj W^t_Myγ|6P0_}xp7{kEh{*3Y}=. ^UOWD1jIvm۽Yףzۑ"(7sn)]dkwxfiy2AThU8v-Q;}Rh7 PE6)*3~,{t\J~eZm9ӇjΕcѦ˪ڇ~A5gm_}k_h˙n}ͤq]%Uܬ?iUzE_:;z+_A GniM}zc/БfO.Wp66S1(F_t9fUӐ!7,09m*工j]bV׬QI˽Z᱀1c'n5BBim* [0[ ˿ ggqLP5Ba_B^Ο>iM^MS}Dsؖ,X-. XJQZ^_Z=z۶Ż9O& Ln>Y^ҽ.]'T n2xf!t_w^m_ћz᳤=Y~_qϹQ0!s7d >FMeT|6sf}lgXV}=vA 4I{[q{4JF74QihS(sxG9xإio>7k-J0烩  tc$mۤ;-S^. uL_}ХTߡ7t.$]W';Gs]g2,Dmm:}H`۶cQm#cuӠ.8 X Yy1xƒe_ʬ_ p,_Jtz& }֒ml?ʾ5J4BIZ|Oͯ}ZI%틭R}{Tkr9*ޣq} $Cm6D>b]zr* BwN$|0]8O 9+ts5l;V|G7Gu{MKiՒ׼w&MHrNæO [1`BЛ5Fk6,`vzTf>,* P{D Pw fmoتe~*\dO$Rp3Ԟ~$m[Vq[G~.{0ddV\:L#.>UgVVpLW<]?UQOԟ^t?XLl0CvfOo. ^f'ۡNukfQ^qeEʬU!ܩM.9K\nU]t@;{]mq6 u۞Ev>$PkHh #:^Umյ8'$%xVU5@ۮ=Zpg\e+'eAI^̥)?#Ý<` >㠟{$g&>~ZE_syE׳*ɯ&X֯Vp]4,ݯ: ЉaWvA3$O+:٩/NqT )WNBЊ!}DܢDY ϛ;&tc *PW|LpŒkP<LMt떺9ံZq]@QǹAc]mEa%$L2 9)E';cށ~%^BwQ.|kVJ] @Bkfqݽ]K'o5uӀc`T/L,x]GWћWdv$mZx9ɬۿm7'SWu/OPWMPa]OCH1YÖ_5r2]6;7cݕ.vA4\.N߷igWm#ۼ淖U#<9dT~H,.Iq|(Zqw p-^0\NpRxEm.X, #ttE^n5U|Ÿ-oқ]7WyZd}:zEzy/دئRغ*BNvvYd`]1>&;9Sںf;3se1|BA vh?RƥCꜶ T6-¼ΪV{4Xx+H1׽I8 az c8Cպp-wp ]|u=kIǓ`H?A1@mC8?BGCY3Q~^_\M-Zh!7q3Uni.q@[^A j,ئjaa@x[9z} g `6\AÏnsP`J<dcPͷ;ԲhМ.q`?֝<}9`\0X |jL]4 UvEz {(suIwqLOJB?Cօc/̑Wkvs|dnyY_>L*qP?,@YȠ,M2x@" Qn<ȵ`Лުu1f^)Ρ5 ̻.p_$7_HaA叆<<dE IDATb`6X7~<xSvY[nZ0 ;YUiTf.=g~hpMu+3 ؙD?׫_},:z}^]e4g-;UZ\]~m>EAIZYQT&YZI0 * $ y]68outp/C>#{gҟt)Y&IPfQvNjOtp~;] *[Z[UnՒ3n t ~!9w {eic_7_Zb3Nng*.ne~MxE~B|"}K|QgeEܑ-󳯾y*;oߤUd^nmBɶvYe|x1wViM_d"sE։ZZa`gϯ.4STnfC֭wuCe -ŹxϫyY~xHk~%I?1{b'T'xnl`ӱgk+AhA.Wr={ VS]>M>_oZ̜N߼?/U^l_eԹj]y6;{˅E-/%I]}w>g߫6(uz%weN`jW`=ܻrAE  6ˠ!LeƇ}|Mkٷ[*8 E@͙)o]7{ g]>nzLռWƨC1XEVss|Ęk\qCWԜ_M `ښ$Oj.pq;W?к9[QUlY߻ʃʖ\EM>we={,wX;ޮw^/Y\܋@{Ӡ_j`{غw4((cjS,ʃ{\/nUSmݧҾ~Z_j.IL!l 7ew>}dN"tJ2s++z s%n.LonUL+txQ[!a- \gmoǯj*iMl~kc[Uyp!ԟ}->b^]}P7k@M>a*яQq6[&T-N ,묫-UuQ. 0*`˂zmK*&Ҋ~׃.E|ZM*ڬ. *}ܱzuRQ\>n=VL+I;h(-v=rK֫(o6냗מ>NVpV>]LnPG %$hs386٦BbOE*,̣m vP~>KV`}>a'x {Q~msS1Rն UmƎD,FM.ޯv9+rvHRN('y;[pJzkz`֡kg&[4(Ig.{v:&گX)4A 6֍U);ڇCxC?bU >Zn̿7_ _Zғ|;~̍f> <_BYؠf=@8@U=Wa-V9s -ͻ俘 ;]{Z%m'[Zg"SiYOҞ`MyK+'mx5 EOf(.1:`ck;/`T+;='_?sM0%l&gm+ Ͽ )>5vrH&>-Vvyz#v(>V"t2ҒVlwɗTg&9&o2gwi9ts om,ɐ0O+i{R cT78s{}+al>`,\QΛ3I󡓓|lq&HX.ne/{~cUSsqQ!s] !lH& 8MGN~`P aBU(߫e)ܷEж,q3p ZFˎ%ݕ.vq ϲ"Y$]ln{:@Vm]נ0n\ѱ|\t]ݾ+vXi3^B'Uvթգ~W@mQ&ׅ|BGU(xZ-&yS[tc5` 6V6 :-Vs꣒>KF}:Iks q ߲PGU915K$؎ y[`]4Q֑ dneEѽʃK%zmW72FS3ʼVS \' `mrʬ!U5't C +h [wsiB*5͉d^! 0?.yAMa8ϛ9^6nx0s܈ε]j+pHҿITXM|H }ɯ(ڿrY{!BeEPL~n@h&o2!j&q`9\p P([!ncU LWU=/WX4ܹUPk>b M[8mvUI0oZff>Px|UCv6e(}* fl X:+ ɺktBm ;vXp Cj[m 9F}#Q!W|ƼMUn_~q*8nc `Bm{', nIW8"v5<5}_/U6I]Aa$}n 2|QU61,{$ ,׬ӿHڒ^I?=XN0!,(>`:ծۊ"NwnXґ[S}PihG~y8ى^?8uގ} Iq>~R uQdR%֙ F if]ٜ4ܵ.tٯ@"D8kY׺]oSuQuKDk67r*1N(tB2mBcN';I/:hʟYdgաF1V.h*jCu^?e{Y]7j7YG~hF싹g_0y/^Zn8>txl>'۷GEhl˴h iO}+V6ta $$fl>é'#1/%Yujݤ`Z۠q~~~?rT=?4a,Ÿ֠fl0@aY9/MUC*.yIl7G4kj6U=a7]  vцG[5XLk~mݺ}ZE%m\k~:A?)}V/"X?stj'P,dN]#@8~&576ڶhn~xY1Of8usnyަ?{on[Vgsi)@ PѢQDD:&DM"%'j"6QbC0h|)MFͧ"@ZE*[gwuם͘_{kٍ9sqx?dBb &}/󅄭#HS2)/%l3j"鮈眯Im ʴȏQ7-MsKBqz𝵖kPw7]F?ǵgM!Ctq^{\B!B!b,^~!Bg4|n5w;t.ɡp wøc+z)Ǭ\@.v~'f@آ|{XƸ%F:xO{.޾k!Sf w~Ϛ}P]B!b:nʶ#Gk;?vre͟lOK{'%-}bהb?2:B!B!B}^elR `dq\Yt WswVm0wF9v?>Xu]R5i+B̡LH~aϷSȫij<_2߮v;5pԧr BL-}PՓvTbB9PKvr5ƿyvz@!iDY֋b:[Y]nM]ۯZquk ! ح]׻XA!B!B!_m؏tWNeG/j+"k _ZBy(kel!IhCn޻h6e+'G{W4@lBQhKx:)]SN2L+WoxWK%q8 JK\2G!OBA'et~T^Cvܚ&vvwBcx_ס.QVd׉ogmˇ$B!B!bi%޽%τO.ؙrřm})̂ge7A_nOi<ݘ+sN:w3/R\2B-J2Ϲ¶;GA;|_]yE~+So!%xjuB!aQֲfZƔN^g%s6?*,Gn.m ֘isM:ᜌd$m?k"B!B!BMP62浝^n7l%ƺUe)35C1x(2e۴[>EN!D[U} jO]Ò=.r:snR 6ϥgKXY!"nsuK6]!Wx1iu3U?w oTfftޥjg2LD\Yך.+W @\vG?;>aB!B!BϼY&KbפĎ;VP_C{*X^}}DgT f㻹B ImCa*փV1A)1mQ-)u0H,w={uc9F@psD6tI|'BPRT]uSʺY5G9s5sk/t ԴdG\ ׳q /SϘs\zy֕վXGk-d;? e][لB!B!BI*].P]_&/Lg^ÜW7g);{h)w{O*mA9(|&uK ǟo]Q}9Bǧo߽qx1kgR׈]+O!\L/ƖkG+OLu6\md~ÉXEF]d<*'~rM'=-,=b#Mb!Q:2G=6O3nlB!۟tգX 9Nc}B/4S_,e 3}Ӓ*mi~5O_'pULw%*{~. KȪvh*3n|`/q+kD"˺G8[mrO[NB!B!B13_{%жMm}\{}' :.Kl܏yf;y~#c72T@b~Xxd^TXYD$DZYJ2Y}C %`= 5`]Q2F!MXЗ>55TXִe]LiA5~mf(oRsf653c҆u[@S72wߩ3FhZ֗k2N.1눼-m5fm\74yl2SVSź\f"B!B!1gi\¹1tMخf`x on۟c47mЮjqgxE*Whn/&!"Ds?IX,6J lɰ}0&~TZ͋Ñ×O-eR 1/Ӓ3B!Dz1>Y|;~'搴T4;Ⱥ/5eۥtM" ̂g EDl@~0FUIc9khɝɦ<rf|ta"|aYBCk|!B!B!X7'5tpl/,vnnhRsVR}>XSmos:C>_j?U 7H>r:kR\ !|)&xS׉gSĴ4fubQ(sPM9 rv;ą^%ۇ9Cb/nѩlZ!gο0tu@;Oߥ֯.7u-7cCzEMT.fCu3l k/8V؞rݴD_J/O'!׍I;X*muf5&ڶ5՛Ԕ,,{~=¸k-\!B!Bq8캟;.O{炋?YX;ˇCvkI^OfWW3{'8XRئPڇb:R/kȩl~[r(XSWxoV?!Bq5HEZ꺭!T%CnHj2tuo K]\FSC.­Ye є}g%Z_(,\|נXZm~6B!B!B HJCg]=x-ᠫtF/`?߬, ׎8awH IDATXxϕA뀇?plNbeŒh{)vr~6oTbݡ`峥Y3B:n]rYaLE"9R:xC\!x3|['X̄7@MyCڙN{ݦ;cvi3g)ë+ xCߍgLV8.rv(1RAN,IVX>:܂~suclvܰ6,u3fnp4-E{J'uu?!B!B!ĺ ^yiŶjOES{b2o$4 99|#ֻ~j.SsOyLT Y!o!9lUwk9tb 2bY yTڴ ,WGUgSmfurT@mާ|V'F]M8},ٳ-]~2ƂWULgmBb=uTM RR!3BB!)1_M*iYߖT =oYg_~_WFyvTd#` !B!B!4}v-цx{3w>8rg~jkuKRA.Y[ |A:sPB%))ŭ (/S(jengek Cgک թx^!Xd"L=UI!k޲b~97sEH<&e<Ē p9C`ULlQSQ ](UzPGAЏgff KՖ#cw+49˿OL~u}9Z1ʫdW*LʩR߹.e- jT6q\16k^v0NQD槵6Rϝ!B!BqXoc}l3aek_6}? 8-Y} JNJe!'5+Gɺ<א}3F% ZN fҥ^H:Y\YIqLOc6T 8*TiFגzJc;sQ/'f ;2*k]YpB!B!8,n. l'M+Xv88;#^6p1e9;əY-QBF,k28C]^\ϙή[yrނo {3s^>1'xB%(,J>:G)2&D?daz7R 5Mbcǒ-VzEq<asI !Jwh:$6ߧ*Ch3BQRsB17vb勭C'V"$TMܶ5~@<؊k5ڏZݟ}bUx泹`,c62:&#jIZUCF;ٲ)ӷA|xf3-}58Ε9#u/5NJFƮ"ǎVhHտ4B!B!B.3ֻCY7 ])gvw9r}oro8q9l7g :7$G#G 1޲`2b Hc }W(lo.(~]:0wmTsЁ>Dy(݅ꭲ,tTB,azC?%ˊs&uaDۑ4s^Wk Nu@9`;7Yx~z{۶)tܳ`K2Y;c]tq 洗tȖVy8^LNelܼNmN9gdsqnuE8ٞ-9{Nz 6K? R7KsB!B!B?`=컷->݀uּ{3!\s_VǮc̾0$'9}P}'>#SΛ ߷ N,IVdyb abA)UYDu >#S}`bb mW9y1_($J~,odB!P72Z+7H!u'C[.e]T"{=bbww'֥3k*c[W}rkpˌ\hsAgwϴߘ+!=|šպ6$#ƣ7ԧ3ʄzGl~%T6kI=u)kD B!B!8 R!玹yHOxj@c-~ɄMsIg@=/uGQ3 c,{Œx6DŽ-(ì.pR_JM L*IT|S߸Rm]#s2eOa0B1.9\əNsbf L1磘О ˵5Jn?;'ZY\e}RֺOW֔2$+1?WwwA<`q!S.~F)jl2J>7֊>9)m>"r:s^c휛sީ )eS}c}:w/,:!B!B!'Aj2s, 5: ,'G[x?6mXpqSV+p<-I4m\$Tr ;WW»͟9jZxO߾nl~"N5]ZnY8bFH1g9܎Y.?W86im ԘOԋh%=,1M<;O!H_6 2`:!4[Fbe"7-D e s>ҩ,*;\t>vd.wiןY:S_B!0kvFP7`?KY6m;I,M1\hKEC9gpe# \F+=);l[dC;[mʡd>\J~w !B!B!N t;anߚ<w 4/[-Y 3w]ħ3;+Pr}ҊܓLM#(LWaJ:\>\s8VgDA>{r8k8pGoxԾn6qSujC}!6q d`=ИeFy:|euFYd^MPЇB>DL8(G`q\5:6nz$㣵BmF=m }JkYru:lg~KoY,9mC*k}\>UNs+{CSefJfN1c}o1Ʃ3Ǯ- )7s%nv| 'B!B!Z.Jk{`-Kޓ%vxO8}&)K!D'6?r K=P]q ,rsJ70Y~03DXS=8]q~hc_sA&j.*_]alTB!B!␘#^_BS;Ց[ xl3c^zp{wT3xo9RݩsΩ/E{5BtɄ4eټ ̡u"8uPͅxk_Ýv<۝ wY y.);Ď`ͤ:TѾnUx cl!i9T`9t=t_zdo2Yk !HFx]>SgfL;:3OICYR>R@Rk!QGG,}:Ml2w,aaK]ʜ˜ڵ sYqƶmr/Uʻ.zaK)G\>NJ%TK S{!B!BqhW٥ ^j+l=Yr#~f.8N; __Nš3_O-K<.s;zb%%D;8ddh]&Hx;|ʅU~?|%{!T(٥/iBH87R ӒqۼSX(Sc94|9 !B82 |(>ீ72Q:5kﱲ(5cXeX/y,WΗsfӖs|YČu]2։uP/q X.K5И*qqȥ:wjGX,!CWO]Pr-h/Olj?#B!B!>2]uJ6NOS9{c_ǰW{^UB'깎d5}m[ff}?aeB@8- -ҩ2nĉ]՞ Tsǻ? {O~xu: V[Wu}w.o~6Y ]AdК0KPqf)U8rssJRg!ªW__n~悂RipIeÍX][f>cuf O.s|rCmSs>׺~b[bfiHkLdrj2cL> c±|gܲi4YsuNB!B!␰[*!Nm5EDMx*UIdgQ}$:'YW8JU &"3CTz}w~jG uQ.'OOr;mU.>+9D ݟuCben(Hn|9i+]ԱW7̰0 ճ3΅(CRrq)B55ϵvrlrf±:>cY[+l)+ԍu[:T.}SX]j=L:7[Bu5/w~ѥ,=Sy;M.cZ'|jseߴAfՆy 4`S=g.2oD;v3Z7gSjB['.3ZfV\N't !B!b_Ͳe1;Tgњ*ֽg Îi6_<5Ҧo稁;nMo$ՏQ#6? ϖvHZyYKԄ[;&׿>>?lQ̄;'܁{my (@,R'\_[P67r=.+wב0l!Baљ͢㯭/~r+w*ӰE_krQ XƲu?>2d\TNu?5tYXl1K]53=\Ot:1?Sd5R(MK?K~["wԤczў8Q=^2wg.˼~W;"#ȣ)~-(8k* B!B1MvK/eLe)iߚ6?})b{uq5fE{0na2747sguX1PfwhԹ ^h}6/̢pt{x9 8vGx=CyR!jMHd~}S>;(}R76wB}Ywr#Z/Vܥ\ w*!&[ ڽxH%̔j Ygk%-k:ӖcA#r%BS*H }q̵%rM$)ٷ\`\->,`%XKcwjUG{ZKbO4<h#WS!HLflZ) mn R&K3f;;K;@>^w7NG [A?OUFN}W,]Bq;6ʄ>T.IUi+Hc>skt!I:"[PђypƋF;2}\{u˔3E>3uysĚ}:[|"5[bke+j;08]s о^[KU/ܶeuxkõWKZfE+ɤ;G`k sezUɲ$+l\dwm\T{| *R|{Uʲg.r*’uZ;gB!B!Pܔ=ɭ\}> k<+W~/ѤnwgH~(߭<4~g}^6f!ĨSFП;toq2^6;Ank+n8>m3G35<šReQFW#~@7VfaR%%KAN9őКz]!hT\<*˼81 |Zz P)Y3Aop}>`RU[A\T&:٢MDhcR3Ei-Gw'}2Ub~+DYRwKRg9>fV%ɋa;FA(rb+n.7W9-xS/kЉGXwK~ R %QB!B!a28"ӣRݚIJϤ*{IJo@g> Y~Cʦ5gvݩua.ۦ_\rrw=cú6ԫաl[ǣe|cg g}%!|k7k;MgmvîB!B!_T\nMP'>R?%=RA>ˆ[K~_ZK8Ƒk8R@Xrg+Sqv ġ2ց-_Pseq ޖSJƐmk^!ְSg ~anNY }wsQb`:0w]cVuh9Pldqp3ϔ.'-5KuFιW, S}Nf]lucYsҵwBm[C>`*XܾwI@$iBm#͟cdjՑ/뼐c:'8O`(Б甉uDeوB!Byf[m%Pq)[pYF}w6Dz"uVrꮬ|bb!Txn!cESmzνz9'ߏg;kVkVs.wx:!;c,Z<*9Lca=Fpa 9LF9N Bm~ - 2y/ǖ[xno,\uӔ mǺNYFhJbJ螓c[6l8.>ctsk?3an-^d;mЗwr}@B5ʒm7i`QC؁b#*O#oru1TR']m^KlG:Zt.B!B1:>eXvN{ +rҫ]}~~@bu+CRۖ\ViZUY&ԾEtEus=Aaɾ-΄} 11^@(y+X[[rg;΅C>č7ܹ_)-uQ9\ױ 3LK5` 3}i0([3Z2;\j]__-ך9mM3>q }wsXf.#]OPFjÔ٘wnBٰ }s%*.on[ZFL7P[k)}r'!B!XGl|k,WvG]Vup]ڱkT{ԍ^ýN1]/y^BLXS~iJ<c d_E@'v8,&;CŜm?X1\^q{q2,{5'0Tr qG;kVc|kwdbeL>؆]ĞZCO9ұqʖ<,"?їy{ʉ癪U^>8X>:@òg^.GV[ց%C<[HX䔝etN>|d<{>2GGvuc\o|?w+.6XzkR'"f[Rφ@]GgLhnXruޡ׃B!B,aM{sb=~ъl C]a~ukĶ/`0 v֯ā&viOh\ MLCj;?N3ܐc˟9נ]sۮn`%_%ndc8NnF,TbnẤ~pt\v%{*}ޅ'䎎\q[g9\scys.RC…&C&~}wHYsuk86+R']:|Ժ^JvŜs?[daL-\|LG5+B,7C],ۖ2sȯ 9 D;j=/Քo2޸=T?Z{sq\Ғa \>!!!7[b,#G)/.6X! 郘0a=m+KEsoqNal gd8F/mj ?$V{B!B~k9:&{ב>}2U54 dtܸHɽ\kWzp]s GݙGZڠ<Ӿ:y .3FbLFF2][zgK>sʒW*y2;]`B,}?k2sNC6y$-7)ٗB#r 6Y7\Y{+~(Vx]!U~q-E16J_L鲀J)5zX穒2F!ap޶|{CfC]9fǁˌsfԉp!HxTOÑk)g\ћ,ˑ)e.uXR]RFVR.8 n6COTj5/sp]59j?YJ9K7×؏sV{yLWu(gas&[2Ygn9B5R uyjRkuǺʐ5RA !B!{)Uwfloh:l2Jʙp?:1Q`~S%;>o|/gʃV( ~錫bY}׮艹 \7Yx<7 q8x&S`c*\dUtv9XI3CSiksg9p)R੉&ແ1tr>ϵfw{;-.ֺgjlRu{ާ^sR-ƭ<> uL/\aUׇ%Zy:-͡|C(':O E}&f1SJ_n:N/X#fjhvRes2r.ڿ-X_mHtz227S2dzEf |Hz^B!buum2sa]6_%ֳ1iӏy̵quo\oaNֹ$Կoas+kȰ|WS.;% _à#~@xw6t?dA9 O8\Pgj\-wpA*7dlt-Rw; ܱ`Kal[SOogyޝ{rLn^Pyζlc\GHKѭc?,f)ؖ/8m_EWV^״L_hIJe{NJy}`ͷ sHh\q A\f3ݞ񖳕 \156e>c@]@ekGgCacڄcoZ.SVA;ʐfvp>:(=!B!XZ=\֔ UζxN_]l 1ul]##fO{8sKlI9-}׶?qg쉼mAஆ?abEX%*sNܧv~m*#EWKb#7nbs?4`} [w= }+H% !TZaYY遼\SNٱ{ɁPnl2߽ iɸ7L͏K Lǭ>{ĺjE'g;Fv|0[>oJq+)OI0!\P J*Չ,9FYolkgks=5 llu)vת;5,)!W| BQã! eS$7B!ָ?|Vk| 6m_0N1xkWoLi۵ )1vصß$c6m_*%*k_p2ׁߵ#u"`c1IqYGdN=:#uCniUϹvu2!vȘ++2r3}JDvۀIȻo܎[yߓב2~p͉$g#w>6Pߏk1Zu_.\έszԅz~]~X8mJkЧrsmZm(9{Ϝk(XO˔XWN>=7=1˥l~ uWG1}GM~_n.Ӷ1y׶Wj> F)r !B׸W[̺XOeٽ|.=w6ظ}^A5T7h*8]X8 Ċ9ֺ0XXϧ!Ek"67t:##RY\dP.(VYzb\>OjΎjYʚZ9',ĺt{}O'ĵ.!x:p}b^s=vh+ z_&my쁋g399G_&[b{.xCwS5-,!K^ < k4JD۷@?>!-k%>Ysk}b߱˟ˌ\}*oмu"!{XvL]Xc7 Kt&o܈zB!ľ5oS3OۭkޒtאnN7>#ߵ{4FF/cl6}cArulbWFmBo Vx 1P-SX};!%(t/596BJGC\ڨd;ؗXw+o,SC<ho\I >*3 ٕ.wxy J\z)'PN, {[Z.;wnuBnMW[ZY8g>kk^=]"{6GؾXvYm)%N+s5f)Rc܆g)5\=Z{n{֙:_6r 2}%V%<-cɦ1ƞ]v;ԩets3Q]nV *$}/ `y?&w_&gbЋ|q>,]CH~!B1B7Z9Xld}1\:mk,} q 6oӶktʭe䥽vm{&]J9u_qb*D~ؿH͍ᶀwEm[_:"S]`m}36h)cl},UkE!"52,X7=q3yֽ6 WO!ÝW(^ < g4G>g_.S~/68BczyL?GiN?iCW9R࣭n>O|dkϖ@ktHkXgvؔEb_Zvv4Ck+gi &VrNYʾΔGXV3ȔfYڽRBC}\clT6k>bs/GqE?ɏ\ `.e{&˾RܤUj"v  dn?pO6 MB!Xxl]=nu}nɐm_gt> x=n簱] k733v߽ Fx+F(ǽmr]\6?nxQzUbqE}wHEU0/e,ޫz^k N!ֶ~Wmq=@۫Mղd[ IDATّ̈DY^辖 ol]uZn$aݗ#/&~s 1dTʡąG=s ޱShc7ٲo d/|(J66 .vRF;S{dP9x5áO1p\)!BfKlvyiltxơW}Q_#Z׽-OZM/ؾMlKh1gLsR5`>}_z8XRfjڧ\é^3anHK:kX9 ".rYfA_^ \K\ȉR,#bN~1gg[>rIVB8 >kss3ٚE!z(ew |۷B!Ɠv:/qoBY0rFkNۍ~u2BNq!os}h_XP}d'εe <.(vߛ_}+Hn% ӷ}J})B hf%)_; w^<2Y䑉yS2߿LY|+>xHb6^B>#4rW4B!w)X"w[lLfsS,ү+Ylf߫ ucKZ,{c>4FfzL4;K*(螪:2'dlCb_uX/u,vl=d6 sbc}Oac?OI!>.v< 9mkl 5rhܾ~c!%֩].Hv{X!+C7n 1YbMEqcBue}OHydX;UKL-6~g9'y8QϔPkU"ĸ𦅎|%_Z&ww$e/{4{Ӏ̻o_}|9bQw歛8-NOB!Pjʕr@;&Gr4&l2Y'`e8M6&ꋱsN LC6)Y/ח.'3w1Ri w+J~;냀nA;g=C|&wKʈzx3_}O!B3?OhkҺdǣ֣ۺ!f9Rvem;ͧ7y3$ֵ>s=ppR^ CuuL B̭.7 qĄn,qn#{L!iq8w2neH5ҜHI-ެr[w6ӄn_)`﯁7.`OcSKI8mwp6tfœ3`n}pS`k; 8&oK$>B!X)Gܚt x Hֈn6*Y'bNzl;;T䝔Bv iˊq[YmnXduKow2}ݞv~MB hy !DR,-.!v뛆9,8 18v7óeK*XsF.͹>u3B񹌍3^h,~BȐE>D6ޜ?56QBmzGnޟͻ-:D]Ĝޯ\G>j9&:8b7x~!B!ļЖ3w`͓ۯI[k3s\bٷONѷ]_z]%=t)3,ig0{z+ cEwn[!KX? ,6S~=ewocq{ ygq#~N-eiۤc{%v,BCGsdkՍ,;zMmV:X3Bq#3хw/P>MdpN滏ޒ1x6/"@Y8R6_UPWDջ.^p1!B!B*oC,͵rcFΕ:)9j3z }"% rP:X\aiP[2.>}yRĚ wO^MmLnl!gsী8}ggMv>+) dM!bܛ3Zuv$9-,Cv"RYy-}R}mk:sU1 !IqXxdWBBs805#F\ulKf2 1.ߗn7zq.yg\7l9yq.Rk1|m}"׹ዱ}dnB!b﹕zj}=f9rC6F2߉9yLՎԟřj 'J3bN`-ig.:;.tb.}ُ <x/p ;6}]3{/dAg+ȀG_blan2'9B!;wFZ^!s@sMjxݹ3f6 ]䶝OYAB@LO)!G]!0\xl%CQɭKb7Z5drce &qHFz A7+G.k0]#7u8k; 8ཱྀkoi~Nsl2kFB!B12Z~zp##~ja-~('E,ۘ+Vcҙvs7A,gܔ8(aKTK2~Gɽ<Ib?~,ҹ5u{W@0=lB!z66gЦg[ !Ie<8uku:Oo-y۾v]}SrUޘ̹W!p%U,>Bbwi׵P|]眒t]7S]jp 1Y׻bhٖ@es1g;Qݔ隉0ޟz {0 %Vclk˴!DZ3R}D6`kϼMcnk?88Fn ӕˀ/ =.?|B!XЅVrs?O.!GBr<|xHwGNuJ}{ئ%o2ȀKl_J%ΡȹRfBL7G !QzxcyR/4ʎ,c&]) "&'](M}3"#.+ʲ=q+}l2L>|tcB!B1wɾ,r|6,iX,]DnaCeKl.rf[XeW"OH #gݩ{ii9p6{ .װq@|pM!b:Tڃ |V9!:<{]s}2A.^\ m=XPo~cZ߽VRbs^MB1,FG7Ļu\F.&l^\<oY}ox!#k}fhmr #5'wlxmk~ #l3ހ" !B!o0[In_tCIsUܹا@]OCvsc+R3 +Qh/*.qO# l>kWA.eB!(aܟ}^]dr]/HWn߽oԎK!]g3`~[^簅v֒phB!5#.$wu;qy qF4,_C oW'0v>ծ791|hv#696@s)6Npw.|\\&tl,4KB!BBh-mbk53Z5BY-KBfn'סR\>1;D=S;:C[7'tҠcгC{bel z{wSwn{~0yC 4N!¢DŽVjh?P珴 y.U'l_Vy^xYׇ֔}}SUBYz˜X!2ڎJƩ.:ui1jXa7$𗑱d7x>9=ka~{;dWJ!kb5K_0\WRzלuO}YI"t? xCڎ3m5Bt8s:ATXM'C(蔹XeY5>(ĘF+4|׌eTEd){B L}=ts$Ƿq3_[SN%w.p|?v[̃a7c= !B!ĘTs9VT(:XJKM8a;KNsѶtmC0?SyeK/G:xghx4 ^0f}.٦wp`n̽eB!tԺpMRk̒suD( axck(akXr>r%&woۗˬcBqK@4 !|sD=S]Ys}qEclOqgc1#[7_23_UضCElJ Ͻd#g`;gL&B!B1M w LC[(WI+Uޔ]gnH_Lt l#gL,$D, a'T,{q4tH9ʉP,A^+ʲBx\Ǯpj tkB07{PJ!b ki .Ef9`@g|?Z,6Iv>pj ?@nUʑ[eiABM!#J3^D:udw =sͺ#I C‹"c%,<{bȣ@x:o8m ɨ7O)|g?h뚧_ﴹ3Svw.t| c)yQB!B%sxiambk8rm.bfrֹDKla8Z@Іr֙Zl0VX_{[M"g <Þ79HCɌCo'<n:>B!=N e V7-aWj S~YyҦF:吞Z/%bEgIϣW!!Ǹv9#{߹$ ? v _O ?qlS /-F˻^t3݂@GϜMk(!B!ľV,eK/[Bw?"cC7&Ƅ' c/ƛeyxs\+Sc!蠂B!Bq(q\ڷk+ۚ 9tȞss+],g_ վCd,qRi8۶9#SK͔)?VDŽB!۾|͠?KbX@8[Vw $~v(ho39f=Ɂ[aKrثcBMePN-rM9Y_ގZ!z#߀olȎ!MX) mYy8#$|7<|6uj-s8SK cvB!Bq՞{=y^iT{ke)GO%Ք]p>G?{7o>ڽʹ@͠byY~B!r>9:+w/xe[?ČS\yrigG\qx"y 96dPdwbcAOk8l7eJ 9Dޡ!)B!bPޥ;Դ-iYSnEsLe-ĸr[wrJ;ll!geꃏ ދ  "bD5&nĠFQcWT5kB4AQ@riμ>3{h Gf["#ˀ{I$I&fmlۦ?"ը+b:NoO*)e_bϤ%_ʮnxid`?TF8l`/[$I6`eŌ+xuJ4 cq?:7HX֦K1yI~^r٢Mi%ϠS|Yy٠:1KtsqQ,שHE }A/^llm/NN{BwJpb_<0o)g#yh?~"/yڜ41{z'kD_'^ IDATp2k$Nr\eE6b:w08lPMW粳CY<`p},zK[z&̕":CݹRTuK 8=ݩߒ$I)gcW#lUm״sVg_f}cu~ ?2+o@#}[s(Ͻ0Q*~G$`Whf?AL;?^uF;Fӕ0حT>9N 9ߨ,^׽,3['BTc$Ms5y:E2;DG°h8{T#{~,Rq-~Bm~߄;0!^?p1u^@ܽ[b$I:P7x;#,Nf==;9־~5r_/r$I$MZG;7O粍SDFL"[w_9Va _f^jZk~yXw_ׇD$Id[ǎ#X*fmG`v3O氍|ȴXtfv`Ui'}%RћŊ$is쌴~~lgèa;:&Ruv|ªnu+#_BX.ofde:}P {5H$I97o+T *z$-a'C=`w ;8 㑌519oOưjAzXA6u$In{*Xxxc1g1>Y< :}הr+mV$%iu7Q}35T~YooR _ uk2=Ɂ̹>/ec:8 H!} xIi,|4@ I$I;dtZu'l1vfձUVޛ}fX`{w~A-YNO0"MS˦^sZ~n^S+^A>aDgW2u6&ILIE9鄀/u<|n7FN54$I$IZ$UЗ,wցId;o:, @J {zA6m(< ~UY{zϝ k >g =8K€'t{;'eWcV}S3@S~k#滬I_7?Ev J$Z=g.T[xT \Xov>^?}=׿p) ֫?b@Ida: ѳHKp7JJʶ:Qyevf~|'pAu5Fe:_y-pdknv KKȐw^k):1 }ݖ5-h ɢA$I$idʂiCdeEAem"q㒔$E朗XyyUٿQ7:B Jǩx4s3  Hmw׼j}swu* rENUEs{ m_3Isu'z{D;jf\ű+U"=7ߜq[Z`D,ZĤSUz}*'m?m+Kf0F$vّ_w_>IeeӄlYM~#T^W |؝Ͳl׿&$%ugfd%W|nxOQ|Y$I$)^24mutv 릗E~ovsRoˁu~ \c[q_{lm/4y&\~W+Jh7&JY-u`tØ>ȶM $u tP>Ƹm\Us6\ $aX$-Mّ-CbnT)Ruz\1{&_?f?EXp=/D ~6!PjP##a6Y3b;N"aS;sUSde$I$IRncyvʂi nCaȪ^f[|խCX1 w p3gA1Ǥ賎:hkGɇ?ί`$ISt]E}z~G{\H ,}`kxu-ceklNRYf[bSufR=R a moHH1":!>щ4U/_ªEy#*|u1| ub$C1 ѵ!I$I4CJZyS&qW֥] qdt .|gŠm $ 8m>tv|%"^C&I%Q ?Em=D$ WKagy_Ur I?4r $Ic*KPvR#{YAfB/vFh^^j?<ǜfQN|ORwٶ|0+K꼏Ikj!E`Q6/-ṯ 7m柖 $I$idWO=־M?o?cD1M [U7c8?T>MJgX$2xO?$jcSK'" p_`O`̹0t#q a='V\/>$InG vl>}t'~[qvƣCyJ^%v!^KR68EdЯi^j)+v[RIE I~]gtW3n4`%yAw1Zލ EsO~VR l@@[}}Tb|/$I$Il N5W/(G{{5>gsVk *N }!`ބ@-#3\`{`wtX# ` +I9u|`9ap%۷1N̼KǿNKMӀJ&תm$ib MOLaw]ڶL1hsp|7]1-40mk4p_`{n? 6IE1K Op.{tNfq-W~|RS\] ,o\! J~n|wI qkD]"cM$I$IA:0QФ.dWK~_e6:"B5CӍ VT{WT[*2mCX0Oi\^AXa*:aº:bIT3:i~^Ps |tS%Xfoj>x&?&I .@86;%YJߢ&tT=~V1s>ǘ .1|W -O:A_J׿YO$I$I4'0 sT#20PA`?5%L$I$IR eW@PwȾn#ҋW~88 ئds4Bd:xxŠlT7-$ISe ۶aEVև1J:]A ^>sVJceda鯑۴N"I:5'|C<]%I$I$i V*(\kξ7;b^7N["~{+I!y9l`& fb$I*;-4'Wn~o M |Wՙ[hԣ7yQpSg^p,MR^AȂ)n[fO$tBمuTf?0gN!?(qM^ 8{]s[Y=$XUjv{5uQP5nze# ̳ Oձ.c&s 2l)mOpO%k5 t= x,xw ~_֯TuAK邂:}rMU CIGPx{? ?p ât{ !7I$I$Ij:W2K? x>9ˀ;^B8EyVK;]4[$-n#ТtR+m& 8>Ej;dc(7}\%0'僢?ϋ,A{漰$i)hlحfVzD۷gjۊV|/y7{E?7 > ת[RON릒$I$ILMHB_xxOg׶t[Bw{ q|7 LHFk=6+cqU^NހղeU3ptom<$QUG6d|^M9U~W諚g|I/nxIݫ?*3t+bt3r NL$$(0Z9LɞBIް{% ;E~,޶n:Dk+Ro ,/; M{WWJ>)<Gmu# hZ$I$IQTM+5bizGuoG~޼iǾ/ oeul6h֣w2zGѣs|pƢcUsT38vu,Z$IRq;hMI]jv+c[.}J>8-};"/j备"wr޻ 8ŶLuedᔶoLO$IKc6L`cV?Q0hg _ ^&T73}J_)9VN|/gO39F^$I$I6Y f;*o{&KO ȂjSp27iץ3+}nDg|]\N|a ߪ{^u.Iu`Oa߫emc| ,zߚ%Ƨ^N/L-iCP^3"vVlLR" +*^d[O$IK9C13YHpI!ˁR 0"fCu%۴'7,È}>O|9c={Oo+-na I$I$iԙ1} E?sl[Êkkfeګ>x"p_`[ 0Qvv@- pHB0nsƑF7Tz,:W8x;aѯ?.&S;9{|L&:,8 Q$)؎12m@U!L?cvVlZߧףpe[@eqJZʇ# 21mdB$-C}fi&Sԝ6]opn;1g2طۀ'7D$I$I,@սY2ا;

|_Bx}pO|$IZ*PlJ %Lܢ•= IDATۋIۦ nկn|!ͼPVyqTRQ" MP$i C_u(vB0r`!"\\>L}s6-͚c"( JսplN ܈R>ꏀsH:?$I$I$iU7A^,N~^%jdۭ SA,ܟR|ṟ | a×}Y_k9*{߽Ug?+yY1<,IҴ+UegҢ\Ju-nex 73ܘaW*$5ۘMoV^V a1|uN[-;Yh}$gA'Gn<}$Ma7x>7.%GJou >d½yN}~x1+!ȭn$. 4ぃ% уSV~mys%IZ߸WVގ;BOaw>3/$LҦo'g%m-vc:P^B^Qc sy࢒:#۔|=wH$I$IRYu }A}g5h4}I~x {~ :j{a_q%D> ^>0pW(:uV.a|X猺=تkI$iEmqSY73xn묪6C1+U1ȕnNz2 ܖs]PRk# {0U x5p4Y$ʻغDq\uYTͮ[4Q6˸Tr !e|,I:dw+] WҔQhݳ20nFI45S3xo2_Ux\8L֠JMf/p\eOj;ۚtc^kQ˒oO}F +S%YVIR;V9Ʉ{+h$qރp!~+pƔqgmA G[kt6l6^\{Lᘞ9 lC$I$IfFY~S_B Qު=B_ 1v`Բǭdu+`Uq:nuaK?ye}oNs~. v œq~H9YTV}M;%mQTמV]V2,\#f^Bk+xL^+IN(؞=P>q57f܊D kH$%xʫ#|qȲw^'Kйa4o3n!fi%;foR:$I$I4k٧ ۏ=-<F fa )sv^8Ń|۹ | FmJz dɫV/W3 Ij>/Iz_8jC=j0qSGBⓌwY[Ͱ>,KDg,cIc# O9#:bVy*%I-h8CTEmF 62{#¬y Zum}le QE6}>s #&o ~>0zC%uT1!^YRwmJ$I$IӖ k> BPKQpבztqer m6yX baflJz1Wk>ǔwKy!<}|8. NE{"->; 2*xp%IK,k{pSvԵ` 1߯ޜ.O&Z}0pVIewGK:K&rO$i<FqXA:-575ΫhP_|81m q;y ?oH/^@@‹J=l0f7focNzrAI$I$I-yAO(]Kkɭ`1ACEup,XT|?sEt{ka=Gy8%UY? fGϨz$O$A <*77. f#}TO+i~18C7S.h_|8qb}^\05~-Es7NQ$I$I$izfoR>`\c= fe@C\Tk 26ݶ`{g"n؉iU@&H(Ik7598hRq񏛬cV!lK awt],'KQ֯ DyeQ7Oz(%Kd3뿍,x'IjOQFF ?~FRm> ۼ׭GXo/pmu3Gid^u^?f>bʅU.,cHI$I$Ih4}(6 ӭ!PL;=s5Lbֹ4z3Jq\WVC|o$iʶWMru7W!lnP;.aA^C(p]i!x奛6FR_FV5ŊC#+y$I ZÊnjԽq)au—g u^+a>mj9a6[+WoSC{ʊywspaBY@ixYYE%{zIJ$I$I2fo@= 3ZD4nˁoV3^Pm  Og}ЪUcn~@XGxVIxaaTOֽ/I Ձ2I}8@B˾vy<_pkLAж!{/KKU?߱x}IZ 9SjX썙׿gl.|%sI\[Lܽ;Uamx ;uv,v¤g&euv<7,LN5QIjFcxvkI>?Iufc$-Ō]T_䑱lICWjzILc۾Q^i$5M)_Cq%aૉCur=( ~?"n5cƍfLAu-p\fv3DfsaBgnF$];gqM$I$I4mX">H${O #&_cV,̵5IF+Փh8 x&Wy}JRqUd'.mRj#Bl?'&&ˉYϺb2/]KSz%EwPqOqRDejO$!e[ɿ~-'N70 3GdVKih\lR6PD'mGB[n=xl{cu-)$Lr,6.!H‚D4|\;YWT4aL#l y S'TlMQuQoKkhuųŤ {%I$I$IW87y雔?x:ki0{ ~2b5_j3'CSԿwkQZ#޶z2mL:xm%E9p0&mwZvWWԇUۼ>0q6HC)f2d0o֣zՙJ+:?|/At~*IqV,*[ng[ ೒g= x-k52ez+"#U_p a PpdgegxWR¬=teQrt$I$I~^?w# >Z_MV9;kX{L7>xQZ|{' y}积ߛ ʇ$_ky#In; OkgeԬahjM-os+J{zD:  [[F4rfUDu?l}df~ 3}ߚI"ʹޘ.2eWg ؆;V~ g-XDzMNC<[f><1'p878wr=aoG{|7]F}ߓoT}? l߯U= +UV՝8Y$I$I^lr@7qMJ:mJ? ؎pOq;`G¤ގp2s-gy&Q>]M r7?^R^f߬i供{Aec'Hʝ5KP>M}8~t/;m~YxɫuMp-,xŬ lOjzW^$! %$I/dtYzt &7x%:?; Lq3`WO$E$ILj;ykK--)'n:#Ss`hK- <4YȼB0 FA,:=K`FUR㚓$I$I$O8ic3y,`%rŠ6Yifz;xa%kgW;`kAϛ +IK7ˠ,!;ecrju?CY_|'"hG dz␝9]/=ȓ-yߥ&SӲ4k0|&5,R"a; ; 툛,Bƣ(MԥvaS#8 IDAT4)xp=m{- |l .☁ ̮<8{H ~JRF/R̓" j4鬯tL2r*SQCW"??ޒ# ݿ[^殔߈)t< 7t$r$I$I47O6[yiif_ !aQwkC4IZ^pJ/;߅IJ+)i;^9өVn3o@3)=Qq~& mC/!$:L\i֗U΃ w \Bpؤ:!099Z/b_xDXWضMe?m9/+^{9'TWq>LE۟٫x$I$I$相eq-eZ)-k/}uM--sw.(i{ 8܏5-M(O>vڙfz>CX | {M8'i;$cv| `cuPAײo +OX$^/YB *1+ $qlP4Iۓ0L6|p`cP=+fnFߵ!/ޫx†_#Ϻ$I$I$͗3籟\ӧز#p7Ρn> xO$Mמjþ'[xk.b'^p9k-z ^Rq}XҮs1~T|2z=:˗Ry@c͜UI5Hr+$"*=fp4zGRe Qo#[S<^V,+C#3x9sP0~\g=B$I$I4'8#$ID,b^} À{۳p?]EӦt,TB6fW">ai8cgY$I$I$iT $I.SQVy8u5T&y0j&E(? SJ^Jg[[Ei1 +%u|;AE鏀GMi|P?$c3 mQY5R .1;( g<8ypKO<m piD:V I$I$IUW$I <8-lo|xԶ>$ݞ* (j0U@^'NZt9N̐wMR9mǡN>]'5\RrcIz4DL ) \yF l)HG4ʌ>=pYA9)F:s946Tӝ";bH$I$I4g1$MBl7} k9IIyeS{=:B:AL0 !]uRg/K?F l`ʑgKV vzqc`*O" t{$M,_)7@^uK_]YFʓOfYG'qB:)w| .IUOGPZ?7t;9*#Ω9"`%A=;Ⱦ,SڀT޶|PgIn$-v% ?51o|G~`[hds +Of!Zx`IVL>S$I$IY@פ䵒$i깼t} '2uU;%e3tEW)Z<`K^Q̆U%iAxm<"f8;Qo.`8Ɇag=%hVhi"?P$I$I$Is(f$Mx_v|ݾsWo~KW);jz;*]@QQ>X${6arCZ\]|+M6J2dny󧴍SqJЎeĿ|߀!t`%ƽsK*lziϨ7x<, CD,*pP8)A2x#~Yx0_j_jɾI$I$IT+ Jt$Ww|8w W<)KiŽ=\ɚG@]'UҗqF[n[Ubtv7"%c޶g.>Q~lJoV[4ygmx:aƏ )5˓OމB\v=)ߣ`ߛfYS(8yMvg@`B੃ $I$I$I$Ima<.IŠخxKjo)>,:)?lz@8l=giY@\Tvzn^ G ~ztN'?yIz$s+,-ϫhOH#;DfnM)Ӹ+ђLtB@6^$V`F[2±L[S"+/6*؆}xa~e-ua?7:Ki$I$I$I$IM<`9?1;_M|g`Ym^緻M7Bˇv:Z\/Db5uM3𢊺XEqon=lF[0e!ztz^^rɹuκymw^:,IVh.˓ݕ$X-!̘_4iyuV=Q-d~O{ߑQ,'.r .|ˢ3YtװdҘ<$I$I$I$Ij|806%acFIjRZH Wohˉ ڼkf l[nzVVoh~gǡ֝xcª$tQGgH~z>TH?x[,WK.|6٢`$y# }yܞ@[K2kIFلYpXPY 0myska^{zI };(8r >~C5ЎA2+I$I$I$IReFaH{n&vvI凛`ߦ@rLХx'4=p)t:fB3|uy]='uMn\~9Iuz~mضc9 2z'̲^V.:l2`I!%TO8"i:_R A(6hl4qCS|y+R B v^fZ\H\SG`=baļ'D !ёzbqyE͂7IV I$I$I$I$Im2$G"`K'Xv|6䯷? |W&XFJ^{#}]:;o-Gx$?9{T|60v,xOYQ *%ePxy'Kv~ $Iٻ0ɪ2s{rΑ00 8gM+]3kUsqsYӪf1 bBA 93SǭSsSuWUWU?SOwWWݺ{έW$I$I4Zͅ^_|!1;r <]'eA_#Ǐa`WuAp0qI[d"4} la;$aH9ef pM>\\߈"lmbYǮg{{,+s{McZR97 ldָ9*8;2I2IȨՔdb…^p>^)"W<zm‚:Le-W$u;So4?(V:ɒNJ΂ϵ$`IPiѾL0t$I$I$I$IC/ +y_!4jg"` )\U^$k:5x.: 8[H2zcξ.Cb8K9us*>ƽy3?&6 /5@3`cI@ax/0|Mhf>B |d,$"iw=+<脅h|)Iv0Iꆥ:LٍF)$x=h^Tґ.C}|;J΂u:c:xrOY%I$I$I$IRÁkMYrVC' 4UC Q/ϧW35Y(pn^;/ Vc8ޙoX.mhq!OjX%/!9d%|nv3/su#XJbh.?%04|x`ᶜ @}T6^ϫX3U.^ N)/%I*IjuYdG'thyL{!cwӘuif-/Y2tRuN^WS-$I$I$I$9f\ J/.y$S_|5㵭o sI']і{ v8n<4lvsn<}rx^;^g6\uUC>dpѸs?k'\\kvlOLjTF ʰNl E`_ّ,sV>GjN1$P'P'4_ZκAXrIӨOK%w2"ߣJp>p.ՍIn^f˚Q6Vz?I@z}lYzU_X݇N!*2kRDZt& LH;9{ j$I$I$I$IZa^Avv̄XvPᵒmg7Ujw𨚅e'̯T(f"wXH,Wٖ#IH&IQ ^:,39k9u<.%8ŵf%i8k 1Փ4;E?Urg=d*kHHR ݲfCS/&ɀ~&Q_e?[qypINFKxpbÀs)$ <DSi H$I$I$I$[?x;IB*c6#t)9/zNzf3?^_燫dn6}ǰ' ""\DqLDBj8c#$`F  ضߟ3aZ4pe{Q&i 1eomzpJYD̼m2xu$n6mN2tp_.,8~."$X_J2 gGI$I$I$I_R=d/IWlxG2̎"꾦zބNI$I$I$I $Do$T ij건eyq52ӣs5F[zR5n%:}z=Œh cxQ,̌c#n}^k&G71O_̷YŖ+xŃ`?6ǵhl33P(0߄uKvfE5!YzO(;թHrCJ$I$I$I$Ic* x'p I&?5Y?^,Ccay: V|M IDAT,vy@8浽nn8&Ɉh xk;o/qlŽyl;x}g!&*"@x Kˎ$Ғ5]𥗹13CιItsO̩cj; uy=p&p7Mh%yD6%U {OEՅu$I$I$I$IfE3I2&c+ŃπeODISQdz{*MRo+Y5z(=LHD #qh 6{5pB7f I[DV5sެ݃uYZKQyiAl!MltN&Jg,z)M?&A$+uv 7Н |a)8G$I$I$I$iwe'?SK@¼A xdB.iz*2d݁c  RYfN'^=FjE=91I[\"y3=ZHK5p#`!p@A=w'ϯб8b'( g=t3=Xߒx)`C\:8N 2hs)I$I$I$IHL2.IT_k,9CR;Cm|ccy)*37%U˂??ǯhF{oP۰'7dkH|@ǏQ; 43 eH7>D%bB'6_eIRG[ɮspZdk]U.I%wg'^J7z?GHf.{-gagX0MowuAANq`v=g7=ASpϮ3'x͒$I$I$I$IR"=uq3H2  S>칍c@#"M_e!ümxTh0ݽuPNdL}!l#mYvAH&c$}sH G{c1Q#[`X8䚰xfD|B,nS |BI\8F WmU\To:u_ e]ޏ瓟9F8d6Hf10.Ht~?x Cv|bgS$I$I$I$IСdY\\Oo#+ ?|$h1k$[`+Bq^6O~%^fLxTb\%v؂vM8&_!'xQq^BL8$wfl Y@h&Z43ٲTޱyFbx7I6^T@c>;*Xl)i_ܣN|3&Pg}dQ=l)z I`j07_BG[ۓ>gˏ*v(%I$I$I$IԾq8UBAx%ɘӀ=D!۶^ܜ$I$I$I$IRIXOD st&ȥu__>di'rYzNՕ󠕙[KBx9Cvn*07RxᘃˁsylM(qF`_F@ 3kܱ`c1Fv5V^xEֻ/6gAI]qAEx8$ڃ{uGLHؑXXǢݍ9zc;!ug-땢z`LMyk}8&,u')i> ٱDI0zLx?Z6G\8D跃" kF5:6Π8>K]as-^9#Bb  P\;xB3hpg`sr/Im_bi]duD~{,F4}H2MNkmt ?oj4g,we_3*ԡ9g]i`)@<(I$I$I$I4y,D5a T%ޠnWf \\Ks%@?P؞Aw9Ac6Tb#nBnm rƳd wsZD1ʎ("!:cg@b )ڌ:Q$e` JIOvYQxv?DxcN=H/fmڙ-0)%I$I$I$I( 888 2 U 2l91xF?yew Oaz<%>aoWrMӟyc1b %%m C{621ɇ^xn!ĄZ0<׈QFWͫqفsxw#xpx,?U766M@Ld#{ ?\:#D/l@Ø:dQIKz 8uyMR*U^ $Os~}j7c;$<.^:L1?z{Lqϛ$I$I$I$I/T#|-Au63dʞ0ilzDh=8K)Uh>W3Dޟ7g/Fh W-msSf F`;C>=uK꼈D@\xd73[bf 9=7SJIgÀc;1m^iUo*n>K/o%SPϵ6`pp!mpp͡^?$I$I$I$IW 2 _N5M6nű*R1~0 mD2Nq@Jf⬱{ q+k|jO8&z,cijk\FBɳA{1q!nv*Vq],nE8 88$dE-U-)(z<8hVABGV0}PfyBiڝq?{7km4^TN:4 ?d_.Ҡ<6I6QL:רF2Ңc~{'IV`[WٺJ$I }I$I$IR5[}8dRv;'S6nTx=x-QeMc*|~Ox4񚛁 <--i)[oms;V'{s?|^)5m]Il_NMw\}S}zIҴ!v +vBj nia0$nLvd뷆zj$Ayu)Wpp? ֺ4oF}\ǕeAI$IZB-I$I$I*W/˟([%;am[ ܟ$/=i;YȪZ~˯: &`lG^yY׈vKYAk۴z!/%M0J:͟ϣz:xD39K+qiqu.^ٻ)޶} 7̲ܽ]^%I$AE}.$I$IB韫I&s I2T V(sy'FRVy+I+YȤ*(qΡx EeQ%{ͩ:!=pf_(wl@IFߡ5T s=X-k8/XVI&b6TYVAY!1{-ɍ~k`LE7qi7PzY$I4HM$I$I4hr*c`Ctf.U\ O.L!$/eekd&kwYv2)N$ad_L4'w)%XNgm7[ok{'2r>z6=,$ 4 t>Kr:t+uJ/u2€k/l*B< $Ttj[] kyc?I´."Iʻ?|pd-/ϓ],hܬ1Z_wƣi9z:W͓8_>(IӾܴgEҿG #Ȟ)Hq:@ Ly]<Oh=h_`}}lvg$I!5phFLC$I$IjgdW~ƾ:If " Hv }=I@d'])8$o_HƯ>$دJV‰d=| 8qorwh]ωd o< .[d9Nyзo7_xAS4df;*4~գ^p3P48Wؽp0p!FT :ܣ`/j}x(I$IR;h,$I$I[,^|{]yc g7Q=xs;W}UEkl \~;fJo۽}YQOӧsHc=DO'Xh]G6νzquр{R|(i,IӧS9/MWGmLjTSz+i \KL%m)fH߃, 1P/%I$I*E_[$I$I$7(Yov >; 8I} #= v#v5NF/6YUWv =7?u[,C+8>Dʳ { d’in|g~L [ٸTP-;BTOZ͐n ZJY:8BO$Ign _I$I$IRoi' L/{$K?Nmjwl]՗-k~S-TUXͺʼnj08 ԙx`L R#}'giAM;b#o^7?S)%.5p#I-?8x|ś(l&M1Xڨk1*GY$IN)B[$I$Iƥ=‟,T6xI_铙T@Xe`P9'o}~;IƵ*#| ok;wY;n=#`w쯞>R=p50{cI4lVm n:!z1}M='pI>h$e}k^-WI7Q7s&kasFͰ+&$I$IUe:ͨ엵$I$I }888xB2 &&7)hT$r Pkv` _8k:Ѽrn_D{ך9)^˜ ` s>(7=~aoH9˦$MSivz^ǑtL]x`F4p2XI x% hu,o57K$I&z /0oH’$I$I˨2*:$1$;`:?ti?M>OqRlcC9BXt ;i?pJX?p-}Ptk]>3mց[3ˆpyD SXoGWmt/E{sy3rgkՍrہ& _9z_ie5 3xT |ϑ$I$i4"I$I$IO؟d9~ <G>d 'HfNS]4 *JtL-$I$rcΖ,I$I$IS=Q$1aoL`T "(ř>e--$펅2dkV)f^ecOypS},m@0uBe%IC̛ g3tҦ v4 3$w3TI~|GO yVf Ws:P$I$I?O_4m^}}_|q1ݿsn0@N`V*9X*u֣e/Neɻ6~[.p\Z%I]4 kȏ8o~)._sA_;_U LC_\\^h,v :td'l&E5/7oi<^^Hfhzcƶ{2$I$I)4U,hg֕$I$Ia5 < _ʶ=8@qJ#Myc"g%LO-'pPRf)>[u啭 卉-&y/wo*;ߦn,%*B(Ii9IֱYțϝG벞xe50vϩ*4Pp^F9tXG3^< pf+ %=3VoH$I>hk_6Տj K$u-I$IBIW8GqqXLD8nٜt'i|V_LeAVאsW{ yߍ|f* ;w:ud5=P?ze*A($@ o>-hζ =OgRw30X<x]Y~Jn| |7[&pe#قxH]s[Hs~Fizג_\[yu,fd\V0$pY$IҀ+65Hlkg$ID$IKgI0D=Of(z>[P] c_ũKFyw͉xժfϓcq<281Q3JN8pb`d}Իh/ب_d jv8PQé| }Ny1C_Q>`ު$)7jf ; E}~v% {ks'/4:&p>zpxIc1=؜SBt9)s7Al5uo_+r^ IЧZ$I JYXe}Ofr(($I$I)y>R}J?>773ȃX9w0'O=/~pOZ7-w3k%~K᱇9v-KRY 8X41\[IBp7DZo$\1I`%g $)Xve|ZXOw76AC$IZK ߣ^*R63gj_I$ubY$IҰ zgIc80+=h9ڴ:dc "% ;+9l(pc 5'qDK'aZY^\Jd{ws?뢌cv*ߋ DagQ-2/#ī1.s-/[SP?6?#oL9o]1Y4/K K= :?.7[/D-C +?+׀dgkAnDf~gd=wwƜXUr3If&I oYf ­?w`%I$i*f\4{RWOE_fes[$ubB$IҰ{?8 /ԩNqLD<3O1k.!h/NWs_Cxtk dKxStE-A^0 ,gy' e[v7xr:w/6H$IRSLRcHSq>WRfcIm I$I'{ڂ~RظdmbցXr}Y~Zqo]0+ĄZ Q$3_|]3Ca#¹ <AU@N߀gz},And,T[-6<|tz?`g(c$rfFcL)M=wXzEL 4x~H͏ 7BrDӾ|$UI"~x[29>=s>@m$ee-r-I$ߵXUϱ:__:Ins{I$I9~t2CRcM2o":vZ=ύ@L%`;h?$0\Hg&l"6"v̟\$ ({x?|PU0tu8C[PsJL20 PMJfBIR7S-m\ʜX5%1wv ;rc|ܛ\ K ro>+'1YToJ$IPIdhXy&c3x@$eI|~I$I?ڵ~ω|=YNX73G^4Jys8}%( skğwwysQ;W4>X :I2xI w{\ϵ,f`{I# >7Nxds̻u. WoYzIFysk^Eׁ?xJ$I`Ictv_}ܩ/ٽ'IZYS;x,cI$IAAp'v3ׯwG\ 4zm<.O6xpu(7w)cYLe F+t8d_o?n[w^O$#fXղlڸQ.?+krn%z[~Q]ݎGwɏc`{Y%IMȹ`s.Kg I .>Nպ/xH.); n5d=vF@A<lV,tscx VOGZK%F#TTqr|e >$i-לZa#t& P;?8/k:?,)KEͿo>?`jluz{W:$IAdץɺ`Hê"e$i Y=\\Ձ$I$"/cͦռxq/ qĵF% 4ƻ5 \ijGضls/60& hO.$7>]k71y-^\(n( *vz֥zgd-;W<%se9☈x@BIN$?)YOK.ʸhIW34_s0$J=3Bm`'9u f%Ny\..zlLMub%I$-enHITFE 3$IRx?$I.?\cפ3 ݳ aLԋgDxn;=Nk]ޗr[ҿ`Wbku[;s'~w:mSPÞhʛ?6xj4jΒ(BjR˿p,keej4r^'gX^rx8nMz`qqm cڷ2}PCɽGKCzlw$J~4ئ2d\ r%gl˸.k]Yui$n1lg w6I%mijsZ7gQ8 |B:T\m\$I$Mi=MZe^9$Ij;@$i׃.'}˩Z!l6m4?f57Q%` wm "0O4s2(u:u^Y@U:}NǑCSv qb7CxY}]!"?4 :$Ӹd]<o>Yay?"3 k}$e";n}q%p{ٖmfOI$I>i;F$>_/d$I./.5ԋ~4]E!܅6cU4Px|dX ;[ȓagF, s".[Gfk3n/lq͟?qEjYmOߺxNj}4$ TV?^R6'4. u^x*Fr"IN p+-b6.&K;(~k.4qϐ LmX|N OI$IrU242V~^޿$iews Z#Ijm+14^9˚K2aCNߩ6#$i 1q|#T('{짗{Ba:@xs].'?Љn$i6z(, Ļx> e߫}Uݽx`cYYˋHE_vn߯x8qH3aI$I_: R}nRժGNI}r0yGkEm! [j:_#;_hnnAAIf E$~pS'"\Vǧp|lo٦ǓMmv; y$I$MvTMXGF:yGu++/fMVt; F{-ppNK=:tBݝ51//&<I}TI5>"ⱝif3iderL.nVDYaEܹj6$.&v \8+⯁'dSp!I$IzyfU=˖#IPVRfIɜg0^'BmXc/Ih<٘O$36׀3fX8@=Tډ d:`o=8Vmsd9lo|a_1a83VN%`]&@XqYPZ WlPvkq\knXL22B^$iZ l}4)` 0]qAZ;Y*zޛ% $"A@AT\ $] bbڟabkZ1bdš3HP$"xp;}[U]3+;r'B!݊&UQqwYDxB1F욜RŠK(SAEƽШey+YG !%'H10 IDAT Fyf 9i#B#lpAs4"֟`N .Dzp%;U84aqAPw8A#B&~EJ?B }`jݞZйpoo80_lyQwu38 EF!B!sTurD:^B! zUJ\b$$֕½0`A ^` OQ!V!D#B0 ])˦bnĽMSGS1DQ/̭$m z?@o/TiX-e cL>_%008ʗǢ.biZ-V7 7B1Q ~1"Q/!fp@bti[P Jwύ1 <@1H.0p:hކ=ĵZ!B! zj^gE "~g~_EmB!pErAN DșM_Y%&L/2cu,,Qa7W,UBkqq{.ᠽM8y".걆L@蹌 -Q{xG̾m)z®ylup8<~G3R?1QCh4mk}ԓ.89+𴜞9Jmc;I+zB1Y ^ħ-^qo?Pz.LK+3|!-D%^R{ܙ/YG= (7)B!B46[ĩ1!ꫛP. B!(2h.?/{Hu=[7S."B 5dc^q/#0Nwe- /B77L$86F rzϓ6w"e݋L=n/$w }{<14ՠHq`^<G&, `i~ ;&UFB1al\((c_Nxx~k$8! !v.JIUAȳ3x>B!B!E B]e~k !7g":;]5BQ3!&Q7OI"YME-3v pŷ kBaIp@ ^ދY>>xYppnD.1`{Mb-S6޼cc^dY$y~Ṉ;cfޘDt(L;C1^u$m{*g1ՋY17ݎYaɬ5#͟^LDkg?5O7zv惀?8x8&l|:ag,峉" RGB:˟MbRuŢ1,\lpugm{ Gc̺;155꓄B'GQF"4GD3QGDQ|!,>zmzkr]ae<{[kfkY7Ϝ1zmUsD\D3Y#^+>@'3.G}`P%#P[XJՃЧx|J+w}GWT_O›R;8c{ano\g\,VXÇx̿81P?w3};ݿS= 3eǥπSUD;X|B!Be| (O`Q42QZ"O!s?oC6.'D]2q&/u쾲ue psm`>,h"V!B!Ġ:i ::&*Y/B!D}_߽P2kJAH251aT6C#1}K흄\ @F!Df"f skǑ ˓߯;ǟ絫] w'̱=uQ狀޼NNj ڮ+pGoB7Sƶy׎X9.[6Ekbb\ vIM?vtvO.x쾹(筼_V,`cǁ2B^X(pB!B!Ə:k..B4S,,ChB!.ŠNDaׅʠ#g1Q _ά?xƐq iF !W"`{8FuuOC`Y]["L;(_S7۸2cy}MVu YVzݕلbr:j<~CS-Q!$~'d; f4~ L~ɱ.=KӉ~-JԍXk⾤*sAM rp*F|w+ f?!L $1%0gĞys`-proGY Y(|ei,nQP:;%!B!q &vh[=+z{ !~Y{MI\hoZh)h꥾Rׁ`"GOI*6+ˁgO8m_ !d151C8 (o]}q2}ޚl]&L x^s.*ӣQg|kmzNSl0vrkt-:6tu] !E.J#3 cg{4Xt8^ލ]}_!u> PgOMQӦxXu2zkB!B!Z&:b1I')|1Cu|UB!ţ)h|]R퟇q*̺-1+MlmZvLہ;1F rjBLr~̾~O܋qVY t Yr|~=ט\QźE^߽ 2"h.{AFI?_S]w"f \&}fUIG>ӹ2mTڇ>X9f .%DEF!9bd1fPn1Њ,}l;eg{(v%)9节"B!B4E}+DcD}ϲZuV!,^={!Dۺ< 1i~1Ƅsm1ppOYɘh+ @Zb;ߒ{= ?^CO&!ξ ڏ`Hl)ހ "ɲFJ|\ee( On;vce.8f.C!cnaiᡣ}QygJo[% 1ʌ'I"[&B!B,qCm4A&D7}zӎBѬ,^!y>A}hJf 1BoPqK %{ܽuE?D;I}B 3~ބ.9}:j\7wLyʥM܁v7\y(gzt(uWexziDô4Ba>xu!^CgfHx'h]yuMB!B!I !D}D }TBdGEuQɟBZW} fG9ke{d`!!k=+yC u"d]||?`j/ߊn֗@sUy{2h"O:m ! ֖nc ښޓa uN>|5B!B!B[زcEH6;!냳q ;Gdϕ.6ԸgwUoiߵrBʭbduZmAmnTbTizQżB'&}۠?_kEw8ݶl6O^Vƅa~HuKg:Ck.kI%b הƛX `^yBu\T[$BA,p%Ι 8)zG1A!B!E/*#tѤXW!vy/m}qQ^"{!I]efL3jVsZ"`[`9pڶ 쟫k4,j uQ`F]Ơ !یyt#:*LÎ7h?TV;*x;,*ߨQ~< lGc&g !uy~HEj{<ޣ$ :v@.Wb 趚@!x{Oyd~xF!B!"Dwlx0ӦY!>j[!"ㆲr~QnѶ_x~1jK0aXAerK&  F*w2E%<-JCR3`4m9Ƭ3֠gf⪂1z<2G@ 취cFSm}ǧpi,*߃+Wto@G_5 sB1F)gv$ڸq~G9T#w _Nqdy!#1g;)u0{* $am*z-ȭy} eR]4x-ƘVB!B!hHM 1<"gQp_'B4"g "QɵGVY/\&?upyK!jX{8. i|݌XUa[p瓀0$*aBd)PFZ׉vofrއuW^~KF-MQG"=_z8fw E!Đw!B;</x焳_[ĂE &=n侟W x! c )sE@9Dv;^j.B!B4>ךLb8m<_!~f?a7e7"a䑙c\}:fm*"B4f.ĬXlgQECB!BtOG;3Bngov}B!ĤsOV+ZQѫSr1L,D|գ#0T9\tޭhaמVumq>=͘E/1ۑ_Ә67bI8D1o_Du0IyOu RVMc 27`U(M/@ y-Hursf!zX+]/Hdp;Ni<:@l"_z56'7*K,-wdW "LHI*Ip{Gl8>3^l81.Y/:b<N/Qnm[P9;Jvv!gZFҨk0kV'*ā9-M+n%ӋIg)pC=2>I[s/#L$P{IOq;4pE[*]{roL|G?4~W_y3q,y:Mױ3{5SX!@:]%ߘ*\YV=6gEмP1.k`l 3WcK~y}& cB!BѮnӽ ȣ }I!k7lucV:Bymߣ=r|qԁlFOmu5׭c\3w7@sdc !ﭖz߳wuQml.};~/f=Oj`c&V2c赊hx+oe'!Nޓ\$^.x.WU FȀr~TG왽f˿2nuR~;vWsks78o_͌Ab%iq@zl-. 1܎vz))`\Kډ)AzNAZap/Lp<#ǾfHˢM\&|U{Kç,BY|B2ڦ!B!TB!w!}rF#p륯<MPB!K>L.DuqW?mr4F u6O`wMD=& oS c< [[YV؜v@fH v}\3cXXhȳly[W̓wu{k1$Y,֥2dr @u53F/|t3לf&a+#_B=O[L=)+WE3)!6d_Nf!e퀿@mm>Ǻ S6(ϱA9EY&"l<3eorZ6 _O_t#&ڞe3[%א.8_5A(RγKv_N^<x:p&YX~L^{wꜽ6׍HWWNP ߕ%.jc䤦ė IJͤm2bNY&[*}8&kۘlK>vZ?g&C3:ZM~D%xvO 龭[Ƭ\fYjaMɿӬ92nxX|n; !B!ĸaЧc{.>Y|QtLcBoȺEdg12m1 sE&?*8.VL$9y]l.yIf0L m[/2(Hw!džs]/> Mg<#Lлj^|w c? |k0ېd!6'amTJ';`Vr#`{h0mZHo\,c.a)fsmJ\ D5+\9帉hE{R O.cƃWvy",NlDd I>OyZ8yѮZ[C}H6n/gs;TοX˦ﻘs)FB!BѮޚu/ֶg.)pڎ"o>>(B BQ&E]..Öc,< bm@TpoD2 XGq mMk{ꎔ8h:;ǬMș@Ywt/(k1koDxqEW%ؿ6*PإdUh#y1biryniohڑhϲ^gIM~S!.h#aT'\p=;OwoR n;2H0͟>p66g%!D]̿,y(B!BIQyϡ4 Bڴ m!oFż\1&noBݐEَ,M#n {v }=tuC",t^9< X[$m˗6c't_/q0x:-jTʲi+F+F*_Y :9n5fj;5v(4eU _r+ix@ ݿXPDXHmBcQ}%<E?$6tDn!DQ!NL;$ +p@rnH`"c*8NM^Aк-nA =/@ ƫ~Rp|!B!DH[ MKTo%D9bg.5\B!ĸEsHa3uܻHs,s鰮ϥ`Cz븡C1lĒm1;66.aFkU1lWJ N\qV}fo1["f ~< 1:=ݙ1B\\ <1wE-@[|x7 $ e!ƻ_1"Lea%6Q,Qd ڶSw7[ #s0F'`4}*7ЎNaB˱eNL2ّ^74\&Zb ɛr.%|rαuI1Vmk^z1g0_~<CeX9L0?O j ]w|/Z1v1p 8n#¢1@qͱɵfw0,c¨ O?ёT>  x`e@G; \zx*]7%o  Bu=%fp1U"`==NcF8f] EڵL,eXW7_}> <cԙχ?&3xW͒,!B!Dޚ3#L6o қh~sBQ7m ]yP?:eLybrg5ufe6 ^ n:.UnY>F#d #ePF95\eMc®Sl׿/s1c֚}(9/&49f^ܽXT6031'ֲqc=2}i-&z̖9Eٮ` 2,NL:[]GYVwȮ:,WT366 64p{E@T+W6.K&\4^2D~8`}p\ CZQvhw-T_<&mˀa|~nj2@+1p rO˒AqVԳ2:b̀;=v3Q8~~o pf0k;`}i(kcOՎ !B!UFɀhQGJ$_P!\^|\fO2QW!뎒q%9#nb|apԏj ֻ=?ͱkrS]b`SW6u돢\]X D޹{ՉT~CLgC#JXRhI>Wo'$k)M}_pq?cbGD:`]QA%#[݈.x)oNJd^J`7\2uQ`^ !k,l0S 1XR'?0FXq&3㫁IφFsU115T1ݢ,UAhP=5I}^&_cL.t`!N3c]mYC_Q_F@7Yz0kDq-Q#*ͽ!d5ٺQ4O5(YCz ϸ{%55B4ɖ1V>:w2(i,8K͐z.0c"?Q f$` 4j 溼mP篷URv)jm>//3 |)lrXQ CG+k8ؤ{fuӥ 1>B Bتm~b#aG /uDplx댂å2{{Led^f#s3e;n~'$@HMENn-fئ7` Wcf#G{%dI}պ"GdُlcѣRZ`'eYa]:IAu,QAr6wɲ&c7cc_T+`7mJ&\?M>QBo!e[~QG*ءh4`d+؞\xnkoӭ[b\P|۾c\? LŪY64.B!n_P챠~G0N!JJ9J!7|k.U9zYn'l|}ksCecuV_8[BLZЫpN]x:9рim[>TnOD- pLcOa \q pp'Ȯ.y9}OBN_&D<:xX"#mM0V1kl)Eu#0REom#]y{b'o.:},w k}OڔQc*#ÜZR؀@y\rܓ-F5 }wz ƃ{\JAtt4~ =)IB!BTe^(YB"ݳOBۘSXGZ_AT!b"]&ս&u[o*c޺ 4& ?*`I!ˁNNaCQvЯuɾ1Qonh~L#C1]`뜋wd:UZ&NgU gǁ4="iP΁Tu$ X~!ZꘅE:x?hˀyvdf"EqR6ɵˀo5ɻՏ]wC1'P(va]oNs06+ '3y/B!{tW=ظTW{OtzG Y9ʠBk?a1f KӹyxUT\z[yoK]q;'Mq-KB]"}L4yј5g`k|@mGu/;Fn>2 `njGN3c| aU{5|`+ ;s_c@<8T[뺼xƸU> R2j4vAQe!ntcx9wт<>g&m[}WJ)Dӱܜ(oRCeYn8oK˕U-4O \F]!6U6p8-/<:ln\>:xGGAyx&,y.m*]I[akۘ'+s_0~R(3Df!dyF}BtP?2QBC0U}f&` \~PCaO3c4x>ǘ|Kq-Oț39x320+vS!B$.e;~g!'Hqm<@A@\e !CJ ӈ9kxp5&714jwBnɟErPEc'aTw.sN',!lܾh{#T{`+nY`@=ƶoOrl A:l|Mo{OC 7&O U\mh6:gT2]71OO*u>q*[B4x Q<ёr?9wK*E_o(K7[uͼ4=<` 5Wk}c$LW(6!)1x^D9O\wa&&%IAcϿ!OB!BæDc|QߥSŔt XުѢtk1tsgy9>V)te?0ۨ !B!B88ޜ~chqGN8=EM fRS"œ&ikHB!Bn)&Qq`<<9+/G(}WQxmuB1)D'kte/ԫ?OA"Cs,[QhlgB!\[ѧ~3D%lscޒsDX|u/wc0J2ew-|0nk*?p$UΓ'<`w&WiEe4f#G XqTg%(Cą%*Mt<}'Z ,(E|=c%4߮O ""`oG0Q(Y;-=>~83PƵnN)z;`ga"fa)B!B'Q5}ceA،HsB!EF}D[Q^!N4'~'a\3fnv:`=3yi3:IL `b ޕ|UB) -fiGe&D޸A5{M^AcU.Fq>cGu"Ï4Ύ߀x+}GU}*xNoyOYcT:[uyQ[훷t}[<K sb0yF!&9@GA9]TxG[7Ё=*QeD-;㩚{$TSm C9t<ɶp$Ocj$-mMap)8ϗ&[ |3(c:0S!B>7DV&%#vS7ƸљK' |8%ܠ QTvB+Bq2cЙD7ui^yZ?Iɶf!*LT0Fw%Wa"gvdt?Nc棳 {uzly=6N}טy`#Mev-p pr5f|3F0O fI2Wr6_!D?dL۴ \`yx"\{d7 avTD۱z9,8lx f`>am-T>Jy;C"lQ71-k1*ơV9?lݍ0FWHoNPF]kmmn -% gsq0mb:P#)D2_05g!^b:U5bJvx^T+'9Gs'?1+wda&/4h3xp΄r0phVV0ʗ7B!(ʘWF<8:ecQŘ8PS\#'B!FooQE}M GGAGEnEmmSc~ NKdK~Ǚglh :獓dc.ol !`mDeƐp> .L5;c"(>-Imy2^o ENówMZ1(b ٘NTR]8FJ>_YZ˖ 8y(vm]nyjڻFivKjiQc8ߍDGBQa3]:Pᷮ`BZ},Sµ\2;f>ƹw}$'D<Á -e hv'{ț0o, !¸8v^Cu'ϙu:`ܵN}&0p ޚ(EyE0 cJU!B1<'Ce}ɅS6YU7uJ4βSFLZF!Y%SJQ]3z6 Bq+ƀHA'B!鋾:sDw88~c.^(LGb;> ult.MB̞k0ƼkgD,f*nW׽X]v59v_!FC^ 7c;CJ>Sʳ)]`a1M{l "j))'aK dl~Clzs&5-2g[C¸]+ e &᳁lB!DszC^pp2; ]u:+ĸ?UB.cm0Ɂxw}YWְk,'0z)B!Dkm< 2*r>o1FtgW`"3^Jǩ#1ly f+M_]jLk[PqPe|_Pr+1ƻBKwo^ؼh= L TI몀t/ɻ.^X$~^Pw*q#K j/t"yF@mŤnT7 !~ЗI{S 7IiO1\?Y!pݕF5aA/2Coco\"yysLQYC\U *(K![`Uw{ހ~fmWn sN0DBFW/5v P%=fUUq1^| 9Hk ,~?͏Hzx LФ`UDE } ڟwcm3{ ubO /W潖-Sl$EI&Z c˻|L_v٩jRǽz6=m.k57ʏlX& O>AjmĉRj+OMb{PXа͸q!"wB!Da^˛!D%PqM{Yߔx*& G߂p/f~uf0T3 !|ZwWל8eoZF̲(\` >=f'6J4x0w6a.܌Ǥ vp;l nԁ˒2- :u~HvѶZƖ2{tZ!jBF>m@ aP('<=s~Wй3ʀNXO!2|b9uPgYf9c# `Gܻv-h.ZaG2J[N~ciG`w{ړ.ԯ_Hs Zl,PmYdyކ`ZGD%!mIJHVTG}!F؃l(crs&=Ѣ>oPc*X&ߚ'WYZUouݫ zT34tgHW=UY쏺<0]26?x=%-.y 3*cf/η!u<;BTsmgȘJ{~ !M!:[CP.>å C3.gBg:}mams`Xt-d cTxf͘y{0Q WuG< !~WyƘp .ߚN(Vh;atArƈS3-Yzx ˀKo4>F"yб&8/1lKm{e_>!kKL,Q66:<c X9#!Dl"LX:U0E|Eݏ >--{tt&Ƨ`>#\bz *L[2: )GOV~d-ƨe;&$KaOh6A+|6g%[}0S/ͮ(ss aK~/H d9fAfhi@Mԩwuߠ "K>A<=kO-u+ bu(M=cP4xKZd<(D ȀPԭl1VzD-eh#.:a1|y8ɖB6a'+…i7N}8QD`|Fc&'^ !Xg7K[ӣ}"C0EܖB"F$ "<{`^lY|wR(WSf07(2\7+e8Vl~‴R"O^) laˀ.4nFeɏgn[m(+2y<VO[wg/k~29}MVTTmcX7|:녾m,hu;pw-/{%-2\EBgYg B!Ġr{HlٞQEoZ0۳<۔ٛGu_E2jƷ=$q6aI0Jk0fcpF4Ee MB!cph",¬sE+܈ #.N-J~?uY٩h5*)-Ncr-cq7B9'P~=.@AY~U479r!1񘮖-B>'}LTql 2 uspS-`{gQX]6 qasp}@:sJ˃EN,}%ϻreK_UK 'Ӗ6}Mdաǁ;-QXN. gN;[E-O=xFg+LHF}]%3&"+m߂݁N]yB h@ R`Fw"{V[ e{[b& l\QƊߖx1 ykݿwTeTaf0DAEQI*fqU\5װf]YŜ5G 305J$fp~SO׭{RuWuW~>usM5^1uƶi;|ݜCȬU6[Q\5+^0߫4+ݫ8Ih>M{! y]otj2|I۳ OW˶pT{|i<}@_΄hn0>ՉZ+bT342,H]?R6獋q!WRuy5672[GbQö,\=+ptc0g?[u+ZR ={Bvk70vV'T1Yɷc4|xF{8? S̢ >N`qadp6yBDxqk[Q&5OTvmY5 7$]!B}E U!շIaguu?#P&q:=~ȁD ;ۑlk3U41oe;Gw<0_vGoFFxFeW`\~ / R`p+&5m1Q3w gFBLm/hۡkSobm?.g Hi/{lmT=J m]:=ͩG5{,ɏ]^_|c)MھlpPeD&/V;e=+bi9e%pG݁쳜jxƃح[xW;}{^>on˟s;VYae}Q׺:>|x Uoϯ߭`wT,ǖ _BG-(e u7eCapSK JS(_ͤmoovѥWF38YFN/6ѿR]!mu.'1^]o|e,s4NԼy>Pos3`3Z̳<6tfmck0k730 ؊YSߊQMq =LUBUt1(YoV:w%fOƑKv:P)C IDATG\&u-/]S3;G yf}J?_ ש5Ԟ~ ??`&J[}> Wh=Q1$2 M'<z- !a7^U,_s>frƚϷ+fcm;Ȁ!xs*R[0E'`61N!ĵ]NG&`==7;L _13.nm&\3©;'1Sbz |x>R>]Y,BCDMɳZ((n1!%RƷQ6gݞsO!^g0T{B#}cW6ۻt>,4+ ae X۞Ql؄r<k^z֕ 1+ 53;ƝjoL`f#{J:gIǻʵ20+ 2[9+,z[{>30swߚVӬV68,gˬ̎$UW&Bz6_ jrm=Ѷi_96 7f=gL^Ptϔpu d@7umElP'W'cۛ,"@_\ut/uhGH?5Y !Mr8ғ$ONF ٘K:0R= mm0B $nW =0FcYK cpaaadڇ5AB1'l-1wNO0k1}+Er](2< Ŏq鬓ڿ1K0A Ʃ_^{ȉ }i\E[ _ J~f~y/õ/T4 L<散x݂٬}p5&:F~e,RklO"}PGaD,cj>>(AHcZx1jGݾ9)}cZ΃~B~z_X <ƈ嶿: 7cN~F;883c>26y#S~Ե>6o1|&]V`]{o8bc7o+1^ M6mԃն?-GC`t=?%Ci?Y!mdofDuOqФCͽ4mg8WC0b7ƾK!͍(WM ј@g}jк\֑::\wdڱrƬcCq&r=(D.<ՍHh+='qo1%>OCo&# 球e3l-<mtNe`< y 'HS1<'pvfJ]5Q#U#sY:,x}$Rl\e1G!/#KAe;Lzh8:QG-W 16nLb\ Fo\|G߰H`<(rdT\B11N.G!C*T=izB40Ƒ <'Ki%[.wmy -șE0R/FSnB,rޙ0d ִf.zyIq<<ȅ1N.8<J{fm-  ok#=B!p 8AX~g+s[0k: `.Q({MB6{@8V}UW'Uo ʑh'Ѿ\wj%) D #taIqob6nT=NYKicg7@a"=a>0ls\g< 3)eƃWe>3_0l9Y ƃ+ϳ]*C7ںʳgI 0[wꢵ6v_Nv(񾣦8_LHa`߁oDt>f1WƃB]oxXޏQ ڪvlvv3ơj#YXiU}c%֒r(b;IMK݁ak` oƬ븗wnxz΢ ƅa6^Y_ܾ^eoo`5Ǧf?ԧY]B!F}`qF|_1_7=rseq.G>I.ګ8^N$븯ntI)k+ߪKW}Btrz!x]Ň )~{߹ysc}?w[9@|HB>#JbGt,ԋgDy#mBqz~,h5P_Y`úO`6iKݧX>jg#cCuWFWB2:i)a` cxf3?9pc;fXyIlʡCY#% 1:>#mB!Dc]u0މKq)1)![6l)-1g?1sn6q`a`f/Ӂ15^e\^XW7~VZ![:IU( fO 0Te~G;|s)IuJE<.R7&U?bs]ypQ !ZDES{/V0k1QDZ Za{!0H<A@V}06v4hv?Xӯo'UCSƽޑ6ziy4fl= ?x3 #zϧ0xrz&<^orcܷG?,b"gd߯Da*1mIOJB1:4JTSW:In)ER2!D;ryvm$(􌘇,FCBq>>p\m)@|zB%c Hs9"{ʠ9:O y_JE0&]NYgK,}.~*W o%gq9,Ǭt1ٷp6&ay] B1~<WQp7o|6p쌍1Χ,@tܣWf5eqay!Yc?BwٻYdzY"ٛ;[1=Yz=pPїÀ00x,Zn4OsSuxjcD}7 ~H[ь x 'bHJ|All_pőCw[xx+fLdn1]+$c]'p'?ضvdoK;O8pO|'/:tt3Vj:tX}do!fG &{ԯ!h^gQ4#nR޸DBm.ލYw~&.K< xGNU‡‹5Q_HʗDut=|?k &dVb]JYTڊ1$Wf']0FO^ܵDب:Pӆ:t(NС}:{ #R#~¸'KmzN:S։RʷO7t蘕9qV~Ӂ?gcn:ceVv2{=WB!tut0(O{&{MGx)zr 1lu{Np:k_7w/ab:2=Q"˔A'/ :`&oDg[ yz &dV03IZpZ@)&PsLz[sA CJ?)J|]dSo ԷkOg`t[,>cF܋.;, |=k6!ו=1׻'; s ]Yz !ʲbƠdb2$odcLnFZRxO+:O_2Gs*j'?ah6پNc]e:]Mu'%gh2,M;9V8rnK1kFEjrR(uS ?1bln.Bv|^hOߍ%!1-6 +kh 'TG'R9-y@ff }@zӨWgs&raQIgcCF2B =Ml>ж-BtE1쾘i.ydRdI/ l/hBtQt~[׼mV`$\i?_B1 B1K׀o \gFJ  v :+׽ 3[=QWjn cP4^6zq=nYChM,4=yL #0վaYRWv]E ܑ}uXm_7bjhG^v``Kc&y$/R6TX:Q4]ƇhkJfsgC!/BaիEM]<lU/GW&/;Ǣqy!+!gX(gZdץ]Q }S"]f5 T2ˁ0k*2 zoie,tns4va^ga$1Nuo:L[#!Ӏo5w&Ӛ?#Z_\䘽pޏcNcR7c?Y"B1+Au:39PC7=ya"U LdS"KiBo4-oznz*t?9Ir,4+G0x=y.e2~|3S E#_I-\~2ΎɊw+ui RW0]%k|7Ž*2 v/k`_&~B!41?t-FnP'>gAȺPB$0:?S#nthޣLRߒl0\}GEҳX m`9=nD"=0+1@{qWq;Jy}N')d[r`3fMlXX60,׳mt}_YӝWD]1\FxD޻%/B1<vP{(7 wnl޾bO;0{*fѕ 2㾀32<{#E- X_"kMb0QNW!doؤ,1fJ­y,lb>Ǯs’QVIFޕő󲎵5čnyN=CoOBƃB ,!{c&`TBSs/ 'bh"Dimǫ1~.9i|+`<#J8xfr>)m\mB*!'\/> `>BJz{x06. G JBȨ5,}#8w=&c}1vb roķ?።(xRwhL B!XJslJt]ss(_Bn!!7Ӿ~Â<B?Yƾ{6?fk暛\:"fsڼoOL*RӠ{-l}+fuޞfKn+}c c~; r 7ڼZybߗWo-}!r>:S Bh< ձ%eOU"N_I_:sž<"xx[{#Dw(}+?~%X=ewyU}!Eb֔o &*+Z[NP/ [z7(oro@jsfBʄĢ# IDATA͓ !+8c(x PoNvq?C5: [Oa"/䫋me44P^?+>ptEـ\GB(DBИM, [玘k0^O~ QN kޡp1A׳i TY`")KFUB!L<ʦ bX;Fl!)t.̑'>Ss5B1o{`>&]c˹AWBKK|6bۈ)ĴA_P0SM;~!5ͳ`p}3& <#bݽ,B2J%v yƒY]D𓒾gg?\10b) 5pYס}o#zu˯(˭5>GpBUy϶a=`A|s5_d }m-Wg%_YG1Ǝ`"}:qՍ;c1FO>톄кx>r2=fg9b$[*{}c(,<'o~vXSπkc,[M4a% !B,G޾ ) !ч5tl5ѧBL><#кli^1*K#D,e +Z_hY"nva-1jC:ohȹHs^q]!n}f  C-scC!2&N #lbigEΟ\bG+]֍!t6G2cupHr[ai0Ӥ 2`H9\2 .$Ty qe/]78> ?Ÿ[{2dPo~j7~2O \)c>` ( |IxF`+28:(krh!EXhGX_JK#]&^+u,֔NLĞ}Ϧ 6-B1M:hր^s!D7yLB?+ y%w !le>iezX43.fwt6呬gjLo 9qm]绿 [C}gxc@u$|ϔ̻n?dڊg0XX&[7k͎6,tb bu;g3p+;qvVlqIgٜ wyḲ^~/D{ȀP,!G[]Gu#E#y; 5`/LDbczW"Lt$D[<xG:%Hp]#(:[0 c<6m޹V{ u5OB!&%f \ א57P7"2Mzyo7e9y&kޫb !fY/^>={e_=mZzmLOwdC=KOeBhM8&݌Ut20BO(= ˯D[Ϫ8JdI(0ʖ*;ιXJOoqs/ C_ |Re>HwJINmszR~S]^yjDo'$ L*vdyN*a3s#|B 2 Bڪ1B5!TO܀uC Ǯw6O<~þrU>)^zJvt,;sAߑұ_%-w_;9WTh !$``B߻",s\;)oLyϷvKe[wS‰&˦|@]6"Ujln=6a Y raZp/L@]!hX!bT1\^B2XsB~ 1c.6oG?46ČE6S !Ĵ!ټ\K'~ryP:6(^m3FhMIAbm[!RuTgq';)V#nue3tzch;YMk,U#Od5akum p, {ϾW=r޶k}mVVZu깭 n)}.+omQ#sfj.]2ǜx`̩'e`W'! x\.6򄺫q>*O>MifDZy&ȿ Q7o-ZZmcUh !$`/` ]A^_5ڋi]mnr=TG&~}){b&6a  Ok?n,}w7z0)YCmŕF !B1,`: }*>e9&Abj^S5m(A}~9IB1j6Ɵ: Cx/+g2LM)2SCQ`̈`(Kij1#_Z=_f8Ϝ}_fmIgo(ognȾl\X(~w3f?zFz&Z=6,/pgq`{}s xi\}^{:'0FlξG؄ti_DB!B1HDmE&BLOP!ˋyo\FVN{bzyQ2#իظEz1I1E|):}wEwm L+ R]U'X0(BtyQT4+dF탇}[}R1VɘAVR,=WW;4/Ǫuow[0FF7ǭ =n`MD χo)*SA۪ct+;i/̑=UG=߱H20-MkJ)u5-`{j6g-RLT=mmM B'\ !0sˀk*{FB~ET $z=cJy3Y詨`gptYxR6 ,Oy^R~Uv+_kG(,R8,B1z7Ȉ{픎 tw<Пba .'Uu=Շ"ԉ03J EW߽bdk`32Ҩ2QUƾfBh^uPZoz=HKyA1)ʲШ}q6ʘ1KeRB|d.0' 'Vcuiv(z? 20f'؞% Y.' gx-Hx\mm6]Q'T"c<~0x.yx5fv[׭~U薠+69U2Q^3a%j#X!U=V' H3=u6<"Թ6(aOn)Y%0-pp6x0WG2R^/Rw&z[rO_~pg;0!B!ړCN(bX:Cz=]2؆XtWt$~uS,.d]6Ǩ^ !Ω-w_"<6gozQte<(%#ܧOqkw귘uL[%L,~y9H/l<@z2%\mfߟ #SHX@t pEĴtB1 )ϘP=z0_e ։W^_ZM@~ sͱor $[ 22 BHI2{ӹ|D:3;VGbŭvI J$Y*h:Q} {&`|7O)]zQjx}pctӶjYbNǢ/ !BԑSP]K}2\ !&SV?#wwu?BR#.Rn</]k]Ns?ߎzQi߰Qx*M(Fi͈G}NG יm:+y'՘>2|(m4mO;m3Sd-DuM+b~JuLޏ1n.kU|-ߺzSH{;C5}ё)cgcNR |cx v=Lf, /N^/ B^! xx "?-`{B DKV#Oڸ2+R~[ńtxp7뀣iPsM +S -BK& c !S7s}.B8jm/OΪu> s ԖoG5JLoFݻN(mNC:C9%[ՙ|1#}Mzud#P4"8ՉaY~Y󼏚B!rͅ;;aoSDȄN{6u X(wndE"æWwV\\x2/pH9dz<+ܯkʵB!&/KQC2t8!X{vX9 mFb F:7oTHf"ԙmZ6xd~rܕ)4R\32y2U^󾮶}JW[Jda_^mRʵW6dPzhܛ\y('%*K"]kf{' ֎\rfhmh3n`1$uS!# tu&.B,Y57VeT0߶zO1p?[9f?Shg,S/uhF3}QNy /%atQwcm?D WYo)x]Mg3ftm߰% k93}onȢ39i@<꧔IFׄhaz"ܯ؜'(cLք~0-nOlnB)䃭bb)[Lz:cit׼FfO]6tpԁ#~ӕ'y3&H8zLpN !ZĄb<,5-q0+0latnӾ/׈zpw'&r>N(}bL^ΧQKZ\[l5>x~-&Z>=#gl:B!rTL=BoEl@476),mE ڄ|U_]&:sz9Ta:F}~϶6I/Jp4V}\jy#)JM1ڑ~&ddT(mdCQ+uц<;.ݡi:c(pW5s!bIR n> ߒ<:EYW'􌷵=R?ytPdkMGaYB}tYٔa~3=6ӿB4( !BqGKJh,^#aЬ 1./"l:L޸&=mt16w /M/5M(]B%Bڌ*l'50~!fQ# co:@kFلʺgN5 9muI[(2 Crm),Ì㾶^Djz-= |-ꜫnG#] ]dѠk.G,"m׍*ƙqEk 4gز>\Bt.IwL#m@X.a#fcH{΅El3\ 2C;8Q^o^~M6׍o--"*) "='1/\'%vΣHs30w&| q1FMMyY.?2c|4܄gEtmqYquc0^׭u+1Q ko%}#XYdrT7\tɅm8ؔR +)ƂD~?L"Q-a]"*Twƽ FBJbc°mɋPN/ u$}=HM\!Xxp dM`[ez`qpAYW}57dM]MA>Ž[Eyȳlˀ; T@(0KIF!p{7<ķxO,>e7^PKE.GX1+T#ZC(1Oy˥0Ɣ{20mjXl̰mjk'U~7`m= IDATߵ*?BuM܅/f 2H߅69d+!o]W?35I!@d }(cSJC5ܻ~;:4c3i-Lnm0OyuSnwyjMC C-c>\'^iȱ@(b=lB!4˧)]{#q3p11ȱKL&r{s}!"<8MGߞ145IJT&6]|Q}ƃ7v0o]FxEm_C owRNW!1 X L*7XP$Q@ʟ7aRga}֡|pGYoSi)P,n1JmyoD׀,Ʌ̖1VcL,G]3)>حOxQ "5}\MS~FmC!fŠP,'MmkB!M=1yhd9%M!o9V4ǫ]sB`;`B1U|Fʁ|tӈ=cSQ #?.uM,]*oX \rݘ`j{v!!Z@ޛb d{˻/NcXITw0QU|BY ЕWa cpj"G[Oք:ʧWerWbO=ئFQ!1(Re?x&e7 }s||\\a]#q{%o&aD&j#-Y෱oz*Fyu%KM/sҿz}DB!ږ{zgԯ\R FX)!*d 3ϘЅHA%Bq'- 8Y:gUfd>ӕM<ikiyb1x5.`u8v\8=x{>׫1FM!u4EXV KcO%(YcC@9>x?&Ra{xr0Y?ts= W{nc6WCJt}9le)xƶ Us*kk՘-faq\jƾnWw.eRyqg&lY^i(XcU/tU X_7WWb/+}x/[kuC!0F͡ a!&-{Q 뒑B1Ni9h]~Ms !,ub_9!b^t=2j*]G_>u#q(pNM9MK4l]:dg)XyOvx&@$'FR !jB1q+B㉄gaD4}Xͣ (E]**WV?!UWOt>Hlix^ycj*w.n텦k cXlYd V96t j[c #*7CFux]wz0vNa`xW} x` r) ;iEܞllz%01f$ t3 'wXRپ6"p!=eWRt:zJ}!BI׺{LbB =7Wuw}P'ƭӰSN!WW 9Q?qtA9ۈ ]bs&IM4UKg;tryw??c3Es^mG6!XBg!\<Qn!|8V&u#$ЮȾp)~iL#`_ϳq{ O#i za[H]5c ]AN?1̥Qz,Q oJ~ pK‘߈(ƃw:^n?dr{,(G+mXcˀSYŕ/վ]|϶" y`-&!> _{j5kB{IɿSαxEESb˿Y 8@/Xdb:2\KB!DrnI}꼠k> B!Fϫ'}{mYŸG{2Biԣ] r.&=1NWa Zrn*#/py8nյ/xp,KW+XmBw߯A!&/'֑%nkB!ڒՈЧsۄBL_3]ҷ}`B13a" 5Z#>Cyۅ]_}2cumz.pI 5+9% C[$,1](.cq0q:i)ZEB0W\J 1/hƄpf㤽c0bgworgLdvVX= ]s/ m)2OD"e1בP޽xso;'*u8[U>1lp{c1 cD)ElKnZL[0~z-_$}RCu]e/<W7bN%Eq#SD!>"ԍ;ag?z~Bsm}Fx|Ϭf?'>ų^ڈf 3jRmB]yw`-e's^ޒ1:WJ=\Ju$<#eo$ҷ>/&Ԯy) R(e|M\|y N6c {NPvc)dp5Dbl>{++ˀ#Ù#͂_^IVɷrwzYhyB?s(&S|~:L8Je؟`iq~vd6 \m{')Hߝi-1t:^|΁=\"v 5nyƐyo`_b vWk{~"śXu٣Aѐw Cc=D,OJ~f&:{"q"y7G5O^ I1/{W(,鍮:;C??g]+$U=KjBp(Y^kFB1{Og#cưk55iW^ϔ"B,=CNی0իVk1ƃQ~(,.3ox TeLX7]Scyɕ&&*0*o<x{ {D#noM3D`xm%oޑ']uxMcƠp/zEmv&br+f\Z}1y7c"^i[ \1&&BjppizێSC7J!rm2[㢯 Ʌb!|nB!D:WʈP!fw;>C|h^ faD2r}'B,ub.C Ho=joI|YN̼ S8qH|L? UqX,Ago=awu0|en e|+Br/!lԛ⸅?cp3;9(e)8uC#Lc(JEx<=59AS΋=i;ޓ csyw*&$h4w}q9fGv}a6;-0 | 8c>G~#g2`]GKufn-X|ֵL>5I~;oС;Gm5PG}Ƹoa<֡C:ttWX?|CiBQP}eSo\lZ:tСc$8Y]>uCeJ_c^_=ƚVu&6&'Dq)rxƜ^_~p+y6#B;cӔ]¡5iww=IQj`ˀ`}Շ1ΨD -翏1o~y8p&vܧ|[W9&Bc(x|ym Y-2EI^D5]s)Y1 LֽpؑE-֏jŨF)l0RwYk+z> B]Oq.Ĩ2\FN4NСCK$MB1[2vYi?=Jm%j#n>'O~*ޘC@{:otݍ&܆j7By!Rs *QP+|.e@L-}!/mux3LAC޿0>]L$ (GY%@+{5 |v6{T Vr&,n?xCa XP>̖ߵ HsG !WY =%{cGL$Խ0*DNg_e󞀞LH9Vni;Oaiؽ9:RơGya0O>W)>p={ԵuuZ{l]z`5}֗:uVM7'4s2nݱ,U6# !biܢ1D8v'Lܤ>f\Kb U?_.ug@p}>ܩMA}*)6-7` H紨"BybXZm&BpV#bzY'zȨBЬ9EX!Xi_[aܬ3'ĽAz5I+0Bu(Gz-MRwل|{|ǹWttՙT !N!AEX(=Υ @)8xG] -6۴OLds̗[`Rk*3*mxrdƈ# Gj )ok<+4PN |znT[OjǞ/ߍЭ`gc)]yw"aliSBa䮇$g`W(BuŦ_3 1Psq+ ,t<xl5\y7 x3%x2Ƴds & =;HF{*뇌Kv-1oasNsȂM #mg!><6 3bx0&߹vs&yű&()_pٓ0-~;c`xbێbcg$ac&w@v7._VEb /&^Zgc׼+wg}ք9ƑAؐ7)/ !Bzk !@:OYBOp8~NjtWX8w~Y/@ډُ3\CI_7$o;ԟsy\j<5ްսP0AQ8-3Ϙ+E:_!vZw,BK?QV_nPmn|b%/<= oYjrîb,]| ǘ:hP~eDzk%#Ԇ" !BG΄.Giҁb w1`Ke|+B!S4\1vѵkUצO/(޷W,cjqܦ4mD;Ԗej!H̞c,9p&pv2fHpQW6䭇tnl;xrј} >kS !V1+UaHAeR`{{@UBF{ (iDddkXI m[{=p;C9pϦް8LQ"6mK*n@zƀ <ΒE ,,c1&, v`&&ZӋ:}6+:Pp J-YTw>w&h&B}k/lem4&|U+#i߮qL>۰>U|b> !Bҩ3>2)#i(냘Hx\^2/߆}Br&ю%+{b&+bb_sZ5kXP74xԾ^<~(p[L$#0>3t{^꫼.^YoY6yL^2a~P#K_e(DWy>WK/K/ҫBfjF/k;6~]C KXN9ZQOe1Xe3RBm"UFuqjxJx|q{:s~ݵjS+"@R!5[#U=("pq} FAs1 {o/a6,TV1{Iأٞb"<x) A.YkYW6ZcVԻ'\h n!C} >Ws<祅R-W#l7zNڋ18QD_vagc6Qz*#^RC9X}=Ufmƻ?XȊl_1EwW5\}Byްu"Y躎7my_!B.uuj@!8 ٍ1Ǘ0s.7E-B'coK?ŮѢva5wc&wWqo!CI1b"Ƙ>oJ㜅QG cG"tL~0N]c7Xfv8LD|e#sK !:4B9cR3b ^q]C|0Pqy 끇x2gWb ɴ,t &e#=&*ߧ/:Ut+2{oqY {1C)>HLNJ_0OzՉǣ70.,_gcj98c}j Q+T4Έi[tQ0.\Xh.>\FwW_1WvEű}{5m;XY7Xx6s͟9\Ƞe\XN΁|@җӐFyLlB4ovkd 14?k5hKyǔHw7|꭫lm p P;ɖKnb^!:8B9w c)MGaR͊+0hz^;ÂwLY5*EٞhQh_1>g-\x$nppz w8GYoq(8Si>ym6rݬ:ӈc,8=s`~Ú7~| TGfluPTf?hͽsOQo+33 !tB!1 &4'V\'anC~U` -Efgw׃?٨{I/Ofa6y(_D5{ۀx~a/On11 Vm90BjcZ/{[sdL9'dtk;VHMI_(/,ƵϞK]]+l*ԯ~"렎~_dZCw*vw1xn k <*U?-5kُڥm0zz?odƎ(JH1~f Ɗ9/s~\#/nWe__rzݜ7z饗^z饗^z #y:󞩮[!H͙f 2vƲM3^zWښK:tŵ'%v}GRaMxlQ 1đBJGI,vIXHLĝ՟zzn\)Ε㥧jۘc" sȇOd1^ x {6]PHdhW*dGXדi2zߞg<;iT_>I$R،=΀c|^wp|e#r0}Gl#cwo{v)mqxx !_!BtOB1M6  .:'BbbF:q'ce[`V ," D܍Y3̺X#кSQ,үY3Kqp{D s;L1L$11Yocyչ^¸w*3pP+DB0c k6,17M%n5M76po F?)Ao%Ӂ1Kk`[t;x1U-4-LP"g(UN1F`Azgvw1:tصeWS 13C0c8z\!B!1NvdZ!X>:i{LKc>ڟ&!hW>WcSmGb"c@Xeaaލ.ǦuiJ-e`7v:BW?^7LC=G;RX2r~ƔƳS7(DǍO!DX }P̄& :qRQ^&&w~ &&{Qm/L:-Sߖ7rR$dOqcm{$pup YH!\}{ly1(DYR6wwIxZ;% a,,2yA!#&Ty+:1-S22' MR(Lԉ;Eg V8C)hbs~x (t|rrw/U ~}=o{*#" ¬G !şɩ~f(|sK€t⹌kZ#\(h<;(˱ٟ^:Qy͵:5<ۀy-jOAoמ(3BJ@G b}uXH>5GUE0'm}ⳁ50Q]rFzմmpk[ִXTOc4<,`i/~2c{~{\o ,w& -jqf`֕qau!=]m驾yD>uB!SSצD>3%Z!_~lB}*P0tm_̹>Rr ##sQaGT~`^9cLGjZ9Pq)x$w%f&ܮ⵻x~  9fCUFѻ~y{yrkWky{%DcWyz眏a4_QW W?3?O[ϗ+ϾLcv"; [nzƯuCF^c< x-G]FloyD6Gu4Ii̲8Eϱq…Bx%bPU1v b*Hg2; "]0ueq\ oٽ_ x%p巯a)]YLom)AمRo8o7P1!" &i|˦7h;?kx؍K!ȌM76Y6Yn\ÿB!Zʐ2:R2MB,Sqו߆jBM5<1ljܨ(>PQ(KCƾffl Ƃ1*爆wa1m#FW w~+Zs1ݣ=9ff8XS}i ۷z?W88fX$LT'UCKDG/1B d@=ڊݾ\#0dIkHb G_E_?-+17?5|MG/V⣭OÀosJݜX?58Kj[ ˷r!DGB>|8pG(BeZUxo=WONY-1ƒZr5 TpS7_LÓB8J1w)߾.sN!o]77݀U)g'i_+Bѕue NfRbYP1Ѽ>>d_͜DaoH[+} PF*,F1jNױhC .8,^:Pߔz6FkmxEQ)X=?ȌJeL820 }Yr nqz{30AJg(w-8<.Y=}wUe_-˴ob"N<tB! gE9G Vw2Ơٕ>?ˮt<~%IJCM㕩yֶ\z݁YBl%H\c B)BHX )2KN IDAT /xu .lj8ZB!PboGԁri?BkcU>&}tS.i؎_V_GGۀ*ہoncqpk0Q&ԫ ڙ/>c ?3犎9TzB)sc-״!Oʯ[t EnTCi:_PrƁ2FzOf7O6(8xZhLǸ8W~?U^H"R9(IJ>[=a+9л&W%P:,K3Ym3xQ2oPS=Nx:~ty+B1n֕ &_VͧU]F[7& 5+2ZJKYñ}?÷c n83[vm3."#F`(]v{XD|8kۦ7>iuy]Or-ĺ˯`>_3\ڵ^~w$ ;q™XV7+3_n6gy1ʰLq鍙GnLu.ϙe1Q&CUBt !` pXb | !gBV/ M^2ίHE wC#|M]B90'1ܘ,"B!X%3[,KNuCcC#cK>P,s`hGM/'wl15>])o80a^}m|o[qfۡ?)~1WYwj, {[}z4!ib sz!V=p(|md` *3 M,1o< `2TZ-,iB^Ը~pBlgɓh!:<B Yw&PB#6 ! SN[}J:If?{~o0TNߔ B !7(!ѫ%eg6` {KRzrg(0(̀f`X5 ,<Wűrc}uPDl7@#z힯 VϿWUT!D\ l髧7&G#؅"_ ̇zu4 ՀOWuwpi 9%b^ >COBt6eBx-qCB!$Y59::!CoDy9 z'Me=m2t}exdS{d U.Cl!b&!y6bjT1oN`9uqmo:&ϲq>_l_] \|%ʻ0WF=G^R9c߁Ҳc{Şg? yw?>m !ly22遮6U_= 8{Ժu1},rLonp GG꽒-!DZc<ل_o!B )q\T7L%=YYObUk6(6 ϰ%X &ǵ]Te!/x[GUBgW D:mlyWCJAC6B!Ds _A}9/KLO.>vKCϲz}(?tãᠫWw1FG{e !"bBbئEx́lǡ !BM]Ɂ}Yj˛1ƃBK 'fGuRyb+:{sUɬxev{W=^5|/i\J\UVe# ڌ'u.dH(Dfj3o3#\ ؒ{t/\]]9tl|,bIszl;'?x{mu~7}B'b my[G'IAl VX7y8m;l[Sv\Mx0~%1$? 1@g,#!< {20#B1Yg? қbaHwN[[p^ mh*2ꍁ/9ul/B " !D@U~pg+EcYD" yB!R&ً1Ox& !'M_m: mR)Q'Vm|yzٶr]϶5hǹdgٶCn[|/_* !=vYj_Ȣ.;Ȝ9l-.^7,cǐziN}F>mqAos9)Q.mRg326ǥ!Oͧ!rl[99 Y1%G0M7qWVk2'֡lU}GʁW.q^Os`."TB4ģ<xhƣo>x!ґyiϐk|yG坏T _A!K#p=A;6vFzj92N>VN u%ﴕ3t~r ta36oC;ugg=4+n*DS!D<n |Lꂲk_B!겁+kGWq\v!2;գn}jfp;y~ϟĴK,A^ooc=TwUb݉|Wc"- !sBL_#2Mƍ=>Fwu1cglZVB!V[FÝ_+w&ʏ!,6wG3c秲e<+dk =zPCU\y|q;N}"(p. ҳ% Aܷ>{Q !hƬ^R@0{2ppp6n B!X/].8 xENRqv~e"*ز=t07Z+q=m!oy^5BqLӿd\F.X2蛎)F{%C*3Gkc1?5}fqAAG%R/q#FM8cPEӥ!B#eo ȵy6؇W葅g=阶9d!#W!EYv=+ O9ТgCcF_=jqJ xu˖X8?,;]!:lB!~W~}8zF)ŒϻB!KN^!߁babRѾb66@vLz&>>0ئڎuyRe닔68?8(12onaM*bSɪ>dyPm 9vPz@!b'5_B&,#列㟏r>uy~C2Qg^v}Yz%Խ&s};~6M}/Uz:!vإ΁ԃ B|C^ x񆊙B!GsMvqAM9 B1pq1Q1=\rk>cucqJ;OvWOǺˡ}vՃPm"z2B>ydJrol/zwl;y1qbǽ< "B!Wjꔢ<,˱gDʶ1h.w]˨4)ۚߺ.#ӒgV[Wi <}zYZr(2zBO>Ey?r\aB s'B!pL? B?U2('e`-j?Sc@/vSd|i.xPʋQ-o92B}ύ=nLqBq온B =~t |*}U!b58.t9/f[5 s]_s/!//ָq4_%ØY/?l8'{6<NaNK6=i#`JBnx넽.B?xÚ(B!%Հ;#d82lBLF9e0h񢯶z18[SY.#qmn!^Θ2B oOI"4v#BC:B!P][1U ۦ/Y4.=+;r9mS.GMb5iKSȀ^n{#t!yf[輐nBlB!O ܿk|b) #O%B9tWO+ ]_7vӲkҪ\88 c4`[࿶ɮgy !d;}2WDgc (_a>l'}U]_x)_vy]Eڏ\zҝ_0@s55!I ?ͰH DWmȵpmjUd)]9Mp"j>c,Bq#ծc# 1Q4lyb*2+g[K1캼D}d}6u>pZ}lh;G~fؾOB!E΀LDJٻmq;}&Yh67ߺ˨X\l>R=NYgca5{VW.T;b!(mN"t-x ,]|cLR#ul=!ƚ~7%ڠXD;3 \1ƹĿ1;.R y}?cxP1;v2]0/2^B=۲EoI7=iVԗ7lKYmB_S!une^5͉w2X&m`0e!Vи?.xM׬ tMqAi)WYz9D+~w-M>)D&L!BѯsQ>c@ҥj X6v`l sg yw:WۨK:jSOKJ7^)oK"ȄB!6y9{><_+ιIGzD{r#)cם|zݘ:\*غV89aYM#FJO'%>PB:f! V_$bQS%vO(].Ei]7:!VcO֔4^ YƇO`"P7MŦy/R{=eQ18gsQ1}~6'.QUۤA}6q:"FgUb=:Ucb:}PJ;צMH>U7u4Cewb{mst.mt0m96We k$7Oh1_j?ҙB!|xl;=?Z?̀kgEȽg߯eyVΫέŮǮ->}'>{n&)v|I*]tN_Zl΄@Bэ7NDŽ]g\"aU_w$Q2Bn[n{b<+# |?>a\n۔3ؕz]Wg`"8v/a(mtκvp>pb|8!Xy|R| m-v#!ɐՅאN_MOHY,֯u!lcx={MC2ic CY{~2yok"MtN;bs躢>8nGȨ>#UR659Ot!C!B =Ζ>9>dt L[| o[~t|m{ g@X띕ύ(l$83[/ IDATߖ~e1é}*cg*}N}vB@g![A7XS?va B1H:yU!"1vdQü )66* y=1,JC?xU9}cPfXN)l:&LX1<"Qx[ /S9A{!zQnF M" xڠ^.fKcm{i۶;3H?>n4~Zy6rcLk[R*4RD~u?k\~mc08i;TB!=CC;ZG;ts>9 mK:k\^ԍik$\y'~-b؆m*] !z8Bt<xqfaPx-odY>su_;g>"`9,1u><8cr$p!3DŽ?gu:vw۸Whsw $]lh%vFɳ>7J?t:~{^dW gav[hGoU'*b'MQɫz-SE܈8k1$/xu:-`Q!XCUѝ#ѽu|߅Q_ThE.IWTSc֫0~n TRm^՗ Y/ghK!+.Z!aHzj1c}rvtx?d} gקLY=G%[0FOu{޴@B,ܗ# J@0>Ve9o%nޕ-s 'cDX H8ąq6&n1>C*dV^/$6ѴM/؅i:v̤up(1R;8Ջ%=Qԡ4?_iQrk ӞE?Yr(oٵR 0{CuS!V_8ne=ȨBiʶ1h׳9 [t"Wm :bXLbcdh>7j+[t^(l'1_U}:E1\zu^RN!e-$g !B4QVE~]rK:d3]SÅ={yEE,\&f7pp>[_͊!+, !p`BUC}16) "]8]kc k\7!=xW1/eahXn€gXbѶoůF]*uB4;!e9dzʱOykjc*XG(Zxy;&[=&wD?,yGUF}m6uuldu\F1mD|=a8!X]_el ȡbغY?V.D< &bҝNC~B:H\}M晗}>|CF|9E"94Hm0fݫ:3]rܷ4I4Vq&J! V oD ]P.L^}4ԥV3lU/aJ|=P3Z23-u-,Y.#v+' dly#6',Y;%i??vc웄B}Z d7EYӹ#H\'FHWozZ v76m},7x) ؃+xT9&-Q*q?Q͈_+9&Ub[0mt|u/m {eYYb>uihIj]"1QV1bU) -q;Yd}]sNWBڒ ES]Bhsv3Y&/m_u7OӾtLWץʦF>'chvy.!Bt6珮2_clLQc`z}1l:)׊Ӹwe@h7Ƿ/fkc^Q>-/TioUu9~2SЩ36}G8wwyRPk !8B#1 |L#Ƙs<`|kihI׆ܮӆ]ݿoXulz9&z`z|d6iLZ\BH46Z9s6mxy84H},j^EiLCb~ӱY6W?R׹[#߳%7m~f6!eJz>sd+!Bt~8}E-F^ZߘQ3E6p8-Fߚr4z!PDĨ*VtEې5lEHs)غ.1L aS ᵛLT!b0YT[?]!}p2Pyos2E9yGnl^v8k}F{XY!āB*BBu"Ƴo0ƀA`7!m1]!Ĵts e2FdИdʆqƸ<yݐ0=jfɢImjX_ W!B!b\=EMzyHg1KO>_~M=`room c6*WӠlC;B!sw1Q @asC!{uIZݳ? SuӐJu}YFNQ41:pD*P@8BDvB!1 vKaI!Xxm \\XL^1H^nTĂB,~)fh Y(MY3\a4n0,)`65ڌ*C!e@(B!m6:QbZG>LKi_\*3N|H[1)uLB!5u5z4 =.M]g& Y_:^F|ʒ9r:^;5!s͐B$s]7$fB$H0vSˆB`7sjW:V]m4kYjۦ-%b̽b6jnE!BqFl5!@g$˹IfFOnhQ m.#6uc|m%B!o#>5WGt>'M,{ItU>Y3bnJ̚TMrd>$ܽ}0A{/}UB[/n[dP(bob][6vx΍&b9uXғfc*l𖪓MLt&򇯞l~l!y|y!B!7|ߛEڧۥ^?/'aP[&o19>֡|M S}BmܒB!DV]y>Bn}]ϲe?YZ_c< +7tyhe͘k>EGLBNC!6Zd4(b5oo\ \T&MFr !.McǂXWh8WUi]Bg?ZAPxiW]n2n|LPc:l6lZoCs-h !B!Wc^IץsקD֠*YDJsԹ1H[?:B!qdپtlgb_Ns3{VD.U)ɳ,/֚6qR;؆ B<ܣ![[Te޵f@B\x_c 1FLce*?1FtA_l^Jb~I͙!B1]] & YMt+nׅ.S^MgfVyKk}#.U͙B!w,߿9]:H\omץ:Xށ6fLS/rrz2 Lձw(>ocWK2( !ɘ $ !ڟ< Q3bЅguc6B!X2m:P?1_~`6 + ֽ>}ߌ:X9YzlIpGNc!B o#A!XR"4xXR#aDty]e!=c~x<͌Y3K]J~C1E[Z͛!B!69faWXH7t]{VaN5JݜNsKY !Bѷ~Q~x ruRy'uOBS?,K̗(y|F,ob-!JeB$,B)~n*+mr1ƂT=z< !X5l &cf ƻܧu}ɑB!BeqTf~/,<[G!B!m3%7p2Ʃz \CZ{"]l,:uqBlS!$}+!Ī~5ڸ;pTƋw /|-)Ey)B!V82$1:`5*qޡ{)FϘ{}H&eТTt4|u6&E !B!D:bH7ݥF`wfnH7]AW; ~GB!Bʒ]U}#쒫u]ydopU\R|>KX=Y}Ԉ]S/^zRv8s 2 B񅷓\!!f1?u>d._"z`:r\M}2;c !X%Y7e<.A=!C c`K3{[6'B,!b\:cwR!RS¯3v>pKⷧ_F~~8go_bahcRʸ* !XE}.ҠwŐ_c3m#T7 "ѽ%&W6h``=c|YO<3we:Ey-&M3B!SWv|q>3H1C<;Cϱ"7 !Bх,%gW#M}DySLU/N*Q]:c?*w_]3=?Xjp2SQ:!vGFRXK.ԍ)i]06# *UB!h3B_;o.Yce&z.k"h(qzB!B,7y@7NѣS"zh!g輼af}<c{ !B! \ -O^̹5gٸ>"u+eJ}ktԉ&w&pȺ5׭TؽSK-3' ۔B19/ҿT %^V'6fj!Bt%"6ig|V]q-e|p{# ȇ>{삅kb.,Z]v`HB!B!6=ߦF}O4\_q.Suu~>gR?9-B2̀/7-Uכp\7Vhr.eoc:i)P -PCDԠŴrIDATPHQ#T AC$2B&1 .xA.A[WNrfv|3;;{79O,!>Gvv21/cK]uJ1~([[YJ;jb.x |sHP 82}$͋LϾ7ay^Ř[ x[K9BwQx̕.Z9F؛#id,]Mg˶] njIZ瓔ul^oX%Х7l]7Y˹3232LҖW[ <%XsUS7滮YL@nuu.l9'<&׏}! `W}[ʡa7?7xkl%]Ç$7&yy<7=Yu%Dz-M.fW҈m HIm; oX11\]7tTnHoNՎ'PM_wXC)^h=iZUz,$WġqxߝU]96YOH-ÐM_Iߖ;{Fm}Y|엓mIbƔa֣^˔w<}Y;$%8#J*~F%I$oHYuL+v5z]ۈ]J.MVNZʺkrJ\qvSFUp,4׳\Tzip616+H8:] F*8'n:bзKsN֋NJ#sS;By_˧$y#g{';\sfM;qVIv^O%rz2߄6PA)YsO?`/tJZqEy]#|d=^=q.bjV%~ge|쮷>*z.۵5\&y~v<_zHgQp>^|WI.p ߘsH4/^߲]3InMĦkI!Cݍ`ybW(QCu.:4^52nL%nvfqFlo|o3H5<$N$um۩>bd^2bEo:b߯^?gޝ$_L٬Vݒ{Ѽ@_?.K$6~uLy9ƌ%Fy|uUnnOȂ]a91}>Ϋ粜 ?-+n-EI~?m~硤h3k'I.#$HrSV>Iᅇ9D&S=3}SU#]fiI>I)dzju[V7#wm:^U%2<17~hu&|e|/+zU;cs)ȱv گGsVl|ivHsoe/$q(Jj3p%W1 b|(b2yccn19wSY݁ K77oİm?gUmkybiԩ-1V`]InH$?k3#ЦSI3ɯ%$oĬ׵ıi7p/sumxis[{v׵XscnG`8fI^9`V;Z^ɨϕtNkTvwetH^3Q]e8{GO$$yC/0p˞XS&ewo~m F>(,8;vqSסҕoͧmJ9Iԣ0%yKw$1=qwLIIYVxQbe_CQ_?Lc:ܠ1:8u?$o Ͼ4NǸ?^R[c2T|} L1x=6' .cphcC vP9PBYz`Ņm.>4ϑ">$7'y%MI^{@Ռ7%l}/+bƶ}J:-zڮJu?ݶ-p[_,S~]c}&L]eR' z]O%Tw'#sZ/v&28F M+~J>T':&8mϯi['I^~#ߞv9~i^'aw'<#ɻR>]igL7f}94#{c I>\5tdU#,IFۼCf}vɝ9w/G|flyØ$gף[r-cUn]N7Ik]Ӓ?/gxU:_97)q٪zuF$on Vva_7r~gw$yk/OY{*ϧ&)6e(c n@cF;z1 wDl$7d5:ϭoYL?7Cb3!]_}47,wjgfY*:Pι}:Vc:.ط΃C9ff!|Ռ 8y+^{ogIa۱۷=cIm<{D99t({jcY 3HG7aEI,e%$H YwywsIu]?.$\~?a?r=pϿ VU$c[adqؗy$Ȫckl{oÒђ7%qEa\,޶ U:ywQWuoj9v@o_?mvszlfG~69:fٟV;Cl7=TΧ'+95O *1w8LCʪ3qiV ? wdl롆:]}ٱswԿH_XOO|k/v|/%ypmYo\/c%5xIsmM9*%~wrlױn|] ynS]mu厭_sMnjLlY:c׶fM$28N۬79߆=)yR+k<}`4޶>]%C?v4_Ws| Ic^Lr{ے\I~:Gkok'&yLǭI^$䱵]#:fds]vJrV\BM]5"],wy問0Grǯ< g.d_UGM /^ojG+|%z_VݑZS}&$w&$̪SߝYu滫'{m,ɏ$yHx{wd5zf9Ϊss%Ͱ<8T s6Gq)/pL |tuߍ6'+GcyucUKw{;n7W?[\V.] I-I.I$ߖAf]w]7wמ\/o|ze/YwqǼw&$_:}I@j 38cU/{>{b7I>30Ϧ7 ̯ 9Qߜ/7%v~="Tqv9vWH:pf:<$/j4j*Yu{oV]BvKn{~M] nq2=Ӛ5" F{21n:,-<4e:F(?Εo8λKnOyd `;#U9l59ס*o~3:}ǔO˖ǢE|l^/zїgSU{a97n[?; fK*; N)Ә xjM^W[[5qM]jκ->h m{Ϗm;V]i9 -^mZ]뇔Ϲn88~q>`IE4°iɠ]e: WMw0[P;.LV#RasW0-Xζ)kT͘s@2InsueRT?raphª 5rм@yRp8?a m1*\ۨp: =k3C`3^w<G*x p:U_A8UG$'SF&Px~8Te`iWIENDB`marginaleffects/man/figures/zoo_banner.png0000755000176200001440000312243214631452336020506 0ustar liggesusersPNG  IHDR;~F,zTXtRaw profile type exifxڥY丮d57QZ5~MUqH`е )?Rs柷޿=|_~q?o_%5 }g-_ߟO7A+֟7j(>o?ouV?ؿ?oX~כ[/1ěcs;x)?W‚u^w}^_/mg}K-r++goϿ~} \ѿ}ߪ߹gn[<uG׋Kw[bՓ][fha'z>0S'/X Sb}|7_ߧ+Zs]x\, ߟEMgL.X{? 0]BYހ%";Bwy Y٠Υ?};Rz1f>~4?Ry|uH1޴٬MOy+6SLoJ)jjߜr% ^%\J^c}kZk=-VZmgv޹ӝ>;5(6|;̳:Yq+j1.}/}+_޵?/v-ٵ/,_-寷Ir0H`Nj[A?]>{"{;;< vԝڷo]ns][yv.g\Hy}}oyWgŽ^ƷS_z;㎼2gFXJ+PGfo[w.{Ln\aO(M c8f3^ ҸcbvnϺ"6w޹n.*>seyb}޺{Թ5>9ڭJ zb+wO_~`0D p'︞c/i.o|K.;d%~' ~0wzYŪދoY[sD"E7e9:NhG9owau\+oФr9VŴ'?ߔ6pO |m㍹q+x玹޹Fnn5Y ~n8 D0ܯֱ˲|M@L՞ L|-,yQ^j $ Xxޡ%J7ǐzXg hDL,U~>pÎKaג6aΗ{KĂOƢЌxx4 ׃! X=_55U*u5 n~="+x؀*s%|o6^߳@{M97X,? dJ>ycv[z=;v[ :O _`+R*'x'dn ;a[9``M!¢;SC:J_ Y?c|/ ː40$x0D9aec/~qI'ca)/HF`[/_/z6V]īG~JXO`{ Y݆Z#Ƶ1cu$]G6 HXED_hN0^V C 7ȰqW;"\Zu˶`a&~Eؿ[4 b'*O'TUЅ#@" @*!x1?mm7`ąin rؤJȸQ&D< kMn D,3: uRb޸A C0{08d<7;R?v4Wr &pdq"o%h Vڮ _ P02C}ᗟaz0:i_d`юzvwPdCcp`/_@7 k߅ vX9j*˦`G  $B0%2p n7,U"օH. ZݰHwk -U|;2+"A"H%۾?*vΟ-&:sm(o  2x%ȇ "/2tt g:ST`m59& MH*y[%Z&žS(ʈ̝E+!]^\YA" n8tȀx%bv`,/9̀Ђ" Yb U{KFMv[{t" x"1uB*o QC;ȵT*Tx@/dqmX-2J 8RDىoݽA^Y;;]$6C퉜+HXWŷ>pz/ 'Z񳁼x>t ;"T…A(A% Xu끲qX k\,) q$C w+@{iX$*>0Sp揷<@m4=ќ$hpgz > x V XDsDV}D, YJ4]Wpݏ +rPBp5x: 4́9Y:P_+6q8gᾡC1 TAk"J<,jǎ$LOEw2KuEۇ KVlx{7Џ% B'o=*\WDŽ9sO_X$Y z ;XB[: ׫G}&E--d b#͈J7 xthр<f@[G*O"( ^"ǒQWb*-~֑j%o@F`,áƛMbhAX9A27zӖ~ȯHycd𸬮x*I4?Dߖ Aa!0[`iU|-ic$>|tCo^0]~$ن30TlLxA4q!CIl }wJv=`ADy9fI2rJ;଄rXSFo3p&PGg'h '5\'(U A ќ<øN*$ﻣ*S1}W 5o(F_ Y>." !%P,|V  .LA7 >h$2YttXhmbߊ*k]q of}ੈ W)E`A)sϬkAnk'>{Jt%=+as`P'3~\÷ /6%|M˫HVq$bmC}=^8WT]f@*DR}+7H +fLFKjE"Ǡ?non헟Ek>zD-ӠJ䑷z䝈 r1`91,;sӤ<۳;aْ ^3OV \nF$C -,R?0_7N&+koe Y1!f~'x+9`_0N lǞCB_\X O I؇K:J!|W.@7B/n#ر.ƄM5ﻰkPwm }k^51b}B'HZj?=Q*W~X];|aAخ;Aja}BbM҄6a2Ŵߑq ڏ6y0m,},7WCK}{Ѓv 1;s]=|{&70WOPA'"߶GfMLi(aChWFBXrhOnpmJ  rUkȐj1 tܩW".MGSH=jMhtW4'\oP9 x7K@3%c[wk;z.UvPb DH܄޸݃Ï'f z0C唼'/!7ć͆ AI`lO d ‰V_^f WM# 1/ ϔya >H5,u‚&S|yg>fVh%_sl`&v2@ PN~tgچ|_5Ҁh$SSfF#7/8\}FDH3x2& a+ l =3>="'w v Xy}FCnG(k?G"-Z5S %WEstt{vDW=J|ZX@>?*==K T .h0 (C* >իQG5nؒ [=BH^ɾu0x8$a¨p?@ԏq'Rs-Θ2̗IhGp6|@Vi5BءjLqUPqڃ!Rqء ikUFpg7%i)+h\S=~a(ɵl).MX.Im=s7(;AF+_v]Æi7d DX9 KziL?$2\x62pQ(8X0:QUB2n+rpDoWa`.aXQ,K=of>/` ꞁ6{|,3k8H$BH>?tN!MJAf89{Qѣi G ` ).Nge@ދ>LyT<'|&HF ?,㦄#L݈'U3=Ħ|dY!JYeG]Vv)$emFsX&w,:ݎX) 7TF 7E.SaEqJ5dIWS6>_~b&>mDwF", bcx)x,\G6Bc=0_6M_=% %HCމjeq\σGݦ|6tTxLAp" |Y,?4"IT":brM>"=/9:lsZ؀ENaSRz~ k|܃LLWDIjl5$ϛkekA.$DjqX&A/*f0q{!\Bs7R= xH𙷃+b=E.sS,!"<:\zxY=ncż}cDP<9Ccj]:u!EcԠ?/kx1N (%h]!7 ]2?cH[xz fc3"pNBUKEOy~D\6aEz+<3Z:X&cܞgz*bmSw 0:;cv'0' ![\M'P2EpY@k}B6!xA\%*t8I Rn B,BAo{5LD $HGKZ̿E@TO没5dgZ`ZL0& Sy%.,Gۿ& p%|B_BwaOeIXqaxZ`PlJ={cRd%#>B!3^A~RcD)SXqS \=KOczbU;^d,8(5[p ػE YR^FղF x fv- N I/0-,-B[E~]-<21VK`4Fo!#\֙\3V(FEZ(G< wee(ְdTƊ@s_>7fߐ'4qɖ_rg0Rx ްWdp6sQB? zBw 7iX`(eU74)B`F+wBJSHWуFHh ZbzjC(DY(JM+^h@S-'gaL68e FDh{8r3L+I &14񸱨-Y4 &; @ Ӵ9NcO\l f]^2(`}}`I ǀUŶ&"~)*-+fl@53;͂XjР3&]OU)481^8g FGYˉu\* f `s?FƪkLIa0` p 7bX4L6"5ϻ瓌%mЛPP<qXɀwwP $J,q~StgKog~z`T*WaP7;>/3 2a"LƢ}Y #B-9cZfgޮ7796Z6mb- Ԇ)~#lB&OJm׃!"vpH+<w0j-p`jX"GZi)iʹDasԝ+;ޕX*z 2A,["}Yhq>3'4`(`yiAe!q_x|v7k {{} یCl;ە\([qXffo(r9rB)֮۰D, .L{<ߺe*H u3&i + ,=MvWWn/ԻJ7Z>p(l8ļּɣ,žV\u|: qx t_UmFW==о \ `W6%`Z Gİ| Z16P"qbYlK<Q8[tpFs J`K"P|0lv9"5|g@9,i3jv6Q 49wܭVC[V+AA#4|8y^-Ws}SVC/A{9t~]˸Fŷ{0o ZC-H8FU,^_# (Qy~F,yLR tTUtO,\PDӿM.o˧GGG^9@B le6rNًpƾLސ~")Ca*O5@;M\Cn+WHB3 C=?;]]})#rbEEn^4Kv~%jaffykE[ \kyh]yLphajq#5F|::ZBcAc؟j7MсhzvgA4@mVɯk!D֔ȫFqǰ (I`!y &>m|k+ȇ2ɞ dv,ycȸ#.E. ;\޻|M(Gz<-d}X/jḏnT.yƁt$4X)"ByE0`N'6. NG2KKQ!vË<xgK^tĨ,},vd[ :jv x ^o97E8VKbj/v=`j\H3AWB\WFabCJ`-0ŵW\ FvȮAKmތ(cRdeAnfR >[׼زj[RtL+WwRėheEo?"WYH{r*N^{_sY^`/_1ә .};Tn_̎2R qlGF6u"amF/ yXʥ?>g6MOi75 2Xwc.ǞB$~ZŮr8sBVuGB=coۓn&S#O6Y`2` !Wca9c"v9˗zwJ?vޭDAG"m6;g'&жubeHUBYWC:V5!ӳhJjpL0 @׼6t& @ѲP d!SlhyϳRp ٵ j6~t(9/B۠[Z՜ЫFKܧ;"٣ 7fƊzئZ!䛵IXw<;mmLF6y4yr,ܳ6ln"*U>=x5ְ<8GV߮gɠzXek-;=Mnu JkD)\:X$ЇUr]UqYٰ RǶPֱcxѶYd6x%ZbB@ ;3 5xU8Ďɴ,Ҫb 5@gBp:tN'F!`=Xѥq c_dg!_ohW=cqkC񦓥۶x~5f V58M~[h/ 1@ c\πnv=Y]ቯOl ?"<ì{gq1֧;zݽ)p,͌V'DX5z31zK⳽v^'S {P=.l#]xbp \FsM;Z26ݲ sĞ9p2l=X}ct=dɪ"ϯ랞4tq{I1~Z@7Ck_Dg xp ]9GBuHh-יP@{NA~)[>YFh zi|&z҉CMOe">:,wj4GV7xvhZji)n"?~ tG3R6U{2D8 "RMa 1۱zGM> pGMYЊSx Nc7\~&Frlp6L %Um _+v,ߙ4z9čW+ -A;egۖ$$OK fgvz&"6,4# ]C*n(L70w<=+&3%x[FK[& hLT,.崅Gpݳ{;W6[gf^;ZYW5ڡFֳ V'5 R< ¿l\a.GA:eWn6ύ>Ӿd3A$|+PujΞ$=mfkMJL_PPa_t++Ac_'yN530Т'UdG$@g8q EgwVSZo>0`Fs:ۄf3z RpJu-Ꚅ]$#C˼ypEӱ֪AL<)2q9isZ#wD-^xk ;BO+( hXQV [4d2')%ء 2ZOSŝg ;UْB ӊRˁ]3&ñɴYL! ũ!;Ⱦqm[6ES !2T}1wjk=j)L3,־sRҜQp:9֌ x/_5_Slv nc ;=f`cP!N NX$}ߍ<"<3ؿ@؄uQZ"qGt F3b v`Zhu/{hD*  4e+ ;#mk_vcOtW` ;vm(Xms|uzUK9IT&X.!I&K?>r ¸<0- *NlhɲYTy7ē~me6^p15t>K˜X<#o+\ k+]%JG,*iDl,rIҕ'L;6 !C [ x}کVYgN:0v u) (nOnŅ6K;UcӜV>yi&"ڥZXjl'GΣ` {pڱKa7g? C5Z_VZ>T3R_!~b3^%_a77ë vIܚM}S:G/Ֆz⟵!?=DxǺݪ60!t6Bip`@FƎkOĸb{6#"Ly'!h9j`Yf_q/J%9^1mݐ'0Sm=#w-IJ\>lҞIƚZu#0~{`8xYl E6N^=Gq^(Z4|J&s ÂnIv0:yRvm+saCa0_'ZSq^7S2UW>UܖFT )?B9Rz}̙b,ĩfkAH&XvX8`0[/b|* ,m_>niACxB 3F*ے~or9Lѩ0DxJЉ}j:Ąexh{uڻM,.ʢjqF[qm؎ ;!'A8q>žϳa,nEC)견m*93{\nF3=pyF Y'!4DԃC:&;8|R\a}[˞9fUvW8=̙p`J|VpmY@Ӈ}d u-j>A<M$g*js:olKw`h<ςW M3Ɖp:qhqn)gλ<>>[;qCP8͟^ 5Cb'ԞGĮP8pg{UYBc6< qTc# d1) vXDu@\iceIgk[~>+m)SnLw™3Ⱥj >(Z@ =lU;i';e+\㽝1aQ&06"qVogj38+iV(bnFH2bc)ΫV-[Op"'lu 3bs4C0= 1yO>qg6ă >Sؠ\G7ƪt5!79nףĠpj}5{m*pP< BbubOrhWw"L™ ldV9N'eP# ?Rj ѳۉLDʼF${B*G,91=OG,lt#_*"T">n%8A;N}z1+?-?>JRxY=Oh \G/$iVL'1 sY4&ìRCDy@sIA݉NDٟ.sgFL{l =QͺMvOXR<=UۖTلJ&u`Ȝut|_yHqAhgG>w9;N˨xWo8w3a7nmvT}"u>_v|d tK>0:Pߟ7hMѵo[@sMrsiCCPICC profilex}=H@_S*vqP,8J`Zu0 4$).kŪ "%/)=BTkP5Hcb6*^DBObH/f9]gys (y>xEAj88Ɗ=rx,]v iTXtXML:com.adobe.xmp bKGD pHYs  tIME   IDATxڬY$%[h:$Ui^@(e8}\gD ?OD42&"a?LDdFDjDDLLfDjJCLF̘%LŸ뽉m~W9β5~%u]B:?Ѻߟh { 3ͯTi?ќ:ٟj ^d_<~ ET݇=#ո2nKLsvوۈH6W1mٮG'ޏ|mW ,_(ˊ%*=½ȏug=Uc5+? ,QZK~B^{X5:ZLLJ`zx>w 7DNsğ;b\:1sxQ\7pagj}Ɲu~XƬ}~V:TC3}&ig>FuD|[?@}g1:9_>C<4_n}y5{!p\{ݷh qFhK0bq oUu388Wm y `?>u挃[Sy&npEy[XoALL]ު689.7:dp1GTg$pۿsf ឧաj4"֚3_:W:eMsS#2)9̏+1UeF/2$F8K^=0!nD# cʱq:scȊ?5'jt {εgy<~a\u1F$[>wzObM Ek|_bO4'3%H 0"`+T-61V[Fٜ>C搐ΩygQqƅJf-njCmpcH+*8WVLh\B:8,9&dX@>(_/z`XIAaI$bS_f"Ğ7g='8ɠ>K^j JTu+B[a..mEvx4:ITzE^l& ѐcDw%s7~mXگ:4Z\VM%;tsN_Z  "=Y-5iȱ`_FsݷZe[ogSaSz["PZRka:/bܫxy3g2Iш1XoE-^+nsQAě o}hm׏{=/޼ϤxmVMGU3XփU,DҠ-DC0݈hfrI}W,ƹO{ܱ,[|lT4u gcpG~-м}?Ea+[ϐ3ggi_ou̹p9zb#se}|g`ǸkEq=_5\UwfX X3)j> *&ӛmF,dbFHM 6fpʾ-gsHmX >80ElUYiKKjJ̡uf?iy?ǀE 3 \aG~Pzq"zT kjv{S5Y|P38l!W0F9'b691u}khĄWV">j[*V O%u1 vͻN["k52lX$ټDhNfBJWSd{_DʞҦFh*L7vWdA+,2@7Ĕ)LS$2% *05,%d/;G:`苿"\#XoԻQ8D51d.DڧHBSNb>65Lm ~ފ =,/MV:TOMֹ5*)2x}k<*uoLp-ʤ uKh h3ca f"f%HHnAU5dH@1 _yj!_%SיuϛLH3qnFry8`”7f6Tu5ͼyflW|PhUc⥷t}TxꌨF?cY ZVGY*7yog ΔͼHb|MCzc3@ڌQC8 ;{~kTc89'R9cjޛk1|okm<\k/G3§WS+iKW~vmLlX"% !Pj3Na;ZJZXF7#*ILIo]ӫ"-$4qSs&$[rANAP0 1&uNuԳ׋Q\ZL<μ?L3 9)MT 5HuHxм|^BtI"~7q˿\J5} Zs"Nڰ/7,'lhvژhCp()A3Ƃ9eg5;~aܜ|aا"|ȱ:`yjDŽ_7s]&XDj?*J;L!gg̜6cǔ=0j5c|GHX|.H@=WEպ$^+ڸQ4 :pLȢy6g%Uyޤl1}nӮ[[w5 InLڮN鄈$|Hka3/| 6 "0w$JxE3Dz2?3ѰlVHEH5>dgʗAj량~~$'T5`1OS/aq*%9l'm+$( -R9U55}2>C2[׊Z1Wzo()7?k^L`\ 1Ϡ䤣MkM8?b72aQ0o{A Ĵ~CPֹ­D||ij"q{%5bZP0Bpε>5@\oͽ-sޫxlf'n0^9vjS+gh!]Ş{g'?㵞kRkNܿctԜ3: ?TH+X6$Î [HfLJ[AL4cЕRz,B.?{!ܸDg~'nNr~J@a-|zBVU>#Ä'43 !9ѡo~#@FIKF )nROңY7v5nJ&%qp=*jź y[$5&9Id@4w4@(4e&xJdQH>Րg4HX M'i 8)i);j\=aS٩̀jܸd<̊vZ6[QL.mSlq[x6O|l53pfׇj:,;;+a5H6 k#9&P5MZ%(-8K $$lq)5YE ńi>\MGaayAڥwjqU 5ךyN)jHVh(Iʁ0MB.ll;I#q-nL7_\dQ t EwL-!MpWU^: sc# {5iE.OM׸A,"Q kB# 6( o< wɯ{}&Rs7WU ظ 1I~ j$.i59eCEi wˣJB4qgqIц ^0du$Έ5I]0if{ lԘsJF%!MlqOyYsq$E&HYBg(F O,^ɛCFEucA!#ܓGdNMړXVPz~[ӣ^ Fq6Y8$ "ˌkz%fAu"jec$Y%lt(\ Ag595~J̫9YM{Ş=M'HuQzRh֙mlc{k*C3o?\,&uVl~Uߋ d&-/y/dUQXq"Cc 8m΢o 3y ܞW=[̻g!$"ϵjNZ1ՇgP4 yV12vn 헮JBMxl4{^(9'qhS]%yx $&){c$]_oi"+=-l뽕Ƹ 쉛61vȹ+>zaqr5y|gV":y.S֘`P%J 68 p&cAE(̀XvK :OUlX.c9ɒP p!0bsޚ='*CG;=BZ̵%ZÖ]WGӮ](iNyχ\ԛv C3U; nqhfc`I-P!ϸ31}R`!s7guOb /4$93fRw/P1Wq>͂{%?0O ݎykj,(~q1*Ma_aE(֒|Hy; ;+~~{"klGE v] TBB%DbIDqbSn/f v! ;•{\1B:Å;z>GJ;X} H9P t'H$48NFdjMaHt%ۋ@7}}K}k# ܾ\:-(beĀ݌HhG{h] ;N43rj df {6xP+ѹ\Z3뜖RwT%~Y̾D\w1)><5'd1SW#gQF w:K#@ٶ {4&X{C|s=3)`Ȝj SDdI;T5"Z ??r#kS} Sn/j!(_ORjAsI 4%E$rD峈1j1РH( 9'\I'jA?7j.['ysPO: - +9fKZ3c GXHps70dNY)R0 fP"YûำOPuoNǷMe ~AXɌ>5*$ms0Tp.t7H VaHZ2{tVH>Y罦6v Uz(yϏ/A6Wd ͊ŷbL8{Ї"6ak |>ٝ&nx衈ʚ 1@ua|O6k-Hw(g% sXZO6&B\g> ~8mB,PZlA&lu`jIiVI& " J7.޷A+L˕]8900'uZQQNpg#;Z0Upkl0Vފ2"!$ɦdI)soC>a}(6kHjh݋442}D{Қ4uz :3@H8ŽJ490K3pȕ~bHX0 )gY-`scʽxG *r[!g_NXPR M$׹ D$v RɷAEtFy5Zdk  łOby 7p5nEg+VǠF37[(cc 8J 1Jh>=;Z@nG# KGCOz"a, f3 9`}(\M0pjCmEᱼv5,V|]eP Ш5;HDzGV^Tf4b 8FPި͏8' pX7]ו5ϋԭrsӐ_f":'pү`дHAhv(HP7,.}n=k#!/8>H@j~> 4BLO%j 4 IDAT-cv0mA{}"9 @o #џ'= &~x.QxW' Mh).h[4 E[#9;,?wՕ|Qr&_P6j[M @=& ש4A:Kt ! aUqHT@YVP|GC[bIV`dSCPC'q V#uȘ,3v,5T]hh q% ]K5iwfdo9<uPfg7XZf,y+!fWPɑOLV; Im㫆Z$nxt>_ڃN#Ks^;Ҵ5ޏ`%#9 95Nf;֣GjІ`'!1wU|)ִ7dih$^̤z\PBTO xFbq[9u2\op>&5)(5."kNMjၗCxGݛmO8J9J%%F &w/fi $li'zf@}OF2ox.rcD#,^n{<:·҅M(gZ0JMw56AWp%*J$[ʽ-@"6xU.g .0'3̧顽º Tx[)2 kԏMpBA0m4)Dfj"9c!ʒZ^keKK\KDI?\uSv{γ*$GV\IĔK-& %(&%Dv;jX֔ !EUss 1(ś5}mlv3éQM5ߚMt~hIlhdɀ- @dK4/epWL]FGu>!ʳakns WG{ =h&)ᄭQoz%#0+B TOEm9wM7[@z@%2 5BCb)433TEhO$ `PihJe gЖw8YI B(Cȶ0^4#fg&V{k,&ZϢ B`/Lu62,Ҫ )@٤ !^ *.(g\AbLYm‘t@`[C*AKa.Ѩ:w3tikyoNly ;J}h4mB́ 0}c=1a">+SFPt]r=؄*9t-9g1 .bhl3C;{5uDidV:c՞`}ZyMLbR6KyXGmZZhg b -:}=k[rlC4KEaF aumuxv+!O:O W_M[̵ƪRuo Z9ΉZy+Q\Q|UvT QvX왅aʦ( g@L,_O|H7"<7 Ş<-R{]Ӂb/T :C:"2xfP+О7 Kp:?6 մd G*5kQtӐiNaϔ5ʐVRX k@nP,#$eIH=N E ]ӴzdG >ڡ7tw _:6k'¡`-?t1TQ}Z=ۻ^55_01R4 p-Ԛ;^^?qx&|!㪅ĦR I'/xe}J4Μ-K(MAWXC:Z3-!AVMAB%{@32g}{vhLuS"/vLOt'M-)CЍ" @ꃂp kxb#8>LPj+|)'t{62??VuS={جA,lؗ1JօTܢXOIFJa`HuYvkI]lE,^rNxX ^c՘;rE͡{,4KJ\oNX'j5MEZSw EX@G'Z ^$u,{ bFD!.Wm'{ơDv9uH4)yjXs[m -i)TE~}֢ZQM?)/ x!.J77AGĜ}jYTR8ktDdkALH[&".WiK"uxo4`=SHUsuhͰ7/IDB }UЖN%nf}Jms\]]Ϫ!Sȩ\~  x p]BDI6Jkb=-P .f Œ6x{9hT[g AC4,zZ@!l.qXmQ9x Tbh< "kk{ 2ćeO&D{,Qjp(f6tX6rۭjVb{iJƇa ?`S6+ Psjz'˞M]}nM` D'Px*2iHJBRTal85ɺ `> :ɑpPN7%wZM%P*эǾi{s*CP69ߝq-CR)jg7ԽĹ/ IO? /r.$pB]+@ /ҾKlP3޼x dq ˬєY5k!/8IxPjFnvHyMǚ?ӖwJ;#ɲt5P;j]ҐoVOMm##I^>nc5bo5R]b0x̠)P !סdɺpՐ۝Z"V% UזּhOl h"0$M¨ʀS.á'(Jb{`3iޠ(>(C<mMӱ=dט@:hZ"F)i9 \@]g` Z*.uu -bޯ%⧘UlԻ5oFI&-]?QTS#&ᜦ`"h5 S5i װ‰xz B%:ZvV. S߸,v4X@{cZ %"xfANkhIi%Tq&+Jܮl^B_ֽ% Zcl$vL KrBIKuܛC瀗A?h7]h6p]Io8 [:RR%jhքz )ʝ#y>l87Cg`B{#mzXZشK[s:ǵQqV|ea84WUQà#ܼ%ej _5^ =m Ͷ} :=lMęFOvJ5*,'{:PU+mf;_ o;9)jq91yS*Y^ R1ä]ւGe-VJTNDQ vnf?Y1-l'r&4-Օ345 #f,u>_kpyxӟ EE ۞|$!vAzzH#PodOURe >ئ+Uo9|3ج&U@3BxG@Gm~H6!Mh3:@((1,(iMbj޳K@w՛ O ӣ6;񼺨JJ~0v"rM%Unc(2^f(?i;& I$B&v%~s !/$ޡ;]lD%\:tok%`Mc(TوX  j 8j\륹>f0=UG,ՈHkT ؘJ s=W&]qgn%/^$v39q VG=mߞgPQfBBDJ=],ǀݟUPg[6_(J%H*Im=XF |)l2^x(} X n!7\rc|`!K*Zռq8݇bT ;1 *9L 2\ Od<'hFoćNcMfOwQ#"ߥtyG( -_-`86o(la_P1ۋQ XZ-%᭄&)@mܗ5jT()ȯ%UT0ql-Xz!Lq ?թ; (VCK(sG=D'`[q.&,kmڊP..J1- )JJ-Uegl2$ov53K >$>ՈI',<->&!k|@/T,fF} )nNwkp˵)g(G30vC rY" =xt+,ikDUbvȝB^}kjtC?˺[5Xl-RJU]gt؅S+ !96Г/JKT<-6JwhI}Fe@3gl\xVhAS"=D9qc7hFsب$B7ʸ_I-QQ N_c&ǐ| CMڄ.C U ĽVbS*[r5{2v.{-Cs4]#w)OgkS`>u٬w_/eb`ȋ GV J_uh+,ό tEnSS4s6JYK-¢n52&vEZϮ9I,/4Oܯ׵։J;RD%HxڔBqiR޼05,*@Rnjd|jp݂]!=4^ q[ҠJxߓ("RHYgԔȜ{7Ή-އZ) 9J1ij1L]0ڠ6wE,#x\9 f`,PrN}spY=}`7j(_ymr!t53p<ڡ\˳{z[v@Nu 1v->P-^OI p`ɹn'᡾|QkRn|1l>#Iڽ8{UP13.:78ۘ`)aV_!bFtTS7XN5il4#D"EhX?eQ[$Q- :@00j!Jؕ[1'vw:yKuC% ]Po P(X_ƒE(/wC? @_+ERb[9%_\YC! d^C},4Z2iM$=G{,`I %k}(\B(Bdj"!LΞ*!ƛ QFQMAR3@iɬ .~4ǙYl gRò(*TAMz~L_f `~ȯVBLM81~o"aMHo1 ȫqgp51 Yf`s>`sV;Qn"{o|m8 ~IK~>5357W=b2P]} 4 ڔjyΙ?6 o Y $MzL,|o U\B?\S~S1+EIq Ϛ IDATZRU\[=CKLy))Jj4 h38~.cxQÑۙM+ϨL`Ĺ8[pa1 `lc[l| AoB]@4ceİk>\ KpP^6[@qP8P9m-F`Q"+wb 2v Uj8Rm߂' n:3K#+mAOxQx^<(T!Avҏx!Yb F!Yݮ`:om}a c.O~!iϸҭ6"2ǁ:pш `s>AxLde& )ѡM0Jg\iAr, Pk1Ey3! 4뉟m<>!Y K;3S"*RZQ⃁%I#lц) `wNHXmSF\mVbCs p0$feB:]t9 pg} ޥU USɞ2cEBZ"Zڦ'OXfMM<"\y*&6Fc[fcA>Ftρ4^%g-dW`2֠`'e>Ź=IEɓ' ,Unf[W wtD\@񃯴AmC&B>E>^QY7TB+ۚ+C ûahG;a0M}W>;rzZ}SBeYX!J9Aܸx[RkrHe[1?AŎ5x֘H{H(j}@WT]gY2fЮxґ/KYqf11'j1,un f屧:3 [5!uKSRpE.[hR`g}/W/?5 (}ڈ% |: }+%[]n؊j k*Lڅ3wn'-->/>!9A\h]~$P>ꐓ7|딟f߾.?9{9DDGv@v8#nMkf]?)x9!QXnP<ɝvܧ"5^`iq"'uQaȑ,vu]*HcP7ke{/OwON;硱>2ieXDc_1ۜmҰn\/6]p@S_!g?X7D#l kMkL4!~C[:gTU$T\yȭ_o>#'I gTSMP̟:@.{5=(U+y -td6ydHrIj_=NM&\:@?5DL#'A@rb:ւygdoS>h$"J~OtaMJp_POlСd,!56A{J̇洗CڨoPrX"|c=c8?s%| Ժ6WNVLiWg9]:bi91 r+ !yW &QGy)c=s.iQaw  42ra#c\76 V!ݹ'dqo،6\ÊZ:r qPԙS^18)BY Oc-Eei^DipiH\tOI-jNڴ7*BxEN ՙwl9!7A l!n䂷'܊Yӆ;2@$9'-uYC6/dDʾҺJjquG;<:w!\k}ut:up.HR=/i0Цodf,[0$=D>)ou`S)(878mTlQrL}RMg;+<Qjup]1;/9xdC x>9( 7SNVwq7~k($Pp#Fx3~@ Q4jChk!~w*A9!jӾAЃɂ>bkЄ94N}xiZjϨQtC3iNDŽ ӥ Ccδvy !}d`O;ɛ/mO%:%ۆ4U]:ھ59'ah;N]zfvm0.JdOڤ2N! >_RB8] &1Nno~g`.u}O딨XF~+8tyV̻7QY2d@+>0N;vh܋2& ٌ {nJi&Ѱ Hf~oТUlQdp!TiC#L)bjh23v}xd\h/L Va(b8$jONG| h,~CHs(0Crh#"X;ࢆ,5vew{ô6^,&Z;2`eGkl> ބj,gz&A592:XqNB*6Їf6F=l?#/1s7޻^+k6pLфA8kPPfR JkC6lb]tD sƺD=b~&۾EJwxx?N/%f9etR43ؿ#Dx s$ʉ7v(*թN4NȼNޝ`^̈́ ў[̮RSKWs}DiH?3yƞkt@ǧmڐ3|ч33U=#vRD!FLhX?q.K’5ڑ F=trFMp'h/AK}G $nuǭ.gel\ޟ<)4QV_Ú>\Q5(rxbo0R#ϩ=D^XSɛDFfnTBi݁(}ÞiC!k%pF%Vtbɩ֘C';reqjۦ[`'z\~Z< w0u/vht_G5Ӄ.>%jGxj `"CLJFALjC*@^q&T8%<ʵԷbIkRRjIq}^c,V cqO))ӝ/K/ VTj(|s%[VC 'K"C-~f1;<8'WF$hg,a+}_ ׄ_jPKrLwaGN}hf$=' nvfрP?(!,j cWx8͑8=^ROeUsNtC+sk\.u*@&bq.&n eq$RxV^02ZR.4@(ˬ_L? '{#QXZg@@y Wޠ]ޛmͼ5jְΚ&9]{D~o;6å~g,tl[bفZǿyğm]s)f B%3L ^(@a_yn@IGu\WA|۸8mӞ9e -ܮSkyY*P%˦E Nt7bCчy+ˆNq&ab_5A "g3}h'ҌI "ZL}DI' [w4gkqȂ%r^8 }SIuvp0|>/5Y,ۼ#{ [p I 1z9Ę]h*3WpBXp{鋆%aY8DŋiH63}Qޅ/**E.֚@r6*pj69fgh:->I?0HwQ9,2ŹZ?+iKAJkX}&HG4D~yL.WBLJB6 F:oh,uz]yO9;Hiϕ3Nyu3:{qO@>n + -P B].Γp☿%$z4Y:Nw) a˾ ˮ4gΊϻOk͢?Ή]g3NT^o &lq0&_=zXS-j/&"Ng b&zXxKT_)${z=@k,Ct,}om0>p۞K:D<>,OQg7PR9Ia+f=(˫t5N?[QqMeP|KC(yk'&!+qUb{I8gHS`2AyƓOprBfG {UElSp`LB,Xlci8{Ch`3O764+&bN^ߐRf|zejEf#[[ooqdn MJ5'W bߊ>it5oba5tiϘO~F^ſdLQ-ՅSVx&׮=^o0!XOk 1{e)>a--}?l)DmfEQ͘M3!5 @$Uk|sY\ 'ܒOnG폷5 &sh4[Sh݂s_yA~=ntAA5?Qa_ .ӅMC f:kEӠ<1>wgs,pw|l1T|-F`. 9k Z_=/y5sEn/]˪P9ڝHdd4>)4NKL͌~\$-:2(<6a?=9+(Fo??7ZjxAl.VҢt-Id\#?Ow{6XB;!JXVIɿĵmpɒ IDATxpemS"m8sk*JA)&WKŦƕ)%bT?#2;'(p(o-ZřD jULX q6}TeXHS8}i,<k{'p 1K^uz TWTl%vP3 n*dFjj No{|W+؄"kƳv*Șk=ܞ!jpTjU-=jL,$BX:{2PPZlMd>s(cT'QIfe+ rlDR[SZ!T#~ac;rJ 8m9śaw0ԃaUb5-#VI_r%CqF~G|oUP9fMSl`"#juO MHLh'pFP86 In/Bi ( ϫ~ByuTf|8k <,~NDk/zmȼ?z_`~КяC#)CdH!"oŸ?zݟRsK4AՉ}/yn;ňm6U+<~&5B1.zc8XV] Ì5{Ou,3jaܫ#hK!o#.3-8^pOTǚY([@B CyG '~uƥ Ʉ7DXL5~c!0=N+0٬[qc:h너&ޯ("ɛo7K߶$Z#R_s ȦڜKB65˦,GgawLDJl4u$d?ҵntУxuAJ%f"hjsMЬ^B!wV6 ^c]sl3KPP|gh*`)h`DK3 sw@ 2p;:f " TpPk烚 EGt? ~@ډ(խNh6xJOA;gDCAA /A]D5[%C32]S=ySpQ?mva='z04'#5LpIZRc`kEw_&VqHH4/&uRk|;X"^'6!"'\v$L۽zr*ڭT5@$+TY Ꭹ~J~Pb,| Ay&l{)v/ƃ_4BZ{Wf )Jջl,Q.brL_]ቈubRt[KtHYn#5u%ȇV@ͳ[a\I''uG 0 Q'壴9Cyf)o|^_Z;3l[YW9 H&kg5eqf8Cп/}۵|Ǔ?zZO]5*sȦ67Gv^(=L؈3beXϳ3_q6N ޯL4p&$|sө@9Uӷ0\{so%:9AILJoұ=)e XC/d ]H#n5գ7.8C5Rq? 8cWEUO<ьrPBB"d}1gk` ` l}1d arPPΣ&i4UQiU}Hp;9O޵X597Hb-2L+)q5DL̉\)lJ[k !#}(8'?HjG өRRt483k3kjD(F49ͼjw*Y5LC?Fm\X#>Br dPrɣ]3+$<~J%]"YOVLssE>sטlf^BCA"jaw "٘EN8)~;Rd{P"%n?P+ warZ JT"lk.QPP:t L-YDdB'+҇aVs=JFhGmޔ;Z#gw4 %9sd"Jms:6- kEB,OltyPa$?{aUFf#0FtR6grԂ#zp\LdҒ$U )+nsK pnmy4 j9`@*Jk1פkс&ϡ TjKkԭ!& *+O}_q]ޣICD\4 T83P4Q>%ֲdjyV% oG feH8R +#?;+8lB:[Fx'UvW=߫Y퇖3FWh# u< %=`A볏d9ؚv\f!q+.FR4 Zͭ&=i㦍J-N.T́$ų&QC }Ni1Ug4ٌ !s,/! ]  'BlOyѸreDLIGox@F~Xv?"9QGmQ]m#=6"yK9TLÐ+UJ]r*V8n3܊xSĚ|"OBް*cR{\ uf#$ ۀ gE-?k*YJEm,%y`B(޷,8mc5y5{5g.׋pd| $5>h= WcL9wgTDl{3oRZİNԺ6tĄ)5#N<7-sd{J;Ie M@hb\!k~r[O/ms? `{p.ŁFL|_)N}l8 gZ7d@Jm$q5}9LcŮIY'7\NB31Z܄NёyX-Z ul`E2 Zs'#@zݠ7015XL2/D Q^9,>k] ۦt*)DшiDM,:9bb\rTAk#PHR:Bd"2;>CJ&غƸ|䔦F|t0IDAOqkɌT8CQs 84܋ֵ1ia":d9_8 Y&B,7p?g@K4b*&\ܣ{f[ngOO$ٜ7Y`Q3XԵGeKX}J[viØ2dsfoEd U'&l(jD&M$:IOӊ9ZD9[!FCQPhFP˼!<<cUȨPe1}Q!/&S`4 )j`GOlG]TF3֭ayNZ.@#1͈u VQ . %WZo>4kQJ,0LHɌr׬Ȓ #p8D S;Y'JHUs:)N kgn5{?'I^\imrV{){ҟfU|յ4&y|p dc- Z~[R'A$Lh؍๵Ƨbٜ7EQ'?@ڴ~$+pƛɱ^@C̘_HU,@ ma0ynU%P (Jf!Ě~"AmkxESyݥ+C otI&eQjbiEFv`::ذٗ<<1MJ&f Yp8m%_M64)%WJAkj&h dž H\ȁϑn||PAy:=y!~A9NvcHSoFNvJy_ HA!As JR]'lf!e(h3F$srҮ=T̀Z2U9ȶۖ°(-Jr8^lTePP/sMA@``Јɠ<͒vG 0E8C` aqyw>T7EFP>[\iʖSMߔ4Ե{Fklkt!"1h)ВE!JUY (.5ðhO6 c:Dp$q#pLOܓj|dl[1) Rb4(L~%xQxd>\' CqF)hsl@'|ZJ258l ,6lƂEB$~AʁKQn, /-, 98qYǒ\U"J˒Nq1_0c7~م Zu0D FiT-Gb^0gEa˷i"aMd=-o s0?lZԤ+X Sy~9)6q&f&D_JyMz2ء>"AwZSv]MidL[N>R=z$`GnDңt0ݥVy#ifm4 ?+ Þ9Ҁ%,n{@drаaI]SnoWG˩wyL](Ce)k%m:SM!.*"-_ Jy f=0w{NtFXxXsLFH@N]'4$Pk!G& Ca P8(zZFM6DcHci&*Q4:)h4̙m jx~S$]1b2M+ٟ3ZVUaaHd[{@GD됌=yԴkh񌺶#'Zy{<*m$(וg=\Y vRB1}igPB)O/#u"pO+,읮!LZ3*{.k" zsv_ffm@c*%u*!fF¯2:]37H1U~7f%%^&pZR z ?H!EEH.Yr)Z&CAk@E _Y!܁#I$#i<〖 :Pӳ朗z*k`;dbWzp]w<:)BC)&~Ympgd4 6+Ul̐bvxVEC& 54N4ĴS"DVIIТ&T1PVW eY]N!-h'f w~ʦ1a2&e͟i##2q0#%AY~ ѣ|ZF%Y)2CtW 2~݄#ą-cDP]†N# kIS'clQ28qic@ ';JlҰ>*3.ϑZ(0kW GT!`f`*XZ$ hp lluD(R9dx%l!)?czgK5?% IDAT#>Z#0 aNX?{L5g Qf@2fI n+O28*R).UFr3SwJ.1U8@+GI8DQ7jvVm F hcij}/Ms׫`%{{ecw%|NQ'&:N]aKmR!|TìOAy&kU{Z>y\$Aj@;9{8~SeTi(mmD5Eb3r5LZOte&..ޕ@VFwθ٨4:"RF`M&"'& }&]W z<Aq F,qC9zu jnH""EG`6}!1%jQk"7Z>=kAX4 W˶Ӑ7h?1 fU (!ŢpENQ2kZ|3n,鞵!l}Y8 R]Z͗̋u2mv+x; D#>cg&dhUBњl'/EdMpx zA/3G4#}AkW[N J"p鴡JӲ[4p)68XbUqagMFs#p9CF[K@@֨tu%C1GWB蘲A@)BӁ77DGt@6Lkm% B!mkcugftJo1IГz`ij^V7"d% ZY.j`erseqXPXۜ*[A,~J,3nr> ֘Ը`5W+=D, m cj`jJWs"`KS)]Nw Rny-*k0N;v+>or30jAJdz0@p '`)bs&3&7^ %:jD:6/R#H et4D==P[ !k6ߴl֢+Ɔy0OW"9V\EXH3dO=?e3P! swl_6%f Ӷ.. lJ߃4(IS5f}ÒjCQN|~}A]8ע踽lbf%2-piho43s.1f;0gmD;I|| "G7؈( Zm/*:FAqxk6L-:>>t ZEDrZiE*OE GCaAYHTd@F c0jLvo6FedAz"xu_w@qݠKJtNIOD͂~賸e,P][^5ukzVgzWcMb Qֈ2Z:_ڠљiJ涁9?!#V<[iZiK@+)[w$:,Ļ&MNfWА( A^ 0rUY)ul8$nr=uRQlU`m?i>Z:9 PgŠ_Zdv*WT yûbq[s#عm7EЪU`@kc,PWo3oo~7\%إ@\Sajl9z ܲ =n@wGpS ӌ5s;?Ԋk{zt3^.Q}oWP3d,Рb<@CN"a pCchm9]hsۦH5 FW:jSrLT&Q1~GKƌH~ISl5 >'^;U ;dQmN*o0]P{. c4q|mpq5MJ'V4;*/{A Nj٬ o[(@vd͗ 3ݚ :(գD98O1AYfO1S^Ak!]MZU6Aޝ1eZ>QD +=[bvƑ6?]59Ͱ}kmmJ" aaz :+jAo)U~C‰櫘9{ DnjQ){o`Qx+_'6| 8ȵ0VAk &Cmؾs7~pí5jl<$< G\d vv/>-`#Ǟc٧(NLN8 N|W:e{'q ~1y;!}1ԌۗFOWgLU˄`BAO"Vm z0aL"qwmЃ1,][.%2m x=0G5aL^f}ܧN}_q)x}4C~O:bD4<K]:Cї?#bSr :M|FX)I1iFgmgQ<Ƥ!hFcrjxEGGWj8H(NfԊk0̈́?)\ww6_jW^[a;Kt+X XMLضm/>qw=5 gx nw3ԏn/<﹗_Ljht*غ MNvVv{Ko⿰4o3񒷿O9}b ,A [f=i[N/dV9#?Ê|N|i s}~D4q uQL0N ):/gBK#'PQws )ބD P05^cV d چ CRj6M usViBhX=DPu{b@3Ð@[(42j0 ` ?,9mu徘PW45@? \66㉇Z,Q9p%(6=[{ B6n!ek%aoAUi# /G1TNVӺ1fEeNH)՚Uf'nGOvZr7ʰvccOaQMȣ:n26P`؂ A|7x*s"*L@5M[SzU/䄛ikʊFYX?Q%֮)fsUJں>NX7s;Чɘ$?.)n*l>Rl[OxپhSq5 =aHшDy9]!7ϳeßM:9l_YTKfP4dPr=I(7}jkY2d&-h`Ph"X2IKU) !3HsZ\eCwV:,8n-+X6AiRQӍڜYIġ2c0+B$YI!eR*gJF14Z.xOkЃ>@-=%0Ii˼E54J6 jt"O$id>\5XD iRWL|_v#Gqc͌vg q<5n..@u4c3t£ssK|CQpg[o?|X5xhvG1yƹB 75na\O|?hr6_z)^?átx0{ /]_i:X`R}0 M'xۊ~SR'"u.,چ9Zet\G88vFBF1z+P+`Xnۍw+#O;vLgJq1s!=# w]+"#?h˜gr 1P+v;=frV/穐I(HT00(HL zyʔ"Cv٠ }0%iX^ ƘYz:4CC0xD˱2~7CΕNx,e"j|u@jMi:^">!>:`{;~l8κ[#@8!`uߡ S7O` km uCs嵑ƍn2TNdgb-hd2$RґɛV[`(B ^x8(pFr"t< K"$ PPzVyZs '4$f-σrg򚞐Q;M5Ӫ$)2̕ɮ9O`\sLcoIesQ.%JUKOASVYؖqr3'{UʔzA:ZEKg!Ƣa«AIVdEdJzYxdgѩD;u6bBSo[r0JS0}tJ+$XiBdtRqoڌFf,ځ6>>??{=?˰z &1c1~׍X_tIz^ oa~ N;_;&< [㝘pxO;7 W?WcB#X (wV5Xu_ 0 $jf?|泸 WAMUɌv zLLkLi >sapƑ4*#w~O)z݋ X'g$ Yp\:%%uH4c5@~2p=m04 ̙QU" ,:45Rqvj;|/?l LO`34nތqCʀ?ɧhv"ϺҰ)NYq6BNmIF\T6UV+Wûp˗-:-wu}Qx=KƎ%jSK7퍦5UTnnBxVp4!i5@ @H{S)g 5`jF\c^B  c3jV4 CbJT0@j FU04*s.6`ڊ c{+Yh"t5y*YL}Lu bIw`j?E.+@)4zBi6x#; n1U H`Y@e엂YQpܥpd\= D/*(kL8u*d+P$WdNRJV< J1HZe@fLDO|1h>lXN4i4M,I'9K8`kˍxs5W% zGx.ȋ ҐuTG|eIy,wv 44i#0[ǙƊe&+0 bOlKldɥF9L)GEAZ".C{h xT-6 eMŽ ӓFAڨCVmB6Ss(EVטzt?pC*K_m8b:l2 wGfLeҨƒҘ?xl {9/^~_Ytn>OyT> JbD&އ v?] }s,v*NyeXsYXuIX<N`4(^Jdl ͝( c>qNbh2ݩmzXhYWI9/eJ"Fjc@:XYv4Ѥ5l#4䖙ylm74B՞7퀙oޛ~oxt9x|?@g_r1_Ǒ\^,x 2+10Lj/8Wx{`] ͟7q9w4u,MƩpYgr,SqoWa,YC&%<"+SPF /IvΗK1B .1: |u]TX {vtMo=*rhЭ z +Taa{s4 ? ]D"imO D@|bՌ4a Eܭ[SSZBj 0U/9xqPԇMڟ&,j(,`Ǖ;N’ťA6N-)`)LOhT/wuh1b+w0y}k'=jøArj'''̠U\ : P¤w,f"NY^K8yus6w ܱ=RcV@%}Sq IDATrF)V ϨIk>)u7pN5pֵDN>D@U?SKŴ=~L̴nJI0yh[E>HZI tPeBKY7Y=53d. Y2QL4A)Ǡk( O cBoS BTE7=W6M s" 4 @j03w`0ڵA۰ SgPMN` jqpM/^/AU9[ozVW4-̽͘ \J%i4sּPs͡/b+Ū]A4J숇3GOa:\̦xލǀ X2xϼz+3pbt04,h~3`i~݇ffYc }O i#G儎vp!"u>wDl3EǰZ׺֝,rfe`a(I᜙uevU 4S|ƩRP8UqR؋}ꈭi ͭp4J <V`VԄ- c_;T9i,j2ҙHO9߇g8$eFQx>>7n;2LI^/~8/x[qs^5#H4Qkj%VfQI)Fjm`':d {uwwحz=_C@[[\gهp_^AW!9I';7 7 d/Z&vR:RJ8`)eD rW[ #eÙ7=n? t: M6P#rK6 P)gu]Cr{RR"Efty O>j 0.*kpѓ8~TkzbpT1S9!/:>UWc\'C8bb [40<LNd^katЂ%|y±qI!rvX(RK [': rZ1 Mla2d(8L逸SJF!C6ÍMJ p:8+DX A YxǦ Ӳ@ɸM32MyP& amػa(qVl:hqqZc௥`)g ,@arƏ^jOƍeEg9L,TH&`^Z]ܾ} 8 0v-gEKyG|oy˟?{8o'~7lU*֙vb|ZT6cRQȎB+>z%f$)%"wm/Pv?rOl] ߃C^zƉO]}Fcո =h"` h8h0O w3xxn]{v?[9ʊ=nCy 9J輪,<䥔X:#GK\dg")Ti'#`?wd:cڎy[1{GM* `646NX< aR+쮝xx>WsK^l%tq8^t [5ǝS89/cV,!Qxpbmf6`,4s/Y),Ѥw3ʀMfYBUTa7A&>,q; Ҟqdp _=q-7) Pơ'C,čL;ipҌƅ1SzX:ظnGTz쨳Wm]{;SxWvzt:C߃'K#_JwjLLV`PX-8(βl(/[z{Y9]vP6hGkˊ15GӸi|i[o/9n9}\e&ǣފ5A/SW<{,)7!H;g~9X4bMsc91,`UkȊV޸- ġhQ e50[g2c(nqIlEtscZtڷDGE+GQ6XͨQXLQ M[c\FϢՇ;?j11KJh^K9X6-4LRk*$àY62L~ǘvu7Z,m[ο'=% %cљ?ų~qOug< )!zeں=͆iIX>LEwhL 8jg0QO ZCTQd$n?C&Q35*jUDۣ >;(f⢳'pvܸuxQGvX_OqHS!{?܃;q/.6>4ဴxVZ(KsaESA0n v}\W V p~0Xa޷pǽ_2*=8>X5k0fja axmرc7/%Y'2q^Ycc==Y_ozkoN_Ɓ۾ko|q/Cv2 xq>uJߙ@ Fg7 >q&dKw.A'Q6 1; zjc&&Ν "7IeMq+^;/~v# v̝eAMqcE+_mѫ*l*@}=_go \ oO}6f!+i+(eb:jA.a5?vz؇gs}{?Q?l6 WX(T3[E4Հ5l7"zƪͰ)ab.pC9̯B#WOH%B7u rg `x [TWwdk߹Ys- Ͻ<9 )vE 1{pw63sgA`j$Qx~cƯ|Z4r F5%Ɓpd8Y+2>׌ca sƗoÛ?q:xXV{։O} (Cq3Uoηqg=F#L63V7$貮@.,:ugq;u*sXa+q j?o=PSǫ^*_N:7xPi<5ܻ0vJy5̶9⡛auO?6]_ca;vl.x~~g>l{flXoK=VK^r߁{ۆ>OW 7+??ĦsDY\X^ҨY~f]a "zZR/b;MG\ Ks8pdQ,y9yg1?5bBNյ=] Suz{'Wa_w }3jjdSCqݣ֨F\t37M`Oƀ'4:]00 {$n{d/8f 'VZwGZ 3}L貛j4-/䋺͠j}qЫ@͢?ww@?uⓗ+?~۱*li*=c=&kfԷ_;V n/Gs?8}FjzN\#ٰR @*zN0x[`ӛKPv!T;^" -+H!PYdm&J.\_c0XYhċ"U.; F?acAНJ0FͮB[7"Zc4?97`Z_ 00,N\gWaNßl3Ś }9\pd; "Z(QMΝjuXUkwGZ{WZ ݖW,H޿LVvEP9r|5߿q;GxFe+Jwb:Xo n> WP(bW?{ [ndۣc\|Jșzd0I&M'14)n,EG?s߆+\7#/1xj<F58t7h|#gUSED ;vk{|λog[߆oJ1~|SǢX#GǒdEWM]na4kS H)FJ’&ϞIe,O>/*}O+ D"DP@:|A IDATb~J 0~}/a߈)2̮qqds,ŢmźzhTk*GKnQOFOhP[R1QB êAz Ht݂KzKy_|8f570$Qly66.[.~\}l n&ORٻE< P11o>:Wls6r{|oŗ|9z51xnhm_zq=]"Dh(l#< eNQ$˞adNJ._>\};f(!*, sl[wҋ.~x(:'O=q7295Nʥ9IGt }'Xyfh#/}+o{ۯ&ԧq~wx7\8CE$ɥLb!!6n1یIؼ5P`:,`4̱;_ nO\O||;JwKߩxW+/@XK=y;`假詌໠d*]}_y1Ͻ]W3YJ 椲Y35'I+fQ`rnY+8b}@ hq$B<ĒeKAUWHHh-Uh#4a9S9F&XeIhu CXMlxF:$0'::4!~b%H Ozݨ$yGٳ  שn5S)hp|q{D,gmYWqpkiiBXIEh9̎8Oy?~c܍t#-Hq)Kc*#]lsTs٫eM&/Y=&mQY3{׶$Mof ˪9-i6tEk&&AIPJdb(f)(ƤQ1H"[i2IKj$Uz\DA(_ѰbGbTU=;Omf"j|f5=>KvDt|4+r :KڿHL-AeW_20l.DO[sgQO0)Qhc;7MoRp*OTB]$W>|75( L[34'k& 7H1pqY Z [ 3Z]ӆ`^!R пljٺSń`TS]?a`̛9+7(?M:)>u JJyV,0B D )[@П-.C52ƙY{Vj/)L8-}4Dŷ bC^za \F4, ciHIjC`@ Yޑa-"7WZUq2< ;Uйl=!X<9H|Kӻyn "(kf6)~@~v,.29wwj/Ě\Bo85#:x- 1PjJgg%#X3>YcdLA|Ų^K-iˡ=!CEz68v?b|?Ϣ3AlXQ7o\L<+^͏>7qoz#:[ɥɚo&]̄ҷn-g`U,殦шfF 7!2Ƶ"qeH$5ʨeY%:3DJL( qVɳ*S6֚r~SGOm1ȏ=uB!HB%9A''|^ض +$`:7o&x)_~~'-!_@A/Tϡ4PBy!} :]y$gۋb.\cDz|솫[ᡟ0̣06%_'ʱNLshTѿcO<]+@v}GVvV^.,dyYbD z9WTL 2gh*.A`=B P#^G i|%fXyiHE1䟹@O8k=Ȋ~FG) !T>/x1#>{拦 S$5>y)-˺ ˨ h$, ˷ΰyIUnlŝ9V,@/=MO>͗ }1]f <$ؙ9D29;n3\:;`YXǧAN($]E ff܂ӈv֮Z.~5\+Fup+oMVsB$c E5" abfm)x8%5| ls~߃'&z;<_`pe%E1ZcnoBf9_D*qĽG {;sLc\Rfcn3n 5Zzʃ a=],Rsw&P; PYi !Q <5xX,53DJNT[Vok $/Ly~$m?oQvHg-SBl}(b==/}qF'D&imЌU(ƸL[&ڤt$;U:RĈ#V k|z:ԬfHhxp³3p}St&:𳣋1`QTOpF$ݖ1);%dƵ4͢o-}(Oi7]S*i2kנNC U$XkU Lis|9-=B F-6`UL[5m3Y1K_y~D@D^HobHO--l^rah%jгCm&Yh?J~&bX<]89#O>˴ˡ sfv rǃ{ؠ;G30ϕW_d$aqpM'$Zacp쬯b4zcȬRJ)raD/xnJM˻PE0P d95jxhi<%zˊNJȽocru!a,|sb?S)Kaf7Bv °w _O";r@$&}K95W1,]Gɟ|x"c+TP望oG/5,)?yt>sbr.N4"t8ce EV$qI_zsЖm0*P*芖cuF6b݇KX}(N~c9<h|Kf/s#,Ġ,t2Y_\˴),yniSà>+9 *(:NVKA @ϭ-%cV*& ܰ~:0hiPiФs-ËGXMirwb/|6y֋yaZ't^&5՚>J||p0Fx^E\Jc#JVX]@<{ڵ^#Q̉98C;k9gӞ?ivoR$(8jTQ:v"]⚗mīLPynu Nؑ}Q'} N=ݎrݵLdu,:R@фf>c/`B{ ߛ .c2l/С7_["9Dp˰9?җy߾@i=ot6v1W8<׿8<; +Pyf~Oc ,]t1Hz$W& |ϭʼYLi8^ 0 z,JuLNY\c6!:xRQkY MvsvG[gb̑.H$չ2Ӎ.A`LP?U*v3+u %c4}5` Z(w}LQ^qBqevXͩ2t܈B/] u:\V⾣3윩A5ONjvNXiD)gG{[Jƹ[Iw\t GDﻛ,^1EE %_AM{O>K!)wQ=weϰj4f\G{}E m1$.nh%VyǢ \aLi]TYcYVAt E;%mlgd:)OirسEZ{\~ g?3U.uֿn¿\Wg>{(S^;'Ȟ]c#ԏZ^/^Orǚ9XywZ -,].+6_ڋ .rۧ=_Ж}+ki}RwC\#HO˄ sƴivE=1#4ͦOeHW^jJb3W>~Qi fEΙ*8orƘf vm0G 6C\!'CSu5Z=q)dm6 l8޼LpyY|04~W _Bqf2-ṋۢB8+4]d4R!uB}B71!32a ($ٝ"c2ZzuC=V'(e4Alg;Wkw( kx6KILTDŒ4`tzmkhT2iJ*%f˘$FA Ha5y#"E:e#5rj\:JDBRסKJ Dz1<<8.NZ$"c|kRo:BdMp.2V1#IQ&`_YS!Zz.bCJ $J;|X%"QkJ %DFjAZx\ywӧy{dռs zQ|@iRg5_7\dR&vg VR:)l3:#ho;J'Mcd7 DXLm|eAYE\+=լPh)8 >3|HXBC\b&39C{Xff&gB&#~"EDfE<8Qgw2+N,'&6T9vcwի'<(tWsM'v_Byxesn'Hq"~>6zK7,,q}E6d 5}m_Ym~Fa>?e + \.|7xbAvoJv}8,+!Q Z:&aDsOҡ;]'[jr7m^-fbP_=S킁okEfRzZ; df`P)\d.y:$BՊn<|,Kכ@CH[)Y+~Z(HMݐ.1Vi[) iꓼrHKֲlH#do w0KVi~1;m5:K:=lOGo](P]V =*"Pc U(vN:mRS)Ybg9Ap)F&t'#7up05CE0QT\4>cjkD2a^pyJ&B7糔6CIK^S&|6Z$!v1o ̟cy 1^^72aMc-D^ ^`-Rfd5K+$k,3{9;D[r1˧NrqI %uY`Bb1YS1,QSrdyjpxABW7=uVi' _R`&+0Fkg <{ Uԥ+$tdN&5m_QoXs IDATpQ@pZ㙑 }*A'Vg{tf}l|k])Y[dWQX!{ X ٱ MҚ2bU;<(@܈5h p&o XV XM_[ 0<9HaydOmkI  ,_$ɪ!RC9WzjŞe&:JMN0KoR4ͬᡣϮ!pP hDE& L,e 'X`4֬Q왴L=s7!zsN"y[N\ ,orY6 O?sE >a 0:î" oā1k/t΋~"h!*`M}LiՒ? qRcQ簗{o04r97so(N4dx`\K DB*ƭG˼zY+sEB|""(C3 NhR(<~1sZNq<ª=4{!gKĉ[p,E&.h콗Bh蜚&oęM Ş&4tz)2msn%أjaiQpG'"j"Ez &b]G}S1SzF3?>sbƵeiIJW{cbs7I2h[xI$YLZ 9]*a`Ȟ@1u}^ʐX:J9OdrAhr+ C.2b(NMaY5͆.;s3(c[Pxh81=AgfjՄBkF:6 VHS`B@*W4<3MtŸ,G13BWw/)uZTG"9}:s*bA[8M<Q@3و!?kITb WMk:*+䋰6_9wM+m(x$KQ&unJImXZP0R@Fe֥K;ű? SK40Bqߵ"&M}0x>׾}\j-LiXO)63!\bK1.rfE4@FZj"-9aRJ/h4L?AEנ'g鳦jute()uJf\ͷ5VEOr]eqk MC2~EW%"Bs>F;5]i )<_E PkA)R ){=]y|{>@gᄑ5,~ok/Mox#Ḟ|E^ƒRMɕG"HZt|u[QQ$_or˷oNx/c8al ?NB[e mBz*w%q!fM yu5i.rew)"k.gtٵ2jQZ[BR05b%V {/w4sKEZt+ɨhپ)@&5 Lan3>Z$쾴6nqOZ 4cXvRՋk,x2txtSgH֚K:H6oV; 0xF&r :*O%< Yqw.tg$*8JNFuV0ïslWy捬 %1Q1~p}QPBTMT_>C98by!A.%zkc0!<~̑QsZV]"z;G"Q6&P(1uA4F?\A)&qjl:Z2(~6vI{B,hu&YͥMv㯨<m6t&pf Ҳm&Hi\*W#_b_ :-ìVG鴛bi?`UI1À x8]xo~>z-!n #'ǹ$M?cj l^ql È/-΂:vZ}(x4X9@`CGSŃ݌GV[@84b1`BZr>wXAi&_b[)mYKqz6^XHjbMŎ Ϧ_O~ٚ8t>DFfH+y"V"*XP9@ӣ5GC~b_`1kB!\ RJh5l||2IVw2⏏Cx+I-cqgRP)dK.͸;(u`<ͼNg{dqQ^eDz;G8԰2}3¹.V^KLaHyq?/>9Ҭj,sg.>lmq< Ol{oQꤣ] nZIGJ-紀s 1tuZ1LaD`Htو+HqljUYzQbU& nz7ucp#Ǯbh^UOɺI1RFD]l}G{Yn 'v5Ƌ1g 99Kamkd#{ʢnd K5LD_ڎړl;Tx#Vh^'tGceޘ ac1 gRhTD," ?g8&ZB*Eu&Z.@5_G'KqT |rçxW5>D<7P1/{am#(Yiܘ4B`(QE2JG @"AbcIPXƲk7]ws93n~ VB)8~?|OLߚ) xogŁBaǐeE#{qtj0&myDz}Mj|e<6b0Òpq;IQ:{6ײo<_>vs*?g]y]FNhrVB)sfr~5ft>~ACH&"C/>r0MO!z:NfFeہp-}\X[@*NLVEkZ8S%Vf5J9O ۖ@ݶߚئ\kՊ;bt $;6mµiX1V8Shi^EI.žF:t EGxi]TX: +!:9~R6 n=\@ =wUMxLwպ4kJ 9D :IӾ(mw#;t"[|u_,r.ldX˦%+zn-#2MB]MsHsx759j4zId(R:}K9՚HqfPq̬f/-2tFY)[dXt1 3ʥذJ4}[b^GY|$L5<mצY91 ANZV [Wyt{ $N P"5=sT>j0e,V%zfߢ1 $XL~o?<3q'?fz7 I'< ۿu;rKGX )31 &g9^k\pSw͕$2J'=4^dgk!;/՝x*f&98ջ;"ϋ!7l Y: E9&Ulkmo~xJ䓤C[AJt/Xo?DxXWn`垟b"r_o~RB ¨*uk1(Cyz=uDIVg QL\@HAl_t]=7m"s )P~#rr0}f;OMsNr񤋪8Bz|.iS 1ɵ4i-{1V縺p ˏAx|E9f=*DŽG5{k13y?_fQRT(qv3nyLLqZN(j+ $2M"5_Z tu):!0Lu:30B<ì[!a6| aVhFMcLg3t MO lVM mҸ&OlޜIF.`tӐm0UQ9:#<L} /_+h%NJ a[s"(J u~rL&;u*V*tFCj|ce}lz)kng>.C_)P&J[`a2/h+!Y qzs9вn> +hF6vޔ9CS-mE]۬m%,ʅߜ-푙 @uڧFw2D!LT2Zv4-Z?gbKe6)U@D1γ~.ۂKDG5M$zh̯T4i &\rwٹ{;QeKoEpl]zC/b {P~يHnTy͚.֪̊5Ħ&V"8˖X3WKrMn6TQEIK8~ 3jV4fHb,+<4 FLKTOs=Ǵpqs]-%z tb)N`M; $)!غ Z۴h #1VUdY6;d(a$rSg%9QeTda"A n g6⠀51p&}!]hTXZ_wmN:6R$v]WMC IDAT{܌?\WJ8mK+7ny ΪM,;>'~ϒh %GV`U+a}ڑp ,T䔠xf2^U *>qI[J'9nH"*d̥֠ S!s'ؼz3P-T3OD?H*lJm}+#ehm P!EMVgրmײ"Af8k^- !({>#lXhy,M:ζ/AHST1 GkؙiهØ@K:&Qk[s>Cd*m`93]7& mǑW'vN )r£$~ɒ2(: @ Iv͛ȏ׾j2jtOfӓLT 0qzV;4dSdzڨۉzȴKp4)XFKx'GIYȡq2`q1z?oY i]@$ЈxNl@B jV:لi i%մ6 vdp2-Lg;90m H4X+=& ,eזI`@\mb^^7e+8Q4._a6ohݞ`XAVɚ  :;ȑGbjObHQb] ^=Se**a06Vb3JnёAgm@]\iPvEF2yd8s{C!lȥ lDMtwkmؼMn1AGJ>nug^n$%KR8]eFP`_ʹSN'"1BBEPpGH jFn*$sT?/r>ƶދA O4fI}\ӔjޫqyflFVL,j_w)jWڜRTcځhMQyEYh@[ě;hg1gRXC5s% FENB ƫEbMBhaf˫3m<}x^z_6\ N0;M ZM+)rBҩ*,O( &m$ t\fqdDȚ߂vHm>G̞8ɮ?)bMlUXpu+DN ea]`/BP1`1/~NղC* \ eM>M[Tri>GQJ O.5iq !'ٱ2 Z%Ȅ!۪c?uT=VP*L``/ scƠ³Uf>Lۉ57?qW'n;QOӭ+hj:Ĝu+>km+=F֘8shY~$yO DLr9 yU[y>݇ʝ-y[>R&Zw9A*/ $aBsg ,] u0ei)l̦\|K)3K@`84K>CHQl$w 'BR`71{1Ù>*Jz"bv8#Y,/%Ő((jE 7CɁbāLEdmfOD@S_$:93U/ۆadJv3E@Y63FJIJN$C? !P $ݞ冁/l;ck%GNfM!Q:9=db- _3ˑ[qBOMnqrnd`8}$3j;geD.wVy߇8 <{d'Xp;;t-IOnYJUEyH|1I}Y9 ,ZX"뱙*tn.bIE/!'ggIt$p_e{j|PceKHE4e| qyJ"aw~> LFHs1Ƭh"mMYeðKX#+yE`F:*Rlm,[=T4nY甸Wӟ D.fjgM|0sqƳN-YL5j g6Vk46\˰`yA#vgIP6x&4 -[jB8GE"t{;AO9$(rAkne0!Yal`%߿dݝ~dnԑzEEC Ct9Pu<͗g׋X5R~S&BJaTNoi% y Ʃ}FXԄֱm}_mbeF]Ș>/8e?5sM&" 2vPta m2LXcH.Ljر(iq\IR A5bm݌MA9)#IZMʊ\b RW)|)pBHW >K#pt/O&1b((ypJÞIFE1*|YA%$׮ JV:dHi`O7"&7a u,N[7gi\1d:dY70c 2ɷu+lg%!D@517WaeX (~!9JS_|W8$Dt>6oNg&&h FPJeaMc5C?.O#&FYoxۛ@.-af}N k-/)GRE=xhKI3jy3"˼fMz ƝA{Ȅ1BjSرV8HGCo%qY9~C}vO68@gYR4E2 pK۸!+*$2$ X|'KhƤ@HV+tL"+JNA;t),F9L;9~;^u]%SL*$7:l1L^"S{ DLZ"eD&^@ZYAoz,042`R.s2t}BL#eWQqG8ER %CLKH4Ʃ3[OߒrRgv0z] X$ގ-:|7ۏQ 0½$rt_aȹKcdC8"HS/NKH[zȳ,˜7[Ǟ4N⧷EKsx wy=(d|KgbimyiXIy#?$Cg* d2Qe͜u!Td#,Vx E-]ZK֯~ƜZq,d !^_6~> ]٪z,ؓ7.j/\H,y,,x=#Բ+9W:E{҉)2WQ' \@3bc,c@X88U9ⰄE(Ir-QF7 m̉yk/E~o F :E+E`FPAG)++~=8YS+-kh2oihJCV<_;q7^A2O\y/%\҉`Xu3[DaqGGLz m.$%vWV+ܔuH5ͬv9wGw8BZ6\k8gv!:3/|ROQ=XwNN~;E"->x)hcHtwУNc%Ҧ츏Kj1Ibx/,s=|>Kg77vN呥bX$Mc;0&UWFz6=3GgyϾxď1tJ9(';x<>i51@ 3+I]N X/)M=BX(MԌi@HrHY<[S<4i[^}XwV̰v1N.g$y)_ܖ[s=Up`U9蓒n%6`Շ",Btث/¡ pqMЯ P5Qoz>.c\CtBXj-2*h"xF&p72]߂dḄS6}@\?9ˡT5AFjhv\Q{żZcWQ!.Ķ]DJM,F7BQP0R6vT0}i2M4-5-[[HV|Jgqe)g%+7s[?_\3?M%T% S"h6_FK>gRY7 "2CB>awo(Y2%֨Q*c$M u1H m|UK*%ui!x6i(ݨ˹j*P֒=[n6hJL@)WVH*Xw„9߂*_?FO2x3s aIg;?qdsݬ{˻Щ`_PU1ݬÄʼn2i%R"h -g3ZιM:xT eW+ ~-i{XEyd 4jMV[Vyw?F)AG\/D$Hy>r8[П~-ox;}Bzr2~ _ zn>M,IGv91|1zވ e&6F !߷:xD wE%R!ţ" *Hh'&-uqBՀFۄ4bhMd<(e .b=N67oNb6gT#cQT8{0ry%D[Jӳjk@TpA G̑ mLtaY>.[n[Fq \qD2`AEjMj&~i6qm* }DG@[-Nᴷ %lD…J#@F$ɬG`N$B`";Yp'ICgT>`|ˇIsD?1gj+}9F!z o@jV$OXj%RoLtZq o%x*~K߂5 %ٍK_IGmճH!(~Nf.gZuP ,[`h9% !B=<ݞ׹z2N%W*2gheiERXF8%JK xi-T}_(@yv,A%cHwMdܞWhmL[9]ν^ԩ̂MEi7/bk1hkѺilV Qkr4^Sml -h/̢~Ӵ37N=63M?AϢ e#Sφ=UY7JquLtYױk)p1R^n]״Y84oй'o!}'܃l"2ClK^6m&};8v={h[쵐ㅯ> '^;ټrűx,qv@^>ǧ@4Nr&3lilnݵǧ; OkOpR'( 7=~EXcSzm<ӧ -VMhDe$TZkͤڵ`N (][uYH%b N=WUjU'뎉& n6ҁG/⦫.c#鐚vPikm1=?i0}{'>Iu`o 'UH\4†pIU** "h$.Bt2lйjO>.f<șsYC2i%wrfl^\mȗd)R,:BŚ>[DIںBp>?J.\9.c秘;$FFI0 dQfO&D*I+NHMx(*ZtmXHrޟ(}|U[6Z>VTXkC=f3-ix-h&,ϹL/~3c!V:Lq}ǖmx2fmhj 8{{a^3 ?&YsǞû`ŕ7pmcEUz{<•H6o ~jQJa2w9&JR>Se +Kq(Ǐe ̌g'q7~ o|'#"S(1,G`4HaBTV)8@qem%#֙B֫xaAkE@3 F7*=WPi. ֯ZEgO;'O;_|{sp~l6 z1 Kr,jKˆb?'ѡ,IaiDfڳIo& c/R"KV o|;F _&*0zv0UN-ݒ?q|8q/ݿ7齷rudV?sd 5>g@[qv4Ʉr7Up\lCGZNXC b†5~l Jķ\Me,(xiB'hݤHaEؑP 4$HV $h#j4٨M2Ixj!acUX3#Zɦb':dKfPG(T~=_JLW y_I;MkG )뇖'ZU:2c'9Z-I%Ohϲ5=x6UQΤ995M=C8I<yb"xd:pJ2t$V O ^ (dtRN"NΦqxtI ,tuS*I$jo?&<5+73 Tײ$%yp{;=C# H !v 4f5X cWIrɇ~N^"q7ޟa3mۉHT73-VQ@)B[RE6V<Š cX%sd@a<ػ2TTV aCOUMkpcndlw-(g0WEVVIQ 4 ,?AZh:3<3/It!I]4zH$miU*s k'<ltu5݇ prF $wV=W4Rwdwp;qa޾| b(ڵ8$I^@zV?++I{ftU;q)ɃXi)I.gy4ܵICS_Af[#)g(a-[@OՊrO[3)SY"\ЫNk8 l,}㈏Aqַq䩗dCY,gl%gItdFV(8'9ǖCp1©4/n&ufə8T)nuʩr.Dumc\Tx$tk*u cB!|aE8/mMGnK0l1S v*$fsLGhŵ=Y͂'@`/)4{ϰaC(Djs@,٢0 ,~D% B<;L-Ą{1zJz,k.Le O7 I5GQj+d@Ǜd)Z竿D ʼnnb QL4Q1GSjR-+ \_UeV&+ J tpm 3uWXKـl?Z" 5+5"_`?a~Y۟B K`ELSbc1 lE,I* )EsZHpԊ1k]?dKe_@O7ś︃_;iϺH=yg?cν<3܅ !UL{J:ݐ]B;gtM?iSTc?k{=0,{ûx CA2cTynvg~}sa\ygȮ^N')&̢_>.Z9ИO3F%d#yV{xEr'sbA+I?JlVQ٧J֢ ŋƝ#挍gv㣥i͌uu[3 !pq$a4./1_ei7F;,ˤ}d/.3$;8].{F'zjO|['|I Ō[g5pG_wnk;pl!BOTHkcRL$ɼd{'??zc?Ğkc;d+LwF` Ws=;XV>@LKL =/$de|\r^cFݴ rXh̝.脵Ǎ=p]Tq6y88s NL^밾M2Õ j6 H3{YhJAp$#ϱuشA]ZX2_zOUot^ɹӤ+4{vxǖ)Mr ѻCymncltv {Z׀ c>x3<-klݔYRk0'uu%T|Cu-ZõZ85:]ײt\3,"jd 5NĮzP >[Yyx E .9DbLƏh`CEL tD7qfWUZk̙I&I BA@ +x-WDYA("% ғI$^N?{~}ڔ$3d>[.dy7?&͏~5^̚$쾈: tߏMcܰrR~[hhg˶ iÁ-;Xr>JD^͊{_t !&DwEΝt>^W!{watѻc :G(00HoFIɷDx^x @*$y>w~twW׾,o{Cwh<Omo}J 6>$twv0wչX o1nU[t l;]*@$*RJ0y0b|fΝϥ_Y,`ߞٽ9X+, n kB`K6ɪ3yqk;>ݎkYopğVH?]SIYUƈU1Ĩ趾h0j; _ TML1RJkcJ9?׵҅I!N{;;q|4ޛҺUeT,2>%8@)kwwltL8Fq.*G @̋K뉆` <ۗVb'XJ@'\w[xގt {?йԑcRUSM$#*Ϯ̓C"MMsGo/:s0iПN13=ώT aރ;y1kvc4Ju<74bp=_@$25@ XP"NU=t9}{5lbz$ qP71xzj$@57p^7}8UL9:؝)(V,Βx[zgt,C T~dM 5ɭ4e:^DɬAPN)@<-^'X5ԊbP!bC`B{m̥0Z 3dٴҚ'F'(~,*xE&Dgj ]Ԙp LGͺ !-C:7mC%rW{ VƢ+.c+.@D|Y篈A?IHYswzS_YVO,+̜e&Ec?gTb҄Q@qkRdvojEijcJqh?CBh~I3t;m,}U, !{Tߛ~BKNBkb82䁟nkECxV&Tmft0-(ZYPԹ>C[)'IrF+?z. ;9wH Kd(X׳kdBMHRY^]'=#"E5ג2yf[̌Xd -# Q/$9f(xÞIf|L0xːcň_ϊ[g%u9qLP:UVz>Q65e,RݥdpZex& IDATWSe"'X*J7GɅHݓeWJ}1/@2?wc .RA:* wiZ,'h>i #zOH{9v&t K5໒[*QUmǰ~'?v"^}y7KTz91S7I+Wbѻi9#ɏwm!_–F $޽ב:I=rYr2)A|qwiD$ XbFbڂ%\v ӧqd$81(F<> lNpcZ|}!<@ NjsgεEU1EK|!SuAsEScZ;7 2y9;Zy+Z\02 xt}d/We<,Y46H#LGgԈrK-FQڪYW$Tv!#btQ/ 㘄_GCzcg9 `MH"'2ѩ /?~ `ЮhY0\T ϔZB103ܓM9K! <ݝDZ}ԐR>=_h?& NaI|egI{!b %2K}*/ۻ8C>,>ry6L#acl7un~pLqd[%Kyb{; a` #;iibK ZFr!)O"#)`sK=74:Va\a}F-:Xxưc(҃ lM$`NE 5 ٴ6Աag;a|yMwZn-kDB҉po|˛?]wo}__߰U˸5LcrC=ʬ@aP#r\qѝU"x@v}FVi2䃏f(LNƃv- su fL[64MV>$rAQ"NWO,OxԚd`)Y :fx C3m+GHp<6_TJ~TJplx*P>}ۗ*K =p2{}I#:҉i,*Hyz g9ZRZ֯# gNjBPpK ҏ56.6g/e$H k-tp fPԣ bSèlbU|^`6>RQ;*)\U1Jd.:m/7B]z¯ Di%s­paeJݴ+ CL9!m|EUrtsn& Iy(!5&lK M)ǸmϟmQ*Ա$j%4=bPNta:[P.3Zyi!46 Eͼ=u/+/ƍ%Fr1ZQKԤis}4b3ɗw#V\<nf[c`Ck?}i45A8`¹8F`I Cp*C_:b[I+>(k[i{IHC#Gq *ʉzX /e7*q*\XAah\!aLgU[\kӛ*A-S`PU5ǤD"@SΏ.Ƙ" 'ߴn|, bF3U1Zk*X[J8*z1"(hT $2blr" ,26S)J^"h(bNI,hȤ[4V^se|g<^ O=ªEבaIEب¢j&%Õ<h4Wqcac'uϛ)^ S NR78ۏ8A^{&]S ^y&1#Q2cy8 BفUNXƗ? Rbx/JgL;-a6c7ϞEH!J yh3ΎL>%>5̠=lO&3L&8z#Z+i{Ro61 Vj̞kA\ }qo]M`) p!2(GWFŎF*0 MD7F!-#Da0s2=^bA"!4Šʮ NCkY*~րFۢd2Пq6>#Ex_ *.@snQQS1/Ʈ7xc* qJ>F8mF-/)L9x[Kr SCc] [`8ű я>sF$-m@v1k:>A1j 'vY#M_.}|]׸x%w8 Ϡ2\sťԶcz؅dߦwHp]p1(ozmX,A !֫sg#7c!)؟b_}{|pa\Xy .]̲ hl .V%gjrֱ1H{ˇnxT`wл6ЗPm\Yp4ΛtR<~/p̙-+m#xNmj/p~2`A''MaJ2F][GoC/<3؇%d|Dj,ᥘBC -eQ)V6%׳ß/~=gu@W;71|5]RiL@#}6Rj.% 29Iv!FnⅩ1)5>8"o̱DBh,ŽC sฅ"Ud(hf#d>O "[ N@p~b>G Q]!(A 8S JʩE6!*&5`V?Xܰ]0RUnF(Kb*%*E͚T55jMS 8U]f؛rJĦ969RJܕ(Lῠ'F? }{+AF)r"f ql!kj4gq ,_bL!4FY65d[%}~vO;\ zTt#L͒% x+.7M;?&y T hw\yŅXf}3Bf$S@*QDiVw<х3uΕ|ww1v6 V-MTYȩ0iDFjXZ09_庛yOgUE%'.H l"KCI?'x "H<4 9mqd o q\a8+x>ץ˰EC0I{! ?0 \+ZbWYJKecƧL{:ڞ`#zY"JkX>=MNr)hJNkm![Xudp4# XY'Kzt=Gx>v B͜|~CWgerC#MWx|}5L)KNh14LJylk~r;= L X1A*+GeɀfJ):1y ,bԓcV-QO@8ciBfǘlaFij }d(B xR0 7hY굑!jfZDmACZ (^=S;؃TH,,ؘ'a an;P <=/FjJ1t?0+8ؼbL \Ȕ_Yg*p?VT]khL/eR >h(%=ceLBoO9?V!O|F_ #Hd\d!BXh?o2 ^"I.wVa7bhPu:i_ҋ+7ŒnW͙K~$KD+ ,V%ZFsh7]SCAt/z9:9ęs Drq`9Q=9g4Ȑ+AfKT݊v.|3nrEW&ߒ?3w^yzky+k=.463p2)nȥDG&ӵ1ǿ4*@Ifp˭r3wPXh65I_?{leI\K =JwW2444mn'HE-.N"e{Zs sU#OLm-,k>q˘۳[gyqݳ>dB2 +F)NZ˦|_W[T0; ^#Ҿw{DZ p q\VaA$dwƞCSc1=j"NsM*kTwn&hIE"d%QENJD9WvtV.ohLV5fsU "'L^qu8^ :zmȌM|<BiXrW}Zӵ n&5%!.Y-93ҧ oI NUj}  iW ̬s`#,64oO; Γ n/X9O+PҰQ+Y${{~#8˗4ۮyx;hhl !0]`RB? "v9]ս948 >))/0y NDI@ BC$^~9>Lk{o~ Hmw7%i0^L\줰{7ϊWO<3թ6N!P,00{6x~ v u( (m,%5}l9:KO^;;/m&ȥoMeQ*~s2ǛkW?g[`$T60UљBB 6Yqd8Hl2Ԓf6ہ4< GZDieru14u7('25-ٺ5k{P}vY`f:V-fOg} ]w #|_-G4aR<|d%+"sjvdێ"O-FJUhڧ4 IDATx|#>,t cLAƧX(6͝tCԭ\+Rb)8uE?tڿH롢ϗk"4"T&@'0j^ `{Đ]vv?qN7 c)/05#{ZsHڊI`*jaÚ=xb}Ĕ141ANCSd0U#5B*`# +mmM۷vgW(ЏXaGdfBœS鎹 =)фؙʳO5. wOchL?n Au}ynwU#$/қ'8ynI$B#`ҘN %"!,oɣ,":_=<-qu 76  CLdY';ۚYgbժU'o+$_tb?~`O*ON$H7`'B'n#6i\ph7 k$X^Ue]DJ4R*:!jhK5[{0]/Y0^yȀf ~ /]XAg,ܛ"Wo0(]MPK )layH8̙TӃi\a<BL).FE+XP?۩"Սf KE|]I/*F=u 0٧0Xk#|Iznr)pBy3u2I%yeShUg1uoZDHehk4Jǣlb bqM|N@L0*=h\/ &$mAu*1pxiXE":HM7P=g%3z.#j2>jvF0sד?8JZ㒈Y 2ly\b$'‚ O2KG2̫4ƔB&H1iE@/ET"Gf청,L.OKXfz,J5y P. ise2 t߶K3:r,;CxI7c+c. ϲ`r 0;9(x,:WOx5z`Bkg\|zr4b_ E D1sQ6(l#ڛf/̜{x-C{e)pu.b̓?w>o7p-1)k]G04mYb#KӇhi$KIg_2C& ,7{fF^>) #Y^}|Cri 1nR~=~~w/| /lHHuwcy`?m, +ή6I9B$ ,ÏmuQ; YD8, iQQz zWXOM2"Z M {cIXyb]wfS̖Z>j :8ncϜd?^y?G\7o \|mg? 솧:˗%Nײ}LRo'ӆ 1\Y#l5@ڎG摩^8?cy-_:j뙗nEhJb@% #Q8SJ."&ɚ-U,s{Trbh B<@\m>xh_Iy@ )]tj߸."*JqO\X fҝC0BcQ"`kt*@39-fdY't>c,K-f-Ʈ}2H%1o~׾>>~SuTV^yxŅdrxkq 4xsMGRkq5ŧkl['θMFDAܴ dE_1Zc , \oF <Łz)nBxBV2x fAOѺmc/gc͹t&MH.C>1Y\B:#Xna xPIu!zWI1VeI,y4@[wA]o f+xV4MݜbiE52%)՘b QAHH>Gb;qi 5Ĭ e-R) 8~>1oQm0lP4 bLU.+@,+GϏddBםy# d۟.\?ose|~ !8Jz ґYjS1@iל^Jw-؃ۘO`m<ڜY[Kf"XM5nͱ/|ilُ!xضM^{1ovH* }4q-BTO\Dyd|jɵk6l㮝{ Oj幵台`z*p^|e3 Rf~~l"A^Y1\GFK4.`99g/`mw8H&+,f|t}qa__ i4!Pb mo~f J&S[<W橗.6w :@AJHG7%y઒Ȅ fKwt>&˧DAq(4`ÔMt%֧*1ΉBI?w4lؠMfVz4OGH5Z).ǦO%ʆ ;Y ^54/} !>q$94lY["A')\KpK&V^CAx EV<3ū`,GEqnzymQȥ!^;gh31;E~hHĐO~*`VL#о$Ĉ.Q0t/H #B l40Z({~ ps#Xt">u*';вis}Lڤ A *CPWZEA:'dH$L2}ܹ^k}ʭ3 O2k=I>gggfBɷNrͭ ^}s&FOqn?P[*ot_T΅xR?aLgDhrlZKpd ңHg;HC)FD/57bæMb)z0'ҫ47ݳ|}iV͞ _~;ٵ)6yU 9Z3<7|+ټ3`:(ј92)zy\h*̓5cb޼?A"ЍĐsZdd=i*MfU5Y0]u&d94a(t,NNGFlӶ v̌ؽs3E5ʮ-=`'N:kCd3z 3< |0s%S_OhO410׊ "D8wm Lo˂><؃\w0y| 7m.n%l0aSeG6?Z\=bf88[D0'ৱ"&Jy%IJqDE$$>o9HVVŠLZqz,v|6y!)[`yDwnE&SƂ~t':ٛ,$B:s"` l]5#5Sm)j;v,[7='WAp$ tن(YwPFrMm/|je vgx_*gZVx uϛB6c~]H^βgw?S񯿂/FֺnҦ3E]r]; -:aH8ޗS{1jYM5GWPz<#u/65xC3L%mM#& 1[N(+/YM{,^H V>ՅZs:K6Ze1nΛ. 9a@xaQ7d!h%m&q2^0sϠ9GU jl"EDE/.9R} ݌qgnf|lG; 08'cyP=~8Yv3^gpr bqc/?nwqK_Fm.#I{\uOXLA RT fH@.# Qf aQ ~Ó#s*R0V{pչ=!z0N<ɭBiLxcȔ&-$SGoDF,l1H_cנta:X3jdU@uiDb,]]zRz"INhr?G~jz\u#13sCDg(t1>Ua}JR*E\sa/yQ/}1])Ld2N\T +PEaG˹ v1NUyLibCtB2D}.kw2!9{nKO=ěd|{8qj!##r8 ꗽ~[n4t-p?AW^q Ï09 bl'Aw~({sonlƄx("[qr XCr/"yǗRVŖk "+EC88 YT"mR'~}|#Fu޻gW^02+m+]c ӁH0350 =UDIՕ(#+☟~xۻ=Gl IDATr1BЗ0BT&ba}&>NX zQ%A{Kt?)pS= gFz_{/N/| !D/Au@(!qp.bUc!&:ńŷU|\\?wN7}|w}>^s D=\jY,K{KrU璵yvȉ IIX8LF-7L7PNc-+߆1ГҳaE@aD ="3pYaI$ٗS$,ل/$8͈i G: ?z)]izSg, .:ka/<ma8r;/$?QkE-sl9͡\~n_}>x6{46Q^|# uװa fLC; d ~7`*g~Z3{hɾ3d8}B:Hju ~ 7r"uC}Ld_Fj edhɬ"DuE[,".u`d֊3p]^Y+F+ǥwk2kJ]ڃjc7f+cL#|Y,&pRSߖM06FՖN ϚbAc9qم4EAGkothXOx,259RySlѡSh9/Dk:nՍYV:BOjƇ %M]v8Կz& qjld=Ilp j/)y8d7nMn ƷF ǏOU8\TdX/dc9)ŚaX! ] qs _?Zz5ěD]G-=Azc//?wh46o' #nq.a{o\G1ZQNoWGr0c!kEK G| =eT(|z]asu`I# }AuSE./d}*#5[1'hL$QB9ȭBWz!۷S$,f"?ʱ{AŒ h)i@>u`}<檋}y5?[fT%8 6xgovlRkQK/x))Ejfv\zV+`y]bXa&Xe&z@aQ:\I:ANW|{)? 7Mpv_mQEX{|x[Izvz}_ΫRU?ywɞ8'SyAyC§iz{Åt*0cq)+Nn Z2Q ݋ E`HTPKw9Tݽ[~7o~:yf2_;)Ę7;{%Wr)'6-M+L(|U_G#Z.Ac+O˟vHAnhVpA!o\NHq"$ϋ&x vsQZ2X [ʸdKɄkYz N,afP 9<+2!DЌ(!ywƻB>@aO|KiB,6s"njq"riP6aIRNޡLlxnW$~yx)d՟/τA< I4qNputyLK~Idm@PjN8 vY4mrϖQ~yN/pNNC?qhcwyZԅBIh|ޅ_9_`O(kùGUᱶ L<=ZI.&HaX?'r5'*%r1)u>-,JVtIL2c|%4,,c`k%}u>Szsێ&$'i)I$t1hi*$jMqD#:b:c4Y3/;F\';-}dgj'[uk>r2`del2޺88~z`d[wۓ!;Oh4KKǺ[) 1GͦU@ D^HD:-Y=ifU)jS'"(hgy+"ń!orY\y 0!L!)  FÏNTI~&@؅{̝xOgX'#h:jtt$:y?V%;UN{]{գ~)QG#{ꓤVm&$")/f|_jTd*A ^N[Sޘ.JAMqֆ7q{Xa㟏"w+<Ir˙]8VD#jtU$D,\w&[.'[)G>;WP+0ӓ|`m#;Fy99_QT]/$uK**U2Ix.˷Qu?tw~纛Y/y)g ـ) SkCq5qge"D;'hJC^3{F+D|2eLͧcU̡%3?.\'YV`򞢠 MV\|Q'\-oMdغ4Hao"?@U~A)55F^~M;ÿ9#ڍf 8A0:`baq 9A$w~(לGT-qoo5#{7ep% i;p:eb.U?TLb{Q)/x`hktgiN`Y8jpsw O I5DN]h/G X ߚ+Ka"~qʕ4g 8O "p.Os :͉n{{;»38F,hڍPJ[k% Z GݜЎgt/EurD5]IXJ~[cRC&oW3 2 b'Zp,{ 8M\FR ? }RRsJ eA": ,s}`ِs^o5Cd09*=cObV_ji@*>q^1{ȟuMZ0JQzٹ^eneS\qlxJSgWB`EXs%wq^i#Y{ #jhSF9fd?n%%uX"J8Y$=2шp)]އWAwwкFm!kLJ&h;vCW!$(Ba7$]Pc&aYthb?~6CcӤr`^a0#0ҢdD6 1>ufxlޘB:kfQ~,),r~(uͮ+ۦ m(`c WI鰛r+$-')đK,FqE]}?=AX9f)"=/>'䭗l^m/7̉^D:Kdb-y5gJm?QD3m^]'ϴO33cI٬8~YA0qHP" pƴ &Ցڤ !G2Q58%."[7|f{*DoU*hS{6rYZ7*޲ \vb&}>D }_>?Äb eЇd281Qo##LS 2j<THKh)3}VѳDߠvi/|ydV&pÕ)9NT#҂LL-əYߣĻj8U٭$ox+w<h2q8w^ky>d?S̶~p_QwLPgW媭=I*h1$^4ǓGlCPcLsiYt%sx"5k7JKeZel' >+ lAP jr;>ALBJY/pJ[4~n>}2=Eb x8zbB:8tC_Ƀ|;yS<C&xٞ \uŴ[Lٳ'㭹K(V6Aoffʤz5!$s%St]کQMqݤ 薬uXẍ́h,˦hžaǯS]6o(3ǜ_GPhOCJF-'7}kEQJ%-^hK+%Lmn}۶&.X;d¯7Ez{$F4piAFJA]z;ʓ}N9Ak!m8opNͣɋtg!~m|Dbck!}ɪ W&]hƗR4݊}3OҺi`ց*Hv5lzT'NalQcI^|ɮ_Qnʫ.ǯwuVAP0%>QL%8h0%xѸuCU2ήF nfnt )iQ[S>t-(>Inj/P~ a$aMXAXC=He,?J:?@ cvQTk'^n;щ-R=$E{twm$Q4YhP׮#c3G9NMM0`8uZ/́W!ew í]ʉ#̜rS-1 NN{0Fht6+/[bֶَ'VggSiD@ǦZZX+\׼>jUt:ַ碍[J{X{ehi jEi~Pఄiξz}(8ݴHN+"MHG1QDv-4q[x l.y8}ι(IQʧ!62k6Ն'=d}9|783P8!ɹ>>i09'/?%,R[ITGZG.l>+LRIic3C#'l~6r8L(wT2#/(NV0R}.>'Bǥ_AR!ChŷZ˧_?7(O%ڀRb+dBV8Y."e\ݝgcNQKu"ZℇH} [fu?͍[x6vG?NtԀKm>g"x/àa\a6=/ϳ^$IOk{{itph;4c:qF:G tgpƼmṩ:u-6=^j=d7ݓ'|l#c&i0v3ND_u>rWTv5[ț{̎% EXs^:YWs ܴ*SIbӺu\|Go0M[e[uWA"L DT\'PRo !R-E+N8/Ǡ]HSDIB>5MXj=ϢM&+;ƀxX{kWg?מ:M]kM-YRF>R/-@.'\!z )rmF@!r[WEG8o<\{oCk4.jE-"ˎbCFVioӑ1v:(։+-B y+ɝ}fNaJ\k]v#AY xV UtD՗&!3 \cKtĈKަlƹN4KˆJԭd@ w=܁Bi88eC(QҐl aۺ)(Ѻ"aP%2՗9Bbq`7[_wlgWW`T[-.8!|5Ken_^~yraBgQ2&v++b@WG4f&צDd HGKѕ*:թ A"ED)C$3x)P+ؓ|mKHmQ;.bu< +iW\ l8k; cǺ=F6pyE sy}ܾ/vs-hlD ]{oZ_WnV*aR  k_|2;~oc|o~3W z鲇 | h葆k8T}dDi\&EƓ-ہH RFe~vz>2?6cL6+!#??wp[Q>WD IDAT6͛EvGIfi"k6uExN'waI-!h,J\aM%ީ; ?i,ph4(qP..[N5qa,CX|Ōq 7\ѝϒMq"{AJO|.qr0#E7ìNc ģ* PB2QQ0 |6U4M'+q!x8\3;j[$^%17m4ה&CkC7l,M̞B1-[얀yڸߏPC)u.Rx8n=T7m3@sB+$ }l^{/h.EPXM$$j6J$N Ifov%$:vho뤈ʔ謥\]Rk>sB_xY,-xfv9`n^筹lK:cǗ;u3~5h%1I+e_A$ZRak]FN ĢLX)xd}as/+Q2>"䥛 BXrUK۝lMBʘk\że&Kt+fi.&IJ@Z)jS>lP&KȘ›w<$ 쫤8K4l) 5d|8/ȆQ@.6ܪEOVX6#."ՐO%Gfԯt q⢤l2 AG6"va=+}'C~/ڑ2sX$J* &<W"^~}w< &Pw,*/u\CnD1,,٠?=)vr|?K^F6?gOOm>*n".*2(v吩 ˟FzDgjz;w2;:FKI!`5gЍ:O&VźN{&';ihf5"^;Xj9߬u_-x}ws}'6riL$Q sӶA6i Es:chD=LR*`ko7_Cӌ8~NwoTLun";YJ\~:*5XJw8QOhF s;ׁ窘x'/g_wǥPpe9gZ'&ٖOeUI6>.rZcNth$Q$J2d mg6ۛ,J :#G{~-\?GEf`lU>: Nj?Βk2l :6 ϗ>MbdSv\k Knwƀܲ3 &z uVP(#9[{g wը8'u$QajynrY*z'j(ϥҏ0fXʥW.Jj2V4G4lYpNaknUz&>UKWF|[N_7Mi-2|-<\ih0;3סp"kXD@$+FB F🈾^oٌtiXKWH .ܬ`F86K7" ί%=._޶B_m'y[ U;7*1shkHEUVYy[ՐϮDTe1q[n8HiX'\J+0NoCC,G^D &#M6ɺ+PS?o3C!8OlΝhtm.ٌƆx@&PԔ`eI%e,f,yHo+?꯿ 8F^4E-:I`T`<o5tN%Q) 1P@x hk>/21NAҀ:N Qm[!.!ЄC1Peppͬ\ Q'8҆H-'qơł,iiS\nF3 Uc%T?~z. _@a,In28[t&/8EVMbtS)5!e(2Y6iL>~ΙMPℚ%c Ci1+D8aBIF~oCXR҈ "Q+S8AvhgBqDY"ሢB%u ,GG-x'Erԭ!B˭BYwFԪ%ǿO}$mMPxVsN*%d_U})S!fU#"u/K809@{C)oWvkO}Tʰ ON$^_H9* bT?\{|OQ}Sh8tbgaB0%P9L'3ΞWj9Q3  ֢f\0B`^>:wlL:΂fg^"E< )2& Wx=ͷ@g-JsJ%eI҉$Lewc|̅R4j!H|дSyݤ/+%" KhRx]$LЦ}scsЛnMȣsơne3*?[*(ecHڂrq >8΄H!Nhz6&" HS)fᗼe$3}x 鵳nM:o;(!P&~9 D2ZGLXps4liV͂ls=xOXƢb`8n;Q'i\#IN:/{OLI\{6.nZf`e_'?9o\[brd~{M_~,Y,K5gLbZz/CIpI\A˗3aHQ5Da8Gz6t[-@)NF"W YI` ,b|Kfꈕ!^4_ /Go_4 )OM;iI60QWcN:CҔ+U|g2-?ɖX2Kat?0̧ܵH1=GJ8 WG?J;nzy;ɯ[ fЄtyKm`Cme# $"l0V2 \Wl[í{ǙYH p 47 WV3ldϷ .ϒg},, XE >T _KE]j}? AӽK, 'Sɉֈq8<, 4Bj` #J%VpWr+:akqT^CF듼z^W4.QcڲNfO.F` q6״`#p$:?<=12+|icRF$), CO TQHZM=@?GàS5P]O'LΝz-b^9@58q,]ٮ'DQ-Jbyx3( Ls(8UDyU7cAegM? 'OK v.*{D`R~_峟W{06pq0Pec u¾.fu0ݨRR0mfDJ5BI;.e}tZiA] _E:hE%,/8VrK0tts)nR+@L lV?9L>m'KJ4$4Hj3L90r53n!?Ch,j(l`gɓGX:#iNQ\)Bf?nf33u S˯!)]Biˡw=N ,i]DaҞ?ŧP8RS5ݬ46LSV6"9X"^ Hw$aXa8/_[.M$f$"q$]ay [Th)ʭROARN'k3vͷV͌X5M1u+A1A_-e]s(RA00Yzk}ײ$5M̴R8_ExRm)S}oWtGvNU Q՘JQ+-jN_0iU4EKyD#`"֩;+ҤM3Rqֵ7.k8T/4 fQV'x+J BE`aˏ%頩_ЮUC y*EǦXeV (wry^fUp,=Tg*(&QTgzNArB58$sWvʵ]i)$H 7ڏ#w}sM<2v[a_2bEU{^G:FvGX-_RT&}RRoɨ7 TV'Pa|_zܦw͍e⍈\38y5mŎuJ(<)ʨBšpވ-yb]DilJ= jg7ufa)qtr!|C ,Sjkii CY[0dC:FmS`) v[wv7̘eFӊ;͞i>48s5nÅuzoʁǸ2_ Ɬ RzJ]%䃐bsT&ciE`SS"A&DС!0] 4]{U "}521N0[ gpO06V8'XbybWInϛP«SJ?I,$@hNh"QB Ŷ Ds9/E])^E)y/oZƦF'ae`xet3N ! REYТ~[{77l7ƁXsժ:/Pmx`'?~Y(tDY NȔA $&P?cƵBY初违5;Jmgix!P,=:͝,6ȡB+rTw=tȕ) CbBW qOP(7v1@;TذV*<+F )'^kttM!ZPfK787q([Fdӽ²#Au*0he$DTu!8͞+-Ht. !:V:'_#A϶ \ 8D \vIZ*+=A)oB#Z g>cvM߬ggImseAZNkWrFX%G@1_G:{C5U"טernFpK[LS1by`H$ʧ[ k3os z?3|_.iLrx m . 2=R5 -k6NYԚ@nV2:5K8BtmQ"FEBt+o~G5@f yL͘f&T?Vkvި-;6VYߣ+OOF}ZӵkoT |TDV/ jQ1j 5h88L cۭ ]E}]hG&]Ѫ3NO)v{P+>:esYK# HP/կ/=*)֭x"vާV{:FuDd&@٬Xm/8KdGFkߑKȲ"F3QT !R:Qr_/n?.}V_ ˨!A HP Ae$/r1s8R(`Ĭc,R[ZC$O"SIANS~vFK&`4eqSv: elv3|:i6$ @l]PҼΡU;Up IDATBUrUHuxPRhY.[*5hi-GiN#:G:hjִ q3@7t $\D0BnROw_JEZKyqmR )#S[KnXҏXv"$uヒ>'ēT%Ij\6쉹6ଠ+Dbdg.e ;Z<ɞ5STTk_ EDST3̳iv 09R[/D5#A% '@QqՎ5GQ&w~sף8k*(pAxE}Gx:8O\{-t:d?ϴs WwU6.#(Ut4zؕFƀr{'>5aLTJhGh+,Ѫ.w~b 'Vyϟst>4lvꦸ.!%v 9aZjTC%Ґpֲ{TG @O:2]a}amLmCI,auȒ=umY K|͌5!r44Tq׳.&Pz*戂n)c+PhE@5D$će"G"V96YggxK8MH) o4$AIc@;B%N qhђYH#kG!U`U@` . HȥXjD|=:ͮOT\7;69m= !r^saaτ7˂:z6_Aj\>Xd2fx9YPq3}b)59ըѪC%Wl4UU)4MTdl/tԌG=i֭js`/ש~Fiӽ l# KXצӯyMT3O[n鶑|~"T2lZ$ S(4:ܗ:Gs~:RsVm8 잲l,/jcu*rґ"{b._@xhN9sZ,gOjr+MW ϗQAbZ&Wʃ!(V_=?Yb! bhJ͜I>Q(A@'pi4p! PM)Ď9:/O m4P(m|dWlQ8ID缉dHjuDo 8N\M` ~u!7>^VIWz$rDhyRy퇾Mߑ7}]'8g6`yW͢+1&/}SHbKo/v}5qoFEuNyj 7Vۇ(*s#Lh^ryxkv:f jGǯ"^Ƣ~;ɛ~͈Q@؀M]ncax&䨖~ ȃ9q,*%okK [^B7Ja+3yXP4n[6gNV7evrp,,":uۓuWX.A&0kmK)Cq>;5(w(?ʦ [_gm[,ArtO^q?l 2Яtqf*z #D_!׿L5pՔeʃɃ@Y)HeŪt֔hwNq}[`#~FƋpB4ٽ%^ h|z<&Aa (gP?c4{<as(pju47I4AlO=B`Ĝ3P0s`U(;r"ȱ`,)1L| phLsxHAed0ϮӒefki|RY+6| 6Y])i/`Ȼ00=>-~&3@:gW7K5j<MFF?:yohKG|ۅ8vQJߢ!}}9g3t-]A=FJpmhi{]fӛT<I5%dM@BØfLX]4Xѕ' wl}[}^Sd`qAs&QT1tWu6|fqXUsKl=֠Fmrs`vFOdV^KO0]pjuX'q.8u ھ _Q.sh}#1\Ѭqw6 Z)r^h*ϧƞ{;0]8 -q96)>[`xG^=vv]:lY8okxOˏ>b6RKR )rMS*8NN0cyήKϰ=K" Ug'vZ:1K*ADQEp!v@`P}ZkUλA25nǞ`ڕG' c{T+Ys(r_  g3`},ݴ]O`a2r <˅\{'o#`#&8Ib˴/g/aCg8y2v8]]%\-$.ށEۻ]LRrZs F!=.KkPϰ̵yz}8k/k֝ޣYr#)JQ 04C1s0`$-gzf1;%W(3 UcIA<4+ONQXtU*G1Fge:[GhB{4&eĐaDRWmY+18k:B?8D>OUgϋ<۟1].̟>bs)ZchatSkP(`]c 2N4@Y̡>NmM=/@t7\x.}=t)eJԙU7n$hc A- Z6p5_K2  y ?ۧ4 <;P Wro6հDlcHbgTiR՜ ;Y\cWtF[ud&}a0#Y?] 6u"4ҮR!Js~_ 6/B^TT2yo3hR~W(ey B84ϹI5=Gpm6y7@0r%A5FiĠLKϭڨVs)gg~(Cz>|BXf,|]l/^67l$-P麪h2*Uz\:dxI!Gt!IZ4,ӕ6(rL4 **>w*4ƀ:EtP.Hj}@5Y?I~"˪X*GLSkS&'gCUXjjhI PҾD扯Sǭ ՗@73g4n~2v [3;C=HkMXdp96J%4shpI:IV- ]6* l^/=NҲ> Ǧ7 ;Y}ElO:ƊU+ص}}]E~֟{>:3r0A_O>7ncML>LM̐DD /gwbjKӬY`|bH5AGIKk/Fs}Bft9eV˲rô?XU NM gSJSԪӜQ.LI; z3%eZW)q\y#*Yr啿 %Q=͠ho|T]41fMq0SRhr?3Xmq؎*^O(A3,"doq`CE+Y| S##Jw2W-Zk+c^XcmB.2LŖc$"2+z ,R%t+D Ԅ̚5h44x_d5|+7MUpۭ5ǒgqDV| yv\54*+'T\Ṣ ?IޞF PCzG"8oǓ՜WX 5L؄g D}S~a6\q XqO#~B߻M?w+ PPk$Ԫ3v*iM:KyiF8 O Wob36|F~w*a!uFIYg?) !N[^Zx isu<ƨg\/@. r?Ô׽IK1!er:%R @tyh*AD{K.xJ]mDs/qj`j"U { "DLq!S:OL*r.ae)"Hz"tpO b-%Ӡ'HuB0ʯK?xl"zcI׷XjZus&2cqJ>󤨴ት> M֦mYzZ{:mus 7'P:ERhĩNcs)SJO*0{ٹ'> n\V}Z0A;;vF t!bE,_]I8U|#ΕW\Χ0?>v cŵܾm/'X' Ó;((`HTUGwɑ/νS *0xn)!H̴u|:>]1Rk3j%inۿ{ g,26F)l䭵iJLIj|QEFa1Q383x~3p1V-E^漩(,S.5ZS)[ܑXA9vZ1*I\#&4 sH@(lK#jRm4q6j3d4Qc|;hiџCϨSnNA/Y4bFG0A@}lgBHWƁQ40?(Ͷ[o`2]Pq rtP+qX^m#>@n Zmw "l6BcGEetxQ'T{n^ϡzH)fYl&vBwi*8Lq`V֘0p,[~HFE-Q+ z"L\ʀ2k1_ۏ@u8FB!7*ä1]G;O1rLR*%~zoXýQI{wXyI*eW1~} *@IAnbQ7XWJr! )IUk9F w.:8b,j5u(H|w9NW^<͚"cq~jn2W()%i:wzgjXRq(.xYߦr! k`e<3n-(֕B?{]>+.KmO|vƛk^k\vy> @iZHS69:oWQQM0L6os_p\2V uauUW]I#q<6۾ TW]t-.3[r=t=|ukrLڈM;X:wJ?|ws{֟\yo.$E#nJ_uVZTJD9qkh&Bڎ4ˆGFl/ПWR-!Ab#DŽQDA $q%-՜ ;Gy@Ñb07lJ EBC ,F <2pG6%m4,9Q/6gx{gYubk Vk]fQ|2]GzBǷ{~|ad IDAT3y)OHdܯĿ'D!$> {Eve7BSIwz=$z5=+P5KK)F<(N[d~6{WV;kr KoX\4E8Fa ueUMWNZ767oeAVɉVj8i6h ,6YGt4GjV2?9$I8sF김\DK2Qvmu&I=C%cpβ|"&ƨtV)k2WmUI.EI֚tYTb8`4Gz*HXUmaeobmgl['27BSYMM T9Ef=[ gqE)LȎI-sӳ;#&L (KpnX'טD4nQ{b! /^ LGͫ_ȟS6n6]@"iV`ynt /_6,T,TXi eh 则)|Nt- 7d.lXy_9o_;L9:h *uV"_ߊ;jlog;ygxEEcbbwq@7bU۸wpyho>$W.-ŋLj;aq!ϽjͻG}>K/Φ}&=d~;6f$͢e:ɮcWN%p.:9'y\kNv8-Hu;Y.((|y`Նd%( ɌM" \.`{]Cl< ̌K |ƛ>h'~͕߾PCӧ?gx1GRj8]6FљM@cuGE_r}^MױdJ>'_`zYvq @+\~bL[pѳ-PN8 <ꀈ1a~R@aqpHz v4ŠEi5y%h aP*gE!P5oy E!k㡱-fHr%lXLS.gSȑk&|ohr+8 N+X$yV0~ҁҒ֝Kiihmf[luPrKlbш.d.rP㒬$+-5W3ZH(u?ھ=|]6S^ؤmҦukǐs˿| L\v|J.;o%9.>b_?.;k_w/v'x~ꯨS!oۨZWsͦHiTsa]z:)x4m{2klEN>W-^QҎP"S(puJ.y},Уkk-VD!+,huCCtjs&pM*J+Y m:&. I6 ŲQ *#PɜdZpBpPD7o挵Kyow,j6h45N)>79g.wkE/3M7ssQP.|/ӽtSʡĵߥ{F"1sMm-FB䘉UW txX<s2U0nE*9!=Kz B%}W1H!0ܶw:DŞ2:AG>"_xˇ/? \;o+/sl(Lp!>>v ǫ37022; .32|죘Z }Is<; NI3(&P)a;7M'LfNxU!ւ)ҪS>u lJE욪h؛e@,KD* zyrJqe=:]8ͷ_/ć ʒɂ{}6I5f}Wwr3zHFFjIGDނ,9gy@7eA'M8kJ֯?3}r )-Ǩ%9 B0_qc,]9*q͹mk׭eҢJ]sl^?ɱml\ס2#2wM]PAbr:oנWҕjDfj`c9YD^FϢvo7iIAGd+xᢀ.1w{ǹq4hBŠBUT))1QN5&맫?ܩ)/!"T->2"qL1} '󇜵'\ _z[kX5C;!W?/?J4ɥK0=]OWx!MFf|yhCn J=uG3dG{uws-Ӷiջdٲ% cb 01qHBHB/ )OH$ &1eܫ,۲}wv{ywfgH+[7~]K);SS4V&Ydg6z-hOWZ̹Dh]PyuP)ǐtZ-qj& UljF Nd7:ekKt:$HJsXknW^a::-|kDclw 9|%t3dj3I4t{4BE eA nb*I̟#40o+5V3}GD (7RN 58P&L@ tPD2p+,poxټR1^z("È%y ktӷqޅ<̳wp._~Z/آ!MQi :HA08W!J $\zeuo/?x{2Dt_NtDM(Z5H}ZUH+chlA] 4<(A(D]Du~ik1mNX|Bk0A #T=0hĎV5]RB1(CSkzH,%bYpα6T$o}ºd$vv͹UvTU.׭vY% jPo{7ZdsD8ob#ؖܞdmeƏ}gcYnIې(b9ľq.@hA*O߾λUKGiN|ͥ\_Ώ#7&#^&P#t~)O߽+w^.>ןn߼;LM'L5ɇ?u{M|؟P;<>O%}͜@ژ!*V-3fMqX 7Y {`_q O7' 8^uKaB\@)B& ׭F/ie4\?Sy4WD'#?#{ክ9i}c>v}|磿;"I&D0ZXp^pAaVeyBkWB<O&:/$tL J92@Vǂx&څ)cP Bʡ\D0 /O}>څ+,J'~r־gbhxRS>cO=F~,,x׷XJb{q4{x ܸ[[{B:F2~gGmF"bIT\-5Ai v?Q$O;d#mSo%]-r^o3[,&J RI_f_b֘Z{ڥ)3WȂ)DHQEtcPsD$[XFo檈2DD2Y"5S竱wJ|g KDJ8:wՎ14C֨07i1X FWY/MׯFju^>Vp$ <{ǭ?`= 2BS ,xFpV kM;xo"RRNryyr~Ƌx hxXQF7PXDYk_DW8\FWۧ8֋U3hFi>`K(vB"B"~!~~z٩赵k$> Dgz߈ثUɡ|#dc?;~뫼)l=VaK('Ob=&KI/p\jBl_'*XYSDOA HR[!{c >\&fE+Ѹ"$T[(Z;  EjCS\T%#ALDJhT 2RM5Ѽg޲^U"9Y< .G%j/%jSB+6\V%UB7I†"ac,!@ aG [D H+bt6%n uᣣQ2#<$FG":DZ53#; G%;2BwW;+pw>/s#Os  U.aE:JI\<%lY֔RqUp]I^v+x[䡛>c:;:eK༭ηo+ƒ7~mG\pf9[0Oa/[x9g.X6(뵼!#ábTȶ6Z`u82%#j@8QLՠJiA {x"96{ /?-gPu'nܑqk+PVPn" ҷ\7 D EcTUUiB,"QHₛĖZAJTw :4u)-6xy@)M88 ˖]y;G'aojjYs_a3bюl̀6FI,re d7vJ#Wӳ54JY@#"jo?u≛>L-CJuy j2.xh0T 9cR*j@"LV-aP%W\eIe}i&ILm>]kaMk V4PVX?!,q 㐛ֹ)'>+!9HړȂ_Koj _*&K>VpTc~㾥xQ %գ#K_fS1_գ"~r?{r%~p ,/yk_nGSi8*^YV3U yzljȚ ](-RWcxt }1hU;G>2DP]}DH.Zez]hn !X5*IV纩p$߆%>~v:veFPSN'R*fmli0ڦZe:^2rX2h&j' u;8Wvm(5i柝*?5l,VLX$*(qM#9MUHb#8n&oBr;>Tn= 7ˇ?6~'9#cwqݻ88\ {4%Q%h+I)k#43UfB~bn1$d <*A2$mAH6rE#dRpOwrpx‘ŝ~Yl>p+lzHqCFjĢ@ []wH]jpiT2SkZYq1Ğڦ5rGvHIl$vęE'fE/b'Үp%Ap&9}fBjD :DJ92ߝuQ"9Ě/WWo,Ҭu0u1+ IDATF #9% 85y6!׿^5^Iʡ@JzQH[ _6,- L‘!}fzw'ѷ\g~ҽ-,c,Orůg9w{L:Ϊ5څGG2LXC=Ie>XqXIҹ?9lh[[9c E7u!a_ xa̠CC]mP0]ԙt\w9_'h)=#ncQ[.uضa~A?·2pto/֊;+: ;׼HT^,|E$f%**,(@XAF 8JV@w")U8m!Ԇ֮\C.p[ݝ4LL8,n&]28qw^u ユuW\LԭՅ@0 glNpSLhe }ޒU=2+DHø:~g U󇢭Rs0umNC0QWB9uY]˥_g XJL&N搊Xh.$0 JT5}{E&GOO횬{Gk-DPoNa-fz+Nx scM 1>quQtPjӼiQ >} "B?@ xN:q4'H?j.k${W *bdR TG\L>d%zdcR D-w{:FcCnZ!n Qzaȸ+h]%c٢H9aj^y5LR!PF 6>sS(eiY#bBytE <&8]Lz-q)A ev>,zq<}qFV]Z* {ړ*3Ƣȟ֬ t+bQ0Jf¸qWr0Mzӛض}3U?|oG̗{b go7_w-6m$]ed SP!6,[o ,H͸21 *_3Р-F|9$&{p86O=M=Öm8?ȑW0>8 O?7>w x`%Ch%ch;#7~|~tX5"ʼa=JcARE SWqfWóM -Vx½AѓT#az}͐3kK͔d:DͥX2-p 8sE5Ptj6fkB{U]rF(dH4/v1:k_N è#%sk/U#"u  #Ttr#hKHRۉs%7o# IP~D`ϏEİJu&Oe(";DZURJ K%[~݄=tKh톶FWvwvs^ޘ[P5xf%z.$U<:TwQ+Ǭ ʪ"` &e/x}Hl[@xbʰp]AYjmpÐnWa?_rwNK8J" &QeI8.6\og&?[eMfyG(͗,?HU"a%rE\v-sk Z6.VJ9Zd-ɓ$ \=w/xab[레%>qqm ;su_Uo'S!#/>TvQ k"*V._M&gZ7oqAЦ 8&O'zgX fosaw+,2sӵ i2Ϯ4[E3BPҗ%/K#]ͮI3E}%vX!xfJAstqiFQXс~S1˞xN(D2I5 |0,NsX4ⱟ% /'<#.ɵgP>Tkg U:7YWcx!v߯ڢ9%#Ge+5ʄGxˢ4paݬZ}*`\T(ͺN^X -c(\b=.i)(v5jDŋ6k mwŪyaGn ьpdhȹ]utcBcFTش #"TU 0r;w1޸y1m2S C{S$kó1e*1B% PZq-4SN{hY8Q+׶ H1 _8z0Do3O\p5"*]y!ŬJp\vC#|ɣ%xd~xX_y5Z.ځsYdS+iؙ"rruC΅was0ʊ}L/Iz<4u"L}Om66BrUYiOg %F(͚%X,>_d€mI2LE$u0~ӿ-o65MX"AK{y"e,^RaCa[Ot6'eVLe@̵Z↴=VW684/5[cvT;UHA>k6[ Q6#8ʼn۬ͷE S׿k?Ūd|k*}dwu~Q1m=vK EQ[(CPk۸I~Dc`-pZO?v ~1H#bM,Zaj`'7Cv:JuP2:$4]m4z׋6*D^jN:W@$B-)'O:ZA|8%dND-A\[`JUԾb e'.rm嗗f13fmS)Lpth<\ײC 6ϔ0Zี.RV9g`:}/W D- F@G4gam!C@C9ya/4&X)aHb/υV!33Pk4VmW֔nWRZ&xH,l=s3JikSPQK߲E?pxÇ=:gw?}&-fsosCuDc9!4}޶e}}gs(II@PDdlj+tzx}fmQ/nOh$ZJ:s+yo?s.bǻNщ-Evk}%x`8ѣYuRkKOt`,K=! '.U┅GUx߯G/l\0sO%ҬD5E9:a-ny,cf:If suL'uAe#|tqYSShɽcjcfFx>cU[)W:.hqqc#3xG&#=2",0E:[,F׉8P>*(cJRFs`t&k/N _oYd3Zf@yc (PJ6kX;ms+f@  n,:58C`khٰ׬~l8mԀc ,U&Q`AvI6XƱMZ1MWk ZӔ'Kj\W;2}_4 }k.:I`JT$:~ټ\i5 /TrT?︅-W/*a|ݢ]!DvA&؏arZ}q&z 6M;Ѥ"]EPa?Ň¯]BU-![dZ, :^5WЖ(v}YS ior9FB+i=2(@KC!_ee<80Ƞ2f j>H Rz[0AMhԠ FAZ\'E]<ڶC鸠 #C m:$!㳰\x OZ%5K0X6<"H]t4>o38EVc'ּK$F<= izUMsS6lUN&(,II޵T?yi5ccrX2ko^[/k;pƦvv>E@K[mDZelyomO29xG u7Lu-t4Dk!յ&:`eGJc-ģ˦4Dxrl'z DSo:c[{ͭV nȮW4h4_K\htiZ'um1)f'uO/%Z4]r1Xک2N(XGj|ÄD5N ~k< _Ix@c|'t6Be,%xy|T !Z[ʃaY2E;Y&"Z,W08Z`hd>u҅Jӱ|5pg_v6D>-N5w4ظYΑW 1R,ҏBqov k#3 lm"9]_rې-] vPfM/bG~QJ*Q޽I ³jVn`ͲVG[G<3fI*'Xpii>$ObمS*Vy* ]p&A8?i( &VϝFl4WkM/0wj2b'raeB-cJFV B0gf>ֽv,)%Em)(.F2!) 'e*!2.=I*EJ2)6h]U <ٱe!{z*9Tu$]sVX؜ɤhcjljߟ7,LT2II@?5" jV9Xl*HPWu2g[:C]=xvkI NZΒL&@X]s=Opݘ0I %SE  \YsWpםRꓨVLxj-QE BH0Zm4; IBzJuNMGXLmQe߮Yw[1bΑ85?.U "7HQO5[ZkmNa¡HQD174ˀIIB3 $D3Er<:4O.+ ~H(<P)_D"&p0$LpĪ4-3#I[2{S'AR`U; L_D߆#t ) yc,"4=-9t Kgb&tI Y6)LdrDn~K9mx 5}ݟG<YrZAU15AN;qj~IВKAb= V,{^3J /ՂN!RJ2hv2.~QA9 ͼQ(E1Ⱥ}JtŮ( gYG#*_n)bKsBCha y嶛xFK&RiInR`]m"Ef5w}gMTS 0N[&*Bҽ]u]`qk^;%J.gY$>i^aݻ>sV:Y_AYH,UQcFCő<X>iCp4y8֊4x2ȕCX+ē"ōe"x &݆&D9~*18m}UE2aio塀n@ٴxvQK.P{kH8IQeۚ4"wkk;'$y'6EQ.e}CRTPg%zSX*2cDkA)RFs)vt(1I*krJ5$ Q5{:nV<,KsncxU@[0LsewǏWH1$ [/^<6t(jjUm<+gZ$ HT."B_@4Ha ,61$ټ0،(⸡:2S)U#-6DmCXCP.pmyZ[[ H 'LN cZ*SB M-\n 7ܟFA֩$ )q&8S\P~eYDž IDAT&KxE$Y%Na3T Jg Ƅ( Q!6)Z2i[VoxaƋzZټ}Iyu͸NrN'vsV?C>{\>oe]/O񑷯MɃZU.&aYp0a[u1ȣtu,jr%$s-dFyӒEFaIiAv`=(**L[!JlZ VTr#rݽ՚BEZFr%p؀}L)L5+!-*/UBG6xc28Rp9R͍/VV;mj63^a=q96˻I5gm;+ZۥB!,xJgҐq\B`[,V,nKP ҞTV<6gD=EjZ%Sz1.oAnyqM=:)&wsc%z0.[yϘN Ȩ,rVj4qi 1=Ag.|\?QAf(`'A{ )#bN׺wΕ( hz\qr95Q|1Vv4`ݰ8_:vZf8]<c"71WwɚJ$5L<.btl)MdVkgZ Bm {z,)b38Yں;$X+ f,Dߧ+$ʡ<#4)SeZ;4{MҞvd DeڜA||^r1):RBR1f\砜e2X,X ht"t mMНѐ|Q"GF^'+Y/*|UaI_+CGHw&,# qQLE9h!5JװNlKV"Kl_(rM )H5`%vU19z[)I-Bu(2k^l 4̨ŝyq\Y(rW3Uʖ|  '<=VKzO"pRYK-71vYXiu.*7*w#ȓmag))rDX ܤfֽŜKHD…0tIŔKX)p\O _|F"kETd^Xd:{-8(lM7I>5"bS#tvҞia`|Q+YqȈ"f*KWS 2%QM=5<VhG9m6N`x~ By@ kYrydm3Eg!끒JM˹W? |D3-haMBbc؈ЏmhqL|B )3@ ~R!I}Rf%KU+"=.]!JJp}ct{.JrUpeSPb%$;I.{$գ6%k]dū| 6VS ټA+2.yLbv}ٚy"e a eɜٞ{QL:'USxGXA1qּVtጤx2HtvnF@X1swkPj.JXBs.t^wahBSu\ Y^"B Go%dB)㤝nH`p-f300m\ɎՊ X׏>K*Lr]NT]P2aPoeSil`V%T'I<SS%/ѽr%/dŚpA:)?y#0o&;|ZR8{wΙ#_{6wmcrɯ}-[$BjPo>|%HqDX~8W[d2s锤wσG&XӑaUGR?ZҝMR]R;Xce@j^GF^:/6vKKZӠ2BxXZU.и̥ [w4?;ͯ{ pd %, 2ABْI xis!i6 TbEx)F1;)bpX)F JGZݭ||b:S(ih6vх[$b CuNH *҉d8٩d§FbbW*mF\QM3'7yG /LX)8ᲦU$eGaMd(L$ Pfmf}{4+wOI "Ӻgm5td:Q4IF*C2pO(! F\@HzWcOsTxX\$tϋNa6&/FpS*'D rD"`-T+eŠĂ>T?L\кa@u=-Jjѡ;h!BdhquK[!,~'ь{^H;)Xe!Ţ&ݒ"Xc${9:ٜ$V+iE c_kc}mdlc0I@Y4f'vtsGUݝ{yv{9 ^ k51k,j4p]EQ|!>yoFF 4ִZ Xg?ͷ:˶'_2Ha0&6#2vo +$6J/CҽMTXň Ci*CQ,]Ă/ 8͕)z*:c&X0ѠM*Ǟ} /$c`)-BHF /#^ر2^Li<:AP/D$2F!R($,l3\:l^ֵLfo QX,£6%+gʖ'Ȳ{RL"+@i'&tcKhLO1\iX+/OV&LG5GJ<|w@[^}ˋg"0@KRФE4!hq=AA6dTM攚\J&c9|!/{ &I ۃg!}O5ض4^!չCñl1钏F ër<ȡub UjLgM*>KߚqDcxjM[yb+:a铆ua̒ļc̲ >aJJYiM2>U#m5"G&Y;TD=H.hS[_qΫZZ@JX",ҠkmXF"(?HE'8Aix}irOBl*vq<%Mǜ$) F*ZPQM6], j4i4ю$奙 0@;f)d <hz6]Vz)dz(m[Ȧ Ÿ6ӏw% z\o[;vn{Ǭj^%~ ehk] X MrЏ޾mKY,oг#eX ~q}/MbЌ2j,K=u|!]s,@ G{V9x(xEpc%پ!҃k:̮}R|}\YҒ8̧B:7]a$M7 h,\64_-7TXcI @X2X!!sՈ=K2;&g60!;Gzgqדevʁ"֜zKњuz +98>xK67Z+/-(,xm2q.XHh69/kc@IX nJ`gCjSTa !VGNѨҩĊE4e|?GsK+G!.=u?Wzric3ǁѓ3if3t72<@![}ʩ{_L35/U81rY\)m<β 2L&gDL[;OVx"x %;}h^[)Bƭ}GHD8v4$d jsɘ(ri$׌9%1#I9o!n灀vIV&ſÍk!GIҝ&+bNI@jD~ bv/@⫲TfY)(ybh+/ʃq`%!50HĉXi, lZŴICB)HymKgߪu;Y-,yFvsĺc[v$3hsmGM'vA ~tfkǾe>[(zKNp\BO#Y}V>yh2`BeQYv]'V W}59'R跄U/aBwTMƻ%_f7{M\s^,i2\Fl-/ahW1TZpjs&M#z ,ᜦdM.:e!D-)D&iƛ[{n k%%j9ww2I294ͥXMG{}~ѧb7`d6b^-:mkriѶ^H* iGMɂ8Slwhi0R0K/#r r5bq;st.جeag-Q/eZ{904ZԠ'sE+&5pIY8stӸ\rvxߍ%E ɐ![B.*mԪ5kXa=JJ,aioR#MP*8Wk4j؍xJݰH:,Z?i銶v.Q6,o~eW ]ʦl9Q}6ֹ8IzD%B襛`=]#P.a8 :PgR,j{ N-VGHY,Bэ،bj2E`"NNh$=h)>~ (Tj.fxx86K.&ӣOLEPݜ/Ӥ5t5P+u|]$Ph25|$x7~H %=t8#9VbhiKPH9R eߥX9"iqIi|-o7lLbԘČ;N4Tٙ&4S=fRippGU&bE| +{9Rop!M_S!cvfUABVV.Y2YX L1#JEػYUax ;ǿ}":??;#g cDXEtj ^ՏnHC(`W)CAqMIh8iB堥iraZdks<ٯL9%f{rLK@ V|}5'gII'כ $+TѥW_?~?˵/܆sT$猵,>HE6+*A ryTX3Zj!Qaz>`n~}+lh}bs+qEWZCȺ7~38t :OGllF"":hҨYm:^h6c'ɠ*CA6y.zwD'JТEH-cI X^΀]+dҠ[)8EԹT'} ǞÉh VjhB ɭg#xLYt*tA :Da=~'CH#K†qBjH{)5Aw R1Sّ82&9zm^LɃă='_OF< iɃy<^1˱C{c\pY=\f(^!ñ9@OpW'OB3Y O?KM*v::ddQVҲfwG+2IJGpY3cdXEFxӡz,@ڃa5oYKwp=3` QbS(mQ/ld] Vm."C$BzWW9eTH'X1T`L,2ڋ/e|֦cJZGl{6΅Cm2f(ڡSj[ /6N26YsZs|nX I#!-BX!LhIT@d( IDATMBss)ey]$tkbsYv jCGgCogI p_ƅ7Lh%͆~|z _\!)7BtTR*Xi411ĄR# pG#PxhĴ;t_G'Vq5|uҨ(ExS , *f5hPuMXtG63? O4 @֬c~WIӜS~aT3k2pZJcMVPؑ`/@,,^#LrD hKbVK ꦜvDI Mܫ = 4b$ ALGwpb<22@ͮ8.ifipqKOugƃ^_M ,SZ#K=bBKM~Im t&(\'h\l1DE.<ɭ߷a' !{ad3"vթAY09aML.)-`#ɦ)4~#6S 7r]_5ox d+s✠&nbTр3;ZI D)CH@&;gГ,]6InSr:Kw(l҈ۤsm;ӊ-=}j3M%RFiS$sQI;B+('osU\ZXnV]E96 4>fgrIP nw1.Hۉl'>^:@y,aba+;^/s@}Nngy%P{ ȧ@*͵*dn=q0 &Zdbjn/HC3 AJFFKPJQt^a 4RlrH\W8?q][Ⱥ+1h~0;ʾdqd V8H֯w8MV#CI*AS!|_1(NjpYI2i bG ϑN R=CLRkJ!tm "(xLטvX Y!NpkBkw #?;Oj;q`7/| 8Sm?C_Ze_SBTg~ҿiGUgHو۶HP3]+̣y9?]a >'JAD6d<8*#ViN-Z ,*Y#$͠rRʶޕ344wq<`0qPңěb~-V>Z g"܋׹W|vI=:pAz?iOAJ X71c:oWjNI^֕E5$mv`!al`F'G4f(&'=96Ɩ>6<;5KM2g,G'm5[i2n1W 7ׅt`DQGEjajb^jnx1w _7:6׹ 36s|g48^O"%u*W93hhdl,1SI! Mt+5p$pa-= s6I`›_pG?=ooZB,m|nXEdsQjG Vr4*lKT-Eg (rV8*'LrhZ`ǡ30">񩏰m*<ɣǘ)5Io=ƕ7nceeX#A=B ZDLI;P9t Y+jy's5wb .cqM.#tܨF4!RG4PpPF$/th PrF5>ptԴQIW uǰz7iIaM ih$j4Md|vSvV.~,Hqrj.v8 !:bMW" oHEK$i"r ^$faXKd Ӛ^m\WZ̔a!w(gP@ JJőaK`45:ǧ9I3W3D_K+*~,/)EJܳ]!p @" _koOW [f˸3ac |u$Nd#ӄ@BOj&'45ߢB`W/aLPr:-nɂ#@mIW a¤+sNK.!X>*!r:JFܸ{96=F>(^F}f'WJ{TVbͶ8izEz&`{Q Vѷv 2%DSc}bSi%GjaZ̭눝jHQt #^e5_>Xf:U8b3L-Y#@! k>Ia^V48(-TNbGAXk/|OAj5Ĩx5lTBztqR.n5JH D(y?2FD){gJ\dCm 6ҫbm7UKAg1G:lObk ΓBvݢh68j-ga߹4nej+ @$Ej~ZӖXGڥs:Jl)Œ:NУ;fZd#ͽ0Ik0b` 9ocY|5~5MLG)MT[C Ö$R[ƒMޑ17_Nn;9(9?׋^Qg`7f&dkw C]=z97aSo3uHxL c Vr(159ի7q#`2}*Zz2`ͅ:]+5\["Vf(tgHr0ďXq@eAml߼/ۿ|_+|ʋnmS̔R_\KUL6)UXWX,:s=y $7\9y]K8^kZ0&M/>ʱ㯿{o?q7rCy|Jrnz_1te4]2\IAVqY!Ey]OTyZluMWx#@ShΞZH +ӬH9M\7$iL%M)2=f8T"bރz-rz+B[/߃븜wˈ<9gOȬel +,Ԥ`WϏU"tǴ@H,Uלq6tSk0q&vd >w4F\4i\J5L@PJh6j 0n5*)Zd"Y2OalSdv0Ӝ9kl{Ync.U XہQZT`"+U<}0⏕<[!FFFeSdp  _۱TP 9Z ?w=&1y^`eK6~)ⶭƞa*bOuJ*:$C Iu#|nv\[LI*ӡ:tkHtsEè ,#ڬ!滷WnpJPs5"C\R H55HD$ҚpZbN#I1#(x Gҋ]KgIgrwW/dVɊaĭ[ıR3SX&lQlTj՘]XM43K$Oy("(fFSß/IjG3+St9i6oC~׾`fz'+^rKy޻5&K%H5xXJte"::rw^n C OO XS@@w8l㲏 dj-8w\b3\SCӬ,S]/xŋK5ePp.!J!^ߴcQ+cF#XBlh=Q'+tD2S5-繜Ѭh=#ɭO =E!(KLbɟ͝b.pI/g:nZ'cgTZh)E:/;ӯ՜inVA&Ҭ ʄ2ñLbsh1،m+Tbdr~I|lAx(q̡N8}M9K;&"i P5.§?*#E_}{9_:o_tF\I³OoJ `EIՙP'OͰmOOVX6OSJ .uq}쟞+d88z{M#\%-iLdr@lB:2 5?9̩QC578~82!\>ĺyw3|յJ ~i9!ulUkOA;:( ,L?-ʊYZ^+mJ3:z9qw9y^+D&vZ²4C8`+ 9=<G#3Mwlz٦(0%zt"B.< p ةoD"zB7pU ]?Tx/dMwWPDDß?_vaB7i)WNafOruyـA cf!^b6g8&U5w<䗮+m w4ȦF)$6+0c&Qg`Zٺ{S"PC^rБ]kox 5V4LYXQtX"G8 Tz)_r\25F7 g<\2F&5krva͖1}yDwo"/ TƓ6${wU;KЖ+6=vnEW2STffbxwX0{whLP Mc+%Ba $,"8P/:rKS.@=]m8NAFD8a>w~'r^ D!iPs>9)r(8^87P3.mGQ;^#+ύ͢]Kn(_{vf2KoMbp^/z? ;_nXֈ(!v\|>7|+Aö #G5A$! Uz~rʸL RЗUt2O{i)^}!gs_V87 \/es9<+U! A` K! jʳ8u020/z ҃'Nr虝̞܈|{F GEpǿ}J̎+/cd3T'99Ȧx4cku6ʼngڔXc-DWiJ 5ްm 08!Ƌ5rD"vgUK ~/gR)hCN=C0[#"3 'v)?ͷ=C }،5- L˳L32bN!QB4brѶgcmz/W˷^CWЍ&(2V{Yy6r_D<m)Zn\-v)>.ykݻ8N>Ovz7GcFN{b,Qul[;ƞz5c CG-~#"-s۟{\>#|S<e-7mS5&>ck/;RrO0_=cG88^lW8\nt 0vEHVHE8(A4%C~0-uXwŋHiM滩Mkfxqpv D7w3Bid6 rrj YQ B`UWdbjs|]O똜dՌ\䑓ة1JD rFO2S1d)s@KPM>i j4&Fb(Ttc̏7՞tq,FVȘn"a*q['!DǬ8l+E,E8`qzBwĵ7:YrZDghDNGYo?X.L t"R,e!n=>C5unCNkA9wq7E[-yt]'\fsdz'rBnE.Db. YL3qbٻPO)dXZH5n,Bk!0qч @A"IƉyFn6~p痦 0}D`?WefSHaulIؐ CDlΥYoPrxvƲ萑Al.^삪X͠ W3- >==‹xP?^*F 96; uH= sZ]\a=O/Xvsqb 9=ɮ1i9Hת"^z*2vbթqׯ'1w7y=d=CٵM#<:DN>glUM2&ԱfQ9uH; D9.DS9A \E7 +3kY":-y+{ys2}gHZuYVlȽJ'8܄@!n 嗄HHh vm-ٖ%YK[Ny9gfvv_K򔧝Oj밼eU!,MwrPclC1YkϡkQ( a 2ERPɪ1!fY):Ш GLj6`>b#,zM ؃E#te2/OS'3C F ہ lgvXnCHL)nEs}|gxjNcDg]{)q}C `(7ժsrCuZV*z{C Čp?_7es fN@?e66H>3'3hAGȤ: 1U5Lav]=2hD)W%Llx&ŴHf ab዗.2302!oJW 1}4tM'2(0'QQ_qv9X Z%kARAZ8 J)^7]h^N |_n)W̒O Œ xu7|jLDM])EF} T`44ѹ|V.ZVQ kRH) TXzۀ&GCetNl8("1H xfO>m_?Nбܻu {MH X⊋7'_ "K'}:a k$#Oj|S(& \;~4?Ҥ& Ͽ9." IH\rWͽG_ ~~p_?Jq7%iZAhIy!b2#!8r(Eߤ;Do"Ђ+Y}մwAA|=1 Nez*%1&yWw!WLз{cGlwɌ}¼h#HϾW (bߋH=NGꤹ–&@T<4)aR ͠#PfgbNlUB *_hXLŴ-] R O ydzӈA(+Ǝ (A戏N'ٞ*qv;ah@rGoE2S)}7J(T$[i>U@ VJYk.1о $AJeW^^"pJ:T2f͑( LDf?Eun:ڧg/a}DS6x0w*0izE Y1ԛ+^գD:a-A Lt&G˲ghГ :Dj%:б|9 ֬f]?Cet>O8Z11(rw{^Ů>Tvp'^wMt4EXq%V/ndIAzFwo7hνJ%R)&w0D!11gV4O|ۜ/DIbOwPO@@Wgt?9p&^s|yXeHZ~#od[| ć>322&td CBzTLNS*h`͒3}WtkvksϿOTo׾^[ tߌz}69\9WRʙޙ b_v5]B Ȕ`hC%Sv:MXEַ$W>#,.lΦXXn0ɲY9ttt}ıdal^UkHD1478Iwa #HZ"t=vaAlqRJlƌGЎc1 ;G)} ^|ex:/7 Mr B H95Z, ^|/q74mtѱ8l%^G|X Z,UFU#SelM^)k-c0- +M\{ i7rhQ*A4F}tY`c#. ''h1ٴ20 X>3o.Õ lFa Źֲ|j S9EN9Ή}HЊ'-F $eݓl+8a!/g,D@_X͆?'_Pl/⃗[,o#Oe]2>oc MvL*0E֝Ǻwf6k]LMZ34f*O<H H-%]J6[o^6QVw-"{9 9gZ=Dkk Xb*Gijf?¶6/^S>͵W^;r%󿿉ЌaDbQ5hM&A R H5Ö %гm+p~k~Rh2XH ?~d1H-R|.JY[)nt&Yф:XHS='7y."Ў+󨷾!l΄r5κ&>2@% v<.|mH9G]μ@YzyJN8:Xo4! rWt'E|9ZM/WqYF`o(LJd8CbF.Nj.6dpHIXi;n B6vm8Erȇ*|qa.M!LU)$hUqA#WZb3ZhMb'Z>HԮf.tgw=@%ٲX-Ɍ)O$x9K,&q> 6xYű~xvIfu#@%zL H~WCOkncGz͙3J0>?56Fvrb.GT?)LDLOp5FB1K44+V21#ZT<|)ʔ8UëP14jC*7CN;}l|iʛ+)EA'W&CMx26jq.^Rb 8y>e-募$q*qo>iyt?y] R YTHCr͐u9A (aMĻWwlɣ58QHW*AS3;yri$,vMfZt&b' eF.hct'85yDôΤyiO?O`hNJiKJąGj!ȥK.O$Q>vҥPv| ߡ,z aM~:C8 aG9 yԁ$.cZ|#HfuŬ>ER?<='׽OcOw]=ϑita^zyZZ7}M}57܈+@N"ݔu էʗzfUC[ ՋhQ" >zf~ͫI[)ʄ"& 0iH %Bآ.K:!^:"1# |KKcAE5_(uie͊l Z B6},M,04q0xdnoOŸ`\4P; |\.WP]d%qg_'."Y0ARhS&|!WXHRJO'2hZV_=0*KZ ͠>gc5f5QchӜ^>Zuѻm]DHc,_rIR:3E~9[VY}/=؁3Iۛ-mEZVe:.8Qgo&3%ᖋtzS8t43yd"B<1>]JaEcifL~;z';\`2]"R O3\]rJ9n_ YjiD dk%ל|v=yp04)3YrVƅkA./*g4{}tڣ$l `5hWJi"AYaX1G.W..O n?܀ n$bR͓ bG橭;X:ȇ-'-%Zswsw+71TL0m3iTÊ5|xĬ4H= !hjY&qmhC@ P!GشE TQ35d{}޳4N\*0D#_|&7@hZ1\i(G >/!k"#3){ Vh* G8dEczYF{Nռ3,ޓ) tu1p#4-h1 <4Yi2V 8~(%$ ,iմNWs>ooZ93\dWEy—&@Dj>Slݷ^ \ x"v' s?N8Ot烢 F ԁ#O,n}K(diZ‘>0.Xx{q'qdOL%瞏gY,ei4SL\Q"|F^)v^+wn5y~[ɉYv?>VE Pާ~/?i8u U4}vӼbKjTڳ8du'C b/b^x|NܘCdcA{7}kIq4z>u:zMS峊s**z2M<4+:(s>OZU#ytPuy` ܌7lR; Uy3_/L\w3Woॻ~_a7Ǔ}lK,L4GNira͊5l?y;Yi;]ɉQDGh7l5C*)wSZ#U>k,=ǐ1X&W%¾~I_ƌ0B`&)mdd݄mmfʕ|/> 3:֬%vuPUUOUPK׊\ {0m4ClGp7⫮%˰_??<͗_–y:!B ̣bV :M5G/R "T"d 5? MVQ9ʣC{  L EdҢ4砥K$q8tv4#Y:%>-Ja"nZWO X'SĄÈ;SܛR h3ɧ?J(c"&$bQ>|ۭ\~xoh4et̡! dn#nP(fC|1JiPGo㑟GYԄ',LH6570՛5%,&He;m{}y;! n)^Ks )##C4H_Fy^q2ܺz!d15B3A6ʪĖ ~󜖸?:b0W(M<]9BUe( ÒtYxu;l{^)ND"htv0:hln%34JE|(- %>DkUA;p-Uk3wNVOqLo&>paCSNB9ť[A>=ԛ,O[Tl( @CzS;G(tB@ rUB;H& XhlNXЂB](,ZNqr/BױrY7? n5gwRg{ڽA 0^OkXT&XUOefgY4η oz6w?_sS}ǸS_ܺ&Z*qN&VE,a!Ɋ^H:s0Bq3ОdnUW_K&>${y^"#s4=j;vs\"3h(+) X e [`v6RJioE`b)J; <>SOq/p߇HCmf $~Άd&AY4cxf<; Rpӹ8؝lzIO0ptfn`6Z3T){=e TZuS7N t8–|v=h;n"Bj IXe&bیLA4Tus t.m(itp"/IXhթK4+%[$_y.??qrӸq7wh/dyd0%aXz!pWc>P XibVK)]?v~D@(Oh F!AU6 %K7C&Z{>$4S(psnЕ0r)Z,MQZbV,S$mk%|݊VXn@_A _GJ. ?8F ք-yHmgѴ ֍*kܲ\!Ͽ? ba( Ybe_UDY[ ͬմ~+CtkDj [.lX(=a3y͹ZfV4--(NqIb.ۼ8xTonc$ X Kr$W')>!yq゜>}'j3 CEP6;\:KQi$]# O(){2FuU@JVX{{+wg<6 o/if E2:8iXؤ1%3VƲt #Zyoq- P*b@VbZ:۞'u$笹ugD!ytn\DE.f;wߊOp67|CׂekdbòPBd}M_+\qWASS+Ƕm06ʑclZfDh"̡91HNeC)V^L<;u7;TDPáy6G4\Y[nAEZ~a36:M6{& 0]˿#_tB 괛Bk 3D M,#ʱG=g2mbdU`y08+IMNҰ| .9uY{e 8FyYqý=; _kqK]w|6Wn7Ɉ08]&شvg)\?ΊsX2 adTG^kC˂u6!hR.+ҵӎQa"EJwPޱ(Ej &l9.FN=A[{'pg*5Lb 뮿3lٱI1ֽJJ@@gw͉]Q+nVqiS(!iI50 >,2<9x'1g7=~Q#9FpVa aGiS, L0")q~4;n&>O#(jShaٲ2[$ M4'i5 7m9HS4I[C+ͱ&ÍtD<3Vhnԝ/楝8xM K"Y02V8.N9hHiP'FzD[C5qqcVzZ9qolq읤| h$Bt$)+)20mnB1{s 3'4Has"39aX}v;wp#Ȼ.kW A-Ѓ k+B=/5g1ZNsH|O>I" f\5z` 8G쇄Kb0< |ZWP aB` (-EclI.v/$F4l)>EHĔeR6Wedd^agVׯu fЂPBw4lfo[nb AH⧾И޻b n?mEAL%"VشQ`ϓϒ)O?KqG]S- p4v&h eD%ioBEdJA>Lѭ?AWnV>G*/,Td /*,2TTҶ5K>E[0OBᇘܱYek&|8j#x(~C g^mF4(zm)W^4DU'x}T2s>8Le-T`(aBv}G:dѺa-g}OԱ =3> <\BB(B-$p7кdw |`-fi889ƸE1UGMR 0.# <!?1>yr_,?_7H!b[NB_[)\.hDJjV8_x94O[-MQ53@,ȹ>ƪA5 pÖ]6P*J;Ss,Zw1J9܄D)I:g͊&<+bkWY,Ww>Ȯ;5glڰ㻄B&UeSU(s޺N~_~Щ ³=iZ|s= +$d1zkYR >7W_|)" b$X#A![ew2;B^N[Bxq r%}sǎ FtuC3ӄ*E˶%,)JgٴƏğ GSSW`(~znƋ/ c8yF}_v0_y'B9A ~R,ݬ@9eG=#F_@&=M/~B)qW"%wx?+HgSm¾#m;})Kҹx1Ұ0, 4 <5fUuǠ*GllA!5LeGz#p3~6ipD;0E+zSNД"QFze%Qv}$( V)LK>TX%PXZ|eX69@ފ4ťFB1" icFc -|n^L9L>|6 R K{ h? }+9'jR(O`?WVt/_??AoO!{2yBVoބVB1Dž46Lڧ+oPFgf1~ɁBtut"-J#ئjL08V}V Hb`6f$lEih r0Caz('pz6exŃ0o#Hկ}m/mݿ`Yg÷kvBu.L0AmR.i#C%jbLu#Wy hE~`.D ?W;s? \w8{r{e4d9>,TsݧJAGE:EZ,IiRG&z `7#8VGhPYj t" :ji&k t=( iEG$'L32D2&\W]ϸC datX*DqJF6G)-g0C"k!!YjkP: YY В.λ㬹3-g|yba9!Y EOL1bH 4hYf`'Wvnz6G^z ;wyE8\cNU W"|? fؤuJ.q.ʥx57s3wĿ|[-nT"VJ]zv#~y9#t_zcU}YC!nJ*{LN"8bh|D#5hw<ʫD 篸;jR2.ڲ7eY{rEF\p9vJ^Mv$f)(614Orp[كPC`iQ,hҞE+kڹjIUmgqCe (-Q>!x~~dc465嬹X=b VRϓbuiWe|p]yod] ;HsC(0NHA( 2\T4” X N8A}%c=='N}P`pCJ&a/"`hEI+BM.Sń_b$RȮ#'hO18ˆC{qsNU<ir$[8ؖ`.faa%GI6&-,cKlF3عQ==A뽷hZ]}Z\E IDATɸHw7uS#,!wr ˧IFj,u,r*>ޫFqœFӴb7M6W7G"pJsFxh",-FGu,^x¦fİN^c5й"QŽG88Jr_8Sb.Ŧ@0 mߟ*`)]AJϸȈv=?S}a5_܁Q6J','yʦ'];{%% U[̣1𤢐g\cKG.Su뒼cA:϶|~b_|5btYUv?SwʾT;DEct;BǁckhkH~DϱẫM1:2D]̻" k-Z8SQO΀xSOeݺKPBWE7e`l/'@DZ^!-ς iP k,IjX >5Zjp]"+,t׾[! YH\8f ZAK,}:G4YKՊuhPt&N-*!;F&!lH;- a~Ch|GjGX"u=\e, |oV{P"FmCo/ApUOGTFYv%mNIg^ԥWedZ^K7[<5!@:ilbخNJ1nE+|Tv zf*. VC< ɓ`:JZBQAx,.duϘ~idE&% d(ЦoDѦ؜,BP3/)-.fߕ-f|9U:RDXMO ),A$8mM~ "3)s \)Iż^/s?2=' "ûWǩz]A6n6ǨYK$6{rXu2bͳHh/Fl#ݽ؜E;׽j|h3^@A %J>IDY€OkTD5D`3oBiBkVp5骿-[_Qxڔ[c脜2%.;Se@K/_Hn\!^w#&|668IIbIeCyo,exB3k6V5ime Y<| ?t'׿E%8^5X ] 7=mES!k6y dy|;_gnBP(!=V$,~7B&q\S,[so|ӻX3klexW7Fg @2"f1QTׇq8OoJ]Mˢ}p:|{C=̝FWn"3eh_f*V̼㛲I SHy 'R#XpbvƺOQ;ykcΝ?܆F< ֬( RT}8K/XMH\ h›+_.i0EI@(B!q@?I+Fxuu=[F3+lV=8B.aKQ,OIe*tEnѓCK=p+dF1f{ףI .:dТ0 KF&D : R!SMO""i0CRGLVxA* '+H ^!_o E8Bb*VDb`oi/h|?AߌhDt=PCNG&aCCR厃ғ,zB-@&gu"_͏ݿiqIqr)Lr'{$D|c&t^mpOzҞJ0BHl4`:P.Z1&5W^wb1.^Qbpq= 5gG%smc*DLLKfJ AH!^;z- +aY>Q=EΌLpG8J!fZ%F}>G͸ q$*QXT2Ŭ!sV{_J%`*羄44j1@\FQJ5i- |vgKWJjf"s稓?#bT+ $pG@' OJ˧ۖB c PYhȢ`{iAbΡ"EWD|x?˝s㗾K+ -f$H#A)hI_ I!Rx%38e60k tOH}qiOw\`I_uLƊf>/v="'R3.y ~/2kݕ J;L:^L.ʛӢ0qfW<ƮXJGczI1TMe>kWdU(Y@wNZ#U ,M;S^b=miyIz#8 I[j<Ϯtè帪X-,(=2fZ/; l(1HO=oz&?oObeK~ Z=gvW(ᐗ~?pi  ׬O|?s;V-@H$ǿD`2{&Jǎ{$w(FBuuxD7)8Æ=cN.Wa6_^wo%|Nbl@gg?=,S[#rU&J"LS} KS W142NC]gy\~kc6&lC8\d'ѐEZ! "c 1~ :sDy.^\,>sƐ#s#INˆkx>Sw2Ǒ#]#.}@G{;N.nj%8wQa!I0mcV"5H&zEm/˨f}dVM Gɫ;X~FQΊ3239L y8þB3:\cu̝69BrUM hm6֡6X79fþݻڊRd⪑x(pQA?K13$ fH/fb  Mɥv4"<1 `0d5$ҳ7dsc/T6 No4MPu5~"#IqE XFO:S,0Jg)U\U-u\>ϊ868lKbKЮ;Qy W]y%;5RQQB+ɧdN<BP[_I28J*mp_݂[`$ўqB+k,?9€0 0% sCL@ˌHPU[pE p瘿|]]tNm8đ!ȉd{)t*2!8[c,]yDZF Zld^$KWpg̦~2R?χЗo΢+7g_?|>/h*4lkѫ'|%EyRuEJuR%)( T)fBСlOLg >o&(+6^Ph\ynfAL)%qQ6rPeuk cfM_&}so۟%nxjQL ,;ECdFd ъ$a"f0sZPV;sZVX::h߶EiJd,BFVzYqɇ"7/$GWw\}5z'Oy'5+ϧn:eT$QB_lŨˣ<by+JNOA LrM1[ d/ O}=|,[ETeT$1my JWR<{Lw 3ytu?`4S"X:uNS?Gd֬涵|b^}FfrtPK6 ΈMRbs,[h7/'ȋ9lg:an- #K?.%T+b|0Y|~,?/.kwS],=|*baysT|S"^%% E];j'qVimC1/jc h<0)2)m:M,-?*MuX\Zb%X镍e\RI%1 /ch A ”89ci Œ0(\ahXgkdBMAQx33ڸxîd;K6TG]k#OUM+1Da0^n(;0Bgӗ.$I<+PBZȅ)c-PsSNNyfjFH`&>'УAg\~=qP "tY|ktœGwode p0P:Td3lFYZˣD`>$ /k5q߉.0f}( Z-/ʽ$Ɏ/lbJɰhN3=,Xw>qnX{x !6 ءR (- ⧛Mq r2`5bI ;,%pRIFlK` Y[4RYTqn?V_wmaS_r_bi?̈e;b&&GuZ~&ʌ 犢3&}s6bf8+?*d,=)HSRu*N< ^ШJ "e:>aͲ)r*6(yӣaRCHIDqF1nd6VGXr^'Dfw³H+J8^pdNږvQ+N<n\mO?AUe֮f}==8C#,Xpikiigm'{x~ny//b̝ڬ9MDb :;ho?O߻;pr $S;B~t^@84b/;G} 9飲qpOh͛O8#^YACwm>]]<âVzN洶qa.UYhI #Dĥgo`ӛQm3Eg M>U  G =džqx(o>I]lY-l?` 9 e\6,tظ\b_`0R3ɽϦvtD1$k6vL%=2BSM֗X)㲶BqUs |u .zXFi%CQaZ^P(LgO=s?X W4T90攅|Ϭy!"Q20&=Ax,DEѴ5kXZr ̲5B;8vvqԋ7f49&HLAx̞y0> N*t,M\w_ dMA4(*8|$>yqåKvWן?ͽ=rV Wqi rzdSPi((5O 6 kǶH4'fP w,/ϥkp'~y" ^1IǍ@ Y$3Ț.I-ZX!U̳ip}'wo4.$[?8=Xz[擟vR)flf\ v .# j" K&Pw7Cs0ظ&)DS'N`zIrtkdSzE,ǘq8١;u* W%tS=K99{FI)ӌmgRLn'7tX%3o3#Ae'tܲMty'ڟZ% 7Mf9] C aiIʉ\@] wQڧH&8 "n5 w8x8dhKū3;HEod}rMt4h+ބlXȏO/s$W^s3a C@i:vkyӇ>Ekbl{~;U򍴪-~?1EE.5Wwԣ|jWc*Zh IDATlʝ>yL_)LAyfxAIJ_0Zȷ!*ǟ9NJ ~=Ţz[!Daz; :ЛͶhR!֮Mj&"B&~)hF~Do"_ pFB/'Q^O$C-7JgeɍxWoC ɒzúQF<4]J.*B6SU &К9B(BxRd=2G׿~;.ZrO۶mSPz9w2K8L0+ISs|ݯO l +QeaLH%@m>(M=$INzOȎO 6t?l2=8Kg7"9r/ iAOu%T_?Ӑ<-(BH\,)\ds@dfB\kds"@8.2ós8a2~&"skҏRvC{t?FXKŠE_+JZ$¨=Rj&DK`''q (tO; ˹ض!̀S@Y o 3R|K4P2`:% #09U q* $B@l`/ ckgMX&V&Lkqr!xW@xjҀ(0| >M*0?| M@4 .EeZG,8Hc?ՋS<;!M`t{wqXb;<%sͯ塻fT74c۳-XHjhqdxy.&$ɁPOKq1ҚdV&zT9]%`4T$&/ncf`h 1yM"c:Q|в6H)E)FLْ8]MKQl0{0MDb|cOrYrd|'SC$[EfS"+tS6o3w~}r> [o,7X!A1~__X ƑFzэdATT`I3#6%" 'Uq0¦?ҠiǍvŅXGN1:VEK,I ijpk8u qSD`^8^ hK#QZ 96LbYz'BNCTT>ؕ/v¾9-p,{k/XDs(RM ..h簦fA$ObE: tʈRAeM4|Ÿ$`xv$S뀎5Xyyχ5ٌMpkxQB!('"GLő(,&T$P#QR__M($ w#bi˧)g?؉*kjD|^zv$udzXv=e^.=2+Z-пRM8 l0T M/~gvHtXJ1E&vFhXPV]8CT>y6dNScE˗߶z/&‘Te'?xz- 'qE+g7]%m m fvSQBPB>$xl X>ƿ|_vC;)DL0;nbh9b< 5MUT%=ogӦX[9]l}wR'm(?ɀ= ו,҈}N @i4a%8q`_Ƌ/cWmLvX[Go_G)!(0EVge ZGNxrլ~ו$/hd& ?^205&gEa }=&3C}\pl޲h 6nx-ͳ7tubchL`K?uz*r`FYxR)-A܈ j+,Fy EcP94C}ر0Y# ~ݗJj7.ºuA#b]#L(piRT)-M >TiQr-J0MŔDPr9 lJFJU Lц`[BPq~#*|)M)7L"K s)Q~#亼[{.&/aedziam(IH{\jQwHheRժ;硍M3u6wh?mYh1#? u5ZE50F0su<>wcK7P״hX?g|Tñ΀AB1F$!" /ʓW]k/aW\zR r]@3|c[fz=98WIdF񍵧E:mlx^ϒ5 h X 9<| ) ʒ~l[ٴVFnRoC@`y.i<"xS6?ZeD(#Gnモ~+oލHQ{W2կ~y+#qx_e]iM,iȏdшDPl;U!9MYlX'e$uV`{rEAm6jz}laN⅋9|b!$dQ#`R}8Bk8ssp jt!52ҵX F*;O qMz%B$s_w~{@Y6x-__Iǐ l&$8gR)k8z=O?W5QH?h5<1f7aV0 bXO<AS@q񿓫5r˖~kggbq^zJjcW5EXQ&A{q[RNDh7{lϡֶ*"=# `px  l|6C(B(8˲@pZB"dE<$> V. bs:H#(x,?}xD:37?>Ah<4BMU52WP #-}ݝ{@Hp_O6v> zK\[k6._tif׿zA~v dm~xĦ+VaX*lj2cs(7fNubzNa"GcR3v_~RhTYؖnVe%E$O94CDļ{Y5KڜapcM}  cC +twolK&[(PeI*f%1M^«/wr?}R*?! kcfsR` js@EE&~vw9Թo^/#3ʢ׿c)\da04p]d1[ pgbҖ")9M]e*g\S*}]n~'}|3OO$H4X ox3ڮ^gWd1q٘/ ẊP2R =2'7:D;`!0ddS60p6IsHǁ̙ϦJ6jsIr>&ۻ= U֮aJbb7dQR9AU^@HMʚzPS9gIޔc@>6^~1z?` #~g^ ^c4U P߻#7Ǩ]k{;%8ؓvpAw BO#m ɴ~\dn&"s1~秹|-#^Wſyoe-λƷq.$EG;K <Km6\;7NE65Mw =֓<R5(0AnY(xAQaLɂ &2Okzxci;DSGM$;ɮN.;S`$C#}~顑kf%fw\aͻnb&eZPp d".-Ͽ%>O*GϜB hԩ. )Z}޿yc+` C]c|oߞv!f cf?7x4ɢ'Ȏ1l¢eKP^c:PW7-bvu.?nao?̡G`nc 5qj{h  ]YɈu1F^ K#VQ tMCWwm{uޟ.Nͨw˒eKn؀q!@ IHBޛ@H &bB(΅K 6j!^pem43z{{33H}yxGs朽^_\]a̺ܶ(BGSvFbE@k^f~zozY+ 3AaX?Ñ];8O* q~'7?YJι \pklewО}=2P 4UYҿy:cͻDJU o?sIȻV5(4zdA%k.̣ݤ26pxhJYx&jtc,{Bj5LY4K{IܱaD(\q|3gSS)fx4 upK:q/D`uC_' tDAֱhGѲa1+HEii??‘\7}ڟ|`Rqq86q 1o/_Ck{K/c8Bm+>XWJ6\x!5-IiLr',]  8NO『zJjOrqp(JF2݇ Z&p/^FDBMt˙{ligzIڈi4M'ɄRP-ɷwqCf\C=(d2DQvfǑZH',"̋bL̞D`kL\ K,2.2ju Χ񱧞Gab=Yz;6{v IDATI* m1Rh0tSL 5!l1TʥjLZ&J%i՝ |He8 `n#͙) !4Fۀi(ýi믢%gϺ}˜uXd'cOc#Pc 1.R"ӭ `]Sq}[qQ(0QDv|-ZAmȮ{Th,k42Y*#t/Vwa7AkVmm=@ &|e\bʕ?k-/>^Sl2$g\u[xeW|;7gXG_{#S*/'*sTJN#Də)!ߌ+*NkH 1FDqUaO SgL<SpD'Q_z.&M/-&%x3Uy:Hfœq 3~3grrP8)EO`ꜵ yjyyZ܀R JU՞ΈkErfz29?%=6\K {E6-;;vmq8k3;#H/^:7^׭ҾϒEk9T,p﷿Ƶ.[=ު)FGdǴ/Qn_-DdOͼRgژD6Y0-%lJDb&O4^T4Ij{M (fL>llЭy:(! pp[&#,E޶,KD1!J8~T씞ི AHκl^>g L _&~q]l=.k,t)T +]T:H"R&% 2:D-lAD5FTl&XN%dѬJCUVD]A=! Q澇ocKOsX|V._Ͳ^g l/z;~ Cc tOR z7nbM:CrSᕕ'eL* .2ϕ{?={:k%[`Ȉ{KxA֞Vv=]a3ȇ7cc<",tpN+`mL9Eg.l>pJjJ͸;|D5?fyF?'-Ws_򕛹֟\K@SR:H!lP8R)i!ʡGuk(8|qjL.$|1}#,eܿHXDfmEc Y#y?rEhw]~eag[ÓfVWcoaV(z ΅%R$!1({[n6 6mi/"lR2 oOȯ5ȅ9xz 8"gVzy6|T?|6o~ϓL؇{bu"L b`X }yÃ)UrllbAy:CZ¢p]X\#6KЙfdrҺ21+FE?p7i=}[aqMAhg)= =.>:lГOaaQ$%aWpty,Xh :#вZ;S7xXõ! J6Xj03{ZqTHP3QL_Fo|ACgN ukO4ے]EZpe !Z/b@fG"D(\|'ygX2S_/uOT┃Db0<Nid$g,J!tV9a5m5+Fxi0!)A萕!a0Y ԩEUrdFNހ4SuIFǵi!Bl QY%?&ۊ9fn6'W ".oOSm>Rc,]֬cD#?AO>c1ebd,ZQJqAǿ}_|(??S5_/#yyez,e:Ş:,;<:)q,0&-m Q #y?έah8>).ҩ:L@.|ʟ}ҍ~o#×?Oen+d`~/<+ROqp>ᅤ"(֘ 8 - NqEw +Ǹ4`jc jH95R 1!g;[7ЇpڿK/G~v7˗ӚS tGQV.jdI\@ 4g\2iYp0Qor6DU$O: ")ݴ,k˳3ٿrZLɑȰ پK3:2)K,YJ$XJ@mJlvFb_rfGn,[l,>,&QnAMCIx`)5R1(sH(IԘ=%a1ʣȑqpddR.9Lb#Ĝ_m$ rKi Bp=&'fHIZ%hf0Z=TT*U>]VoNs"ddlnxCʼnne4i+oC L.ji]<(dn6nt"lļ|)a!q$b6R ->/k )DBQDPfaⱢ,S-Wڂpqq_6'x&B B98YycoaAFsVo tre#[(^AMn9SW)&S\8 V"eQf96J1M[kp|]#]!GBYTІFhhc+cH)0A㸜ׇ3| "uzJd-/M/A3s&y&wƉ4N'CT*9( B@qp"⾩5IbJq:rz#r1UyI@uT* #eGK8/ |DuG=IܸTDQr$q`V5:!V,)N dK7fro!S/\no8f)'M#CD~|&;JmJxdE]翯%>wHICwPK|7ow~5FUFN?v+ΰŻz -GhWi4P@ƍx?M~rŏ_\"Z;ѿ``hBaAM D+z4+iigdm_} 8bax&FFo^VXI}x6]jZ<{۷joM;chZ1ͽpo=CxZflmxF }{ҙ)]LG'vBk( pm 8pІr YJDJ "G>{|]e [XzR~#\+x9FbXz7zh_ѹGIz ?Ka?CGoZSۓƼL~ ((]G*G$e&fjΈILnUTP9#$ dB DZm)|bNT -TsZa qVǦeQ#ӝ ^PǥblREH.*4`&ZKxc>28z +׮gbtDNN^,ts޵1T)T tvp[*P*4>؆IRO=EEkD6C4 kiz^B_D*B/l&ֱ&6j±}d[Q} yeTvaF#dy'w=ă7 oR'gLMaH6̦jsJnH$صfqtH\G$G uyk$?|4U7@hɩڞ{q}UWŗ_Bznb*706nJtRmHR au<Ep\tu[ұ]pZr,GkfGÝhq |߿\z6&IʑC J[?O 0DK<Q+j"ZRpIySh, GӇ9* $!&`4ֶz@&Ml{_ o%FHIpV,QhP+c(aЎ׭e7nصmO<{z{::<`$bvP(1tz56,sF ,-zC*\ye߄N0E)TO--\B$-N&C^|k8-?I(PR sG)8S(Bp:jG$ZW7ļ,^#mCvmގ- cZ`,Z0,"u2UĴTڣеp>CG oq L=Fw"^^w%smnyg< :HSqABP(XXG!D80yRLҤ[ǥ么l2Nv%)R\16֛ޛZiŚqi'c1)f37Mq`8 񑶎.:Y`!nqi&)gplm|'-8Fqh ꬉ#xNNڙr <7p`BdL~ 807a8a(tD{S119E9u k"Ri/Yo*64\5r$a.ezedUšcEVuGyMZ!d$WfӔJeK\:&86%XR *e'1Q0Zn~J-@*IR&ֆ9Bp=VnmXŒJIF'ihURQF#L L2xpp7GXJS# +%Bb }:T$TZIp5;{uF`(}Ke.V?G(NٵܒmRqadq ɇT1UBJ|/Mt:4(@- ( 'KUXH#IiM( IDAT"0tF"U+2@ρ$̴\dFꜜOHC84A녵 ^KPhAH=g=(и)k5Z8ZoJK*߾Lu2~=&mklEiyv񆡭3M 9s8vKǡӴ251;5EzN'1rw>Qa>jc^u=}Kho1~`'Zj1iE S\s֛YheӢ) DOH]ףTpck-)8J'ɲL&V+X64l])L]JSut)M>N?73]m!d i7s4Ḯ qr:lt3 '&{Тˤ8mhqqd"a"x"U^uO.+C)tIJ/!7"{'zp6h1? }lx1 ޹a7f9i*ȌA:4Zkb m]/ n;:A&qּ,"bRLJ-Irȡ"~*TkJ ,F M=k'l#x3賘ZPK;'/2q&4a3W?x af~ &Sc8Nhp)' )yW&Tºaƫ'/8k*]lu-]]d7^kvp1:z}-ѷ>OAYW+}xﻗkVsf|lɑ!&FHg8w_A2h2R ^cekn;R8?z.LHzADZoRť;"2 pTd!Y iF-CijmD[Xz*~v ϓqx&, qZ< AD*EP.!(KG{RDGk2` رm[|r$X1RW$,a!2!%pXr:vE9xML{ۋW03O/5 xSi4ylt H3蠄G8K4EhXb %xJ"m,U2vDZ'ٷ=i63U 㗘lbd`M#&ɤ=4^J-*!cG'ʧp^ @"ͰᖝGxht'ocm^x<ݔ":at6 8\ڻrKS`pnSK/zYR&69L3yXdbJ5a}|K__(u0y3#Ɲ?>K7nD$Q b(-(ztZRӪͧ3(7}WB 2j爂#%n: Fc Z<:8rf{P˶ehjvxr3Vybnsa-n=Rf=FϸE)z3i*A?\IX"yo& cO݂!}jBE+{_iMc+g\l\h݇GlSN!MA2E&0tL0 @yjT 'gs<ԓ^8Rg[Y|);ﻛ^& "{Zb`jB@};o xe(rرs.Z a*&ꖾB\gsĬ %1AD4>uЕ)ȼGRm8CeiڗnjA!ypm%t,_Q!'b߾!r\D)œA{P T(`qȤҔy^9º+ڨp'zNB#:`'axᑧYjU[ѸtI^6dj|+L%Eytד4؍cf]"NVn< p.d͜7b#s$ٰ ($un|X;C"{=}^q'Ei剡V$ !erXfV|O>1~im4XvVTeA$ʓ֐.X/VC\/( r36E}\n?z( h/O3tS.h70H{iԥ\КRSkR)mu Du,WP kNNC QK[w2U )or>$V16:H$ܜKd;yQ}q :f1 'GŁ0$]0u ] mƅ61w7Ã,^ #Zrdb 8 y78UlAH;5ҰsE> +<jtڡ85E>%G'N3mYp&)ľE:)b`&q,$`4NOg]Xaנ}U.MkR(%~.;G'g7L 8KT-#Ҹ*6ZHi Ubt9!(+8C)"dfj.8G yn\@#T:Q,J-1L:O`]9|3?O}Slr|s_;~ w~&g[ORDVSj4X*a:+U- M8G@W;mF>:6Nwg+n*MijܼNr*M\F1 aQ52KPO=s-4ô5ȸd[\"iiFq&Ό, elXt9 !;6 t;9J)zk! ~C"Hm9yw<ꮍA/43 ˘dZ7tJK*07mA 4~JJ%ձaz֟Al]P(ӿp)\=Չ 浧)Ƣ%gļvx$ǷwRHo"cR gDk ޤ_״JaFdsP Q"n&ԈeDH{/~e,-}?3}vf{g^@Ph0hb4jј_obI$Dk&ʲi;~v߿?93 슦vfΜy}_ia,@mc .&I|䯸7M_e/'3",0m e%yXIj ;nY5h ך68p0ÚUgF:tޞ$mcbǮqnr#."2]'=RNNTfUעBAzZj| "b;LAI* 3}*$Dk}MbAWz~g7g CD̬EKFwT qe foZm[K# Ԋ;kivzxFߔ H#.@e m CC+,ˈ ͘@ZƐFd  #"OufP* /FDy"C' b ҶƟ9̳ Wc8Q>ߦM ɒ" k6ײ{Tޕ+x;E%ֹW}44'*T`( fũ1z;`ɧ4!nWsk_ǫ^s%֯0{08L0JcC0eXfH8Pw!fΣ}[ɧ*dH>džlBҖOD + =Nl겹gi;sm{L׊4N*={ܶ? (ɷu016'8hwRiIϘ$MJIZT2֑R^1Mr,u0,,fdsP!L%^KpU@խL$1$*h$ j>>%ɯ~~7|>Cqs}֛n;_U I9PH'AwVpyh?~H6™1M{B3W˦(MD2}"$mjE,+Z+`*mYJДs9+Cqv+II,`rb!/u8l2#y~ c$I:s( +6R)lt>ҌC?rg#LyNf#UoxXY䲞S]J/gkȼu\p"x]A8 CAOm }t珏:@d"B֭\wƙ3|;ڍ5;UTfK؉\ƖFu6^k [0$m9y8/:7$ޟ_ş Q/Gw|;>9jJ@]$֯!!-eHteY;lC[=f;xKy[Ưۿ+nG^h_/=]k%s5??\_cüWHᱧzqQ|<+ S2y&ȵ! kׯczz.zN BI\)lYM̀>c!Vˆ'b5,@iÎRVp|BCHt.kχ~rH0F$MR 2rm@λZ懣ɟS?r=DZ;(ON %WV5Ҧ쳶ro N?}B( )Y%?g (ҫtDiuBL"R`0Am /v@HqInkd/ A \?N٭[IwMtsN}=e=5<@Zi+PC*0#Z{2mRW>OdmV=|#js|#{5R[i9gRkKqq;m$ҚiRÀlע^lC̥0)q~aݶK)#l޲n+_{% ɝߣ#ݜ{i(\}ïs睵RQ,\: IX(b8n#d=ڀ|IL&I$ffleO%H1E 0{R;Yvc E9PaH\lܻ yD9F-qE^Z|>d&nu< y-?N##FŒh2X( Eұr=\6W/4A W,W0VR_[^2R) ykM-ӑQׂ92+Vph?:ˈQۓmI ʥ"Lٙyr0@"073GGWiQTf3H!r&ۖVX__ IDATIsZfP{_&'3(ar`&Ҝ!0q^xռwU$>aaHO6e\K+X 2l2uO(\FNÇf5^!H u\%p N4\C[ئ[!@6JV(Βk# lO c;6tpYoRUwIU%8Ts\X/-z:gm8)|juv*ЄEPΤ1D!a<4,3ڤ%Ք~_0jA-;?띏"*R!JV\}2پ{w!BL8Z,^KuKVdzMB@)W|{d2B^!!L.fxjW984DNJ>t2!Ց7a~&zݹz5dAgƕd Bh0{Q=E )"Ə2n@ɡ>壻pԦG|!~x*6o3tLӈYNc`5E#vMDa8.t!uќ],Dxnr2P-8-Eф3⬳c>@xpv±QG#'>T}0^P70DfhHnNе$if Skj^ m)TH8.X:n>w;9Am|Os}ݫy(AhSä)dBd2lBh9dBd-|]:Z~ιc$U20QdP %:WBmȜN JThU^pك?߭On:\x#:BΝ֘iz#lRy[Oa^j%| {L("/I*v-[Lӻm %oo=EJŁ9t /}ͫOY~5%sB-33zD}z{saF84;g eQ݉8X -`hS8 YPB)MRczz䩲eM-0y^m,z9n^Ϧsl[̔^0jk""IQ9"n#2.f")EP!±-L)Pf~!jUкAcm;ߎH5Z#- X!=|?59WXD$PM;Z uF믌"'a߶#X8^\ℂLN`3>N și~:Łv |eykz"?%0К\0BիH B.|Eʕ "A[ѓ#-"Ը7OB03#?δsbL"@)ʞϱIǎO%7v3֞eqV!s bFML͍o[#VQvx!L䘬`e}h0cU4>itrņռ,ebdN2+KRVG "N2CL r %Аj|M$HR3R<4{5x$T cY0Jl[$К9XaQ=e3fV>TkL$y0mK5480U7fyϖUnn`a,@ g8EK,sj҃EGCz,>)DP$5hb"Q{Hl8H%Z# *̋2 vRP`b$ɏ-Jlݲ'.]d 8!FDOJ|!QmD֭=G@Ym+|)6ۍM׊谥!X ܇J"4n'cF$JcdXF8T' $,vΥפ\1-̂טD3%\MCLXh-`;tqfv~ 1fjdEijۭ0?=ź9vHyz<ڬh@kɎ;~=Jφ/u6DYg_3r196 9tEi^R-WEWʼW2<2HRm8~` _viTj%|exB}XBGjS,E͈Bg\$EY}u1F4P,A:{WPch직Z|K|3^RV/)SyofNȻԋHYvtvѩ;׎i)D&@82FȤQa$TTǦ@:KgҠP @kiiO}~mS juؤgQq}t BRC3jLu:)]{Oqᖕ}L}#rdIݫP}W+z#\P̓OeI0 !ȷJ06j"Z0 l \dvaE#IJ`1Ar޿eNWi#LX䴴/`-wrL69%'+\w%L4!ŐXX]4 PdL 072 I=j$ű[Jip{3hl+5{'wgWAZQwe{XM( #3{.Zzr+Wٳs+7oczbkfozs_{- ''yUo+ӽOCu;l04Lrm]i#ͮr믊m 0%@(GKQu:!02`u4Fڣ:uTyd?MH*8n}-xi2[L:fɇXUG{q,g-44/73{ Rp3o}}Iy$F_'h5?el5w?V|1u臾#F;Br y^K [|X랅$ch"Xr)jєk). :!گ!*w^eݴr*ƞE2a174JʶkXv3v;W\pfp^Fyt+a[>˶+!#1abd t@G‹N0b#eY7)TXΨUd>16&jCfx*ˏ|2I.0$ ۻhIk(V!PN3ouiJddŝbTe|#E,*|? s3=\|iLc4a"KogssdݸAHwpbtrѹL3=Zǜ}|(m/s&HeLzRLϖ`[a#.|r+-֘цiJ|!ġ=s۷i[] JP>6cttRFZ62cd3'LƎ'CA:%L)К{5I-kmYI?[bط6s_ᴷgRZ173CVCuzC4vGT 3`xQ2҄BQp]\CR5mj2؉)(XEY2y >IJDQv R6v` Sx_TVSO?(bR+`ň2ME+pa$xA!s]jAZ Xm0 fTRGQ4=.:Kqj zkF4) &ufL))9fTRdU3P bRuzL=5R uI%J2u9I10g9+T>Z۷g'&$݀}SL63t4抔Bp9fDC#h഍+9:]sBtw7Fa^.}?ξ=O.g6:45##LB)O5uϧRDy|}lیУ^"&H3?9Mc*a`H6v0ifk`zl*{arG_6I]cXI&&le$|&suP3].c mxR.k::ydD[#':tѺ2%?DPs>G*I@&dW"fk\Ww7p]l9d 9z:x:7mΟH0>3ϕo|# ~oㄚ)2Hx)5(ˠ뜳!_Of qs_kbIH\dTޞnCC>!FVC%-dA{ɶ4 N?BuAPPal[HG}l4I,3D@Fly_a!:y/7OJH{nߌe.|{8of6`Yg+Ϳ_u5ި9o͍CƠsBtltf ,Ө0$a' t['~-5 qT|T|)hb6XKwkh#)h$ҏ0THӈ3>dCװ'ДBˉNV!271(7nbp>,\ F~׬fGGHXA{?{} ߠw&z g)O04GR3zp'6 Ä>Ōa|G:r a8&YD;Q!{՘j"B.h#e#!amL󼝆R,"6BjS-Zܛ[/ٛ9颡nV#b!maQL)*A2[e4 &p}հSIB,wsj澩EǗGM*[Zm ɚS#|D_c96F* +Vj&G Bm9B?`zzl6MR#mI?g/1>'Qɴ;X$'kVt16W nFKm,qm$tU( eM7F¡=a0㳬Y$#n*2ԜՙmVЉyN|Cww'jqH&Q($uU!$ȗ0ɧ3lI#YäYzeaYj X4Ca&ISI9I"CżiCŪ>6텸hmOG0MM:BUDj'Z̫Mkω66HdTc.}_c$e)~+1˂F~u^tA \a`emM?4\niűGDU\~p޹ۅ~-g^2& qͷ vu/]w%22Lqk=-_ȓkrb!~yeZ&n6%]B İhXQ ,VE( oz;$(CW/݉gYH`!U$Nn}߸;?k>QD:0n8Ϲ5҈Xv"I({g?}.^orK!,)”;ρo_{@΋` tu:0U%lW],V7G*f7TB]b49bQe$==hyNm۔eT_WiE&K|GbFBX\ƪi_#F#Al4}XDn-Ĵ y=-\t ["À@f?3=K*i{gpPI̲뮣0q}8祗pthMڴٰ 'tf]нi#9Ə_"ӿ>N?L=Gs<|=5DGX3{pDL4~(,4&y{h}gf)L'|GG{:h^fj<6ufCdk2"!r̄B8QCp: TέhhO2 0ͯ*( )|@( !%)iХ) kן寿y߯?0;Eַ;wf6q&^t56N{2Y[ӏpnb|(FXJ6ۯy /xEr2S.Fu'Lӕb`gd)N聩MzN+ ӊ*aHݜKh $tĈr_&L;{w'v̏95/}T<ZzH^7gs,>aRS,AP HGC)1L0 Rk{B6wZkiHA&tOpqZ5męZ#cMjgDEXӔM$2Ҳal?e&Ncxu0jENFh֪ Iu ӂ0 KE3Mi4LZHX'"wm)Cu~TfY^bOlQhEĚQ&"J)M i LNz7J;\t @HEg{RL6iQ)LpƕL qD8, |"|3–.+ut*LDOG5Osbb5+{ 188Y70:_A.T]yVn@:ǧI23iƧYH=y627)LxYw7쭝 `e>tqaX$sڐ2rqwk.iF(?q Q}d`[\ϢLRhm|MhB0='NX׷㣔8G)dP Wdv5eb)Kwwrm8IG2Oy80rqd>{r+5[YE ͺq*_?{ moood8v~)描!V2k^Ά7rѯE2[*Z Ķ8aYξ]`xʫbX^IEPaFeN\ Eǣ=ɕybxLvjx&lɿa97I I1,Tf懏\1;ԛQ;VPHl,hTVQ:zɘrJI`|nM ?x?4 4et0L ҋ@X$?Nkc`a׏[ z|kFV& <]<EXX׹RXO5Uc-l'ej- ylW=[+_|Ww?7> 2{NymIoXG6jҊ9L"΄m..r}PPћ3Ncz(s`$眛7=!h *L +%5z̾FHT0 3`8u~~:8ȽTfQ0e~VyOj%i# jc.U5'BX%ZLh)Q$O#W)B!|NL  n5 %mgAX ݃$fffeV.kk0V,%AA@ұ4}+Mlw`頍|6J;#i'c_FFwuPbxuF3+jMK Nr)c335N{OM>jXf!%4\DnVf'&%aJ%t{[T4ꅻ]I6$عu|L4D M>džL8'fWLbRD2D3`pN IX??ɮImZlpP&?{*bPXŲCdMq7yy=V2_,c&)ڍhiYoZK+BOqb'oi.bRkk"XY؛R9F5O l%f]91~eLVnN>g'o*pPuNG)!Z&dbDJJr1viTT*UIb!IƆi\~wyށ<5==cS>V^ʁOe`罷a'QCCÔ{U-W1up7s0*w1w"֔skXaEGLJz<:9q!:[hkJ]\ L}e NL{1F8I&:]DRlZ(]vP֣j,r(n"hR<[G ,rŕ/o> |&-9>-4 _@\b0@ԋ8qhd e2 &g 9Z2nPz^Ib<*,b1ӳ@# :xHS6d \M{KLXs3TvPj鲥V]o~;orwBp`LqHuHih=SI1&HtS r.5\뙘dv%\@{{=wqg3w=9t@*Є/'A%vlcPct5:QD? ,ՠL \ѡA̱AlXB֜)a0 ] O͹I2QIW q}蔅=uytC\bjJ%+*Tf1Z"dP8>=M[GoKѣu2~GF\vŕ~ij~bs[­^s:㣣lW> ҙSJ eyO)r:N:>D,.X)%Щ¹X|#l! K[-=Eak ]"jLĦķ>)|szbt6nsKmRaʞ/l],ҹj57F')X{v+!5e22"sf}i.c<B8* az$#'C1;8pjCKTW y ,Y>CbHx+\x}l}oбi#dr&Tnpi.O2q?3<qnx͍wz5C$D0 zj'au"܇E1Q+T>LT;NG 2@Z+\lm: <ɲD_i46j:x.PpJVDkSEQbBtekLio-g_=<84~SJ~ 1fnKc \~5{l㻬i\ gׅ}fF8^s2xIV^N̑mSȼ C&+7 G]:ܿ!aM6Ui&nRh`IEc!Nr_TRk(B( űqn\pnt(OMM,\JHi,meNhiކ,T*'#m.m\!^W|pMS8 `qc ]aLHі #  @l>(L/ɾ%PڄRFQZi 5$z GIÑJx]˙ ezۙE1 B.㑱I!āD 2hg2KwK+cSa*婹| #U^ 6rtd kVphd::.ՠfp)̲kg|BGW=}U(BʚNm0yebl0E^maswqX"ATVq|O?j.C8k:T$rXm{0q-6fÈsj0re@jB12+03=Ŧ]]ҧzhQ#\dE#=u%}&d;ݿ/̌蘪˽wƚdLqֆD_!>#} _~cuЭ6r.5}y]VCL(/C\/x r !bJf#DC4 ȇ*}W5()%!:>cO=R%g1S|?W_˨ /=X n3Q[w8ﲋZw Gy(!q%cJY2z{䪫*u6uw~\u+Rly ֟}q3Q85yQwx{ݷCk@x=oeeuW'Fk_/]xOO'N+A{82 d?7-5I'q)BQ868?]+!0sѝ'@ٿ86ڠ7t)OHIF41ofƄ"H`60[L Scvt͛Ϧ#3? 6&G}ۜf֟w~21cѣX ("V@8 wRĘ8!S9O֓`jr-`Ο#XE86V.X;+=ڋ.$6il e Eb@zHGil&ڂ"?e-_86?׼mϥYTf1sS{U;Fwl I 'ے'Au > mgPZd24 &%*Ҋ-,M#$lv'$'iWJeXPpkS5xAVtP2z(VP9s͕X׼ɨ br8c AZtir!CNʥi#ʻxBӖiJ@g7 &[ l|ĺ0: SR!Rcq:X|#C E:IEHo&„*h[4H}hYޙԎ]p)D!UH$#C,_OLOփӿm40F[KUTu-3Ss D Hل%Ypmz֦<%Y "t2q32o[%q#Y@5pbAg!sZ\K:iU&$=%KVwSuMg|}½ӄ$NԅM$5KXeUq%,`f|ŮZC!ΓS -Ͼc#XӣioSla_(pprR&jT&n9a 7N~}řWcHYpbOFomOjKxox_ ~}$ig IDAT VHdhp d aMMÿ8\xR"ѻpflh5ãmβ͗Րł4 ?߼}t&!Git\k+Z㴵z:lbT-/a˖K$.\t N )2c^ײs.:x77ٷ1<~.r<|r<\t&33t.]2>眳{z_rA Rb Lb\JP]Icl9O][A<]KP[/a&D:nP](R FyI:,:R<'$e)KEH4RVν|K(SO0}t7\Az6Ȏ휳C?ϔpRF 07:(F)M8X'4Z<:It}:D8_MGa2$+ 5O$]{=ly7b[n#q$Dz2҄L*R6MnגpM% j ۏ2]܈WW ,IZ)]p(DU6fY$1J!6nJE8],ԥ]dVֈW-IQuLELE7 GM?XtDrPR?)Z=ӳ9&(Fu {OqQ^P7uL"ˁVDkNgpb˅f]U׈" _?||W+׼tus˷O[2kz5ۙ'w݌ 0k…Wv8BGVhZW*r8",0]'>_Uؚ;ҕc)$Bj'YFMOM ^(,`j@+#󌛥nd#C! b 4՘GT\a`*~#aHLڔM׬Y(s$h6 .9\,SIrNɐu5o _ElY')hϳH_rm!Hŋ-P} &/.MEz.(Y6B |k1ƚYq;B\Ogw.\_ X^s0Ƚ|SOWG  f:@f"}I#k., s5D,Rq/Db @vƵ'5d "C=f^?ޟO슭TBR 6qq ǖ- 94;-?{P;gDXu+Vr>õ\ktSv qD#.0\uӍ{}\2#0vmڱq:=ɱ}{rՕ|'kobgYϑyھgI-Sе|$wp<4 맇oរ4M1^k"D4]6 gL!/LL@>tๆU()T8M =8[9."wٸjr. qy'8-1@c ¤w/Vh j\v0lxgF6z@cZ"G1x?mN~jFNQZgml&1 mcg?=@_[/\sUx%3}7zaD(Nn8QExy;=>ɯ)/۾ EAVV])mi%.O#ӂ $PIDu dbw03DM6n5TغC4¦>ta4tqz"ٖG&>:7p=;GY9sYLV[+D(blڸcGٰ~%ٰjmy29f9Z"kH5GYCIr1j`l/a%@c,{Z4iNBhFp_[a-:}g&')ؼ;a ]ggZD'AZ6xXf$װS Brh@g&RYxx1Te|OR,lCow^aPekTgeW;5B2ALL0;:ɗ+pO!æMɷѷ|JzL{k+#C2G&<!,<Ҭ33]8^r>q)$)CftAvw:|p܊/HrZ-1JIjVzWÓ~|m Y[h8~VPekzmzL;;9M_C2oK/dˈW䝬 g|蹈2)ج|SDZ:E?MkXD"Z>mq:׬aSOp s]SQlܷs;;?GY4}j P/WdVxje/]tw|뜻z-+_}?!r;(yO<>+~tWXj ձt::¶;ߴ9;_O֝O>~;{v.~ay?/{ w}f^wO5{bht "(} ,7#l,&Re Y5BiR,j2G9'tci 9l<$!x m "Z7MDݦw旟DoLh!cc75o{zƆz'\rVgX}T%#\x5:gyqԇcN iǩ2K± jIR?66ួsvC\#Tϟ7՚clLk NW\gϟg%yy+zAf9וּUٸ\~ 3ljenzUmx |Z$Hk VzW2I88du~j -Uâ:HP&CTe-m9_Q"H롃8g>+=]1Z7xR8V犳0& QPۗ)щ2z;I MG:j$8'^`9_')L9dEZ(Z`-S|jsd*2f Z,QY&EADuHq\&CPW1L^f HMs9Bn'i84M+UCbWQu…O;BjJt>ԓ"y~!9iv6щYzqe?ŀ=3)ҸqF9 t,\Y_**2LB!CEJa=J:Dhv)ϏhR! Z`xbپ6y`isj}6BC[X>.qM[u5SWpVۧ,sLCL' eP,j?©D29orLw;&8LQ!&6=g)ird +կwo#lC)b|`,jy_q6{ya& VE}!S0> D!BX+SS!Vx@j4g/㇎ѳlš1}߻ZOUk7s a"N/rԦ~)]Uoo~+m _#+{ "I\:TH|cL>oٿw/>-2=oZWvsEtLёv)q}`˜zL}rX[rA7E)\s?qao?[5V]cַQ.8<>Egm?fa`LevL䒋Uk0>rm{w/3>:JϪutycSSӓPH{FCV-1[_~^>%J/(7 7W,xܛmnD3P5YR,9[$kd*_+Qo%f^)rBR;KXAjTҭ eℼDS\-B)Bf1n{28秳nJc|o\AQK_/Nsx7( 4%VGG:Iit9 !O\=FXx+LCjb ԉ] Ga(. ;_1D!\2l!wIXUdCa&=y@R0",UȷPVl'S6Oލ&(Ush,cq&xkĄa8nu-A-DG1k 8bٛx?[A.rJZX"e ǏfB|Y/S3e&g()QvEfbM5&քArnzFGRx '矵oѽ&9o V^ɹ/xy7 ~L\{լ\뷾Ͽ  K`݉Ǣ']d1J B5'6(mqB Dj9Pw0:a<K%0R[u_~W߬7uHǺCkщx1 ^dBAg{{*^Z:-ɤ1ݝkL h:whXYIy݁NLRh VO-SHϑ E -r:K IDAT<,$AiE1πcbKЊI:5֐s\+u*f.Yރ.W0ڤάlbheWCWB[?ODX$WdU" ȯ"0>֪&~"'8LU=JVs|:"6lDBR:n1t~o"-p!D' :B U m(R(qjу#2y+\qsþkͺt".X֏| 9}6`[_A4v>u6xl#IT"ڎ7M. 'Se\'9: SGXyF~vLz3V.c=?f{uvJ;&Gۿ*U"23 ` ׉el0q|:SGbe *#>3' }=߸{n>Cڲ'F8G^Aeh?q28/}*Gq c#"o ݛY gDS.(DRצ1x wX4NK > H!+q[:QhI_b#L@< XYqz+x/b4DVB;.4~/h<' tS/QXllPʥ GTbu<:s5`++!#Z5sS(DJź8(Z 9,*ۗ@$ ^D.ywG.9"s3'4p.dk=xu7^..t!P&*s;Ad{kyVgC,M$H+h=yky[o"c1+83̽weG}n{;AF9$H ƶ0Yw`?Ƌ׀ c0AhH P49Ox'T9'jFH~~LLsϩ_D#=|rmܺi%n3z-r%t]߼%p -:N ұN'ѩۃcƎczq. tWrmD>K)˝ʬ=cmhI܁@,50?_!1(c6rqԁL˜ۨ16OS!"?>t\8B(I;hcP(d:{㸬^!3q=|?R*Q=CL(arQ8"OjVnQvp=L*Lȑcǿ}~)ḛSۏq\369ü(bp0b`֤Q t$狸K&37WL(2%YݛG5.놋3.#`rI7.JVd,o_X?3xӠ]Ƽi::pqMDNdBw|y;䁩Gan׼Ͽ@?sƟ{T: o;xǿ!|?߃*,Ǹoeu\O~ ^EnҨ0[Igۙ d#n}Ee9 WгfMavg>Ys$YcxRVY[4^1#(F[GfMI l4)2oPUgq+6}rZO=%A9BphSs뭿 ߓk֐^G(p&Ɓ61^2zæ_x˼eZt.B9I LjgEG 5&ȶYDG@"fwfCÃw;wޱ}hMqp.t‰hPrٰ$sHb u ۟&bcnTr͵ײb*T=qbRg=|_eUdycr 7Peh(|IZ X .Ϙ\ {OD `Rucm$tM:n)t}9fz TF|sk-h,kW;L,ppЮUο~<@.K{(=YBN8-V*LSBzu&IV?X^qE.Xq!cϺ.49e-qL DI3-M,btgʗo ƏsbR,x7s ܰFnͻcÉ '80#5/ZUHZs?͛y3-^w|_w}._׿o \Nzı՞ߴɄ5E4u(P"[( I8R:JP.$IRN`F$YG:){XөCbq2PN.t4mʵIk:G1<2{Dʐ$QDQ%&AXXZ̃={CbA8.q,`1xe(J$B0fLO8N6J8j56e(B |DqDZu]”xTAW"BGI=8əv!)aBBBIߦ:?r%q_bD8Z鐠C'8┰M+ 8B ?]VX^`+bVO(bӠ01 bS.@k7\\pH/32}YgV!kyך"$Wt3]W9R[rL>(J]]^"%Hp]V<1eUp&"JT0(=_'?zn5ikFK!$kksCxNKYs;'鹜:5~135oeΈ+ؿƁmstdk%>q 7-- &+~|_z+32-'w.oAF#pO@x%6h!+x'w_?BiBav!b)"6ۿb7n)px' s/G$A5=K[eu/#F˸4Dfgc$Z4%+Z\EJAr?i&bC1/h hrX%tzkphP,i=qQ /WXy m0jrƦDa\un6}8 ?K, S$ӓi,R.bc0`1J0ԧlj+e6m\Cr)W_u Gy-Vr]ߡxa=nA"spe~uV4#enzU25A\k'y?_9wNwR'Wgxt['ZVt-wǝ|IJyjG(d<6^YmO* HqKL1%HAϥXtǤ͔3uNu"ڤ 88ӒnHAA.Bvl nϾb㕗̣Æ+P^8sWqb^JJb4 6§+$Q}FyɊu<45Qs%˅ oV Q=W_:`Ra.,Y+ {ExhhzF2o'ifؼm&eSWOZ9 Dp{ħ?t QmEFOC}=thFL%ZV < 33UF90H7&)=.ycL5>O9. R4IA2Pm*5 sPqhBE _HڠZdѕ( nXEnjxfYf*zs]+"N)s*lbDП"MD@D!n,DԺlFz 8~FX 2zGCw>=nFwQ o鱇 |nz'8y~{K^5\qUa&(sw㰡4 {Br9sU}w>[u~A"W BHei,Tiv,nnkd1bL+Ih Q!qҞIj2$6S'XD-68IDLn.޳z1hulʉ#]LqlۮdZKxX#[8JKes,g8!rQaC܌ȕrT<Ԟ1(anfL&NH.A6qJ? À .% bF'M&A%&~&KPZp$1\ǙxrM!xϺKu=Q8ž#EQ#ifO,]Ċِ9UJUF)&U[!šshj&BGtgQqb H5/O7PYJ=+r?v7^,?E]\yVRM8(s$O4cXIMW1!X(Hr ju Xy@ KRS (J6?V{[{~OOʶ=o2ܿXkRQke)?Hl /^L=u5=k(#7qte=3uD\ !(`S%̷g\8BP ZIj,|Dq Bpʔ"22'Pcmځ!O6K&R bY tdP^r.g&KePD3?Q(5'?On&@2D`+Mib BbR48*GUKbp(c f={)*Evݏ=NOwGN,^{hڇ0XQ9g?X':yXsӸ%tЃ2D"hU:?O>)=̫r3?+ՄMWш,}A2,yQ,~ |n^+'K`:'Ljgr:U?.#F?e~`J% K˕;GB Rt-"gBue;|8b.ʈG.b~jq&e;ƏM@Qʅ'鰛bY#-]=(b(w8XpAUQȫKpQǞ;-zsq0DJ?q)l`cݤ:Ksz5NgAcpH|U[gy;_g)f$9#8b4T!W瑮B%.I+i5ICǬ*eha _ьb>EW!€UH== 䑶|k=)Ӱtpl;#kA0ZhE_}G" ыQvDU;s_snPuڣhf=ϓGw'qnJZ$0ap @IWLat4F%Ez,$;ŶnFt"UD!@=RR)%X,bApܤTuesysWUXJpu/Wgtdjޠqcb#cff>XJ3͠EPq@6#p3\ȓel(O;2b}0KRdCrzJ<(|Z#ew,=+{T~Ro%B y:6yBߊ(mM ,R8O>RSSqxZj϶FD<}e YC@'aEB2mXsYXjM.i,PF)d0A7UAߧU RJ zմɼ6Qrsؒv5AHMo?{E% lӠ"`eG4:]Ktk,JΗP\"x /}+TM_f!r ht&"?<% E/%e5VMBQ+q|1/ k6_خD UzVnwp-7 IDATkVqxýn\϶{9};\Z={X}x]1N˕8-#vkti#yMP~JeZҸ>&}87&iA9ӄFJZPZ Jm\ʫ}^ U`vvW-p[}݌M %(*t\\)b6ijȤj'M/,ݐVP45._Ld B{.RF6GYZݵi\Z!!'x>Oipo<|?lgT_ [i-x|R6O A=T[ ەza4)^fkYn[F4,Yd/F܌Kwo?s  ]MƏsA5.w-xuu%Gc*\(B`D.)W&'_%q'ͣt(!q=Ii;K=IXށz VJϑ5!~&uZKOơA*BvJ^rtA'(f| "q>HV&C- d"CŅYJ`hb8m=ʟ'Ï `e|!sQ%f?:g-d6ǿW{ -r9~\{g0u#`X)O=e (O։=m\i%rƢ 5ZbRQהw.%\1=Xȥfq챱E[^adK$5QPyXvG]P.5N2=uksR&)Lzg<i{ `EcBx=>õ3dCf!nrqu0cK.Q6s6Y*-b%m^c LNrD-Fٿ7lf>ljḵgF Eya+qiA`\uS0jM.شAyzF(Ã3^1i$d\̮/=B3%åk\ QXPlP1$^s-Α^w:>b1 dh"5AuE= blƠߏ;u P9ÊYG-3k@s%l`wF#zr^r)VvE[V9+.g JkD+\̑#t Dvldkb9ՉU֑ uOUim |!O˚33&i7Ccp/F( )tS}.fp!È2LjjuA-y#',Tm:絮ԸZ"26]Ff%L/2듢! o_gIn0QG0JnYC)^v42OP,L#GXJNm2^7hRr-sSSaSs5V!fsOFkddHVjce~Y?Ro16^e4D>'<Ҥ'_5bIYE0[ǭE(WR KdZ'ώOҨuaM̱Ѩ"/o_rZf ۿTme,d|0gt5+.4J>ênW#D}=J^*㘺t%lXDpr{~ Y??wc݆!J &I2^$ BVv>&^Mҝ nnz P";IgfxKRuJd(KkȸH dU2m5jUU-=d4< Z@4U` B^i͓$ceh*'\tXfs9Cr]> Ҭ7&)]!r.T*ZrBV pRjJOw7AA<%q]Y|ߧjzRwbn- ;1m)exű9"M/^f]ǛZXcx˖X4TH%upplX~"⾹d%K+hq'c-92|ɠoι 9d΅Vj CEÉ%%]P54xϏxd_(R~@xHSx{4M%=?r(%-.Y끪0! Ñ(9&졝2+99#P5fjp7yK6qٝ9jU\M`As]4A!ͷ)p oW,w׹?z5'E[iD>ؕh^kGn4БE&7C ˶\gg&MU8wo96x2Dz Fi smjHȑ)md\3 KT19{+XyGw݁_Wټe &!4Q>zY+Pa)B "T?x =|WXrA+CS(;nj7&QT /z%Ȯ yWモooߙZB4jLAๆ L !,dboRL.J'v,ܜk ALPhWGQ%bKQ'_B3vMw֣?GH6#n O E2ADf~O}R B4\AUC-7:W'r忼y9zU7z/KZ~#9ܟe*е6PEṟ$|+sVfan}xwy7oy͠$2R)wpwSjAX`lbw1ftҚO2ځ~P?seLteH/d&7pq;ɮ[I}aVXi ز;omޱ~=eq=FMk9Ƚyq7:ꒋoY9xjŢ(2ہ۔^(J')*Foo jOj,!2Qm4b,Jdzopאbm"a]=e8w/AF6ȑq:Gi=ʼn={ؾ{$2V&B$*R%ՏpuL&i18x$SƘ6$J@ <&ri\e[Ƀ:zg>_41`ķ:QZڳ ߗRDb%%&e*n"6Gz?Qx+nccMy1c8A+|]Tt|3'{^~;sg?};>Dлq s`&/4z?&j;Xyƽ?Tq_(&v LT4ds6ԟHFW8ZUXl4J- j`h' PdTe(%4P|Zu8$GbVI\ Q$#k"rfBbmI8flIneC>UL,hNF,*7_d[3ٷ_㯾4t,}*kz+5)*fBjO{Է5} p lN)< K-lLNCǃ {Wf~HQ8g, 0{W%380PL!RId|cMEJ=Y, 3ŠaS3 d9ɠeѰy7'^R$:ɣIDM<} ʖXg: z#ǛkvCp\ns6O &y{& 3KXRA-/ܶ4R&( f&+K_zzf[TGqlvzcG!ddlL :nu+B'%( |eTg^5BEo̻,B1~?af oEaӦ |ʦWOqtA 3RM;D"ij6ə :D%6Ie")A]0S*B.qP$n*=xՙ(pql t1,)K6)1)FRAnZES1K c0$~*|XAJښY.Xh[ X݉ӻP^u>B.eY ekDF&x3(µ:3 *O909F[HtVЙwH8%Esi6X ʂ^~),3: }0R}ʗz>'^]} <%^![g0}V3g/?): 4T:ؿi֬[iir7͌sեpuד6LDZ(!P`b150d'Y']@ރGB\E(Է#ز| VXZDL;kSkd:lluYvVg']<zVd> L_IS5 bՋk-y%[jsof{Q#[XD}]λluխe.ۜ~L;hp92|pD 38gYDOmrD5+5|#jY~مlHypf)<4XjBx@#ͫ%goZCCݜ \LeV{h;Q8քaIB5j\u3O`PEiT j?%<2ӸAnzS蠄!4Eo-F"_`ISAJ{M'MXEtB!nQ.i1H ygKF>g>1wG{W?bu(WS860&X`3@AB0-6%4RR8MZ`W[L*g "9g$G)Fk&Ѧ~B6-Jc CBĜd6RNs wTLk!~pW3t1&>tXl=߸+2՜ )6.T-{(9:uz8CژŋBܒ\}kEgfz?O=ǩL 3p_{x/+/^ v/v%ҳr]64 lemF %Q qr`a&EJjLQ/i2NS-2%k524PβtUfLNL )Jb,"#,lcb`n3CL"-KSN MG~m&5j4<|ǭ+EӖ8c8Wv\#V69ôi.Te&y~>"Dkuvuؼe ?@Ow7FM(E_bz)bsA LF*ea:{z>Wt"csx?O%r^ء4Zhc3|2(4q$Eӏnm]ͪ(EE("uR9[ 3KG6mLbi.!$IQrCzzL>,:4^# up_UpI-0[GGƸeQ8]MLG35]5~VRgLSĆ/ˀ[ EQ}j9޴S4HTùyT>q{1S t8tpaLH>s|d Vdhf?wn JDDs `L?X *~<Žp2dJe#d,At,)"Cӗ+QZs.n\x;~tw`8if6]́ݻ[)x(z_:YnQfbJG]xNA,ʟ  :kuQOs -4a3;[ mE$B\퇦<:0Ɣݤ)@ptr1\waV,s6XUKyӕǓk:62MJHњ2n͛斻a #ޗk.v|#2=7p{Q*q?y[x絯晻{i?=}0X ߇^Ev>`5mg[cӨVd^;*-_|~ky.O0?lLDziJO"nFF5{!Tyft[5d557B`Yyݬz65+5Y咫Ν,_F6baj.{+sl2BXR1Toُ')em t)rH(9oe$bXrA3.Hz2y )`<|=F nѴ`8D:5aR74iL -Lʑk:F%IWQAx.)#vqltc0L4SJ;$5ad@Y2(c:׿J1E%:&c='t- `-g" I&1؂b6: "jZ& !" CϖP$N, d }`0Yx)』JtwZ|pEH?oH!i#CI\Oa;q4%)'B8 U&; YP"I lszn˴#!-lb6iv\gSKџe'h;nc4Ⱦ33N4.H8 9/ b4V~(xٌJZ@oz5#kVZ5OyBrrſ rx`}3##`= t%vsnBk}PRil$܈v))JEB),3q-GIZ\. +Vd|d)"Xf0AE@aHNVȥRLNrz{?t#*eTG1>QfŊT 0.t*2ebP+mv*X| zAutP"eDqtw?=2MD,0MRi^JKTeGؼy IE^ɓ!]^"7n0W"edBb6FL''*T~O'e {KnllKEfAhb7r\7cĽ{yӦ>^b $G`&e/.,9iR% L{2Qr1SQ]|h;X0D2YEv^bL ,3K!7=z獫x)D&yb:69PltAtRy{;; $6n0y픽e;Ô ;: VݴUg`B燾(c'evA%"s x64PQ@_" !īXD tRQY\H*zN#欗^αKd.8DYOo_jd3KĢgݚ*th?We#Ø+eSX7iݤe>$\sWwc:רO8mgMkce)f:-5bh-T4JrJKWV!CkBbx%zټ"^|먻#xul ` Q/XZ'^G -QKƎuK,E %.CTC53չk TjF6lTSLe`Ų0(ۂy8[y!f.E4v}biӋTF['A)f ?22F#C5fJ z{ⱬ%j9e `* /.8Zxsya1=1JOOcSةBThiqԤIӣ!2Y[rwMqG0$±yfnRrWQ+Y?ZWX-kyŎU*k"oRiO~3ɦĭE.^wE/ 1B5  \h%Fӈ@nJ͡c 2Vqm|&0S ouu[҄մz{:l=l7<_ͭS|)}J%,k(VF"88ޑoٺn"Zej3f`fq;H/餘S>LկpUW5*w }<{k7nF4|J{sϡ8fAҙ(*tY?MЌ05DKܳ71T"BK:%rj^Hڍ;=8Vk;o3x =5=&?0 FۤG }B: ؒy(hK!B_ ҧ"bYPP-!B$f< SD9B ل{uB DV߸B Ŗ#g1l,^@TA{ n$C4ƒ gZ{Mwh*` AEbDs^bAf*D29)K?[6߸um`U4$ jRYˇ8fO 锅_ q I k̔Ij IDAT TbcWqRܡ?''$` wB}b,O|dd<7 : HsxJPGkMj5h%-~ZNh\ɯҟp|rKֺ|Yl~0p`B) P61k#HUq\EB12/QW)ytu aɍ>{FAMn띌&NsX7:9x*ڋIU5 `amtb @d拄PYBB{ح5$$*R)rb M ёi\骔Qw9wmmy15eْ!0i _TBg'RqDI@1=H:f ZF>gϾl^zrE,2;ιLMNBHHBt-4%ЏqL" E,b?htSf.fZ /NFӋS"%hOxTwӕalN/GIc' 'Zf/@͠3! vѧ@(2dC7tww/8N:YeA bd%NvHi1tQaӺ9ՙYdQpSڦ+. ҘAHIC<3ӤeKx2Li<|_4Q[_CsaP25|Ihᴝan'#tr]R(U9 OƔλg>UQDHjPA)PGYvZ=~Aq2q SjP3l>J#hWBu;־?xcD p` = [a<4,JCc`{BR="V6ý?wο21{e<}tྻ_Fuv6V! -IB!u"tv+ GQD)'4"i\s˙v`*jQZcTCfϒuh'mqNv*DQ{d,٣Cxr^4-[(:)4Ǐt4\AiX}0_[@n_sR-{{oHZHvDT/Dڿۜiq]6ue*,<Xf2aW)&g6cSh\ױp 05PFfBC-,VK1F#6>f KY'&eCo!vΙC#g_= D( Ļ2)qɛĹ>mDMc:Q4 fHTB<2t54QQ >}no)lsHg^'?qx!}pϾo=CIѶNĂD  YNз&KXB_bJVk2n6R#iJ,H&D&GDUf6Nkh:F#h&xDKknjUضCƁCSZ׃e͟:+WaH(\ .5Xq)*Qֲw3RlVϩ =},P (f]i23eI[hSSEn;tD*2;dҙzhc4EvinNcx B~IOECm5xffʧ7OTI3 ;`yۄMggǏV!REOb2M1S (!Vl\ɩ%=8vܛG(bzv5똜]FhR reI&SY\A&g4W: ) ٶ͡6eA߸u7y HGgy׹+,36y%'o! ҚfOU%RՌYi3 C|hSUQ )5LsIc"ô,t!l6bRF*)4&EG|e' 9\lIPV6ɋ"H St kmRXLteۏ qyۢU(q2TF3.ǭXЬ NRM&T! ۶{Mb#rNDH_so?Xis KȘriʕQ'i)Q=j$H%P>]Y8kB^_cӦ  iQ?|={qngǓ/mN(f>MO (LC[19IVB\n tTWe9{52hj~7 1* {I+Q19$l$MCGeIW(SMF!_'=iĈAfvH[Aٻj }6fg|S+.C 8>=7?-[cvӕQ0gnpe/0)`[ж&Yk i)0zz$q5rϿ+9zV`*Ŗuk{ EN89A\%f~كmS6OZc,sEc5Ns $ʻ_-<4?_w/@{)ۇѮfdC!0m$ :nŢ3;W``~Y{_xg,[#"b%s?_|YkXb<ԼH\x*Hs,΅Yz{q.>k6}2Oc CAB\Gw݂`Y'``S λ` zXyґI|TF0u#1TH6ќV7( jQD`C'B_AL7 DUTdREьgLiI{Ybn`Ed2N>M85ы4ltuQ\ 3UJT^a)\L1MACYl岠`ꈜ4ޮo7ׯw{# G<} I;Q,Zɵ5 XĭWd gT(s|LZ?0lu nm_Pk V&>%bkK*TEqs-;0+,lP,ԑbo/)DA{!]43S`y_7JELNVZ (%ƲLr9߇"z@DF<{VK矜>\jڜlzjMaL)XE 'Q0[s)Q`"w]PbtJ81E! "lAhI\im'li,aT)4F:A=\d"dI1#mE0 4:2IYPLNY@0fv!30]DPHk 9zXrp>6nmV kТdaU ]E5fO?22cF8<طU3{K`t0" QB(6tA̪)Ϳoy ֜w;y,CPZUo׿kʟ^͕=>aưKodz$ǮAx4\ D[i ia NSPZٗ\BVLgᕯ|;gs,ٴtvs\[Uȅv[V>Z?O9>9Ilk&bzteҨy|^nl& ۥČ=R(`6U0~2BǺ)|$[ž:cg<i! 0A `8qXBk0Z?zGHM(@|!N8B) a2ֿ=~7fڱ޻L|n)!l"щzݐDװB&p8 -!1Lb21`\]0jZ cm\!sP5:N&`QFEe^g7]W08̿|<1!n'NQml~-K< mk703]fNLBH.Yj)ƭtuC1F4; )M4DR9\3ss(e1u֔zY/R)_ (P^mɇbFU$Z#31G4( I4DPtI3DAHf2x`j qx=0M~y|ͿiQxNj1Sd(<\j6??_}v.b1}x0sm ɟ ƧS"*d!V1t;9ѠaQB͔}w֭>vNsVD1 T+9&tB2)M~u*Ԟ+Ĩ"U~  BW RB>9y-kWo㷹W召#3?%<seQ{j}=9I0 cccƾ}}}1N.. ʣhF{b'TU{w AvKk4=gW>R^2|+EK"Bi\ &&FB-g&iȑ#4SE0'MXSNok(-3>I2Yt 1ڻV1=5l]IJ?Gͨyҟ5x|s#LbVe/?Lﺘ}Oϡxm`:`U AQgvjr|6mus|.:6m_,^Ɲ'. &u+g04֢RQlrjfQe(hRsnqSh1<>H8G\1;4o%﹄ dx2aaN_9Q+?p'guKdC ? s nUb0 Hʞ!Ϧ Hk*@+5[\nȹ<TUҜPKh54:D/G^k_C1w0W o2r ȣg}561B@ʢNJ,[gޣAEJǎpsݫ4+8v5E՛FEX2v3 L\H5ND\ҕ셀{EҘ%)?_@欄7wEqu'v~7f?e78Vya?#M?΃ٿDwpŖaV+IQRS^3]{{]}Pxr)J,.e}͓1 n\o{#{v>[fsc;&9?S䒕E0a^Nڐemln?z̢P22͚[\}qޘX`4;p*k" IDATGteb}AӴ8vp/{:q c'KǕ]<1 7t_]pPq֢Nv"??z͜maݣ؞%j"[1BB&"LJKB$\[Yv>,) ^WX=$<ypQ}- +I<+塃:uA<~Ll ixm/gيjb QiCcJ Q@{6K_G5dͦmXr9)]2^ Wx-) qbNN=;9j+&c09_គP"L#DttQ̺vuvH[֨ɑc3OP,LJfw`ɓɗpT3]1Dpz(M)0"ٖb!M2}i͹I9 >iVCZ3uC%rq2Y%ϖ5|6KPkPferZ.eI+:F8J*DF' G&OO Jyjӳa56X  B UꌦD9o:ai"uUoss24>Ɋkmx^rguaiwQn:S:2,b?YѷZAiǓe$j^6mQh!1(Uhݞ|g4 eRj[S*?F8xs6 qI?4 ;2)Hap@7KD=foڞ^ YE>X7K~ay*3*cRKGp$2 0A,c 塀`Rv`d TT*m*[󁋊F؜!熔99-yz68E)?f&Zfa*Ubx("PcT3'Hyp#2LU a-S/Έ(tq!pcn^U/Wx4nY@I-P[6.:vi ŶZ2J\"&fe|>i&uIeE a 3 '}!33%}~;w}_VX8sšHza-ҽEYvR ,"sUE ?-ҍA"D03K|saJU{^D~ 5rəI?|+ٸuH-g=ɽO9rHRߗwWct8ƢaʵX&`Y,q}bnJ٩)R8^SD\x{?᩻364@֕!$Bj3dB{='NՍ)ܴ@C)fH=`S4V4[ I-'S:JҌƙŊ(^ZV#`!1Y׭O^3xeDQV7Ո#4w]fEˆNdcm]嗻D)N_ʞ&6&Zt*ܶݰU:7g6x<v;a;@e/ :FJ<|&ۓN&ZR[6|hMo\ƫW*L+:pajW0\{kMYFg90—sa~Jk|+V#9#Z9c$)2<$2i(">5_tj9tE|Wm ]8 9֤g>~O%|4!-sy'w:!9%" X b'fuC321}[_~3_gi=#qمY,Ȑff W(fݐ5y'M;xHsѣ!!DI:2wu4êUvS FDhx[b~m};Ts_|kv/RXQu+?CN/+L8n68ZDFݟ$8hQI&{*K7q! 1ȥڷ!8)-}V+#ʫ5h.qt`# nF%rڀQz%2EB5qc Y&ףRT &d+Jãߤl\'} v}̹Tgў=ZJ%^XmQf^xQ;8˭iSc@ @Cclta}]>xojJm mЊ#-n62x[0#;)Z[Bq"Z:<|+bI- Y?*-Cuw7x_恧~Z]o"6oj($@c=cW*ؙ#1yCyM_zJl=ܺۿ<@e*gl3sX)`g=C4OxG'XCcjNܰ^18BRid dY5"s@DcH1+p} s !37n]OWn䨥R3^Oƒ8mK6ieQ2§IX֠i$,hB"Y8FrsE۷[6ӲS?622;4@__C:NZ`Oq{W_J.2=Ӣ2jQش*]e {xqA MbżlL\ *5لf#8LNfX,{t, !ep&L >ޞE{D6k5BA&acF&IҌv Ĵ lθ=?_?'͚_p /݌V`KKS&l͇b:V $ ŶX-iQeD8~L&dszg60Y[ nFj^D1"2ɥf_ R*Dr9 DX$+4 "0XaZTz|kGrI!CP`d7`&lutM?*xu/cKCBǯP;x9G,Q̀"vYg;.z-:(9_'1-^I[{5}+͐JGt˽ݎ(EUcb%i!0!eArI.L?y4,ְku*^ؔL§)gAPn0 h|w~| ]?b 5Ndʳjq6ڡEZ-q>K}l8@Itd4u9lߪa0|bRrFɻ eH4V󤮞9T'Fl^ a6o@+C.klLÕWsVYѩe!:Iߺe;ɘqq#As`h- ~75kX'Lb?eihRT- QIJ[}6mmcզH1䧁S'[v7]?57:>;`;glcH?s2 c9ptRrV dZtuar"`6m\QdN#}ͷlz֚O,1^>ZjJ/$Ԣz 5l&13J "фSu'sLYB.zΐ<:;|['䂓4?M W;m||'y)tdqj]_sIO.glrvh{kdYZxG!R@BGez(lv`ED޼OF3{=i:BYIu/^tWqpW'҂Ya&XTKWpXc:Wlcxl+zWW2GcÝ}} k:f L=q+ug8u ҾlyqIfE21?џ0I.B w.)0qA!p+;Y*^{o78o/ym[nƓ|U_0-ty/?+˷E5`*-ůW|>̴?5p5iNxǟrt{4'd۰B>PXD)H"E ]%%-c""霾!<ǥ!tK'7x Bװ3O~ 6&ђj aPlTd&M~[g3,y%q۸+Ьo յ(!kh_) Ѭ<" U":zM_;D RZlJLzOM^tktD8xRG?le$\4W"" B:xA\"&^bfTF_@/Gz#86)\dS[7 lTa16fkoa_&lJ\yIّX,?%WBP&:lS3qf}.0664Ns('FyBi(+0FbeYv%9/ǡ})ۑAk{Auk-] ePBRV XGg"΀+O5k+ə@gldE&5)V#Lj%N;} a7_ee,0FYN.// AY=;gf>;..2::ېƣZo~qǷٽgІsFgc֭,@?#!SwvѤrMG\cdө"؂!S"w[/߼n&f}b)S9I# &lUBf2:by5 ٶr\giոUtZ>Q-Ӕf̠:ͭY'7J% ڷQ+Ÿcj%V#~NdAf8n"]یm| NY6 g<+M|S`%Ry7սDyGW^jcUvwD(9cNm]ǧSӺ缡gpel|VQI,5l>ot*_KpQewd[_Hg{X.j_la;nYF32sp(`$4]cWL^Qi,`+<[62<4Jef IDATCVe/{9fL!Ku4i*rKqMrIDž8=yn{߳<vYr&{>f-~<;J4r!bf~zHF5'?1o},&F6f;eh_}+X.<]Xj!Y,Du:婍4)A#FPtPYAmVρʨrA+!t,.>8ꪫA|O#OkbO$:MຠcLts8^2˦hfɀQ)1&zM4"%.QN16mKƼ װrcq~|XI'8(&#l0Z'MRz,LrUǹ7:\\A116c\͖7n1Fm>h}©az45L9W`6:Wҋ=opӞe{(4;9Agb"Bi;ya&n&miLNe(b-2x.g'eo=aR扑8h$yktf4drxX :zsAEMxz2D&(,4/rd5¸ ,Rt?)e ٱ4h\~tw91җ8qJ]e6#ufdYw;Sd Q 6J5[r`lK9\*pD {M; HR4X=[Hd8t`()ܟuc5FXVH._ 5#:6`9K~!< nIbt d-7:=D*:˙{6@Acbr^%U5 ݪ'>0DKYKشxE@=?H]" hZ$]ZvmƠE"5 M*ɍ/kw6:bQka6+0:A:2/wi|Z>.y|Iy:I MjZ߾}gwI%azja Ǐ ev>BFem>3KС8~_ DVЖo'wiYs%eڤy]yaiEYk'90};Orda /]WhNN2:3M"{/~eڥ .r/ع',ƾ w}6zZzo24{;'fD;DvNf|Oqd',b zxɋ/f#X!I,vEW2.hH o`2"a{Eʢ0GϛsdJ /ՙNJ)\q_O{xp}_/pɦnLWn,BZX2?Sf\dhrz77BGw~.FPA=\6N h[{Ҷ"rD-B1i2j#J9Jm9p_!??6ipM1\#A[f-ֳ6f1y7CcCa2Qā7Wl|߹>n|ϲl zdY`6!6\E9z+GK S<`2Pïh\eM2#S{XDӛ3 %SƭHw9@0ILbj=?x?|AP9h=D$gp5lXҋhj¦M+GYшB`xXhH.EçAG+/ cb>c\MAP:Mvz`'fA7z#.=p:,jykM̳[e9l/C}(14 a̦ a_c.x5ÉE8``zR6_JGG4B!B,شX9=9͗C8+ RV9"kȟ%V(|9m;)|Zf1VE KKo8'}̉ľyA'qhN͘X~y=|LO7Glaկoڜ⦷N#HgjmlM%b{3%=S~ \Jv200|LPGzcs-o`rm[X!%2YKz#7Eː8sqZѿß/2=.c2 ̜XY yǫTr9Ӡ╙;꛲9Q8x.q\ y:H؁ǩ<M9NXUž]!:46pMJhk7YQnc}egE0M^xS>{A9yt $“!J!ހD:f(`9r8o\;C:;Oe>}s>@j 2*Vd>nhZD:j:SgfhO8!?8\8SÙ-%%!t"?N\gCpeH^EJk5TO&)ltIqS37n" R~)qQ9os7/LCdDb"bMlCO~[.x.JC[p溍׶2nA*o&ef`0Zjn9DGKĂvìB2-[oa(I&4Cy{;^O¸h|cAD ˿x?_I#bpSAFz;lк| MH_Nrd>kA=Y^P~.3pF! * Y<ؿE:Z:7g)j28ڨ\[O/r6ԑFrn-'NIGRA d`9ITl7Ia*8g$.c's^B,3 "u?=!|wbmU'Xf#(":A[kr%ՅGJWL̹2833 T_Z.O?iʆN^g~sݱf z~Y^U~BC\JYWR愊OएFbM̆+dž)(A#Y2b‹ͬHB KQ!18IZuxRA] k5"ftf3Aq5K D9S@-בL*\|if*c68'pv_gv^{+lS3dLrGPY A6V1y =JҪz$V2ڴsҡ ю|>I΅HD\KxASSb!XDs:-^^w?Dn55H|'j'>eqI0lL'BqA2E\sTD j Tj{mz N4Y1UvG]a38#}#d^2%Ij@Ղ&sJR2=2F8 ӴT+DLm.[ŋDMTX*OmheWpx=x=u~ǿ?B"M?Pȼ=1BdAT+9(qY*8kSttA4VLZh! p=Tpwr,]%U~smyv[.5P  }U nBu,.!@\\{h^"4d+#GyTZ{/=qԔ^C#+KMw,a~='֍.E8Tci;"[~t ?W%ՙ{A) Eo ]bTc)}B2qꃬ^+yK))n_gEk {o>3>v9?oG]Mm4KN9{ $ wg e). Xާ8;΀6Ytmr*t |GPٞd`t O݊ @gh7=VE5XԗZk$Si0:2S}#{3GR՝[XמX獾'%Pja?nMg!qJD}sSH:7J8^[ΟG!̓ X]\8;t[?>NXjbv x j쀶N6H8%nֺGTU)|["tVk1y vb mbgH%66N^I!bLx|9=c- NuH f. (ap"9|? A-%:EYdm(Rj(NࢤOHCGġ3XtđYMK9_:͉ " )iti %" qK#RHr9B/#$GfcLR'2 PMv ѱ`)伿'I7'[8ss{ f܂:4>x-($|h {$S4o` IDATGFێ)=Z̗ՠ{aX'_ߦ8env"X4Ҕl ktoy-;̯ϲa"u< & -|V=&@FL@/OH@gw@9o34x~+}ضs;׽6ƫ V{EKYqf"}!z-]ɞ}95Z PE(tE瀢DH,ɺ dHfmSdYb'xwq+YlTÆ5Ne2 4BOe+EIRN%pt 8+Hldq5?JbV4]؁3#ڬ\8 9"%^J--dt%)Ů+ԋ1ONQotQ7b |K_k_HBAIXϓOu5LZuxe>ybf|Ӝ)V@"x{]w?cf `YwF`!ʼn:L o;B>=]ԧLNMY{zZStXk]]G&Hd]$P89PW+tLslEJš$YRˁ|KK:N.t^ۘ8]ų_b; Ey0Z]U+1Fi"T>CakOy5–%Ox"q ~ 0VGl*XRc$qv]Ǹ\CX:Z'a֣Zd󖞁<8Ma2IQ,g@r?({*VtbaavlFdz H!J[QjȖ߉!1x>ߗV`F`)<\.OY6̖hAi:TgEOҠ9 ÁgGb-`RG|&:wꥼl_ڛoW~9g!J6~s1F|v1^&Mtt. Z#J}ړ8"mUB{d 1m8ӹ>w#~M>˵w{:>OpѕW#%kpô5`GGPBau&>H+ѽ$KV K7͖l Z*{ヒ$ӗzS<̓=?~s!TfސAع~iaQ:=cyRgPA0e-~zH(^J¥V t3>ɯDpOڠnbT58[Չ>U+xFyV'V11/y{]dŗ r|jQL0;rna~fEݴ*xȜd*l0=&W#bK9Dc AVca1,cG#j &FKJyPܽ;m7vORKW s RAEix=:Rq1q \:qP?vhc=SZF#KR'w13r R^;7<۞:Nz1tDttѼLS9Ioeq@,\WxS<<W:jc9艈P O%099T}};Kz9vm$=ν:c0I^!f֖!:QfQkB`M"7vo_"WdR&9ڞ >yg8\|lt1+q>JU ҅*B"-VƟ==w( Ol{ac5A6Jz6rӵ/FN/UؖtLH9:)L 2Y&iPۚxJrtOD< & &Mf e NK.'ۮbMr:>3,f͕q@cSJ-s(!Nu?4,&6q; JYc\m. JJM&bnq& vʡ*F$:HghS8%n^nCPL/U5"` a) z)@)I>ӿ1 c ZyGVz@$ /35jB$E P3BϔTY%8qyy:ݦiq/{C|1vK wcVHaZh) lj(P. Kb<{ ag;,gἾXxTST9ͮ܄#D fhxp܅OSp_2;̐E4?o˧>1:5v2~B*9uN-7^>VF&7XwyjPc}źd)s.]DN"DsYn2݊8/Ug-P=ƑѭDDhzu8֒1|8G[^h^^w:֭˲jEC Y-!#)xx WQ8}V{*Hmb&")ByJڄJ'W#LUc%%|iazzbݣdx~dhoE'qspңi4!VGI\d> ' pH!K[+fDu: i;ĔZeN392tgNCI?ǵSÎhQ8G `"絈qih[⸃'El/`Ik-ڤƀB,8^쳑^B3`_4Op"YR2)x֞k>JqP [y>A\hI27d 0 ũMqQ#K{,Oh"Mr,^mj>@;Ef _8O-tG f VDƬݡH 8j6{DӊVQbX yp5,[ʿ5l6U<فnHX44m۹kX{=BײAϰuTxN$GI'Z=A-9m*%3+%uڸ.@?nD:^܆{Z8M"X@ɺS^rX>Ҥ#x ?&'IbR9!0=Pϊs:qPG܊ r0vMߺ<hl%hB1^ :)deEl1 {*, Wq5L$x`pFzH6Ap,`Coc9vh]!7)v$!/B)y*yDYJY6[mGNN`@^!]KB9d (2Z1DQQwA)@fY1o1^H !NLjhhO@;8t0&2Q7)lj: 0|1f<~Gcnc`x_Hzd /qZ49&iNY>_?w9SMו%qJ LiKOl!lޫ.w`vl0<ˀ_P06/`a4}=YƏF*_ҜY5hXcm+igN8\}zr՗yuۂ~h<_@gG<_-ޒ f~O3:JSry!pvULx~kv gr ggfPv g= )$xwS݇,dAP9!( tutXv "ʒP 5V' *#hjTӪjDNqdIq/s9aס!p!kD-آxOy9ۯ  {}dZS1/Ej6`RٰG?yobn?j-%<v#69&KKgGn#kGBd2E2]u☱vV[H3nAڥ+c$ÇPXF(&P1Lh6|wWIMot`]QOIՓqiM :: LMݸJBp٧9w//bXhZ%K%e bgr 'yycO0D(K ?D;Xa>Vm'8k'=hawzxͻpr/Yۮeec#BL^a& WG'gB9s݄;\u$wRƹl%X2r/=PY)ի&OR&`~@HGB|KahM6jk1ZKWJp" t". aL#20O{AWOIi\TGB-ZNi!K6=yġ EQulp2xr#cb"\3y]DbK>5crhξ,D8m!sAq` e d:Q<}}ƆDh%KYsXJ<ūrsdm'pL\^gBxlo7~^|ӷۀʌ%!/ ;>:IlZr  Zm J~EoxSO||onA堞[6}Xxywޜ'Hٶ%&P>;|)i8ZDLϚ㐩l\!E:A|4*@97O}[ߣh<~Ȼ6P9Ӕs9'x6} |P9S1!AgsX)<tǙ mRe`pSLᦛ-0WYn:߶)JEYD@3C J#| a4uH-JE+Wd#K9kK(j<)'q6]|_gY1CV9ܗS"h 7ʃ,@$vɳ$?RY¸&j ӿǩ\Qh";ϻAIC8K|[96\,x/pY˜\9xl~s8c\*.pT(P/>~ g;}/y[i6護@g)~*iթTrEXi1Ea> IDAT=D+șD9~>\tE/BE}:#m3ӏDإԞCs((fM"<ݽI|?ʈݴ\DѠ#6Fsu!F̀d||9Kiz+`rL̮14ս%Gǩի0٨C}rpcRHh:N7s>'BLhJ^a41;) B'gSPBqwRWD[0йq-Qwɚ8wzS8C= tjq`h ,ppGDPB&'"R c}ZѹfÊr:9DvܳSވ+*Q&H>BK(։UKȳRRGw\ؑUt #q޽.6)$+Xb)ccl߱z^r5f<ϸv+Xx4[4Wahe /ȱivo.73n!,T;\G>r+Y|F-=Ah8yӝKn 𹿛ą] Y,-rqDߺt;٨  ,8g sC8ߋqZ<>7QqzFDg&-uoI}>$ɤXV8Wg9]eWIj4(k srSRwދ"\s2ľӜ44B;w,^Фk+AupFTU"2J`GA?:ţ#' ݜ|Z9ԾBϒ рN)[)vrɺAтc1Xy$ Ȓ4Ke-Z!bKW"T4:ny|?享f}q-OmK_wGsRm4t5nz,DH9+%P䍡h[w/+ %}쬜Sd#ci_׸l%d0 c_[s7x睳O_sov`gNTcmc+ǫq}ey<ô*3皬ZG&#UvS05VZ[28{}Mԁ;2ŗ7CJ'%ly6w䏦契 Nk/PoHw9{OĴ'cv\7~wRX?xi:򯿄^{ G6ǖ=~Q~W--l*J,kEl[fHLfhc욠s t-jIt ~r%fb:̜owjçd@e!;a Y R454BJuks!$a;&1x{(KtRAYQ@Dcs &k/c06``l.9@HB#FvZg kVڵ>|iItFHPPLFVo"L ݰD2J%`z1r\vac5t\G ɮpXJ `xtٶ8r؜IpG6ج F6`\߭HgP<7:#dQidCyr,ؾ%0 /nh(GdƬZ;cTGn7E UіU(0#4ˢo<8>%^y9T 1pq>YWό doY8<[n ^rw7PO&mO ضyv6_w֊G5km׳sG|kyꤥPPr{02snz1??zQ}!t]GL J:uKK:"2ʁWhu > CZN/aE?RNx1VCTF8I(V ey,j^ 43w+~+NR]޶y&lyDJn}HSG=ߣگJ_^Jy`j:y%V$DB| mt(PQ8iR$\#R1\օcŦˣMdt85*o̤`/;yMȴo-^zWZaYLiQI"C B%V9: jbyJSb"G?1ẔUuzFU1V (dF t jY.&"v5n=p"ҢHg4:G>RK59p`sM糧M>Muge:TF"}a_$(/ꈸ5_bVJBTsS~];XjS3㴕&D:Pzg=g?m"Uu/-[_R x3pó= G3YsO7r6 Gd膝*XoH-2^qh޿~.ֿ\8#>X~)/(VLD#WadU^(?P'/KiqՓWPa118lD0Sw6epu'\OU4R n\yA IkmgњZ:њeJJ}!=d";ȩK@:g{~. nK~j2&`)k@,mpn-`O }dꋐ({Xt<['Yw1b @)w=rXW/B4r)XHg`xޥls͞3JjOs:?a*!۱ޜN䀣)Ne[j}*UfWm|_l7ىkb(W!pbMZVEN] L2⚎dKLha'@ KhdGui-YҚ C>sMVH|^x?nAehsfi+ކ˹7jIæ /oC!`-2W=qSˇ:tEĢ(Ֆy,&;aN?T[HcG@E4`=A_V C}@(:N@*nF !5s8aMJlo  ̮@yhuBB8I)N"Ђ Qਰ@2{`1CiŬ6_#e+1-L2}PT謇 pXNC4x_3X\D8(?^.Jsm䫹o\@0 fν{[Fȴߖt8wW‹_Gud2;KP=3_ޏM489B/X4RY%~ugQrb.PA~Ⱥ}v]f ׿ iQ e~Z›޳Y~fƦqQ 8{WK1G2pIɁ%;*o;\/cpE>|t!ՄcrgzČBc$F+g9Ǎ"J|.<@`%RxZFds2a$84!6zoNNtyKGF d&3h};MZ7o`i<:K8m,-2CC;[8: 4>sS$~fz} 4Jπ̍ UA4:D̈́xgqd^jJ>[&8KϕuN`AU:\yV.!&?%[¯ 4,Ү ܰpm|i֨XctkW|š>ľXR<,ͳk^ks/Ǹ]=`_ys&۶nmN{z)c4MwĄqtKQ9lju͛1Fa!n4ErUR>:)0W&"ƹͱ.bO{A)MVB,r|C=VGm]Me$.# mTK YL yXPWԏ@rT%ܨ2hrwqGPGB\9dr6%=_dXG.?S AI븓f0d? s2IqZIzYweOT*kB0Vtuvm\?O5-p7E/{>>LZǩ\ FְFRfwZ4Ȩ_YN^ cGЦ[̠K78K.JZHN{^Gx!Հ34!ο,8N`ZƩhBM.XGuSSe/C7N "ڧ=e?(gȆ1&s]%B'sF4:@T+r[~hG7ȝ_zyA6^Іkih$&a<ŷ &, :(qREpQYtܣGd&s o ħ2!BO 4:ш!`a:ۈ&JҜ% #iܣhN^" #!Iv;7 ǐC;Gt+xꓮ rVv3 SXDW6qe5nV':o*X BL=Oůb]J \G8Qc|]s#93pF]ά3XdE5" SRؤs;Wعc#d&RkJO4Z3T*5v8՛ش;z7q{+ʟOz|B.9s޶@)xU/dtpG9:{iɥ?w5$ z*]:aqx+`fynS) wsNpï;2'?8Ic~SQ`9$\zu7%h?iY:XPXR=/\ cUy?Lr]qƈ8cKXZr ˴_6PݳUK+uD^qC ^>NL M-c܇{!Z1\KиS#s!OE5~ZPz`ea|; s-B8]LNyf"afx^ܢ#Prhn .7SK數}a/Lta1tW_{ W_;U/|￁W 3X&3 b=ʴLdYW }o|lj];uvҥZy>I:dh:#CXB רlkw8TYϤ3@'ɖzL)NԪK{ĽF 6loI1G%\޸hW~;F"c4omynjZmS J-'2" 36iԳʘ:4:>yL$VdH@gHQ?Zag X!C=|Jdi4/ҊoPUiPG֨@Y6ٰI5QWY}B"SV2)yO"}0I谂^(e $qź} IDAT̝K^¡󲋐3}<_eSQ~+RB~"V3W@!Vaƺ|^ 4'ahvy i/ٹ*'&=6`ea,X|,}"}({s7QqŹ]Ŷ+/ApήsV/B|x޹!#Ydm&IKnO S&4g9:A%:0N3z%dV匠8#i xLR:fiSc Y`bm:RIcaF~)\)3tHjە2$}cdf=Mֆ4[R]2stёjK}Gy\"w/'<xeT Qyƫ/8!&)KuTLMN/:h]G.htP&I,R2T"Ilf=YPQy  JD%A2@?Gjӓr咏)dRnUshm)J;qRghTgKr͂dY˧_ؖAlڣkTYQ_jmii@ءumagi&s h(ZY̗?{~+bCT5#GT\z&>?ŋ{ON|w ίqs !3fgml?W;2+ @3/q.OWisޣx֋8[S osӇpr8vdb:m[ujƦm%Xo_fM\L?;F6ϱsǁ7}DC4zGAŴ L:d92ɹ{Y$BkoV#P\i<I4@` ^l=3g5;,j[7@i 8Uaeٺg&^ ~b-N4ůἣ<йl=sМb+c`"7b D06nDsM80mEnij֗ԃߞ,j$e?A?Ǫ|AF|၀G#}-ߌ&iYXL+(apѮ esSI+{!-i il;²lR,,,066'=q V?epp b4 j$i!Ӣ6N{pa[gtS{$c{Uv^Pgys汉6XHåfߡy7mj hQU?'+ Uvش?]Z~ im2!dd,B)# `i9+'&t=<0%?G}+񱏽pjnNLE\/Zр:rTkі8/ƖIAҕ#sɼfX^pt*rbSKGWöcP)U8>N Gr^"4yrj IgH:q✕ vG۴f-\UbtV9Uԗx8}FO|y7c}@M37cI2ް BpRaC[^55Q5D!exؤC,Pie̬pg ^c` DHkbOH*qO2&s9%t+g~*%mf,2Cen,4Ye6N1iX8ĵn=SQ*%#pάDW1wCv2FkRS.e^V|jpX`1cd!'>x]۠7敼.B258c=1sI;EB3 7p2t P 2h2Ap#I8].O\fif*8o#H6Bv}b!_2}@ 4_~M<FuZ[|_aؓ`NN\ʽ.\2Р5RJPɓT[W>m[&7~u͈4Edu$[CJjM8V˩X+K$1)a|21Cgw9^X86gWE ša>g^KXu̦]N]঎fPkhxc8n #P1}hk,qlri0Z}‹ʄV :z=CJT#N.n_Z 5Mu"Ci )2,RD%s>ˋ rTjt 'D))UiNAYyRB sOHBTs'MX$)|%V8XQ9&}(7@k*iPF|m,SH @d='4 Er]$:dd'4[6xAiA Nklb4!AC>CN "k#gA +~G7N9=P kt imA#ɐ 1=KIl%sAZ׎LHep!KlM|#ۇ6]*aRC3>#;0 Nmrrd9pW2}Y1^uԛ}/eeaH&d 2Lq1eg^4]P`:PR^`q5MK' ſU :!lvS ByHA7(jmgX և,Øӈi^\piBނHeAt3.QFvHhYA]C&󏡐a*EK rOm7g?̳Cr阽tYͨ/.efZ+NuyS„;I7Bw]Wuڹ.M[QBF>B),6QOŞ:I#'[HA EDyvqEGo5N!N7f/hw'ٰqHauͿMqb_2ٗ$k%0tx;C9HQєdoPBYN92K?Uߚev!9m {r?3( FKyU2U"DNw]ŊˀuW]z"00/6@ RI3gd-Mdv@jd8 0ΝEjmQx:KX!Kز h/5عq3JdFtZm.0r!ʞ$":RYeyݲ:yV\dRx\tv۸̲8eR B)A  [' esxsOo'ėh6ev;ehq F_Ǣu7}cق4[&@ q,)rm;Kjif3:I? ,| o|^:AX/wNjB[oºu56C Ԃͤz'?{xoe|QAWL8b|2IS h,;Dg* CKB!Å#ãN )Hя B a1IYR`TncdZa3ݷϣ$\{69K7%w8|,NqZx^~9F(k<8)9}Đ% e4_bbt/gnTkXz>ӂt`cXp-u%]qt[S4"ke{@ 0d -(dZr-WJE=| ꊉʹws8-V&++0I.7 7-'=|Oy;x|C<ǁUf7_Euf+cj0h&oxWŵl#fNGNsa 7/N+hUZwB=" wC)%աat&s)83ˏop`P*B+vO=U0zSCcUxʌ)*=q5 kQkR(%{v z.6!R׮{ BPCH ! 3 z-3ӳbHzF]# X:ʏh,6i6$t +/'f $Zp`U8 v(<6nb_!}T7̧$(>!T4Rfx>(p,t4c1-Cc';,g q> Q0 ( 0J2VxH =C OGU#BU"@(MҾ[鞸e> Eel)!b^g*m=?i/հʣX*ێe3}|S,No#`#O֥JIzqK !+ 86߸'}8EOfyB_4ąq/He-^3iӌwC DSEN8jlP fWNՊŚ2 ()B+;epr~#7Y6.hXj1J ULkFU|?rθaq27vsF+^$I0ʑhД$:ͭ\C -_85PZ l߶F l8Sܾf3F LpuҚbTu#;}yXhL%,e=ͱ(Ne'?% 9x9Օ f> pB 5A9'=3D+;9+&:QU-yX`-^Aln`[-MY@'Vl6ͩJ*38(HIfnaӹDLI$b'RT,gk%GG uc  z 9| .ӴMlcF&1#gq.RyIvZCDFStٰfA"$$>m-Sel]0ГaSSSE ߞ.߆<麋*Ss O\^fʹguW>2 .&,/9XZj08$r )>B)/Eseh5D{to}M|#o-oEzHhI!a |f>~2{{?]d5;+gPν@Ib 5A\8c2f'c^-$:YONxtՐJ~z[}{IVR;H,d6g8` %qy /OfN:kئ:} ]>ʎe7 r{<}Cjk=z\Ûvzӥ\|Fزw7{I?*A8%)7,sx͑C0§#kƸsi;63|l %I\.<>uOTJ6104mLJViS]kc0֐ Pdւ6GQ2dYggtiO!p:æGZ&J:`Yn+o،HcC1d=KHl BD& T}ضĵ"unLc>#?Ŷ! #ifDvV:Dr-v32m0NՒ:Hq3s+Ync e'hMRQ%T!B_q L"W*s ׃ 6gÛѺn@E!iRM8]"kv}̗? ^L2\L,54TYO flɳn*q`?f27Zm9EUeK84q8?'vAm_{mGp!ws*qVk\楿[y6{ae<o8ww'9Ը PE#+|/&໖i,yEnyf_a7~9 :GZ+%2[_"MT@.OR^"w|7o`Uh܊\ i cx,8zxƏgpB{ڳ[3/9}N0r #YBx0i;̲UJsz~N笵{!tx~s[C s9_VW[8FbH sGHoe@V p8 +󼗗A&EA_r ÊX;n6;y[ *[gS_~GƿQݿ;zÇ?2&gN }|Os@J4DP0Ѩ|k%mOZt%_R)iAdV4А'TI-aRT&4e`Čn  . c'zؼ|qO=Y$N:0: par@H \>d1;Β^ )- ud0rQX?hg 3%=K2dtl@b〨x %Z';\w a pa<3}=S?`)W;7IƗ4s`sMVgy$(kMQ"K fBn6+1#4͐}uS?ET(okx[^ &AوOJyG1wgG߳=O?I^Zw iwIo}댡B(B`$GZ26]ed\DY_3XjA'a)˫,9Ŷq¥;/_2 |Owu'I$3<8{sFR IDATNmp<v^Q;C ﵉5@r2 2nͮ-hI 2ÎMqfKqέ>X]4o\q f)UPưq y{08tfYI"U]\7eu5'QվEF+`i$KMVlYktJ%3 I[g BJSPM.ū6]/`>lkW.s:Hc0jRb(qw8guNjشk87[ Ju:&5'{ o]wp7o]!)缰^H?~|3q;rmzO.PQԀFi%H*GnbtVV{V-ֲMW]֟x%V[L_cB3X:BxQȬ+UMXdbB D%|=eB!,Q:l ^snrq[OGJN6{w0X1,;V,ӳ5Vv6 QZ%ݵ JT}PSKo!S-$m}CXtճ1Fz)B%51EA-r(_WK0TwV[Q6U|&x UH;}VO!0mc5dpKR-7X[4/}6/kTu?6oi6Q$Σ)je?XiOBZvr=7l*;Of# («RtC s)QXb,$%LdtRAhw[],򀎋XlвJLHVEX䪂Kz@$H,I7'299|JEJQs'H?JC9ӳ5@ =Hc/Vy*YB5YgcJ(# ev ϤYɰB#d X_ *"/As,.5s9LZωd9\ _[K8?9 ?2.7z ycW_-Kj]>;,oy زuxGGǞӯOu!4!I@=m;GW/*'N:)<6 ϊB^B;HVdTj8/A}6@'}ΉWQ맘"aldT˩W`q}&G&UBe%ȨU.31V%P'ɻ-Ny_9vp.yк FcXEBഄ^%M|vxX J+.w:Hm&"?]e[ؙO2-%XwD?$K6 lG8>*;4FZ'O.sc5I:  ?t9ӥQ9Kp@ %֋9۾GD}gx+a=V=a14jx㋟\—|o}Cͷn}߾/CuQCb& NI8%Y1^@,dLH*i i :ncs#ǩHK8!jAu\%/;~7|-g8\p<{w6 ^?+FŴM!# ٹZ8qzM@rTL<߿@T i-7wQΜCE!2-c] gr/$ ytHaљÓ>NC c tt8'[AY,dRv!`o زGۜ΀c%WşTSjЦm,uHVϾky[O_%WO pO()U,_|/_5oozӛQ{W:wWd Rm0:X 4%Xaie;ˣosM|='O^>QFy‰ !RRLꗇ˯Xz+,.:~xvQ.E61ڠZbrzJO:/Mfh UR ){aۘo|/uWqޮQu)rcY[Zy/4\oig~8[n.ksxxD% +#];{?ik(#_:Q(Σ[C6Rgr'u4Ȇ4WUq@M`qֲrȏ8pC(掵щis}&& ]uչg ߮R-KYAId%+Tdd,˩HAk~EcA\K#rzk9A* @>nA^Z0j!R(f O>O-iVq*n"S\q2B!p#vGgelQqڡdy^x2Ζ[8~f~}yZ&A uѩqSlޢ\3X8!KRj IbCONwX,I+^rCR |^Nt{g=JO42fJcN811>ƹN,Y8Ŕ=ym,4vG$J e45Vٴ{ ,lb/,=]J bgG(=};Wgp%w >_zz q,ifq/p&CDuΜnޯI(Uy[_ɶWD`AXr /w\A[fJ}&+ a|L8V:Düp[@F{wqITK>@DZ b&KuL2 5i+KAckaP ict# cF-AJ# g5/;2Pt+W5:=-+~vERI=D=ft7$.(rmY\119F]R.8 K5 OX^~1 ~0PDU|6_tY.B3',;-_ `h΂o3q^p/w| ?>_fznL>Fs47FGHb5YhTF8\cwrZPm 8w49ø5иJ{񯽎쾚ocD k^'UL]Qcmyۿͻ<. d`&̍sm,6~Oal|fyMc%mA+fm,FHl]59<:4%_*G:}B?A!XRIràcɠsnq_H\1:>Ku$q~Xa%;)[387hw?X2,z/=KrKJIJ$DHYTbu3Fv,lAXAKF@!3bs_"X6 l}x^c8 'O Mo=NZ OU{>ۏSchCc>UNtXR Ée;CS\>:&s^Ď^Gy^S(~+GQznڃp4%\e{;?~Adkg,&Ev]BŏBn7x⛷F5VŐ sׁpxmϹ x.!lh(va!@yg'[^Ȳ&b*^}Պ7TZ [:SL A|A)V>N}= .dN[=G/&($x12``ɰďMӜZ]`cwsj>9 ^c㻮<{;{\w֚$8xl봙pcuteUbrR S^ĥY |]Y>[*SQtPE4_5vY-q#/5nTa-ߚԠ㬠7x+ R?q-;D*VC(?mFm'AVq9#|:`8!^(J -|eo&o]*Jef*9z'IH 3sfN>3x˧z~g#0B4('9j>4OGL*d?Ve8'cap /M%8t.R&T D+ "$gl4yKLݣN0,4si}ʀk+f8 L2JDATG"l!S.1KdR>AZsjFF"^z&ɘf1)+dnIQpdWT{`L9HHʤP*%q?[A K?x BHFAQ= 'KNP =p*Z<'Ѓ96\ann,N9 gtA',Vyk+.//] 'jۿGq9i# L5v4z<qy;<A*$H΃QٷҖmgZ {;ޭ_ J;wy|TL(*aor̠e`A8 ʬj|e̱t3˟=Bcl^U#Μ]!Ghͥsڶ#X8|;èAaYS@9Ey"Ic~pFP(O̐B T0w\y.nQN/efJo+GNryn(7CIiwjuAc]48KPTH~A U OMXc*A`aTwń =\f2[ı!G%I Pr(`;N7KEscPxٱxJa 82:+ (49R *OǺ9C:̌6Xh鋐7t֖(Hپg_NF &G+ǴejʺrP1.mC5Te Ӈ]Ql)3Srk7o%Y;n?*(!3,F %HP,06g4Gz74k5=>ǹ慒M[V*Z=cv?߷Ƚ_ӈF畔J(+$Azn.9p C c9+Hv J""x_`L7w@pàslQ#@)4bU1EV  IDAT5LVFyA ?fqN <:Ar1W[T=B\ BVX&zQ$}sy^^bHa#8H?!U΁d|GX%쭒szqN,QGe˴:A]P󣳍vǟ>s'jw$Kپe!{i?x.8#yL(ȏHҌ$ H>F;ldJٳok[>sc8o~ïhIزǦp˦=26s7_!v>S<|o R/5|Co =#J!*g[\}|ؓ8 AY&?VLy@P0Ttcv/)"II]D9%]^J\!H b6o+mUbâY ޏ:!DJ YE9K(A)<%=,RQJi5Y ʾ W@8qlj5uDFg4[wX1q()EGӢ|AjJiJ ژ#E!): )rNT-O*)1]\QRU[vGrN˙(RZ=TxͣKf9.]mN>S9RJ#IV(̓9L=wr; k5:ݘ[o9qeU9gPxC!m7pSirQۮsW/0 f/شy+bu6_mx tgOLd!wB[.u;*ĕ/\a?sދ{,[0?~gPD{>|!2_ʳ Ȇ042 *tG&F0Q9ĠWHO<4Gog\C>09}uaxx6 EmN"\\ #9xKo\yj7C/M Y;?Ya7o=T|'*ءZg2]$>c{/gtF?7xD)KTť ENz>K+_ @m1-=oz!YKi1 *& +: `*i .Ģ80[x^_rhs{6[.09’dr[ k2Dj0%qI]]4պGҪ U&I4=ѦMS#8ºG:atNaRygXEL!=ӐDg|+Z |=鬦 4yR,ff6ZG9!z4;s>AB*=bo@RjPJORTkA&6)P*{ش/`#`%=jMuDOHQ3oy㇛ȆU~,iS)Edy:~ m{NbwJ-B*1qw 1E f'')Qw0ysgrrgA͕E^r/-טR)3a@11^bmm 05UBc2g\k$€?>jgdvOSR>þ׿CGN#g .s͝|n}hYs]`Au`[An9a}.&dlkUJ9$JDS$qJa-V}Dէcˌ*a3ҝCl!#*zQo}{ UÈr|_ۧK^*.tJVG?ħR[xїB>#EșZ Np]AeO0hg]K_HF .Vc[4GD=Idm?=/Gɢo5 0R G6 a dDN1sMEP |z%B8rst {,i3Sq.WRJ;J$̈́*V֤'#ҞCSdrmRadPs>W=78ޝ1S ק^aդTf}fVvr]?[y|Sg{9nd#>,,,<Ϝo;?uד+w7\e%ﵩ4^]f%#ҴJ11R"%KfFt{vm5m?^j#룈4ƒ:= ަYtwy,|F*S*<5}]Q!X3'ĩYv^c>3XF^믁m~ϞgWN{=nz3iPQit}F!)RTd,V .w8ٯpǭ'G8#I3G||)hr)eQ1yNcc1vN<[1C[lb#,muzGic<$r%$x>/}˹JTv8JXL~Av)N_gb|!C@>Ap?:y_QK3xa~5V`MXmp"N4qUcM XtI2M,@4gr[HHLa" 2 /zu_ d6Th29֠s ).b=gH#CF@{Ow25h53†92-Ðhg ck. e>e`hNEGʬ: +H4AGRO !SU"*~ yKe̅|ncL`/xI+AJNc38)גKWHˢZmQ*T* p݈$ R1ͱ-(bTZ0 "q=jh;M66c~:b|KCͳ:Vj+\pUW6'~T`d-^E+V~`/q-'s3uA:"m gj qIV Z$&6aj,a;;k"ְw#IJB,gcѝ*"YˈAY4!fi6'ےWL}ui l[ĕHj1XBCw JH`RHXTl='yP0tK{+.i6f YVI0}h$Fplu)|fin2SֲF4#5tBNC^ #VX\PtF Tm,OR2~QzƸwqoXc,nA;\6P,Y,-r\%B m6(\Ϟ`|} A(MH~s>w#\c܅cUc28ȸ6p5=,({2hD; *'6C>o'v'ޓp($C# to NLwDMɔ-v<{-tlIPf$}:Oe>á= 9AJF:y-9|9b.)oO//|!cL'l 晚oRW!wU9)hޖ1.}54ʃL8>'+k8.+̀"i cH]I{CyANBjGWX3I#'hl!" P=mZ*k,8:_s(vS4$qBs&4bQ_I(.q(ϛ'`'Hmo)5Ql|vKgFوq)Rdiet,2Y'5!nݣ1G$62=!E[Y$&;L—?^GDhegoBJ9U;_ˡC1dνx;K|峟k7'oyis vOv-?>w+Y:qJf,iC;R&m#\!mjSضК9Ρ}5)u'2 bc, &>+>?F;*a Ψ NW2>A"[v3j _;0LEȌk*\) NRS( (Sz:1OB08vfOOFVXR ;n6^rC5BB)R:!Ѧ (3HI;K2JH""\tscSr0ԇU(cZ!zv}';+^Lԉd}ZA!$&bJRpm<&OS5㌬]QO8FbDHB 'EJ34c.2tyuF/% e 25bcQ-IT4NmEψ@I]q,F&E I=1,z'ra3-إSg nS!\H|dA6X$Hc"F E@YȰ @E iX4N&H8Ʀ27tˇ3yú0bKlK/<\቎룰<.L/X3V[cO-lTb49c~J`PJMqF-:7&&>\bU9Lby.N>+u2F DSdဉ! "EXF%nV2U,A%V+/B~ۻ}zۏٽTaꦓL=wr%UV R,x$I\kO'i|Ђ:P,wjt{au.x0D :ݦ2h]Ě"-BhEQ8mrld::s+lH4n diV] gx^ih`-9w.@sزs3͕9Ɔ9t1n{$s8Ub!,]/.cmtTڏZxKcdvBKu#5wݟ?w>B6P(H4v|:_N#@HNQ1~en>fZOp~nm  I67S2Hc4a0g?rVMM<7dª, ǏٸCSM"e<չ*zKz6P5$+ 4;M취 cOH.zV AK2qp=;7={5'9kχ_z^RXc#MfFZSMT͒B qO[gee-:DWƸ2oi?I;-?h,Kđ’R*O7NIAb.af]lNE"IXXb[ 㳴gmZo9Aҿ3L HBg\Lb{G(! 5±Q+xG5q>Q80XqlYAfS;w׿"o^ H(M@I7у.DE>SKiCӠhPn1y#;H\'i-g#mߊ2Q0@Dt@TrP@D[W |6y*>Q2]D9^1nZ{z5$A/Gdì^3bv ֬FlfZÎYٽ='Wn JfYSTL&㓄6Uzؿ &CY'<~nyo#}v eUK/L4v w}˼3|V`t/k/} YpO.⛵4 V ,w0+s ^uln"4'0W^o}> .^7̅{%5놫9GP}Iۃ_zU7Xbt8%~5"-#uq0ճˉmEJߛ #a+Sei4ŒYlmG\@SV.c=oxqGcb,K;{bɽ[y*dk,QAi&j&BP*8hmAgfRd˂9Cϐ"p\:̈́|Fj!IT[ae| vI)Ʋ<|iH*8 qEs ]vPAg~Zuo!0B',ū=>ZXeλ$G KՈ{Ksi-5Uv:cĘLJQayq z{{4ꔆפmXZXoVw~Gx8e#OcÌMsft*]Jyfg,B I4Zk< N@}~eJ-fʤy.·1^V-޳Xn䊌]XDq'R(jwBQh$5oy⡟|?trǩ]Mπw<"ZSKyr8@ Hz gY^_]*GߗJE}J,aS*T"2rk,,$Q:6}m`cqtpANev@FZ%XIgŇFZ 0mITbY؞OЈ"&qԄZ0lCc>X;$-Iq';> %H0D" IJ-[` # jff8$>sӿTmo\XYnDaa,#}̠u`e1 ru.BrzG_8I'a[DŪOgAJ Qlþ^k<,v8ѢקB080=?϶װjMGVXm ~T;ef{tNL8pdq/ɀe~CuV(J&Z'ǖ$"NVضMLsu Q ן!p.6LUۑkffZ>9J6nQ_y&!)BkKuzjh-pkl#30v$BQEY$ c^:~Vq6MRu\u8(S61i_&$R<ʇ.hM`g$mc @^_j# Q͚V *2<=%6}7fgfJ?ea~C@!T+ aRŞ_W:eX%L͇Xa@4ǎ<#8$Pqd@phχ V2h9mPzQĥ\r~ص>E0#d指7xR1_k= z{ :`03Uհ8ztlA^dJ'k щKeY  >4N2sYڵ E `vß.s{[mxRbEߦ(gm #),o9{{x [z{7LLrvLth$j?kW0!pCG$27zoř :ͯx17>Zn~ |p?{nd;8G4]ywwϽ4-/ 86Wq^.}<̎7ip^~~9y039"B[LGBKR*PSEXPt-JSt3:Rɡ34:5Ɉ|1OXKh5Ä$<ZJ,cZ`,VsB:S+4fYh~rLXTf&#JB0Dd|lCuWE{QbI3 ڭ ;WU*c9<}y$Y^z9jlKd nl΂ġg/q2}"i|V$[:oJwlv*'#  &ƒ'n/bIAf\ؖGNX UIpQ;& lla[Je*G넱lmsK'ܳՇ:"rssv^CTZa#l)27s Q6i,!',\{ ,..[wFƇy[F2: ]ɃʅWDb} XcX)0y,G&dIn7|c/aepU/?䢝y3OCĺ%)uo]ߺEl97K+:@ixXEtC 4i%ë 9X?8A[yX _/k7-1GHeSt%st}Br͖mݓ=a}Ջy+9^N-Pۢ=#D*{[vvdN~mDJ qך^!޻;ZfIdqbwܼOȁG"H2eHEc_c^Fɳ bAExqw|t63VJԇyCi.p镛8rlrc\ledU)%cbxu&lݾR&;4fMZv'$y9qhHGg\uF6e5W0e3Q$ UFG r%kvC= pʳg+kRoM/'e5u# avj3þ#6+dS{aCu>zKI3ݰcs/\py5b^86ʚ `$21ztF&' F~0%}+ċU^&d8y$j1q:1S' ]t3 kװQzXӛ+p" aac,u0Z"K b˟áޣVzږXHdsB⻂ڒwlZU%ᱪgUĖ!`ߑ \y.bv{cH+»޿Qj)&HJ(h!e:瘭6,# hs`ַ{[ˑeM"QqG\z YlS S$?ey[rOJEYщzk3'hlq45"VMC(Fr%$AEO EdK(I%nWS) I=D88 vD;Nq˴V"zz:ӏѮe(5gb# "<ڎ}ohǞ_|^v0k7줽fU;6s|Bkyѡý;rqb16F~W*9AϢR $*TD+zvL(80&(fCO~lZf Yy.fOcIG|`r9T;$Q- iOTթH4 S(<) BUo&<wkw-"}=M\Wc`{eh7; I}2Ia #Zv( MRjd\RYid4n/q6 !-$YZZ`txYzG@q`Ʌ B&ݽfcyG=oUWl2k{Z͠ɉGt^$чֲjsM'y?Qv^>K)k] _fmpqxR ֜VJ0&eָ\Rʗ`q*eZ+i; |$5D&<%SX~ś^˥^*_GɅ6Ͻ\n[lԥo0'gUXOO/~]/k7dr6քJ Fz(SUzxgǨOm.zjl8|cH̱B0R|ϨAhn'kXo?w`K~)[ٰtDgq;7lj9$]f"F`KvMb]os&ȼ9>gw">"nXQHXC(alMscEKU׆zB̯h:ha(d{}!w=.)IߩQ2KyS*$O 4Ʉ#sdvJZINO?ΟjIڬPdnv52_ՃSl:_ģ| qRLhm)HfvqP!x [!r#[(`|*Agj W_·ߨX[ߋmI&!Rlb2ug+sl+%clb?~ ڋUeA@H܋3<& Jt#EQwY8ޠdz083.s8g,2W79Iw DPRTY'7|ao]>! Tm9jKmkJWZ I☌+tS42y FDЮkgO7I*N}c#=_lI,L!u~.O<:?\ň'.͖CCˡ:2qʔP >en~B򵟴dO{ިJc?ROl<`#}מ[oo~?|]o6=re(b6fr_sUlKE89ȻG$"v8 N.:Qh'qGq`j܋zvy8^$n$YjxTpDDQgg;[ޒXV @f IDAT?>HcѳY`I敼}療o9Q{EU$.B4[F\XX`Br#P{ȎbeW,#:1}a0v 8ʁsq[>SAG 2䶌ϧx8A&DiQ]YılܸG17ȏ Gx6q+gja,fX%G \a? ^vSPob ɭ?eHI򭤦 ru[Y5Gwx.O!}4f4<1^v9%xs1c3y߻Xa iV y6y_~hĴ77R DAA?1Dg˞W" X \ߧ0X,W P20C Xv0=wbApjէ4(aN~ڵ{j?^KEש#e HQIOxDh%Rl8Kef/}$oZ\ldXU{af$L),N5[(FvȮ{Յ9%}H;SA6\~?=ʸ#Ply \woGYH֠.1{2w`BzFDW\eoqyy?x[$:5g STWNSdMX!VyKTjn$5i5B'#$hDS/DL}:g990 ӌg,S\)*jm yͧ~@]N,(L*99]4\X*ӬYJ LQ,RYP*]!XEX|( >>u/q:TakW]崫lY߁l#T ͙ئ4xS=58PӁ"q]6^ YT}+r PHZQ-dU  }4:Q}eeui>o* L"%[-ʲ-vaqOqjV;%dK@ɲ(DR$D.P9N>{Ϗs$ǽVխ*Խ콿{* Iw fsP"nd!V>[sl'{X=sa [dUe0v9j*C8 = QLKhSa;dHMvoXtΉ-TS*e.l񑫶q|Fi6"F t;ll4 l'iԛ+Aƅ.z!$yšDu2"NOn-,Dy+k!۱t$}C%A ܍L~%Re~7v;?<2(`f}Zם*b-Y6l^^d=?3/` Jf 0 F<_!p*:`nŭuN/\b96W+4.>[ e 6.w]8MIDynkHScHE$2!NbT' *i-4DAȵ[Aj='V&[M@<+qFꘚTa:s^Dv++D(=tĴkauP 񳟘p8j! \b%y\^fxl^޲^t({`NF˙Lz2R#7d"Y}Zȧnᅪn=?S.r0Ӹ!6`|1ؖIH#eкLӽ [|ZoO!4NMMoL]Ib֪AON(n] DK"¹-`x>Ft6[]g3hZHůh:BKضgzNm;xTۨ5yk#um'kYWmTLyr1M Zߤ8qMqPcM|D1 =7"GxBcB- a3WAk;v;xq IT8t4go/r/㒨Et\&I~()&?\ZTb C;W k/E-m6?ofjBv$BKjٿzɫ<bRfL\;Zb87ȇ 'VS F%IV3ЅLW8ˍitLV b6o/P mٓUnH8wD*p5osS7G,/$vJd&ooK{<TMxI?,qRB"<֗V9sTgJM?Qwr,(c2JR>⣼4Y(V- E M z{D%?p5y OqϚ-At UoV(b~Ã&?"1I/+V,sg~+%&k_0n֢ j>a}EomA$Ɏ!Nv_)41N [kβ1o!72F۠vIi/Fj f-N4ƕ&6[H܊S*#jB؂LdA.UɗlaXԻV(cjpzAc Roɷ;}`9GhmXY\ch4ixU?Hf#ae%%CO Vec5RI4LG0bl6HIn0w:Cgeh2Ri6ʀVJh x$"A)Fm,\f#2\C+LV1כB !i\5xf@Y"ҥ z/H""_%v g@d I<; q t}<[oWvJc,-5huY\`bbq 1;Ɂkn%\,!6yC LDK7ƫ?.h_w6:f@`FX^zf*-i&!~O*:qDQ޿f'ms/2qn{)<@ـiCR !ХF4]GZw/.sk3>!jܔc7sīnOszn;~U450̹3g3f;q4aN[4[A%b,G ٬A [nH$ȐڥKsf3t>٬M 0L4ӠP, d7(ej.*&^=꼺DV̎}y4CQrL~~7/qd ]7;4:|$u1V|;-]?eoN^]>WݔC 8uI_ &erGv! 6 %CW@1AZ{ }t4LM 7NP!*JVwRh&[b~VN7!L0O"Gj3<&5n͜_myrCghnףФ{؎KWa8KH!b$Mgm#D6QVuͼ 8Wd'R˱庞ś%*-֓^:ZH^2>H@*^7@z_S` r_]G >Nad! fR ў 6Lm=/zڅ {PEE,SyjmR r>tbH ТמP6O? @ ta&r/]bs 8I77 Ϋ8ro|igl !~i'^>OXXs|*"7Yu4(8q=e^yeX",V™uM8Ki0Gu@]?&nB*3i|bEb|G?+G7 K1Q0i])hDFh bbcLa$섔&t(ce* 5#}$F$$a{Fh'J&X6T:tM $RF٬X]'5ssyTIEϡ.u/gdOicBvH ZL XLȍNH4[ÔIS]I.lA8D&Qz w'KCɔf?%kuy $Nw_2ˑƗ[&C趑JCØN#/2zuL S_"_3{00n/i&J,;4Mvp 8w;e9 "S۶ax1Ϝ0, 6Љ 6BO . rJWlg={8[ln5d%_]-Gx/*au{YP >U%7x nzUok DWIhnqv,-$ǎ?q%s/𕇿Kçǩgф$#aN-#MTMxh>4ʝ7#,Փ'e._/˗Zġk񴈿&OԸ'00J>󭿬b1W{)),W4œMe%ķO#t-wƷ{nC#"&wf} | =bQG W_{,: UgMvovp8~̈Hh2"u%<+]Ʒ 3An1t +.՘+^QI탬0P+ 4mj AO^#Q, }K4tW\Z0|Cz@rh#{K-Ft2ػHu-nŹ6|A*Qt=It3^R Dl1hk;Fbh2O s!M4-ӋW{帗w~>|SW2["C38t\ՄťuyW|3kYIL&KijW5˷O'Zkp[OpncacdVVIzqMӹ;Y>%*N.^0JT)0!td/$Ldo>F@~D3C犫=r;˫d0I,qR 7L2+ NCN ;<؆MҪm !l$Gf8\w cϣ:k4tr](_A:;n+w¦9TכinQk 5&/\ΰG $ mOGL b,ۢӌܟsC.oŨDYdljgKcs\| ?qeyj:/ ԹآFC0ʄOfP] $qbV05kBc AdsY.8ۊEPX_12CvČseVN8!l7q=kael&J݈(rׇ{VPq?8KS NY+_ sF,r>_|w~|'hȈ[rcD.vAt B'p>Ω6N@84>Lk%;IR.8$f~BH4%5!c_ *ihdCAKTNu-!vݷJ^ 0~PwxcJKC [g P<0(Զܲjrg|ZYpnbN`o`iy//*hW*Ȍ@y Naj "IgptgR` (O.= n *3[{V(`Lnc?wJ[( ~X_*|qc*k/ t/.TX]w%|2rY|wcUb]]8.qX[ȁ[1e[+`g zE*<#7x$~xG3go d|6^B[*RClj`363WḺsn~ت5bO0wf2m^x]ݷ^n=A`})d}ėt֚;:͎Θ$C!ͲXex@"PPRl9^~TJ Pa:V=W!* QJvQz MD xg3ˇ;/p=}~ i6\ 0GD0- r IDAT8Y̝- ܉m>q$( ٬lPGjm} ?G&Ù$*i1;injKv-N}!)޳.<>k.7n:Иu0&I|N/'\8Zc蚏?l9n,NZ _ZBuz"#pIM@u$4:|_jLu0=739ca#t1^B}vUW]MGn Qr} t2&*QoLMf2mhJn6ČS-N\{0ss5 % K;4 `[:k4$d nHoDi`;bh7ZGifaBG]mLsð]6j-FZxk8+k{sc<^Uìm18,d9wIBBLx?!1OؘAcҥ`;HT ,==̐x//s3Gqx BM"xAc䝐_ԨN z?B̋M~"%Wٿ'v6B!x.i"L&20!lBaZ)C0M/ۊ.RE)u w ~[n (os;6ΟEhwWkVV#FCc6.xBm˧>~`l&;̭LҨUY>EsliRH&Av0_wd`eakƼU]=Hupn"(9ӏor\ȍ)U ~R ?p }VqIdBu#Wb Nwrj8Ghcr9jG#m 0vt$!LMq%XY ) <]O<6%-Cc d""b*ibe,Z34\ aV8L _g,i]ӐQaD^S2P$nI"pJĮ5 8B7CB?p" ЬaqJˊCAF"B !҂@C%>%_25qm2+1mRNbYZ;,FJ M\QϦ3S 6\ ib["^L71 JhB54 D"ҨnnD@Ʉ(^V޻L~{0՛o~H-XkJ d4DHZAOefA8 ſ{ga(Jy'Bt3h"d-FX:}`V)O($Cu7FGSW)$CHdX?P?Rsr";v$|o?9QyS4Ώw7s-'߬q nÀJ;2QH%W_`j:.|=!\O!ʛop/g+D䱿YnUCč$(Fft/hƹ&ԇnN9dpƮ}2=KXkaz3-3=aAU'/BÉ?ce{K/qDLF+kEC(MJCC,_E:q- B XB#0 3YN]: *ȣdIXlGfLL cϏF8^$vsQG&n ;A>(ZxJP&2e7o< PIlC^e'{&g0t )B44GU6 b?F޾r 1-@?t7l>y%ok?U/ N+˃,\clv_@"q@q`5 +!N0" I)67Dܡ 3lj8BAэ NiTCJD2:[N#nMJaV Nɏ{N{``*Ky`E^]l fbrL :2 K֫R!< oK%ddI! }d|3sh} Y<E\s%! Iu'N3CY0LA,b\WqD=YnL^ٌx8TVL?LvN,fgKwM %cj&C9{J琚diJ=Gn80h R{CX4(~\vSjtGyO})z]YB@Ӫ_J#ۀ=9w;Cv+n.#lyNS5f}}ıGarv~F" 6AWGoJ171Ԯ/>yz/{{kW$0$OLAΰ)r<?G9eګ:W^c`" ȱ8̿2{ɶkm bcsXPC's̝[m|]癳kt4R"t832ڟ [A;c~ɣZXt/&5:;w扣Lyi,f%l#Ij &4:E /1kԗ%<:v6GnLT *GEc'[L)á! !JN*Ĵ N T`9:$IJ3nnk(MIΉ" leYn=4Hmܢ(z`g죵 '4^?RLn]^9vcu}n,k]RGϷYsL2 5p=2Ehl .1hYxavtx>kK MN έ:wwΎW+-{Q:IU΅5?$ 4W!>ś_{?{ƽLw#^KsoVbaduċҽxi>v#Z.ڷ.4m0'_9`n7g߉_\XJʅo0y9 dGQV63c +6B<7`m}K$mڹM$L<[q EP²4dХOHb{Z5vlΝ|6X0 I'*M-OЯ sBPʌxi?: g[j8 MS(h`1c'8<D[K Ž~Yt :4*V}?v{\֪ W݊)LPg˫s|Xq)("^&8LLmı}@ B qdoa 3'y'w16=в4L06[|'N3q,aAܩ=v s*|ahWChi,i,MhU }vxLJx{{n 4ᱲ Zk(43`hf>%͎jv]`]rd͐c A:Cm< %D1B1rXls~9Fd!bf|L\&H:`!Hz2W% ?0 AHZ53CÊ%7ҽGONR(a& pP ϞP|m"%=$3\7]eVeyw6H )):I䈜P;CmȍJ;ҬF8!KrmhSmM4U3?wdIhGFFTDU'9{1K$mzj-D('76j 躂\6FMdYkm}zuB߲fY1N24}0@w|~aQ ![ ?h?ZC[UcNjc7q^qK R94dd[Rh{1=N1)-ט>I"oQtب~sO ܠY Nm0K] BxKW)]I5ʧqcX' C ؇(XlѦ$n[/61rx#5MTpHQ&{ ?t/}PD2$1n$ 2/ |c1IIJ~N&MUgAOgk|Xf@/Dpr 0c+^6npgϠ 2tVHbi8JnWٱg/үepK !; B 5j&塇1R1xB(:mPS(i9=ݑۖf߈Mrr=b5a0M|Cjj4m4*ԗ%ңLu[K9Ν'_BE` mw Z}tJu_%ϩ!1HG>zES 06:…*S8?ZW5j92ȱ_HnORu"7O\>}y6Fg15rI&x}7g)-rJLZCN@(biMpy4yO8yԻr 0w>x̹-oG4 {%u`3{KwH& t\MLzR%1lS䮇1k{OaI:\{0Q~nēL~H?ɡ)*n ^ecY-[7Z>R u,/1sI@fڻ)SR}Nq*m-BM:=+n4Ҡ&[Dc)hC,4rykH/&tFT\pWK`"AV=Iu(qjO y˜ZPnvE~%y3.X FMS#V([@ =I}5bA']BB! /~GT<-YǓ!!*1U(t ع J'j5,9Է#w6i+C;PhvJ OJh: qO)-\I IDAT:}e⢤05> #l2<ȶףIKtͱ[l4"Y1k.{&htBRـTƢv'St[-۶Tr8J!U )blu{)E*=cZEZlK'U~_35XEަPE7Q2+?DǽIDbu60mDʠi>v*Ԟ FOV 4[̞[di6ۛۏeFtqla˳eBQXc6R,u0,GXms!||N\ahJad{+"6oxLחX:Imgj^Bwe a|M=@zz8VGt${- !jSC5Iez3ê1ϵu^FfB"a2dAJ$k֛ Ӫ Ʃx7ʌZD3H7dr|;^^lDu ☽O4CKdJC }򵅘KU M4Zgzr Eq!AC)^0h6$mʪ>JXl޲Q]x6ƈMTu #i-T&MB7h ޹{V˩N.+nd6K>1%fweR[u N+T{eEN(m]ta^W ib_RtRmD@pF|4C#ì^j1 x^vAݬ4+56n%0lm.nX7%f[yh;j'"4Fim?|R:ߝCGyз!=bEfHKsl,r1YߗXv1~7<M47znnTtnkLȒLlV\t}_x'W:~n[Ҭ̞ xfJcek/P$V2Fܹ$\x+1oل4UҬ.@ߨ]7|K(.9&wC+[őd۞mqa46i,@dl:-$M C07+x:?8j*"equV6T-Q0 L4Fx&HQ%7سo3'o{sSG} B1h"TaXdKMJk.O+ [glhdӥZNRLfPhlL ir.}vf G1HcQqR19:ְL|*ō C֔TJ 6ReY_]'U* >s!hyf{P<h[ ج/{dIF5m2g*^ç%; x*@l\!䐂tN!7އ_k]ŀDBōBLMP&3 aAgi ]TFIt Հ8"J/-4GjO$4H̠*mD[}6IU#98t^\U\A1T50 QEDN 0`%ub*kqK",j9NDJ477*o\YT@7@[:X8l#i6__u;F r5MGx}1|S]Z046NTAuJ0mӷ{n<׮2=jyK}{cqM|5Iwad`~:Y^g]FjcVϾ_O>xށۧ*>zF 1XG,8`9ȫSaa\Z@ꠍck+jBfPH0"mfҭt}/ر>!>.T K-^\fd~8W *aҔ!o׮^dI3XCj5"BY枇!rmI$b&ƠxrO>Fvjs3<0?BVи\f|$K!09cw,3쿧ЋVEU446R_^XTA2b  FMUzHv'Br|6`WDZ6ǘMr] t|EacG4| s^Z_~}~vۏNU]kt8$Z!cADŽqeR\Ys}t6Ԩ/Q_  ALh 3?œk ޷Hu09}aCQ@ $?e}}t:Iȳ^葃T/~}s/4x<?/ ti; $~3t+JvWv ~XVk.t p%NPM gUTㆰk.J&#DJ?K'WX…dΉp=8|h?]Om~\ε^5uDEx{BEo?fBn@FR%Fb.@X xpl:= t"j t+1R`=R{|/qq:c4}I.X!L Z~EZ܈ipsI'Q A"z !"bG.$OC#1}<|BJ+Hwo[.~On2['V~FLfvH%脡iXEW7Ib#%Q#$rMI8.16>F1:>Ac&stfV^^bUAOd{ǘ9^9kahӮj}V_]Yl;g>Ycx][>n8=#Y;q+%?6T1w; %1~;jDh Dh]*IA~faH$Y.7Y v*|C|lfOcyZTuZED>MwB m##GCHRÔn.&QGFHCH}b ]n"0!Unc/w T!6Y.JN݈x\a4^yA1=td_0ђ&mlY7iocs-vE71یQupn-UϞ8towfŹW4sD02`h&g_c~@{!t҂o}* v6Y\Bp@ nA,lFRDjL2e~=Ye=EQ(ZyZ刅G ;\@?If7Hz~vtjHCa]%֖%AlPLά,I ͖936fqcM4̀=3Y|"Nvaf6OiA_΢gjvL=ҹ"Ik*ץ/kmtl8ة$Ã:ߋljˇ $M.C [!4#RgXA';o8$2iZt>PttKAU B/BN.;F+(BE1Q/O@ HA؍P4 Day?d_y`;.Y.GB&_AEH0400 F aE-DӨxR:QPq!>B |7&!{=Z+[B6OYގeuM?n/)&a<9ȵ \xW<)Ć$Qgd|J6(Mb@i6Ϝehbuٶs72pk 4/$C5x~W؅l jD.M29]};h5\~X䛯-sbrvIgs&mrkLSڸ⫝̸*/]24b2 aMn]}wnqmcnr;/1n^MCXr|dnb,d2, νeB * *1|7vsE/x@ B7L"`gI[z TP:Sy-'&@MBuR+B!ӓT="z/ pH5|* !kBvͨqa9AI= `2]E&1k2‹}}Q>( v ?DOk'*BV̞tY#Cxf)L8)Kb\n#Jq"H_s |/<[',hhaD1":7֙z`AqĚN,uuN6T*1=5ɵjk|£Y&!XWF"q=n)x~P"%hAHe|w*躆e(j*Hk6p,vRKvp K%*QjlAnW*T]qjW;tdsǽPD4pcD{UFu}F~>ӟd_\b0_-#cݸJ*UyEsL ,=ՉzPƄ Hi{}s5JJPVҐLg a)NQ,^Yu\Ss>PFD}UvZl[Hٕi'|O$g?1#dUTQEHАBA!Ϟ'AO!߀ƽUdkkF 5<<~x1V ֊uF'QkQLi\:q:v;VD3oBIZL$u6ҍU@'VS\i' KkkN *zβٯ"o~~~ﺇ'?!~c׶)*op1J,Ur#H" IJOmy8m]W  c:Wy:K>EW񯬁 vmd\æK. 4oۤMD߾hRaR]&t؝Iphm)EjRIh^]eդt[WH%H24t*+s4o*l56 o ^}m4C|;dzWLT^&ivOC<#1}+)W\^&?ΈGBPr$Wa-IBǞ[ɸ1"ҐR\&T8]t9pVX՘c`8mndwVǫ;\j)jD; :.3IB Eld2=AD*i`iF@G'FG U0}t㏎7,u$0@icuAcär5 R nk>%ÈXD*O}]lF >dH-n01lW!ihY9uu윢(QLq1BA}Jd#i\]B6G݉!~I3|]?aP"U A۴.^ :6t@N$I28#y702&QαPD&U0v`J{b;3-_Et#n/G*V'a[D u֗'!nںaY=٦^9uC2l;t3k$z-QU[]BQ#ZoEM7?tH?|rI{R̗ytm.>}=,c "!CHiUɤȤN>a@Ns Fa?de{NV |/[rme!#هhMd$\:A+i*)Ik4K9fOh5: rhY62 4JKWyϓ;zlf'{'e"zWU~rǛWc g[\^k33Ga~n$"OwN`uZHY Hu.`D:$n 8BQF>{,o!&O0Y <˹N?E.yC "P=\S(\op1V>fx0N#T_BQBVH$t7"+ĝ )4C zm~-޺ZGOGj6K$P­HR_}5 8tm-/?g;biϭVT< -pdoJ m .8{" HAoŻJDS*lBcoIT?2a`'M:UzNGSURXQi o:xLMq0Rx}CPqRXR] mCoe}Q4!zzYڃ D !:4Tb`X~vlg\bldnq}̎t\'\yTOG(+E&G5_F $F%_exC̷+7$5Aj)Ď|ZhDUn1]FEQ>QE(jL’ Z r׉*?Q${t U R߂ /-9ǿs>5̾LʳT0U&Ƨ99<̅+IZlZZ6{.(^k`}JOb<4#5T@v<8ĕ4]gd{' # _H,d8&{1DfH)64**D̿W~ ؊F،QBa>ć9<>oubc婗hWC4'"b-B1"PnUPi uV;Cի 0MA:* Qݹag#7q_G!c2y K ( e0qmLCsm ð٘q:O<B0֗s8IsP}gRA1+^ZJB#~ۏ#JF]_`"ŋ :@{}Nqb%09}OlrpN1**O&0qZ.n!5C)(c?Jlt`vC^<_u>`"ao"? QT8Jv ʟrX_]ƴ{ɵn%Gl+."2q,pcul 3^h:i QbQV(UX(1$nece2H NzjT7-F` R M]ξĮ/DЃ{ jF ̸Fm_%70HqcWY@!ÞM Ma$2:W@N2~$qNya1 - X:R^QNKb}"QuG'A`͌ TGSs}Tr.e9oӾA)"i 77 =T@lm҆fIЃ8dq֋W(:8b\>JmՀXՑ kE&F8zdƍYFt> |Q|N2t )F +Qn \7Ȼwrl&u+q:CͨD_^7BtB:^aǭû M5l[IP 's(|Dիx 0X3?7 6aE>^ZWMM&y{lߝҁo] T3$ӧCӷDO<8`yQG]ب40;@@<6+,`j[Xo9'5!ҩ.4+{4K}J`10 >kUR=ѷ=luL #5fd U*F;# )G1?j?BaxnL&Ϸ:cʥ2O7 0& uߵv\t<͌F983\c{cl_LI Da9W];u?TKoU]{οvok\\hQ>AǴkoz9g],.,Е\|E6~qw`̞>ͮgui5|uT(D&_(rSlܷk J9Sg N_Wyꐸ5`@a a4aY^\|0\0 \x.`n0$=89Ð(2%Z/kJ\{ F=y˭πCs:A+ĖH0m\e:u$M m TB -M#L+M8`_{ذw d!KjHmAў j!:qݽ9:hB Aج86co>blmoAs `y#|Eΰv O:D (젅EƜ^0j>!MyGHҤ=GxSX)9 ,iT_F\M a ;~LC0 kDAUs f#duFh3-&nϐ.|=_{7B_%_sGyO ډA=5qt` AJFL-!1B$DZdUdUJtw;1sHAIcץwp]]WGy Yba+Q6CC1vJjyIG`;޲ {ahfo>&\͋/R*"ĴR}'Ed -sy\AvvcqBqc9EVO5a"5%XLV||i)0Ef &زm/3//CT5t'$ԥ:q`&~'"1[O?|#)N 6:a IR Xx 8Dj<[If8Xp NU#I2 . 3<9L,Q2ϽeAn+m[:"YWTu:mƢ iL5ֈ|vMka :s>\y%zeBi~W'|{|?'*!?~F1'РD 0mo(C=~+bJȍ l'&Qd**Ez7ρ}{"Bq! Oo0;] +6k!o5f90iߵ}K CAw(gC¶qPER,ش!}D% bhea' /Tؼ1?m7c;~-w_ r==-aK6h:>Y<0-[J 2]Tg;#?8J$D74; 3Ta;6 L8I n) 2X,ȕ݌ZA>Ҁ8@$ k')B"10 h !^^;5%Fk >1зxe.<(1ve#O/YlbŽxt 7 z8j|Dd4Hg$sTjSع,-6ͱC`ښTTVa:.Zk7!zŤt:UH!~S1 ׭#8|nfqS0 'vh )~հ{@2{2צ7G5*/_ 04D(s⹈Yš Q`&e*KOv"v9ťK3d q>SQd c{{! sz)@!lQ拘dLnvrC&Rl! Ѩ \ Dl*ƸNţ:De O)r9X=D&2lm/hqdQ`zۮ HB8}{ Ǩ8a_A03S\Ǥ% [Yv"J<A-"SpHIPI LJ^Mi-)D\A2RLPOH]}~j_}Sls> b)rFyf2?`rwʦuy20/<cEb 6D8,Q piEZ>6iEcWo(`IBO˳ i<Zmb)dHS:6jJEhGo0I"6F[ڤO<,eݿny*]bc#|/o!6~Sȏ4.`f \?cYDe|v`̟9M "{MX$ 5:I7ba_ƧCKߦ,[kOǼ_kwr۸jmd"/{T- ?}O5M5n=MHSx&BAFt2%k'γ<7 w7> ^UV_Wdy=x ?[~Ɇ vȰ3w.b̡ &hlȅeo 6y{6dgNM6Jʲ1tO@i@kҙKKLlqQGCZ)JH ﮠꊻM8*Νɛ.}+}fL즜/hpk؀-j{pBD@ ޔr9f[u8jYDMز|9ar]nŵ sl!d6 i"HIr9﹑w_M#р8Xf[G}8jB_MM֨Vp$XDkb r;JU1O&J$3D@Fj%D!zYo[h"/4UX)d߆wk~f[euH`umNhJWƽɊnC~_ѻuzHA87fdm?1S~s[J~&Aڭ:JҔSk2aΰ갰ܠQIR)j&Rm(Phr2|lO>y4t|E')|l+% 4Z<l΢t4ۀnZԎ0}P,q~AZciZ3- : #Gٳ&VL͞A BsN2%OM1<6+9:翍^XCn(p_-W49XF](T;-:jXqQK-a2v* <Ȏ #YI\ۥ/tz|o ڥQm)f.GЉ"+ss|_t7Ss@F>-}ۍ<{mIdc׼}D&cb!R&*Qdr˘Ʋʝ6lf: 9֡)TB H1Dz>/fW RIOYqw}Qɸ4>i FAz:U 9$R8CΑ]UcpL^c)yS9ܲĝ] 'zfICpڧPf%DH( >oR[iŰ]¦bwO#f[H#Cuu ,/R-6\5QJB% 0ț+'^,iuQBe; Ed~Kt ѿ4JR#m39*g'_$$;&\C(M:<4Ud R9C3i ,ΦwqqhIP.tX>@&s"[2,k8)/?դl)MR)3?X!jgqkYiLYϒ21s􏭼22ٴ IDATxkQ90:XI4_x-5sǸq B3uV+Bj)Z=Uٽľ$v4S81I!^hJD&[&LBGck[Ay~~7AU4~c.Q166D Q>|Ō a w ?[Wuyk >k}MwS39qq E??`$ُW!_3̭W&d_E&\U)$.40WoQdq{}4>KkMGOo~2zy B'XqLt-|Qſ/2;̶1:9?(N7GAXvr_o<rV᱈=#m[ncf!,' /rc8B?':RHҴ6o x.R5G?fy0$yFI3$fD*5wһ*4LljD܏dٴe+M(K&c`0mB"۴0 *Mtg*  V vp6aSBQ-ș }+s w&v~3Vʙrn#v2BL~.vP+r4 Aj (rm HNg_:fk6S0Mt$QX44i)B$ B_qeTI]峟cc#q/s}8TI| q,C,|l87^EG|?ر!~ϑ$"a&hضDZ&ͺTv Rmd-!mT&j),:k`;&ZHШ$dm a\uRAFd ƹ/Ay =`껈=Bx;,.Ci&1R$Ԗڬ**˗:6:qQEﶭB"]֠8BәBmFEkHI~TѸ2i\G8Ap AІ2/<x͑0=D*:\/<}6 HBPF?g)YM |GBk$<4]{$K5g4HˢgdDYfeͥleF6oQ3d*+3Y:gޛFykjW/Mmfz_Om2#J\O݈32OB}N`;6R4(dۼ֭0OaH'exF6PY]e8V@K]fq3\~aUy;"Q5Yl1'ʫN"c}I3׷2J+ۄI`-2켡*MBĎ> `eҧYq26l#NZ]o6|Ro>YӶ3w_MY Z69'wۗ<\(u~Mc~&cg492ablvv(VıB5=JRI܏94j.aX&1:4N=RMYHj:WPB&CmqI]@yuC,og>gO#pE!jZ!hg Х}v)$"9:,O5IDL6OJD#aă_\Fwk^%oc9.4m ٍ|c'|<\&>}7i&&blc*K1΅"<|c+)>]ʶ-#?xS/ͳ\-qÿ=\;Gcyxu+dU>$?Cf트h$MZ&>+ uKMz 54_- `d)|ߤvOV9d>DRx72QAwxvﰸouXj3%]NčބT'HD]Iȩy(3HDNBR=$$BPh#\}(6"S!OQ}0Y~HqHCM$Q%c2"Z]fmA(NךDkiڄ+U:~\ I'yq!%~>HJԼ6ʖDQZ+^w'* Y9vCٳ6F\iaͫn,ծ,%oepxsS'TY#l8 ,ztv߅5܏J@b iY]S8=KT "揜n/X-|oN|LM3wHKwr+3 8RpfbM,^6;O'[H;Z62{GoX yOfH:Ǿb3Z#Wh,r3J_}']~w?,~tq}$e9БcXǦPG0OOR͐b,m>|d#Q-nVX) x/s'' wrcSl\By*ͥ\֡ -(HU7]%VS,"F KDK]KeImAoC(,vMFck [1L &ZHnT dLjKTq "S'ax.]OH HhR;2,VLխ!] n5HVy[,a(MH01BadCHs+ k[ N!]F2 Щ%"5pi,̟Y摖HAt"秨9E2bZ JЋT-H _Zy+3(m1G'z.eTٯ'RE/ U+@Ni^^aX~D{ lA&}c"y; pn&?';4Vltm lrp-L'ǩ]0d^mjr]uviB.-rc.$09U5>O|xSع"ds:ߏHvR.g!hW fglO^dbbM_`|| u3YN\W?QJmZ>秩u1pߨq(!0q(pLi ~'$Qr! ݕ_hUb&jQڜu2n̳_*7,ٞ#I#,ư!L)\)ϕw|JXTĥiHVj 65d,R!Y7K=pPULr:BLA/pn?p˄JzU18GkE08Xfv^:€$l}_٨I֎iW2$&a=EJhTbzMP ,beA'8h%@HSmIDaf;@t4/118qzߜ$ ,57!3RSr2Q_˚X( Kw%H8N"SAZH5(E8iw"1P°5zaBx'h1Ġ%4BheQ *Q~an?   WJ3xuRgY DOz;edM5˟N|։$exVI)ڤՀɣg7)!݉s&]9T62iQ삑R,YtAHL4ڬqeg]&% -W"MG[1Muo؂U\WV׏4a%B/R|/تoܶɓz+7]xZZOO yQ'#xK\|%&^{#wR|ThZzz|Dc{@4q\z;f``+uIZб@&9cHEB.ǯkdhaSKVNiis~Z U, mЬ7ɗJ䣈4i$X} Ye*l"33EXa7dZOsD㺐0Xhe"4[9$uU4ɈۼGfD5Jm &5oߩY6ɍ7I yJ!:Z=^֤@0Si\3-P icnғ/p#|?/މdwaLJ&:ҤR MP͈8D-hQ`[h6y]bnL3P.r~zTmGfH@Q0kIXe/rE>;B|xHoOc_s<]TZ$a!,(ry|+T.J^wZk J0M^ BjVrkኛ6rD9s9 n^k`Jk5V0m~dmdC1ˤGZEWQ4S:@cmU{90KrpL+Y[]c5<iʃ"A" [B,bN(FЉ`ox>_D .S[hU*g@FȌ[ݸ%BDJFo%њB"8w<`p{q;8y>pt?n7MpzM#Y/{odu}9w}kfu$DE")R[dJD9J*lJJ?\I*vIRNSX%(HA@>l`go9'_w?0}߽ۗKk X/A,\> k|i>a% 2)~^}i>~W\c^_{9x5+_[.Ea"iCOI,]zo2:,dUH>to(4 XMzX {H4=w߉&p +?+C-jx!z¼1)n(NjCD$I6ǂcmFUĄ{.x@8;+;Ԏ{^K8\i5nD$6Rm&/t۔~V8|}ax|koVo]bVźE e ךm>9aAy1Lw`Σz)N1]dR ܉µv Ryg}8ɐ!>{Zu:H sЗML'?u\A?O)qS?QƋ-CW+ĭoOȐazTfKb,xm#wR*qr/P V.PS!8rdG̶֫Ss΍p.F GMIH[ۣ 9T`~Ѓq?+/‡~oq9̾YrU"CiX7. >y4\zQ|E2i!T=ˁ(wFNP Lj~0~Jjk>gk-Ac$ilbP*2.! C AňeI |g#Of_GGySթNcla }P*C!e2D82u^= t;@M!#Kŕ(Si2K\+!58RbE٢XRNHVBlQFP%d>h+O )WD I!jpJF ]RHrF1bSPZ 4K>Ud%tki,J96-Wڈ1+ (mIq}~c˿"6H&?c_{1/wdCҖ6?sX®18#$j4q!YiyM!i7^Dkzɵ^ck6 h^"rknc]ĴxB|iX2?Z/.}uRpWY={#<0npO/r*Xk/.WH]E>}{9:'>5nv' ;I ( jzYǾG:e ?+N?BgN5Kw zk IL]LW;)O2gW<@p 8)]0/X[q ??9P ̼>^%]j]Foa{}?#y/fzi(IdB;$hȅW"ʇ) *,_oa謇4둤IVh aY2xG>z?p8D >o˯XڭN'tcOq8-7w_={fbf<~J8 $Kŷ._̯?O}f+Z1w IDATȱcGiLɓdQZJe>UEVW^B'k 5>Fez^0/_k1mnwK4>> o2v=GcZ;D_??Wm~/HKL`mSn-HG |U1XqBl;RHXç{_:)FfN?F=> w>zcwFWR TnEx:壇iҸ4.6YkpSW-D=pg9t1*F*5UN5Hc֢1PFB0%N1~=x _JoM%ܙ%)BXJzm,2g~/ }aQJͯ2"'Xw y\f(Y}x5zA[#Ģ2/^5(k5ׅ^ 羅$!iV1.P%^(I 4HiC]CaM iw ax|d} 8N7hҎROR ΁,u=EU7œXjn#^jt$xa>Y:F3>^CHc,Q_)I z c-iCA Ok"!m |DQlҟU}Km,= jW-^ : IDcHYk&KHԡzO/'#Ft p%SS)S;yt-g76iu+%$HI?꡻ ^b" It4V^~ z i!z?qᗰZ"܈}$\t2hw=νʵ}cG?A&iӜ}HIc$ԃq53ljwj4V{@5N=\x,t8t`O9p`FJ 4|RRFkOra rB rF.uD[1:R>Fy4WXPVdJe($& 5ͥ)sc5j2pX:{hE[@N E,ʣeQD$6T<;6 >q$NHͶk@c!c|Uw\Y \R$ ]*eIƠ3Cxiϭ#J @g0F@jQB'gJYݨ^V'QuzaIZmV6c,]!ӄeJA(JUf_?BRp؎blnp/{4:Bris9y?xɳpy~sq#w%)5s%iI1ؒ+8O}C0X 7">\Egy&Ia*KO?$Dx_NŹKGQTG%U>vg;9ݩOf$ũӐ]4E2zC|:OIw;dQ+O>c{ŗW2vL} fW,Mre3| !\_=žc}bbh=qMɃ?*:KqUZ:`Z-\Ut?w}bK>}xqV2fxO[tOMG?avxRKU%ŕƛsA&rYNd{~埓-X|ADӥZ lt=9qǎ[]4WH f`J1UCmE"$mq+";Pe-Rj,W8T%}wv /$)dɴLܡO/wWx6I?swPkk}e8#d~H_8Jyl%%nFXr4R,uiJ*o5tG9!3.-3c`XAէ,!̅Rm6O(* E 2)"˓ PF 6 <@Xlz`f@p(M$A{Si .4ӘD;**!SA/N1".z׹9DPG9mڱCS4^_Enp$`*#\?|Oɼ*/ļ>8=6^jx"=%IIR1AJ1y)sVKH)< ?DF`F00V" )$i J"*c5eVWTU$Kdv"\Bd& NPVFxn,M\!3# h.|.`$6w?0xxSjdHxJwG/K 7 GqGgm̶ZX̠KI@9$=a>)ѩ@I5UDFLH,kD0RKPnYcgG:@Xk|%\]&#V232FSIu;Tb+LR:x>dJn,/EDkIMG mS2P;4"*œRmpJ.I?C.Nt:X_?L CcIT# z]dM{;iwqf?i-/~}W;H8s PNTwYK&1O/ޟ84%t=O{=X7U'鴩t|v,dt4."6Vb(ji^ZĩiIzY82}N }9W^ &px7,r d GO˥o+ )bum)2JĽ7n122>9#..%(S 9JV18H|ky\×c͇tw"moXT2/{/կ}I*^,ݬ[1 Ś i3gBMII$#CξA3_ݧƩXe3!> <$$q)5dƧR;6ϪJQ7—/qqƧx^3, m,'Tl \bCnQՋAJd W2шFlLxQVCGssMuq_Mmp2 Mp8o:V`}xqA{ELSތhN)1j+LJ.JRiYF 8#F<.,r%ɃqҜ) xʧl!PRt&D_o;hK,3c^%g='|)&8VL^ϫ(būd…>_~-/1L)"Tɀ &q^9Ut6!9ւL>zًd-qeZ 9q"y$\{sqih,Ǐ&RL;OͿ|˴=n̫0y S g2=>EҡR iw;,䙃_piJ|w %H##i .I\Gp-[[Fۨ]2mqdWjB}b|R󕙷 ''JC3*.!4HVvheS,J_1,͓)3Ŏc]:o`(f.[ÛgZGIBJ)^[`݈MœnJ&׮Hlj'f 㪄ѭ,,G<5/Pd>9+] 1*Z-_淟w#I\Y0_.s9c(Y>ۀ evHG`p\*'> r`}_ϫ+]Uyy.X҉L>%e5#v.!]NnJOX XLQ’c~{d*G! FVjDŶS.|i>0KkM9zn,t@F 8 ~ۜY+Qe> r+BJþǘ9\N BQQfYoB ?fI>P稣y_!9J7iAy$O3:WN=Bor>6xoQD,7i69htYZl`mB()Y78bMЋ &[#D6gZXqMJ|-BX*֢Hiz0; 4Nƒ !Q2+0[m7Z, 6BY}ȍ JdFczM\mAK}#(: Hf 54<4Ƙ1@Bl2:/ Б_P'%WZ2+p$XNVR>POՄ6ŠBANwEN9hs}{+;qRϼM1F7*c_r9&Jrg(2a2u 1Ƃ`z]쿰H3w9d[)<<.*d giSi6 pa,2X)1ғPwLjP& F"iѓ+HŨ>*LRRYpI;y8\`;&udTYǤX,zrda+-miy Y:Hf$*PȌ ZFT[g(!1bͫߍD!fL2 luBZ&LNؐg +b0l!yQ9#lmNG 00M ! Ӕ;.d^N&5 AVdCs I]t v\oh #v}U^e(K -plV &ű,JXP!p}QbI'<˥v/H2Qw63ӉL֫fr\FڠwGZuVXScdRBڣ#1X|;=zI"Gz4a>UD5piGHOhXT͞)HblaG!%fi֐\Iȃ2@4H-IT3^ C q|_4x"AT-t*&=4•q!֚M׀KS] DYPaiZ7XWf=h-lN<íU=iL:sLAkٯ*tŬL R1)2CzVΧrc}pLBZFrыpdy0u=pӭM 5 2Du:JI }{6_{@ei6йqoް#rwixdy߫ͨ*Y2kAKB*s ߘϼNWkmeYȗZP;v,>+cyy|2f:H BXB1aG]^Y.FOy魰*$QBKMl`ۖ@N۩A QcyǺ {x ځ)ǮtHYJj׾}GkƁRfr|,<\}K1WEhrc0u. |Y=ŨJ3, Al -yI/=UHBXPomIprJ\$ۅ,8X!'A._td IDAT} gآs!!-d,h)@YADօrG?Ļ:GaN!7qrY*d!K\X"_C] eb3 ưY̑+_ ;Oo~9f<_i:s1p4^+l[ն8Êgh7w&>C@{ll[xb7EE{j3 >wBa[a#țF mqf4q lZd)QGhɎ#kF>kr䵁?ϯ"E]HACxBHq?fIi~-J"Us_L7k Ge>MAAe#f2yv^ n+Mf뾛[|Q8L5rØ>[^\i˘aݐ3)m^@{=s+mk "{",uE㥘m'߇ZMsp9f9mhH Άb|ֿ,Ps[Am=ˣhsQk.ևXX8B?nGngIYm[ Z甴)^h,k7`~ O 6ݠw-vu8c1BIm_PТ`loJ%,v[_ȡF"]'e6jm~'_%c')#GdZeS6oK<-g.6cl זnTB z48"DE@`nuM=;o?nb@Qy7},E;͜msCq!w gby܋u}M ao6N ϭFs9:[,&)!{^҅K{Az "<[?[*0zC~^:?gm+}ŎDv>l>NcPT|Zamu Lul DgY";({ѣ%ES 8!;d ֒w*e}lsYv[ۜ[6ngyi ɗގكUi78)N&D8+,,f[1#E {Nk,xmoe%kIw X[ _;jkw,qo#?fĽP+Ebv/g9lmv@^u;ɒ}6h*&RѱCơfYvSY8XM#HګqwchZ9a9'Fv:9GnRf T +޸Pnpm rߌ# ;[hܾ^5G=K ^o-1ĿCe,I[{70V3u֓ԪʑH+a)fF23 ZQDZۍh XbM0_u9O7 Y_ &3n!#4^ږu؈:N>Ś8`= щUmwԿrgFyί_s;mTcQ:ynb۰6+sv́ 4h z]GG\|)$%PrUóWb27#p0)H& Q~A_ra6aHk^dX67xY]D'PgNiNH>+T-KqX{7?&n4ۯng}$;BmӓV&MNЈAvlwPN~Tèܫ `KN(ML3h^hM+*čqJQ0gm{'9;Ѻ ͘M=wkl H!bMq d BjP7"`Ŗʿ~Jd*Xy~~_ZEAnhWu@?8 g3F&B%7P[# 2T)\z ww ѥ|{ub+^KS.'˚_=Yc*-5 1(ZrLMUI 1,|¡I`5~*_]tHaE3ȮC! 0kCݮt[ ;bklq#B[Tn.=)`wQu+f>7f3O ZEKqm(Y;d(>kvmT|lQgZvix^c[tԮsmKAA_PmClbfubfOvʨm67ﶀdmms9nn912ooo [vMaBʞ;JZυ_oC|{vm Y|2IT21~4Ano [ayx 1 <і8ሀ`ƍ}ܕ3/M_}]^ĩ>̫_:[>du 4U_( %xkSw:EL&mɉ;ytlO,~% Ȭ!Z=(do> cVά!g.ƛ+W+e*ƹrFD>9UK9zǍ$iߺۧ5 O^RWQN(cF5}x,[ V;[G_/ yaGjgRVn1@tN |N֯n+*֍skˏbwqںFۻg\Fǵy+gm&#l@bq=[Zv=Q9nR,ys<#Fj['tuq][FtX2osCCa"oK寮Ͽ^ؽ h] k5tG_fc9yUxYO|_OCj̳/,zMp-|gݧ4s1bG*&gd>OoL971<ԭ;RJ6ہFE1y(WJ/OQ.3^e1JkS'?5,#2'G:?g?cU{<<>MXq|e#<ės.7wSj 4h7oRp Q|9[ZuCf^%#@Zw_Z%>C&OJވ 2#joF ϊ",̈V{f͵Rign7}(.Cr[ {+!=)2~7 ݄vran}z*\ܘVai0{]uirwn|S}xfwI2iSa]NfY(~EF־`CpW#?׸txg٥ @*5e 3c'?+gqm_!JpR2 =VedÜ/]BB~v:@&=s9k$eQCZ5w,?юJ=+5$?# N |QMؔgDIHT JQ5uͺMIߌ7wfKˬ Wɍ¶^Q{djvo嶀F_ӭ;I\|e7@ seڸlzyAwt M9#%{ֱ =~ܙ ;L@FXUݜd3ٳ;tU'Mo|*g^6NVVĮΈhl~9b6~aNVvl vEwb&`x!6ɼ_Amb[ڼ2 ^'bZ vM*z=mc&lC={ 3E7.ECv_h@썾EXJɕ<8k4FD8Ww9+uI$C1q ֹ<&`J(!<ȻNs~~W7-Mw~$ v{{}1ՋyQ$ iˆ)0JN12Š1s܄KI5e)uwQǘA}?1w_}NoKb:g#EKV ~۸荼w&>_YNNE Y˙ņڤ{yq~&b?-ϩrXfYgٷ)k$FJ&Ϻ%{lfSlf|m;e͡['ic,l8Sjn퐝'3[6љ99+*a_`,x(Nv Ұ&flQlHibғ;]w${}w /Xk0ƛ3 =G֦=4|Խm1rn]Mlp˞Swq|;9)7dm5yYT!ɽ{!H$yݨU8 .ftٯ/-w%:K'+ӐN~˸J hA"f!bkXN[Lf@m '.W`;wew?\8ztI9<|.Lw@c쐷1p+4cSSBLƏL3FH6[ 4Zc< 1H٩Y)?o?ŇQ~zeLQ>XK6bR"{Is\{9Uu/_Ҟ/{KWx#k?SI"(M{:A=FMx^3Fs4!ӊ3n9[Fla.}>0/Au7ph!# !a6v-tٱ1xaͶو.U`Ju2#qC"2 K"^tNq#QKΘ#@rZ*gP^"{rR vtgܛ̟MFwL46k)AԘ}2ëf"ʕKtV7%9L9 ! {A}{A"`xN<&{=[oSjzG8V$u5ɨi(NQ.ߨ(BQ7 zgi{@&0neT, ߄*Mt]dPh,hof҃qr:Ά7 2M\}ҧtNT{%n9plpXc7sm%КJ̺m]ߘM@g$hM7hLN˖ϝxk[|J:NAez\3yƲm.Wq$|iֿ71泱o%לzRt 5kN8ec#an<'ä3DDŽN`~Hzb6M[ r36 RKsI Ax'x_s?yDT/z=\S9^v-THdJg>Es:)"Y 1=qr}?|[?Ԉ&ssTGg3LhY*6̊>w>lPcz.y7ez#7Xtƌm.O( \ً%ĔsՋ=<vHq{$0ҡ0폊tӲ2F̸1y681` hX;q2 e?>dgj TnnXVMk7^C"tDYύ=j{q6ٺfIukwGGG\~ #_Ui .Z-֍u{9B`m5uĸ54C} ܸ7c m!!;89=#XxsUW1lبsLIMllbm"̨㽦}9'q( _eq+VV^Mm/0#H2%&LNVF>P6A[N`}^aol2b5Iv';t7Re;ܗ.UnH=}:delT>+l@Me\1DR뺮-⫊k|1cjڶ{OJLk {Ko4 c ;iQ-)-=[nĔ gal_UXc1]KUUГRft}D>RU{ڮ¸fl~c3C⽣l5} @]Urkbȉ>JUU1u8)w-u]X̩zfzsn&cRNOOx"'׹|jBLi7/xֶ)E{M1d˕:ehMbځ;Xm=Un Sz{2貕D ?>7k=42b?{ IDATS+(>!@"O)>ا?i5`G~jaAR7{_}3~:5; ѓ%=Pq<#Oym<{/aHxg3VJ[˪gNHi7.Kz&]_!=ݘ)ev+`>S+}͐^WR絪%(YYd c6Ɲdlfڵ8O)PU4)%2!Bt.2?_] =a%BfOU|Oth-$ܨ]i9òc lRzܟk-?1}2;Qfؽn~ fF-&[C ~8˥{I9Vr-iZ "nI Ƭ}UOqD/^ H٧0R'I#Fa%M 1bF?i*LbHMuY%jCLKc)0,c2j1_ej{%Mqɩ)R#nJn&!Zl\X}X*| a;h_k۾6ىΔR"-,6Tʔ4z ;0ؘtC9<42=eI?a<Yq~L 7~JW~\t|tqߥp4mo"~=w>9cM) $ڿ#sWքcZ]{O|}\=_u$jS 2w7([uP[eJb`y|;O؍Gm!#=mmA0 )wϧDӮ?}KޔT**uۏ1[fq .;?mu1eӴ^St7 H׾u7{,؎=i]捁~Fn03u{Yl i[dsh89hlhFV˚u5x);^\˪{jp9ew>[ΘR5zƘa3PV)'rl(qdJ:}r7u _͹/dBì{_rvzsA:sMJ;!lMF\&z7ϛ):p*Gr5f++]/[LY9o |}gOks3GP+UNQ-qm;Ousƚft6+lh?$gΕ[)+n g)Pv١]vXDtl4bw9#m-6N-NU7 z!dEdP؍"2yI%i! 6ùu"qr.I+{-_}FΞ I鳟<.#TⰮz}w?tXOncose+q d3iK,o|7~|Ǹ/W?!쵁; A"HUeuK=? G 섙(.^WewS `;z$VEM] MǬOwDH.'>Iy N-T  b/ %sv'^ҹ|Kx~cՖժs'סdʈ*7 X|#;{;qǦa/ě O[ |Rw9/ ^;48+${U'#=g=ʇ}S_>>ȍ q?{ho䅜/.ʃA=?oVK^glMX}0þpS8{rf"ikM/|__;&0{7yƏM_m[="=砊tܲQsFxk_߿oo{G?sh}^[z 4ZZliuT`{i?@7{'~˷{N_c@S^AFhx7K|!w佦rkjksK|S女f5)",(2 ͤqovsl (̧Y;~łwsx꓿ccI-?Vi*Yl9Ns^fF|k~"\!=Hzoxc^bq*|G@:KOdR$ZU9n!:#|_Ok|a4Aj NfSʡĖ FG`F 1\laTJĠ"EAHVҠ,RMTe:[~%{`%7wCch#iu"D$hsT~b' 8|L߹04cQ5ƱDvZb6lq,I{VFMiI(u$k):(Ed_RcN>oݭP쯔^H)Q,+YvRU._cEFl(wD*n´4,R.秆{J Qc.G-cf.2ן;[ki8M"i9WCZ~]1¢Au3Oy 2}밞){&M1u]rvZ{`krUF1Y,ɴ~Xu42sSکY{3١mzS-n-(;Az}+wKeK$1ٯ|u-}ҍ[.5e*)D-[͔x6M{ T?OW>9ߚqe Α6Qw蟆21ƚ 7Dْ1b g L>sƸf3l2yvkOhb,>=6ZCFs'_G ~GS7'eB F̴لJ@H 8[AhZگ{%jxRWwv[3_W{j[8eCA㐿][ R:6eRm`.s׫2Ey˛9|Nsm-mҦ,Su-Q*sbu͂ ւ7u̟o?(g}BK&V >Y$]e)= tp$' }Gp/S}K=kH逐*A%q.st=Ms6` j~?gKfءF" " rX"JO, @舨$(BQ<`,=kC3HaStb|YR 89Z2(.}? ]1ҧ@4*ҥ@*G$D1D#D6Ԁ; *sa (&zc+ӖݢzibPv4l "f0!#)183({"κ1 1zD TJ5 IwB(cONCɚmk`<8'r:S"hb*Q3ܑ3y49!iJ&쓦 ~'<6ߕϞg3/MIW egR&>g;ҸW;8XHzZwXQ`xl BIṌ{`0#hIeKkt}0*k"a>ʺbAsdvm['3a 9!P1@[L:9v'kBEge Ѳ65 U8;D,1f!THAoӵQDMcvO엡u`-3ƎIGaQ#f@7tq3[S@LͶC٠#`gAc=dк2m[hybhmSmѮD<6ن P쮈!84X'5tG`>S{E%&t gp5M>0 JDDQ ] K13rjㆅ%e廬2hIL5vqZl>@?꼔D\ؔsG7G j==;@{Yc_rLh COxD*^xV&0!3"J1@1Pi{XB"x&\m1$cXk=b(>FbtF0tO}䐜"93:[AԆOHMʓU60V ȱd+'49NGQb v#~9?Ṅ?8=`92\BxcN9{ m[%|g/-tp&N13厗Ά<|I}F/;iF~\?}玟"Ŗ2-ҷK_cSLcpeo~G]!yܴ5Y&Z{:Pކ|'o~CfHŷz'L3"pE1-R JQ25 VՉ_>{d#%x?W Wn!mwVsfG5?dW瞀"Oå7|Ǘ;xWt;_կ7?Coyx jTbٴ\Z2Z}Rq%v=1,%yVZ`ZQ9ϲ[R9OwXkw } #j8^*Grz6;YڮCWt'j"Xv-{B9ax aX1`ˆ"b065= XKfCRr]@ eX R#Q>v+,:N 5BDHeQ8-FU"r*"<34ھZjY|e޵kbCvbX-ymK .۔׬=2^̗y ГNVKZc+O$QЎjHI" CF0JyR@ԼNhV4F~ѕi )FBJ!+L;G:KXQ6#]H86?r6+X<& JDr:qkXv-mec,6N s)fj| ¢]ac`}Yv=\?=|8?W5'9WZLVh=>=U}J,*]GBhC [CN| ~2QtYڮǹ.1ѥ ]_Tu89].ц)}b$L`1=ӭrb>(9Xˢkc8].$v-)D'",bAX,X_jx_qm~JkV}|"9â]1,qjqr5ڊY]>FСfmǺ3`!%w_W}CZP}̤*Y9eRR(ٚ.t)fulb )@d1#!8A]aɪ)dOU&o(NmL*[mV>]u+D1U"Edk,XǪ TU@\IAį=}Keaq-U88rTO˶҅Ї>N7 {ۿǞ0ꔣ|ʝ/wϸ᷼ǟ$ǟuʭӍď~%N"P2)F[\\хoXlT"ŐG N D30_-xpbkVzV&(I({Lp1e9Sr]Gskǹ+.i9sxRUc`&i9jD,b波*x_4ю IDATT Jytj*b̙=o=Ikt'9:OO8RJ,bcJ=l[W@5*yc:fv0C5fubjG0y1|0',8׉.΢ ]lvPFQ1Ubrtp!]^$zU orwl3"W!U,VKfԇ%M݌敫9V4u3Ղnω1(Y"M5r^G$/g}M_cd%<cb">dZPg-v v쐔]bV7mK< Cm Q/! k=F,!&݈z*!l\Ďc\&W5KטKy;XBa޷4ɾ5%jUL&>B9=UUc҆Yub9WчDS5, J9NNO8h2x\.9]`ѷ4UC:jF;,+jWa%Y/u>Sv!TY&YUgWL&VKj_5g16[?;x/N}d?%ͤw9}6q0|Ū Xc| :suHq*fUM*ZGu.1>%f JE |Spe#UM,UKG! r1?9T\XiD{j}8.@[F1! ގ|jERʵU>k7d%)d2(W/{?nl3lA):#wu+o W|y==i>w {_r 40s˓$KdV K\="c.EЎzFJY<'[ޛ =J=ih+g3xk^ϣAjpqgC<(?eV7yλ=!4^JyS&{B^|V++sMQRaFϚ|B۷3mK]U`R\nb ]#jsX-sPn ]f06/ }XՂWr;K*PJZ ]IY䄣jg16?]Q tNS7 J1F\1쩜SgX"e̘ƼN(h*cK4? w%0o||~BS}"Usl2d>Y*e2s5nE%XJ6u]5HoHIÔg):XX8B TgR ֤RWhfd" m$*֕=h#J?5'$zPj׼ erY1Z۹|e[#hxř, V{H>tΣv7s2so{RɁg|]V$`;ZTPvE]9RVSj ]Qs﬙q.C2riY|xR3yN8+*WѵlIJX̩S.ٌ}mb1砀6rr`4MbD5e%ЩjI)҆o-q\?N,ι:f|1gVϐmFuH%˶C VŷDyT,Ù4&>* %&2иb!acb!ۊ7X0ε[3l)l_eS.פLYcL&DM>k?7$NqTrUP8g8)v5U !2fHS!pS.M]SϪ_QfECL<̶3E]bVcL r}L-f,XaI N : aKa1c '3|&ʔ$3v @ eb'}}m~昪|^$R 4g.8gXL@=xk8pU䠪1)bAS#)se@jst݊91tݒ͝ᳪVL'~I gon5@;j4He )v8#8>a ~d_[ K1k*RD$ǣ1c2_PyWN ĞA tqLSUיU3Ns9F.r|~s%gnFGcNxý秹Q :7;5k,{i=ͅ#"ĜL@K'}<)l3+lR}ȥG?'Cy{/3ȫ#V/q_CyCsxzf+s8-}qUM2|*'Ooߟ%o;0TO5\;>ڊÚEu4FǞɬɤ˔QĮۿ[+y./ 粸|vrΡ33h,)r^kfSDT ǻdjcO<780X\*'v^,9f Uac3k d68fB݊#?C9epPcE5גdLEC5g"Fc8"VhۖY.UE׵$Όr$Q[O_iVr8h4at֗2 8$gn0ޕ0A Ib 4gb%v]~}E:'Ӷ=mi!t+|Bs@=[Qۊo\yLb1W,:}ϭhl1ضݔLb3 HX9#k=vA㪒΁Ī]VI!p||za=+ ^r%4dbC4a(~, HudIZ*f-W;Q<93e%H9,z&uX2v%2xq8ɁFe]Tz{ -əf# J}eAisR*9칔uNl(Z|ɼz9%KjM}oL29Ce]2%l*W TMWT&"03"03}ߖ:{WЗIq*AՄbR˺o>\ZMɐ1PUe ē/S,_l#U,!Am)wC՗5nmMާdL]ːEg2 |rx 6U!B 6W hٳmϽ2xee<8ͰɄB=uCL9c#)J*o}!'2<,O~KZ]R97f·^4gRb\rP5+t9K ̗M1("0FU5}{JwX#(՜r~R+F5ya8 M1WY8o}_z2SZ:Ӕ6A*3 \Jۆh>K^L!0 jWB+[LޯbqCBhdcO4-(;V ֺ?^0+\0,3U׵$6c HS (1PWa\9e%{ i\+k2`*g2[0.Dw|B#P{S(D%v̕DE$A,ʯ3brRߌQ4D+%EHݨllII8o V_F=Ҹ I8FM%vL׮9&|D EdP1M&}Ep6⌢[H)sB-sUj6-\ir|PRk^ti/1Ye Wo{w~}<cZpO}?p7ׯ=˓O>j;r:_p1g+8n;.ЭNr)?Wo|:r`wy?E_U\}a{ z+bҔ壽ޭ.qlTOjwpaRX w]$/c!|pk}ƿGGGv*呺y_U"m, -,8C[HIE;F%:]}?̻ IVͪݥZ#1yS310X.t nY4vLw(]B&嚽b.:{~M=iE`Xa=V )o(]0 T'inEaXQ)Z*Vl#Jjc!0ʒ(%$qYJ%[B2fmIfSVaj! JcYWҳ]!}\@`:y>+"Mk1m-շw0]IB؂X%$szq= ]o(YM^T9^8S-y-U~%v]R8d%\Wd)2>`B8ڇal0J"mM[Zk2%b)$aR^Sdv^MlABS9ʊRi^c 9xJق㊯u`(W &ZTCIIa juΠDk[c|PZh?k-eZZ:J"rtIBV= c|^ka 2y޷-.!0r~^ +RSaT`[:Iyb+Պ=JqoȾFHeis,i!*tܴ3hy0d1Qfvjy4<5D881v.':ӪAm7!R ́ :ɊRȓ 0p|4tCh%~OZd'W@We L69v Z64Oƙ-N0rk" -X*#Q[Oc%alA%gR9}$I>_@ 5#mښ!,-ŮzjbQN'AdkߏB. ξ[d!jjZ٘ɽ;9_bEgE(iB1-T(m82L$(!p|Vc tQ.}TTY]8#17 IDATJ)aZ(r*a^cO+T(x vi.WDvS݄k5H:>|.; |ǴRUH%w_RvZTt,6d5Qu <"' p׏+zʊޥ$az Mf-ŖK I{kA,uN nahŒZ[-?,uD9jQVʶ Ɋ-i0gh_j F[xl qe~F$r挅"Z4Hz|rbl,;[Z3P C^/Cg0v:Z@\C[hEARhMղ5n1P.#$">BTB(5=m{'nD5Z0z7fOjhgk\JtdTUAh$Ί#՚EuUj%acȸ6a'1b-'4@ IRsN5 Bxi*щrHZbp\:J0ZgQ8-?20&$*.$rtjv4lC<B1gUcס7Š`9z"N&m_YSEti>W#i~D>L!4xXęsح)M\B+ 1n)WwĖ˨ji/R=ozl\9nOD1_4!ԏ69H@RhE IPl`s!4)v e\\.&&i 7l<\5іk8bm}ϓhS|m]8"׽]q憭 ?b'6J9hA7Lݍ(w\* XYZ[Ab 0ƀVkB ct0kSߋs1N`l4NIE֒bmΝ^"  aX& Ot"]Gpi\ƘY 0( Xd(KyI]ZRV01HH78AJnh-bժ2C9-R)\SN%%PDl뉚hu|>5k:-HYkR&qׇu&!gͩԪuCFiC{Qơ3wَ}hUF+(mcB~ۉ&mi!s!P31ՊD e?z,nC+ %fNa^* ƞlBgO,\HL9៕~ l y4f*lD!-bt(ּ2 ֮Db^0&={Lc|;V0aY(%Rx^o c'Mf.B]&cGO{nf5BG+^?X(2j?R5@w3fvbǽvϸ3]3}|{HNJ+09/U+ hmyaF[N\8uAD6r̗.E7@٧Fe-E@-JP> ;#BeVZ;Yb%'N Vܻ;~;sGs G3P%ɪ va7k/eƤn T)њ/l롭ckBf-RҍUI dNQ}=? Cr\0*Uqc??İqVB\P(Pװ=b'YsAz fʁq}1N\}/r#!lxnKiJGw+A_oXOGg+rbTA1W-GE)抴G{yQc2νhuhST0 Ԯ?zIn!LF甉tΚP`dEPϱ ]!=\j.q]4tVJ"6\ż~5#]nƲ\ǧs%1@h<'vī$'ng^"\g0VLŕ?y%fp'B*2րK7WV1yD"y~L1kzPJ1nDARD5 F)*JP}!"k#6qI!_ r\c$IDj(C.BX/ʰ#ޞEoT2g Ri YttFww7z0s4 =Ij/9 =LOzAؖ9{P9r_:w& FJ}?#U ᓻgACd9AMg#3̄qctaFZjS;ɶ婐%kS=z`alp%*Itf^ORh|]VnVZY; b+`0-Rm3ưwG(c@L9 m8`ˬY'n¥“Jc ];"iBy>"c'P ˬ[Wa|u=(Y2(j hS+Q=2ެֿɋ/:p`6ӹױz՚!s៵\*sWdL~cxۼqٛ|+,oy1~;m7~$[d5t<&M{ >Ƀ<2&pQoѾbū\} m Gy(ӦMr_oo/d!8q<61cF7=.de``„q\Ǝ]27r/BEw~dh7ty1bD`60vT蝯=E ̦dc0hcpilrkELQ[I'Jy!=Ouيl^'\ #X8"P OAoW=q{Aǂѣdzer vVXiÆk~xrbEB{ 7>ލ^ b #f`E)RGYYHI,4mLko!s9e+Aռ%uu2mYh!(Ay1WKu4;Mc}gԭ>2ʠ & 6ϯc4py70 H4&SI6uAaPh"_BWys.3(?o;,z&!9p =vr[vcǍVKcIS?DW]E5z7HČڵ1c:5[yJBo6 ~@9|ZND#y^CCd\ U;d#gbE:Ƒ̈́a`5ͯ++QL#Y DQLUJ+Sv8r4xvO=,_^ql#g [xS$Q|g/0Lem?zkON濿#vy~5Gw+VpQo1Nx]cA 1G˰gpqsN@C]7y1s߰^GqB?2W=jiT1~֓M\qev:}=OY2M-o^YmAM1o\B`18YxHj3A&PmL ,ot6Xk7J;ԫ ^@5hXݷ1ܰ|>w9w ۋy{^X2yu;aE+_eܩ_ۏ* J̆ (_1UIߋ O_/^8 "<歌s[-ЏTSCN霷^[o#B1ile‰q{:H 짝X} ʀbH) =׋'Y+YrTzXk\$Ij9(?nLEh'7qfTW㥪ٛ[[k)f+իC `A)/Q#qjv|Rj Gq'O`ѢM[{]ȂO6?e$>s}3Ͽ>߇vߙ^[H1>x,xq# xigw6n1c,UG.0c6{Cv7*O~ìXo:?N4wI}sl[ghTKlK/i;]g>1~hmi??yvpᅗǩvwQc| 'p57aaIr]qWȆ =Mn,#,lpjDluwBA64V^7hh|_:N4vL=D&iBocZc&-_~1 hϝ"R-'ZzP|Z"j /^1K>{ 2>eZãދƺM6~~Yvy{p>ڝJ+cM IDATsYb'tcF Z6R?[ƁbH< f%\8a)IЄ2mAmzHtLר|!U%A\gu˖kʆǽ%nᴧɼ ϐj`jDݳsll]vϑa12';xCLn?tLZ g1Kп9r)gf=34܍1~=߿/mJwe'~{/2rʏ5k.xefΜ{ϝwW'3gn9F#?Zz'k׬vvi9묓0q<=l~ugӧC=;yu& M=xƛ12o%\z[>dv YYjmh|#$D$I6 I$t3y Ť;jWq3gO vbQt-cF[y'~z:O߁E2~tz׭a̸I|z nJOn E B$(!*'Hb SZB A%HZ'-ҍs*d-sIT1A^Yj㔧X8˻}$ZwZ#[XO{' o+P]\le}cįx`ǣ߾ˡ5f{?*ADlcG4yM9@Iȓcݣ+Xr tKAWy dV["VOf1BKRblV & Sel>mA" k+8GU^x5kZ ʵ &n!܎f0Xx eQ{YOҽ D׿m?T {cu=[cXЃ,LqGֽ&kg  BUܲ ݖ9R.–oBv視}fz$A#cu oM[d5^Zϻ|L:mgtW_uo潕L^t_t;︇/Ղ]7p㍷o~{'Bt1qN;,.|2 6y"Dא=1 俿#f8z?rQ1qlr<|}=d^sMޫɫ̎_*=]^n}[̘+;'}g+Jv|{?CE.ñW~yDQ--E=7\w%\{Ō78N8#覂ϾźI||jƍޞ5fr~7Btq!򳟟ʣ.$>roo|$>y.2.]ή-*{!8܋~G D /,Sa!8rÏe=#M4?sO~&2q3BN>wt4?/(-z~G>pچP뿾ˍ7J__Ȓ?2:rPUG8fsc`u!:Խ9\^غ!Рaa~Eq6oSlOiϷ' 8B"hoiCA%(*8Ѵ ybcSSvujg`f< ʣU/ yu+{Xښ@Lo /x=e<Vyێ)F=v,+Zr$[necgiIک[(U E$jQ"C S O%0@dW"fR F2nN馥ps㗿 wy/aX7;9?rWַ3d.7[{C>+_<_׳~S9❇ $c.쾣>bx9,Y>.*.*~˓?8vަ ^sdznyb:קɯO9/Cpʯ'cfŋ_=+O>?Uח9͇r;i-I \S"oqͯbJ>5Q-n.n.0,g}|_[n.Okٛ5v!ykk}mR85ݶ{s}隆3n{{8wp٧k'XV9l|Q|Q~S3g;.ji^RD7(7g0oȹxj8o FD3ՒJt E!yYE(6mĆKV0kq1NJ疰~2G1m:.; Ln3ள`)3ݓ9G!sh ѨS1 Qhki(ڄn}οQ}@miq̚5kX Zhh6(6HA&=\IkAkV C{=SI>^:I}N"qBJ }+W1smyч۰~-KAӫM(2n.G d]J J &% !U6߷/O3 %!Cq`k{0S'@у8bgutOJ__?g+ ڐ)Zsy'oJ_pYqA50 yY{Gr=׳>?I7oA~1goKwu?1cc굼=m,_*w@ڷk9q?O7ӷaC/|fz{8'0eD{wrUM^я|~a4/bǾ9c?~lSQG?<-J>m#3g$I&Qo2L,"MTA$٪RqSLMәzcr)dv z{ PKb"G!(ڏN4-me "aCT1Z`]"&` jlP 2fT'8be%DG;;;qn HbM"g\{>>6(< Gr ^dgY A'a |*M9 6kMo~&l73˟$3@#׍O Te!ٍUo'@'R땒$q3,Z-?w ȓ sڲ:'h 5I別W='M_='N3{2-DF" I{&JR0-a+GMmǔ?=3ݍ߇hB,xƆ(h I磤 B8FkJT#Iڂ"XǴX0ro*o+UyqVmIG>\\.Ե[>oY\~Ź,]$W]}~}+VdDzȟ .8/>̙=`;i=ϙ=߬X[⥗z1U_~8tOq]qgsgr qW>T>Ūq͵_7lЃyL:m6_[}ta3r |S~r ͷ\ΪՋ7@5\eOwV(Xz/?w}=˖?)뮽)@ |.: /:/|yu\|9\p\}ͅ|{_oz?XbrGOnݴGH+W5#fچg=ĪUR۬ZqݣyXj]]Y_&Kη~7'.οLBN:gy5u '}gMyg(.\,}g}:arw؎UUq?à_ Kaƌi̞=bW}|+rɿ4o;wm_Os1}zݿmz~POZ߳lٓ,XxR=}hsdds$x4SKkrW>tC2^ ktvtP3qdCM[H{Iڊ- tOdexU f٫GvJt /_|eO0=)1#mY@$#1>C%VBg26 ϝ~ w\SX2"+77M}Ⱥ$:fwg)r$Ζ&uЍtQ^kd*l)gOu++ԝz7&D_QF#$ H^ Y Y$͚hI]i|IIBb W/tWsoo2ܺ8L=k;O]p+VLIR7>~8B)%0{I0xGzM0& */4ശ|朌zuskv38ihkkSR{y鱿=z;4i"7r%tLf-ر:=Z-ܬ"c)+MB15\D[k+QG|DW\qmjZ(i>5B|c짧00`ׯ`!w7߅3zHݣVe\)Ř1;;O3gԋ@yG+yQ>眙mI- 0`:! 6[ĎuM~I%&`PlcL3fl:B $jUVos{-JTy^ع3sgSgmdnzu5կ~e˖wUݶiy.-- |_iʼys8ylذ% Cx}0hʼn}oY?<\WWzftvpÍWq)fcAZZrM\m.|,3;/~Ĺ\cw_^[lbyC/O˼}oňWaGKQ(Ri i5K{~ FX,ִ6NP* .f#΃,6@RNOWf*]zӓءSOZQ;3À-qXW'K2Z"PkAzv0s7bk7tF pVat*r\<m7c(`a=#r:ϓ2JQϲ A,JvZpCJGŪqPRbѡA*Y%^NM4'9 F:cCˆ#VŪ2(κEvnJBT1} frЉGZ҂# !!'xwԵ厵tm]D.;sq|b9Ø5-[(Wv:>ez&[wwpooW-gv%g}:qBD^K~k5C\ǟN;ЃX⤺y.…TFyc%`{nN~{-k9yʼnsz2ҙtAދ_x{Z7mx}}Oݗ̦M[(ʸ˶a?^W^szMOU魼7.?~\>b%_8|9GߩzחFՖb5kG<0>ds;wV]ڵ8r/N9'_c9 M\yr<#,Z8TW"^>XB!JV1D~J*2M"J9 .Qth!a ;B!OX̣-\ !̸vI(+ViWdϽOw@o>w^!E%Z7XÄb!^:Et.\FIS*2nY<"H'ֶ$+q:nؗB#Ac#I۳bůT/n'2s>}۷@?خ%Qq#9ilܨAncûyjMNjGlNomT$Yr p]\w/l-s?c?tgt:?u^O{JDT!HyX *14Qȃ q&Xߎ{#^4ɈؗM7Aloϑ_}%9\Z#>R) /<ɹ~۸F*FzO?dz1K2=GY[{C#Ovp=_Xd! //6o޺֏bwGyڞj IDATrY; 9_ڗh㿿s 7n~aF_@JE WUE~z=Lׯ=sͮ~\ß ⨣\.{6qѢc)%]GA3[43:ݽ#E=~OL14o]qVX1*sX*c)4H`!x%'8(eK}-m=DyG@:gxsSАwBGPP%a‹VPzz7u McGvjmTEք1%ᥐf %vmp(Yzl mGΣHVAxĨCR[NBm]s}鍼귯w^ ͱgW]֧J6Dw]26 bm 8n!QJ!ڿ;9-xw\2Exk~̒6mgϚm Kh CCxG:% /d:đGKdR) Ơ;"0)c9Kx#}qcq< $80V=]soy^}._p uwo@)S9HRlٲW||TuYoorkuK2A__?tO>l.CwC/عsߡCM5_׿g 8nOg"N[%LL}(yGy{5W_5\Ǻu쳛kSwsǝa֬Z o}ضng?q;>pbeϞ(S.l#pk"[/Y.nj]\sܔ_클uyiۺ1 iζP%"t]LiZEd:\#X(Z[ 魔J>]k3s\{.Zgң[Pm 7},lBx#IZo+(ZhE"NyVv)69#cne%JyR==[~vv1ww6rv-FG {<[Ľzm.&6V#TE50uH=̘ c@YNU!B A JG4Y^ɷs#Zk 4^G38c#[|L&>3ZŒys`ڬ2.fRHJ C:SPhɥ4ZG/yJ&D4A/,GrH9u8L&=N>ŢE 8u1?ok ;w/S2nW\zw|aܗBu9Cz]<ƺyzzzٶmv]l:=~W_ͷ\͵^>-K c,^&n4EOzL:35Q{]T^ۦ-[uի]7 o-:9ܳuW{o5oJg̭9dȷ?uVN]y2{$3ft `Y{u~_? ΣT*q]}w?I{{۸aóx1܄nwϝ;h~8vo`R믿/}kcIwNcqQ$qGT} ?W1];w_>O=[zA5/`ʓ_Q'>9~tsAg?+ǾK' ^@Tɱ0"V P6uH.I9.BY|545Q*6v/8s9`gb[Jd˱AJP?k]T~UqwY ? ՙP Z`w7K_}ms3)J0Zc*-(ьcF.6vlC>.R3֢`xOzp/K;|l~݊$A7·LJBa\*`covbD}bD]QK.6" 3eoYh6P޸WjUϞ sϽܷM8W\|^I5Oq5j՝,Z3N#sv . ޱӣe]{G>߿?>QXi?t&/Wu>W{߻t|o|9\sO&d= |3:qYi!n7Ľc ό݊^Ƅ~G[87&|6:jW`` .xg]noߘLflW^ 13Vq!%V$BH=f#$>"8n>m(Mcۘl19pR k@H&7ZJjvrc@($]O ~.(Amssq =y $&YE/gA0jJw Eˀ'D+ ‼&RZd!Pjt9}o`ax6v!v!E$9.炈2pBƧ 9!Fُ|@r$־$7׽2we %KkCԏ9Niy2 h˿lj'S~_'U%e.{$@(wG}xTynu;$Z~*Ug}^8B>x`gq+O=*N]yҸfcF1;M:f͞]9fϞ1)ζq|e=׼x>Ź缅O>oN?cŸ%d)<T#7MxǛWPGӜp7ב/|kXt1O9x=w\\G_3&n կ~' ǟY%0ٖY1e*R\&Kh,EҐm!)`AZp?K[~ y.r~ȀQhZkB h0VaDA 2CV3l5,)ZKZjeDxlwG7f$y4$=N9BGʺ%ʰX͙zRݎD^!*U_0kɫؾf5C}AXPT`AIlam,5cuy,4؄^ZSt4'*m\HJa8oXMw?̢SJKqgj"BIC^cDI)gͮzR)K,^s37oEys 'GB޷?㿳qf2smo|=ܷjwB)Xh>W^q 7o!BΝ;y1oy8S%@|sଳN_yf#;vbOO/l6fK_4rqޥxAOO/::೟vr]K g'_e6f͚ysޟ]?w~3nbOO/S9|oA47|?7B׶CKK3ms̫?Ō.?gL\񳫹+frXh>_qM*FN w1db9 q4pHI dPCK:$JcA3<{3#>xŔlЈ*hBDrҀqQ!ʚPpqKh-VJ1hבɶ'qrV?% imS,ľ{9ZGl[k[7Ra葠A)ml+@}VOXۣ2vM)KyՅ+MBѱbU%XGJ68clu5U\$0Q)B  !\RC5K9ڱ kfjcQ_m V!u 8HOeMh^ITv2e ^`pR󶷷ɜuw$ ikk+Er8Lkǥھ1&\%=C2T& CP,_~yˏekw=#?fS]|룜HDGXR*mBH'ME/MTrүGH¡gx zCQHZkUGvر4_B,Z@AkLJ/*gL ƞuBeL+m"dP?Z/ xA<ÿ?v[]4bdR!C@ͤp{>C^A )!<ՑNZ,:! AO D3g'浬]:m'&H A| :af J(70ɪ߄cRrO~·?EDS;T l&}̔ G;a,8B%pHY;5cL@?@8]Xflʄ2XϞUB 8#(T*͂לʲބJ3)Yຊ8qWM˸JΕj,icQhaG)l 0&W :ʸ=2 va<~Ի68{q, m1ؓY ȻttG/[Єa l,:$Sx HP2l  ,=nP:ȹDj@+|@p^)a O~ ͛!,11;w_:r~qGٞ Z z%-oM˔VJ6mfHP8DKS.1R\$[t#}GőiCgog=mܼmG%R]S*pq\ԸUHu"R^%9[$2.SCC}lKqXvh#r321cLQ@wRTȥzE ʸcbQG?EW\cᡯ;)mܱ`lNm#&v{#1­`(+F`G 4̟ZA` C8㈷! &zt** ivrX"`_K%L#K =w#C24X/7Gߟg&H N_b*Osuz~5BԦi qCˀh%ҘR+IC%*87iĺ`ƩͶUM7݅]j.bM( 0ZK?]HJqI-fڢLF!hStGuF~Զc2Q:651 l( po~ qbm/ʵfًA 4ZN-:Rk~| rTNxBkF! -TlEDYKK# "H A? >_WMv:zj}9Bw\ě.B-D֎G bѺ"WaXmh$7)YD5GK'Bz@d Q߸lt a%n$Ggxp;n/i'E"^sl]Iz;Jշc()Gl֌Qq ks!2Riԏ0ZSVpՃw e{#aQBg,'~ba rx+yZz5#Co-ZM*vJ0)mki1DH vY%%Ulbl t}j+0"! B؊%H A $HCĖ'fP a}]Lojd DYٳ6B1VdkA($4pK tdhTbJ{ӏ?~QF{*c72NսR]Av˨Ks<΃[(捛8גkSRg+}5njL9Ԕ3Fdq*kcCQ% X^C/s[N=«#a}@,VF$\!HYx_aˑʀRe<萟?mXiXQ&! {hO\ڦ!1٨DRp08 $H A $Hs6!C%m1Ƨ2"jr-ȥLom>B0:KTw)_ `MB )c0+$!.N42gQ"43ܺ[@6os$6${)nNCY!oyEF5NᒂQ)ښmDqMA~n'--c.1Ϣ<Oc>K,0z  5FRL!TH'B#RiVSb-qF A $H KbCP:K P@z !dZ)S&@[Xײmz.(X0K3e$vG?ǏPYT!@(5&撶6-0[;*(+Ì56֑r*q٧5xw2~[s}P)/EX`똱tQ>^(e$ b-dq+C4G?#1ATQcN$_W_6.3ZZhɶ[y$!Uq5+ 3R8lDlVƎ* 0tCpKl~q?BnAh@(项eJ) SI !bLS65{B --A $H A/pQ_"$alB[͔F<%lķ|Bz9KK#d%F!%vcA*xtK:xgWR R܍,,Xm[1NtI2Rh;h>2%B,X^Cʣuqm⩛n{TN` MM%r)ѐΠ ir!M4 )$ $H A $H%FLn@ 3etA 06ıIW9(092c`z3ړ I$&+8obÏ3eEhf;+Tv4?WEޅ6+qxڼ ?(յyd}*Q.</>$4x (Aj]r08.2 A`?>#)cW< aoYb[U1k#ʴʌiʀ ZP|z 뮽-q`FYtqٹC?.z(ɉY1ژ!ď[ب|,Rdu=ZMeӱl[1asbo2&(m<_J_amcGȺ>{^D8*"fU$Y͎Bt6(s`iM5,H!qe⅞ A $H A0ʒ_BXhA '}Ď>JPE(K,B*t1D&"VGmT>6NRz+m,րvc"-'(J뻹MEdt2FCC4Oʜ vDjWWϺ*t%хsj i jTt!Xunld΂ť2"`XPNvM gRv%ǜ͈Ze%wQ~ VKZSةf禲\q҄aȀ)J )ORn$x6Z,ja $H/ϋ̘ 3,Ar%CeK7f&%L/a=G ZZ!Fq˜jvԌڥ Ƙ*zr"YQ\n`~b\%T=+lレOP%`ĺj{?Ϣr͛6ѱdQԣmEwwJT:vkl^{XٺT}5#wͲ}#<ע_0#c$m̈tBP޲?1ХfjSXIH!jAtg*vT"*K+qr (E'J * } @6xQ h [9w mh!$^F{xAvAL@́Տw“kS#G1{i2~/}pZk s(ɧ\:Q7Zֻ#$k5g+b,5>bE$]= [e% E#o,R($J[< *QE-l\mHmpȘ `jk+{e8ˮca8kBDB&\r$[>)92_P"2I2T[+nkn*Grg^μ)9f̚Ͷ$yh EZ- &8d-YZϣs<2M89lEz.>-*`G\;:6em&'Q4 ap&BDJf%rc}~R9>taQ.mK\H^xEA7q?`cÖ-[nƾBqH46tMM/ϱYjԕpYP./"tkƍ'CYu{Ů< N? |6<~#d5gAL-Z=?]/W>hڣ7EJ/ˈH>ޑ?{/墭%ZM5JolFZMHS446Oa8xNT4F]1*[xmb,Fh8D P"j3"d 4/cK>Pݽ`K(s{़nt彦Ff̞ڵOvؑ"N֋UcZi&J}cFEAڣQ󎓫nz  !.UDSXb(E"JD,`$ $6}Kٙݝ&뵯lf疧-8UߩhlCGk7v\=[ D.; VKNr_diLжt-/ *OCqU%Hv$ & H%`z-ʸ1$@(5Y࡬i_p!i|P) ⋏UPH$./'mwyQMw@Q~8nK7㘇B;ڛut`_#oDj7]ouqM^[eҲt<_&}5:^/cu!ݰ#'(r\#ގϡfr:~\˷02\C{46b εbLbn.F? "ުapC$ e0v2sρ7S{ӏ!^Hݺu uPXBG 6O@kyvh{>^ǟC:Bx&6XRGh TT$T|LH(LKG"N8RJ*2t# ! p !4Qq[It"4X"MSm>Q]|:GF8ǰe=T-Mk*] ll :aY[SEr tKu\Xg},"LgYp‰l{4l߁x^}Xؾqawp߃x3As! q "QtO0YMKxqR[is2P`"!ʆVP4* U.)  \_ =,ǡ.Jq1U#I:Ua0y92}k;MMo}ȷc6H`~w#ToA>);u}?0m&revm-uP#چoQЃƵpOc~_e(./i/ 0n[w-Z`!5N͍79u1UȯnycS)|ynjA17_~sF\G{07f.@52䭱jk1!eY_#G s"Gc|8hJO2 ۪1I8]>{bn Zk~^|6՚̡ F"8bhK&D dҴDCa\(Qr[M0#UK4(,0-͝}e3YsgUei}^E~ã.0Bv WqS]ω@P Ext-`Jvli# '-mulڛ-RzPT]QLؑD+px%88 G$I:&\X뇈@fcR2t)8(b rX-I"^3% IDATF5W#t؎Icfq'g/z82epnkρ~T z(V<U _;( /?7 O3ȹ}}e ~f_u8t׃dG.!W:dl-c_ jɾWM͘{oo?0#sz>gl=yxg, 0sr%]0ftJZƨ2ڕak{K0ۛ'D;r x>ϯSo}K=9Q'e|l?|#N9z ;Uo?srnk(A 2`y!!vd2E4R&cÈEO˳mX&R fjt&X cS`C"sӤI7ol!IZhi ͝[lLw=qC),/'Q׊ 0e&Jc:NBzw0?öT!6ʝB<__7Dbo^ 3*(( *>b~֛oHܜ)T&-~ oS-hFHSu:ep[7lv?lzu ZjK~8}{r[Zj/_L?Es=-~ֶxu1$;=meqBs$΂oஸͽR)xbTcwm2\< K+0,<-pbi0}TW;>Q{Uoܿut RN8ke`;1GII1vt&\&x]H!"i<,@ X!7TQ:45KaFDMhh#+$:|(NY E¡c nߥhh*ɶg^{NaC VI,ZmͲr ᚛BqKrߋK$Zر~2JR^:+[_\zz" Xޒb|MTܾq+[c>?Bhh7PI<"bؒ!xI;BmRD6BZz+zk ēPX :EiXZ5gt t_zwT wD_u>0nWwM't$sw?9Ky{߶nPǠЁ{{ jʲ҃|Wy ZȿL+xCxu)"k^Pȯ~ګKO 8w]غQYs_,; 6دQ"/^1WN:w)eG`t?IXo}#j ٥z0?cF2PzălmL0>ExPM9eQ&J+p,H|U_] sб1"Ue*Q1r8&&\Rg[ Q]X!0a<wcյ~Z=F «+V0gu&?*[BdMG.avP>2xrӚmz>r(Uċ,֖VUZ}z :,Eu vӘLW׳ 1iW#eD*ґNaي|A ԮݘzdQ?<̒%eI' |l::0q߭U\!0d(h^/!' 't:g/f*t?iXc0trY6`<زUA.w$iԠv+>}1ה?^Q› .ay~B}h۳󯇠fdg$rj.duaẒ+!Lk͚|OOᄡ=VVb8|+vsb9W \ÇgHbtCcM`l龆EW1< ] ?}BpW7CG 8/v?>9dëb^Y;)Qw+WEUWc~K|k,x̒~$я_;vb֯C=/sԈ1޲4ګ Uv5uo'>CҊY91=jjU]`1z]¥2K_-!Hʸ '{M>3Z2x$tvbz .NBqV5c}^|9=p%W±#LSRUPZy9|@Wy*P[PZ8@sը/-C>|!TGs,y^~IsN:u_y5F{k0 BvU8ti8=ec2 3 SQCAގYV=FE0Ї̣ ȹk6< jJ@]S)%p{Uر`p `cԤf@JuҸ|!ٸ z6y9%˗c론9(ߋ[y ̚KB.,''SXᡇuu9wz};,^ٴFA>[GrWPD8%Q "S:r(Rb[`\ː>ͩ(!`> ar`޼a}ɿLf_5ݯJ9ݡZ Cw8*.A>s%LBGT s!g '`n-7?'A1ic/U+`F_}6mF֬#+3u'n(>fhi$_|P l.K[B8Cq1r‰8;~Y2۲΂vϋ0e2Y -wu]LK/#[09| GY; 7AK 2b8f')S` ֊rxg}Lb5v ˜ۮǬ\)SUc~0gwvtjDty:d0dB8(CԵy{߯ǿ NB.D x\D`Ld( f V2$znj /ôO? +ÂL`xik?~)@UH1|0<8`{ktˆ弫ϟnd,X}#˶n;#G~y!Sp޹H& cTvqxVeW ٳ󋟪.!\<'Zl% 1vLH8ʒrX m ݇h8-|҈1VӦWpY#⺔ꫫ9欷S[!S&^`_ضV,l=,Js,[Ƨ`$䝁,CX_s=Hi)IÚXtIزvqRм#be\^S+Vb]lҕY^9ލHI|vœt\ lPQ\ Ƣ!2FTkNJD(0+Dҋ ut |{;s%/ʫJFsg^+CsO!?Jr*>s?Qw-mԧA3N AaFU{W 5{pcSV?uuQ5?cU'̪՘O]btF]#0(4Qp2K<:LgLzsc~Choa^Q?vs$R䮩 / jbEM} cyFx,Que[n"3g#7Ə\mg鿍 ~yo)RkFu1 ` R4PڪԄ֕0w>rO0#`w*urٸĿ`̎H&UR?-AQ#uǟ4fWu:PFTgL,0Ƨ9_۳sȗ e]LfD"pOa޹īktm3sσ5Ș1N9뺛R~!|r52ST?FAfc lق1SP޸I}Vc~?ώ -c>b~<:-{)p/4WcB: FQL+~gF̽w#b. AS߂\C>sgaF̶mȜy3"W^3gr~ꌞ1#M0w݉=2`Dd̥Bd̘ KP\//?ES"w@{}Fߧ:hg plܤ{P5zwˆ@8{un)*=;g [cAaP_'=1*T\h@p:RmXLCrs(Ђ 5(|if^e?N[@3MqR577\dBaOM-ǜt&vgm1N+ܶ '8e7kgcTI@6C>>1b^n9m CTwjbQ0F2|AM-!Yzv8bW|CUi!F c8!R(LcDa%Za²CPd8~V:48s:^[ ,`$2]g: |u,(`މ|;aG4pॠ~2?oߎ~*̱z@YɹP5w'tnjC޿F !#œ~Zgxť #mepzЭY(yw3 N6H@aa`:WdX\^x11W<\'ٱd1߸wl!E(Ҽ#ckv-*)ANz*tS&P 5"1n,Aݍ 2#%c-觐O}]\ңrf~],~#LjiyAA cL9r;υhoe ॐp>\[Çm[!2eFYJ܅}-yigvyVeOh۞*ג=St1_`\}; 5;17npgpQv[0XXޡqT? Sw0yD+0q?g4"[->Ngm/"'fCܵkC6ҧNɿ֬[χa#2r$wcI{ 5@U-Uj>smg'l^\^쁴]q IDATh`{Oþ=ȷ?7lXp;{9TpQ$̞-‹突4rj.g2wye;#"Gk=ŠZo3iBsK.<; g9Qk@$q,z8,q47gknmj ̏ so|BF߾5&MnF88̾E؅y,,l)v_kmSP?ʇ"_z{zÅ}`J7=c͞tbm[qEoyʄah$;[V UփF&MɤTPN(,ո::1~|OmI/ jIر fܶo_(W {6ʕKĿ=759Hk<b_@>2K]QC՞J/-d  \H%)۷r֕ oaʯeϫ@(l;"xȯx]gMe:4Ɵ]p:i3-V䦻3^%Y$&0zf`aGvzu%7w=(%.8AJ?Iig++ l[ew&_>ӶnUgBh()zudnɤ `aw^ 2')c" hOHyCK 96ޖ 08a g +kJ@l (žE2X*}mXbjcc) 46ǚJ\ֶ6 bq (2DA(ߙey y3ԌqFdj6K@<ɩgkw)ƆQ8}? 3gvV7ƒg.~KNԚ$#lf]DGj$&Ca"-)porK.gk/_=%( 3|e#-<4IQU\F}[eE% u !K3z1Xa[>+ͨKa+)D_;RֆyH'+cnQ} ,F_J"Y{6bE2 kV#}su?ܜPRbp~nw2CuxA;oh/Pq2l|hd{H&?3;A9Iוv6R~_wmRH)~=A%P[ cZaJla֯{Xp*8Ⱦn=\/;5SZ^^υƑ#GSDՐ2H0]$G,b= gƘeY2~ 'X uu5lxnO'Y[#O=Lv Qg]24J)|l $umeIQXEQJW!Xlyۣ1}\:|TelJmaٴ=CțTW]/7d paP_YV9}$ƲTe1(-B߅vv=|[#O.Bzeϫb8~(AяRd<۷c#|A?9m"1_/`nQ#k}K_V%uμ[Wgy#揷a"?ڹoՀrFT˿ <Li9=_}กƍg'L}Ϧ&XiWu{y.n{Pxeiɥ5=o ͛?}}Y;E?ޭ}CO蘋}vEZ_.GÄ kmqs-w5y猛6BsqІe}b/Q\Ӿ!i3>ZaZErۻ;D`5ZO:4)8N1f9T̢BnO 9n6*)a DHs'w{<`?zo׮`͌e<( e¾m6a!Νկ cF#]0x¢ $UfrS7R)VݫL/ڬ ={tEU^pwNA>{*>{k`bv2}H]D 1k"hCPͬQtM\RFa<#i|\V'8e]b(-#FQeio$:d<݅2v >7$lVؚ%It['~[5H7w@% ̕!72>1~$'Pd%m2?Z#ݾDyp;:>lV/gްJ,GquI-I$ND3Q$qOpq1& O娑?wVS\E|xe׬IfwlRm47uxPaU2BB&d]w" &ṄgD8B}"NȶJ/OyAJ+Vω7`EMժ뿣_nh_}Pv7tWѨ}Vodݣ=# .ō}Jܶ{XVQې._Zg9uc_ EfL{=I>uAYY.xv3{+Q\X$x8wB(ݲE#UUjIй;T^ԥoC^vVo?!?zNx~EŰ}2|Y›֬pwiS _ ӫ`@>uWQt/}|޵iz W޹S||o`}ѠNI}dL7cƎE=;tCM h}9ݐPetX۶ASVνFP3LrE0qn`M|Kn-?8|3{rx^9DC aASהu{M#'W0O?'ǞbܴQςX @.x2.#G2訾ƶꇘ~jc>k?kۃY5{4{ c:QCv(!s5poc,R)->{qɋp~b]iU;>եแèek8eyA:iqBJt!Mˌ}wBCyOvk ]7̶m(q8gLC}_]MQ,;?sozwٴYy.֦=5,۶q| ˦KQloifxi)rPLjʡR666 ף BQ8Dؖl%'CuCX4^" G*& v- ,/^;C<qls,DcG{P!:;y!ٶHu3 $EtXPN1ߞm|,d-`j9=`0]8\|B#GD( dѾϯwǟ`uޯDc 0!D&〟3F!~2uB>ca(-,fk{e8(."qhN&H FhPUXJ#q -cx39!XN*wiI7KJ+wD<ٲEIV u<'yN mc?uAn%ZL3k@2 /< 3 g'}Ë?y²5sLٳWDzbDi ˮ?=LAsA8yFo esܾDV^wr%'m'e΂sŴ'_?>{LumDJm91qY J+{ @sƫj2sea"~FCo7Ț/m\g#"0zuhqT/mtA BG3,<=a}^67-V{3"ߺS쒿%^>F G櫟byVDYJϩy^a? }عEє)H~Z?4xs+!c[egw,qR;R}6iMP:Ͷu)R'-ࡻcΝ%}`:eK;IvTmoوevA\lݍFiHiO&T2H]m-$\v=F5 O0mQZHy9"PN6ЗW/mwúw5x% "9*!pjP$_z' HD)޳gW=w ^v.tW D `zH}HKʂz9ZqZE矓ꀅ{{+fxBc4B6KUh5U!?g~ȧ~wCg^pL"kW9?3 a^x>aZlѿoyvb{Xg'62~Seǎ,a#Q, `|0uke٩gn? ΀^Oaǂ瞫(YcyШž¿Ei۶id)JhMDQ9rq#cճfHyD0 %C礣$V_] gAC x7VE)䯰1z4rYO?v`{6Ơݣgf΃G.nn};qӱ!<4/#f%=2e5\~Yҭl?hꑇQF 4 M34Duvv!Mb0ПU+fcO>}=O6 J%C0Uao~ûcşvͤxmM2f7ӵ=~}Oz)cB|?G~?\kߏ YUc 83[ݍzRܙxxj¨= ,-E;k`}^ڗ_ݵ0~=_jTNҵў5{DĦg:>ݻ>ryU,%ÙE>{wܟ󙵡}5>8/|cKc=_sw~ -7=_X'lNΑ9q]ɥ?<Ӏ]k&eܸ;ZϽpڿ*/}ɕpι\$5>޻M!׾GcՇgی#-yϻ#re +KIkMC  69KW&5?Isp5?vk`  g\:þ6xm6ǯkpE&.ʼnA5TvT%O[f&摃5yqh'wfK/b*)JbVmpP 6u'\O0,agSxqB"|a/r'|)R[dÞݻ/}Ι0qĭ+:@J;*bs~\=>xT35ǫo q IDAT+n- 50ztpuA6$CUN+X瘟x%fўY-*pvPaqq6urZI E`)|E|g/ݱ rg޻wpC S6ba@zx_wy }ן=||gb{m8jT9PEn1WKH!1[yghx~͢@з\z}yC{v|¶㱿n7ز!CO< } zK[rYG^Rm Lǹsqn}o2!wVnfvLX!4̼1GF÷?Hd:t)*|>_B>gzQw4zxD-?DE/f-:V .V㩹I_w|!~=(;\;w_^F}my`Ϛ0𯅹\pgFteA>[.K&(3.;@S#p#wxϑ֍Jɝwyw;=[<^{]$FP=HܟN: z=\?"Ypȇ>8AI~#1J#AS gWc?zxvdi))x~_yD4ܟ>Qz 㜺뎨D? 3랇[|)_BE/4Ls v[9];oa_9b8c\Rn)1{3{a>=ɳr ȵע'hGTȧo@~b`𬽼ҫ\܏gG-cWl,8q*rǣ`~zwf 376?y/|UfTxv|k/=r0[be5\]5zq[{LZ:;}s „OB4#M <%T۷Q .Jf4s;yaTbL ) #fgoG UFfǁb#7>hJ-f9R8s{!p_I3bOxuvb|kHRqAMba*tc<'BUx;q>c_1 q7&SN]xW_b= `.v{, f:btCJUK*#m&ggavj.CH1& {|sw/u6t\8SSdu,fMț >W;oG~解޻\mJ({/ h~[Ыyy"FkHg ~+93?<536Kxg/A8ئ6}_?~}k>1/[?pg?bA@_ښu-|3fiOI~QM̳կv.|X G7=gdێV>w#RP|?,."68K|.a,ω{w#dПw#?:ėȧ>=W43?+Do|^\"}O6Zߍu3,A~Up/{xDs.>EB{GkWO=pѫ{7Ga㖖c ϴ~=H|c{ݱzx+p٥ӈF_% .2l\>s? g_:z=Tًĉw!xR{(6;^ʸ'u|NڅT]xL{Z#`}ߟ Mȶp ,Z{o' ~롻^~9z{)YOo*p r'r"W4q΋'B~cpD5_;={ǿ~_ï=9tʩ}>x $k|ĐO}k{!wڛր;ݏ|Ӱ^qEjw G[/^q煗-O#7|*?u)3{7 D&~_t3 .,'evd)q"FK>}}GmbwD 7_;aH: ce3π;韋{CE6s@wVgDTcɔXD0P% 0;5K6|I}8gNiPR^TJ]̶R\gFdr9a7EENs>$>l'ב]qK:,˪>ȇy&@ܜz][R\~OȺЀ7Â{GuxCqM8L%/Xۍs,ы.{7k",dyCǟ "wp%G_! O?=>1oFffϞ(]S\P|*ҫ} |c$FcE%<Ë@+L3t3mF~q,;/FqXYkaIG7&*zE~/PsΉ kVڻs";"|E ԤCqЏ}</:bM>Hͣpx2OCjM6h~x{W^sbRz=䦛aЏ^ux>\pa<֓wv{ ޳'e1g塇஻b_( (L$UI6^)c8dD"?[Tš^_{,c jXq 'F`46p%x u睑87D>M߹P}|kL|w<9'zyJk8hJ^! uEeZG4z{1tFqpu4[a|g*z""Y J$(/z#KN0}Ӯ{?lX@]PIMK8 j͹W]#4VE>梏O5gAD^q@kbLp!rlGϗ}yK6w5 g`>xyǾD%Ѻ Ge,,1 &sl {9m~:x:.+.;H Pc44賫=C 3+նڱ 3 VѿsoնVj[mVW?;Mq-y,F ڎǾ(lq5屭j_3(LA%|F-7g)Q "V}ҤMP`԰B{vȬwɦ;(tHH-4K]m^x.H6LZ? 0b[ODui|ݢi.}!}2}{,;CШ53Fn/6eub G-X8]6Hы' BmO>gs90!?J;u ieT! 5Neh&oMR3)k8txS̷:{zeKRN"7pxG/h7M(=,Ɍr|_7="to uTKUcɛ(5 P qWNH&]\G!ǖ&V %va 7bߔg25K/):S,~&b5"$Ts|cYhs-wet=3Yɝ)zRQ1?=XİT𔢬RR (U)4PUOK &,U+0YFQj[bPoP;x?Gj[mmվO ?v,ZZX=P@}}N.J '-11b>^tټlkFtyw'9T}ZfZET ӝ'WN-bK/X.<,c ޓj#s<퐊j̶POwW9f*U(BT9#qZRt*bP4KoHE(E ^Հ DȰL,;̿ƈmXL`1h"%EF,eͬc`G\Q3ھFu胄5xk &dFgHAn:Z%`0U%b(JЀKаfMRR$ft&ϸF x0ao5Qf6:6]׏yqǮY#0mY.T9kEWmb" gb$CP1(55A5k iYt#>4lp/4d/kh] :\f"!tE]peA%%:/]JMhּR`%. ڬ4458G\qIb֘_XNt/!K){"XcDWdUt$S3/hؘ8sHrxT<'(X J:a*šf S?ýcN{mB|nm IDATb2~6YO؟;jv{$z  ẕ5sozh6$:2ix'=u*dZdЀ5nԷqnꑻha2PʼnmPFA&v~h6)٢5}[FDd $}nM4]T<Ęhln`+:1~cgxoK>V}j8uv^b[k.S-`(|mԕgeq~:n]Eoq욲~1kQ -0$iST2 !W@)@: 0D5PORMQUzgļ*ל$=i\DcZ)iE۰ƀ5Ҭ; &bDh^ 8gFQBwr|}t<޹??#.֡5Zk&L@!&):0u(yWp`iӶaYþ혥WUjVz}v3:aN6䎕ғ .2ke"fgI.s *%q KUɔsLӨ]|*&n%/i y*@!sX05G]cڵ;[JYL e]% E]Ym@CdJJT&,uG~X,De_жX.L9XJZ.A*q\EGDk  lJ/mIZFlg#&?c":Nq. pPiΊW$6%RV%Yָ$@a"pxQ 4 禕EZ)xRe!>읪(HH׾9G]8=ceZnw驩HUIj`fĪC4f791a\mTg\^)Ldʘp;)MeFXtF;(1##LUҀa M$ `RUA][}42JgzB]CW,,ӳ,t֙bCf @fDlEР^^a 5, V3ZNF\WG,3 p\tfZӬi:T^RӶ){A]$IBߗd6cygV5.q BM]y,[^+8 ~,FB4 jgAR GD\J$t=:yljcZѐKK%*x2\ U#́cLG(VCL<1IERC,)U P7L_<dRz%IrTたBl36ľ D8UyUE&XzvS'tˊ6L@<GEh*94eXk*9DI]JCLKh-Vv|'w)>WV1;G<R  >\J@9Aa2fzEAbK E((N%@(hgPC* ZޓؔA]ls)* i2DIx 9UiXBM1΂(u]ctdUXCkxic !0@$TUqbG%H:sBQ㲔WH8=Iʪ/#W V1qHjWӲ=Y֢QTuAr&蓄\ ET5TkM4LVBb!-]j)1$$z/$IcāKq]1H0ԭ FZ%ǁ$&$x D`b\eVV>SiD;h~(c,Rk(ƥ 8k5Zu(&1Ɛ$9C@$4ml\ \QUK5٣j_bȬÇ &X_xpiFwDό?"Ьmc#O=*b?4$%xXC壨nJ@Q.1eb|DUSb+  18q ,M%XXkki!$4{qDȒ6:HsAk{j~m5޷RNBQl*d6ltl Ҍ 42Vw% פDEA]Xg,UQqv=yrG"ǡa:,Khn= 5\Yjpa%˦b0~)qD/JT iMc+rkq6TBKp.SCVXkIڄP!Q(H#BRؗe3+KaJd(O+˩FNCȗ}2 Kel6EWkzNަ `@RrTmPcp6k<'4iR#$&c1nY9^AieYڢ_di\7VR$AKbV-ЫH~)ڌ*`He(i-qXb5%lF84"8,Xb *XuM+iShLP,XǙ庤m7$6d- Я*L>XxZ &e#M^bj9[!Is,^ )b(I[ SyOb +>$.*<T IhBF($@ؔR\ Q$VC,q.􊘌IJZdiW K`x3ÊIlެcWC2)AcdQѐ4{,;/gokۖ=sεgs*(2`d*EPa0[ )Ď#JDIؖ#Q)RqdY)Mll(:iLmN~t1=VC {5c|ZjB RPkbugܔ#Y*4 \ZB!eUԃ qdl_wZu(R3Bp?'6c2V; )0ĪEiQɚ2ɜ+V k7R[?Jcꑢ:ЕdzQ:!M?@y%r*2MoO|g ~W /޹&]| ][-7E&t^7L *r2d~sŗ tD@_ U_K̑S!$HL<ǘxu$;NㄓO[kC'u %qYR捇o6Xy:L9kZZ)׵wdNT!ZIBpxibΙ9G~`Ӽ⬦Ő%eś>Fp3uOR,Ip3lzYú"f 3Sူ}'Z8/8m׿o,BTUU +$!-4\h~iJ,N(sh9CHô4ױt :JF :R0, $`d-N&Shϛ#k%|0*dmOXesncG4,߰ IDATJs:4%VxgPBY,<'u/6+ BB[MAXJͷ X@ ,!gyc+ IXCkWm "8%(K&8<ȅ׏b#[+}*LԆSx!ELXk3h8RUqp>my;Ҵ0.329%*4ӯɿg M>/筻),W+|:n6|?Sf˶U|-ᓿr=Rl9-^;l_],²Ď8oc-2ddeq{vo_%_/M7_K2QSxTm~L{:މT. Q{(~)oS7:g^#zxɟ>K| .q9@D0.|RH,/zgdU⟓%}/fmȏ=;!8cXXcA3b^W2c\eUJu~]y2 JVԸLLdXYR⑭֧1lD=HӱĜُW7{xݲ5q\d.E۲UrÅ7%j1ڠVkT)H%i_GvcLqQ8g%#[k9+%V?$vyw˂@Xϰaɪ,E"Rіoy:AwI$H"L=,YQv?tf \خZC Ya)vamS qXUOZBK(mXs!̥3s5ڝRh0Ze9ŀuRl{CR5Jy×s-ZC֦Aڕ\[9ڄRd)h5iB%hmkn9׼\]۲X-UYOZ1kNʰ+O-P8ֹzT3Gy7J]1 һ iB:O;8TmhE ۶`䬫RFq%R<2.Q/1yrg #zvyυB…-q߄$׃_XKzoI4V!%T@wr槙/Y˗54òB +D .e[@[?rxn?=N"` "X_ Hy-)_6-2O|MW4?w|ןབྷ<6B,rFBL<8sYN#Y Hڗ29%Z8XWqZhxdvjeNk !+"0c4I2QϑV)5UZVЊ$¹~2Z9NRJidc,o s4hmyX .EdD*yiM=9jCF>g)SU s+,I43F:5sDS9qX K^BЩ UuR(˔2[+0@<Ӻ:5|C #%;gks\vEuὛتY]pڰV.j>h%h~Y@CA@du>UUJ}O<(EBY>lU2/RiMeu)Oyߏ6e% \wU_5{Hw;iL@ZE^ԯoF~_']v+d:__|o|Io|~;" ' AIJA}4$e[5aB+3u jUB{@hM4xchBgsb%y#jmܳm6\8Oac} idyڳ5p?1N( iFj9Z m8z.a, 5;Rp;q=9WTI 53 -*) 8NjÉj)qݎx ?3~EhERR:l^ooyQFTOZ"$Uwӏo|#}_$kd#<5N:㯈Qo!9y_ #Cm +.ܿ+g>7>il `Q%k~n ("~~G>!|Y%fH_ܭy -Xu𱯒|ǾR/|H >./W+~dzn᏿fx>O9>+>^:Zw3uǮm9kwjǁ4bjfXɣF\=ޢtv8a[ϼ,4XRHsu[;v )Ҋ뾧 9&7֋{^ 00x.D#َ߾vK#8m;t[{,3TYۘR@Ajy,\ס-NW f)൭H,Ky4C1q>_-KJEn•tyWh9jsBٻXĚ:FEqlv\Gr'.>1Qӑ:0y\l]ǜxnxi,藉znFkb. stqscW7Ƒ!k+:<ۖ4Saظe ae}=ےpd]cxqس\ps6GvhcHEc,ӉcՖb<%K6pB~.J"ňt㞍 k:F` R[ޟy#zʴ,|=G6rqayZhE_Z*R&j+c<A@ja*sPA-8=n/LNH񼘎\h]Tg,O*VEpOs}<ҺĪ%;8*#R+Z1ѯ>eeX]D;˳l%5H<7"qYhf禍4"&RX ߂8l8̑m>RSwӀ-wǞqYqm[w7zqIIgNjQ#WM4sf.w;aHiˋ="(Yye"l;^k<'ҲG)]w3-hg!qѴ+^hM?P5~6 qM@s.ܞ|Rsn#;Y’CNh8#:wZ3/3R*nw&^ر_kZxYx7 (q۰gyiYsz4繯 Q%f0]&^i[@߶]n,Z_ IDAT#STĜraZ.ۦBúm=¶mƑ,-\'㑶iɹҢ\J|1V b )F 1tLWw;)%iSX!V@T%a҇y [h`M~]9#AחĴuYzOGux]-Ӷ@s |&1=jHkmx@tRǐii83F+r¶xc?ww4]iZC;4:\m ht5-Ӳ Ly?`g~pZq3xkrWNP|,5zBk#RKXHP s[s܅:Nr^<+TEx\ϫvXc(N4xx%(cه+Mǐ0\im,<4òm=H.;ЖGM>:i5 3]Sy6LܮSSOZy`it:W6]C-ȦMG.&m/>l K)j]ݚr5|avêcIl-k>em4]u_mܯ4Rflw~ođlW/mG)u+؋+n%Nhyʼ~z+S#\K5h% g !^6@Nx'/{ ŕ?1}šxglo.0QeFb g]9_w^;3/ ED$Kڛښ]5}pOݚm;vwN`BlG2`ȑPD"HA()8HIVHV(B%;Ug7?޵]NtgyPNGf?d? JWd ʼAF3̕}fYH/w~GWo'R֢sx{_9[ʛKcwlj˫%ihJKHbá禩p ƌqZ.ʰjǞQ azJR f]0ĺDIe.ښ>x*kmjV<5FqaAf튄Mcq.0ʳlWaGg+xpvŲ2́ǫՙ6#,K[S[H5Ge'[̐u4(ѬlMVq깨tMM0ymq3cJ\550yT32mCsYLZ4WaQU-Ҡa.MPdd]c}YKU ) O6 uCeeu֖u5ԧLU(Qu 3)p E07hM[5$\-jєUEchZWTQc L:u"4 X 8UFk%RYZԶ"LZ8rYcEJ[Ub.ZYu#Ť,^誚5T&W F}U֚j~+'E(*FsQL$@1V O-/93@Ӵ4ZfbeXT(sP7)%VmG>עjq\ EcDnqR\Tgm2J:̺]f-UL@]::j-JYq<]CSfkc nn uͺkՅΙU%m"ĢY`4YK48g-VkV"j.hK[Uݠta V q5`ԚG%eǙ=dW pe-FxYC[h@ ]C=ȣ afDnX?k:aZm0NGlNrXgitmKUDj8Qx%ZbŮ0J1YZՊ)eqPZLZ,V(bX+3ʑtX]DhExtI P4b'heEF\›2K&?KLcTNJ3Y/kAeӰ/f{f+Mkq9}")haeY;slGچEغnâiv%NkvMIeLe]ɬRrVtMΌH054α p-mUSɠ4STP0D}G/ҢjŚa>4ZʉEK2J#' c`ˇi"ɫ}q b\j^\Nh 6zu`rD+fo|fAΖ?5|62"#ͼsf~+;|0.5nr`nD#|w fuɫoj*4ĉ.Ƅ3Ze{$g3NN_.Vs?$8}c\\CLI\dՄz~]8Y$Js?fsʟJ\y)7pz&g\AB<-?s ׯaѯ1{_{OOԿ~׿Ώ칬+Ex!pQ5> KTfXזhXyirUPˉ LmhM͖"J޲x2gh!(*O<Á3ϟcЏ^fDDU杇;4~!0|(7aCH" 7 ̋϶{f4>v-S/WD7lTR\/kR mHs﨔b?=y"m(0snleGAXowU1Fa"q=(i01FއyDnp)cr E=Ϸ8my2H x9֤y&Aqp!991=1E4s8޳nh~![RH83{b=ܣcx8Pd>#ĈO;Q#R@N<6X%<IsbJ<췬Mv*MIf7H r]سq8 *m$c>iVw駑4`cdx<3ׄ0 HP j縿(ŦJgI8R! a"g,!#E3O[ @>q~y{'Iyv<0!)fxv<~>;HwCy#Jks[gˮai:#MeQ)pwU d4iRn<$v0J|`m H#V+6`M!<0 '<K Ϟ,/wZ*N]dʞ(Ll6\X+xæ&D4Rbҿ`B"{\f%="M6g(2u?'K0H.Va՛5϶:VT&)ybE?τXUC՚9kF?Cb0 ãp C~'D *'in=;[O3햔F8nsO ϶[ 绽hy+[YVa˪ewLR7C\]>kn+3ooܼn]͡gY5dcEiTa7O 3УAbF?s 3iec3l#%)r;i޺۲&-Oޱ[@SY>;,Ail׶3qvG*`|?mhyi1#:mxh}WlnINñG)8z9))Cb30Zp@mN(B C#jFaG=G*2h A0\X#.Z[~|! ?w·Pe[q'&ͮZ ._oxSr"eyF)>_9Ztϓ$ҋ$4¶Ra@[J_R8͝/8 972K=O{~!?{u$TdiO|ۑgfE#9uzp_SYAVWxlA>(_ wbxET4\[o7=qalE񱇉ԁ9x{'G|ś9=,b q,jf\-FqߋŪ3yve-ǬHE L&!1X6&iBT<2)X)Sda?vߞb<3ƘK4c, mau,d89ae_trA1DU bVcME L*)8.RRHD 4cB8Z21rL„Dr$@39lM1Ce4T臔1*J ȗ$P 9S"ϔD9I ,CGsf朒tuH (Yɨd\ $S9.I-|ҦҤ$)g\x *C=r(Ŝ()bP-LR3k<#tC1l,# a*B"1G0u#ɜ 4_Ϣn?QRBid3Ak +<" c9Ӕ6b#H*\NLqNǩ c8,L?Fj34NŢc'3 Ԩ: vl136}rɻ=wkF2Dk5Yࡆ!Bg4CʬTOI}1I'L+"8'9'r,貎}%(mxw\K ara8Um_RJ:~d(Q8r1 T&@K"e&Hfeʩet6sD梪9xυq8V+1hkB8Wr&(] ѳĒb8Q0!}`]~N c!\]B,51zuYt=;Y:QkB9*M2YBh1കtDIIQagNl1 R{(2*hx"N9?E: = )h'*QC$1դp%`{a c9 )ke/SϴbF8:D.vK3')!U!B.L,̀nAO!)$gsde*P)aE,Vp!xSk`&? k{ӹ[#c0YbD;+q9 | N1F؋QZhI4 + $(SZX…O|Ac44ڢnroMU&Lc5#]:ęZbR$UӪ0'jaIJkvb¢&Ϫ2{Yv"3f3O3_ZvpzdșaY.轐M*-amJ&Br&*E ĐFI[bsda?gZ+sTΡ}$ZA AXcBL4>$rP YeJ9R(/tֆ{LI]أ 9` lf펋 : w"0shDt0NUD!5) +"c 4Ƒ@TѳONE%$94 t&G7bbNIX篛2·#X=K! ƠP8HUƒi% 5,O`5ljESKeTk [Y$**jIY YI'7g36zuŐ# .)y~w滿M䁏+4PYd'V"3$xdUF޸W|߷-^bgΗ? ?3U~YdAa,HMo9WcVװY1O_P9OK+>=:뾖($2vc&F!>ә_Ͽq% z>S~Ϭ{,NL pxϡOrӿ{6%??g./Kԕј Ie$?f2@*D _e=t&Lo|-QQB:trd2in-!ǘ1*c3,NVetZ g ?e_R`R+ F IDATI(R>UJo,A֢g<]w3NK\P ]XEjY) VrJ)!;xJ+Qz`)\f21hX yB(S:r}̔ BA4j8V8BY.A<5^U]9KqӘuIRLsXAD E]΢9F%R0,Tg.)T:ݍd,"i:_S-˓3Ξ5r/|Tw,EW}}"]}&Lel2ǐNVjS_>ͲnA"VT).z9\%nUZZ3L5hB2Ң_)3X)ƈJ^IY+tQJaJ!oMYZ{{%c-)M܄,Sxwy+NxOdC#to|_.3hM!O-4/k rR&/^soVO/4~SRH=7x+ 剳%k!y@n3Sh*r2ۜR&)!PɑW-ԋTft}r`Y9O|׭䫎{?o#t84-s4M#• x`u(S~J3pX,I>ƐbZ+5 6iL%ڤI+1蘙r{@qd , hHQI\U Cc$kh4S<'rWUyUJ+N8"1NTb>>YTN+ MI^I`+%W_+}<B%u]*RJ0LOdQ!$'$R/ m%] ΞI QIQ $ZpIty5JbB+˳ծXN۔@Y!T!2k)8`^4i8e3*&nEf#Xy~)8iY>IRE1wFc@ٓNH'fm]B"@TL%8H%=՚04UM@ӴI I965Xe֔3ld?t)FY[9/ $+Em1f-cb9' uML? 4&R)eJʓ8IL%KE>PmʞϚs)<ŮiKCT,+! !t[яY:J>1]y1%{/*'x&*h L|S?Ÿ;vo=`Ix_{ +Đ4_U_z2ˠQW|-J1'#U?K_0$k~'{Z7>`Usil |71q?lӑ1jq!D)cc'Z1 1Oh#hmFtXA>*I4-8`m]X VN1HZ-G]7c @DR1DmbY~%a3 rg?i֕[Cjԏb|:!~: e|R%Y$+lMӰvbf% ދ4aqY/W0B<TiwDikBI<ܵ#LIRd%%*ɘ@!PF1 USIU`'!y)֝:)&uf%9\\^p<J!X|u2p5ł(J7ޓ ܙvcD\}B[6 ~TTg9g\qY=fu]S"qX8,VKbӐBisG[k$r_@f۶eڶϓ.8k8R@0d\*- <+CքPxJHPB[UokhRZWly9r.0VbBܔ 2N60Jޫqi>+gOVإ/1JZٓ.uBօT,d>#BL$1<ϴM&l2`KQ8G?{lS01Pյ$n!t&D/FJwq Ɏ1!C,*F(v1jg_r RKDI:M0Re%{04^rE|"4Ia$ LMb'brnJ(nm8?1zc }?@j_OSΧV.1V8Z2Q *Dl):m0ƐSY1D)Hu c/,hŊPԓ6ErPF5tXW3QYK a@L05sTopkkx-,[C7,^PӀYt?SdA>)ԥLeOS% IRŦj%{~1ws{okۿ7~1]FO>9A` lhicϟ.÷~ ?CS~6y]tN_7 )/?K# V<յۗ &Uui ,Ƕ~ѕcJ.BabSdbPlkʓ*CVxnZO|*3-h~pmJǁIj9\^.9ԫ~₡1iD$Y.d4UUcX=޼?,k-ݢy $0p^4l7qSi Ŗ˫knxt6[+qFZr/p1a@ݻmx,.P c:4e:̴W w45nOaW.Qזq5af&V =zNh+6rnx4KLjQ'T?y+_A|sU+W=j*JA9ͰY,V?y͚ۻ+BXmX+AlUSח"cm4aĘF !`+{*[V%=WnP0&,uPFBbT:fB?OLҭ:=⎲{CPq|R]nug\3O3>HeyqJG+v-Zkk|=5ǽc xjE?ԏ-ƴ0pf9ZY7SFYǰ߲\nTWyx]pDl?<~564xd$ΞWCah%<"$;l^=7ww8zpKoItu:4"gY"B:pQr&dgp}U34zϪk2az#r>gl+ dig?_{br.}snU͌}0.ezN \m}֡$.LSæ953frـGv s5 M2h ;~org@Fc?-Rw>޿rO} ٍĶқb)~'4)&?}7aJ07U2Y.Ci,J)<ȯ|l(.5玙UC/g2k+,?rCb!^66'и)O%f\_*X ^,Br=H0iR0 jY?c7T?f=' um!]7}%O~=A(PE~vqbpLM,0,q IZR'AnVMd{ܟ9|#s3/h9ҜC5}BqE}}-'|*B.]3!stuERPˈ6e[R/( Z/ĥ%Icsr}75e$ 3$1l)!KͅԬ &c姟%Zwͮ&qL# ń3- ^gx~W< gO&\`HUd*9lDv5v^3ӵWv_]qo^"XtgRf8݆Y'̐eQ$ۜX]H)2oRd}aGBf0mc"71Յ.z"M-&L=V81ae *$xy u|aw;=Kʧ+) Y> 5<rV,Q@ 4V ͕\KZH(jB,#N,$ˀ[RℵgR+ ıLy)Gؔ8#h4~`>||@;OC/3zZ2cUt81D#6Xb07E@yb$VLxz!x R/BJ2'pA.=F-v)>Nx-٥ۻ=SSYIf"v&إG aDd3JЂݾ77[>}[Tۊ[445MNw9rbəglq(ei6!ꊕPPV1ˌY;)﯀d).==?XVBƮfTg<Д'6 ˌ &bU7+s3Eݕ]i s߲朎'R'248 C}85*N!eS3aۖy8#Ç#^.FD"^2%&Du25` IDATS|Fu EbVURXA"%Icn0, {1yX.g㉐'tWM^8qؤ+E-̤A_ÀYFჃጊ-i8n=7v9;Ըڀd++6ۜPSOH=}];_kԡ>lCm2J:8a@ ȡeZ5陛݆)[ә, C3"Eřkȷ[,mJ07LTVlS٢Mljȍ4 0W6Z26N3T~e ۊ7}i1و74Ga}K N,yD=FFbb2;J,#jj)6 bXn#gv7'g, DZ򭇩2EGvH+ l c63c_5VdV>"LHҗȿ' ۯߒn =w7.F`,-&tw l_vx.G6'؈ZM@6C5*|qLY{أ yňZwJ-Jfvv-3Eأݷ$;$0'izM<I@t o+o%sUF/_* ӑ`,nYE5$*b5V8IDw%C@uf{4uZݥTGC.6`BKa>/x$ӆ~31fl AČG yPran݅lpv!I$Eə1,(,ۛIvE6GCō'#CNI?w]f8Xf7qa)ne_w2,Jp$?; bϑyϾ(?Ϳ;[P/K}[|RW+]TDɁS?J^`+J}F'?>]Ɵ5~ɧ -KU_ɚǟ ɹ/Ŋ@c# ' J]^TV+~w1֔%×K?Q9Wϕ.%wA†_;E&t}#铗?6lvW?lY(?@u| կ.6ym533m3A6iivі\#8Q_ ]uelZ0EnĘ(SDUuS1T= =2|x{$d#jHyЇ[3R ~ MܵzXQPW,G4:sP` ٮ[@VOxao a$ ڮC8N, PcZ4nIF&izߑͲؠy: ˴fpyaW/8852 0S^&,x燆ni͆ˇ+Ri6.XT'e5uEkG,/OMWX1kut;%׊o/Wϙqq"84(1iޭJ"+bb;Ʀ$8P^q,cK}5mRi aI1B2SK8/MD3^KLp0OLCG˙ZLyDl:z&r&:o3͆<"\D:u qۀ#q<COq{C;ԤoqVp<|e񞮮Z#m.صlwD;-R [r8O`N'4 kHZƢ&,ezysԭ)3v-8MꖠR+L⃥dau8~1:V(2n #;ܰĎpȱlil.i+>Oӵ=6e:f"%3a|)Fj[=K۠ej;|b{ҢkkyD0ca[$Y4ڦHJyE=Ϋ:Fik28^s0-jH)Wmp rfeҴ$774- ёp{zz JbY%t v';6e'ȗDW "4ptŸ[WozgY[?nj#;AٵF~~V ${d_ߣm__haR/ADicVn/_i|A{/~B}wq^ %|"9U~!}9QkwhfVO 1kg~gBPE]f>T_߰@lFxY慮Iq eG^:LRRH,ՇGIG,C喱I, 1N8B i\3<'(%uK3M=dwƆ5n@u ~y~f@W^V2` C}q%jƥgk0+hHy啥ta7wBӵM<|Pk |!zKM4=!N Ӆe,]ІT>ΫA$׹ _3wґ6g̫H7u1!Di}!%^);STh^#H{ھEk?lޡBN#R t1j|ZB%EN/jYBHVh 9MMU3.3Ϟ9zpiT}CqiڱCCwY6ĸV<[kʲ3]UBJQ1Yi01-Y,bYR9q4eImQBq:W^($E2/(!D\蚆, D!jƺHIXcDѶ-s7ۖ78K mN]6d-R뗬j>0 2m/o\Ql6\'2/nIyY-0[JT5zDv2됤Th!ljemNWH0 mdd:4mi ;. ȨpCt 5-@_չkX#Ǟo)-ݥ(\6i e-nL0vDxOsH_m_p.0^\Zetׁӏ%:hgOh%Z+a"Z`_; =H1Y"X~@Lk옇5-~sSh\7ݎmHnn@H|cI_m<$ez蛖|'7nu-\E3N^+Ѹɚ61 }Sa^_ӲP-\1UƢH߮0ƭYa'RDdK]Crس f,ex6*c{:"oHۻ1V*nbzq&e&/6T=aY2Zڞt{u]i=2J#y:޽|ӹ$|i޽m(c,H sKs-ӈ`Z]]; w\NGMN\QaR|#Mжho7tQI`jG›HdYN;,ajzQ}髆i3 8$OƑAn$;p_6' VOSG{͞i o 2"0L&LuM8-sUGMqyӜLخne4MYriKyVH$8FY0fukSƲ"06-J*[KMRlY R@۳T-}Kb_`8`&zLh㘗դFd C>f)H2+C#8`P8HҬ@)ͥ!E& e>˙N+|(DhecZuYVlz 8yb+`GiE+Y=?>__#?t&Y5?g*HËɕ5?Fʘ} r;"3Uq}D) Ye|O'O%w;(Nr*-FV{57/pN~Zȫ3{ǂ~.$FX>~{G{#쑟AzjگJ?_Oտ:,$~=q7v)F VKkNIP cOwmVQ`YLjy%S۳iePVuZ %2c\p7{OӲP4HfOkLV` i͞-j DYOq𷷈c",lf%m$cZ7|Yz#6;˅D85F 4khadn^xx3 ]2 vnT68)5o~g||>#o+=. hb]uEYM|n&K("1MxFXд$r-&М,m-M#x* I݇giuDK=T+tua3*I3Gj%B [LH=LќO0qٖnx~gFn9%Ȳr%/v\yJ[Ul &˸|vH[spp&]ӷ!8g<']d84xd ;gr?@ե"Z %\Sk>]balzjhIW7J$rqBƴ0^k0x%x\OlO%K7- OO,}Ӓ%~ݧl Yt+W48ZsU+My)v{. 4#] $` lvh)1!l1 R*LE}ӷ-&`6fG]]|:Tsc2]+n\ v1#?#K2q=jB:eDf#2az[K[뺭q3(a eoouI/&ax\hLz{@#4bk8LՅ*ەRfje땦kXplW_N,7xZG.P?>>qyN{>3 3v2W}]2N 1=Jve)<7my&S"x|nk6g{6oo9>Fcӡn FVʓ2M3ih|"4)FMASE9t= ~|fi]spqiڎ -D`|:bV0#2,$Dޣ\@맟OO!)$xoj#KR>{nzgi (YYmXze]y:C6Mֱy>ƞa0"gnYf"QKi @9'p¦g'ݖTB È֖V$3<lsӉPKh/.eu9mӐ k-;(0QN'sԧ jLK?L<>>b!^*Oጆab֘$9EH726=4S5bYbtYFCHLL] 9Hu/kEHڧ32 TXL(r4K >I1uaAVt$ͱ$+xkƭ7TP#!s; rivJh4'r.OG6!H_O79b+46d(HXqY wHVW[ aiZ#wXʚID`zk_3)[ߦpw4~7Xږs~z@$ y1>jzE}էHmg9ދ IDAT[DLRBJrXGHfCtS0 )n ݈yKUb^DH~= e|Ä%ud@a^pyD VZԴ& CbCÁnP6I2E mOzxE_X# mOX`I$Ga]R'MS~VjXY5nv,CJM-Pc - "ç;8$#5qCUD_@g1(O'o|A Hh/Wt!0k} Ӱ2i"iԴذ7; ZM眣#kM`c0ش9_^6~1Zhϐ&nobw;ɫ~yv;bw`I{"qYw4!֣"ܾFlva0/\'#C DCMڲ$p>]Ǒ礻Kڂ Ciڰǵ==,!ry)+D"JiB MXjiNY6LUJRn@")BВ]cנiNӀ}ExQa=넔9:>`9.~xGr_ j^@{ V*l2\kfcpxf?+jɥ,HbZeYrsxt!6xp|_&#h,g{ݎ(,n}JPlp'&= ⌰7ıÿcl*$y$ {yasqo$w7kY>m$ue,6H_6t0ZvC*զ)~$O =]y%sfn/ug,&5sK0w38޾bjg~p0>Eg9b,gQƉŮtCkkzMSq9&,{eu~~{sܩvR IY6-IVO$ˉ▼<%qc'v%$߳eYUM֒eɒ#HEILz޿>N8 ) g-,3瞻޿ۿ ^_cbbdÅ!5Z+Kՙ橺!ޢ9p0j3Jmn1#}1&HR1>1yQ5qSY$7Z,WI*1"7>K=Ze||eHFY\Z\*LSҜŧiDؓ) x(Ɓڠws?y9#'h.p~C裧:r Fh;4,b!Vo\ŢVkP:jI+Ds'9x++4)ij,>6 *ccQ)H̲!P7W(K@ӧ -.SirUl<+MA$ϑ %m~FSCմh~Z)RfEr1Z%*,]XPC/W"˫+y*K Bh[8ʣ,eRaue={iԃ(Y׈9l+J.VetlFs reP^k*WXXXd=,--Q(},.-Q(!VW(>PVYq"VE1Z]2TQS*piBT[!LIFד*$i222΅ ^BVATh%I˳V2w/KKTi6$IJjFkjsssLLayyrU"Lɋa'XZ^&c|P3S{'0HjR'or8!ϳ>.rUی:j5;tY;Os!ϝctdV #/*X\Z,! xD\@co4H^`2ą LNemujƁSL&i9>yZ{eeuB{Nj5Y[$.ԖV4uFY^]!.2"ϟ?OX/Dyt$ftnI8 S( @EYV ;Y\H QdU8š)>t =ɁÜgtt٨S4EE) ,,,16:SX\Xf}~}{p<'qJ2(mYl.\8!8G<⅀+Z Xf*Z@WsΞ9K.*#Opc:f֪\u}2 ff(gZ=#jUcϞ IS/,R,`vv\.8F\.&u Y]^flty*!f\^4MJVB1.pna Q&UccΝgldJFQV`fvр.Vaeeh6h[,0?8;=Pn'&&aRcqnf뮽'Oqup:t/X,VX̳Hb}j'9S"+"8t7|K:sܛrGԉ:q9IV%T=ppQq-rϒx:TiKLҟ#* j>s$A);7 H:m}CTP+综;wХZDf}IQ(Zj?}r,'?AN}Dp `/`9 x,Ge8bq<{L23{RyݵʯB[tM}^Au Ǣs7&FBD0n(IDյPVQ Qjb!MϪ!M@҄Dri0"˳4(9֚?<, \T(bДJF#To/Ƙ"EO1HL;- B $M[7BU<%WrNq^H"@hDDc_THh&)JK]:Hx&%if\"õͥ"f"lQТi 8qLjC3Ip8LSPHT2;Ll >MCD۸6uAucix 4LLTQ6k>T(P Y-kI"^-YU<8T'VG1I{RQ4"M#xGqD+Wk,IrO]9mD8 ˒+Gd3jf%,UMŤ*DB;|<HRGl r*P3@!60Br1faWZrs!BChR\"l)QdI3n]c &$88l!MPY!s @fFB]F` Z)cYpD  ~a#B!Vv$;&rk#6iUh@p΅B^hE hBX]!0U("MU' ]bCՖXiO/K@if 6JK-mP[o 4I 71QgZ)lå I4@Řh8Q4qĹ+X,f\*?X=YLˑ#ji#*hM" h7;owy!*_$`x =X"Sos !h=ЖlYv"f3dQ}l9nzU}(5*oD$mv@}»D6ThOD2UW%i+z'8}XT&\+hwot3MvDÙo[(VI!Q46¹4%sb:Qy QȆ2p4%1QHD#4͠ (ssi&"l%DQ' G؏l-h'_ :\ BN#>k IbC{@╜5VJ.2390alӚE l8 8+$ΓC"$I@| 碎|,BDyOd- "2IXhf&h4Ĺj4A3H %&Pk!g} b Qhj\S<&k hg] ؇g0c*vv\A1p`40h9 n(C)R('V!D|!_h0{UhYK^s31m*ڷbəg jW^{%j(컌k˟vޮh%{Wftګ&OVVԞ j4*ҝwwf`K۠*GbT a@LڳŽnКދS^ejޘzi?tӴJsnfȨ{oY;T56a'o{le=֍w氧Kz׷gC z^:O}Gڕ5*5TYhMUڴ1.yÖ_}geSv Kvzf |F2`.WAךu ^|{TeY:y Abo{Ov3u72`~1*xmMe!J=k2!l/[}n覨tLd"ϕ^d( hlWh;i(1{OuLvP18N>+W97^w@>z k۳{{tWo.#Qϰ3ʲāmi\kR^s2 _Nj+@Mb7xH(B<^ĭ/9t;6Y(,m}ZG *i zo6wx׺fFfZ]]]_͜FWf{v <ƃَIBmSĈ-I;[۱c#f m98Õ~j CY #}pbM@w$ZcIb6Xz ؄pD8ed*3*[k(`3z A4Ԁ73 |BOT0OבSYyP  *t!xݗY !{D \6^q#vk#QCOǦڈ9Ƕ@H@{6P)ɐv$(B*mG>! F'Ƒc].3:41ACV{=0A.kePNu<8YlOeб;{ Boitc"ɋUɂmCųvKOQ jϓ_A+ _!i[8~VCvCi$E}z Mn4\aЛTzJ:;fbU&{N m[tiuh7@.b uev@7C1@`~y>7_7WR,&~ORwoB&SUI$ Dz_7o4؁36 s2?uλJ,~2_΂WQ;= cj3=%gaLgoP˵3R{YD686>64cQC ^ IDATCvVzWWܤhfc"!^NѻdcO/ KgjFU l /]F=\b ǯ:5IN=d6f҇ʾbz ^`%1kk#g~^O>ȣ|*5d..AQ?ҫ2%(Չ20~tm g Qcr<yV+/{/iD {N͋ᇿ sqAmspdH=A;MD/n-"ƼOq}t#]ݶvn2&X>?C{׿@Te TЗKF;ų}\) u'p3qpݠLlul5a+) tO>g|nuf[wr[,ĎHvcN7ך[롧~j-sdϾioqpElBkTJcq% /+'h<(uE4)cHQɒx?Y!*71tcP)s׻F[WȲ F1>`^Eq|bkXy]/lE]ʓEzC/wbo:vNJWϰ򝷾?珱YtMN]ƞS[K Q y^t') ދ܏SRѝޫ(;:zOE6q:7Qblzef1݁{Qg~:ˬm?u R^wy1 cl]\gsTEyYe{e ۻg[憓^!G+;kQ@78ooSAק8e2r]v`rÜP睿JYwtCcSeUN-k^*P 4 Fn!irE;L1hߛ=WMՅ%f 9돠I|:_zZH;U޾lېm)nbo'i-c2G9wpg?lQe ![n}-ˑ)5| ?Kϗlkgy&^<ԑ#Z؞m.; qvw{8Lf:`ôxg2g)sέQpckn[rL#_T_bfq?)4s-fAmʅ9ĶHmzWLw_\ur}WmTjɯ\W+וk,'=| pȚTb 8Qhmp@ yJ)(N79:Nt𣶳L9C1t#kKꈬ;qQyqXl,3^*+$̗ff.iB F! 7 0H!ъf̡=ys/bՌ';M?Cg̃?Ʌi(աr G:-W߂JY#LQx҄\fih}˴dFQ~|/o\QqF2DIoԦӝb;r> WsF/Vؤz~8v{o[}{f6np ߲^߰؏B HBvSߦ%{OYzځd1a]WŦݟJF/ށ)t1clo73{UrKFsE^6} څQYlӬ ~^Y3*C:%%jUny \!hh!B@l9=5Ǐu$iJ[h\lȞDnhc/&}b;@Ch8ӏ_.m*qڥ6z r(7s~.W r?y7pxpKo#6)vZo=-4_,V@ EjK`kN_F'e'Mۭ7e5, eo2J4O!%;_w:}O[ RHDscgU$p'Sqe/bXncNHwxWgb?JAW0)decD;~':6]`{\ݯҗD3^8t$ =!0>y/᥷|N5J1hvu2L'k Q?]j@(*QC.q4e-JIMLFߵWZ`kU)1+xwn!_\W+ߕkT(s| &J8|t_{5##Ôe:w|1Dk 7S}9,^@ofTiS^PI Jr% |Id\JjNMQƟ/PJkm{u&Q G[(9t G\!ǾÇhJG$(HWe0dy=B98ځH9j9A CM'2g//=_9u7|l6p i3̍Wqlqqbnde0G_MR58P5N<%"DFbUtT*, )mT@nu4kf&Vu=D)Z|w\S ჳVf:/)OZ3 3}0W+וv`k|)Wp@f-{F`E:Cyk_:^quQ,HSG>c$MY^^|><_#B.X_3{03TBe"jH+q\>[Z&Ybȶ>H)#g>h2t[v~H4QOEvgҵy^sCFgrI\:+f֥hŒ0YTǚ˴WٗEx])VX!M\_YEQb Nfxd**!gt`6 0 Yp^BxsBl_0M=#1|ׯf}_;/4EU/B|e}!x>˳ \s;ϽpyQ&M̉|蹇80MUPJȁs xLV[Jou|˝_(Һ Tw[߾V_FE|ebܥQD-b^\\pC^KA쥙6Rehn}a/>`ҭtl/xNf%8fsՉQO0< z 6E8Av1:g<&;_\:'O"ؤ^u&) DGT{%Ü~=o㟾,/|__=S;P]l8Yhs[U8)j#'/4/Tup-QDånŲAwDʝTj[Lpص''ëv;p IÏ~IfϢlm6`Tqp@4o!*UARԅk"јs-Z"TOnǸ፷xX$3n;]־LGc%Ɗ xWS{~$ k3D OlYl&AR!8|b1Ͱ&SN K /")>5]qγϨNkjZ^|-/-eDp{CR8gY[P$zo Oёa۾|ɭ|33(ƧYVWx5;S~8晙S\d~ skW~56TZWx .VlUĺ07s63.*gnx>G/er=Dd~Url|r)O+2疊|yF_DMKIBEug{vnH"ko~.O)yW杸R Jx{E4C)b]H|v Gk q ^39K;p~PQ4{')U wvK;Ώ~?14b2dmD @mMgVe 9*S4U^ݯ?0Y;-  tĢDHjЦo/%|/憽7ob? My<=N~=YN/~Y7*oG,t%+EqPP iֆ7;la?e1e"[TY5!ᝡƸ~Cx *n4󖛹mHy G+gHvNv ^bN|!gzbC fӵ_;5yG*c zF0P\kmkA\-%ʭcE*{XXSK4a\J+Yg$LY/ [[V:I-UiF9`/ϱu0dNB}}xƇ)Orn%@!W~|//!hЉؕoYh"e@׾y//0޹g 5IVzExv=w`sz~cA&hl3"1n?r .mC؂+:#5y u~ +uZvxqiio'<,W dv`0T;^S&s̳Rs}E׎K#)BR!sM=fW_O9$$6񐁦;؄t`6ĬWmixޥGn(}zG'7oqq8U~/~U_{EQc86,uj5]+KZy%جs/}hw://ECK뜩 ]R{g=[6,/Fvphž#R29 6 >AEL1]FIPi"> \+n;d8o?s_|M)duŠ{;:ʱ]x[iAi)w~liŜ;U#Y)J8'o]HYq5*{"&y+"JŘS\wq~+CݶS@37֛Q4gtNP*3[ΤJn.:) k;hE#q&FHr.; U*~'i:Iv[}rzcZv%yJqQD2+n ?KODk?mӉ%* o+%!R٠DcD#rՈ4 {׼^RV=/z~^i Q%1y4%0# ó!"ư?s'F8_AEQZlSu^<*.D]ĕH/]ŜmrzG#CyR,10v woRhs )j9<wUX[d2]O mcAGxS[.Op6klW5C Q3 ̀AF9pGеu/#8,u[='/g"Z@Ů!@\TCf [uKL;ppvAԽkV6xEJq~pw>CcqfUEJ<C=oBEahAӇG`܇<;Hַ8W{IHwwvI9Њu'x/#/$1 'fzx|a.'{ոn[-S`F:½alWf*!a$z Gq5BLרXۡ6^{%u G.[XY3j?Etuy''=gE;0plzSzwB]PlS) r}4˫+w8Y&5c(GZe7O*K $ph=Γlm]%iFy]{N{[3cU 2fvNvϾjmyڡ%s-T`4 sߧDi{r]s'?|98r={/mlyΩRPmY]oN&k^<~iLaQk4( hc+Z[.~t~oU[z3֥TWoڰ (AJ%;DRYs|j;\+ޤPPDm~Ai`CPL[z${L6ۏz$Xbq?I~W7}}h!}w$_yؽ劣Z_hgټW_mzFv }}Q}+~#40PN]@%;t >5` }x_|ip&* }f\Rc8< JTFdc:ef[()%wQe /{NWQ-n;ss-.AdE-m=pEá$bBQeGߧJ) UgO~\ֹl璬Tr;;phs6~}N3iZXn= 9z(%E(ELFO#vҽ|TFkv|Cd G[=>9wRh-c\N4X3$ՂwHܱD|~~O?H1IYHX{`_󟿛 AFuI%f%(U$rJ\{u6}{ &hObSCz,qΡ O>i!QԱLOۿ׶~ڦNV;2it{kcB:Nxf='󝟩##'7Ȩ.^gJ}禸khFf﹧ݧ}f^;5KOhˋggE,k-xAuCgryM36w0iJkszݠ.`K)[Gj.j"Sc̞Qf:63|[=;_fY#oOOeTxmGsM f7֍}KźϤ\/fOH6>@]'eH-~ݫb'f`x2d&1YN94Zr}(>n;ˏ->R3CM-l4[ں[^An0<J>1uNoKʧ4wP)q~ 5Raz,B &"5jc7?/gvK=@ щP&g,t[kOSMӤ&dPP"JR "W@gu:::FDqL J&h]rZ9g ]-:}n=OM^[~~ecmD<]3;=#THGk?+o"2b+謙67MPJ۴?<1`}De395!PBWfvj W[F`NF`lLO;)kQLk,FԺ4fIrlD[3<oϨZWJD WuFӨ,# i`hEem!"p_YЌ sENm][Uj@r_L(89|#& WGI4rH9kdd+< NB9*]J4R'~91S;ѧlE&U]6c{YX2OF]l^bWlv8Ċ9S=47оJ.ƛrH42[j-[FG ׹Ќ0 1Q|_F州WQ^Tj`+Db^GVHj,n`"N@L@p+O Žۉy?T.anQD4x1+)0K ortmQ[D< ˎzh#4uײ|6B3#Jind\7ŵ,\ du;13b?ܷ:W\dB.PI=\knbtoi btN$"DaȤwݭL{o8\v%cStTOɟ䨤ۄ.$eTJ_QNoxy"d83vWqRDZ&xcyF68hF %^܄et;@T qܚ~&)`˖m;Hq6gr3"z1" r!62_ǿu$}.t܁2~%:da|Ɓc u|=~s/!i?``h\b y>hcT*(xB@P 85kLBa6a2,aXFIE9,kj" C(SB~+@L$Pg}2G!ͦCgRzgØQcJ[3I3s(m^GHe^xpFB ` #5x^K ZSC;kW؜燻y;k/32v:w8ͷ b{G[5 ڃ"^WϰS89[\SȀ;$/:۶Tz;o{X`BJp 1FG0crM^P7S (! PQe~ev-b2|,ibZ[uFBIIVc|tt !'[-ög?o_Oع};Kg.*1E)$&nfW(qHGF)Ei~`k @ǿWy G%u,au(ϘT~^I֭ .it68}'k6=4>.^9t E3dzAfȤ6k(yFo6N F̦ZaǾa"EʙVu[)߽d< D)g"b*4iThc\ĂA;!\KkQHO)PJ#]X8!N;TUZ6Nz hJ%|G*ǼVjV #MXV ׿c*Fj ic_+o@gDىmV)U-;P ,zz[sZ1{MH_$Nk &~wDV׼=˯!Vy CfM;t*Iǝç;044 4xNGE5!Z~Bx9{=@L@TAL0 `cC̙4kȱE\k.^$X5JX9R)l[:jz7m ߽|CxGa s kisO`yR:t|Wl޾},g/_jR 8xIYZ6um%2ظʞn^vf.>5LRX{JId]EP+2FvOc夬{1B貊w{""ފSy"C&JAdjҼ+|7dⳋgqhUE"3"Jt0jfW{#<Tp,ӎ>ƒmf1m\T@h> ,G4ޱsN0,\e`YInC!_q;OtYld30):) \b&ڍT K#!68ښ:ТK/%Ⱥ/8{x|t@(,bi%,, , <H)G`FK0%d)Eb='c " tŵ' =Sqȑ. aQ"EQRT y^@:ܜSOCqۭS{}{JIeϧ޲јxb~`VҦ?w)qB^&O 5Vb2",!FFE)!4”I:ʓ4TDH||=/I% fLȚ!VAr9@1KV@Kcw<5Œoj{BV?O~&F)xX#Q%TRlX+^dR4>o2Ũ| C֋uR%ƸQ&X0F031gs̱G_Xc(q1z}:`H+iwȁ 3YSzH+9lV3yl7+jMmi<^=rLV"Hy+_GJDl [V]H8( lM\[dlPyZBto#TWػCL; SS.~A%ޫLED PLtbo|*OAkSWs6s;'r21ypbOޱ"u4XK ,{=&Hq*Ew򎷽_6cH׶3$x5"yij+E$.15ra>R fM! aV8LhξEd47]xU,lņ2X "0r#gǙǟúk(Ra7m}g]M$%2”PB#lTD2 MUNכ!Σ744 ƅRjQlQx gbc$"glHӧ'ZBC9[=IGВcxVabd< {^u%ܾ`@TCl/`IrfsxB񮳮oUwTa@"Z0)rr+#koæ bTCNzBzԍFiFuAza55g=6Z1 =+v+누 uxf%ث>.ʬ@]I(֮uul+Nk{Qk˸H:9m~ CCaiȦپ  )>py6oSݞìXݧ_yvQX\'Yv]XT<>-;7\:Z[1} CC4fs0<<#?C?cO=ͶT"h@ /6t t\=K 8 T*nAM*`vn>:DQH*MO5JhB>QLsDeT:R k#TU1*^BaMX`ū%^p6Oڷ ZRk+{Zhtݣ5mxMO `e+el'$@8f) J)FPFh=r%.[9shll$Jed3S)ҙ4|ۏRZO<ζ-;{q ۈ?:2+ӗiڌ2+ Ȥv1CfΜLhrv6[vICJ(VPB:+xr*~);M&Xs2=RGg4^*cz8hGsc3s /FX/v0^-Lw2$e)w^Z˦./ V.Ck`woȺ ܺ=Oncސ_]?֖],XԆ#`cg̤Z\|xJbM㗨8< 'Qٳ|.z"v׾2q]'%#! ;U:[5?kL>yݧ8#[0웰^w&H"1ȫ$0; {}~֋eSVovトhn4\z H+vvU \Hd-%jm5P0=쨳&Y4@|. 7?QIx~jGce $ vZ I!mi,)fdfqQg}YΌiyY7+΍CNo.(ƣ,@Sm1D-2)@j4Wy{GFX|1"`sdpS*AY:a 7gZe(-ew=/lgh^zI2 vvEКjYaۯrcx˹oMS8q%ՠ*4>m\sGiC:T(.8߰{zU7FhD5oM`-Df h;u>'@M]C!: 1`#Lv:爥KIRiGKR%QU_ˎ ^0@h875pRώrɻQ5"kuzV}q0 SZGʵ\Tf[k1(5Zha!ՈJH/@k3m?c,=hf~ϥ2 P(k)勜yj*5al?+Yʞ$X)el*PFgk 0ýigY8\|ծl!0hf͞NYy4wq#/ aLoS<}}B<_UTiw}?DS0xi8cenmw(?͹ˆQsqBLk[W}:u23gtrI+ieP2,֔Oژut.N: ر};=x?O<4EЌzey+hƝR\p}Y yaǐϸ^99=Q_HsR`J5!E`bM9ʆl@Җ6=7nzKz'"Wn*m;k@kZZZ pUwѯxiK?\qŀXzd6ϙǜin&Әcsi+4ZbVit'c" Q -V=LWO9F>s1F[N=etĬ%^Pw{W=ԥP5#TPJ*G$$Q4~oG#< bi}+f& ~,:;vw.ѦyUOѩ(`U di.YAg7OxG瞻Uw_ٿ7N+l$9~r|׳kLMYXXQcÄ ^16I&YN'/>3.FsnjFp5x*V$畦q|f꼱JLg]p9a)X%%"^WSB";en֯ pKN_wxiK3?u%+1los_y;[+*DbtI#5c%lT:[U QYj=>`ӥ+Z;@wb.viEʽfjB;~bW( 4m8r)X:Zg"-O<{;7QJ>UBR1+(͇. 瓓Q0eQxm\O,x 4uNgZG'}8xD&6ޕJa 03cpw%1qJ^WW (wGQ(q\WX0}a~fFd%FZ~H^{E~q# M/<^@%ٗ/G%h(c(2Wfl|?=Q_Zr;A3Sd4]#[(aTL ȗ|oz%dti84}" $at3x:;u msoӉlQ]+Dhoʉ Q :ZS|C^{nPش"`oa҃ *+P{lݍ@`Ft0@[Ct3((>h2*ôqy_G7S6̸q.1tTgg[9j9Ln(ƀar`>]8u)b>8LX!=xM\RWu9&18&Fii2ޔ:0c3>夕Gsᇰa@0Ϭ:s))~xFn!eD2p)H]-I+͊#=ƬacZLbƠNɋDNQ_)Q+1a:HTtNkUp|#7Vy0TX!Ji=}wjvx?L(ڄv}E'Lƿ6~@XsLgZPARdRHP%,Y Yf~tG{9j\iSjY1}FxO J<˔B$%)B~pï0|]1:ꌟ %VVauuɦc[(6?5~P2Fc)ZTVupbadI=0Hciin:2֣?E -D W1[tcm˟QŏKƝV3f5KX*oLs1%*^P&QiF*~|&ѾEb6ZI`i9q,Y#r E߽'^z5w+2ryϔ^dMѦƐ\|L_?loaK~1[7năȊAN]6@A-+\bgk'dho7*?U``2O5p0Y`["}_J0?w:9okWarWQq,#4J"f@O:C 755ed.;y1'q訿JJp4 1ZZya:凱xf6{vaaY4MZb>͊<ē|kb} G('?hǹ>qšS_`ƴ8SHKFrMB L]H @P>3KC)>2@؈YBra+0)Ǝ$;P6b1),Y ]OMn) 1XR UM$NVGHVGrO:ơ;lƹ֋ac+)!.KEᡰr+hkKcʃHcQBHt>b\!} o2{>}g랇P*CXH!iT<;pA[ ǒOR|̰da2leT M~^V҅걌 imiXDyM:P"Kdao!{z'h @) ~u>#@.yqW30NH!+|w -'p b `5zOfa-Ӗ )Dy9MVk}At@ۜ\&q|36k Ī!q)Ï>T޽ʸ4wdUmux%`hp]{XC n`00IIgu\T-eRgv=ǯ{Wu%7==GZ1n:͹v:8Ξ=!0c\&&͑.G=!ROn~!b7}:]z4l"H릦iMޔؿls};!h`SC%;@3M9y9He\sq1+&bhZdUyRɃt0&;wnAB >SƝ+&c|/a6ǟGH4 WЄ{1DȊۤKSY r@Vu|?ʓO XCwBƦFZ[ijiI#t޲Ys;b >uq~f-3ΦlIp) َVGɎᑡ*mH3sf+sgt2=<ȣ|?Σ<ʶ3B0ܽzޒW7;=[gғFJBZ#GNCRD&*Gd%%s3"sLWh<'hf}S.U DUU݋ۦ-mx)crP+-C ^xr øSbu9N;T>ϱqz)}] eVF?dY/-;\L$UŁM*D2ego76^UWZZQU˥J$\3] y"F+*)Qo>,7rɫ,bfh:նp朢]lԎpuXMV5s P.MrB[`tCwI.&9S(&{grڊ2VQn7rCes?s8kDDdؔ('4ŲT(ډJU2qi(/$8Icb E\$ߐ%mænrLXgV8Yj "(7rC8سX<{ /1# l/`PwCF,CC\a&s0f iB6uKlh'bvEY⾵%jHA˖ٵm9[XN ̺;^MV;$D\>DzC6.+^h"tņN=4)!lb玍uPDN#+SexW~wEto:'@W?Gt6~?ʍ<ՏFcJY.>M- ;oPv){eR7p|oϠfrF8@T‹ΡA0y/s[_KQh8$Z>_57r_OfV'3.~ ]2e$h̒S r] 7cS(x{P"Dc)}n *DYE9ǶD=ÖkN;ٺe+°nLK#On]K:9Ćލ g70˒ =f4t7C8e7smwꏫkȡ<m*^cgJ%1:at jAx%cĒkH6q}44"g -FXtp+V@AZK H JǍ=FS= t:_#՟%m/}\H|JYn֭w>J1IFH/1%7wme%okb"6*^̷:\V<&2 $j8,|AXDS)|`!_#}JKv'yfǪA= }Soe+>Ȇ"]r~Qr}).sB[CF]}`lѲau3a_s+_iG^z6nCZ=~>yqYMaոR4eG߰B!lE;ch^Zc (uKGF^*F['3R1֬Uzqv V@OUuO_9OQHSyP'qEYa1d᲌+Ī {-I;Z4{[x͉!K~7L 1SJD=Ya tj!!8 5X@ D2*{|WTUOV]cLsƐ|FҒB1>5?AC8c9YpZ)!vpۃqۣwi`?%5dcfI60+,a'4 Yʽg$m}(7!'. (\Fx e eZwrfrȡ Ed-=,sRVY+cMwƘ]6i]IrѶ:KkQtL.޴uG1ю"O=NW_+>|>A9 @3+Y'.=46|)^s9$o]nYpSYqȱ9iU_΢)8ElT4!%i.:E>B+ʖrDn 7ӉKR IDATC,v·$cci_8fR2*oGE7Ʃƿ5SB0!ף}IcFqg?G}A3M92M<̳tJ[yadv6[~[ A:D.yb/K`Y݇1W ߾%BӕM5еw6MO4":1KcD%ػ-2K$d)*A% bUwt2/ʊ [$]ٍ9h 7qUWvf~a6~L?tF0ZdS4saIA*M'V{(AZDIS(\'SXljˡ`q.urɜ I2)?qaO{a$9LLg`+XT* O̫iC/)+=|K`!:Z|8t̡0Hɽ?d֌0 ( .eK!hP*`6NnU2b#}wEZ4+SqR4Em7/sSɗ?󯥳i:r&RAIwqm?C<"Q J3& !=$OO#0>#UnVi y/s+/m~Wy:: sGo|bjdZqMF<.Zw_I~z׏0HUn\v>d$90"YUQ֧ jgK; :XO9UѺ3m`5XN>cNi*]rWFKJxCmL10EcDᘌ5r͒e5 "H$G% U0ZV&fUb |UwXicxQ8^;VlO_eP~/&z.b@)LC.TD9*m݌FaS7^^V5OEh+YEbi+,TsҲC:qԒXyę,<_(JQ{pۣ膇ڻWx%dń DAJbȍz44 ױLUi4"9y uXebkSnd,(oKy[{J8&aSLxr>h]6v{^g>I*㣉(K ?kblMÌvZٸw6ff 474R((ZZ:-3I/$JUQ\+z];*U@ E!Bz2If2̩{~}I&?I&gf{w>5%O$О+zd8NL!+ڻ ߼7F1͊s^3s;1"dZ(uK%+{\  yoIѺdŷK%]Qo {. {|ME>ksߥ96-{;ۏc[OH J/tQ+|` l 0Yʚ09 **Û cX/tyqê c²Z.L-)mn2<432h"-Yu\zncEs ep)R~Is_]gZ;bXz 낿KѸ( JC[neSg8V{J3 |i!BK)Y5t+ m8N%4c fGT JThC8A|b, KxeoBn~0|[c*Nte7o2Cb?՗/ p}_ *r "~HvzfU@4Y,^b)q/ ~Ǡa*]op #$.T1ÎR%E)ɚ A.PL]^[jf ?᜗2Ūr,R#Px>gU` +$"."iN0L0PϬ3ʥZ{W'f^_lf~&vk͌#_Nc/B {IJ)YU>}[̙3,E||t# (C@jxli]g3 3حI ˷nfw[?0-L-lBzo'b9D @n7zr%HtV&Kâc<ÁRVBa psǯ ҊlA9 ӮFVj D4A-Jeo)yRuɤ*%S*jKu;or21"<$8 S%Xx($^X 04T3mζ#8`lYC{g_~8GrHˡ}/[d< ,?%VDRk(ւx"-nx'?Gٵ?W~*)72If[Mdfs8aY|O0!px~ӈ NQn-:x/\}U,A2𿍺eR?PP*vU)&:^=):U1nWձNFOPHȶP PCgZ6K>CY^cMJYO|=k*LڒV嘥\_*do|BpK9SPxlB$kI̝"wLMY0kC$ZXNB7$yHn4C2#\v߇DSd}')>p1ZZZqm_[^cY|w:Msz9 mlJ y"/ئCQy̼#gttX&=k?ϟ|vfϞM+Qs.b2GI7QE\Uj2RZlU*'RJj^ս#X @@l"=mCD XYjz@AdgXIAPP)tt Z ?ENRvOS*'maT(F >H3Ӛ_#\#yihe0g7JlP*AZI|Cmb*wK&Ji%YFe/RJh_iB)ۨ>g a}]Rx^~)xr㼺i}y"2[Qnլ111|MHpٗgpНe=NfknROJ˷@9ɶm̝+Vh>mH U/5-!݉zΐ2.kƶ1zkְuF2Lj  2! ?v+',=!^YzcpUh]N7jec5.d> m Uק>-o2d@,-=*Pt x`"v"킶FDBiDu)+ -Pگ|ZSFRڨvUG-jP%S2B^LJ^%ʫEXT5N59RU:P"@DEEU%]Εz:,$A"L/jZCtܪjNVu1ݐYe ] oBG'v4UyQy.}wTcdLj[QᲡo;}?†WPjM &&QvTD^BiGDM(s_֓fiDN{\o6lcEaM*Vm~_ [_Gj4[մ'z.Gs ӣq"6x6+eYu%O$= eލֺXyIof7"tS9Jv 1HA"=KVoy-u"{ic>imCzpfۥ5ē=e쁟In̦ɳqYƏnZ2nL U;F!*28wiŹxu %xba)s 3,{~z7AŸ `"|őT2ܶ"톝!VdrfKm g#+,J|(8RQ5҆Zy˝/ .h "|Ó.7A5K 6,Dθ;n#8i)$kV"kgBtx{֍ u?K龜:+ NBrDž< g03:lG8ui#2e= ˤ𻇇j+G2g5]Pp$3ڨI"c >>DBKKI-0F=<苔]@^T R=jZ)!5Ǹw^ȴcNŗ/Щt}ϯqei4w IDAT'9eJcy=/ \6N~ e׊C[_ɺLNٓsıl 0,>Ȇ yşȋM8K8 \=:#o[(AA<# qy'8"K>IGgѸS ~}7O?s w?u#.9gu$0z++*jjH zRiL vBe8wp#BQ .c>'\$7Osat8MĉEM<8+yfwښy< `L!<ѐVQ_`&yaO~OFS(*,jnљE\/l\LLWJxY+؇" FtPhș9R"њ㜓"(}G7ZXx#3Ts@ !8#A֦N`Iy~$q{EH++y`h[iD? T|,vQ#l40Bu,b5uEPiFGFr.Th6w]P d{Rn[8wt)0 /5hT+ngJYbO)QLKpTC&^!YoWQ|i7+y6mldeGKy`)lob,8P (1? Kך_yܖn&c"wAP>U0O{_z3?'^y <|qlrq E }wu` y`($~,PՂ;z Ye r.go%29hHAŖ&H^6ҵA_Ud4H iITv)&;LUVĤVT^dDII4Eu:CT3LwOp,>Ĭl!_I>XpAS9G]dA5H/7u.@@di6V2{i'B[a 1aH(nK7fqa>dXRccXD-[0kLfEhɲ'xާ#>2P~%Ekm+{X.>1;KsGښdkjUp1`fgұ9.l^g҈ÊMk0 Χ{k7M$h0y޿)hncQfܸ Y|inU$?ivQ#!h)1pËr>,{ZCFQVp-pBJۻc( b wB35]qsWQwrXg.K} (R3p"/岼 |;SXx'="fO#f9( 0@4} jG_BfkL.OO6~_yɗq&bXLok0rosG;bd`/}Z\0Q۝Y{``]WC…g>ǰ4Loql);1KOgyOE9ye3}qs[ѾKks38mV 6NehoOy{˂ hcʁsc?1Zc #uE|yqW2^pş=.c؃s?}71JJޢ0uuU{Z5[T=RGS ]ME9A^WQ*oED3oxx~$I=̷/ſCf>^R=4lE j@!t(&65̒2A54"Hfc9J.IqCNܪD% MD$YI_3|_%re4j*R#e  tuEв4 Bݭ".Dӿr3>U;yqmF"لyd3YdC@Zr@ Wk0 ) CG j-)ҵ}uHU]j 0GHk3x𞷂 1E9K'ύ]ˡa^v%~t=DL%%ln~PS/W{UhsU"56ډjWhh,ش&^Zou%bBA\¨.Orbͽz40M ]5(+zg_E{pȼY&оxz<ؚM \$=(x(24j="t29 L1͐6afOs衇[dLm8a,VSbmb A*aZtR؎֞m4P,am(.bqqFFfN V?2[ba0#96{67!)^ǫGxqY-d:;)9jz1&^D:YEcz>Hr$?8oy,zEw@Jc.$5І@:SS8QQe9d jmQ 0PP骤U^-2l`ii ~)iH90vihhKn-ʧo2y}޳¤8 Ilw˾ŊmO`7.プys!@҅!`ɢ3l_Qn}','nM&7䤋;ꊏ/qi-C/8:A粋H1mc]qqb|#4t9*0u!v'n唹8I}dr _X6&.ZQc1c:c|%a;XU@<`/M9bx05PaX$Wiijg> BsȞ200piWi=&kd_Vksr7V[\L~8&* ɟrB!kwiI-YKe]&ԪRt&Ȏ]RLMc=c&w4B_ k6 Mdbs 4'%lM' X H<t{h%{b#U{{u%wеUP To {1RgLAtӈL&Ui͆4³eB^N MftxoQ;ٚ+&Gb~/>K AZhJXX!&N *'`daâ\9m",Ɯ @>i)ӌ2GJftcGlUXeR\W L^@Btaa| /Y ;Bh"QfVf4wݴS 7RR5ßﻑ.4q =0M(ynq&8yS8~ylcXv-KQX < jVZ`LV:;LZ.nR11Z)FLoĦk})$ZinGuE;VhS\EW4l$_xi3cNF~hU=gO2 -{vY(\puK7W|J\pyXFM][Y1҃%rt(6n‰EQRQ. g,XU֑lmF-xEN >Ţi>0B>mmxX+Xu}E,9x6cU6'm[F~Sͼ8fX޸mt͟Mb@7nH,7JHF?}6ž1" :>퀫Oq4Q>x`ʟb/-9- hͶӎh+G"-GͫDP,-QҟPa,D5X6/קn=#dc5 ô/8u̅Rin{Vew1Łv]`vfk>M*`f[̑ T1FeD#L׺/ղTa3zE]'*z"Vn,^Y brо|[[XpI[Q0cg QO=-#ؖAS2uNḒxh¡٤ҴvNg6E#[G)&j;sHc$L|N<#RD] C9ikU3hhi] cbN84 #cey! R65GYIxjGyK#z\kzZ=WVP"&wwNq*FiC߲+,]=޹PoE؛ڷ\hb}RZ)BRM`KQ/AtL+`VH[c-l@1FoygN#]rΛl%k຦M,[x(1Uo!Z*#JA6')k@Zscn4 ȇt'9CJM>kKp !p,߲Zj  |[BoU9JpI]2UhQdFd(8Bq18@A`nbM ۦoQ-,J5yUAt05h̄ØZ 2 Rey<vJa]P4Bo$?UTU U@f<>OfZgC 'hQVm^<2pM/P\1] GdE]@Xe~[h~r㘦TE8i:=Frݹ51Szd^Dz3kJDOhv*C䅇xHQff;pcy[C'B=P2_()ʂk}@ (P`Ȓץq? Vj,vY|Y )@l RfY3?$BTI3u}B"86 J1(r&T-|+>y,Z"]L0F̱ŞG, 3k^c6#^]Ǣ`]Fr%fF^ض&J{lCKS mή.R) efQZhJrZMvupx[/g5۪г!5{&CKMk1yW1«O{Xzb9ɍ3izw)l+l2-ֶ1s].hDol>o*Dl 5C&$!c|W޷o_kdq痿֤-[%PK٧pU_㶧NK[+vQ)Ŋ9|׿-FjuwX&C3&URm0bTJ #w2DGg`YIwR`w:B!XWA%F%:[V`iE }Z|ٻ-CT1y!;xuÝͶ/eWJyF0w2Ҷ&Yf- IDAT/H8~`Htɥu]LDH+Ic2tU ,9Y~P5ISso?,L<#ɋO.–~UMԺ$PCU>ɴl^-^˦sp։׳xcdT|0lgUMKxGXu%Ws94Iʍ_`C4ƛHI`\F6bb$dKZ2ю*BWg^h&:(*4!|3Ƙ`J]e.DKMSNR*e;]V:u-Ut"{E״JVΘzu/jkx,> w[WxcYl&0s\̟n%H%W6?0=,=ˋ8kc%*W ڒdk. VoD[3J# fznX0D%ڬQHf(d Db?wbq''4$Smk>1j{O|QAn7N_`h(o~'nsh s_| ocN_8y5=}>˄5>^{P{;ε-(R{eu Z-|M<=u}) {w2͊@Ȋ)Vus %eO_ 6Ui}c"8^c&FŐQ r7|(AL 31S:O]WIڧ328@{rx%I*- _)10%ʯ0ZEYO!Lb+|g@~F7mb@4$;R7Iw޾z8;{q*RYݱM|kpǓsңK_NB8MH7lsEdsÃesw)KXN/ttXDrqvWrי/d'$B*""UkV~~֥UZU[ԂVp"* ,$-$$$df;srn$>s罼 2P'%)(HYfI/mX2s)<a Av-xP@U$erQHXG85zRPn,`vL8BWqf!C"<62M_V d~*y Q kL$ibHjk=BR&jJ,1ӨX^.8y|>Oks# 30äCY޵KYNcDs&9gGF^NנWҺ!hIҚ0=h`T{{Ya%V#-A\}`sNg t\B*|ҜǢaDo'U(8#/k&mxۈ}HD">bq> ,h7\÷c@HDWFDB/, >B(.\Owȯ>k߾Ө!A][Yw\Nob6⿂DO!QAh)% 1GY[ҥ L7J8x0eqG3DXhcY55}w&v%K:io%?U`zt`ttd:%wb&c_>moC֤sJ5+Nu ][K8ÅL{S~Ǧ}=Һ,0qt D 2"MF f#[o jLm, Fr YslksϞ؞fz|wt k=w`.AA^z9k i}| @<\p)wPP7j9}k}T=A`D4לW2l>o ):|bšL_=5pOB_ 삢YS 'ox Hza ".ut0U!WVebTA1} -m-tְG8뜳y shg@Fhf]h[ qB۴Է. שr"v"`XswsV3mEY;ン||4f#ZbF"B?Nj]}Z/N胍@.7pۯehȫ4C.le{<=u1NCߎ6>t B #F'ItQcV$ ڌa&XIlu=1MIh45BJғiLDmCCصԞS؞QZ66\88ʋQNM|`Y%kYx)AZ$R|V{s|8xE:s[(|}K9c4\&ҙETtTs2:2 xzk۲cbY9$}&ïF @ •dd("Jܠ.)59'G ]] ,ˍ>rfmK#5c f{vuw{|Kp~mI#Hيqs#?fxp ?+,nk@S(+05wEfÆu|[8p[UpuGf,[_}7w?y'^ULIz=֬^uvn3ņv𳣜.F]:B ,FUd"W^ss\l6C"`ddT]ko6]YbSVd5==ݴ5jc2:[pyt2rI~rMl#BHQEX%sZp~E?]jØq `z+t*u [w`#\TUR3OtAƣRZ+,Ǿ1NX!EK2KkJ4ibX2! i(֊xETYZ .P(x?0}BTPϚVOO8J[|(a~"Cf`eS@7R"ւ<q!hJK;w ~yWQ()caGh5'Q;X'F~A@.>JHmCck(>wjT}]5349A+PZ麡Yi"E bk>_\W38CsZy'֦{׮6ǣ7qSN3)sh#T+0SzsGTE2 nL8chw>5qroW"}Ek.ao68[DaItmˈX !ܐ\]`β"R8ڤ1+}\0Ah"R.r+UOƊ\%̃Lf H2SI+6ӾϞ VG0(T5Tg@^U32krs`9<^dD1 ;il+Sv`9ṧ/\dL,7c{ i~w_7x.8a5COuc;i>Ŭ_>H͵C-穮nnx3k:5V#l4`"/7p(dUy%5r@$h?ŔeD5)8b.0aYͲ`ժ:uX·I>#?ǐ8-%V8NH~P3EX`Soz̳0t6\EBeDJh︌"@̼GbP;AJg?B+؟sצ;9yiԊ:L`ǓSkO0RI Bg3 PB|mipw7qy8IFQM[ɜ8\GoT5348Nc}Y $riYC#Z Sjq ;. )"fq:K[k+˖-g`;'1Oy0EUm?uə\~ {oO잋=c=cU< h#Wz]jJiL8RN!th6-E bbָŋCm"Rq3+s*šXxh"s;E_֗Yp:6xqL2j,@@# *NRN!0WX^}5`80f13yygRavS D)A%e*\]5W3t  ϙZԐ$3&3=MW~V>3yc8#pBZ; 4<+mCز"<)>?}V>s֪-YN>?MH$;wSHMly7,&bbeIdTrJ[ rE35F%WNڱR)Yg5 º9erVE\WN.bsּjNc%ɻtdZU=i+)bO@Q+|>RU:Dx\tzwhn(Noyz'b(d3*q5M-t?KOWhRp Z[p|qR )\T:t5.7§&Y4PpǢds9S3Ρ=(&DG Sܲg¹[N\yleԪ =ݤ0`HsoyZ64]jWOgmO;yEe`X ༁.Bk,48 V<+)>$ȑR.:<+o_y8J&yŸ+(ubք\ A\)|Aq3ϣƠ>uͿ0i\|3-bcJ3<R[hVj  fj)^ʦioo ׿\rtEBK@p,baU90E ןy7z#Xy vb7G駭5:h<6#B*M-yX;(WAmb ]{) p-]hjgxlN|z!Zٶ};E#{Coz=Wkƹ 'j^;)gGjX#b[T6Xs =4oB (DT3kI\h "EAab~3AvKHp,9 wZ|Uk!t{ 3il~gzZ3_ve nǟ|H$q+㊷\"?3W|&jVx .nq`ӸâE8qښ@H)5vGWfF%ǙWqֹWŝ`8RG*@Hsb}㓚QX&͛dl2"ZCWgkP[(+Gݮ?7xc`ZI5Ƃ088Ⱥ5'gYz S)xaj#)lӢ.v/쿏Q*)!1X8 M񻭏ssyyh7v< (۾xE/VZ5v'*<ʏ(5N.4&'m} {Gk#'KGs s IDATSW%bhB„fYu͠h1SbF;,Fܙk6ZSUBꬲ(R>LQ6QqrONr—8"B{=)'|jvL 5Š6 Q0Br00>ئ-øJ?'Rnip(/)c-0hy>GSpsiDp],~Z-`WFOS\z:n݅^ M0EF0KDy6yk'kmU.J{owԬ[gݒV&h$ b9biB+:Ͻ]"\#PD{LSWbيeQk 5bYV.%WZڑ 1j^,"x TyV:hhkײ[0㗞Bn0"xHǧM:[dI'~`0)NY_?h0F#Up6KDʜEP |#/QPen)^P942GA$nkFa!  =_݁-]*?yHRFD!P]{tbhE 1T>ԧ%"}ьČk3 t`LUQ.d~ys:x{x8%i]k=Md i,;ˎg9 kcO{ؿYqQ+um553 Iȹl~qNZy)#ضE]}uB2>1MKs#uVw MP2m$;eR(XF1Srikm%ѼL6f0O-sO}O}a1G\L׮]VnjE{*(R&o}HVjjкo}[7n ֢pxu6lMgUe$8/ rҹplzqG<_>Rk^ۙ}u{QQ ;Q?"W΁T|?Y<ύp"Hwt߸}7Ns!BL][+dio`=|Ǩ'iH%9{{`]π=ocH&̏odi0ײ!/^hvd WDIWA"st]7tF2H6L[Nw^}!gɢyr(1EVA/0^uSO6T xy1)_9PlDM_pWrݻoˎ}Vٗb^ .dOn+֭D)#D:&f hc4W]"$^Y+1?R^.KWw2=l%4(S@A!Fyt_So">N00hy;!+n#២'=Nxױh)J@Hp@'9p@c-(f%Q:[Xђ%c$"웰 MPfE׾5u,:npb.LکiTc挾` BVJi )8pa '93 l BBF++_t Clp ijy+Q4CpM?`? aA29]My." Q͉{0kR"9Dy CTՈ!fLF` +۶j ~H,j[IcL44{^9bFET=oFS5+!hcp[m*- W ZWRG܀!QRQ:L!hkWOoqe RY<#x l}z9fʃ3>嵯=U/|VzAH2!U`$P((4EG@rQi%C!jNBU^p5~J6:R7<@%4 H[^\>Ϊ14~=$9' A-*ɜɜh@Ls{{$"eܲG aD:6Y1!%Zl{qEiF(H_y!Ĵ|@.*vޫpm DK/QeǣL̘19K1~sU y:\),k/CQC@;=^80 _b*\JeEj BU6\Q+a|J~p 6NPϗWnρ(í%[BKe ;߽H. . .]Ǎ7|QG=ǃ=C/EA->kX%u|vQyjۣ(!TO]~BT46#>l1hp4y}bb(gYyJ "Q ;R捘Aɜ!]Y0tM%llذhnkcp`BGx*l rUZrJbehzFw'i:ѡ:C޿+(ĕO[CI^h\(0G8u#_AN9 D,{\q~oBb"I΢,c Qm$"eCĭɎ=1U\d]䭖J=g C3 T0 eV:T$G31Ws<"-0M\$/@{J7|~=ϑENF9 S$Fc@<%bBH&XO 6y69):١1bv$gl)׀K$ɌxDTH'N􍓨`90җfb۷׳3u L3dr,^ 1vr;C4 ^sRǥHv..^R{R&}L2+ΰͳ__LKka6)}~07Đ}A! pYC ֆFn<jXU-n w .p#z k;xP*V<3e%>-Rv/Eˏ4B ]ZUk1vYH# #n ڨm߾n~qDYXR,y9 DH6)tw|֮9_R'{l3/|2 :Em]o}t?/<(?mX #T,贛x-4H$<Ԭsp}H1L fgܘk_NlKGkdx\$gy- P$ZZ<}^ڻ"8a)u$YU,H{Dy>M"siI>7B8êTp "HgM,L];ʐ㾝[~ NҘhP4u>CCdr<ݏ'Fdg !J1zƒTZF B@_ ]h3B#^]+@kOR ;-b&' %C_ҵ$PΑī9Gu'hDΙ;5(sUU"C'rEW2o8LCo8_3 Mw4SjPiλ作y |wx" C_ӲqCJaHJc3($Ϭwɐ;9|+ Ʀ)jQ4<<=ï}IhH@DX<7:Z;hlHlrN^N^:_w-Z7Ǿu eBAI`"UCEYռ%hMvrn&^|if.Zs1K~\N?{-йMO$L%i\RzQ6|@]J=k+:S!CmִixihfA&%䏮GƎ%==tER ̀?k޼ZN=Lw c* M9u KAD0dz>aP;цju'RZ)[xo Ւ>i9U9+he^l2頣W)WL<ʍ-+QXPx142["T ^D$. FqlhoIXxSUrk-q\ZD%j wrQq\ FUYb}?H?K˛P<*Fڣnclm095$)j.&%Xm HcD&sv4154eX߽ǶڍL:YR-} -l /Ւw\sOМÈܷESPu"%ŬWb%>u9>xu;O>w09p[s1~e{Mx ?|)^l U1P"܏aSYamt \zYBxOiW3F=jݢ{XtGsX1MR/-R ^b5E sN'|"Fj#ӈ6wxikljg@৿2*PATH>~x+ihW4*Li~7 (Ē1bZ`[DUrvXxa &yiN?638=2l e'BGNN< -[ƕ$ٜfޭl v8\}]-_Un۴z:XV?ZfoO/4h x/Zf߻,Jq BY=,I51;ڌ9DGbfMXu+Pf_P8А12Ć_@~">ygs8;@*8 Yj۳NQlP ͎JS #RQ"=Y@T r[Qna!1l7I{m;'< kNeyj׷abc }KKE!u>ZEجBe81j*$I >úڋEϜD~?HW(a`3τ~2n FEU|3x7X\K&7lAx?14y5s#s3Z`x(R4/Z㚡KacCןo퀈M:Ce? u$^ߖ"-`ӣc$$x"Ý̒sq82#/|M̲~inEӃhCBty5xyB!0Cdq5^Y@AVK(\|VmaWiئ)Yק eޠ.QK<M;7Ra:C;R2l.ZU A$=Gm'||⋕Fa %;D iQKm](=GJ+bA¢i IDAT2LX d%1:;O ѥ"a Ӝ_&/A0M/7Ǵ8x 'lu3dHY֮#@^=}SO_^xcb>0!JapP-XX2:h7 2BH,]j:XydwOk&7XlOl},|/@h6^)L,*DH]ˣѢ8R[:(R֐ Za2TR 9֯n#zNJ2︜/^D/kq;nI YT/~Coz ß­KN zn3n VCq=#VEx¯A]˦aXKOē`W*@s}٧S li+l8gv}qYڡ`ȅfp5%"~tb|FU(ʄ 4pQqߵ89^֔)ͪ NbPh l MYѱ l\{2K[1|Cl={ygxj`@[C 0Xl-{'_|mPć_<]K ,ZLC}BŌW#)!u 3q*ȋ_ɜ.+;6诫TI NRM刺1<>NZ34_v4xW|l5sY;?T / ~ܙ$T#v ciaɵ\+5Yu&1:ң96es`4axarDDhr]!PE!/s6-q, Ǿg&e 31i`CǒriA"r.d|MvZV2ʴ4$j1 ÿyB/2Ƿr"X&\"&h"Xu$f/ Ho~ƞz/iQ 9%Oj]']};'5iڣ (ӽ}8|d69q˯nL\[,lJ]⁧pҪŜZOs%3 5홤 akdً 4b@N\gtO;;0Ը$H8c|)̣N߳u ͠7(wM(RQS>9eQZN.iiP wI6$@T ESJ=kœΞ<|NtT4*D ny2 s5Pԑ"j!yV@(6SVPVЖi&st>/!MLlUCF#!QO>_U*S-VlG!iFC0#K0ţDUDbSO\Xr%<seGOI.ig" ݅#hT5R+WDϳ] &T9홯 fu U}'c&d1XX1X\v®t|2OPR'}gv==x6Wr>^jDĢσAcضooC.d*r ՜bbOb6 C?f% _^>?@(!)xl0yn,l_1-Vgbʆ kuLrR !|jZR8~fCk]3Xalz]3ʻ͒0.MUa31XسGfU,o~eWD9EsutqWxn>޷ёHQY%߫%x!:Mt?A?kV2MgE@͛o۞CE{65ab>?ᕯ4Pp_2RGP#hJxƊN[E$h#A#P#R@q-5 ܳVsd!l!-\΢W9p#nƇ̑l!N;c1AbGGHWlOOÂQDᆋxK2}ȏxrGȭVIotÙK;d?Ħrw?A#D XJa87ވܴEˀGMHm%MNHs| hq[v};̞*:!"-3sz)饫y[>F99%O}sStg)%h 0IL!ƶA֨]:xl$/>V^I~IC*ήy֭<;WvvFvwko~{m_>uϣJsdp5 oxq/|mDBFKH;K.IbVJ$]l :y@)BaTЩ CP ph@\x>%ZD5IUQe4㴶ԎbO9צf.sqoR: [׺(,- k-ʪ+lk1>0å1vOfPXEt=i^3;  2ƞi$A`吙H(YpY<<0 drDr:HIF3-gV_ďz7q=-s_ C~t@> Xzzs{@F4/YYG<̼vA8anW\w q?_y _V34˫.ʐv~GF5]߻"\50ǺG#9E/I,S&KxN'](K=2r$k> qRlsRI()N^뤶:jNI{ QH U 6hcG۩ISjSoR*\_TGԪǶjkf,֋j YkP*ēB' 'cE IYFkRI3%E.pC€7Y&Du%v +(ϫ2W* jfILKX妄SiKiKI20[,/;2uXnbi.co3a*Z>h)!ELn,3gOJX*rlGv=Ȏ8ҿc0AX!W<]v18)]2 j^;k.aZ}6ٌEA/WHCh%H^KFmRUX1xJDE)g CaiC,$g, )j<'%&6vHv>;'סBo?qfdӆ.lgs-,J7~5|͔N࿮oH(N~{mp-[a 'P|_Oәa0O~Vqv:@i;14GPu:E5-ۛo [o`!C6# E(mߏBTB GdŦPfcCZ;@<9 x\(Kr6zc b!$1I[GeN=_>em\Y@@zr>ݥ"0{%݁9]1h/C#Ongx vV[c9.ɣK)s.`$"kJw#,ygd:{x⒫ԛ'Z&QCf#cT޲<+?Z345L$I@V觜!jnNm'6o5.:n([Ha>wᶯ DI4 O07hOIgS(%ozg.'e%:,## J(dH#%<;}w:IY|>.ΏKe~0}IaFO͊޳@V7g syùZXB@"9Hǂ\Axq(}HS ^7^pV/`ͬkMtT_Qz<K4m0RGFgI 6bmTuON%xt_q02 cEim1&kv?4"0j@~2OkJc5 ۹t/\'7$V}]u5[cxGvI3yw[#/Q-Җ5\I*ߍ0+6ZB _x2`}!LXkF7M@dav:x>'>O+ʰsժz*OB " C|? DQ:J=%dRe5G3Ǻ.Fh&",`|ZD8Fɩ>֚S C|'b<߫ܛ( eHHy'ok-rvTɡva򂚄Be6 Ck\ z2>qF%p)-co\+SdChwGꄁYR#!*_drVD -Rss*P~tLm;(P4Ml#mRȟfekFehIQ7m9c|{y=yFG y`'54x>Ҿdy=wM+}q9&ZJD"J89BS *FDZ!=0Rb⌹oh &򴞟Kx;^Gk[H bJra1huN`.g:Oe$G:#lwӚ8cItY.r@up?~t6jR(SX,ʹ՞T[ DSmddMRfoA]5LRfVmamgOkK_Z>g=sg?/gc2 &N$Eةј[_$/D4>S}P-@LWh|iLԆBK_~sľlj՟Y2e˙,co}k2`(U$GOľ͓gF) ~]W6>!NS5刡28ar'nV z3\|7Q INEzONO`UDZ};B7OyYCKk '"hJT~Z4OmMZ[i×!zM:x, >\خkK$e20[W`v#rط! 㓧8)T* blF'U==2 # ls1J}ÜX̄IRBPe8C,<<&HL*vFo s{|$ܬK԰yg8PSLrgDqgZ:Wq,`}W ˬS[w1g ƽO"z&&rܱB$vmw(vˋ^y 'syB1HHXIb1{yh(iB (2y}'G 9/ {6Ri~| ._^KEy-^@*.[Af{?_šTRI 49 )FKt`Qc(8q&Y \sfvFv&ftT3QAwRbf E dsadlLJY?^}8Y6.Dlexꚻ@7IO6k!Ylxz3ƲCJ!bؗAw0ǾoWOmaBu5ohU\~ťHtY$QQr,kB Sf{6-ϒ{[dA~ Y!bJcmQF)U؄˟J ?2ӱ4VZ"d]":8x:-zȇZ[} Gq ॷ\/>lPFK(=ɹ%Xe&Jr%j;nMMqy&nXo@V8轩cM,m9itʟܞks-7-4R2fZ]ΌKq.1e9tgUozk}bM[c6q2:3[0p;&3 ]*]xwo~)شI NM-k6gղ,%m_l3癊CsvƷIm.m>43뛻e>XRIaS9.i [bkO0 g61|2PUVũ$:eW\ą\H17927+|.Ío^IY" < ZP]x"KlA8[Vp c$XcyMM)yhfd ]^T-}jEAA"Z&8cy -ƓܠoW>mXUa^M`\Xe9r( ZW$q.y0Zp9V6nΫ_urn+!0V#}EUh LT=S&[OO=˪RL{(X(XFF%ѽW*@cox j&3 `ٰqV-X -F;B8!! 5ǒѦllѼp*LS?s\?jX J[Bst0"F `Ӣ: ,jV )M|[t;&ɧњwz*dR |l+V5[xOxu\rѹ ^~Kp2p1L{ß8)D/A/CC8Dgm}b/S/TstM֌6oT7I8Z#Xc#cjbnkVFRḚ.nB`Oy|#2Ü8V-2MG-R6Avvr#Hr4uYDbŮH=cӎB(0jc3w||mT(7㬹Ɲxw>d6!;v .%J-I4LIr.DcHY-7kz<ѴU%κcs2'<Պ =RR"=cjl;Y vkЂ;i)(Xvۖ@ӯICYyꊷ"[Ҳp3fN\)MIcvaM < ?Nq> JηV4;?_45vOj`kNLT4It6bǨ پy3/fB<x_ǿ~}b`(C14ڏIk0Q8J!BK0(V. !IgA!&qd?Lw8+Zq In+8siǃwbBB6a>nF;I"aA͍9FJI%(--)lK*-_M8"B(vr%~%=ms\8$]:R"#* s~m˝07, ZV):q*GT4RL$T}5 S /ߋ&fgѷ3(Ȧ(B[2E7u'f'-Y!Rv.Vi(ײSn_YL);z$s>q8P StIed^s$]m[I?L]`H F=IIƭbN'hERׯ+jdQ\`ULpᕃq^2QMkːJdC$m(&cB[w]+{`e|"5YDZ '/-&vUiy|a(+sdS\BN_zrʂ$7.6łT7_{T1\0p>:\bq&`3lю% O `ְ{>.9",{wg޲%TIL^A l G22}}لFÞ}ʮhZ)uצҴ_̍ZG!("7SVn9OmD5 </mf>)G[E(!F& ]Xi;ͪ>OS]1FXd.(*RrLFbcsx0"g%cGFq|[V/sB  PKuV!>tGIwҎa ~Ꜩ2|?)V90b\[.HF?Dt^H1.w͊bHCk.59YE`'|#dg)Se ݅/ϤjbҖGr]B0}%Wa%}@c3⦳Wr|k7bYS`H#_H1k˴rٚs]'?7x*rLؤS؟2))s%Nam" .XC.#9 %<0y %xUדE" Fphd/Fl9z4];z#<kqҜqÚ.v+1t ׸fy.\7#C(ȬڄTܩw>y3{\$6֑4JƸb%tKr}*q5|1MikeʤfuEaǖ QX8Z:ɝdQ{0%H ~L.k!_ʲ02 2p6:tWkWKJ+X;姯$!w?:c~j1~,j"VDRRH,w=7\d'9/_w6/Z@_~V',ȗc/ř W|џf4R)GygO+n9f8" ';^S9l 8aDp!p1Y ihmkEJe(k)ьG܈l1 P;Xڦ,JJ1(阽+ v֎D&5hL6҅ 9 Foo#N\`3w+Os 4CxM+Blڲ[osBC$Ad#o!2ax6:{O~wnqu]dNȏ(ZsN 9Y' 60jZ,AHO1ȱ1rف>z}՞bd`-s )]^ժm\ z茧"f"/jHHPʕ2J`yKoߥi/x9 'ao:k%?gl2fk>i5њ2Xq:jڭqȻ]s18+S;a3ݮ'$'FadO˱dJ.|ȝ;Gpɫ_OwX2L38OKG{㺮eTk.!wA<’% 4ٞMBF_]*rLxdH*)ц_p~PѴ`SNܮ/}y̿Vb %= %K{egmD(1# Bt3 _%d8Tc C&_>t62^9䞇 QJS=t=SwM+;[`Lx#҇XOp8(ϧ0Z""ѣQz =n ^? 1Bb2s!HRw$3k7.0r IDAT2?a}O"$ngA$)jIF V|u^S4&EBX+V9_!I*Xr&bI#Ĉe})pbdKԜrLS`͆?[7|4YZK5XigplF\׾9٘]oXƱ#Bִ G-ro??S$V)(޾#98to}{韹8K O[\b|R16m^O*Y`E}s Iyؓr5ؘ ?|s:r(gC#Pfv&#:Q-/&{jЈ%š1bic` NԺ1jF`C7c1|D*Ơuc=|Y]=$9S2M]K6IT6'eZN+ qLJ JŐ۶Ѣ$yRXD{⃜yjX0iFP,&ڹ (R?J#O'z!i4h K,{ 1{E`FIMe$N*⤭ OT9mm5uDGx:8̭FJ1'gfȴu*>s}2;; wa\4In&47m߻'~t|+s$湋pR"zcDyR! c!&3qthͻ]wĊrZd0l{BZeU0ɲ6Ag.d~*vX)5lVȦb؍6f~[K#KL8ۓqϖiskFi = XpVfY[7o|vucE HS21EġBkXV&$BMc E#bJw񺹽N$/]زȊ)cpOxD*Avg磛x3w2v(Z>-hg_I~| '6n7Xkn$%[ R7*X(\PleSnA%S/}#iOR*|?o8/a;QޙtT9mlGy'gțv#uϭeڦ&-#=ee-#؍Ci?;L\Xw*Qp,ё{fb]1Ǿ>F| __jyKy`0>9KRm HY~xnYIsg$U;{ގ͝"$j+Z`DACZ'ZR/y% V^2hO4 #*+|=Ws9b ~vn{*B<=^Lc&"j$ƽXQ[VMD~GE jZ*նNOlj:)S7RJB{M֐N{S9s-\#}5i}*brTD(!1=\W`"_B1-y rsnj\vlw1`[yɡ[_N{z9/@Þmt mC5QtkP>H=z0姍֚mVbP_@F%n6ʸ=QJ6I01PBT3/>3O~}:ȅ4o>t~ygkH:XPƆ(FJN3o|Nct:@JXGGd "DZ#D9UfbkqT IF+PDg9#050-Y,_"\(@X8Rmh8O)^DʴS{ܓ/%W^{5<07q^ Mqk_T)p]U+Ofn`!oPt^XNCW{.v];;;&7>yr: g. XriI}{ضihH;qO?ln%..#Y1gyܷ-NQry3g~m<)CyߺsM{85A䋱8ar}$I+q6X[@+Ơ賤ExaWUqkU@EȖ&]X#U/N$Ssc`Ea,jl!Aq*bfO֩x՗RrkPY'NqbWNf-e\$qI5'e3m.TS{/ߑ %2yAMrAq,[٣}.'-k F'oZ)f90PBQ-=l)MrgrR-m12 5Xʲ|iqpаc_ы9a\OplzkMo䓏GP!WWA肗gSr_Wa+rzUy;sUX eų m5kô9̝lTZ1 o?G^{ "=uF->/pG=l~.cUR?{7XƲyk'R@šU BGhxྵ ѫ^` M9?P|?ɝ<5׎5QBt YOjvď1DZ$0."%S S"LkV_eg&u{!-ƦÆoWD9BEO tDIm-p @[4fP_\l)jv(z}7Q/CIda>+, 2 Ọ]҇U4z *a#X/yuTcvbe+pMBؑQX)f)Mvq[ OJDX4 1Wzt <DCOVu[yD/*Q4 5XꩰoBp_6.k•0o$Qw?ˡHRXrShL6&2I=B\l-*{:<*Ђ 7k7Сhn 󾷾 P[ᅤ{3Bh3H' "''OL1Z}A2cy|||R'N RX$1^ $P6P&6T3U!cs5!C]/XE)⤕(rpS ؇9}S8\ A C$>B"j$*)N]}:'t*Z>яr׽ckB) ʦC ,׮y9pc )V_k#SN:KYFS^yj̸=OBj}zۑN#Fݵㅼk-h|o#4oY<Ҵs0bD N*):DQ"h 8eiPαkK-6S= e9m+gdD@mXrͩiq}Aߓ'__1y+ѲaS"OFG} C!"L~6v +GGyn߻9idm 7i>Owd?ZaT+v>SC҅_X$U^TɉR)O;|>r* "v 7{NIh,3O\Ne+Och h)%wM#w~UNޯyy~^t&.\׳k#oo/w#͝lMKkMwOw?8(%HI^*@Hm!˜ciY޷q<\:X)Ql1(Ƹ;DX+"̛ױb8#ENX>+_{!;ݷC*FdNtIKʠYh?ⲜODʏ:(,%aa#KQ/|0Vy;^Ռ}@ gP!=4(C/Q*OW.n[H|kEI0)=Z# 4ΛhW7/1;4BH&aV/}oC"ұpFQ 6\6N&[69 ֲk*cbkqò[=\dP,1.R$ɱ@@^cɤ%"@Jf-{m?6UW1beN]HbЀ)t0Gx)'QK9ႳQsط6eP^DQr]^6xYi%sgr\kG4R#t* T{Q5!ƽ~/;ꚶX#12M4|wgkݷ@{9=M/|_>͆AP+|ߦduy& DǪj(I! ׷lf =2nywҥTR3ax\+.~<x~>e4cYS"ZN.:Jr鈡R@6撳No_/{v>^Nn9cJa+qA[e*,[)&zq2 mCG΃Ji>Ob7X0w$&^$@q}|C88qiИn@BLV18𻵿aMS|'~HPsT!aρCױ|~?57eps?E_aŴVU+j hڤ вVU_NRRԎpL*/Jڍx9>,% 暐TP;@.PS,nkp&>ɹU2Rȥ9B *m3 Tba>[Ȇd[`*k n &] qQjo: ۲!o nnYԠYXa)\њdowl|G&9{< HkcJUXv+H/IC'Bm$J%"V4K)?OWP -.%TWߥUJ6̨~EgLDYƞ2)y>8e[,60NNdߡCW}o~|\sūR(({n:xֽ \ۍWw}P4a>.x77nv#1:}m/\r gZZ1wt`{GVaElî-;=#l$gx!cïCd Gt">O/gŗ^Ǎ_o|+pDX5eo AJ9g>~r(Bie֣ Wo| wXdZd7 7'?OHZIwtw\r)ca`Kܻ.TF# S|. f.Ky#t`s^>Oz wH"OZ͒6 kKh#I+ cthۤ)6>{$OvoGW0NBױcHl`A Y()#Ѫ~#*Lb",%m2IBBP6āZH(X\*Ƞ 0iK* ,A1"ȢZ]n;mQTB"ڔUm=gj!&F o 8tr-g8%'ƗW"qZKK{ld9jj\K\2>4kEP`"t}V< IDAT8u&q$IQkun&FĭxV`b]L;Z-I,%JVYz"M]ZbU3G ʳr\a|=YW( kVK/|=ƻjeZbEջvqOu8e|/іmfٸaRK~4J ^L^K2uPܕbJSM|Z $kM{dnkXAL*XyjMOkp 0./ɿ,G@2i-$_xŖ1sSVԀ 51dkK% W2n3jo/ ^rl`9Ν\T&:(gAJI`_?MQ  LĹg0鴇cۿ}azI*J dtƺ %@4O~1 0$3;(aUqHA;ǏDO%6wq[Qpp 1 3#⪫`2_ bȓ??I}vΌ;> |BA8 'vc m_ %jmP:ͻ.{`k^>/w;z:ѩQ?_+ #9XШ8CĞg0dl|&,a$]=(u?ζ4%˒Cx@c]熤@ 2.Z tЯR<ݶM\ |hD61.13aȤaWyF"!-p-NhW5JJ:B Qr`qLjZKL3VI$X7:bYƢ IX dk杆I^11IT>K8uqV~7d\ &b28LbjhZ@YFuߦԎ47{y+/.r1Ξ'B NȥFl78ލD|cѹiB=LhN^L}^>i*&{yϪ`qk8LEOVNpPe:=8 +&edL"_qyIΜCSɶPϕp\Ic'1HeL8$4JX8.IgS̟7' 1DD!BH< 7|-ۍ&ZG:a*Zh#AOv{`ƕsmo.\;B8Tkaޟ":e *kN'mα{C7q)(6ዓ%\+A46i[)uA)-{F'ZD΅HH&Q-uTq}4BK/BP#"Ahkg81*Jl>v[-"HuXWTX|S88Z*()hwwxvGcMD@PPbc1Q9Da]={Dc66I85FG(2cFhT.ވu7`9=}ܱ%>psa :䕠e#F5[Q+#  Y2.˲٣4{ 2\0mDHA>.U~NXxv0Ԅ@ؐήY:ބt|vn~bޤև|xt>-<%?@ >fFlQMTa[k$u+ Z]"USX0!ewk'N؀;dwn\F"75ysl77׼>2{VMM9R鸝KC>#clܸfp`R;eKNkcDzt OQ)^'MذG,a5ocsPKhkyǘ=k.˾m5@浍oq`()wv8؉)DʢR(aj Q+Z$ fKSV#-zY*fF&I]2DBa-˓Ĭ!%u 3NHKm8 ]֍o'6QtK٣^>Vn\aGn ]crZ2t̙-sVY(z/iml1&!عPS'*$hܲ`j."Jo?Q.+0@(c"V`2~F'Dzlb5!cvc-D1|>_ "HF(:BU kbpG&6Øej90f#p\+':~U^r2=J;vreR^1"U҆Q'زێ#+{c9N)n J*"+1G: Q@yFvmK&|(07\YgCo:R'TV|H3Y踲-}Rf#m_'(d8oyG?QO)G&9(l1)j(.gEctw?uXZYV^2Tt%,96Wh!65a-Rh2Y@_y܊ݲf|e 05v7{udDx1ۉaMG+ :윕ѵWc=DJ /+zqȹY$eF9FQK1@h {2:vBꈊHijlMjsPCLbdR>AXd7}2n-- F7r{6Osϣv=?-?ůIJ ill@GR@^v&%"3hi^)'AJNp.DDCξ{fێDz/w'-Iss#d=z)"tr\rky98!\1~lC}}tɚW\ͳ35#'VT{=܍TbdRb !ZGx)ac!%|t:1MZGfR^0ى #27mhk۝l+F }.]sgQ*iomcltBl6KPb1T#"|GJI.T*! kHe3DC^KۻQоpQ9 gnityќ cM,E&n3JQ{N%}3&LzE D.% "f͟mmEp2oxk|jnCy;C@afE[ʏ*<fG&b3v3I_Ȼfn[P\9XA0^=\cc&/1%(fRDRC{lCUƎL'4]),*x?zaeZ?^[ּ24VZf^r-۶wrϦ{ҏA>e{m'sVx5Ad񍮂?U^#d0h'OU8OY̗.B*%D!艊 ,?R Gh 3g06x\pk7g%|'7bš:J ºHܦ4frsYt-f7ҔG_& e,N-'.m-y˯{g~Ǟާ!gbt u1:hIb.,ųfӐrtR~P(D46H)DT$j̐` -+W#b}n#-Ocp $55nD'9+{xp^McOd1qD8 lH׊:5W}'+[i- mBrMm8ٚe!btb"ugM=Жb~Xx[ htv)[q7s%ogd\/fK/%ϧeaٴkO*X=ȗv=7Oc`Ja0 \!$.FXd9|1F96߅ͤ_~K kUZ!In+㊴5Q\ʪ\Mcs_7ƕB 5h=׳Q͖r ( 2i }du0ND! ~ZC:)D8 FKORp7ŮtFX 'd0G˲N׼ zL1C՛,>kkbR+8VMؒ,: ׭l)?Pw7JdUTXci]d6- f'O\i#`uTr/3d[ZG8'b +8xv$A?Y;aکUV <^ \^|3[9㬧PyK+(yUTF[C_o/سAqq֙rwpSjD9{7=BhC)0sO ~7}93P2NCm^ɰ&[Ӝ_z~iZ7Il,Mmx_L*O`shRqa1Z] (5͙Bnj 84 0G\, b:[3ܳz`s1̝btJ)e"VLqہ1!*Sw# ͺD5+عk~v+Aً,Z{ߟh`G;y`'sѷeρ]aflTչĽ[]M6e'LǓ}Xelu*c&cj5l3yFqq>72ټAj~#%b1r+9OHP)T&P*|'/9;{f*ߘZػYR]9aIfŢKoҹk+:\lj:Lv.^ A I="9JKryQ"#КYq Ws]wҽ-٥Udzst~r(184©+Wtr-ZISv̜Y!ډ5 d\lΥXY29f24p(N'-/ü jR;*֗D-63]\wLNWd|s4ob l*3(k'T+/j *an4P @2:&0 skRn8Qi@GBB Uu3ZMXTձYeVf &!QSlsЛaT1&lO/LKd[D8Dsރ1Q\[8IG{7j,`5όuO7;Z/%F@Jyyr{˷в5T2jE5ckI,,W8\+3h)"Y}F_fjD-7}ʯU"1sL<ͅ'|G$5d ~/;ɂoVƂcp!|9p?lS|0|  q ?';ZQ͸˦ R,f(XTtT!׌,WXj29so{ OvBأ"f. P A@4mn]Z0$KU({уa-Ky>{լ:CaF(hL[1ZX8,Bk ##fL )Ƴt2və=OSx@r+55EY3tn|Hs=DCzn'fRsD͠P.oЯ2 ԭZp\';@~ڦ߻p*Sz3*dZkhq;p P-jU1ueoGu^-й;?vn71FaazlZ˒Ek_ sQBsgn6sӧ$00b.o8xyQ_mYq*7qǑTcѻ]֯{ ϐRNK*I(`RU[VO IDATS\Z,3 ځ B¬ .A!`V/vُ+UVj&^BHo${Kql`Ԥ(~t/"ѱcҨD'5Ͼݜq\3W 4o8`43\<_e^ ]!_1m>zIkqV F>uptnKWY=ydx=˚J%1ДkP,*1)*HθUxKZE(٦FiKӪ\?_Q0{2{ iĞ={Yd!sfq%{z"m`޴4(Ū'"eg)Z8xŋc(ͻ22M*;Ss43ft%"ar2\06pms561c I2 H39Vwsc33szw-w "-r旰}5.:26naafعk1>8x Ije˘ z;)&v2`zr֖@.EcHDC{%*8Kc|B0,[G>:6ٰ/6g,Bc^Ǭt AgBABp2!?W&$קAz'wj5D%lS\LLG6 Bx[XRaϓZ FzwYSւJ]g 7"ZvlUaT[6ѿ'{"ZVaUW%Ro# 7Fv"$Shj-]$.pQ@DP4-6Y࿠w-"Xv&o%kqȆbd黵ߏV[S&ߨzƲ kgM(BJx^@[jh_Ad݉=ХdHRKJrlV TP AzZId!U5 B[􌥣1jqZ*nb_x󛙶-B*:bH0=3CKK UaAfR!FXP#&$qp}Dt-^Š8k3lёu k֐M=y:mˁEgl`,x`}U0~ߡͽ\\`\535X%I5\3RBD QimŌ '|&B(y? Ug֒KԘ 'F[ cqYιR?ҁ#>"xVj9u+vϤ9z s&zc| @~:mцG#`sAPv _6_񋄅 ENPmL`_a>!!̏W(\5'9e&s !$V~03y>źimcd3y 0.ݏnsm\xvc߳d} zg>!~9+7y'/$'kpF( {[,i V':ѓU&|(͸C!cwߵ:r^lׯ3g͊`Xf+@ CJ ogVŌ"[n97s+FAl*ď;,BҒme%LNA?5d7`egSrh{p (\PI]t]Mσ}7P:gEJ-Hݸa=ss5r֭kWd$m"Yz :QVHlBCgXB"dV%V,Zxj\cԨv\"-V:ZB8)QI c[,S,@1U8kHEUUQc^ 7LT 5AbM_Ee/BuUvOvTCM*K/%<]׷g[pL./yuU[ȒEѼ/|!s6{K $IsO2A= aaCgs{g1O<z,H]k<VHRWFiE49/:Υ Ɠzi:ڋhbDcuf%o%c_,] O#lt.҆̌Wѻ^ơgoq0lH~5+y+9Z4oLcT؄VQAAVZM8si,D1 =DsġL P,q(_{+ǹFrdzAfĺIxn3k6Ѷv+o恵<ՇMics禛ďHĠ[FYE:-s_0&WČӸ9P 3 KXo8ac}r>,Z( 1nG]/LN~~ǝ/Y ,||9C;{;׬C:Ԏb9%xk{^>*#|8$45\pE|ßG⟿9N#rUS/fS=46|5L { NջqM8W;2 KG&@4bDȀZ|")ol1n) 69Ev&Sl)H庍ГX )ab)ZV΁489c?3dUS؟Jp$Bb (U m=ݔ8 Lad35 Ǭ^]L Oj5Sei 3uhmB %s\s F %H0LM095l ˷RF]G&'R$ Ya9cdYx#l C6ٴt; ytI1W;{rۥLv}RNnYN  6PN# c[bDtSHt&`*m(iPisuFH7ӝ"eC.*ihU &)5r,nZF,ZtN`!)!@BW.8&m̗\ݴ)@aHtcX jE8*4W5)cu u&]4afq~JPXgGp\xIe燬?ikټPhTwgKf*Xnxխ袢6ѩRUl Ir1ՑP˿~5sImOkB#sKgGXjQLk{+ٮvCgG';`H!VmX#nice% ʶFn^"1x0AͼVJ $q 3..%Vw#C)y(R7{NH>]譆J1HTd'%V[ęr¦B@A0$mЏmQw)!.hfgiYt#?~r+x-e!*J, 7K \ /~Wu3V fF.U tGFVb "ǛeވvThϵDaVu OWJqs_m9k#HtD#m"Fz ٙfh VtG(}ڻyHP )lNS'ֈ+Q D,&jq3\sAOIZQzR!n}0mCy]o='\qʥH !y~qByɵ/ +yk>̓#}jS Xm8g7}3[1 F_s^EN PùY4Г9lҸ8AןCj :&v#Irʑ9j3$ME[޹0G4m[[hr+r?ȺXf%I,"+e>g$I(L;LFAio䬭g6,5Lղn:\*۷&LYI b Z" }yC$NdCT* Þx艻z}{A8gZΰm݅l;2f] B:|s"(,)HM>np0#C5> 7^Ai5eRu^4DSCؐ/0u- #-4R,rPvTBfЀ3ť;oQEKLc*Ae'Z &{F^[/mqᇸO bфSa**QRJmE 0x!R3!fAX6"VvmAɕEI#1³ 6Eg%)}tRf.RtpKܗ 4  1K˗scOݚV>k&ow,z *JZx_^~(0%ȴXpkgǒYmZE{0[_p/oɱLh{fe Ȃ[nI_hNj^rAWк<挀}VDóSTTDӣ"bʳeV%ԢfB>l.k׬H FB#ycyc w|(*sazcp[ÝU~'ca sBQɜ(c}wN wwoIll $5FHcp$ 􏕠5.M]K\-jd4:&r<{9drxto: ?q<\W_G[gUG 5$/Ԛ&{G]aRev6)-3I GWVJ4'JarGaTp9A 2(3UD*CIgrdͳNQg@n!(Pc[F3LiSQӚc !#jc&|3b0?xp9ʂnO?1LUpˣ߄3u/䊳WZ m$'D4=Et'g:ؠf,8@fGTsM H]n ,,TlO ZߜB0WN8pLa$tS՘bLrWWwW( 阬y&WF':s !tY\yv̗o9P%|pn~ͻ?=Ě ` LgvT<`EB6\@`7o#9$f/zL_y֧=6Ip`w^7_8;<Y0zV,-x5̙aS_"u=u.a/_~)TLS7^ΆkCb r'EH3':hm֞Q# B&'KiaJh2ERXKww'CcY={g+O糴8x i)$q+=]yf&Xqz:Z?Ņϧ+VDU: h)Vc6lar2f%A$1,d3IAc<5,ZKd~K 4nIE[C\kVr^ bx9ǷB,1jWg~6ggUjhDtT3:S8BME(XȼUbpM fęt= BUE A?P+3l|;B(볆;lf>PaUZ"10C_}T"RS2O%GPHSA- C2P B@Q \ezģcTJ`` ރ fGpGFIWk8d暰@DıׁHDσwME[ș; \4jIJWsvW389"W6ѸZ;p5\1sD* 5r$ IM+L.pi\ Q6@:wF@-7LLA!lI|vKHak *$60%_2Qbf#6֜< V\ ɯ]s)ƺ#qJcz!{h2,Ԥ4ZK#Gzov!v.lK< `.2L@ `3P ,JDQA;'Bf9&UwnvQ)  Υ?ٕs@xA#tLdjg8r՚@IC8G _~57^r9_iJF(4L4ZL)¤BA(l u4!"Prs24H\s MF( Q5$rltVbdd"==Lϔv053F`]!6LNNR$N Z䲚bLN#Dl\jŰgW?\$ LM͑1<2NGge !\'qbPB*￙oq"Qe˦^WpõWaZ$&LM38v0Wn0ϧlyg8w?|~JMFAˀ |,Z?tC9},!NQ7Zd:2!@ve(PȂVQڟmd{$&BmNxog a3BzDLlL3 IDAT^&8<ӞC!;EF;bz dH,h "A Ȁf9\ˆՈpZqLW'1h1 'v.uFh€$?DJ]F:ya*ٷ6ϋZʲe׸Eo׈QkJpn:KZDų|mx1$ᨋ pnֱ)h1+n0y2*f4kJ}!]ŻzTI5n{&}z [WX #ȓ{_5tfXn4fVRS ?tׄq*d02CFhSH&~MMgqV 6\o|/gȷ-m\LکL+=~:8w>u20Άyp8֠"1$x|~Or&W޵t'n%fR9g$MS7gQ#N:zK !JƎ\CXiH)?o0VZe2Ha(طoB>accDPʴV16!Z E` $epp}}$I5Z[CՈζH`cCr֦>3g-78JVcsK9AZ[qloy zYuu H~|]ws]wsw%"dpt3܎&Л1 zֶBuw|i/|T=X,&77(*ʄ!E)(.p֤0ֿ@\*9_X7܉k' OP(vS9vM"OLu>1(Iaf d"@IX=9(?jX1q>RQ"kəL1$` NV,[U,0KkcXxfwcM Hw7rq^gVe_N6\iA|²')NlvLp-Ϋ*\"f1B"X:ud]jwgBq}iJ)Xt`bwظ+BxS6YML:郠2F/ˏF욮aHa _5Ȅ&$L${Pʻ'I2fS *EV` s8-\Ӑ1aH-ٷwgd YLc >$y1Ō^<%&Hx9Wl~P FGz JSS܌Z&M11+< ϭ`CJ57UZք| ܼ7˿<<0Xj8f*E>aޙeZ#tyk`&Nix4 :jsmnꎷ첨[pӊ`*2 pB4kfQ8X"q5bA_]K#s@hYHNdΚHHrl 0~sVKw3`Jqc.{2d]z.fKńl%ۯWvy$bcp6m ;~Y?.a,1¡~8qЋڛܥM%Ŗ*-cl>πǬVbwnţʋ$FHdD5ZZujձnmٙ*BI:;d4QbBRi gr٠b.jՄ==JHerL[HRBh-l:k=8&&h@)IR MH#cf_'A5u/}-[WINpm[sw=_ z;cSР\d'&-R#yCXG%\G޾7={Vrώn?ɱ.*a.-N\(VkdVK{ceyplb9aR\hQ2@XR"  Q @cMIʌgDfJx&c##84e-m *T Αd34mQoqj1oi, 'lEJet;WoFBLY8ׂ1+:Q.bLz hܓ :17fjux^XN2޸-UkU Ri޺MS](݃ V|9LJ2H{FD,H)pKkCM"9mY~sިc@cHܩ#1%lr>1!'K)ϕؠ,ԴOď*k)S/Nhlb$ r`j #PӨOr cx)>nX)ؤA@WZ:K@LDKWSŷk%B/c|RzR뀶QW83qԏCJo&ˑX^@CC 5_lh@8Lm睏@]z;spdibx=Dw[&KֈzAۅܰ1d`df+9̴Ef$-Ꮿᬎ*+$GHlD8o*lͧƙ i\tP[ Tf!N`ojx]mno= '%mnEɶ-y^S"_H[#ct_x-]+[yxKx9&| "d:hG|ar,X#QBEPֳRG3*We˯ xQ ޘGz%uʾ;9wt7G/4*1%[ZaB t8y4YA!]A/9qSgAwmgVs zh)o."ļ-W.;n!7_K_&rv{W=ߤV@)xɻxz#CGK|v?3ؼ][_nv35u?BvV$<;3oů3rO}c<yK3?}&t&M7+ytS6g)M![BkPDs>47?tQ8m.5 F*RTX0( @iEPZ5 CӬZKjPϿuwjFKk :ݳ֑D tuv#RqkB\ޞVXJF$lڴk։~%d:.8 ~r3"#wLZI!yS\Z@"|-[ܧ?EA>%WAйww⌳NH/ℎh?zg ov5q.&m?3Ȕ#,pkXw:ɼon}?` l)&$N9 t"Q3u#\M' T:9R!"Ǭ̰/.+QIM:enԠ!'ݧ$.K8(bAY?i)PuDMib*3j&`39ՁLR*'.fiQh,NY^Tm]Hg{y#ξ Tr+{_"'veIKZiZLSׇ$Lji(._C(h]/uwnuw,m]S ;d!q@cS o:&I>YRI4ӛy.( 3$AWlqnU ~,|?Emb H眢hZ:V059niANOa3H i/{WޔR"6sG+IO8R)B!' \#| nl:knlPbkrm]."B({0j<>H5f3?(Lh>6"> b"C9븳s%#HUEt5G]&vz/yL!Iٰb+#sc7sټf3oFYi3םnu,#{w_*z=omdT U38i.eKS2[t1dUxҧ<:AjvӭgbkB3Ȃj'vT.$z/gf2HigŊnH-b˖M Ρ%% B1T|V{\H p3u^VV(dLj:8sd/_H=Z~o WhJJ㎨$kXqZ4@dIB [6S 㠲܏О(o<߸6 btv#>0>{5X)N'|(uuS<˙T^+`c%E>FKL JbD0j<*~\"a\$ T-`.6 1XH,$'EyԤcG($-FˢM-̵veFOݱ $!tm\)M)erIR8a!{jF:ϴ` VlI:d#'7iPڥXD- ļjT A6)}[8JSRbsh"e|d}?B T4WCʐ DaM$[h`/ NYSlW 8J,INfcD=+!|+[Wfz^>U(#y~7~yo=\AFIs޼X'zx'UtӽyWSliPA\@6xF݈4.2R77nHBјK7qak;822U[Np"Eqyjw\"MN`Un!;%5O%qVah.h Y1k&J2Gt MM"&WBI\5~$R:J ?\:8t@+I7p!ՅgX35ڋoA`1_9d>ߦbJtu311pUKG[t+sa?c:!v0MkxaK%jrȜ@% *Ipq24=CQX 5"ДGfebRWϮ:2q,Yp!9"݂MIT]sܡ !żu ֊}HQr&9AG[;nw6jiRd}xR=/\gG)Jq}%?6]|_>gKo׈Z\=~DLn[]^}@rbH2Ù = 12gyşg};w7 Vs,S“뗜pt3\gc$|\JGGR|>`j"!`hxVrES2& BˋT +s-Q¦(B&qB`xLV37Ғ9k-r4'ui3*߽ ګ2yhDe1sC5J1I -*ch ش Z $yj3)QD6[qw ULh  #L93q+óbQzXE;:f]_nF8eϪæ|HYp6\+B *X47 vDKZ4,h&FަL[KA*r'E;XטOGP#1| ϵmXiD=u!AaOR# %,2RMfu!Sq59:lB9ϐDs,;D _׽Qf>Kd^*r?G{ug߿33iԻ+6 SxQC'7%$j$$ސ!$qBHjc+.eKzHNe9sf4F̕w˾d9gֳͣuD]/Sށ)`02q’0tҏPcx򩧹hj,nހ6 "kٲI«CǚKyݵ/[<@XM׾>?ٗн!ɢR7u0lw&e"H~ IDATs^4NER 4(1ԅeZIfh4_?y"'yP\p.g]sl=c)}HWyL [L2}NvWxg* Hrg`R!Y*"T ZH`C,[Z ,q JrZ**A#'U6TZl6$Bnԝ)ZVb or?n  *#mc \K2 ګ1Y{A|UT/> 6l8OTQD:54j|# c:un /FjC"lճ?:Ê"md=-` hJ'7i*&4A:Ձ5k.̮NpYB~QJyF~=՚_ل9ؔ3+SңkJ9ܽc$/0w9ìkN S,ߕ%"+םٝHvNEņ˖D&!m>9w 6a.ӞDmN 5RQ16JfJd.Ce+HJ%b9bJc[Cimkg * %K;<}{% H&I%I98wBgrJgҍqjLr\AP]tȫP CL=OX&sG승NdF²#K:;$"nBN wS*6oG_ :U\lĬNq4uo|_| y9FRWkd`b5Y飍F BX4x)%a;]?#!zG@V]_x9Hը2%Z?hO'H@JZ Z/ax&(tǪ:*c|*R:W1;[99>z?vs&n~HZT%H F}^干60x:|!H{vG"$5Ӻ,uC@ߦ v+g%1LUUDel, 6pVUW)!Bjѽ bcQi{KֶO5=3$!yB^AKILBaZeJ0񺘮3awJ$z:)1,0er^9;%R8Q %D()#tv^G% K];|}J#ܳ fzQ4uDujzIoJHXӕ`Ԇ~Qc}yIp;Zv=^e]]&e]o\J7yFDeg!T ll·N^ec8"ڭщ+w;vR@$#F0 ئ 3m-d1&ڒ%bTҒK-fq&S&XFsCœ!4TEа*m 1ֶM*y6SELbmmMݞ3P[LkRL1 Nk3z] .!Io{ .{ u!uv7ؖ&I,մEl:vv8jԓ}J>IŖǜE \' $MxZT+Mr雙36|N$Q?*rb ;Qk/X">>`Z!\1Iϫ~koYw(U47ؖ)©[8xk%6N3c䷰Zɬssߧ1 %/Cg+xZ ը0<$E#o{7v\[n$V˛8/e|6~5 VQ4DQygd<Õ% _5 iLFV\ƵӱcޔH͸T3>eoëVƤ}[ͩX!^{NJ|AEݬde#Qx6Fꄾa#AIN.Bi )K.$1GAHI!Z%TP}5xܵ/g0IL9K}prևtʌ( Zœ§n9̮&Ŝ]x%H#l@Ȩ`@- =*YAԪp9K:е޽^<{y]rOsc{X檋(--b2D.;-':j߳Gp;!h)SAf<jX *iFXFFF݅svh(bO)*\VtXd!`块8bF=$_,:QD[yj턅<!m/3-Xyַ݇l >lyatm:V~2'!)r`[Cl$˺Kr%_v)7|#xzרChlʶ5nE,pۺy2KdXo(X=)o)E=Gc{J|HI0F.:(b қ@тv 5q#4*Z>HGu0ֱ:. (晐k$!Jʹ(iX8vG,nPS}|bhmiXS $6Ot (-|E.(٬S9i-z8I} |^J7'JNi$J:sr-&6|rocGزr9f )ye`` n2nb+\E1ϟ3xpwI=苫$yeHgKL舺gQ V͍ࠨa9g81q:.+k%O-6tz$E`Ye0ã=> $W\r%d;3|$%2yXEKS_wQlK7\)Ѳ%? ~53l-ǡБ/a,*씞_d7RZ)`. JK8R'PajQo`Oi,~kGKb)}A6Pez4);(@Y\|{Hѕ-Ҡsn#:h1Q*CFY(6}ѵy"+˼|w l'ESl< 7@2}(<ϼzWXN01оAVAk$*9=O8O&߉p AG( 1{)vytfCtufZ1"|󷿷K;o?ζ}1kV/$Y3/˒M#NcZĥifzh$3l zc³yg)Op!] e/̭k;enKi֞TZa!c,k)gt-E(ŦCܸ sG+Ppu\r-Og8g:J:7Rj8hwRcjk #~'(myw;(" # ֱC_D $a/Hc 1~PshN.\/lg֘HK+mjd7-S`NGmT%r'8k:)?LaR Fr]C<49(tyxt??>GY\fC A*bC,( ёcbp-c[cť"#:&*f`"e Zl" HPHuNhTJ$2Lshkl'd9@aN'0S. QuFFpn|0UյmE,|;$\Y~3唣*WF\z YVy04a.GsO&X ƢUMP"Ajaj>~ɭ}QQD&U .u :rʍ3) /.|MK_]#|Au@JD>H/zfS14ܻz$bIR}Oz%^?ڏ㾧D%Kϟ|jJ#o]wۻ<3.>\v0!HTBOn.]ꍐ_81S#;RL047r/ %4=w0֩Ye϶"뮺UW_L쥘@P %y.7rÄG6M_PHbI& mWm!w2L"[|A{Z[YEFđZ=$rI;-F \6C#cs`0g {[1lFe(IICk+n9RB 0^K2 bvߠ|_,SiGxL"i6ۿ4gWΠ؄>XM, .SSBE7)$`&:XiW|s+-/#zȐ|ςNd2ha] CL*S #COYP!׊& C#c&Ka,;!JR3 kTx%٢hM$&՚$Il˩ٲj~6I !O65@/i"߃jjNJM2- *qE'< U37nAdr-7`{9U}>u.3h↔1N'΄{#^syO-;iI#b-RǴܱI^\.^Nlptd '<Θo=qFyWsQbX)@)gpS( I H#>08Eˤ[ ԰T0Q| A>[?/3H `;eѡ:.cvwqptO5wXx6\v ޜ.|5V6vwcM?4xsUsœioX3I90r5K.~}ǡ|]lNa-CTu>rACq.rBg@ 2TdoC<3ſZC$9`TD[?Ed Ow)vBR9ҋq ֺ6eS81S'I ^RLu&se'Mը@Ty$ <L9k 9$Qu$Bb( 士ct N&FHv2e(ĉ< ~b'uĶsfJm[mlTG8W YP&!!*tc(^VR?2[9o/XʖUq ųi4e>'s@|x Ai>71 Iޯ.Ele'SYz)=3lCg}xEu0lQD*ձkI "#QèVC;ZT:P)U!I \Ð I2A;~tǏyOo[yodbC{DBiX?↻e?Hm={&IQSa[ƚ؋0*v@8&$kyɥE(!cS$JAoIR(D$&>B]CR>Ji$o5%gڑ&XB1<519ֱSnLћ}ՌViS>ڮ<ϛ:mh+kF[ZslEB VHD$kDX?A$5xE*kFǾL7y$CFEDZ-fzEa 2I@AIDy$jڑ!'71HnV:dA {6_q ŹL<)`&L P&1S7 g% ͒1ͭtS)SAO9ebȬ@"lsƴ #xY!&L]:”Vh[)J9+%-[s1EٰdK 35f21):S<<` y@ZCF ѭ IDATUii{ e8M=#$f)&u0C(#c}=NWu:}/=GU ={d'[nM9/Xg7wWwSRBk:a}r"$NKEAr^ڗ>OlaoIYdi4]n<]ދ_JaRHOM Bmì*8v4Q@2.Y:>+K8!1_).zыܪi91kbZ#D*j`WBy8FeD[ R)wfÙ;8{0 tj] 12ϏfrT)n%GBR8(~¿m5eJi' dF@,Cq dz*;L%D Aܨ-$aR m42l{ؘڋmf1 V"=ӘM\ aEHr98*JZ He C|L1iD ad磤 Fst@ d8ш($"3ICs:tl oV#$K:Y;G Rd%7?2; ~ynykn˨ߠs2m|R=U Y}nO =(<.3-{Sqkϧ~joKH5i#ֵ .*=}/2jmGcHC?U@1bs-'[ceT2R8)bCKC-cbꢫxǵ羖 ʱi}݃/}0"8#ͷ?|w?cf~)+v&SeFcyx egyKwcU_ 70^ ڤNXE^5!30sٵ+>vk{t̚˞4Zv4ĉflN+-ıF5|%cJJv粄aD.M\_yph9]]! J|ލ|8$OΎ0o^p\qSlyD\`=.^MEϖ!;*LxA^i&Ic ϋWMWP`Dl8̚hz2 !rxK_v1EV |9xrg$qdW J ?B^ïU'Mlߒ9B>K_m+&ZoJUIt24H>xl&<\TF٤)m[ȉF>l_X<趄a!J3RH=wsgǃwsxiީju"cWs>?=<5=Uj̏71d[R ڛԤ+M;"iVy(IV8뛤ql>w\qQCd4*x*Cqh4%#b [`=H&)Ie2U#D/%L P`& IjcRFxL&2͸XMY9ִR: @ݚlg?|fO Gy.2pj#QV"I#V%H{˔\9o]rͣRP,=Ews P3^aXzv'}\> סI_u>_Y?cϼs\+?[(Y mZ*H hWCJ'F| .Xۯ|Q"+AXc0uzTLCBw^̻Em>uwxB&ďa>r3wcoKV粴s!;fn]$__QRꤣQt㱨)^z+iT$~O?V3VAD d&']`导E˗w񬏞֩Boeۏ򏾁tvw`bl߁=CF(.,@"}8n\LƆz5$_ȢZȠ02:JGs1S*\Χ^}k/b~ IӖCUv? k L6a L[p>pOx[W|+z5"JcT5ub]Il;pZT:mnF NY-,)TQ!Rmb1J'iv#\lgͮJ7?:&B7=IN ĔUal eV%CbVH_N:TUYiSOsihRڦy('QlٲR($Bױ#>@R TF9âE2=T~_'{p59 &2daŢBw,?ٻ&~ jw/~J1qqB,d&Н-j~MGmvrqM;zXMcrf35fkb[T-~~AZq7o{J|ɓcGpK]k pM&k"*ZUb-@*AkS,y~)4f,97\o!U=4+ G?Պ7Ĩ!ׁ<k۸ *yەؼOn|GNCL]+JF :N}l4 JZ3NQLBvF*e!oFQR P*EbS?PRF1Ͼ\16FGOn+ q"{֪CpϏƹ,6[{?7^HgcTuoMk[6~$EwFzYU Q)!FYRlZc1"?Ưn2YCӊAq~2/3 |W[7~a}>/ϡ7S5hѺۿldIЊ_:,7= : (8J"6ӓMױֿ". ^ݟ@""X لeIMXaLL0<0(Si;)p3#Bn|:E͌Z+B\L @JQ,1R( 4xw3$r ZXWYgMŔQNxƂ|r3!e>],<;u}k}=BSf'\'uv|~*IQ=՘b')YvPh4+7gq 5CYTݒ ZBbǡE(Q^g1w[:נ0$6GSWy-WB`= FKG)WBzLڻ6BRW"aD3KovΛˡ9LIlNX9i?fŤ;k B:*{fh;gcZG1LsjM+X+0Tټy'%}&,7Kᕯ;#P=ၲ5/{(gҢʴX_Abʹd`R(CGtzWIS_O5i*ZHZ(xr'CbzM PdH%"ɸ7s 9O^kS->ZkTxyK}] FɸY-e%0z!1_]} lT6^:k,yu!Z5Qg=m?? H1o=cҨ|użl6n %Z%X6hPSTe3\tDQȼEjQN=296\ܛl9RśY:[e&eߟ$FLg.DUv?KsWILf3', a?>.{ )wuQ(h4wofWU{oݚ+sHIsUfqqV[Zmm~lnh[Q'Af!! [s>֭1UE uskwo|>1WcjJE̿Oi\j.%p TܡE {_wy7a9R$8ӌ3ڐu/3!GLF MP˄y2/fÛpNy+g4)% 2hP^Ȝ@WYph;z9sWI%% -{*EKYxIYs5f=/ ! 1OzeOhs_\7pcUVEiEiMl6TՕ!SX'  j* k.}',?o(=J1 =w}9y_6x'紐= P^U"N 1chU%Y0S8A װkXsmUP 5S^{1.8~ "mЖ=իFDq{ػX$`ރt5-6HlCe. aJ(귻H'hKF5oA^;$s^p@\bh mPDeAg]~5OS=xb ᾟrnʜa>_7W]~ 6 p+D}N O+Xūw}NPXv7d}xNA* @#!ʃ1a9uP&0P@9!*s`(„'klϾ$ƠRGXlB"$P|HZ 9xr"vtt?(EQsc9|!rj yqt C\ Dc-MAB)TuSF)7m4+yS!?7hxE%,l Z.3?/)u4g5ig}~7k JQ8bY'̰Xt.y ?gˮArH_ =0& 2@nP⮝ =p3溆N`Y뮏F7"[B@Ax־MT6Rkᱮ)tNJ ge!T| 5Tlg4tjRăYZZ i:SIU&ZiTߺbmMz6xFF[0q5O<ʂ}>DGM A?Kec:+Gܽø6IYLb&JL=O<;7n+_`ߎ]Hl9)^!PM[X~c+ @D}}V^xL:ی?k j(V|#h5>k-R8"i_XQc2t؄,f$[CmF.bց`msB++$mDk ;Ny q m\Okrh Ŏ6q]C4?A.k?|4W[I@f)PoDz⊗w͇Qa$\pѡxemr}f^vQ$V(<jcKT'c۸cg;w}e˫N/ ;߮ wMTuG7ICoUpʀ8mt-Gʤa}v9K*75kogɝz-7;.`( "CA䕶ă %ERJk3 $ơ3nZWF  C)RN-9ŖӛAUE: 5VoKGdjS&cXA~w8y:Z\\s)ȉϨv:\Cs<܉_ }W_l^l0XRwPQ?:q mE 2[?R(UÝtG~Үs#Q@vҝYT9Hh2Y,3^o1 ⏢Ĝ3Yv1w-fǞ30cW3eg6%Eu3PMvqyiLزL-Ibhd) 8Rqx/sN'Zytiʏ% q$ *ș$^ *\O?:#i# &DhĚ᎛9֖8uyvv 4%Nr%DAs46@%`+fT!viB=rH+} +9.OdE8!*+fV3ZȈx`=]J% mU㷻IKJ q١Ey",âF!<n)>6-SZCld,'sѱUt7R I Ht3M+pUo t16ޤZ|Щ5{ͼ8+sN 8 pbsKm| ż"X,|k*IU5.ո,V3I]Ma#Nljeg7pϚq-eQ=[>;^z /h ܻ>klqOͽOӌmp0Vg)Eo[|Ŝ88H06ugg bR"N]OM86rd~p@kGXdB*"}|*K[m͒T_Z"BiGw."\t#a̞ѴqPC#7.#4>DQ*oЏXg:Ʉ=>2lM}Tǘc䘺=X #0юjb^O_6#u&f!vػ|\.ǜٳr7( ::[oasUqJ51H~[!6jWR^:x.\t<%r6صˋH]g*i B:-yXi*t,~g&ݻq}Km H,A-?`߂􇸛~)ȾX@v8 r]-Ѩ "F sP޽}BKF4Q|2=;pMzOe<wosΪT<^2l1+ 'm1)=BZbn}k sS6 ts G=xǩivͣw= - `9ƄyE[B =+|9?*k+VobY1KRb[>onݯNJ-dekPQ~8mqD a'z5σ\ӽq?#[4߽m'u(FZV! ǟŒ_Ec;j$㫷\˽!>xg_~ N ϻ`bX(둰3Zb9v~O_㷬渗>^f-O!gTuCu)4n;:$IJ& Ù]Oh??B52H!ȞLaY4 ^pT0lniAIyKE¦X!2'پ8={!N+Ɔ0)U-Nȸ tĮ ~N;Kq y{%p:= nѰ(ۭB)R.Kݰf,ïh6.zgXqB2!_۩,܍[=u#[nę SX73?5zb>} FloOqT `ߧ{ F>nKck1eWO:Gٻ4MMEPqO?OPHE0Tݗi~4LxSf-ǝ~2+ORcu5r;Ŀ&Qף0W[Y]U>tv晇Je3Yc:BTo p헾ʼvN>8R8cMF-t=gt )3wjE:?E[?']4\A4Kuk~63X7 T긠(^TIuCӿ rM!ݨȆFQ,衊KJAw^v)4g{LAD%QQvr\ieQF aC.e7.TKe-9BUUZ0jq&BWN4!MPt:Aq18H[&a UN"od=l΅llKDK 5RcBPۖ-K1"nyhv=t5W{z>c%AJ*͊rM` E `Dze6OmȽ7?ݼ4+¢,E`pb}YB{5yN,}ﻆ>G6`OkpahHsܺg~qjl Ye8Hm6WS>nrN^.^\v}6. JVpGYbb&V?~h>[O܊ NSR7{Ws?%?{+'-9okAHT薃(EZ xe'ŚsyRzeK XIML?JBf皍_bw{$gjʎLRv%(FRG!gLȥ36)+87xDa*Ա{?%좫8dJL[c"Ɓ¡%ٸQBf-,zJOwÁ#Bā-)(N>8>3y*%~ *Blk#`%7<:U^R BjV3s[IAxǟT06G̠c C;8F:ޖ*Tmx {K #0 (cA@,:6JruPLNR7˷BKO+aHk6&&1IդsT$:QZVesh8QZg~Zk|PhRc{jʮYWMF!!s g2>w+^NW{| LZkJq7:Z9A P6R)a;X!u{Yϵ3n|ѐBCG\J)-A&YZ<>OLJDwksRDHl9u_Vs|_GAύs[\ bll~T㾝}8tɔ#SvMQ֏yh=g\PO6.)JI -W(d$ Пt.0ZwI:\u)2jVQO$k2ifZ9\=~y 2 tq\H܈P6ޣ14qqZ6k{PATRzQ Y0o._ߘ>D2}\J$=KmH4#^MPs:rSRSf/ALU@Y(PhnҟBerRS!RHS|tzREDJ&L CO )?;~_ ͢z0EZ dTP Is( ͹̒|PU'9\qJ6N ;;8fr6l=GYJ<2w O!8&ڹWw!lgE,e. YyB]XBDYNIE}H{XzZ+<Ǟ Wê{xͲPAHA/Cs܊wkR ?]@ŕLY˺xS-8qQUd/9 L> "MNuw r5\vH>cxwpl, &A]ZW_-~kD*iYKe|xQ8٬7>zsX>CE_(رk+,~I5%M ´D=V'^g-N,F͉os]$$`,ݍd3=RXUb@J\7s]w;ƄrjjMhJ,r kCh)FT!O'{"sFtޒr[6ju@PЊAmVEDJcC.' (!pQ B,0dO5J19M%õSj*4"Y't ZLj@ϧ*U?1HEZ4X$ęA.y1]3Hp$TR}K,]<6t} I3 FsΎf[_X1M/[olۼ/1,]RghĬUc>\M 7jS #z&AH.E5&͘my=ذdg@ċ*ŚM6~ܴHdZ2)[ƍ:8 လT tb#3Zhpƒ%āBY4!*&jCI|o][VM:cZ-wllL9eUhf9YTz1 y}#ѣlؙ)ICBQ)[0wO9 ~b-cgwc7e*N?v3ox[xK_’1gz{{w $*5+4렠4_6 6l`0I LyC#*]e5o1kUWP' VRy@&͒t?GmgQĮƾHkꈬ&*.ۺ Ep-<%W^۲[o9T` $]sn,ܨPcq1BLb,&0f`SZ,%PI A$&@1I XyQSFB՛Hap^:{x/;<1z7V%Mɻ"ĞU;xwfpVV9 8*[)W7srKUTQFaE)uy;&T[@K߾}ފ9,* Ё]dY*8 wǸqѼM=wlbBx1CD0…W.*3/>AJyxl$esw#r%b~%`Aocac ũd ӣJ(xp'U\etE 1B*Iض 0!֖eX 9REب)q'p]@ SL hC ,63qtKa>LP[0b[s;:ND:S7>Vh5:ШDk~=%Awnޯس3}k^$8'£raA i4<) )~ kHdyoCLi?DE&ccw|x1™uJ1=x?SȷV߈ e <'ӂ9EVeEOmq< V!}51aI2`Dto~W۞u/y eb~tfwa wyz=包iw[A$x]aE\]ZR$ӷ?ƦOƱKOs_,{%+cx-Gpqr=?@&#Ÿ1zVmGͣMٸkC*3u HPN:ޑÈ?⻾* /&C.*yRyl)q`a3/|wSHrBmpy65(2i[:~W.ťۡ5՝%7BHʢv;?,Aȶ\j^LEkpC2eH0Ս弙KQuXVFO3%1Yie1ǯ z5Rf'A0-9SAIYzٞalMV3dMHG_w홫BDˢNp NSi`DX\VK Xx$IMƠDaw|Z20BFc,Z)D9IG0: wFh&F+m 5MO>qG ,!˨:HV?אuErkYUg#B@[1lI[A`yz[pcX5#:BOo귱=Qӵu.>a@rh0^Ԕ4 h `V !?<ʷp0Uسg՝TV݃^ů{=tv ɖMDJH%_(`wYj5"pN7.5fMlm&5ҀHOB%Ƨxmk[Q!$mbѿ0GYJ Ij5y~?S\ jM) -l5CWdVT\u5pVFw H'i}}Zy!I .$h;%o[ǩ+N[! h?խۙ'|cxtml=j9kxi,LH4DHDF毱`Rg1ȡ!-U|mo+ڸN+yC=|ny穅Ac "2 ¥@Cyb GI8~xy53n6߿{B-H1o`Ȗ? s387}S,Iw MTw.GtdTXz(' ֖v$kGow?]:$ N܄~n ~! T L62{D~"XQ\H`3Fk(ʦDǦ1"4jA|7[~[X#d # r|W8G45u2PemҠ]>K (`u,e^C@Ja@i!V0Oc 'm*l=ה-^ۄmq9JggF{+|צhRf;@aW?A)94-- 9Аw g2=[ P[5G]j5D<9l]rjy#Hd.X:;N(qVwsHe6l([{gIeɨ Dg!et~{ c T=b}: 7}_>\8h#O1w/Ӻ9Tbϑ!P2fdrnHBi@:\`Ŵ̀%Bn#4"Xy,McM3 yj ٹ?QaU](L96KsEZ[l4%-,;n1mGml< 9;jN/H 7fxħVXHukpf؜6+ջ"ilv W.;Gh㲦9N>‹hjO쭭Xqcv!% V6s3E\qU~|!ٚpiյm(#tќ8}It샔CsI9bCNplu>7az<^WGylfS'eBqF vDAee"@ˎy阧7w;#-v+W8ǫ_5Wŀʷé`̪l&Y\:H\p T<>h޲YSp;$lNo?wy%ocޜe|YD`b*b^zތiD4MF?8V-nfrзq}i?xD}KѠLg6Oֈ(kv ]]5+["Mč85^'1g2g HG Bw1e0NDC[+rgbVB嗳E"͸[0?@1um"vy، x dLgLAE|o-|'Kuku { 7uZBkiηsʲsxYd^T`Yl<<~'.󻾪 lY(f!Qi?Wڧp#~hr. 7}XugJAU!}vpC>6EZb&T"¹+%G,ዟ4 ׳iĩLEZ1 sxA1X\wyB1%Q؎Ҋ-^u֩\uVXE4/cnv-73Dwܼ7/hEywve{Tzii?_'yrãKT3^xX |UHm$O+c$羵)2uRj*$iD̙A5::GOO/sPT}=[iniݦ.5 Oؾsrb, gu|_pݿ߈!֩)~[MҒ)bšTDFY 5fՃ( JQr^c/'HL!֚rsI)OITft)0 jXR#pB>p |n8AoliB[UN2R!YEbX;{-gK,* F8P;PA̡^gKJ w| r>c%XcPJ\=\\bFs?Oˍ)X}as~@GyLj7qƌ-k?Iy_~~7ݎj2fVwZ`7'ֱG(mߎoRI1~LJ _"ZO^ƐTH9v0^CTK%|Q ӷv >ˡ^Ov" CvIǮ X% "qfBMba׺*ClUaQ$<ӄ:`+)m{v $8e8UV X2;ǚgۯ(-F8z -:Hi.eލGd0 <͔*Jg>:QSx$6h;DT;v@5Vҳ/}E]ᚧ(܏d\ܰϟuRY l@uto$ǩll4«gt}qXP˃EƽK8SpmeUlo+sf-uG2ZIg.5@R 1'D*J.`S>yd36nfM)/%l]w EW̢&@jn~7BtG jbs0B !9RJ{=t[>QxKW?[n2(qn⎁L$t؊C`*;BZZl;3roɹ4"+℄usYxuhY:bU18(`"8ERR7! KOϝ toO]k:4m*FuHKc;B#3@ĴuPxZ6͔8(EiE(AwOmٝ4qvqXÑY7bhguSNrP"c#W͢HMt#lj'j J]&,eZS8@2sc8Lz@oTO`nݏ@4TQ~nq!*#hMMr8]K.-d] s *lx)k` F{!c.QfkfyciIS%eUh'gn+=IJXh1;: " e[%v8͖tk2a)5┈E隚g#$+{ ŷk*I `lA2zF2s\OJ =eO"byvl/k4L|/C6M\tM隆 |{7۲]Q^C1L2鞕bRSlmx&?J8.e~Р> ϬvDWY;G9HBfSZ5 Kן~1z|z ~\eC){MlT* *_/+;yA]D)a a0ZM&_+k>q#ZO< A{)7[_xXo5;x Qpr"(7VÔt9O2XyzԜc@*ЭSnۂR҈qhĔ;`VivzEB-Wg@ir{7?Ć|Ʀ"Hks_~!;9sX܌2q&;t2#lL'fsbY?[r]q]쪮}kIUBWWGuT @DL6X`0?{\l…ka&|13~ȀYIsUwS眽Z ueO:թ֚k1UKVy/ `6%'.\fFDez\gɼebmݩBfw)$uVT&Cju BE\X0-W$<|sGy \qy?$4X;Rz; hzTa'ԧ?Wi6]FO|rɯ'2]DQ J()v|^ÿbNMgRG!Y¼%5\06i گUB]YTj<-^%XeX'tQ7~͋/|,ƸTuuU+ҁa?cpђ\Db@-Sh 0n4&)## ;})s,j\$.fB½]LB{AY&&S\+ik6T/Uf/Lk!\I"3Yu/y>ҷ<`5Y:J|iͿB-amB5GiZ`Sw֠qEQ!ϸ%ʝ;)!ӝdj;D| \5GI=KE"t1٨lsԒ"i QEHo֐|Ӗ7&lk[Gj7sS8!@@9t`ok~o O==h(6 USկЙJ4Y=Mϯ ʼn`ly[ $-3bIR uH mz 6@piXT v׽J$q?kzq5,H9\cnDB$ם_qrTL>:YJyÿ[L~RM.Ȇt֒W 6sy@2C$CBi݈]jKf (P˟C[*@M&6AvsyD랃7`re0dj.=SxLqɡ`,xc.+7""4IP117n3EQ|O IDATRSdW.)C8{}715$|7O),p8=p ARJu$j,!)=Xe1⽶ށ&)p7 KNΖqN* <3Yw ak FyOxO +֏̟s6Q+FuLDr.n2s:=AYP5ӫvwdD'.*ͣCBuB4z7fN6E/R0!)!Ǚ>fY-:l@x:rVE֯_)A੹ 8rdeR.#0z"G\';t(˖B[Pcd|}~:=mawXƒe)%Gk[0U8֞}A/p3@iS (6AI*C4JȓPʑ`y=j0Z"!H-.SeZ4WXRa% BZeId s^԰u@S4gbDL.s6Tjua /(jj0*r(4ZdU~M97j(  |\g5>|44md|Ť5z+uܩ9QB# ^w5sǩSi$CCy }d*rmS=Ye#JUVQ\.&E.G b8Z״3UI9׌\XB$$MXkzaW(3J\M '6ߥBjyEvi=1֟o3]v>xI gi+b&ѤR=64AY9eaDBhm\jjs=%~1w-gtQ Y,kCkzeqW#Ӟ],lr8\i =:,T;*.{zf)sPYalSFyM.Yo6*"#{5jNC-8_F0B˙-M[e }q#A7ìz5/|l|.郛dҏ 8QNE^ .o]Q|u.Yj]WEr0c8QU(D 116贊| զ8sWϡPO7ۆ&(GWhMP[3B?@rt:B> ӣ&S.[CC*߇u32eu %X'8IVSq,@Q*XSj1|~jZit虊jm(W Ёb`bB!U:^06q_ILivCNC6#?ӧ" Nsz9-;+stOa7O~k$kz|+IE'bP=;>C=D{jyz%F$YE2iaJ4dDU I@J5JmHug. hϦ48(/¤4*a:ǚ1=8CGGZv)]a~&8Z H%\;.YI qʠL V[ Ո%cvLCtKMogwoQ*+£(**i" I(.w sG>wt,# *e1ns;ws#[u(ONOT1N?Fl+4612SUW(B-Y] 価qa}RTJ JѕNy ֳ e:Ymcql|n@ZS+|&M'z7`B߂6ٸg^hipis$Tc;mpjKeb*#<P써6,\\D1Ө{ޥk>N&0NA`2ۆg647 U O$PԊQH/m@葄=XX"Tdoz{0a@ɖwyXm!5E1Q/֌"@)Jyy2+i 7)JѭģS֑S^84Oq\sc$n ދ#۾Mmr^:oޱv Sl򤋟Տ(<~￟JmQFص3@ 唟}YeQ(;^ tU)2ldB<Oq۩WHWP׈>'S%n<֟?y]ϗ> G?;Hg[HL-w5En>JD}1G6[y%zSX"Xloxk7}frnjq:-IvBiDr8jBgxA$ˋ./ah6PJ'D!^V RDqJ73jxf' N\I};q)Jͨoy h;‡}{C`m&I-eO~TjlX8vNw9@ڔPTk ιi qB>5 4uM1߭q^[ALDfjJE/hb>N SZdMUSū.!,I/I'>+~*ApquyJaw9'! -"݋X"qNqMI=jX@-v-Sǹ~MPac1{e,`] cfnGnG6Med:G y|a?i فŪ)PxI8 ũ);P<0D>̍_|/U:6:q Q^lZ;M`Gx5ׯ'4-@c܋%,]pن%̛?qoNܬֵ̄RF7UyN^r4N/V)FNh fWq-1E,g~ttl(eZj)T~Yn@\[qSz<>4ORd=͙3'j;-),:,RTot2R9V[5k[QmE~6>(:Acg7*!U z݃wj{~F})AǶƉ>S${L$SVg۳[7) J4#^J۷׻&o3`b'QuI֙ªA>(<3S3BXc^cudlE="yS!RʯHaPt]/_ba:m/7|(,)8x1:1 Iwލ=zf3 V< =)؋.'??y?G Lx,օ?w&_M̋z:j6M?>.,DdL}hs.*pَec<|Azm;_O8ڵo p[FEIޚ?CS5@QS\|_ppH+=<%V󒗾w'1 YddxR"$Ǟ`xZ8Ts*Z>Ѕ.*`r,fRd2N`瞝`zq02)z) CЕ*64\6{mij:։>D9P'C=lsZQΐ)A@<Xxj\.YY>%^qeY5ɟtfvLYv+J.x"'X7uqF2&5j4S)MC{B5??{xy;v0л+tzW.8MK&u8jRbqA祸ŮTX|Y{wq=۾=~kzCRS[޴;ޟɵvFE݂^.Y~$9AMOdf&D3'M7R9)J ,\j1AgaʬtkΰhެWslf1sVSz#MM%ΏcK(fzRxʥQZTl'ݍ+l$A|m"!9hDǃO9S$)xS㯸u Vg]/ $LOMuŚ}sCKz%KW7U>Jks|j0[UlT LD}V PGk&t%v3̏oK_|׍ Sz/-7\o|/0FM1mKqR. &'jxk]QWn^?/3"Os8?I9롻zkH Gkd728h<2JKYSB=1^eڅRy'M3檊O IǙR\^f<[+J -],> ^uB>Q)ٺ'l'PT)rXb)"Iq29YLww7 A*Z.hE\OBx|!O zLEhxGظ,P,qNc`I[56D9@Bæҝk i:EO T1?(V &T! !aq%yc*0:c(jSxi^W291ɦ)e$;Cip {; Ct~T͇(WF)AqiJ^s^p-0ʄ.=gRشRX …Ô8WFˬ4:05E1T &p6/Ժ Vj=+YiVA罳F#iJD Ȧ ECljp*i*GL[ÆkpNbk3߹ܜR3' :mP1nj+to={0i/H){S|mv6 wWy(VɬmP7=[gɄCJ{Dq/o KKM;D~-M;dYp`1 'n-f}޾"ՖvBoc2˵L:2 3h8_H I,pSQvߩЏGn9V aJ"Lv0dRb2ΡEJqYNl3;F+ΦvASk C$>0Ż6χ4,iH@F0 U!1pI'QiBl)v r'R|&/s|9ϢpA` Hݬm{HS *.X[dl g2ȒRT1u ;dQs]Ȃ W%'x~=u)S%%*諎% _5o/~>&) J<Û-<s%uC8[S}wM_i9mg!'~5NL LF~Tm;ъ{ֽp| }߻x“.Dm)X5e~5Vǝ̛6wuh. ~Y39|ȝ+ '8sN%Lè|PqthricBj:eB>VO)#DQ.Z30DB!IVWflF>]Αus9BD z]rG&'Yl9c ãEtpt4t48ȹuZ),lƹP=gx=W|D4 @4*زy I|p]82v+Anu7Zb`F〺͓?GӲNd֬seg[ƟlDl3x=i=5uF5f.]kϪR-b :l(V- Us|EIkMkz&8"A?IkB> /uNc"#o|>f (8}&SpaAH: kY@ND7v Y-hggOi^wg{ 7~gb,(gc/7_x%d0on߾Flydq ",a/S[d_?Й=w|VcW?MbТHi5Lh sdY͍ZK` Ҩ>'vۂYL&wA>>>%I^s GvD9sj 6tSft*M߹6r~?Q'Z$!Ch?b=¥)ZiϤY4ֆXjФLx^m&8E#P+Xrɟrg{Ũɫ)C D>;Ny$E7"G:K-*HXT4oWEk#Tݎ f> ӄ[-u(r/KS6?졫6ӊy}%z)-ܺ[s_\\NQR?2_%Ǔ3{enhI[>x٣G r(56}=z r\;'&J!/SWc>V`k~&_v}7m"txX/n Ӥ,j%X:fZT(l4j9+p0?3_n)\|-fZJ2|zJJFTat\&'72E9Z-9Eww]YfIRURQroAO_e)Rb13ϣ_GGXus"Q G hc* ^Ñ#1ji IDAT7j$'Z5֮=qKJB V񖷼粂:\Y~f5Sso 4Њ? )'^666REl%''ODmv;:7lHGiKExRFbg"tޒm% ;++ۼ韛фK88~|谀mӞFZvΓnꜮPV*~(q٘f% Q8兞 2#sx& YKֱoqxճW^Zxn70;Df krZޔs]`r,dz0O ɴK_r'l^u\jZ%Avœ^Ynq}{`Tt?!#J&cd2Ť!f{_ڦ0 O*&X@G&١u3&RPc͊eV)FĪ]Q) < f;k]K=s A_8!Кu׳^V[Þ{s#'hմ?Bn~q\跎S=x/h9Ͼu=vO~V5˷dPlt{q$* +gew,5]DQ ,g"ZW3vm] N ) j^*v7fKPf#! b?jȘnVPTA@4ߍp %0"MmD->.,4P-3{; ;Ph# ue[ֈnshӄYސ35:p^W,o[c6&tShu|(b~| w ;psm=_ ,6RiOMv 7{T.MLAhخΞkζ"3} ZTUWI,b?+,$Eg99( p}i V+M͖(NaЩ{Ӎ?ɪ ɴvӺWX.Sµ_{h'X˟½-^PekGf88_g.y• o{ri6 OفnZ))kV:gOoe*YعȢ;EhDrGgEH4Π`~Iݖ]YrjF<֘uj&?!nsduc[1杳T`6lf]9`?G?L! 8pl[d$i*v͜w~OZD]qD ׫js=U6 wh M<0YLSˋoD|ӤXcFѠ^my|'xE]wS{F!)%P@DH9'8A-U9%P!)]:m*;=3!B3 hNYE&ʨvq1r4 TWh75^_fcЯ}d/c.GSX5 *(ӜƘk_mūx]D!@XB(k4]dMr1]R#L⹯EH/y^`WZSL8 Mf>$mɘtv;] id!Q!iV8JfnBcℊ33F[ w%m"D-2{D픿U pi|1B:AR[4VK֧亮4I<9ĩ?7 `ltB!ZwUVn2r0+W.VM)juǒ.q/::΅"8Tc5j_a{9O8(yq2>hċyE5-wh]T~ڂdH T7|8׽u iXa /Eo"q pf`q]u9+y򺈟lMw2&}Ll)u}ۇ>..BR,k쉉 $! Q\Q pM3MM+iE;I^`u:Z2^)9҈4[E#7,Ga4@;kSnFAurqE@ g-*[wӟ 7}0T[n&맲q DŽ,$B%2RG%)qCTT?HG\ˣUHbut+Wf9̸ ,w|Tmj.r (m,cEc+'@<tQg?BAȋJ{l 3BƄČE+ Б‰nmp#m*gh PeC]]rlDW!PB&̛wg M+Lқfp֩}TgY[h-@]K8f}Ћɘ2:9F+͎{I|ǎӽ~v(:! {riŹjeeY͍xtZC^5fhe{:BLԸJTrmZ1;v~ҽcǟQC)ܸjIFCT+ޕ1$Aa0숚x{ҙpQy )n"M&ؒ ѴҬ9N'L1O#׵o~0>J#>a 弼ɂP'7z{(w qE+/e|۟7g''Y8t:^k<ڑ@PgA9G/`Ɩ.G'Tq⽉E{F= Qe;nox9锡Z2:1Jbj5˞={YvaZD B00CU Z+z{y=S3֬De^VZR02:Frղr>v3Hu PzAX;]3OR rK'-m\ xm5V^Cy_]Feբec+0ל+zZђTPwН 2P{m7(3,2|9،: QI:7P" 5l&ٖignzҴgsΎ0΢/mҞn&1a+:Gu3LW\9 ŧ~誏GWrϞxꮌ5 3ʕ`ӎ(RF5]J١\kp8΂IU2=mkg# ;"9  ;|(J:0WNtO +v)iHS 'Ӹ=VxG˭[b"Io 8Vm }`D̹vZe4 Pګ&=C{Fc#LLTWExiωyoM6 9+\`1X"@7JglFAqFo**ꜧc(?8O@mxS39dqm,$تUbNpR 4Kq*FmJ ?'1ʱ%@#9[z\sńQT'X#y;Wr_}`,N&2dV"djW'k^UO@ϻ.8׽眻;dfL2C6 5M@DPq)jZVkoڟmUPQu-! @X}Lٷ{gvqΝ3lP]pg=|>{y-bA{~/\D,!Mo Ж饶/.Q[Hg 5T0\NdZC mgcOfg4OI#;+O88a٫ n mR3l ^%474PUGv dq uw.mRRu͝R77s!Kh%RWS'4 ,2sM3_d;e;Tg/(FgٺLZX'X#I.ٸjg 7Ll\~??{C: KI>dfΜIfE[&3sF[^M[[,}6;:0k+DR& id.Gɕ0S9qUJiLu ņtXhsBdW> WZ3f u}QaZr&XcWS(34?m Wą=x,5s M[l^O~]rdlJOeQòhqbRQ*hS-ŏU|IDĘSџ:H8XU%L&߽}y}13bdD5ĘBfI~4+,z Q7<.,zNwLNq+EeAQ)*EOیx;RuUhG?=_o@sW?Jyh! ""QlbbM_HsX8ms_%GS,;w^V{t\rL1Bm"drOQ~\bieތ7k{#(x;3 2r-&֚%c Ic"bﵔMIoqLs99:bZj'eO&>iXFcZ?z}yyDQ'|7{ﻟWvVAq -ThK<pkmGlִG 2Q[<7QnǦFkE2#9Z/{#֎oҽxA)>kmcC-6?[U) y#4^: RꯆSl㨢:5ƄTvjTrL#\{%&+PaA5q?EK`'qMԝo0SI4Ye~Sċlju16XcqA1rqM`%C} 5en#Ou|fsY\x\1k0 5 BP66@ӊ*.r} -ORSY I| &0T%yp06@V|Ȫ Z}>?.Lm屟A2aAYhT#qa-1.ණ^_|<>3T PRɸݽ#,ij^ SLL.ㄐcrko`…NT%EEeUh"lLّ }]=l۹GZs>B$uʔo$aoM}"&ٳENlskW%Q;á}Œ IDAT%T%F04<@k s =PUS05յ8p׫bQ=DuM bf͢:fX܂"ӧ hni" =fbظi .-/qɥb둟#`fK nf&w<]#qf -e?K<)!\JEHiq\DT1$ޜ$'&5D!C{oOr u#q˞3ns EɩG>Sz~V_Vky^Kx &#k 5FX$\e6hi=BXE]Lw{7x( g +︙:ۅLby\)CB\6њD"ՖMOVb2sxX(>67L89.Bc")vm!y2$hKIĹ ~9kǸ_k~ƙ#m z*~i+}.en*ZM[,so~u|m [P0(E,Cz# >XSWPq'Wʫ?`_'>,׮gӳ[ؿeŹ8q @spZCDFD硵[>þ},^^t 1ctruuhm'`]x!3"p6rE~<|ira+[ ͂(JU9|/aV"ǹhM#"q_|n9|=io%='UxR?7CڭY"F6Y2GI ӧd_WD} L?w?iEцm(jV$w"YB.0S5!{;BEJ#'N$; Bգac7.CK2G7<:κy~\w^Cu^WLjNΣIS^WO%|$A#XRwZ ֤_ƕ i<OQQ:j[0A 0ad,00:*!!#*q9U6 aLc^FWXAxxb< 8Nʨ!l#Eqښ(lԬ ;RㄋREύAjK6G.qB]T=-h1WX`xB57v+X09Q-T)z̶%Ib4\Wkۻzy|K˒Nji`D'{IG Lj[Iz{,| ,^Јd  I!Q28PyH9z`PSSSON8/1Bl%]Q:L?~XUl7'T͙g,&+#\ ΪEبkOaX2sZo~-\yU:LGyz 4zSp;vw$*Sho!)ǣ ] 1?@69|XU+1Hϑ1MhQeD[kؒ U]Opdp ;6 MӦEML&M3d0ڄk|2~$ DTVV$B88*SL _)/Ϝq3sjC{O`/-Ψ q5#@3f= 0ĂQ.?;?},VUgFzz ^]^G*3gSYUI.2HVM5Vභm$ǷݝfPWxYeă3_ 'z (Ǐ7,=ϱ`p̆I?pAR5 ||G_o#X][AS!<^O3<H[b%!/Iao|nV\7͠.* "/)N_Nn?8ˆY꒪俿kd\9v  [;yD`:97D;o YoG8-7}?LDé0bx (Ϟ?5bpy?ߕ؀}sg _`z;~C [BGQ Q,B؟λvf͚/YDiMrv%[餯Y(Vf28n,wFGЙQ\UU֒R/a$[O < L\#qP$8ҶԗHB40/k 1=Y$cXg8Sw'|-qaL ] ǎWSu j#1˓-jtUCgbdMgܳh M'#̸8-[XRq6NDǏP]#L%E4Pa]mF1>d!x\u!%Eo݃P>-0oBdz:Ƹ맣[%vi%Gpp EI6+%(p') a x@D#n@[-PQA\N jCv94*jd6?B csˊqQ.h nMB="cp 5nΛ\drd90B XCa"a uIԫP[$(FFVjv nI8Bab:i* Ң̔d7%\x^bݯ;6ιd: #x"eMC+?1ʺ|+]yx%\ X뭍} cbrMcP e=G,KZGCA!dwIlΒq9MסoQ_Rq@%IAᅴsWbjZ̥g]k/_!bs ZL"׿o1" doٶc?mU#ʍeKd8I/FNQYr|c+(< nZò v]3SHzu]Xu`z7\|׿ﵜ9$ $)t {_YrK?WmgTKP:)Ծ%:QSTT%,=}Y>xG8Ra[vv'q3^1D9SȒ8E9<\QKedcBK7w*Hn@X3*P|9v'SXEI_rT1,ۓ呇ѓѼիjkkhC&yj+W-P .<;wq`Aotr^_}.<*SVEyh4a 1B]b*5l(_ 輏)BrĬ͸ղF ETcM\Ǐ1#$[CJHnٹ62b s &5nPnSmAF @(IHbJhE apC\I1jøkM$ _*LRD#`b ]TY~?/eLEtFPWegXJ 3L9shhnm WHȨ8/aK::\e٬q৺9P\LY\$_G;Fl5XmK :.ebP|rB?n! T'U8tOrqNlLYaԼL87V[cy@#J͍r ((~UЇ ֜+,0bLtȖ~-D )aNBD;˒fέetjI,df={"fJaQ[*X}y3 44j"صrǿ) lc#cju˻xanpM53808{\%1 EX:OtX5% )) ܎--7_COIdmuc ^2G.-y=¯w/M"Eɀ^p15TVћ 3kH = 18ℸ#5`p|7^{ ʅ=t0;FnhvK1gv 2mal:^xtxbFVu&C@#;H<C>n< Wd1UOFf\͕\m﹕gnMwT7=Ȣa,]I臨z݇ittt2$buu >$矷!fb$3Jee5 CH%hiiFN[l54mvfnű9s{njkȌHg2%z?9sg1olK{ƐvJ[|JHHV]0'Õ/)|Fl4;ǟ^RQ3Q#v?Eshptwe֜   300HMM5Z+\7Ձ--Axn a3w4*ŅbAU.b+5c0|!^f-BnxMX)J_ekW!h7g䞞϶4*͌l_:46PUWǮﭤ&jX[:6ֆRGs lDZSƄCSA())|g[9q2_)J^_‚o"pǦ%Zo>~zCվ'z XL< +bGGV1b|+VH5H.{yKv_=74܏:,KccEV_PCU2?9EW4rYI<Z,Up`چ^)PL?LvSCb5lyi3&8Aۗ1RZ3Ͻz lh?U V,9c-}GHD|BĴ8 57]W߈$GFac1dLpϰwbYc~Zs{1`@S{/M^Ň^9 ş_}?;v 2sCۼR>n,>TЩA̢ubayc=[=|[¢g_y# &uH  tƂto^/:̘97ę˖pP?gΧ^/;.2Zgdf-\A**gpA ;w9Jz|w;nŠPhaZ~bD&ٺ>f9UGɛzyt?}f|!<#)k/b(Q%RX+ˠo9Fe0׵Rhgtw57PP[Xʍ,?ʃ;3<,߉͖!~T.t1E(zԞ'8zb*#u4 "A o7ւ -Ĝ=hh+ʳn])(jL/)f2BP0TZk硔8AH#%1O5x80B5Ժ=G7~Eߌqg7Bԡ* oQ Ǔ\⺡&WXSbp"=tB3cq<8v _{)&>R>R_ùk.ekn͎R߶:)h 7$)-@Zt &BՌu#.x @ٰcUϖ!8Js=)1BtSX a)6w:Z"Vo Qlzܐ>l:;Ow(6_ c-2!vObJP+I Hws,),lP b41;֏i}<| Y{DZe+#Bv$:Z2N:H4F"#B6m$ A%fk5aK`X"5ק U(5Aȡb .T3Ϯ1ƃrh(k/kB9a Qw!pl?nm&q+<5 u6IJ\oq<t S aOP$[r 7\RR0Rۏ܉[?y46~Q?*ZSKP}e=JǤ6yˏWҫ0.:RU]o6=Ŝ0ctۻ8NTEē3ݸ#<, -[P8>F{SW e&zFܻ`ɂjZg6i*ADEVE|IWq6`W=Ew Ïヒs't"0Qqv%Nո^ǬsX.Rjj`m,[0B@'7w>6od3륱FOmmdìYmxqCT78sVċ9mٻeV,H>jgq$&!N7sas&Iq9RGrkאx1K #t+rZuc6^'lĊܸaǟaP3}u&$ք: QIybX>Ryוլ\YG>6oy:+XxijGʓUp[_+xͥ` qw^XhI7_s& Uྍi*M>";-h8t(WhO aʅ9Մ|x} @.# ao*3%Ea4^*)lS$ȷ$u ҿBbjU uYQNx*S"$s.hGpa 90Ed>y!xbE!t5 }L.a 놪 fH˿WJXS)2{1{Ȕ&T1R$k{,en+Zk 3ey2nKnEs_کgՕRLGB' >;w$7wdLяZt:OD!ҸQ,FX'\e(w&z QRaUZSNg0 s{ě:*`&@ a8q c_ qNԕDN8.yox>~&hVb4uId7^s%mN8sI 9qGEA/Hy FlQ )`;OE)%XaHjf^t67abeF_/$_ǟ.Ӆ2> ½P?0Xg-VXBC]Ԯ >MHj-O :;ɍolG?㛽ۋjH- z67] C9BI ZոCOPJli㮯o|] 츑 {&؂W\gNIT\.*HЙxx;+<N-;Eə74C$ \v+SΧ*Gg!6;,HL !473zz,jBke @#-2a(z9Pl{f4+}Jv@@D֙VcͿ`[q2Խw\W}>);JZbɒero؀ S PPB<@?p 6wK%KU2;s{gvvVLdv[>%4ڶ344̪U`&2 ׍bAsDJCUUX,J2P/neYt98=trrQgF9| STWǺO7 eҥؖYdM5?VA (\nd]=Xn.x9 Om]deё,rHD0"Q@)p8PK VZF>1Fb&5ø6#V;VEVxOE"¸7{6+^B"ptS+ykoWs:cDidPMB`ij5u7cj_S95f|8b{14]_q[}Oڽt7tHS ", _qش6@(n}Gm,+:z>q18bIQ.< {cF،.ZEd+4b !!w^;_gpo{M+Zӂ-9Lnl- ^^b"j+ ʕxUU ظc^Om6kx+ nS\cA@Yu]gso7|߹+"7 Wt!vA,3^_ BZa&KҢ*)Ϡ,h0S1"Fn&xS,I )6ȦFZ<%Q]t ҒX?K {Ӹk d1MBɠKdB Q, 4Ho=0?MUR֛!nwLDX9@Oo?ի"AT5S7ÂҝBh-hm?~5ؕ(L(B3shߖ[Oyxp#[xQT:?#|_ݷ)59!6 opH[r7>c# QQgtp˷*g|{o~ۼM?5gL@ :+B ,WGQaHrvq6={cjc$>F,_ihR~'~ĎnƊE;Z~v7ͷlÜFh#\Ǟ׼tDe#$UD"e8v@Oq_Xp!CbTAYY;vQQQNwO' \ޞ!{`!HX ilaM45⢋.AXds9jZ ,2>F]p\|gŲy<{udIy4n"=mm!F}́GXH(C< #l=,s jj" HH$Bjk0'|/GyspODFB'l-喷G~ׅ<_dcy_>^jhqBHE ΜBłJ(&sbU#? 9 !<,u-O)nGȲ3jqyhgdص_;!8y8!'޸D9|4”6vvF)2DjQ`"i5R`*zOm@/!j ^ؽ9+*R P\omYAYA_s0h㄂C!; Q>ehlG6+쐘3r _gj3.,˨zF~s;p9}IյKV108@Ye~)#jfI1XabFHPL(sZcYӲ':3Q ,))[u$"k<jL#ИXQٚcPC 5҅;XD2w%]C812,!*IGw>.ێj]fSfDFc>W7QBz}t/|] 5cX2GNqϣY_o8: r fdrDuwRmĮ{^WO~f> ֞ ץ2Y^Ꮍ{>n}|g_ųyIʉ~?fɒG9V1FcxHwZϨloG#Tװi!Y{*Ҧ]nmlGPv 324T_c c ߀/mD"hQ:J=<U4$`Fm v& AD յ~VLJ?y-5܆&ѾsI07ǁQ^N%CrZ9|4ɎhrG9p -$qaӤSnY(D!ظi=lxZZJps&͞};8kj餹yT;pdzHiaaxngsyc3MM]kc_!߶(+A%QQJ.֐I{>yϣ)W d$ )7D1X7{ `ˢP[dV,hdHƐ,XkKbmūyߥopjw'ETFߒEgq'ߎ_a=QOعFy$Aɉ8qz NRܛx1fXjaZԙQ 9btv.M\`}.z#DJ$ˊ0o9!VV6gx+y9 Ŋ&?U<o&PDx;Ky1 H=Ud!0( Z/LO#X<#9ykp*; 'yr/>àc!*f#Krꚤq(N&c IDATEi@EZuѷ+<#'h$Ӧ$'b-Z~4e_6d?7(* cȰQ! CUo€eEJ(h3un=ӳ 잍~ 6/ Š%yk,[F:ҹւ 2!bATHDFZ2@,@N>-*[LLP&^u ]\tõ{ֹd;va iE/'vXo~7*ۏ⸗]GdgpdiYXB`E#K 2oS`h``8fqh#4dо̴6;[@AΘAL뢉46[E='ŁqnWl1@T@\P'" hG ;Xpjvb:;3P< D{yqj+|}|5̮)}w .s|A,1ETAI T l1,ZSq1w/ (4!]3|d ;&YqJWy{[ #]Q#"H6sg`"78n?/yMo䳟nbk;F2; oa"ZJ `\Z^Z<×*+%?z6y,&5b#H,kC:/X`N.>Ȍ!@ P!7X)<ڥimÏK4geן˾}{i]OcS=$lذDE eϾ45610ࠔmKG:͛s׬d,5sg-k5W]s[g47RQs牕ddb;f9=i"\ꕌgilrYd.o?ʳ"03 󨯯@Aw&Oiz.2+y q],Pyu8ط!yWHG4T%7~z6m%oJ`Sc\usƚF0nڷ<}"r"/ }yR F[w]x&?y&ɵh$܄n(0[ An$:Vw7L'a`)d}Hc&cj5\[e/81Zi\[(ARz0u4rnK21>^ aHrY7WFU'4=?N( b1?ƪB*1B?(OƷq$Ӽ{ BL9"k.D-v(MMhn¶{gp~K7ŏ|[FI(4iF@oKPZkW;^ɥpPEfeLI.Tȵ/DsP+kc')CTq™͋ ΅4̪ϱs-kOC&`I+l {~T@AL {  +D{zQlPhf%A=pg{Xxw+]9lfpCˡ*%q=^j\@O#kڠ|D.Cq2L~ܳOn0q7#t(J!)q8eSC&fOCFaN)ug|Qmcn| 'T%FK s͔p}],7@&5AM!)e[ *WHJF[ #uT6[VX&% WHRFa'VG+E* 0{?њlBpg`=KD@gua1I]L| ;$ų*CVؕrc B*:7Tq R. 1}iH& V UA4 q|?]_1ou!N,a^/8ޔƚʯ'تYXy|Kf7>4dfچF鏥^:.^r-qr0?W8s׎3 \13)ATBj?G}|}oG;H,O!oAϑzkM>=FP/Ç;)O;l;|с( &c4:3C)`-D`þ?P^D4&Y,[ٽo7T9/wd M Q(cٻKشi.RxYZ-⊫س{{"ɒ0 e$s, V{ϻ=m09`Lu ?rVg5(QW[CmmxlJٺ(˖-$ >}/p~F! `x$OZg)MƦ "BsM})XO8Βj:<% rks%s#YQ,KOK2u8L䳴elM ϮcUi8frSE! b>AP+`N"~ڷ_8́lIsߏcXEeM З+:/[lAh Wr C<%O.4ݞ` "E+/%سw[W\y2`PLvi'd˜q+5!mL-"h\nrYF)e\ϥ}w=(̎PZ(/JRnYx*%lG{ß_}qÉ'7CnY¶8;Ko_D#ģܹիΣv(֯ٳg͍H#Ks پ};u$̛7L*ϥ^޽f߾,\/0u}ds\~M<ď&& }c_7aP#aH+ ppjPg/\UI@܀t,G9BhZ LL WPp.- SiaWj~9p" ɏD'ԺDsKI"*ˉň9Qa6OاVXqE3>6̮S'֋x+y%sxvOweeUaB䖚t,/υ%6aC&d5րB&9Fb,DH|6*Wرm*"  X cn9͊ 뢊!7V?s6Kqw\絰j9@+v= 4|PU{/#\LSh*<#SU/K\B.\8qPY.~2> 6I!P0d3i!lh '4!|CD"( )aaJE  <8O 5FjŎTXrK@҂S*ۯM ̽(,.r}޻K|*`+(Bce(23;2P9YdX Pak>z"e0!tOYYK*|U >7vo"ˠ*xCU22Xhi+/_F:HhPkF2BdE!m;8ԳF2:Q'ؖ :7Ѳ8#N ?{?w ߚGZ3s'_y矈.gѢ"XZ ׿& QlJٴiY~$++I$*Y[I6ijl{S[[KMml N--4^<_ɦLp6?߯co,G?EҒ9z.i>SegIƲYI|z:cs 5L_}Yt '`4%(+UПxh% &tW*9iVn RLMK&b:9;SB}ɪ9^?fP5%X:^Ɣ _jƀm؂/gxJr F {?rww]nE9a˩Z t} D9J0FS9c{Yksqzls"DHhV(' LlT&933E7L, ML:B;cF9i2~<%G_76ɨcwA &,HSVI02˻jͧۈ `@Q8+b 0YJVp~)pE3 { Y /X4&j WCkfcseK[i=#GwnfZp 1dee(gM·-T5ɻ9AF; 89ƪV{_Z<]m5Wo)k=a=ErGpd!q,1AmC9srx0ٶQ dO 4l; cpk?s595ZƱhZQJdO~C;)Ev\0DveCϽ|>;pa>8Ō/>Ki_`ly~3_"N_؋e٬Z۷tJ|ǍEqZ[#rEshodhmXr {v(.-֓,[H&=ts@g8,g/y :&VXlesMW}s^2HkמMO #qmI 9*lBFH[to6Rw}W LqtD ˼rNLMR3d{fʧdE͊BL4'H_+M!RU !Kr(Xjzٺ^h; >.HY *SPP^i(9J 80*.RAK;:8~{9kW`e&({*CVU&6 W9 TF!FzM߼ G|SDV&>>ӏ(H=ՃDS)[[ς|HK mQ#CT0 Ry*N1|aLSȀ_x!0J%5= aP~>vI&1|S ҢU^ &+N1Q :\X}ī&TA QX_?ejKt Rɵ0A⁜4}}611c陝]cc$Y!udqVpm"(=>.(xgmF6?*/n0“m0/tDG P45-dII6;xcEc?f=P)\fq\hPA>σ*=;ǯ71>aU@}k\t0h-4,jjr45͝Hކu$۹]_߂[aC )dq`g;.}|ᓖ1V\6 IDAT͘gq-{G}*#B>`EÞt(\~;֎@idhsZVl66(9K t5|!,GV8=O Ehq(6|{6M2isv jX,J& R[WfDZrm?B46bæXb9lD.W\x1fZĜ!#^!Б](bxY-چd%-k2H"F>|0m!.ÍX 񍦢"OMUK?Cn%w0 o,H9Mo6TzYNsDe%xd=T4oL00mTU'Gۻ0R#&I !gx/CbfyUa@9x~~^sN%!K=f'3kA!CC~1E /&ТϦ aEp?tLzLPDe UϘLRz(C?c<./gw[[E*6}E$$KY[,"Be ${.O2+YOکEcZ=(g5o<~m!;vjḦ"RJFH;52"pN=J6`DF6bFՈI%.#?4qtrT6k[J|F.2neDXg5ˇ,4)d}>mc^Cκcϑg(GK|_a«r [3imz<,4ϗDXSZLͨ ךt 뭐?^gq 'ZGLҿ| #\@oq TyChh X!-Q9J% ءz~C^hf13@/Ej$aK/YLcQ.Q5!h.(X)E=D"St($,cciXs2Xmu='rX %sr޹\ξ|uw9(&fRg*_=0Q/a6m$i=Q&b>r_uu׾y؟e ;LhDtZ3 O,fO+ D|vq~*/o?~.;f w,Ж`z{S3(AG׽z"B2SHa$%26:B‰r eǐeq:w݃7m_@6~!1(Bz(41D`- Q_ٳ栅œ>Cm]/!Z%7.12'(\͒{& te9P{RI1}3cc eihl--sxXhuukͪUkزm uM2dsY"r/Zylbܵn.b^q9c.Zh;0{v+:s."q*5XTL!T Oyk?}Jx\}I4T͓,-a`pJf6`9tFQQe`h}f-LD-X~@q|IKdXR2H?a+P&,&6f{[SRv~ԇ $s?jxzs5,i9C_}] ‚18Тd1: 6|w#e͕qzz"A^hT];Yu1׻Xwų#eK:OޑcljT5ѽ(cXLR$퍰`{G`z*J Isb@8\4Hc "=rF3X%hBu S ؛Ʋx[};h!+lV8A~/ 36HXSգx}Bb/'>:Lf%Ph?[" Bb*q3){һS6%%MdӦ2o'0tR n3ٹnmla$08M&*  1]p+rY%%<=1"Ё(j8ʙrB~AeR/пJz2[^BgK`b>U4iC^=~; D%[Kpj\k[?|7s<>qo'4q3kM`x1t_HyOlvtY2M`>"eet dXbze2lĎ8d( ߷e8hV2.Jh0&>dm5gq'Bkuso^q|Nv hR%p?т!*DIoBF"eY9|pk+sl99Sђ^} _zF#fvvG43/{:k.gKOW5sWa-nmXPFrtcx1jkŲV\޽ې/wL&I&8-sHVVmv.\NW-մ^LcH96tk "sW}.mp-i'M<hSH,z<.9}ͻ}h7~2y-Z F~ V&52>W/yۗ =y#[qE-VDwo7SW$#cXT%ȱ}Hʏr;;^hgy9d&a h*LAU&fA:&^VN-߳yFh03>AP5E߅AakȦ08BF0:<ԥQ -fB~gYľ|S1%mc@|U 2672|pd-!g{0;sΩխ.YlY1 ˄5dBB$aHBB#@&, ` ljm-T9Gս}ՒZL<<¶vݺ~/:2.Or#x*WB"j$HG'h|[Mc^x'473ˤMMM 8,I"$cq47'TD-lpF0 c3^VYњ72+%J!|ͥ۷p b(s,{)>i8h93v3Zs$1-ye0 3-Po cFK%+1V0gU,hsiSE0˲n6ڼԗaV#Ĺ{J[ez:eDU DR[|aP>4>cy+P((HÞaPfE/ FKo>v:p$*wF.:;J"o>JN{ncF[Bl)=M_Aֱ[c˹E6iiH$SkP]g?A&I30xM ?d"3Ox;~U=|a.tgW<=Ƨ3]otf?LQ(Dtwe9"0y}-$BXB KTD)bTкu=k70w|C?EUutHU{,8R}'IryN !c*JJ吖]"JqC+SQY󠋿N&(%('В@LQ2̤Iegin\E\dtldӻ#aFGplR# A]͞/0;;ھ5̥昜ȓIkaBH˥{UM?vd@_`,FxD K .Y}x>GΌľSfؾr']]``bHsSX4 m̀Z4܀֋&]3HAˊ}|PH4Mc]LKw?5Ǒt;Z&.bB>/Tc>I6 N?jaKG߽gBXcQMF4kfM _M{tkZ;EFl"i)Vg Lao}e۪2`l #(I$?df\4Z=#],@-QA P "MKtLZ2Ee^`ׅ0 ]*r1( ?ADb@{#K/Hi1/!u1,L@(V DM.)XL-07]q t_JaHr87D eBs`?/ばYs0'1 |l[3E A9|Z"j@"M0) 9V^[FV\w*ڮxRdزfc|OPP k~*(<T2/OoQ2Pc1?c$CʐՐEl],OeVS#9FDc$!l"0CGYXǿz?w:oo1> ǁ|P2$,u1Xa]mXA|ZuE){P aEx Ю~&{p | `9x+~pA۶lee%%ҹzNVSigAjT rrCeT謼e}qٻ߇ɰBy%#=#?iKwKdg|JrK6]ƁH>ySӳJзG}[7H!8r0(;hll'^0x M{['Ǐa˖LMN211%mꓭ\6~ekb8e|>=8v lx5x natx:ʾDݼm.~k8gX۶wB^,[P,enSWg;> Mt;7^s\(Je8@L6sT57Ċh=)vxpK׮c-sh.`iM-"Ha%Uw^#O_ >u/BmS6& Ϋqa-J#\ H~W?z)ab'K#k6 A,~An'Չ0!yScpfΏBsғghp heR8*+xF,cN` ZH j[Qҧ9#rGPŲF1;i. 2nWFYU_F-zϡ ^)y>Cbx= µF=73? "BWmlUgU13:UR\[*d9XV8@(ƒF|v9d 7͢UWrDYe[j_|"Sc2tЭTP5/ˇm޸ VEY#Jw+o>Scl1z$Pg8YNsOvFU Z/kXV.|Z %|H?`6jl3|q(h2"ܜ~ԗ`{5Q\O o\%SǡN1Хxݍ ُ>1pdm(RdQ]eUql}}44?% %(bTŹ34|2 gHR`$i).;}7&0]g(ezv9Mϳy:z)-w~I٧p撝vJʾB|e1e('RshnNP)gM# IpF~v]{v9ҵ fƕic:vȨa7?odzv/0:v+/x2ihL.b}lظ.V248%255%ha_dxo|PDy{/<4{fGOVv\z;kW^|,++ldS/}ON?tۯ{;sYӷ,d"6PL$.;>͏ = JY?:MW݂Q.`֭9k4 qƇ MAJ&ݜFby2R8'JDhbR$uovo)υV8b߀@q$g0n Χ IDAT, #+暦:HRa\ʺzھ@G%LHI"X;u*2s#s~n҈RFkʥ0BZS;c*h?Grٚ\hZh ΞN2$rlnk67X9KgU} Rc%ŸӋᄁW31:HICrY;W'KD3ONjBe_,7~qyG3Nd"05˼m$^^Ǎ7\]8|Kca* B8tHf.K.N`8=f${浑_cj̎m0׻l.G>ҼG)zzͳ=F{[ M>St-:pzl)YMnfkx"s.A,'bpn֮ʚUGK]-u)aͺx^[Wtz Ǚeqyյ33m۾,$7::.{O>ʾgoqնlX}5#.z( C&"᷐d8ӹj NřP|$o4H|07Bmq $%@Wڶ!-J;3uґ̫^ҽ^|&K)FYE5,'#&}dz υA{pltA 7y9l RsD-JGY)0GzD)T, ~kj%U$QΪC0>̮{W#2_'pڄ T}|e=՘:1<;tX߲DZ&e<̞.`^֍Wb AG?MRP߀,^mjؕ4 Sߍidyau 8&@!E8ȿJ3`e j *"b -- ʀ- Q3{ݮ~8N,. T롊0bRͫZ]~o;*ܕqAH>GȖ[p@+C,Xc q+oaڛ?ii66^;gçGQ8qϓz o9 }bD #l|e;3Wp)HR81z[z  6^b:Wo{ll^QS([ Sȑ/Gz=Q4Wz)9k-yDZ#-=-Qz V4EnahyEDDA`y'DZ-|<#Vr8@yX988<-kO+oö%Oؘ\*mLόeefgU׽Gg200@oorTfk8~;w^ţODad2Y G?^SH$d2-ȟeM&&ßyc"2/aRۡ \uNt|O矃J%y]~s?QK#ծ_-4o?'H (Msd0MmLOxIs$*vZ/zvptav4DK/4HZ ӗApQ􌏰-+h5eX=@:f\D[cZ"D,Gf.FN?{V:$[ԑKYH H]fC^LC) cDtnkP+/Q -'fV 83Clvr6$]eF Q[~CDbDk6L0݉r$'"M+8Q, %%\}p]ѱ!رո<#ã457ac9DtXˮ=qeIOXk 0CW!l$1Uۘr)LF@ Bhe> Ce@ Z1:?2d9Ӈu>|-YST 2cN! j"QVG# K`VS$8:f&?=v' {3>V0`|rZt)ndjjgv AA}ytIwNVlmƃ4jw LƐ7D*)" lJ @2@!>"kJ9bf$E-dPqN)ұ^ (aYUn.oNY!<43B-uOhj,4{GY˺ 8`>Pvl8u"}o9*|~2V"/4^r]A ph5C';0,^䓮AUJ&~~ Itۖx>C׺4`|_M$qRe\e>wG0WB@F'蜽w|5Lq_ZT 3P%ɖ4"aJЩ IBT͹%ծj 0U=4[5F`r+Mܯ6!TFkS 9413\޼+~Ի42XPVL+hՑp8АPT"r,p+L~ ERNSЙ"xqFsA"b/읥v[i2Ʈ <:V`hќ3*"yk+l6E|L;XZc?:goPDaLcMqͦ8G֧7rE(V SpGQ8c;"/V¿}Xʗ&p!|+ĩhd` ~Q`“y'=(`8+)\RecEI量tǿ}?D 4tt# dO16E9"3Q:_١1s 2Mq&Ld=cD#@sG7Gw/PgZ^dHčMP,~x)\'w!$uP"Ԡ,M C8E~+l]n?rzp UEbI{7tngv4>5ڒտF!l?]:UI=8h> \}z~߇ƺv ӣ!^B<alzT>qKWd ւ1 ȞWFCZT9)f#4)1~!Xs>FԩsӓC/hP4Fo*j?$>H>6x?K^r74wSF 0}HsW]s _/ MgA4Mϫ9_qFmYGDX)mZ ­IyZkpw K׽܌Ps|GCejgfr1> S6wvpIqK#XEL h0*Ô@`F c,H'E63"8}どf%Q*e2^l kj3_9B7B pOX򹮔B)FPD=M>"?5L"„u%M_Λq* HNo3KyƳEh~]1|hlhf,cC3ͧ%b-Z Ks"γO=Mh pD&dk:GR녍YU %2;g GNfrR(Ә.8VjګQ(eIvRԸ꽒."c~~ѝ2 5+{q,4,7]*/A\YTALJMVn뾄I'vc'Ls4 _7;da[V SD s}.[4sAP_/HqT/y+*nq`dyH{6 WEh2D;?|U.TH rTS Ε򪠊e`mykGߜ饩qtÌs{jNeL3Hs:cǎ7<VPl\Gxaq ^#EM,| b|&vR̖F"~"&q¿`iʚ[(^y,.~?Y\AZDNHd jzFO̯yٶX0l,b /j _C_m$[q9=|7\1<3fD q8^dK*le1xrs C&X 4 '8V<XqoԪ.j.^a*;'mpK9a7mt%AOL Ę\4CcN4+UQtH%1^xw_6Gޱ kX$2CZzxϯ3eŐc'ߏÌ SV; &bF)} >7t97y5O;xNf/ NL08<ƚu03-/1?pH |w>sT#RF)+|c -02Bll"VhիIӈ|be%5p/ɱ-M;x4ن^ Rz ],D͍ LWՑpV*55fI(|eS4hdMbqG89!Rc͚&˔dKocS?/]T%,ĥ<].0˭[߆֝D }=k8}zёiWn"g?%[ ?C[G׭cppa,&,Y&&غe8̍׿|iハeD6h4Qhs:RXDu -)`y]t-iqGBY'"-b8\5:uRcEga"VېI1,*>'u5^_D " /an;Ǒ_wDª_ ftxd_F\ :ʲkYqf81fPyZ^ؿ{F<~4dx`4}][/*,暨ylS@X^\DHs!NTtF96,yz~{vMBi`G'kؼ{,(ZL啸^v,A`̝5YB9wnAIJ٤FsTn0ԤstEcup̎>{,Aa nE1L|xQ (PF-: -T/ed:,P#T<:k|g%8x0k*\G)HL] eAZeNQYK}3ssT`,n$5;[I`y۳=λ8f%Å,+۶]lBhvlH hM:^PX:^a)2Zdajr=-lb%{+W(0k\I IDAT|gyg2)Sq>9k,#N( U >VU#hqn4m.bu-$Em47b' 4Žڲ';}l|H*X26sG1xr? ]t洏)YA@lh`|nͦfzW624pƮ*yQuy?r7>dž{J.ٴz֒2=6-w :~yfS.Vvo#x {Yb%xdz'HD)3 ,a֮܄^S'g jP[eJڧd DlʂR#M Dh`WLn@(Gdbf^`.5l|)Vo1|"Og&,RõL4.I$d2Dd?rm|_M+}G4 i.b!B zhWy\ լ92K1~ґg8x(MO`ug]'\v V[q7gSóp <~0jo 殫Mq"$حpNeY8"5lRprb},ZT׀; F*EX-cV_԰cwFBkЖQA_e?+vϲDbm;ȚWЎ |ף.HS#xHJ/hk] Xjr/X2}u Q!J&56NS{MmL #_&ẎWut8aZ;U m C%Z3!6ZK,D~\Bhn t'XH/w Ic4jYٌ $FRё)PEo$FXZ,+X˲r RQ5- ٽ>ɫ-,#"l#\{iۯy?%hurQF\*!\RGIl]">;Kvk 9<_qbL 0{ѽ׽ ;tMkPj0 lH.6- =“M+nF g! "2.2@PG_Ď+_ţO՛ql \ruL'Xs)Жg8=4m7f|3J'FM1=3Υ[, ã464b8CΎs7ߦ7|5j ^ wΠq0`,} K7sbnv)!*0:6U;)Mz.DZ'8x$JC]G!gO?{03K &)0>W.cm>d19_$8NB0pLF @Jd;Z)CKd of5H Nu s^d 1Hvn8郬=YPbٶ N%wʱcPB|e ;`cϡ~w_j~~nAuy37 p(ߗݲysQUH+$,Ps9178fr&,5 x;FR3ЌJ.O \y?k2B935=Eu.+^̝0Ӽ& @dN?11bLa51'ޓ`Rg m8 ~ɆV2 ɵRpiZPf7A Re fiMS13hOAs s89dH`kZx!##:ealT[fHodqN6=Cvٸ3z ?XڜdQH,Iyzbg7iRu\ u\ nֻcsk|Xh8?qj1h}f|ϜNxE & ϥ<;=lHdC(K?8s6ǬY[ Yh<#n7\ʇnS6ۈ#IBBʑ<ͻf>B+ ^7|KG.…qd- 1ֽ96? hi6)vթ/ =lehX-[*?z }1~2jI^@zu30`Hm3hͻ=̓F&։z4f4~_ګ2|Ek0{k{? 8~(Qz<1Mx/ Obw#r'xA]DPљь-\эH&=L^"K2PsAMZѽD%1"q* aIW|hvkc(nK\zvcEzYגPITCc{Oє=ՍЉmmCXt^C;(mDqVĪrEkgfs\5x0X txV9 rV)0!5&#.HaӹcODy)50^HA)g~5\9g?K OG17]v5J%V8LNsHpSz\e BP`Hьr_a39]c351k֬Z*N,,fɻv%co/Fu/dzJ b,ne߾c e+ޞ<|^wsoyt\p!u-l\ e4cӼM&822r S# QLW^.(,m[w4aF5˗AgAߔ9!1˓ 2Cf#O#V#@9[lGDzuӛp6 v a )8kff,h~3]U!kXlsZՇPTBzp]q2ѷ 乪amkuv4À5MgK6FSˮMjxmm(MMLx~ofx`KEjb!+g~\dV cpuٺ9r5GpMQn}g[͈MLVHb o n 灎Sλhv|J*+V0,Kݠt33l hRQlN~p{˧ށIS%ML#8QD䬦/>(QU26?EdF/cKIK4$m*b: yocH҄Tm-ƲUԧk\qޫӘhz.#v0!5g5H9?qDZq`W[4NsD91v\’m >娎rRc,;1?=%kBOᨍit _׿rsql{ѡfD-:$qz&xsHI"/Ez;)2L$%M,rV]ljʙ0VTZ:ڙ^ENF53_ -kAɘ/ϋb2/%+N؈Ҋf̗n,Nΐr1@X{ pi,T27(ft-yԐc.ҁM^75_ D 6|k$m/*7/`hj <#헄-K@jgw\W˯㳿.*IH:H΂g$>Nzs1?v79[Ԃ3j[Yw{ă)E1&Jҷ vδcy3?k=kC4A+) 9MG"\H5R+;q]Ūϥ\UT+R9 n9cr ߁FHA%Ӻ3]!c'ѣcHGIEU]7,yk00W>;n%Xe+J:YGybTBjbV,wRY~ Q EDN6zEt:_akV#L۩%X%ū*0+RggǡCLn7> ٷo֬,迄 Ldh_202ʍoU058M{k۶?E^xDgW?mlyQ6wɱaimiC'!~jTe Iu܂HWȖfM @^U26:A4-Rcs,Y& x_SS=cg10<12}cn%_ O Ƽau7۔gفBGc9 .[ŝ#tw-'07\m"zpNevM( Ʊ5*ly')Wǁ10)V^ 69>ڤ WaxnW02s3f(]]]N5 a!OT=\E+}60nZ BsE$ AMLiƐ>eciMaOm00ة1)]u'0J$ JJSzisIku|TgcT/ 6 z1,34rD 8HEm)lW=|;^zrn{to+Ӻ`)bYAзڣk li9ttE#IEwXp`A*F}L'l?#r!O-hAibR鼠B.ߺwIt?AJV,|YѲP1Acj6D{8љT'r~)}N4m S40Y4MA IK[Fڬk&x^!(mf,7Sg k7z?~Jϥ\/fG˻8IqWCtlpQG//BXx\ƗBILL#$NbD.*RxJkzRg6F1ֹů^+XiqUmyp6OY 2ДX=ed̉ #* h6) s%a<팛iyee"B R]}D CBQ0_̺>I5[ۃ2jHtñs!m>Y(sa7I'N9 f0_Pe/4BLgn& s5뢒T+-\"w}Db~޸_Ll}Lg73<ɢx2ErZ:K/Ԍ98ɄAHiа{002dc8Y6nk|f~P`pf:@[^2pt픦dP̻Lio(b i CIP,xuJc' p T@:r2AI,0c/C5.h7 Oڂɀ3%ĞHZ%Ơ{%rNw 8p$N G⫷gù>B x:.-$X1̝Kc,10Y$d}wp-oeo|TiZ63qIV.'`]&&TgHϹx1zhh=v{I~ wضxې6'J(3T* =b: T:Qi' [dbZ9>##:w+y#~ohkҲЯqUoʯ]*c ><ͣ=jX`yѿ\b8ʃQҷ<6a.cL׌En>^s(\"ϣ0%:H$rCbSeKyLlZ#w~h4C:H YxU<$zri,|KRa#Ğy)^s۸2||bgq ox'cr]gw~.F xr=< nf_FŴ{ٻQ$359t/bh195D[{3pG;lu?nJ*Mr b:uQp ׾V.t3!mȁY~Ó,[plmK/O~ƪm`Yzn#$MX`b|0>Y-u$ Wv?0>XyioYyig0;ך~=ha=0A7N]4SO\-KqG-KXGFԫ9q7 =->Nۢ>A>|KA$p}{P;!W7SN-J{_q}l4V8hf7$^B,gْY{7ڦYi&jB$M5#bE{[+R SQq =)M*rG+hD{{-ֽ_) %}39FL1=|L%e Vo$) |8G;9mx^-; ~E%Nh a:koUcl;Kϧo9:yDP<(d+1^ Oj"yd˖x|>n?~}sh5d{') vw5NϚֳe9<1#lj?;sMPVr5VoXLqQѿq~y|l$GÐGY{f X>I#y22vQxL!#t:)*)P k1;]w#1i1nE}9TǾCuV_[a7mƠqUDr-˳u~8x2Uw/u N1|V'@A91·]Q#)ڕr3QNF:i`abhNH* B/~ʥ]l%y[y1i=!bבEx69==0B#C3ݬZ| mŝ(E۲+נ1}ӎk\V.5/ᶻCa毾[,ě_AJ#l^"hǏN/vm>T 1"h?'~ bH2Ͱ|2޾>am?mm lu~gck\#"]\5a>er $Mսl9 RS'1$)K;V ?A1Β8̜T<Dίԩ*U&&BiM.TSlil߷ZT# -ޥ N;xFY94XJ}c#%ZZttL't05Y%,G `^yR犫諏!g9$5ۀF%7Exxh#)n oY+.d(.4-+ T# -ڴ ^?$^KB n;|<ϠFIJ7ay9S~e+/YW#7B_|}G QhiToרtLabLGk>vVbOűc+;Y<*2tq/C/헹9P 㵭L"y ]'̶H\ϡRNx`Cd<"$!Iebbp ݽ<3>¶ŒZIYԸuc;.6rWUE%uLIc7صG qz&NSo_ʧUѼe -1iy7yr?s}L'rҷP/z!jF,9 U::+;wScL_i߱HPRs%m} DZLs(ʼn )Sƽ|G+/ 3=QcsGY|kxi 6u S&mw00x_.ImO>ۖ#Q1{f 860kfq2:dd#2^AD*ٮI\r 886~9W_|#WB\mN }BiJ5qy+Sa~[<^_fcu1\{a S:[>tR@'.;T'O">Oպ/~s$8Z?ᵯy#plp+ +PQ.E]嗭I ցgz9ue80g#<aoҶ`VqBhKw7qBˡ J -ET؈*i#f&m N I(×.b5iuSZ}5nɑW[D^u:ߏy0{* ܴ kYQpcԂ:#POK¢t\gj{]-%Va`CCBTtZ3suW7%m#t]?}y;`-/E<{yy wO"4^f7b+Y6-X|9A@TNj. O?D?[?>α ;N5xѬ?ύqU-9NNM5-j:JeR!G$BRu hx"%>su+6qt-]x1%̥KmEP%^d(tpmRm_ߔEN|GT~xa~La}GF$U7|Ƿ2_YrUOe|2Mى("pL1)ns_Gwdϥ|I!gcI!A"Ҙr2f֟ʗ^> ?}CGh=gvk'篼_Fkÿy7S 2Ub,$q 8|t/#Clp!a-.ZV2:{܆t5ĩ*!)bi5B ̿}JE)cTEGhw\"~xc# |~}Nk/7‚2V6"$󔢋S|+cELף30dR& vCx, igcb!]c\2J&A^A/b'AcHԼ|/hGR"l eS*>gH_ZgxZS*Mmx IDAT60 m܊lJL07k3!F CǸKGGZ)Ḹ:\.сH#ڂNr6tRxA4I*xzao2)h 8HŢcJ.:Q֐CjLejv-^k Ͽ,Xڤ$ID 4MHTrg|l~N=Q ɼ@P*N I]q:WHmĐ$bZB.9J|c Q-EDGgV57L_+43F?gkuG"\*"d #aPge&x*-!G1I`|C},"Wԏ,1=Z%ג%uTGp[ꕼvͻ&x EqbIggĥ6 B*Q/qtuV-2\L앯g幼7~@_g_W?Ʒj!=ϊkJu&=NGk+Dqm,9w妷n։y7N4@ӱ G؈gQZX4X,\8IIS#OLHđ@\8w1#t)MOF S"$/_)Q3:Zܥ !< 2[JynZ߆SsI\'h Iq>{om6d|j\ςҽ̫{~C|oG| zW.l{b;E)!xNB# 1vc}X3h! Ǣ.JB!Rđ}m|2“w7dq,1?ʾq|1w־n>'3̲.v:9TI9Y-˶, 1c0\|c䄱eˊdح]]]I;TU[j}j}p{ާϳVDt :C˸M:Z$:M;9p0KLQTfz|+=~N/'x\};xC{=aHABiƒ]exc's%N*VVٲ`tsO÷|fn቗w^Dd)O-7FCM1ϳw%̙6nĖmha)8Mbʦ^~#ʗ)|Aprˆ*·߭ Lr@@sZ;i:[!JBD.Kpdʟ:U! YQ#Poe(GNYyψ(v6^_u 1Wguf !ru)T&Fan:PFCѭ2>$GlygY91 _mX "uE>*c Ǥ˟JqNDV1.`ubo.pkؒbM IӉeާ~J8yzE IdO"Ep#yW~QBf:င$\M;0O~+#$ {_bR:~Qeâ $C,\6 d ӫA76v=) Cu?ʷZsڄ}<8Rr,#!ab .8F z \i^xWW)KQ_.J̎X7^m)%n|nw2e`2ecA9Vkq=$P( I˜JM5:cT0FbY! P;s^~&\q45fR% 6L2c4Dkc/X0m\S:V}1V# Ejcctb7hγL{IG8~Dm3 !Ba/4 C\/)qQ,AIѹ C+? C>J+.'N.yscG)#>'O,15dqEP,S- j_Ϡ3M-F"ʋ>2Y@{< XD̮\阣T0!z[f\UIia)t:"8J)K$qK+TE$8]GV\~_↫d" IC;Ȳ@Ȁ$n_==ߎ*YEyC|;#Mv r_?>~?~?E=߼>?^j~)A[nW;75 | ,'K'b4=uj ϋ'!vpaY\]JQޝ$q>e҅e$1,t0PH ҃K9&#Z7d82rt잼=]xKE}v ˌ-J[9q4&k~!N$gM^FTv]ĔY&Uo s3?R%&4~)Xo=`%=²C';^Ϟɫrj ӛ6Q9~t;D=M%dq+ef.dDE ݵ쐊z҅^O6=N>wEJIL p^e 8/ENu6*0 (L *̆y L66EcHmxְm{3:;Thcg7j Q_ݚ(%2 ]dzpE1j.o 2?I91CҀƊ k;<ǾS3ʀUu9D d k4rXۨ ' ȇ̂ $ʷXe.JRnLN&͋plxl|#?CƮ<ɹ{I1Z s~+4k2i,]$Ilp ;ͮUYt^n.H a(6(, YtjSaP J)NRZLg[\QW*I┉qlcM";v0h{o܂&_swq<T[B`LFJ l+Fk$Xl)5Pc/(:[ Wrߑ& q2ia&ew<?8A:nf˦@S){hzz(= "(ЩU!O`U_|Tf%NkvLo_cim cppAk9B?=}`ÇKT|ڠ\b4q Y֡ђ^C 0tY#`q P(8dV ?(۟bw=Vmګ{f`*yA I3Q~њӧ癚t>Z8N2>5E'(Y?CVK4ju0aLR&nweų3\\Ta A!{7)%b~ALer!}}$*H΢-+6uرLmN_5PBqgeZ%M4g綾tf5#Ke&gfhwbB'ٴ]d[|2!<豼):M^CJK :l2FUc.4J*20>:HjQH ˦*-hn\$^YD0F5sm  $(X6O}chӛ!Ftw(;E~~G+O}}{{1R3FUpY8fvEg~I)#8vHwClrKxoyw?S'OsrO?$^/<^=4eӵKO,3?2Gߦu&IFRg} /-|Nc7:=´W^OgblSѨ3{3ӼaGh6vph!eRoRv:i’|x}3;_x}'t;N32:鐙U4/.ѕ Wy`.9zQc1tbQT.5k~/?on|J2㼦 2q F&Mk P)H8 ҄ Amt{Xlx r&v355ÑSS.¸@EHi![ -JMe>q ͱX8R5H݇+ȇ>kؼ_WG(3= =?ǟ1K6wY |OpUWQ/7% X7_..z%'^[{k˭xUǕ qP*riK \{|rr}@ M_Ͽռes|߇tU[|wM6]JK.|x1AxWWR㊤opFAJ<:˖-[1Fq67PJ4QNM\u\/wmJ_v9I~8LXwImtJV#Nh*<#VYA*:[fFyyZJlJtC\G-M1(clr `8}>ʪHGwt{bA۩#EsfQ⠊up(&}Cۘxy 'RHH:(>bT')R K Wq>NŃNBiR پ/}p?;kr* : t~#',۸|[%BD}4Y޴E~v\|nu~48|1 ~T(YaӥU'q,9tN?gA¦Lt˘5x#c#=cr cq'JQ؀$т*S,+'EVx_~:#&DC#G%tى\YIWS뜢VU4 IJ$Td稢8]Zv.9͌?m\?'R-7IAI݆/xL)msENϝu1҇љ9|`[}vnb϶v6z' _͊3ʃb5ؾeʙ< as_ט_L*vM߹A$5D S̿x'Wm7T߅&fXm-29ÇU.jNetI:WR.Ьn|+|zvS*hIm`.qϾs$3ٻ[2juS!Гrv,_ţLO䅅Y(FwslWﺉMۨ5ƈ J[T*'8;@LH׆1TmYK? ̆ ja,6,eYh$Rljֶ8kpk‡Qvg.^_1RI RbV['"Ye}f{5$.8ɊԲw=`a)Ң1W\"' NSΒ鬱C@96۶=39zŇ>KCyY T8~"&o%;ױw|n1YʇoeBrnqr%ܴG REAdT:\o20+#,s3?+ͭ($Ͼ_yĹ"~M@~\-AIDm (Hb+5-q ! /Jz+b%{-&M 6DF9|&rJm6yJ*f=z(j~\܂jRK?(M1{'s3k+qb;=dN f$ +Vffm7Tq&ļ$VzodjrM6QݱRţl0ۘ\ ʁv95x.3d~iԊy'2o]pls.%\{羁ј~#cz]cui(ar nSW1i& AJeE!Yzi Y\\9:GA)EkEޠR(PN5:$hHHcP*!۝u^Wt ƨxV8̺T)#m3/⻄.kw)T+Qrd7:gI8!NC^!f )Ĥ1hCt<Rl,/1ϢkbPw,Ju~v%kI#-_ޗnrX cpR" Cl~QJQ,yH!v#TI: OtcJU :qX~$y(O,2~yv7I>H"n4ʫsǾt=>f3OJ)=1zk~yoMx;##p-m My~]4 tO|d6K!SlDk ~L9cbSڄ85\Wb LNËOaӖrU`p3e 0C"$].ŐxEoO5QThY~6Xid&̮Ӄ4u#Z*+\\WCMBǢpBxya/,n7LpqYm.4RaW\,HUN/>r1=ACx)=/ &fr l+\K9q1D_=kMIa嚗|Mϊͯ~.=74Z.!m9΋Gx~VrC^fF :v '733@+swm%|kʽO܉\ ]O = ,މCv. _o"9JGRjH*iT>@E3^I>a!bmR>rm7",AFzcU X`rtƅdf١m}$S!I\ju^|yZ>wߝ l@v};tp/|{|Q[0^Ʊk0xTdф?=iD\FPvޱ,qBo DoƽQDKC]$=Юm7@շ/бQ8ʑ:aS :8C> j<_(K:h{br1Y|;F1~fu$.(d 9۷qbvnLLϰ)@j,A  UqKܭ͗?`<^ER2Ľ|1 dY H+0Rv@G(ʱǚhc.,a"갑Ǒ)?ong'aCypKOmbKv Ε ʒkbc4?={ ~a^xAl4N\sTL&ye? QjPpHv%h<73;!s=ljˤ>&IŒ=J&ʀwن] AH!^  +FĆzuMu{x۶&b/7Ɛ-* E& a'FUlW/ly꬇\Z#S5VϜ2ҤLZVMR&NSfAT!N%Nf=t|RMACR/;H nU1,alq;)(0ũ#<)P r:RtG jxQ5$ݕM=s$xIFE"F(O"^7"(UrAfJp R 2"Ȋ{ sy,` M#qޓmIn|4b3*E8}<'#Gq'wy!}R   m޾~" y*ك+A8?d1hei'Om;'0ILZE ƃq]P,1Eu:$]2؊G>4ᠭm L[Qź51*kU~3|MD1c|G#!͟IP8Z=(cwob:sQ}+nf4+?ǿK>N Y*2ժ`fE0Fg塞91ƌ2 RL I],b ;N'k#gɰx` ñvH-h^7 l NݐS Y,v61bes[H˲ʷLc { }Ӧ [lJwvRx;H'-\Q#-`q0rxm;XmP%+.w|6>#Xx2SSNn 7|OȖÌ`e,lJXj;ilVڗ3!j:#"ǘZeC){r/Wl}=]O/ Ǒ4LOrl0f.fżK}_~ s]@lZ|uA;95T-٠J0j،"̱Q Ć`Nfw266WXh,} @.(M|_G1ؿ%E drE̗>K B#[ʚn(,$DF %${`BCLs)q@h8MKcVD]6NT$P6 k8iQ$V$Y$PDXYk}bPHիI3rvRV!$]Ȯ-Rnݯ1۞>bw\n{`~v]  _]oz(wvكK_.sdY,Ƭm!¬aj+Jq僼25ȽhphŲ!jϻ[ߏXaAU-QW)qX׌n0W5{υ1fSj܌E%D8YcbrXLUo5i7C>n2m!kb|ɝ;H>9r< O̐hVH%l`_Q I\gR@mN?x>Š@զ8֤3{6p[T5lj %)T ,AEgK-Rb@-S**/3DjۏFǚVǚPH>'IL)s[ `}/?wc%[9gN;*yi#5&jHA8e)t[;/\%@aν{qZ;@xXDRY >Fƙw]eCb4Xf'qiI+#T& %jcXq@hJzF2"&"5`#9.h]O \b_%t0>Q$ $^YYI)Uґ,G1ڤCO!\YBaZ!\Q*֚0)8%21ڂPr]/@X tW,BQfW?X.Rϴ-,-6g=a{ŅELN2nRU則:ۋ>=_?ceDS:ti-8`Zs?>ȿ?\wwN%G hkKM޾+,ql{Hs4W< 8ZE.,6gFH{4'=:i{݄~Y:2ZBVZ1 Ћ>1IDy2`6#WxQlhOo~>ݥ;[w(fe;.cs(MsIJК# ? 53WM1w~4Drfwϱ}GjHTg5>'*SoJo,q–>+1B'`R# lH;~Zer R C;f*S˽Zk-#lx,pU6)ӖXQϳǜ^Rrڧh᪚-7mphb5׋(\<21{[qIxJRT@k!bq$cv^Z~l'CݻVA#$vLzE-4||@,υX04jqye'oX|<={?|ZTs-Qwk K,u^1 {u*wͿLnY7|Z" Sc|?˻nAƜ þS'iSrn-<<7VA6(BfWص n&1~Jt륌dvcE8^>LMV&iH IPb69ڦc j~)glbRs *.gtje6Olb3/K}[Wz4u~YvmǟkC^Ft(,//lic\*[mS,)֪Ɣ&Hz}v ԫ~Hݣ8DABHȟ_c qL`$귱Km/>H;=rXxa,;mB8}d%)z.O`y>ۓ cX˴ǟ<<1#+  ' )lMB'EKkxSͷ0g6g"-I!.x$.JYf9n)"N [`yiz)=7OaJp 6MM #\c: TJa%e bˊ aGT"0IΚXA:*MRRyY8(IpɩLFm3ϋR_rֲ|pǹ͓#ҨWpCAXna XX+a^R*jN{Tucpn"<#ꇉ!,iFLu]T IN)Ld%{&ؐh-BK)u8y0fjGF O4AGc 8+`U׋cڭqjD(MIi4Z]X{O(I E''˜œl:MۥRЕk|q~C&LΌ%Ds =VX^"ϼ￞;޳ӇW9Ld+8'T.fA҅ZJ[#ElauQxFOl E$G';7'D‡WE- )bYY9}Zd b4 œ!}R$x,^TR46VIW;K!R0t5µlj`}!NۉY 9ӣeiiFex>_};~ ~oMk405!CUc1$?-|[8)]+o('wCwO'yۻAədjdxK;oۮCB"6$UE<9öpJ>mU ~iv]{=X" @<z'SD/vݿRoR$Ua4hĖ9eNFm߿'"N(W dwUpI7oRtB5jZ^P]!>D0;3L6޻?~zm]!=sxSi'Bv4iC N]>Bqg@ɽbU}lsuY˂6lJ۴}>IWr){6vt&-_(;v' b݄}2(U&S<'Oz\FfU{[\vyA^<(OОdg(W}Z"ޟ\Ǹxs[N)@tr=_+V_{ȗNk<܋(pH"OC'"I%&QO܄S EX7ao%$ /,G$Z8Iy"M:̰Ȱ6*lL ^Jccl֩NJlPMAǬ%g}MYօݫZ0W<ľl7=2%ʵmu vΜY& F(.>=,>y7{rxG#هe@{w\- Xs'C~Cf.j%?ޛ[}֞i!DgzIh6&06cM=HAS3 >QOQ057ylom31@x.F XL X_ 0 ƞу^J)P)U?l m0>G#b%'!+7,` u)}\%X%KR H͞mMG+ukh!,n2| =`)wkgc0;v7F_Tӹoq'e} Hǎ?h][㍥e8w<$|k5> s.T T,KZ%B P ISSS% AZSj"Z5 XQ.clbMTFpw=sK99m 3 zz.sG2 KWsZVkq[nqq.+9vjj9˘ X,!Ll1BKY!8"BV%܃Pfr &H*ShcnM5}>̠3}L$f\:[#*JVXEQmzH\M,odTj3Y7:.h=8E{1D9o0 VWiF"\Y7>ձag{r5&*2Q? %sN9RRaKWy@qʲDZG=;_J2i婌aF#*\|5?@?X%} g:;jBܫJ*<.G-˳!p2~@-LO=3T>1ăA7Xp b0KT&kygu4$p∼hi_R&)h:[)ՒZЖt9ÝK-S )ӶwYt u}\lc1 2O ͈Fw}o1ν_FGUiq/o{*A[20ql^g_bI8fX1$8WDjY1:%1B)pq IDAT٠Jк9HX㉀0P䞡/^dѧ F nlB0%I[/\doo' 1 Dz%%<,8e2F '0܄UFЧ1-2b"݀nk@mJ{Ks>aLO9I~k3TI 2_~?<'p [Ws >Qд$_| o(٫< !%RU4moj51R1bbRL!;"\{Mb8Z,9 1nΥ*BJlFtMn^kπuN+Q &:TR>#ԚLU;J傴Xg_]~3q"?0>N7;>Cd3>wS+γaw<˫~?QFO<$X`7n-~BS*J(ECԍm!ϯsp˗:trI1L4jV#+s{U*2!->B@`ѳ2pV&{",0=S$#!(hkQZa :u8cC2A xp$:L] qN.SB{4>ֈ_&o-_? ?Y(\#%x35L  Y๏̹OԊhQKxǪ-nS<9zxF$fʼf 7.sEΜ`$M*NMg,"1`|tL@%(),zG.a6QFgi˗s;L`vPX5 D%2I+NlxϬù I'RrBq£B2 -/1J2 K<2\-C=ϿzeO.~杍! '$)ix7 3 /pE|A:ARS9Dx{+>-ڲo]XwWr-B':Ř t0ca1H:ck;3ǎxR&(*ti'9t0Q i"!N.HUX`{ws>|;TĐ"Mx4g&T%0jS䴫4I@Sv1>\`lλ2%D"& A I m5!2^>fr<-0sy[#5nJtw?yOB[%X9p7Ai L0VV,3_`L*nJP.QNV!!Ky>VYRvtz$(iwi,[ݢ ∉)/h4֍T&'=OM\~-,$3g-J38@[<>w$xSX$\\- aNS^i[" R(Mԉz5k`~OkOȜ2 |jd{n࣭&rdyRi G#J %ug 5vddх$s)$k˹  d8P7a ոi )\@ou Tbӓ(4 ZI6EjA͈)^.~<87{HIhJ*OF.C|_u}Q,ك>GO謝efPB@p pd'RTUsGrKXAD;X$Bb~eD " )F dڥ^+\ep*t4ֽ]}(IH߽e8VѼP3i5i(B|GrB&j%2:Y[|r#g_`3m|iE-N@$` W^ūD/u&:T\$2eN9 'ʸmmoK|zc-fadc E]~ΤpY|Ӂ8Dfd&eljC Pe^xkkTQH^gZ,)NX"nk 3ƒ4;.}I8fUޜrT>Ac2+(2N %Cp$c|zބME?q܄)r Jbp0.owq#:E+[]9J#@P*E ꜷ}$?]i 37/Γsܯ `>??'?.y\Z|Koz7qqexȋe!' g,"Nn;{S5}ґ@ͥlF8bUANPd  \!bظcZ rh)5X#܊,ZӄA^P3aB9q X8p8S Xk zMgwV^NjŎ8ssӍa? xK˭yKEa <@ST# 8d_8C!QRBSd%(EFA%aDlm܆|7[J%e8cqbHf\g#9_Nxa;BJv[۩c]_9oLL)w'楌{..2_> qD'#/,~r->3ȧq!͓J/dnuIimm359k7nr<0fpE9/ Eň ȓ{dqS,\Bd|_0DY(![9{^W9t ڝG|_x ^O2S_d!S3C:[̟8`}NGq+#ؤOHq^q|s$iFXX,E1K:RH0fjz*sBzǎj,4NDf)aA nJѧRȌ)af]n<2ϣT\xtrڇ٫}O*xu{QwH-=yK-Lsd&inQ A 1X%gkuGJt{m63HF!Fg]6j>ُ;@*/q3hub̲3ml3@2wέuaVpfr k=vS'l,.Y8d#ɲ?EW!&JIo̕- #J*וЏ{8>Q')OUYfj°,޵- ։Oj^9CF)׿pQ"؅!?U?=ZmF1(- Rܫ/#<_! ӻ^DVw|Qo? 黾>g @ŤfHsZqHx Wx=G Ax7^ṃx"lVLqnVk !:NQA@f34%2t=!Zk:mF?`B( 2 üs|ɟ؁\G?Ո8ę3/#ѓgqG'N}&ky]l_b̝>N)e3^W7<.EE=}lnX|ڃް.fvt~sa/b\P-*M0ng*w31 a_CZ٣O ~K_3߽{_^feQG3=`mi|@EW!C4 LVm5fN$ ΐOǙ(C:H?̓_g4J&g, IƱyK6K!AZɜ\Jİa@ࡵD')|5T(CIzCg zo^BH#)vlCşT)ޤ:.,17{0QLPVR-BQ\8IϷO˯ OslS xFAh@'q8TTM6^;ekD{s %RH-מpTrn M%~o]~.|ޤP6B;+u!JatcLj\TQg7fG!6IYR꾏Yc m0?+|CsgÿjN4R:(3kcesc R :W!֙$bmM^p Yv 3d?.Lw5@NqW;) )nR!DI:ΡMql1xR7{$ C(&MSd;kRT;>GjY\7q(}?4IO|'$#BuURC&3rOC1^LVҲo:ckزkX<2.6 a4:8(lu)bvD{-K֍i'u(Jl,Z C+P.."PZ@"p +%T079E",qT@Ɔ@pI,By ~GOS^n,4(&PZZ?.rwlq1;<"ʨbAn^( -luzX]' YQrj?(un1233$qB\&q B*zJ)F IDAT.Nz&mBdq K$}ۿUfShc}@P'"U-Pl6iLs9}{@ed<-WӼjfi `25z#r0I lmo36:ap\~!t#zCv/(+G!ABQ݉3cUY|6l^_IoڭUN9F~'x/R\or*Μ"*y_*aO9Ic.^c&%Iqqi V7t{X\ߤ3u8<@'{fgg(avv+Wjˁ:68f;p^Ž/M5,adҐsV\GUK]LOpk1ݍGUGdQ\< c)s׿@怩CJC{G{g3YY\1=Mcbot</}NĹGJb5g_daz>вqu#!`"~ѡ \={ADv M_:zQќ㗊$ajA-bLQՊjuTPoVi6W94j\_NZzA2%|!@H\uJ|v5?jn٥** AP-0jrPRu(S WLBk ڡXȓ=%2[f[5 |O]𾓊_GGoM{:xY02rMD#F<:?Ǩʘ>B6j`&]T#o8J_l'c6I 'G9v_x9~|kϯm; l*Љ%rHa(mp-hVޅӯk!~m~Mo.&.:|kE)FzSAY#냁fET{l%3}n$, K9YNxJ]qHdF+8w">Ea"Q Le\DfI' yb 6.[|Bɼ9 N,Q ,@yd1wbڨ}_ tžf{lku65_"=v j ak&XpB'wph lCr%D6py "Y2=UR| ՌS W%lrqHuբ v-*"7J>:~m GʇCj:ݍ xOW_|c%Yt .ɋÌ(faRY;ssv#gr_F^C6lrG[TӎFqz AW[p}Z{#pamH 3o"L36!ajt:}DiPLsqqc ++8`2l01168%2*[AFVO`ӥR:KEj pq:RY+zC%).B8xL\r\6ݐAgԡWXz5&llӻrf$ (-'_ ,I^djTVkE;BOF[T8F0AֈVK;Lf 1.dv +묶Bę`s( EaPSz2A5p) q?(T1d D"SDSXr2rJ{kW,_}<'do䂩)R.$)8<3V= A\VnܢVqQ6WOlNoo#8#2YDF'/r 8ޝKcw BcXo#~7g魧|7^/1.iҺ~^c}WyTeQt-3!ø}1v(䏕Lwk-FS%eNW~a:ύ(ea^h JUϏ]ɛfed7OxiQm\ C%b1D6W)C9vЃ1) r:Ovki%FZFvDd&rدϵ7J9^P3D(NҦb߱on+w5c]uGʘ~ur?%̒ݹ3=~ӧʮ±y=v+ꕀ'ɜW76(\磍BK\Ydr D^Zgq &D 2 Aˋ$h#XM-aՕ "rnmʘL&wo0xOia5*:r7H1QV؂w >Ib[,SG\4=M6wxii0 Q*El!b#ՔS\Z٤ڬ30Y#uF&^cv&qkuDq(OOP#,I<#v| 0gK $]+U#4Re(W")³#Z+%?Q*+aJBs(87.܂ }N'\sjF }N=rAv]眛_~{hD bJdaǒlnff=[ʳkkv3P^z-[%Y(RHS'tz_>P%[C (t7~s^՜?LZyY8s4ah0sv棺kstW:Dk!t6WfV-,S]'Nq,_C(R!W^g21z#?AR,z+'/uJfieMc9@T6#ͅ )tT:~H*vȞ}]s4ٜ#:"[4ҩy c[_Vɸ*#qRD1cѪ7Ϯ~[lDĎICX̮~pM?9҅-{+|h"bK!e _ϽwΤ<3]%u;id"FDnx8lX4o }lf"S@v'~ MdpyrIO]W#5~BO?9/Ư[\;斡,zg( 5SYHcFV ֞k[dI *|{gy={ߥs-a`Gޠ3 kX'L?\>)pU}%_Od Wu"MwCrO1ث1"1 3cAĉ.CyC!ho(f zěeANMӹ:GPDAçc"EgtZ@"U,rqm;jG'1|ZMci\iҘ_–#V;u1C"Ͱw(l .ָѠ։MNۧmїNV|fY k9KחGcXhJb+kluF1F5B.QceFu?&Kx4;KL˙}Z6ݫ IRg?K~i$4\B,zb&άPE^kUX"߹/j+F)f}mL!k^Y9me I2f8ok!aڢ8>ՅLq~aGXhR7R\W Q_e@b㺴mhG5Lchbj+VW) Vp= )5~'fmƖc47:QBHn1W`WFmThJgml!v22 2ћץPE1o#@hJŎ,|[GJtGG66 )4RE,"aWH43CǙsg4HFfV-/+9}XW|+\]0~."baYKvUMa96HgGuwI959v.b3E[+RNjɁMowOR__b+ܺ~Ops>cؑM9э:Y~SEL]'-^kp}2C1_GfhD˘nCY 'MSr2,7 v -12\V_A)|>M۴mY׶YQR=ή 3̸i](T in;WbeibIh[8{4RL*MJw:9lmP.ɧsdey];YNsst${Ջo <0RF,̰Zr /6 v :m//3 N07;CPjR*@*VTrKknuɕabY(B7=`B ^[b#!`Ɂ'Meh8$A S fO&kBׅvϷ䢪ŐNܳ2ܯP |0p qVCuRR}qq!M:&X @d@l~oG"R] ! }Dt q6@#Rk:(±=E&ml`=NĘ=bjP+QW,X% 7B)ZvoȠC78^va*&o۬6dҠbXq.VXcbĝB*^FH<167 Nɠ)[@C MZ- ѭW  0!z No$B FNEo&90H|?Ah(L$ozlMD݀! (@HgJJ<3K5ނ,%0-6{ Lay1+ b`0lPp n <A)i3G"m+F l GdLU1HIEHS"0l|1FuׯT|D%н`d 鷹kg2uTu:OE2f 2&"YB&#QZ%ߋ[-T1B& -EB41RZ!\;f( m(#UoN0orpzcZ&҈XcJ"^P{Rt'!缢=R sHB7` &W1 P0Nk5R#Tr m (iA) L4*$rFK"ER'iZ)f!N}$^^>EJ`jH* 5yOHi%14Z08ѢW0=Ga2&tXǘ"q\ѦF:&Sz5q D|=ACaZ]"050bڴfdo2TJ%6ER bbыsTmH8k$;[~UJ! 3YG~C{+@HL:NJ"&ojL tojaoNYFKX^G/F23zq )Q^FRBa d{^+ĽaaP#E0D(LĬћJM|εJ01BH@uY"]Ř#|xm8iڝ0MqRc阨G.+ mIԻRJvr.ZXIh5tVb`؉tJ'^+5$ ĽRa79> 0RdZ6.&C TQICЌBlaaiH$40TrK1f, kJLbaJHL=e;6(IKH{} @d%GA02H$ڴXh@ EAlXtSBG?0 %c>Kq聻Ipnz)n}@;N 9A==lMWj翹#&91q^4NqnѦ}V%C6ɭt[ PEY3U$ HQ>d'hu%f ]]#R*N 8UAr(+"ܑ-FP0#.ps^ôٴF+&[_,VP8 aDt9MA.Hж چt &X**J{a5<0d8IqA*f.Ol/Mdy|FV+]@*ʲ!'Uǰ<Z2cT(ѹ[ .!|mbdKhebe3]dRVrHJ;ـ<q&QvrP<89(Elz %X#$~ I2U"],[$V(QS03(w; X`yHa"BuQAt"E6FF'֩MkY,bMq 6]oA&"=aLOGapb/pR)|^_YMt*㓴#c6UV.v\tQk  &!d[X[^6LLcWC$F.Vih' \H0 396KҨLK!ŤǙA:&"L}`>@v_H:L8] Skxxi4m6i%!2E" @K  h7C#<"WFV!R&vBONYj%2!p1KEbaa+`ФQ^zNaDNR9t63JbAi*'jR|gtشp+HE ~V/RPޱ*[duvoEmjoM{cG>E'&94]Vy5C %t|{UdFB >sg.1˱kxNk3IE15GG~t:XY%meW_brbgO19(ݬ-- Ccm4KW/(sE6 )O|>~??3rwq?(׎ao/~{>^^z%nٿ340LO?澟8%N8ŏ=yO$G)/kغ} drYZ])ַGyn9t7F fWNp2;oҙfe*#VB1O8d}q7f瘘^bz^f\dtzgΟe`dڥ g\8w.~a@ڄF}wSO?\:?LO>s<ēc|ɿx]ۈLIsaեU҃ 7r9|'gj>.~m;p<3Gر{/NǸ/~-_ҟ ~~}P.Wvm/:0I>Ge~ Oy~ʟ4_}5Rs's]qc;9s#c,2ug^.w?O?{mwpÌn>fͰYc"p?3sYjMRi6>6We=C5D߭8eNS2'?W7a}nl>J Ĺ,Sӛ9#Ô9n\J:@my!R&ݨC e \7C71U@vx.yllm_ w/\qS)Ԟ̾<;nṧᎻcnZK7)WqtXߨc0q^;~m۶zcH Loʅ yi[M8z(z{8⋤Ke]»0'"~lNN:M3Yv@Bkk,ro_C铯rwsO3eF O;k}p!^"S0smq9LeyrgټiZ]a|z g^~3{v_ Cc<_ |~o?E&P.x#>c_c>νt;|s/ah(y w },[ŧsCS[ضE;bn;\Φ;x9pݬ,0m[Xk-kGx߻7'3=go>#l>.~tm+(qo?O3Ok-|g9t}?~RoY[d}<ܳۻv}PNi\>Gf^^z䫼S6mރw-7yʿ׿{}og+kףCWa\ѾM s45‘+`q1za:v}ݘquX_iFr%$hlCɹfؙElnR CݧιX'.Uprz1ҩ8p! GKR `sҕƟWϠ/~r=xN Wna뮝XBrumz~]kWcժ~3O^'?4=֕Y?:o{~:~oᑇµ^(p26Giv%'0;vZq s[܈~?wҗ|O>4SOS`INԵu+/Wا?t2Kl܂}~ş㋿E㱟4og>o7oaÓaw'?xWc Mpe<Ɨ#??#мt)ΣcJ\;s kbnh%Aڀ(F% uu`i%8q;Z0SY@k[;f+% 6n܄wm;vA,Y7o^1tv,EwS+N=U[̭i uz0?5٩9AK/#O?m֛رc^K'>;___տ˟_"~F^~ULO>,Η_g| wgY?.^e+P^GK\z?py5ڶ*flYpmd| ҋq!\(,Zڭq9a~A5A9s ӻC`ɒ^HA& :;;0_.cvn}ʟ'|Ο! ;0zC\Xi ^װard߃b/xLcz:铈d R,$.ǭ7pq~x}>$.;B˗/[o+P/m>n6uC8Alܼbզ-:x.K~yO|_|O|38~>~_O}뿆mtnނbO||g?  -q[[qkt016q}c~|=~_&|a+xGq}}ڏqナboM]o4b5ZBG׺|[w;o`ffQC c2?@ظ |܂ݟ/x pMгx Wo\,%X3o>?u<//'_׆JX ڛpV\։SGOb5n^E^LBw{'RO})d27`YظWUۋ׾M '1=2%҈[Z"L_8{ 3hkW.'kB"ظf ^_bg>[X?v ~|[/5k߷ . wi=sӋ7_y< ?'qXm ?{a\Ҿe݃cgaf\yK{zqiS| }c8{0nضcHݷO=pio䭛Xm ^ /|oGë?y}I=,[ 4715zWcvl Qk+:y {{?۶Xc .9[q1utLui.?;vbM' ,ЅAo/^x%4u#7^S~^) < p0::PXCCo/&'F޿'N` ^8֦)#HJ $XHȕ(ѵ##_ch_҅G=#}I=z+W/dP'0&d3^ދP+b|}/{m( 1=6[׆b,]և/?oGhj>Kз|~~o/~+>؅ NbӚ{.6=(1>rvƷu|W~A]1k1ri=~Fѳr9*oǔSPBo^Zl&]{]H#_UK)c*q۶'j `d*V؃bC=&&02xmCa۽;!Yc=6Mt-Rܼ5NTbfjm퍸ysK;q5t._$(,blr ), XWb@?N^ pU,yڼo%GwW7Xr$c,з.9Gf$i`rf8Q-`nJ U.)[1=9$A>$.͛hnjťWnwFo^GC[;HD01=v_BW MQ171B#2ESs#&&P#E/`};p0֬_si*؎/aiO/nNN SE\(bfa !PY@KR9tkVFX:::P^G03=W`vb8tKtCϡZ\0N|J3vܟ|K} ._E{WX Ԅt~A}Y18 hkE\GNǎ;p҈ٱ9t\'ѷq=g55@LLyEfi sĊ 8}m݈S(ci_.}!LA):Zpݳ'džm[0rn֭(:NΠ{ {jr.Lݸ澥(Ϡ `q)8$AkS3JuD3صt,E&(˨kn"T0;3*RywtDR :rݎ'ѿa * )&'ؽbfŦ:2G Nj\e+->bojifM)\WQ(6RIPZ(DH<H5Y*3hkji("AR037B pEX7ױj =y7n c^=كӧOaUى)bnr RDqB"K @|v '((0;f% (c(1J"  o*bbb (Osshhn(;0=5z0B03f0A)AynME{G'*3hll:Rb1B9EPI/yZ?@wzs)Xi<sDPs)GEVoR4`QrP#F8EB0}},1%"-M07z\! R!Jb@u Hʆ!f IDAT\H"ՂV D1E(p @\2$Hp=h(F/Hx mU"dR}&cFJS-HէiR 8bnlmTzh4-RRrBr9QQ )up@ Z濣q^H XH&/4ACC܄p)>5ft7=E #DB"P*#etlbH0Gm d}q;H S""$<c"%/~JoP2BDޠ`>F"VJb;$EĔ P-EBZl/YP Ddʅ"ަRBuha;}%QkS0F13=,/P_BOpW5RY8BA՝PC73Sz-4R FkSw&'s)35߈ޠ 1D*E(UEY3=d>I* XDRX,s}GHF)R}sϡ_X@%0JA)P*UP@ٔglrqkEl^r0Jsz Eb=JuHRK 37J)cu)%HT}oF@Q J:$i B7ӞK{' .(ATqeTBkBH>pQ;W#ƭNc1Q̐&*'W9Abrqt<ѹ_]CiAޞ點B qDTʑ`@Ið uF]R/]Lޓ)Q Dk+H"V{ n0e$AJ+BJ]/q4IQ@i )&S)2`܇8>a@GDjU"qyӼIȄA' MfP_SF(bp]T({zt\DXU:h)EER$@P* FpBjOff%H2P\tR?7B36rDBؠ%tR",3p!Rw%T"j:(~".|O^0qhC^/"HWkM( K߲UA%i~ D s ,bTbAtJbI(QitbfB {BƨZCKUj )H8w{TrR"YXK,R}I,BL i.ĥzN P2n>j/KP| N VRF~eB!c A"ԟ BօkBO}韣q6,TbLh4 q}JBHz.qz_rm$#:ƚ{[LB$[fUx4eKTGʹ4(B٠AL 36{+]⽞2:FDs(u,eRbpwL/'@Pu׏/r .JIל^β*/g;w+FH95EcwئQBӂ6)UHH\MDBBp!FD1M*7EB}6HZL+P<1]b1v'~NvʥZc6d,5H\@3ZTM0"]2T#{>VwR*p%$2"咡rjWdBO#H2<*F~]pnJ $sM)3E%qgׂU*'TE,8' ipkn6fBr*M k)I9VH]XDu2+K܁j<)*q3m~;,7#H$ x=6ʂ6NIQY!wyAL 0ƪg$IHE,!?Ƿ$wydY/:ӋF}y9~,=K%5=ϋl&;_ W"k5QNxW{I}[hN]5f~>ׇ*M˜޺{Z*։_3M=i9!f̌qk,Ny,+[X~@J1B=!8=FfE| ;@?+eի~1LBJ4j,,eXgǨeSXm KKQĂn V^~PX$!"At}+f}jIR,5BAG1L`@+x=.]Qeƨ+g:U˻<ߣ$xFMMwb2 H'Ok!?I= Jf ? v 犩~?Xε*i˙ D J‹C bL1]ɹut1$T(/I @AS+D b|%Hain"Z*$ y P5g@ lZkgF-Ԏ $H=("Q0yE"-,{7:QiTIWh1_PWWS kc$b8Gkߋm[vztJ]N)az'9bŌ<n^yiAf|R7Y2ɿkǜ}Nj3 D,7Y tmo jYT5Bj~2W}E.&>6.CzhZqDt;z:7tbci4lIgvntg,3;٧0H$/6P#ͅi*@f `< )AM즦61 6W憥700r=keڼCͭFqbT*fV/=2.%BU\VU ledv9<245s7z^TF;`Y&3JCK|+vkGm(o_?㞉ĝZ6z3W.-PL!pe^'bIҬf ;Y:9isE)CFKmMʜBңee N̎mn3MzF1/6Hh< Ϙb[$Mk ٭!PA O9LSFǛYx;plRd :TlҌIbTa!Kg `PR3/I#mOc6xDk0Kx\8ܝ'\Vɔ8 t4@KN;b=]`ZTCe2 rDPay 03X_),>D;X1d iǢL'ƌWUsjhY;>nc1ND~&6Wytl3O E7#fT擐wRrwNFoMn 3|AbG'Σ )!I"4&NCI{@hXHk*])K?,lrNH-Qjxa;eY{+/SynR:7`zICl4 0/3!`tWUʉ'$Ά@F$,+z&_3XJh.I2cSЍl3tBH2UW4"WӚ nyV{a;n.R֤褁p\ WDv߉ `"q_4] dǛ Eq£%}T呞XJCHB Y2k/1CJJDr7_.N2*3p6A`%-aB)5 "qmWc(6 |˪& EjY-&Qj$p.gpAT"c$xIb:a)?rP`a֍RbE#uJ)%ᬶ$ u56 X%XD%X 5hJ"L˜-߳: X@e@8]]jvB!Ӝ"[ZAN䑑CͥLG2?&ny-9gQI7\_|nva-Ybz[8}R2IȜKZE0 Al^D[7!STodWzM-yJfV2]Ѕ`@9]ibɗpk@ !ԸCȍ>q}IX=E/~lbn\ο_H6-821f1櫡h_Ҙ)wiDmgf t=0l7B*p1@d՞""z8B .('f FVyՖ\MNJS&Y (?C\z{NK- !mg'5XoP:_`9`(ZrnghS@Ey]R'25pXtX)lKP^Xv 2ՔZ 8?O:s;Չ";Co;^RLGHB[t5Kp!^Sh{Pt ,bj^>2%Ho.Kh>/#Giw:鋘R u%L< i_PnΘ!EFnp0YlA?H&=мI)2c/{jn!R=OSLae.Iٷٛ9ȇ:LuEJ/diڼN |piFRZCid9.2iNe<1^V8<#aU@%LNQ9/shY$Ռ#&Z=i25sn>[ J3i*ە8fbZbuT3H;BzMG'$ a2F́^mb?2&pŹM>E!\ĞƃL-brG;DLƘjG=)nPCh`!X9nHS3{gʜׄs2k †KJ[g.lи5E|Lazy-ZYJ 6iqDhSy@-tD5XA3Qۤg cZ0E礵J][A<Z( !Tp<@.jlЖ&Ă:4}BϭcuS"+\'kPM@;A QWn6x#xE(jv Giʙx.mq:C H5@z9_ !I0P{J_FuRb骦e&IR6ix~Ʋj$hdkhl!Оq̬+~fo줋KДMEFy-G,܁ Ł1?vB(gg 4\,s2^8츪3 "`pf\EsNl-7)ۙMBDax4v I2v[ ;`\RUG 4]1JVŌtF`ϘYו~4Q3jƩ_'tgO%yތK˂o򎖙o4)ː4>5C#^aa#lqIT5cj Gf`TsSŴU`F@\Tߍ,rgV>Xw>)~JxFa( cO=ЬCտTFBuG퉪_0&F1Z]#,,MyjfM*wTҌ1{ҍeTFsJyDW6řZBgS؆\ܛ:{ VXfZgŏ&n+mʴ63\ŢK'n|=`Yao11Y ~" ndq?0y\0O3" طnx5$x>#6뼬6R/d!v蠔B3IQ3wqKE[5HmG}{6%(  ݉0ފ "K܃,eK󔏃ȱ5fMmRՓM?43ij:*]C;s([G 瑞P`I7#5w))%t"%WcKa&y}!)3g&=_g'R>RA_XVjQEh{:bAVQ(h;D&L{_k!5MtA'`#ٻX$ 4W5Bu}D o:Cvv狂;$r8ŎkĚ3=Y5[J?jTϗ )Vd0o4"khLt;V_xƓ\Cm f<#P n5,U_ U!Uȥ#UPrN,pR-Q׼G̘E?'36Ѫ$\ܕu͝x1Gϓh!!U@nF2&t ]g<) v[>1_]!/1.71$M虦c˚PP-L@8EV)έC ICQB԰O$^a3, #e<3bUv3n;F3ZGvw|EmSc*g:e5[LWg/RǀDFYN}63!`f:a#py2y_HU^@ėgddU⿧Ol ȼ^7/41t(ق{i B@?Ga2dQ]d $7+IMdNU16Bw&j@N7Aj'ICi~ָVSmi._\$@;Bڥ4"ls=K&"Cf =]Ksڒzve*@v&FؑK#Α@3bo !R.'2ǖ(i8lx^"hunTz ңj;YŒUh~%UBg9L(TnSU{g,/uU+\UUF["=Q+2$85ZtkmSGk'/ R"" q ST. L}1,&Hu~Bx -}|`?:TL `!8a]ywsbAQ.H$Igj6jn^ZuJ#Ydp)*YcZ{Ao /[Z \ ,%G0NUk:}$,B2y-5[5S"SЪBfF#֣DWg͝v: kgjPVųteegaƠ; l@YBCNtPztŒRfZѴ/c:|yRF%e)ukƊ4I;<z֝uy6]wɓh-&}"oChy;?aZ@_\4zʇ" ݄mBk{&)!IRq.JZ([+$Pw虧 A@0NK*uc!vRO0nڛ~zޥ82ڿnUBq\/=VfM"&<921n$ùP߂9joP"L`=Q-|FrQau,I&Ӌz/sUwA@\tuD"L,fE £y@H&,YZtc/IRg7qھV\Jc;^`,/-DQNltUIk6I&fImw5;5kB.$HF-o (ecx>͡Z)N&O,WU MBU`ήM_Bd;z]OjVAP\w'{胔k#%,{frxtIYw,컕$BDA?5qY(5*+6he,tvZRksUj[4 <̆:ufȓB5ZY3kn~?NOZB] ]ي& A3:ꍌ9fKZUyQle)> x܈LAUu2RSYـM(85,Lo!S3ty!Y7t_6}gpFdiBAjL3.I+<ݳʙ:+WV]X24(i'pV컗s/G+m2:)Q2r3pw]R^4dda7N[<ǓY4T^ۇ4K'mEH:O9vM;2ntMrbJ61|H&dTw*߉k1P(1Ƕ}/B8(ؘ^A8CDH@Z5fĆO JD6STh&oڢ$:߀%}CCw2{*Z=6c4W0ӣ8=݅$)Z6m=^{h֊Ձ'Nl.蔦c~F)Dۊ*IBYvSbCi2'ēNȯ r뢥ù DrOZQ l:oL9 jC,96 g\u ux` ?ӣF/2fX RBMɏАVz"UO=&}2v9 J.{X+z2Ѡk ߸HS,o0?uMyAy@|@ muD<D*=eTh S^,貵8g7̸bW s'fo4[f.Utؔ'g*tEK:'2ݥ 410JËIpnT!z1yh7MИ)DÚ1$|r.PCajmvv]PsZ.[?aUg$/9b\,Bn5``X1$^ՌY# Ě=KyUrRho7q<<=W~N=jf4-eӇ3ED1;.Ii1좍 =Tw\TINm1*x>P[,Ҍ3~#Ɩ#s|Ug@;z<Ioc\{Ӄt9@tQu%/dFCz 0MzXw h( *C X!bR ߨɼDZ Avs Әtmo%Ii] $JhzDa&VG0)""R_Or27~k'X:AQRLc*hb\/xfINgbpV l`vz>υ>uAθO ޓ:XA L,}ٗxYW{M|$9YYwSgΡ{'R!Vd|`6 ) 3JFPH{|.Ѫ-K e3dJ h}JbZcʈA0g]o+*%Ggz[P1zs-xD3o[_#|8cCkf`a C#2&]/1F"?~O6zC &K[' ݼdJhFv]ۉcs=M~ mMq}!UDͨjTV'Ojpu8/>C[ߝB3 6_nuk& i3>R?uiӟl+sYI$R"醂FAGSndx8S l_iiLÌY_!DWwT?.ib!n+ A/1fN9??&-pmmCX Rc(<#Y)=96c!#Rf0#_.R~h@Y@v=mR;~*tt?}!Q[)Clg{Gv$ qbJ;􆡋IU[ ~!__2鈚gӗ .wWI+DKk5њq_F9AZZz(i, IDAT#k7Y@BbphSt^[ˡ6Qoj Zڟka #X2)8PlJ'Sl(x"^Eo> 3kx9r"@Hd1cB#5aEDL a0!Mo=iFbǐƢu<$^ laB~.!ޯ|6ӓ\i!iLݹoJ-C>Eڗ(9ɐ0vDF1k Tk9%cܑS-Z iJxS=oM, ̺$ 8m`(S3!!74v}`#8#}X g$2r8؃Gmlׅ-66x{Ta7](ؚ snffk|`LaJTL u[G91uXҹ=0" h{S:XiAwvjધ[ 9~r?ERM\%lEttdhriun,Sk '-w=jivpMWowT<^S\="R !UY1@hD. l 3@28TY^kQUy&MrP'*)Od]>iVSQ}{ Ҭ)~]X Dw6"^4ujFM5ňwi" rf~ISsEkD7J<  |½b&7TAkP!=,{ spUGKmMi(> S#n', 7CmQ:4\L؆LӇkb_O/Udu5hi)NOfMvVƦqf`TqhK5h&0='` F+暻.:X+|Fd0]kfuÄ7m {[A0r{c%+FֶE' U0˟QߏpIQRp'jT@|;5MO$!N"+PRd!Tc4"ټ!Q{}2?ո+j4GUD8rh@Ɏ{ 7=@sޒaC[|[d)t{|C|!'|_kh-ڙ|!ڕbYa^WiFMl͢*3y('lXĵ,arNO@6'c|8 k 1%ӐAˈ 05ǩ.FI|PN^莛\!R %vbsRH:=ue)S-nG[BH E0i)4E @݀:Si&N'_hj=hhTbqzr9AB6/tqބF*ƺ>Hh1l) lܕ 5al{ /Կj((:Lcy͘(0$4֪n!aэ)*/PhP_G4p}z{FZa0b|o!35Jѩ7#h"}9{P-P/N?~g\}|pDfBY'- ,&lΗ+sXߛ--`Z/d^笙1閙[щn(jEmTp3jv^+lY)_Zc.|PALTm;Ri[N7BN ki0wqw쐧Ԉa Њ#j>+mUrdJd%4!CEZ_#** r<A |Ӄz=zC@S=,C)-i4pf;8u&d8ؼ}ͭyS}ߣdSqu ;adC- J*Hr gn+Mxѻ/瓲T'OiUMEi㢧GS}:Y_schTyNi'E *)OD/fz𺟀Hed}Q`gdLlցNY1d:ShOIaW -s+ NN=K{k:C+/LX]Z)U3HuwC4>| oY6LIAɓ LY!mE!tffsYqgͼӉy .m>=l(D4IPƥ{a 1aVql"*`p>^= ϯoԏQu߸[„[lmicCGh;|zRJz<(m,S#bڲ`jl-^VxcCL$)LThЈHW\v?Sǐتjxft:',7o3 LLȳ0S* }DOO،i=lXZs\/^O6gfth}8-rO߰yDT17 ϔ9KVyBs4< XFY˟?؁NU7Pq))4٧)t%k-IJO_ M*hdh&M4hՇHywfz N~z~2uL/Ifi!2v&8(̋'h̃Yge;츇fDZ17E:k²4Kj= Qlmypgp<@3n|կa) !hc BZl.xT|O:k< jl^;o@Ya`Ix|#% )M$ ܖ(rK5GC6S^Z.VODE"3A:ܒujZۍfR"Ԙ2oH;?UT/ lCFM=;z 7;:yfAx; DY@ai,lE聅Pң錠GR 05S D/Q$ܷ@$&zMiY"Ă %`DG)V(0"Fyz#:@TE{ddNYmT=?:qoRtJƞ%Tx iSth)Cìam1G7$H 5&f(zCW߂dXI* g5 T_?kp05R|=kW>cCeI1G$iEzz?/@b/E-kRk? ~ǎVeU갨[tf^AQذȎ@3dC?Nmu+ Y5YyWĔPUt;2cФz爟C1b<^2TqFqsAIAY犸!^g<k=\`/Q=8T\L!4uSI= "b)֣3hᨾdV4׶f> ܎4`ޢ&83YLoc&ԝ'3=^ mR1Dp63Ŵ=x[j}(' Gwb 㳷ǦK4CuoF!E4u 9QkyJ:F~!U]X,EhSu#,ജLz6 Z=7+;HH;lYJV:|N4l5L݊-FUY CbmPAC^5`처ՉS5Er4 /a<.Me}]׫#B5e}T~0@?.pt0S`ktoq]k5'5b>1Ly1>ArWi$ܓ_ "+ AmiEJ0/$N^eZ5Zj/ox>s,|9vRi^[xρi :Ik4喟U0s A^,zghHׯxQ4q< K/l Z۔ ?kg)^ZVal<~:րvOIk`5_=<gؓ0&#`{@jm?N=KsS }Ǹ;tw̸9!f2n-~7 3-j曜m f9g9U 4oz8B-k-~5ms#u746I a9s'Vr aaEQ98qRzV+q=ŵ1V;22 윚{;n*"ht18y[$v:U:DPie!KĽ"u^Z8GF,8a53:Jåts0WOR/JVBݬi}8f]2=QbCW<}!0M~͢|7;fg*WNtwpGqpZPۑ֝4g0q\Y췾 vчT\j?3\R1G-2wP3P_hht;y~][?&'_KiK(v=QH+A`P74rN=j怳I,}C0MfkGX - 7aɬsE>_ڛhsy>kzc[l;I!g+>O=qT^twU6 Jӝ(!7<1,puMRtBLjs6¿7  'JӘ3sA;bWӊ賡S}2g+UצY$W"P/_u73ɵn\Ok+5>FjK1D81{XQ kI)ieuQ}gRfr78P]RzI*((PKģeKZk[1=[Uf7s¨}ҳD' SVg}](:=OEղӢ˽~ѿVulVP;mQLEg 2% ?bM["JzZMD-=W::@y^n#whxh$i0?RzV GT'n6"Y4|[tҐ1&HT *4u=7l\Rm~"jbb"Zu_bϯVC4B: 1`[vA7iTe3kxSielDZQߥHtxS?q'P${}HV4^!1buoB!Ux"(A- zv/], U}Ӹ{zJ-ʱ--okOf4صǨI݋)Db*5p4؃OQlZW7S\ӳWE} rS @PnL[epRd粝K t0=Ö;ׅ):pF1ٲs\\M T& ʍóy fԫ#v蜰~Rn?WYCs'6!hehSdY6(аk#ϞeɳA=.-))P8m:e>@T&ĨSt:猻aީ }9ݪp'`Fi~p|~蠠gbKn - W4:s4sy%"hHmSVwVw"Wzu^Ƒ?¯csvR !5a,_?0LHs}?Is57{Ѵ.R){HEuWGt5bFg#g!"XHK`(fCWkA/NX'ל ѭ9w5:Z7ix\_n86^}k sBS`k ~{aLiPgut#a5A8X)NLJ7~٤/6d5NR Y{Y F9s4Y3<6z6N{ΤLz #4?VX ՘9Ŕml5gc>`zvlT*\=V6Mg^j4]A-q(ZOf8hc<f3M88X֧6OtNUQq"6kV}L1sIo R:勦 X& ~pV)5]y S2}}ѸS1![DG\( 7e #ՙ! IH7&*I$H IDAT;" ~޼u%Ⱔd%ulU5ĮQ{wUjkZRc7O(iGOD.3f ȶ+ƍHK%-4Ey9Du>.lVṂTY1Q$NM:D*oXd~89GuQ"SӐ5ɽFiC[|-fɡ *JSD9Z{0j!ummGOfOJ Xa Cz:Y4l+bހ=j 6kfl&>F`1SQb`228\WƚQ{h}(6>Bt"ZaL>@#`{T&KfBߎ%c`ݧ9ﱎ[$ Mܸ*q2(>Z&;dIX%DAZ[Cf3+<;O%v]O̫d j %bɐ*kjp9L5Y!WK,36]P,N:<ԺFp. 0M;DBbj6Ly,=ky>'B_pA> iw̐zopǟBv?GSaG?囟#='Ǡ}]+Prh`@~~* ]D=6LOe~C0?vj4@YlTg&GUdcD>й]4Lz\C]C f4ۇ3 '}:`c$bqZ[} =!1EvEA'Sb<-ݰ 3sFQxsHS\&P[AVɜќ\?Mʓˆ,?l)eYNf{/#)#!o8b瀟Kwg8Fܽ)_fz2{5MQ_<>EC1M9҇تMs8{RihWf\ &wKTIؐ-Uw #S>2ߕHC8VxH/i\_2dAeq[Ϫrt*UЭ,yɐGCo4l(0x"{wp=,Mfo0[{Ժ/MQKc*)Uc]Fxhh0 q4FR@scP|ۇmɮ%IX:Cyq#KW%Кf%v|] &@B1 (6c%0X#xq)[cg^Y2a"(.a PE]Ne2[UXԷ d4L93Ttf>lOS}&a8i[o6lN9lj IO1dl"OٔG<,Y֐4Qd}:yH\xغ#Tf*ඁõJrMb҈2^c y6tStTٶ~(Rk\eS;D09{:5RⅽG1lDtFO4(S٪ '| #M޻/򰋢iWrգI"s籨~-_:uCF}Jq1%}&iL=j@,(PK:u0d lgHި_|lٵYXjgDݻUFh %: #C,T3BPm&S,ϩF"نC\)LsyCШ+l!{x:fQ8 BtE24 ]Ё\IEntg{Ȕ\q UOվ#٠*[HFd?ߛsP[T} h^| K aI4lίۢ (- hL:qE(ӮiSW3m[6Z< ~jN1v|%G'BןF`_#XB^ž{qOD bwmsA_n.;$&mXʰth kkod߼ SſDޚ;[ėo{Jߘ^R-K ~>unCw~XڱYgҘY!u'Iw]@A[~XКm}5_:f*ghiNX Is ]HTjIx1:y漘v<}HahYq$]PGt?e>ʙޏaGk;3}= ! %'V`s~K2:9ȝUlqZ$S\ָ+}/kzHQmC ky'EpC9kyD-*I (H\o!<1xw[XwpjO/J-?> ?sLcH\[.ɺ'[dQ LsR{iMy&H'4z\8O}}Ez*hUesn2BhX3Sf6 gY` nAUBTQSWˢjڻTemNӰl}+\C3.|f2 )Mͫ ?wn?=4cjBk `JtmVY">9Z&NO&9MM`LЂxcaG}iLsiٔDsǩH3ߥ'|Dy<]E[?S;E!8&[-M=iƫHI5b>Nd0 }Fa8ϺS+  d9H3rۖ>ls1D̬YZ?/(z2RN吮+S@. cJ ]:z]r:sd]4٢mCzM:n3g%.|L$`]S0" XhBۚc5ʁTu|ƴ!jo6âو!z:2?}ܸlz4dzdO?mP&ܧcUú`-0$x̼<|>5׈H:Xq1rnf )K3} ^\09(B\KA.q-9( T5d)`BlQ^TT9OzCm>4eU]w B[Mx8 ܘ:e+Ry&]BgOljuV"Op%G%x?fԴ*8v8bQ砡m̗g@Q#b>NV}7NcXCj"<ݵR$I$х]'3寃٠SD׬" zO[wto9􆴽ES1ʯ!zB%-zi D尿4) Sbmh1~oz94u @+냯Kj8YEcE Zus%=mu L($,i{YȺ?z8dlu0ʔ?3{~`[Pa3Dknfqʤ0-i;?ۀi̽1c_IObp dO8՘ˀ|]L Ȁg&3LOpyfu7ze] *v>QZvJ%z˵r*{sY7u #"`敽 %*y=KZ>{ꔎrU P(m!=sn{@xSM5۾R;߻9C&H6/s?xE7h`S0DZBJ8-W/C`, sf4l%Iل˲(Fgu IX ]Tkk$7'TOsn^%g$ O ztKƎ >~2nLQfz"F2VfvU6s0>fp{/E&?¡f)7> IQ b>Sl^#~'f^. ~XC[Ғ1׿kt1}74zu+qec$! }2sZon@՟(5N4B0xFaP37A{OXbU 77DN\?l rF굦Kyb @7\.A{:Ϳ}]m39#iSꪾo+Y~US@0ЎK 4V:2:dZ|?Vxnpfl~*URc2/Ʈ4I C˳G!mݘ)g f*٨yyI-Ek1<N]R@1:N.zU›h,HJ,!{sƆP =A.eS4TzN &]=fFh<Z#x2Dhu+/'Y1JVݞZMD~%kKCy(swGPdڎ@O6:ٲY^쭌ziM_32IIŝɞ7iН-vA]OXدKޤbU<_D a!8YZLӂ(݊`׀G!?PhQ8fd0ٽT! ky;S pUMtVV-j3I$mݬtRd Qzu:JX"-lGЫv;8C9oӉƵl.e:Mt]Ш0" 4Dp!Eʔw,U)rW!|޷j=iu&噮̤pnù UyJ=ʑs}bP\ )XBnkA9+g;_ΐ$I<{! 1M:{rLЈ³LԆTq#+yХ"ԺvР#udQ YLD$^= {1ޖ $̣pvBgͻ`kMMT}XRnˆ<뷙im+OhDjE={3OY0,9Iy!:Q1uMvusGG{7猭 kְl[dE뉈?D|HY'hVލ1_oju>tcIa]oz{o_Z\KGcŌOr"s90b} $)Q+3 Ys6daߛ:=[؇n&.?uGry~ĺ0Ai>[11 x֣96Qi,CLA32deX=z="LʩBs]{11}ɓls@կ>kպr-^\3!Vc/k$Rp(dsoEY9m_DoNWd%7U/f&EL?x IG:6mv**,CޞP qc Nm@}-cIʟy0]yucT)n=RɋtoڊӝsȂ6 n4áV>]7=|&/=^rrʩH_A5؅: U$$y_)ju7Z*;a.MTՖcGvDn^>լ#9б/Z%Cp'ͷZ:O>gboDj\ӑyR %VX}C g=_&>8 ~OQI1XKYi%a*Hv8de,$%9ZŲ ,p끥7@W [ DIDAT@ L`Z+JB ij{Fe'D]jBùGS#޸hqkdadb~\T_l{$jv4q!RpTjs"uI#:n}iTd0rc4z]tpuyxP[g.GD5 ҼӥU΀y F ޫq^#鱡54taS_mp8]o" gc@m$^n?Vվy(oR0\l!Z fOef$^AP 9^=L5?yA9OQ":Ȯf0 Qa4UO]=kkP}\#aa\n ڢJ:f>ɀsakC/R%V&]VLdi0٬:T.|9pK-[c8Wh𙮎cңg71~m6 iHjճED$ߗ>!Zע5so)1~480&9b>'``V/0&ޟ `x•3es/B3М#;Sgƭw\~`8 pF Xݞt5Bz=i>9_dh2Q".ZՌ$%_da2tM%Ի)S#h2n|42o϶ˢy[,'K3 ၲ"1<`B#F1J|:-sFARQc\dzݢP{Ms31Rk1+)DPh][SRIgMX\cq3.iհ A#rbDj=ϛuRgh.n\MbLdڮsw03GQ$ N\5r( RWbTLy+]5ulÃ;u?)V[[t4J<5vݯ1s`LDX3-lT%0mc qϐFy_FFDy ~^00]`x~F.Hвo~?NZYO.ߏ,ڞ Mv'fAS=&֯0tj 88 w nJ F5bBxbT&Qdҡq2f'@(:wFShLkG9W6V KǠUi瑒 N =(³Vg&Pdd9(bR'0P()4~jW6L$4>4|4vI+͑C%'>]o!*'o}!JЏX{B_{u@`$u&R:[}>7940$Mjs)l{8gkt1 GmԨ>=9R@k'=L4u풸TjA b5ZkXasaMt35al=8׽dZM%p<uՙ$(rX#}aI>xМX YP4av-)t~xOp=Yş< ȍ\ڠpOS /o{D'}xJC2hܓ\N}΄=G!e]s\z5j| v&2?><#jz֛X`5Lı&Ad0ud6b-jZ=r?>%4IENDB`marginaleffects/man/figures/marginaleffects_logo_word.svg0000644000176200001440000001437114631452336023566 0ustar liggesusers The Marginal Effects ZooHow to interpret statistical models in R and Python marginaleffects/man/figures/mfx_slopes.png0000644000176200001440000021314414631452336020524 0ustar liggesusersPNG  IHDR<eeXIfII* <(1 2i)[)[GIMP 2.10.362024:03:24 21:36:31Iqex¤ ?r]segtj8L,XicV45i∪/d CbKGDb_ pHYs.#.#x?vtIME$!P IDATx{s?LBjB֔LW&(FeK&ֆբ|A9TW I9L&qmVL\.KQ}>ykx=o<^T@D@VQU`dYE@VQU`dYE@VQU`dYE@VQU`dYE@VQUʆ!***? 6Ć ⣏>?0gg}b}}7j֬vXtAP-n+Vwy'{(((m۶qiEƍyq,SVVLMW^+-Z5j~8Ӣ~QJ[PUlƍ1mڴ4hP^zǯ~{2KRQTTy푟٣G+APdtVVVON;0aBTTT2=(mG}t|we]쳏mvlnƦMlwILC >}Ě5klnl1yD=iҤ֭[\Fi)>(..N\EEEѥKXdMR[./Z(:u .}AZ >,ѡ^:8(**XZ O?4Ʃ-؅K>;MTJ@Z r\/ `HKvK+zBCZ :H_O>1jԨؾ}0`x_O )2UW]O? ;HKvD= 1vX%NH[֤IK/4{9%J[vGFÆ իWL0A VUZ5:'.8q [qvPcʔ)i-8馛NڵkL6MFn38#N 7)++KGy4v[oM4f/qqÝN֭[Kr3O]v %%%ѻwXv01{.]8PTTcƍ *""w}wlݺU@U0`LWzj[.}]z8"???rss$RF`_i&oNjM>=lnݺEII ĨO ~?x\{Nph"ƌj*eJW_nݺEii;vCA$ V_<'''ڴif͊6m8o1iҤc˖-Z r!Ѿ}ضm[̞=ۉ~wy'***e˖QJY>UOUW]T}UY)k ./wCݻGNN0MD۶mߎ͛;opK/$ fP 6qE.]7ܹs,\P@Vjժn)_fAY#umƍ.i:uaÆE5Tz>^{]tQ(x'ƽ*ܤ ڲe˘5kV4mԩx FTJ@O ~_ٳg9 /駟.J\jժK|ٳgGFTJIN:SOEVl׸K J)7vaOD۶mmWo(++P&yZj϶ _*ܤPf2dHt6|Ž#J 4rʴG>}bԩ_|1ڴi#RP}ɚ5k[nQTT$(** x"ծ];Fyyy_vZAOu֍1c+͛7pC h Ѵi(((W?>|(//`F˖-cܸq;?E*q@fR}Lj#W\qEk2D׮]㮻W\xᅱb AGme]ƗFcӦM2J ÷TJGIII,^X _())T*Z*U9eee)1옵kƅ^EEE#FE]$ #(vҒ%KuQZZ*/yW#??_@N:cW;>AiZlO< $ 7oVU 0H ;A~Ӆ?hѢEH >cСcF{ڴiS'&M$/={v4jH`Ӂw_4mT_ҷo裏q ]{L_RTTzk|(.ҨQ# ~ŨQ⩧T+ۅZn&W\s5k c`PNNNt% $/ DŪTկwBiii\{'`AjbРAѮ];a| ضm0*,%cժUqҥK1cĹ+`Qf ,-[ K̙{ Yfb„ 뮻F~?A_>}z<ñ}valɉnݺŀ; rmٲ%~ѣwy'ի'`ql^zzѺuka|믏RAl;CcȐ!q #" bذaQQQ! `b̞=;N;4A|a„ Ѷm[Aߛ`irI'ȑ#/8V\){S\_ "4nؼy0EF{W׿;O1iҤ1bDR^;k֬:ҥKSzꩂX7o^r)5kƌ3N:v'3DcтM7[l`sΉ ""x'} i@0[l:yaDĴi? @k׮Ν;Gqqq8W_bUV >\z{\Qe&Mĸq=X v,yqw""zK,`|8qeEϞ=7xcl޼Y7Re}7bԩG*SVVM/^'x "_-ZZnU{l ~Ň~(k)*N;-hѢxc۶m?`HNNN+.g#Ĵi,X%#.1cFXpauQ7*C9$~QF4hP|駖X%Un;vlsxg(*SN9%pUW- J-'''z]tQ⳸kcƍPUvժUF^^^s(,,GEE)++K{73H|/B~ ,q'C=.XzSeѣG#9_>nغubYvmuYtDO\`! `Yߎ6m$>˳0@B1dȐp뭷n! a`Y('''.ݻws?~|0@b֭;/üy~ , ~ǧ~j! !`YNC&:'Ƴ>k !<[nİao 6K;~Fc,!=lԩ1fY 3v/~ xh֬e,XœѷoDg.JKK-d)XTZ5Ol3f̈'|2R) y1.\'|r31cFx≖` դI9rd3o6m e` ֹs cȑB, Ą[zur)~f/G-,d 7Ç':뮻.6l` K(N;-?o޼:t KxذaCt9+'teJ 0""/wO>2@%_7ob/,,gy"@% D-[D޽cҤI`ѨQ#`/իWn-vmgY`u֍ѣG'vI&ĉ-TR 0VO>wޱrJUj߿%6x -T2 0ZjŐ!C;?EJF7jժU 80_}ձn:o/u։1lذ PI䔕Ypa|ɉ ZlipҤIoشiEJ@ڵkt5O? ` 0v5jT"g/..'x"R)]2d7e>ӧO?>qqYH3[m6?F-'٥ի=X"g饗bܸq 0v>,.Ҙ0aB"?~} 0v}7nw֭[-cG}47.@xO?K.$&MkԨs΍ڵk[cVZ|͉4yؾ}E=LnՠA`[؍`qjՊGy$=:fΜi `7Rڵݻ'rn)6nh `7QUV'r;v%DFԫW/ ˗/(H . Znzضm%],,%iΜ9-&Mz%] 0No180>Kɉ_͛>%]d^z);Dξ`[%] 02Ʃ{NhРO,|O 02NNNEEEsYxؾ}% 02ƍsΉy%nSFV,|n:曣w#l2훸矷x-4h{8#-7xGqD92 K;AFp9D۶m7>oR^ztM[n2K;HFqǀ7o&LrRbX~}r)z;hѢS%oJ͚5O>hTTTX 0*mF.]7!CbJgk6r-yfK@FԠA{7Y_ rRb2ڴiSo>7Gq%ցwqG"g>|xTTTX 0*VZE>}7C=s̱5`TjUT+2vmeK_;#cቛ{1i$ _SVVݖ-[K.1cƌ;tҨ]%/FV^z 4(6,R)=6q '_x;w/(999q饗F͚57~%Pejժ=P~饗bBF:3OSu{D~ 4FTh 0RÆ ;Hw}wDSz 6L>`[KF:㮻Jƍ_/L IDATX 0)={LܷrKY),%ي+Yf{ȑѵkW P^^7n 6Ć bf͚XreAk׎f͚Ł(8Dxǣ_~F1U,Jbݺudɒ;wn̞=;LSF^^^38#o?u`$Biiis9QTT Pmذ!VX . &wɟۼy2dH4mTdoDv7ܹscP|駱rxW^ѣGﶟհaxvڂ'k(H0`@ 2$Qs3~R% }bɒ%QXX>hӟ4 9DD 4HѲeK ?˗gM'\θ+ YAFOK/4Q3n:ƏժU&[l/hѢ(((cfvD%ӵk]b̘1qZCŋ㭷ފaÆg 3fĉ'`$Ҝ9su։_==P A*?8-[ϏǧYÝuwD~&Etmwߝ瞸+,"|wߍiӦ+jőg;ضmۿ5|7Ⱥ,XuuTj{UV :4wGwqGZT*>XlY̛7/ƍꙷn#>Kbĉۇ,ۼys{SN>Q[ѤI@#.\'|rf>駟/ SWlڴ):vK]tÇGժU-#Jźubҥ1o<FZѣGǡ*  ƌ3C_6m8|Ҫ4JJJ8&OSLnVFxףnݺ k(kl߾=1bDbfϏI&ocEb̙1tPA;vQ~}aU`o\27n{챸 >͗53gN3&.]*4:th\pQZ5au` ~+5ˣVZ]4VX ,ɓ'ԩS&yyy_*N?tO` 6o\pA̚5+13|qFNN;ٺu뿞51cF>5jԨ֭[GÆ "`-zh۶mf.** 8|vH*kƒ%KbܹSOEII`kvEӦMF!Q`-***b1dȐ<~k,_O>˗GqqqL81^z%Y-sѴihذar!B!`VZ 6LѲeK@Dϳ+WE̙3=k\xխ[7~Dnn` `Þ|۷obmݺu7.WŨQbՂI Fݣy / 0Aq9DQQQbf=ztwy !h=@M}Q\\_}w&Jźubɒ%1gf/ JKKcŊ`nYtYgM4w}JnH̼Fg`aiذat=N8ᄨ_~z衑#`=֭['Yfq衇:|_Μ93* pG֭c:uDժU viӦ\yӧ |pҥ1gΜ3fL,]T0iֶmԩSwqQn],]`֭q饗?8#>7(--(.._|ѳ^zE~~~4h jժYCB 0E}hѢEbbKŋc֬Y1dd=zD۶maÆqQG>#r 0ERTqqw&fs1JRƲebܹ1f̘Xh`ҬUVѹsh֬YԫW/9@(`ZfMԯ_?1'u@bl޼9JJJwߍɓ'ĉf_~裏;S.6z3̙3yZ۶m> x㡇JݻwzѠAYCQ.'ęgʼnϏ#GFժU>RT|DZlٲ?~;6͛'4k۶mt)6mՋ8@(ॗ^;/1N2%~8xڲeK/w}7MǏJկ_?u'xbs1 rrr[n޽{DŽ 1oVsTV>%KDaaaUTqGŲeb1vؘ7oPҨSNqYgEƍnݺ `-_<;;}9x >()){/ bرBI͛G.]yqGǡs@VQ#Ā1kǎ㩧rE"֬YK.9rd_^0iRFӧO|qFڵc `}qI'%_^|hӦObٲeQ\\&Lӧ %w~z4j(~FjՄ$ g޽{'b-Zċ/իWwecժUhѢ9sf :T(iԺu8YfQn8$ Ҡ4>|u̘1q:xRT|ᇱtҘ3gN<3h"{_~ԪU+rss 0H81k^^^̜93: ̖-[$.\'O' %.8SAQN^7`&yt=Ny ={to|A,^8z6lX &M:v:tƍG^^^ԨQC(;@i[oE۶m3ˣVZ2ƍcٲe1o޼?~| %M7o]t?>>ػ/(CmD"l.Y-Zbnbej BnnŲasi(ff tl/\;|>hԨ!"zAM AAAؿ =tϟiXEErsssaϞ= E,X}hڔo*#ҰTxxxޔHR6=|rDzz:C___1f[C###BDqFajWƦMQf.'"""""{=ӧOQVVgϞx5kCCClhѢ abbmۢy T*( "00z b1!"gi8;; ޫWk׮l<c;'"""""{~|A "Ҕja cƌ077ިjܿp6o <~~~޽;  H ]|CDW\ ODDDDDj/ƼyЧOhB'kCj ݋ÇYL_h=z/V DЧO888̌!ٳgAGpp0ODDDDD733;vd㉈^ZƵk0sLrU0yd]EHHH͹f_~%&O`=۷qe@AA_0{l 0H$Zw/eضm DDDDDD/ X|9~koʕ+Xf :u`ϡ yyyHMMٳgk.(5&L@Ϟ=akk6m0""HeffG7==l< w>S߿gaMV˘:u*J%b1݋z75 ((CE׮]aaaf͚1""_`ڵ>ҥKx"""""(99AAAP(ؽ{7 RիW#** uVL<M6}߻ wAZZ~ǚǨaI$L6 C =`DZ.77yb㉈ĕ+W0dQgs΂ٳgطoBBBs~jA.իسg___VVV/K""&tm۰l2AԺ`|'"џQ8}43gʕ+!d &Ν˗UV=~YYYy&;˗/3L '`ff qFamm-z?jԩS˖-… ѢE /^;_gE]5q㧟~BDDCӐ}" C!"Wػw/̙#Zg̘ 6ql<ѿj;v `Æ 6m5kp7ob(((@`` ,XRx޽j1h 899A"I& ^tDaa!˗ѭ[76Ξ=QFBCC1qD~p/q9L4ah'Ǝݻmڴa(DDTo8#!Fpp j Bhh(?EDDDDDڵk|={6 Jg("1uTxxxoDD`8#!EEE4hQc(..FHH-[͛3SχL&CBBáT*L0C ,--y>i `D:&&& j3f v쉈H>|$$$ 88k׮s)**BVVRRRwٳ|h;Ə=z&&&uVѨQ#EDD 0"SZZ#F >>^9s}e㉈Hp***b 066d* HOODž sN@4hׯann^g;rܹs8w\^zK.ر#LLLЦMM6022H$!eDDpFΝ;#G V8p{9ЉLj߇L&Cbb""""P(А1cΐJuV!VWW޽{刏ݻQPPX,F߾}aii7x۷G۶mѺu 8(#"?*//DŽ pA]s3$''q}Frr2N̞=֛sj5 D};w)Q$"j̛7{D9r$ODDDDDz !!!عs'M7և5a۶mlcpttEN{.n߾8 >3www]t9 b""ATxxxV[[[\p[f㉈H6lXͽ^.]9j׀jqwwDŽ гgOȈ!iW鉜8;; ^BXλv5zSZZ;w 55OѣG D1cz {{{^ wAZZ~G>aaaP|||0|pt VVVuVjܿ2 B`pȑ# KKK4nܘ о}0{lAԺtRX""""""sMp=nšm =x!pwwܫ>}HIIAtt4N:O5 3"0"=TXX777[[[6t͛rJ|'Xp_5eee5;w R&MA]tA땕EFFm6FdxwеkW2"0"=ua 9s/*0"""""* ...P*x"zUWW޽{刏ݻaGmm۶u]VѣGHJJ‘#G赓H$?>4i҄?驢"xyyA. _~NNNl<lt T*all\sɓ'Brr2;8a3fܹsann^gPVVB[n8z(5tP7Dǎѿ5eDuXj ޝ;wb˖-<tV D˖-!ɐs!""iИ1cgggbܸq{.:uFyyyr P\\HcΜ93gfΜ ???tZb8D$h\FJJJ0|p$$$޸8у'"""""V]]EaΝō7T*8::"00={ LMMkͅ#ĉ< "˖-7ЬY3BD;}4Ǝ+Z'L04mŭDDDDD]?~.\`(4sLxyyu* 999HKKìY‹t'LH$ND+++رcssO?7d㉈Hg(ѣG{H$u]VdHLLDDD #3o<ٹyvDD0"8<|}}Q/.'""""VLs[C Ř:u*<<<`oo33:gF ++ )))8y${G1fL2zB˖-%@R!((H0x뭷x"""""WFrr2qA4haii Z+++T*/b۶m sEabb@HpF$W\!CQUfUTTT 77矱}vA?~}hܸqǔBP֭[FLL #nܸqУG:_^pa p?M'""""'O}:3HD*8#":K[YH$ڃ^JBNNqy3 ruuŸq [[[k׮Λʅʪ9{-!!F-[ SNEQou׮]xwt""""Vq}d2$&&""" hМ9s {{{XXX9WwAzz:Ξ=34":b[nСCa``@pFD5JJJヤ$A|Cuumۖ'"""" YYYHMMɓ'y.`ĈpqqZjUZF~~>n߾ݻJNҥKmqFD>}cǎD?M'""""z*(Jܾ}.]֭[I$W^C)\\\lܼy?HY'ND0gϞaȑ|*6:*337nÇy.M4  t͛׺^QQ\ddd… ؾ};C#"#J_͚5c DqFDubĈ5,, 'NdӉH8*55ΝCdd$C ulWx233quDFF"==_"бcGi-Z!믿B.3 zXp!%sopYAܺuK鉈Hx.ؾ};`nn&MԺ^ZZ BT:u ǏghzL"[n077Gabb6mڠUV022BV`hh-[hҤ 5jFq5}7ը@ee%T*U@yyy͏2ӧ(((;wp5dA[066fD?qFDAɓ'DDDD\NtfcƌLMMF쵼|Xs3gWu᭷BӦM=`D\8q"bbbVHDDDD*++۷o#.. E={hԨ1p@$$$ȑ#055ERR=xclmmѧOHRڵC۶mallVZq _JJJPTTBAP8z(2yd̟?VVV x 4H~W2e NDDDD:GVѣGHLLDTTRRR͜9^^^5kVzyy9rrr_cϞ= L :}􁍍MJ.ccc-mRVVyyy/"ҫٲe Ə֭[3 "W>}:9"z b1ODDDDZ nӧjB ???tVVVDqL&CBBysuuEee%RRR0g055рR<|P*D\\.\p;>۷yD$Ltu_nٲӦMcӉHTWW޽{dr x.I${pwwdDGG#-%1rHt;w9b1amm HJJ-2j_!pEDFF2̙31gXXX0 "F{ܹطo ç4y&;8AAAA}Qƍ1c 6\EErss~ E1~x666011u]VÇDbb""##ഈD"ヒ=z@*SNhӦ_8qD 22#Gd: JYYYHLLđ#GP(L>!!!ر#  Oj,^۷oDYYY033c㉈޿.((@ff&]HrA ,@߾}aooDRgOii)ܹT8~8C".]cǎ/_~w܁)ߠP(;w<>H$ 7n@0"Kn߾ wwwAԺa̚5M'"""׮ nBtt4bbbbpvv5j]RL&C||<^2T*#** 6mϠXyy9j={,CcK,|PgE///QXr%l"zr9x 6^IUU򐑑K.a ER)&M777١Cu&O]v5Zn7nӓ;55ΝΝ;ruuƍs"~_ݻ ֵkbΜ9l:'O 33III8z(cpttD.]мyZU*rrr5- &XN՘7oك> cիWU/0ejՊa1/Sϱn:AԛD%-- ΝCDDCѠ}bر޽;lll`ll\HLLľ}P(3g<==agg :e%$$`tXXX![%+ooo|pvvfDz0"z!999?LJ~ȦQ- Pd2D"̚5 94iR1%%%Bjj*N<ɳ״Ș1c'''H:5R 66;T]];w >>wFBBCqaaa7nZh0 `D6mڄUV ۷oSNl:@P 55hCgggHRֺ^UUR \|gi3f`Ȑ!ڵ+̴Caڴipttę3gжm[6TEEr9uVnC*2 "=wAY ,`Ӊ yyyK8@Ѱ?΂rss-LMM M 7n\e,Y&&&Zrss7F/ٳgHKKO?O?H >M6eDz0"z)_}/_.Z;0<~YYYHJJBTT(6sL[ptt|YPsqY߿iTSwްH$YQQ˗c  fGDDDOJJJT#4i҄ͥQTT۷'N` ZO>3`dd0t `DJv!oݺKKK6HUUUAT"##/_͛bܸqpuu-ڷo_1>\.GRR9$D",Y͛7ZT*VZm۶1L7K&Xr%b~~~Xv-ψ'1+χ j裏tR6H"++ 7n@TT͙36mZzyy93g **iyݺuCVt*l۶ } !!l4iſeW^ݻqYb1OOO4jԈڵ D< HT*rrrg(4tP1ݺuD"sV/gΜapZ, puuԥVٳg[ 4 'RYY4`ݺu D mڴ &M/i@* իW fG""""mVq}d2\v P* FC$ {=fffI|ڵ ׯgZSLoN:o=8Hݿ.\! ªU`ff0`DZٳsD󙈈 ++ )))ƩSaptt% ү+++éS0k,3H-#xb666uj?#ƌ)SpE:ӧtlق˗/3-P2 "-< nj׬Y DDDDQUUJ%222pel޼h;УGX[[~ZFJJ ֭[eƍ@uz]ZƱc{͝;Wo};vkٵkƎf͚1 "-6K]edd@"DDDDBRRP4hׯann&MSPP={>cZ^ްFƍJ۷]>7ok;99سgsŋѶm[AE8#Çڵ V}t"""R4;w E0|ptR3g?DAA ޯOضmV^ ҃]"mVqm=z_~%0ooo|Wҥ k~̜9Sd2DDDDZ!ɐ( !0a`kk SSrZFjj*֭[AkH? jO?f~1g~^_wa C$ "##0`DZM\~=>6?@P 55`AԚ3336JBNN={0 KKnbXbAM'"""VQPPL\v 6w011i?.\%K  Yd F ?=SFRܹsX`A+WDPP^l^VV .ڂs:u >#z333w^l۶4 [[[ݻݺucD 0"7BZ:DDDJKKP(p-DGG#&&hH$Œ3лwoM4sdزe "## 1x:ػw/֬YSs֭ND())ŋ_"!!e˖G\Ejcصki@ǎСCpFDɓ'puuEAAW_aʔ)l:j(Jdddիرc3>>>pvvT*FCaѢElxzzbׯ+V[ѣ5?zj=ZFlQQbccaR)VZaÆe˖|7oĎ;jMeL<͚5cD0"Ww܁)NDDDZGff&q\|h#ѳgOT+G !((nnnh޼kmrr2݋}3ǎ WWWmVkPT}6Ο? ]\\xbx{{u| >310o<,^_Lj`DT $Obl:i "-- ?͞=};;;߱g6-_Fݟo۷oumҥ2dlmmall9T*미vv]!#$$_4D1119BqF8H[qFD.""|)p-oߞM'"""Pxr9]Hr!Cň#Э[7XYYA$i,++É'0m46[#FF^ܽ{W^Ů]_z``  GGGXZZUV9TTT //k֞={lj* 8NNN000#<<k׮ev킓 Q{,--QkXX&NȦQySN EC$ ;;;iJ2 k֬w}6-[`Z d2\pP*u; ر#LMMall 4k֬RPQQJ>v_cR)ɓZQFaȐ!prrT*D|pVXtR>aÆigt `D ߿+++AdzDDD!337oıcx@# >O>S Hzj 2&&&:={<~CNN߿Сabb7|ܓ'OpQ̟?aԣ@&Mk5;v`ѢEz_T*ťKкuk6^JEErss۷og(`0777>}`…ljpttҥK1p@Ư %%%PT(//Gyy9ʠRФIhh޼9 вeKjՊ.";v 44aԓ 6`ڴi%5~ 666522#GdӉ/Qxr9m4#F@׮]!Jahhd\lp=swwGHH###BDz XbH=Xt).\-[2 W5P,]TtqqٳgyKDDDUYY nݺӧOy E`` z[[[*"DDD`ٲelt=Y-7,Hp0z0c \; A)J #G`ذal:קݻ\x޽ FCO///899BRH?<:SCKȢd. n$fGͭ\R\$܊05I 5DCMJEoniEs8qsn͌2u]1M23oooM8Q^^^Y&AXӧOkܹڱc1*XoA0ܒ%K4c _>3*''G'N֭[9~Έ:w^zurpp0뻩WEFFj̙l}?yduQj"v5mݺUF"FekkK xrssbkOեK6 qM*--MFdccÇ駟V-Oʬl0tJJJ"O5c p9ř3gpBmڴM֭=1r`(~m͞=٩S'mݺU5j`0S?*&&FD1uUr~'ZJBOlll4oӳ>˦`&tY:uJStt4QMj۶,:x&NT.ޓ}Qbl2-_hϞ=С!; ̝;W7uCQQQfbu,`P~~Ҕ+//0F*ooo999I&VŶ|{=-^ >Yxz%b]())5i$nԨ@111ѣTB MNNz)XOT񇲳۷kD1nݺO[VU^=oRRRh:s }0g 0@O<1hٲeZd 1*ȪUK/jժn1 5kEܱڧOEFFZ)--M#UPP<<<ԢE 5jԈC~~-[e˖>l1= .] =zT<9cDaaaСԸqc wT ڭ`Zlz:uӚ2eq̙cǪz  M4I+W49R/XW*''GN۵cԲeK٩nݺD)~M+WܹsQf͚Ɔ` f͘17ThhjԨA @ SN"zQT]pA:t萖,YB#СC.GGG5lؐ~w}I&Ĩ@ Ҹqĵ &`0믿Vhh233 rf̘3 }?~"##~Ǐל9s믿*++K'N̐ .]UM6勖{tuhرĨ@9s:tQ]|YK,QDD1ԩS5a>1`2;yyyYZO8!{{{6;P\\\>}Z_|E0c<==կ_?A'Joj˖-Ĩ@W͛7m6 2 <<\&MR͚5 (--+M6ZMɓ' Q:z8 LjԡC999qƪZ*Q*PIIݫ kjܸ11:yƍ$bܥ'*<<\j",0&%99Y>E555UM4at59sFNg}O>(F+???lR͛7W:urwҥKQAz &u9frZj1ovĀahԨQ1Ο?;,Vii.^ }ZbO*www9::aÆ 3$M0A...3g{9wfƍ裏+.j IJJs=gkQÆ tEr劲8H .]UM6e`ڰaÉQA.]~N:0sGѣ9.h̙[.1`1097oTPPE}C4%$$hʕD1OOOOnnnrpp`P`$ٚ>}vA 0vX=ZM6%X~AoqFYf^zĀE`$%&&K.fNkkk>}Z>(0 TrrlnF:I7VժUb$ڱcL еkW]VVV s5_^&M"] [o `qwldd *"={VNҞ={,=W~~~jժxǃׂ fb#[[[͟?_/jժE`AueӘ1c4{lծ]0k C_4uòf&`0(??_iiiJLLڵk!*www9::aÆR aL5vX9s 護/ o&Owaĉ2e YcdݸqC}U||ٯ5::Z~~~l:$QJJ>Sݻ(F2|puY...jڴ)_X+Whz7qPhт[};fΜǫzĀYb߿_z2uiϞ=U0 %%%SZZ8˗H<==կ_?A';u&Ob///͘1Cp[ڸqƏOrZ`F[%`LڵkԽ{w%%%ZæVVV?͛7[^S:I7ˈJH=z41Qdd|}}9 P.AW޽QN2di0`vء^z٩S'mݺDQQΝ;T۷O6m"OZ_WBϟ[o(b܃Çk„ jҤ 1wɓ5jRRRQׯW߾}0` e/߽{t@3 t222tQEFF*//0F`ggC$ IDAT]jذ!_4TW_| B%EDDLJw*ŋ8b͛գGBl0P)lٲEÇ7ujӦMVg񇲳u)ܹS;v 2D]t6mfk՚1c1رcꫯ'Bj…Zd 1aܹ3!`~gZĝ_~<<smܸ(F+???lRvvv[.QիWkڴiĸKnnn?~i{xRSSbڵK@ @{)<< @A/_VVV= 6̙31;;; 2DjѢ6lj 7xCqqqĸKs`4yyy qΎTΟ?o1w$''ёM tU9sF'Oyϐ 2D]t6m5jł }W6l._Ls͍1$hԩ&pssӇ~'|tt~m͞=9yd QZZ<ȑ#Zj2MzGb^HM2wizU^=bLJaaz-EDDx{{kÆ jذ!1P0P詧I&l:+W(++K'NЖ-[taIXX$[[[UZ(1cbccq|}}5m4`|r͚5w_~ZlJJ`0hƌZtٯu޼y e +77WO_|Hz쩖-[^u% 99rrV\}v7o>иqqƍYfq,8* `*To"֚#P  ԱcTԾ}{hB 6]D/׮]ӆ 4qDb܅kԩ'}n߶mqϟYYY&J$,,Lk֬1FDDhСl:T׮]ٳguI}gOb$ / WWW5mڔTQ .h̙!]ԳgO*G6lP߾}  @uqy{{:GyMSZZ/*##C_VXBԶm[G% n`0믿VPPGޅÇk„ `6; 0w`޽"L0VIIF-[ZLǕ+W)>>(F2~xuAβUժU;vumܸQ:1FQ 0+999 VRR1n#))I΄bRKLLT.]~...Wztxt%$$hʕD1nݺO[֭Kܕ~AoQN7nqbŋ5zhnv֭[?O^6wʕ+VJJnyF;Y7VjՈѣ=z233QƍSXXO}SLfXzȍ30 ?C>>>JII1ǫ}l:͛74%$$hʕD1]OO=U^=; 66V#F F9EGG{ 9s}ba۶mz  وӠA~ {'+++6@:vbbb,Sdcc`yzzY5.Pz0:`o39rDZbXׯ̙3:}˹F4p@ jٲ5k5kFpر0o< >\u%evϟŋsN5i҄0*`JttFi;v͛,Nii󕞞D]V/_&) @m۶ I8r䈆 f7DUGGGEDD駟%wH-Ҽyq Zf ǟè0+jڴEĉgBĉںub$cǎդIQ\\-[hԨQ(#F(<<\5"t -_\3g$-L:UZ*1` 5k^SNe7o*77Wiii:x"""b$;wV޽զM5o\Dɹr-Z%K"##ջwoU^ܥb-^Xs%-lڴIz"?"֚'|MP(++KǏWLLb666 ԨQ#YYY&+77W'NԮ]q:wŅT"͝;WK.%-.{ 0fiҥ>}ٯsѢE=z4RxY:uJStt4Q_~zժU+٩VZDAoƌ=zz!bP^iӦ'pss,bb,;wN-[6hЀM` 󕞞#Ghڵ|2aErwwJ*AFk׮UNxP'NTTT1СCh"n ٚ3g,X`댌Ԁp& `NNN8m۶iD11cƨSNrrrR&Mx*-U~z786+;vo,ZHF<<0 k訯Jc͛7t>cǎze04i$\nݺeee㊉Qrr2QZ!!!zgԢE =sCK.U6m\pAJJJ"r!5oޜ0k}~O}WTTgԩSڷob$}QժU+5kLk& Nqq6oެѣGM8Qƍ#3o_g g04%&&jڵ'f$ T{5p9M8}ݡM6gϞ|A@%=m˖- "_lذA}%*0׳>L_kVVq60щ'm6߿(F^...jҤjԨAo;vL#mxzzjrvv&`І JoբE B0`Qbcc5l0_gDDʆf͛UZZ<6mA' PRܹS$9rN 3PRR+WjݺuU^=bB0`Q~ЬiccǏf3SPP,?~\111JNN&CrrrRƍUjUwƍZfÉq,Y!Cf͚kҥ={61[oqql<*0gÆ ;vٯ??Trׯ_ٳguiٳG111D1___UVS:uoyG};fHsҥKۧgyg X|ۛ:=<<{nժUM*R+==]Zv._L#СC.GGG5lؐ/{pyM0Av"mhѢEj޼910sW^մiOڳglll{ EZlNjܹs:uĆ&ʕ+VJJnݪxɐ!CԥKiӦQQ wiذa$m?^'N(k,Haa&N(b)$$DoWN 5`,/WWW_6mڤjժ )..Vnnӕ+WH<<< 777988~D*`ջwob܁իW|_;vOQQQ׿E5`,֜9s`_gBBp ~GeeeoUTTRSS c$aaa򒓓lmmUjUAqq6mڤq6lmm~z=?^<5N8a2 Pv~CղedeeŦիWu:uJw'|B#ѣz֭[^u% pjѢEZx11n_דO>I 'NC"##UNbXA&Mǎ=*6JJJtedd(11Q+VPaa!aVAAAj߾Zh J*|3'OU^=b۹s~[cƌ:0モٯ^ٳT_UYYY:q>c>|(F2h rqqQfTF F%%%6>s +/Zb&OL?}?I 0DcƌQttٯ5%%Evvvl:pnܸsϵqF mA>(Q#2 ꫯԣGbF֭b iӆohժU3ՠAb1`=fٳg+,, `0ҥKѣG<Ihh:v(ggg`"n޼X11p@͞=[5"_UÆ !iܸq={UF `,^qqk._kVVq6(lhڽ{7Q[nS֭eoou01W^ղe4w\bܹs5j(ծ]}ڵ+7c飏>/!pG*(( ͛7t8p@˗/'*((HjѢ5jĻ VPPӧkӦMĸ-[_1@%%%#ğx0tuSfNkkk>}wOַ~%''H^xA-[TfTfM@NNBBBtabC+V31=ӠA!W^ZzԩC >S~k֬K/Ćâ\~]gϞӧo>EGGHv

]BҖ-[Խ{wB0tEܹkkkoF?0uU9sF'O۵cԶm[988AD\NND2DDD_VՉ͛7+((N:M0˗/ה)S~ׯW~p]pA:t萖,YB#;v&MZjD,Drr8Znٯ5**J׿tߍQ:v옢J#ܹz6mڨy ܑ\;toc˖-֭H͛75g-^آ;/c=Eam$''g5u(>>^c^3gɓڹsmF#Qpp<==Fʊ0Xjj eUTT݉*_Uڞ IDAT Ç-CxxMƍLFIIkkϦ Ciɒ%D1ruuUfTV-+ҋ/H2xyyiŊj޼91@t)yzzZ|}gႰP 9rD>>>f֭[k߾}<f~gegg㊉QRRQMՠA'A۶mS`` 1yq\bcc5l0nᡸ8կ_ 1;P\\jf֏>Hl(**ٳgkӦMD11cƨSNrvvV&MTZ526lkF28q"7 8}tEDDXt9shhJHHPϞ=~[Un]6 *??_JJJ땗G#ܹz6mڨy沶& w5-]TK2,ZHÇW5FAAzdpAmۖ 0;TTT$???x͛գG6L\rEJII֭[O#Qpp<==Fʊ0_U3gTdd$1% f)99Y>E7ܹ>#n0 ٣}:=<Q( @]vTV-x ~iǎĸkkkmݺUO?41Y۸q^yntR10rzt颔_klluƦWA.]Rff;(effHԿQ 4 .;;[#FPRR1nCW#1ٻq&LuYt$9;;sAX`PN~~Tvm6QJJvܩ]vňƎ+ooo9;;I&VQͱcԿ]|ЫW/-\P5"޽E4s:`to^yyyfO>D]veM@qqΟ?tb=ZX3 Ann\\\,b Δ… PbbVXa3U RբE 5lPUT! JԄ 'os-m ֎;,y/`pϟs:駟vl_/։'D1A^6m5kSHHq #GԬYC9sF^^^{>sp1`prrrSOYZ?uHgϞUjj߯M6<<<mޞl >\ĸ0M@z 駟*00bן www.3 *HIIƌh_k֭w^Y[[W?+Wm۶b7^^^۷ڴi#կ_( ͛4n8ba֭aPkݺu~ooomٲ} *7|"c MBBB-ZVVVVz4}tb_ϟWUXXh_hFͅP1 T\\kǎfV=zT 40?>}{jٲ5kfvtU-X@/&F?>mۖٶm/[ղeK.JTJݻw.^XF2ꟁc M.5hЀ͜9Sk֬!-8::?31b?^7nC6lPڵ*)`PK'|`7nPnnRSSƌN:IM4QՉPPP'*66u֩Yfxrssb_j*)`p۷O{N6M)54=>>>W6mԼys^ ŋ ޽{q ;wʕ+ոqcb~jC'Nޞ bշo_%$$XzXa{khZlmm5l0yxxY5XC999 VRR1n_K. 1ƍzWi&\@@VX5jp1T2 >9pzak3f,X ++ űeРA񑋋5k5k*Pjjtbh޼y_>1ᅲŮӦMիB% b }s̙W^y+sΩe˖Ç멧B$}w˫շo_iFz衇98::*00P۷lllK ̙3 Pjj*1naɒ%>|UF aÆYn:ޕ^I0`0(<<\+V0?BBB3Q7UXÓ'OjΝڽ{7nd#GTNI=w9 8P)))ĸ5khqBBBc돉QϞ=*`ddd]v&ӧwﮖ-[YfSm?;wNꫯ8I=!C())GgϞ< PXQ:t4h``04w\-X 8Prttc=VMWff<6Ԉlll4|p=jѢx uy }Խ{wlRvvv]v?l?~\d|}}=[.Qݻw~"9R|ŭESL0x Ծ}r=u@kNzTJ[׮]ٳgui߿_ф72GGG}rppM{|?CCCcbg}g}f(++Km۶ȵ/ZHG"0A 1cg4iRy%%%puZJ6!m۶~h9"wߩy\&+WԩS'eff?V߾}զM988衇`0kDX#ܹz֭[޾={KSv`Mr7N|Rs͌29l3P)ǡ֚CE919{o}WHW﻽=ǣ^y2ܾ}[Gֆ # ۷oW ¥iРAڼyjќ9s8'NqƪQ^~e)R$˟wuڵːs͍  777լYS*Tv Ν;3f֭[GټiѢAD||\]] Y;S 00S=ҕ+Wt97ooooyxxYUT-ݽ{WǏW`` ada۶mjٲ%Aʕ+kܴm6ٱ  00&Iɺpႎ;u)&&`˛oI/"ʕ+ # 4~k׮:tj_df%&&ھ}BCC iȐ!zUfMUXMEFl٢֭[EFFM6… P %?rbcc)B1=zPvTN9::dɒO>0i&I˗UvmC~ 999  0eoօ t)m۶M{%3뫦MVZzWdccC(' hʔ)Î@VZaÆCj֬Y*Rg/ٳڿVZE(f]vر֭UΎPO-##CK, # 7nT۶m TuU2\+~Iqqq:|L0QS TF /_g+Vhȑ 6]v,EFFrZ@nD d2͛pN<+**`̀Zj%gggUTIŊ#@YFC !,}leddŋ WmԲeK6A޽{JLLԙ3gk.hٲu&UVMeʔ!@3Lڸq @YX~:t@x".]R:u Wo߮RJ 0rΝ;pppЀ榚5kB  s۶m'AdaݺuСTV\)___սj*у Ph0$ɤׯ+..NG՚5kO0f_~kXJ ٳXv:uD O-%%E;w6":rʕ+&g4Ɲ;wth۶mڻw/wwwSՓ^xBߌ/<^m۶5\ݳg|@ z.^Xiʕb5p@^*VXC@;x<<<" k֬QΝi~dddhZdjUJz駟Ç+ @c<==ڵkQŋ'وVf" ڵ+/K.N:{ܸq}~rrrRٲe;w(..NGQ/ ߜ:uJoRRR/,[Lo&V\)___}!C6 JQ"PܻwO:svڥB1~~~jҤj֬+/.33S?bccw/)S% _ũW^40gӇe=zhժU}…Z`5x YKOOו+W-XPJvTN9::dɒYo .(::Z!!! gՠA䩄KNѣGy&""Bڵ3\~7n4ɤׯ+>>^GUPP_L WWW[Vʕ+7nٳguA}WO|[6m%J: O\rE^^^&0j(MݺuK :uꔶmۦ{>|6m5kRJ#]|YNݻwʕٳ' uW^oC_8pf͚@nx^}UսuVjՊ hwŋ?SSNرԩ#'''*U*۟OMMU||;kf;;;?~\*T`Q4hPx[ns=G7+V Unݪŋ 0y.==]?9spvv4hjժ>۱&I׮]ә3gk9~xM4)IݼySÆ ӎ;/4o\' 䫻wK.vcuai&lҼy# {믿N0_Fe 71|WppbbbLddRrrΞ=^ .,4M̉'j„ } IJOO?06mʯƍ+))05j׮]*U ?wQBB5. IDATbbbuV2#kի|O JOO˗۷+88f&… 5qDŠ+ԳgOn,Yڴi~mC7ߨSN,~.:{߯UVXCI{uQ^bԩV\)[[[6/effjժU>|8ada0`/{cǎ2L...oUti6@.x53ڵk:s[Y'k֬Q.],|= adᣏ>҈#dmmM0kS׮] UsPPjk4 3Ο?GrX{BCCi&ٳСCg۷7$,;V&LPbfÇׯBCC S7`Y{שS}vڵPHNҥK+>>0/IJNN֊+4n8F7',,W6 c@QX1=P X۷Oݺuc 4]xQgϞUXXV\I(f$c TrrZnDC?Ņ ÇժU+B޽5o<)S0Pdddhȑz {.??ta(99`ij5̉0uP9wEe05;::*""B=н{3ghϞ=ڰak?7o$CŹstzX-[H(._ڵk˗O>,3Gٳg?h޼ybF;^SjeaNٳG=z0 :T|򉬭٨`W^U߾}y"> vvvڷo eozt!=,35WttM0fdjڴjԨQ c sѣG0a/^lھ}7oΦq{F wF,_rr֭nݺπOҔSNi݌543]tQUN999TRW^3ԛggg޽[/",ح[뫭[FBBBԦMEZvlz]\\o>,Y!`@իW* C͈zZjz饗raNܹS{6zN>]G5_;v # _}<==y-ź{Znml٢֭[9D ?ϟ׉'qFEDD󓻻jԨ!-Z"LOO{ァ˗j}{իW~Ӕ)S 7i̜9S g۴iuY 05jԈ`SyuQ[N111b&ԧOխ[WժUSٲe =h͚5zw U%K/Xt}嗚6madKgVҥ v^OOO-YDEa 01uꔪTB,##CK.رc # UlYwQppaj>x^}U)d2V\\9%%%R֭UvmU\Y%J l=zT͛77T/ի5l0Ȃ@0'NI&wĈ9s] 0@RJJtIm۶M{!3ѴiSu]u֕^|EBy &I3gԬY Uw``uBi&׏0`ggN5k$ Ä oOC{yoc 0X4%&&ԩSڹsBBBLlRݺuӫ*'''=>|Cjݺu;((H]ve3XhիWUzuԻ` 0B4`1233uU~ТEB0fA>>>rssSUB8k;66V*UbJHHP 7iL>]#G5a#FV;;;^` 0jw͛7+,,Pռys9;;RJ3K,{gyƆ fڵkTTTada6m#,jܸan[zw?`(T?ٳ ŋ LtA۷Wݺu2e{tb/֭[2dvAYx75o<.]0l_~ESɒ%YǠf2 .رcZnbbbL[ 4PjdooϙmnF!w{=FZl+W0Ǹ{4iDCԻyfyxxA f'%%E:}o߮PB1FR&MTfM988hѢRedd>f"j̙/# ڸq#7nOaÆ 0`!jmٲ6nȱ3A .==]W\Qll"## 9UJ ?jժe+##C# vvv 34,ܹ ,{_gA d2늋ѣGfhڴw﮺ujժ*[,XpuٳgղeKF6ZGEn޼W_}0A.^^z 4Μ9I&npqqQ޽ՠAUVMIlϪ_ᾘtss͛ϳ \rE={Tll,adW~lmm %+V Sk^X@ &--MyԜ]5jԐwmٲE^^^{„ 0ag@q pB޽_>˒hZ]]]ߪx,CxO 6F>UJ,YPLr劜 QUԣGw*;u!dNcǎզM0]˗bŊiر}ǎZjL& 'u_1uTyyy(*UԩS QXrl:t(AAղeKժUKUTQ 5qDCw͍MqnZ)))Cj/ ХKTNCʹ?Ceff>vi…:p~'{U_r66f/lFbbz-_ɓy_ʕ+k„ 5((F 0ʕ+k]\\Իwo5h@ժU/X<#2fM2ElWo߾",kNK,Qٲe 0 [!jV <PsBBBti8p@FR&M8 ЬY3/B۷ogܼySÇ 777͟?`F sΝ;YpMׯZjZjr*Q ~ 2#DEEVZlt]5J͇-[ё03/WWWCz%+W`1:<<<`+))I .9^4H^xa۷ 6mͯXv-/LUVM#F0D_o`ȱEO>5c ܹS.\ЦM4`5h@?< ݻy憬=""BsգG Ç={.]Jؿ̝ Qc7#,Μ9 u]5jPŊeccO)**J-Z0l֭dddh4iadc ̙L&7ݫ_ݰkM bƌO꺼ԪU+9;;J**Y$X{~:r䈜 ժU%l\R=zaӧըQ#_~7g`xfW\)/=<<ԹsgꫪZ^xjݺ Y֭[`2F6K 8PdffjZ|z 999r9 ϬRJZbEիW/򎽽 [dd̙y` a߾}4cׯ/)R `Zwiu 0 ɤ-[FRƍUF UTs}G6UVGlСCjݺ5AdO&MRb(222ok֭_˗UlYí1 0ɤkܸq/;;;A^*W9^szC6CN:lԩS>$I 8Pf)Pȅs_gPPvj\hيzM]tѫʕ+W^nZ?~\M65l5Rpp^|E6quQIIInݺ_=aռysZt5Ҏ;dkkk<7oիJJJR"ETT).]ZJR%TdI(QBvvv*R#fҥ3l#FЇ~HV!))I&,4o\' B_^>>>_}ԨQ#C- 0@ݿ_>>> 5l+VP^ 7nGaaa_^ a$99Y__0kK Lj ԬY@ؽ{իGsrr-/P_}ʊ0(Vju.[L?!֔ X[[kĈrqq1t}ŋΞ={C٘}Z52|7nT۶mݏ?>}ξjԨTB 8i?^,>F L:upBгgO:u  _%''wߥի믿UzeuZSn4yO>x8]Ɔ/n߾ѣG+<<0`gg5k֨rʄր,e˖)==bSŋה)S CLL}){>֭[ #UAKnnnruu###u UREk׮5|!!!;wEY`=x@3gԪU#۶mS @J(#GZ|;vڬRSSMle@^KOOĉxbg1g 4HVVVl wvΜ9裏#AAAڵ+Ax7oblKT\9'Fcƌ͛rMff/_N1.\.]'R\9͚5 777}7P۳gzAg}&;;;cz7g3))I?`QjU(=Zo& Od4W^5k/F:9bQ-[j֬Y!)44TSN @եKF# _֬YLzĉغ`ee%]vM111*R7n,kkk6GDD:t@hٲ/^,{{{klmmUxq۷bk<{zꥲeZD=<(PŋԩSL>S}u ?]vFiɒ%*_|EG0k*T… BCC۷oP%$$o߾ڳga<… ջwoYYYеkW/<<\ i^@qݻRСC)fϞ-///_Jݺul50Є 4vX_ 8k[N:RJk 0@U|y-[ BddH@>KNNͯPUVM]tϺgΜ)TL Pծ][ճgO={0|rYGAAAƏO @WH?#,,P]/#dҺu4h ڼy֭K@Ў;IOaܸq?~lmm @w-+]իWULBq<(ԻwoM60Brru;w4sL_Oi̘17n/^N:Uh"X[[W>>>kÆ $ [}a<???M0Aŋ' 7ްShr-_*T/m̙2dO] 33SwV޽ )=Z|/)==]ݺuSxxxf<(/ΝիF>M:Uw% RRR4k,_90bM8ecccN8Q(TTI+W$lwѵkx ߿>cxJÇɓUD `,;wd"b۷O]v%ljҥY&aԾ}Խ{w___M2E%K$ d2iРAZn֘˛5bjJ-"lDGGA:paYwΝK+h~0+++ yqF`~I&co^6lPff&ap%_ԩS #N !կ_ߢ۲eL&0h=qilE*R^{5ݹsGǎ#llݺU[+F 0Giǎjժ $Ə'rC*]cĨ*S^#O,^%4m4Ջ0cڴiѨQxիWϢ314Q\9-ZHj߾.],ޯ3gsJJJ";w}]+_ d+99lP xcƌј1ctu€E2LR=駟3Xx|||ThQuѢ;{^ 0899iV\nݺ)::0`QRSS-Z(**@+"ExTn]7k*o>CO(&&F͚5Ӻu딞N (N>-OOOM007|={ʊ0Oʕ+'___o…Y^ 0a+88 ¿/M:U7n JiiiZj5j0yF7oVNh~@6ڶmkfym4֮];-[ աC}2LB#!!A F`Ν x Kx1.'NcJkVٲeqㆂdee:uDu=]V;wVll,ݝ (QBiii:xEw-΅ 0)RD>>>T~}%%%Yd}TR_Oy͝;WބK"##եKKaaaz!܅ 4a5i҄WPHH/G%J賭O>mA > #sz뭷F]vM_|ի'cZ|^y|ִiSm߾}fq@ ߿O>Ds%<СC >\ 6 X[ni۶m}7n{=,Y0^z; /P`=qil5UhQEDDH.;_~Y*T5X${ڼy3ٳgkĈ*^8a@)ZnuAz @jر1caP8p<J!f2tY͜9S5kÕB0$00PJ0 6:TDrG|r30򘛛M꥗^"B"==]ǏתUj*);v?O3,GGGQGUb hK233fON۫f͚G4S… F M-RZ̈da/**@?2zQ-RD^^^Zr%a?P 6TTB17nкuԬY3уWц h~R-'Nl<@2LڵkzMQcƌQ-+ʊPуt9}w4i/B-a:w4h`uA֭+ghGձcG(  RHyJbmۦ-Z3խ[WIIIY_\\*VX 6 0ɓ'D(@WNTn]/_3JOOWBB:EGGh޼͛''''Bbٚ6mEֶi&o ]|YÆ Sxx8aooouIW h= %$$ PTT___?^/a@!vYdmFҌ3 ߦk?6Ə16QD&,H hE'B \;Fp*GC4Óp@9A $@ cCX|ǣG+g9;ggly9<R!bʕH#ӧO'Ɛ!CSO,Asssݻ7jkkcŊJ4vmWҥ0ڙ(..N| ѭ[yW?a|HC%%%1u8Oڵk_={O?[ln#/~8fhZ[[k_ZM|=X 80* ZZZbҥ1o9.Bя~͜93;(**իW3/xȑ׿/O<=P@S]vY̝;7gyfbg۶m[`N@ټys͍1xׯ_'zz]%㥗^Nj/>lիɃwygL2%:w, 8tPF}}}f+,,;v 0hC?x|_'xB TZZG㤓N͍=zDvvvdggGn";;;vݺunݺEFFFk---o%>z}Xvnq-Ĉ#@-ŋ'r<5`ƞ}٘7ofϞwH7ĉ;ȑ#Sf;c޼yޢ:Z@qK 0H`Xt00aBĉ#++K קO?~|"g۵kWT@ʊiӦƍX Ё?KƀAdddĄ 9۶mR ȑ#cݺu1i$a@S\\=P\z饑#欳J\WÇtM;b€"6l"##C Ѐ"777)]OiGQYY?υ lٲO>rrrK/MlNʊ)S())$̘1cb˖-1uҥ@ѣG'r.#F5kɓ qWFuuu  <8s)UXXK,nIЎƺu~ 7ٳg|M\)]OHvvv|[ߊ~ةh,XׯO|8o`ӧO;vĴiӢ[n5jT"1bDT@Beeeg?xGbΜ9㬤$~_O~(..]AAA\~|͌z @=z46ms΍:t뭷Ɣ)SgϞgϞC@j=QVV.{O޽@Fx ZQXX+W{'FM 4(.voMʯ'Ckmm۷ 7k׮ŋ_r[G}4ƌӮ\WWzj#Ёeddİabq}EqqP***6fϞ m 6,̙nbŊ6+"ޠ1VZsѣ*=ԩ@H;MMM1gΜzq嗷k;w%K. ,ϟǣ{ nj3&-7a„뮻Gm;_cűqF8Ç'?Iʮ]Ϗ}վ~^`>`̝;7B7tШ3<w$k؏ xG룺:ATZZUUUQ^^a㡡!.\˗/o},\0f͚VWXQ޽{Z %%%qWƧ?~{\uU)_;777,YSNi xOVkFXpa;V@;v,yXhQLɚ7tSL<92AZ())7n\ W_Ǽy>{/X f̘EEEi 8.v{o,^X &78s#''G tXwq]wŎ;͍ٳg\@W;wAJ\ve1yP4oǨQbѩS'ǝ H{GݻwGMMM,[, =zt|K_ÇǠAk׮B>P 0]iiiz*jkkc͚5NK.$ƌQXXBRF[ /ēO>555,bڴi|$JJJ"//O(@QꫯƮ]b89sf|3G#++K(@ZPa~_"$/YgQTT'p`:8p@۷/y晨ꨯۘ1cF5*JJJ(  ak޽{駟/r;vl=: vZ7rrr9o߾{^zE### t 0ȑ#qhnn~+MMMq{!o;oy׮]#777zݻw޽{dggGvvvtU 0%S$ DQ( 0E@(H Q`$ DQ( 0E@(H Q`$ DQ( 0ejIENDB`marginaleffects/man/hypotheses.Rd0000644000176200001440000003311014631452336016646 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hypotheses.R \name{hypotheses} \alias{hypotheses} \title{(Non-)Linear Tests for Null Hypotheses, Joint Hypotheses, Equivalence, Non Superiority, and Non Inferiority} \usage{ hypotheses( model, hypothesis = NULL, vcov = NULL, conf_level = 0.95, df = NULL, equivalence = NULL, joint = FALSE, joint_test = "f", numderiv = "fdforward", ... ) } \arguments{ \item{model}{Model object or object generated by the \code{comparisons()}, \code{slopes()}, or \code{predictions()} functions.} \item{hypothesis}{specify a hypothesis test or custom contrast using a numeric value, vector, or matrix; a string equation; string; a formula, or a function. \itemize{ \item Numeric: \itemize{ \item Single value: the null hypothesis used in the computation of Z and p (before applying \code{transform}). \item Vector: Weights to compute a linear combination of (custom contrast between) estimates. Length equal to the number of rows generated by the same function call, but without the \code{hypothesis} argument. \item Matrix: Each column is a vector of weights, as describe above, used to compute a distinct linear combination of (contrast between) estimates. The column names of the matrix are used as labels in the output. } \item String equation to specify linear or non-linear hypothesis tests. If the \code{term} column uniquely identifies rows, terms can be used in the formula. Otherwise, use \code{b1}, \code{b2}, etc. to identify the position of each parameter. The \verb{b*} wildcard can be used to test hypotheses on all estimates. If a named vector is used, the names are used as labels in the output. Examples: \itemize{ \item \code{hp = drat} \item \code{hp + drat = 12} \item \code{b1 + b2 + b3 = 0} \item \verb{b* / b1 = 1} } \item String: \itemize{ \item "pairwise": pairwise differences between estimates in each row. \item "reference": differences between the estimates in each row and the estimate in the first row. \item "sequential": difference between an estimate and the estimate in the next row. \item "meandev": difference between an estimate and the mean of all estimates. \item "meanotherdev": difference between an estimate and the mean of all other estimates, excluding the current one. \item "revpairwise", "revreference", "revsequential": inverse of the corresponding hypotheses, as described above. } \item Formula: \itemize{ \item \code{comparison ~ pairs | group} \item Left-hand side determines the type of comparison to conduct: \code{difference} or \code{ratio}. If the left-hand side is empty, \code{difference} is chosen. \item Right-hand side determines the pairs of estimates to compare: \code{reference}, \code{sequential}, or \code{meandev} \item Optional: Users can supply grouping variables after a vertical bar to conduct comparisons withing subsets. \item Examples: \itemize{ \item \code{~ reference} \item \code{ratio ~ pairwise} \item \code{difference ~ pairwise | groupid} } } \item Function: \itemize{ \item Accepts an argument \code{x}: object produced by a \code{marginaleffects} function or a data frame with column \code{rowid} and \code{estimate} \item Returns a data frame with columns \code{term} and \code{estimate} (mandatory) and \code{rowid} (optional). \item The function can also accept optional input arguments: \code{newdata}, \code{by}, \code{draws}. \item This function approach will not work for Bayesian models or with bootstrapping. In those cases, it is easy to use \code{posterior_draws()} to extract and manipulate the draws directly. } \item See the Examples section below and the vignette: https://marginaleffects.com/vignettes/hypothesis.html }} \item{vcov}{Type of uncertainty estimates to report (e.g., for robust standard errors). Acceptable values: \itemize{ \item FALSE: Do not compute standard errors. This can speed up computation considerably. \item TRUE: Unit-level standard errors using the default \code{vcov(model)} variance-covariance matrix. \item String which indicates the kind of uncertainty estimates to return. \itemize{ \item Heteroskedasticity-consistent: \code{"HC"}, \code{"HC0"}, \code{"HC1"}, \code{"HC2"}, \code{"HC3"}, \code{"HC4"}, \code{"HC4m"}, \code{"HC5"}. See \code{?sandwich::vcovHC} \item Heteroskedasticity and autocorrelation consistent: \code{"HAC"} \item Mixed-Models degrees of freedom: "satterthwaite", "kenward-roger" \item Other: \code{"NeweyWest"}, \code{"KernHAC"}, \code{"OPG"}. See the \code{sandwich} package documentation. } \item One-sided formula which indicates the name of cluster variables (e.g., \code{~unit_id}). This formula is passed to the \code{cluster} argument of the \code{sandwich::vcovCL} function. \item Square covariance matrix \item Function which returns a covariance matrix (e.g., \code{stats::vcov(model)}) }} \item{conf_level}{numeric value between 0 and 1. Confidence level to use to build a confidence interval.} \item{df}{Degrees of freedom used to compute p values and confidence intervals. A single numeric value between 1 and \code{Inf}. When using \code{joint_test="f"}, the \code{df} argument should be a numeric vector of length 2.} \item{equivalence}{Numeric vector of length 2: bounds used for the two-one-sided test (TOST) of equivalence, and for the non-inferiority and non-superiority tests. See Details section below.} \item{joint}{Joint test of statistical significance. The null hypothesis value can be set using the \code{hypothesis} argument. \itemize{ \item FALSE: Hypotheses are not tested jointly. \item TRUE: All parameters are tested jointly. \item String: A regular expression to match parameters to be tested jointly. \code{grep(joint, perl = TRUE)} \item Character vector of parameter names to be tested. Characters refer to the names of the vector returned by \code{coef(object)}. \item Integer vector of indices. Which parameters positions to test jointly. }} \item{joint_test}{A character string specifying the type of test, either "f" or "chisq". The null hypothesis is set by the \code{hypothesis} argument, with default null equal to 0 for all parameters.} \item{numderiv}{string or list of strings indicating the method to use to for the numeric differentiation used in to compute delta method standard errors. \itemize{ \item "fdforward": finite difference method with forward differences \item "fdcenter": finite difference method with central differences (default) \item "richardson": Richardson extrapolation method \item Extra arguments can be specified by passing a list to the \code{numDeriv} argument, with the name of the method first and named arguments following, ex: \code{numderiv=list("fdcenter", eps = 1e-5)}. When an unknown argument is used, \code{marginaleffects} prints the list of valid arguments for each method. }} \item{...}{Additional arguments are passed to the \code{predict()} method supplied by the modeling package.These arguments are particularly useful for mixed-effects or bayesian models (see the online vignettes on the \code{marginaleffects} website). Available arguments can vary from model to model, depending on the range of supported arguments by each modeling package. See the "Model-Specific Arguments" section of the \code{?slopes} documentation for a non-exhaustive list of available arguments.} } \description{ Uncertainty estimates are calculated as first-order approximate standard errors for linear or non-linear functions of a vector of random variables with known or estimated covariance matrix. In that sense, \code{\link{hypotheses}} emulates the behavior of the excellent and well-established \link[car:deltaMethod]{car::deltaMethod} and \link[car:linearHypothesis]{car::linearHypothesis} functions, but it supports more models; requires fewer dependencies; expands the range of tests to equivalence and superiority/inferiority; and offers convenience features like robust standard errors. To learn more, read the hypothesis tests vignette, visit the package website, or scroll down this page for a full list of vignettes: \itemize{ \item \url{https://marginaleffects.com/vignettes/hypothesis.html} \item \url{https://marginaleffects.com/} } Warning #1: Tests are conducted directly on the scale defined by the \code{type} argument. For some models, it can make sense to conduct hypothesis or equivalence tests on the \code{"link"} scale instead of the \code{"response"} scale which is often the default. Warning #2: For hypothesis tests on objects produced by the \code{marginaleffects} package, it is safer to use the \code{hypothesis} argument of the original function. Using \code{hypotheses()} may not work in certain environments, in lists, or when working programmatically with *apply style functions. Warning #3: The tests assume that the \code{hypothesis} expression is (approximately) normally distributed, which for non-linear functions of the parameters may not be realistic. More reliable confidence intervals can be obtained using the \code{inferences()} function with \code{method = "boot"}. } \section{Joint hypothesis tests}{ The test statistic for the joint Wald test is calculated as (R * theta_hat - r)' * inv(R * V_hat * R') * (R * theta_hat - r) / Q, where theta_hat is the vector of estimated parameters, V_hat is the estimated covariance matrix, R is a Q x P matrix for testing Q hypotheses on P parameters, r is a Q x 1 vector for the null hypothesis, and Q is the number of rows in R. If the test is a Chi-squared test, the test statistic is not normalized. The p-value is then calculated based on either the F-distribution (for F-test) or the Chi-squared distribution (for Chi-squared test). For the F-test, the degrees of freedom are Q and (n - P), where n is the sample size and P is the number of parameters. For the Chi-squared test, the degrees of freedom are Q. } \section{Equivalence, Inferiority, Superiority}{ \eqn{\theta} is an estimate, \eqn{\sigma_\theta} its estimated standard error, and \eqn{[a, b]} are the bounds of the interval supplied to the \code{equivalence} argument. Non-inferiority: \itemize{ \item \eqn{H_0}{H0}: \eqn{\theta \leq a}{\theta <= a} \item \eqn{H_1}{H1}: \eqn{\theta > a} \item \eqn{t=(\theta - a)/\sigma_\theta}{t=(\theta - a)/\sigma_\theta} \item p: Upper-tail probability } Non-superiority: \itemize{ \item \eqn{H_0}{H0}: \eqn{\theta \geq b}{\theta >= b} \item \eqn{H_1}{H1}: \eqn{\theta < b} \item \eqn{t=(\theta - b)/\sigma_\theta}{t=(\theta - b)/\sigma_\theta} \item p: Lower-tail probability } Equivalence: Two One-Sided Tests (TOST) \itemize{ \item p: Maximum of the non-inferiority and non-superiority p values. } Thanks to Russell V. Lenth for the excellent \code{emmeans} package and documentation which inspired this feature. } \examples{ library(marginaleffects) mod <- lm(mpg ~ hp + wt + factor(cyl), data = mtcars) hypotheses(mod) # Test of equality between coefficients hypotheses(mod, hypothesis = "hp = wt") # Non-linear function hypotheses(mod, hypothesis = "exp(hp + wt) = 0.1") # Robust standard errors hypotheses(mod, hypothesis = "hp = wt", vcov = "HC3") # b1, b2, ... shortcuts can be used to identify the position of the # parameters of interest in the output of hypotheses(mod, hypothesis = "b2 = b3") # wildcard hypotheses(mod, hypothesis = "b* / b2 = 1") # term names with special characters have to be enclosed in backticks hypotheses(mod, hypothesis = "`factor(cyl)6` = `factor(cyl)8`") mod2 <- lm(mpg ~ hp * drat, data = mtcars) hypotheses(mod2, hypothesis = "`hp:drat` = drat") # predictions(), comparisons(), and slopes() mod <- glm(am ~ hp + mpg, data = mtcars, family = binomial) cmp <- comparisons(mod, newdata = "mean") hypotheses(cmp, hypothesis = "b1 = b2") mfx <- slopes(mod, newdata = "mean") hypotheses(cmp, hypothesis = "b2 = 0.2") pre <- predictions(mod, newdata = datagrid(hp = 110, mpg = c(30, 35))) hypotheses(pre, hypothesis = "b1 = b2") # The `hypothesis` argument can be used to compute standard errors for fitted values mod <- glm(am ~ hp + mpg, data = mtcars, family = binomial) f <- function(x) predict(x, type = "link", newdata = mtcars) p <- hypotheses(mod, hypothesis = f) head(p) f <- function(x) predict(x, type = "response", newdata = mtcars) p <- hypotheses(mod, hypothesis = f) head(p) # Complex aggregation # Step 1: Collapse predicted probabilities by outcome level, for each individual # Step 2: Take the mean of the collapsed probabilities by group and `cyl` library(dplyr) library(MASS) library(dplyr) dat <- transform(mtcars, gear = factor(gear)) mod <- polr(gear ~ factor(cyl) + hp, dat) aggregation_fun <- function(x) { predictions(x, vcov = FALSE) |> mutate(group = ifelse(group \%in\% c("3", "4"), "3 & 4", "5")) |> summarize(estimate = sum(estimate), .by = c("rowid", "cyl", "group")) |> summarize(estimate = mean(estimate), .by = c("cyl", "group")) |> rename(term = cyl) } hypotheses(mod, hypothesis = aggregation_fun) # Equivalence, non-inferiority, and non-superiority tests mod <- lm(mpg ~ hp + factor(gear), data = mtcars) p <- predictions(mod, newdata = "median") hypotheses(p, equivalence = c(17, 18)) mfx <- avg_slopes(mod, variables = "hp") hypotheses(mfx, equivalence = c(-.1, .1)) cmp <- avg_comparisons(mod, variables = "gear", hypothesis = "pairwise") hypotheses(cmp, equivalence = c(0, 10)) # joint hypotheses: character vector model <- lm(mpg ~ as.factor(cyl) * hp, data = mtcars) hypotheses(model, joint = c("as.factor(cyl)6:hp", "as.factor(cyl)8:hp")) # joint hypotheses: regular expression hypotheses(model, joint = "cyl") # joint hypotheses: integer indices hypotheses(model, joint = 2:3) # joint hypotheses: different null hypotheses hypotheses(model, joint = 2:3, hypothesis = 1) hypotheses(model, joint = 2:3, hypothesis = 1:2) # joint hypotheses: marginaleffects object cmp <- avg_comparisons(model) hypotheses(cmp, joint = "cyl") } marginaleffects/man/marginal_means.Rd0000644000176200001440000000100614631452336017427 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/deprecated.R \name{marginal_means} \alias{marginal_means} \title{Deprecated function} \usage{ marginal_means( model, variables = NULL, newdata = NULL, vcov = TRUE, conf_level = 0.95, type = NULL, transform = NULL, cross = FALSE, hypothesis = NULL, equivalence = NULL, p_adjust = NULL, df = Inf, wts = "equal", by = NULL, numderiv = "fdforward", ... ) } \description{ Deprecated function } \keyword{internal} marginaleffects/man/datagridcf.Rd0000644000176200001440000000035514631452336016550 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/deprecated.R \name{datagridcf} \alias{datagridcf} \title{Deprecated function} \usage{ datagridcf(...) } \description{ Deprecated function } \keyword{internal} marginaleffects/man/sanitize_model_specific.Rd0000644000176200001440000001631014632674174021340 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/methods_aod.R, R/methods_betareg.R, % R/sanity_model.R, R/methods_brms.R, R/methods_dbarts.R, R/methods_glmmTMB.R, % R/methods_lme4.R, R/methods_mclogit.R, R/methods_mlogit.R, % R/methods_ordinal.R, R/methods_plm.R, R/methods_quantreg.R, % R/methods_survey.R \name{sanitize_model_specific.glimML} \alias{sanitize_model_specific.glimML} \alias{sanitize_model_specific.betareg} \alias{sanitize_model_specific} \alias{sanitize_model_specific.default} \alias{sanitize_model_specific.brmsfit} \alias{sanitize_model_specific.bart} \alias{sanitize_model_specific.glmmTMB} \alias{sanitize_model_specific.merMod} \alias{sanitize_model_specific.mblogit} \alias{sanitize_model_specific.mlogit} \alias{sanitize_model_specific.clm} \alias{sanitize_model_specific.plm} \alias{sanitize_model_specific.rqs} \alias{sanitize_model_specific.svyolr} \alias{sanitize_model_specific.svyglm} \title{Method to raise model-specific warnings and errors} \usage{ \method{sanitize_model_specific}{glimML}(model, ...) \method{sanitize_model_specific}{betareg}(model, ...) sanitize_model_specific(model, ...) \method{sanitize_model_specific}{default}( model, vcov = NULL, calling_function = "marginaleffects", ... ) \method{sanitize_model_specific}{brmsfit}(model, ...) \method{sanitize_model_specific}{bart}(model, ...) \method{sanitize_model_specific}{glmmTMB}(model, vcov = TRUE, re.form = NULL, ...) \method{sanitize_model_specific}{merMod}(model, re.form = NULL, ...) \method{sanitize_model_specific}{mblogit}(model, calling_function = "marginaleffects", ...) \method{sanitize_model_specific}{mlogit}(model, newdata, ...) \method{sanitize_model_specific}{clm}(model, ...) \method{sanitize_model_specific}{plm}(model, ...) \method{sanitize_model_specific}{plm}(model, ...) \method{sanitize_model_specific}{rqs}(model, ...) \method{sanitize_model_specific}{svyolr}(model, wts = FALSE, by = FALSE, ...) \method{sanitize_model_specific}{svyglm}(model, wts = FALSE, by = FALSE, ...) } \arguments{ \item{model}{Model object} \item{...}{Additional arguments are passed to the \code{predict()} method supplied by the modeling package.These arguments are particularly useful for mixed-effects or bayesian models (see the online vignettes on the \code{marginaleffects} website). Available arguments can vary from model to model, depending on the range of supported arguments by each modeling package. See the "Model-Specific Arguments" section of the \code{?slopes} documentation for a non-exhaustive list of available arguments.} \item{vcov}{Type of uncertainty estimates to report (e.g., for robust standard errors). Acceptable values: \itemize{ \item FALSE: Do not compute standard errors. This can speed up computation considerably. \item TRUE: Unit-level standard errors using the default \code{vcov(model)} variance-covariance matrix. \item String which indicates the kind of uncertainty estimates to return. \itemize{ \item Heteroskedasticity-consistent: \code{"HC"}, \code{"HC0"}, \code{"HC1"}, \code{"HC2"}, \code{"HC3"}, \code{"HC4"}, \code{"HC4m"}, \code{"HC5"}. See \code{?sandwich::vcovHC} \item Heteroskedasticity and autocorrelation consistent: \code{"HAC"} \item Mixed-Models degrees of freedom: "satterthwaite", "kenward-roger" \item Other: \code{"NeweyWest"}, \code{"KernHAC"}, \code{"OPG"}. See the \code{sandwich} package documentation. } \item One-sided formula which indicates the name of cluster variables (e.g., \code{~unit_id}). This formula is passed to the \code{cluster} argument of the \code{sandwich::vcovCL} function. \item Square covariance matrix \item Function which returns a covariance matrix (e.g., \code{stats::vcov(model)}) }} \item{newdata}{Grid of predictor values at which we evaluate the slopes. \itemize{ \item Warning: Please avoid modifying your dataset between fitting the model and calling a \code{marginaleffects} function. This can sometimes lead to unexpected results. \item \code{NULL} (default): Unit-level slopes for each observed value in the dataset (empirical distribution). The dataset is retrieved using \code{\link[insight:get_data]{insight::get_data()}}, which tries to extract data from the environment. This may produce unexpected results if the original data frame has been altered since fitting the model. \item \code{\link[=datagrid]{datagrid()}} call to specify a custom grid of regressors. For example: \itemize{ \item \code{newdata = datagrid(cyl = c(4, 6))}: \code{cyl} variable equal to 4 and 6 and other regressors fixed at their means or modes. \item See the Examples section and the \code{\link[=datagrid]{datagrid()}} documentation. } \item \code{\link[=subset]{subset()}} call with a single argument to select a subset of the dataset used to fit the model, ex: \code{newdata = subset(treatment == 1)} \item \code{\link[dplyr:filter]{dplyr::filter()}} call with a single argument to select a subset of the dataset used to fit the model, ex: \code{newdata = filter(treatment == 1)} \item string: \itemize{ \item "mean": Slopes evaluated when each predictor is held at its mean or mode. \item "median": Slopes evaluated when each predictor is held at its median or mode. \item "balanced": Slopes evaluated on a balanced grid with every combination of categories and numeric variables held at their means. \item "tukey": Slopes evaluated at Tukey's 5 numbers. \item "grid": Slopes evaluated on a grid of representative numbers (Tukey's 5 numbers and unique values of categorical predictors). } }} \item{wts}{logical, string or numeric: weights to use when computing average predictions, contrasts or slopes. These weights only affect the averaging in \verb{avg_*()} or with the \code{by} argument, and not unit-level estimates. See \code{?weighted.mean} \itemize{ \item string: column name of the weights variable in \code{newdata}. When supplying a column name to \code{wts}, it is recommended to supply the original data (including the weights variable) explicitly to \code{newdata}. \item numeric: vector of length equal to the number of rows in the original data or in \code{newdata} (if supplied). \item FALSE: Equal weights. \item TRUE: Extract weights from the fitted object with \code{insight::find_weights()} and use them when taking weighted averages of estimates. Warning: \code{newdata=datagrid()} returns a single average weight, which is equivalent to using \code{wts=FALSE} }} \item{by}{Aggregate unit-level estimates (aka, marginalize, average over). Valid inputs: \itemize{ \item \code{FALSE}: return the original unit-level estimates. \item \code{TRUE}: aggregate estimates for each term. \item Character vector of column names in \code{newdata} or in the data frame produced by calling the function without the \code{by} argument. \item Data frame with a \code{by} column of group labels, and merging columns shared by \code{newdata} or the data frame produced by calling the same function without the \code{by} argument. \item See examples below. \item For more complex aggregations, you can use the \code{FUN} argument of the \code{hypotheses()} function. See that function's documentation and the Hypothesis Test vignettes on the \code{marginaleffects} website. }} } \value{ A warning, an error, or nothing } \description{ Method to raise model-specific warnings and errors } \keyword{internal} marginaleffects/man/print.marginaleffects.Rd0000644000176200001440000000507014631452336020744 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/print.R \name{print.marginaleffects} \alias{print.marginaleffects} \title{Print \code{marginaleffects} objects} \usage{ \method{print}{marginaleffects}( x, style = getOption("marginaleffects_print_style", default = "summary"), digits = getOption("marginaleffects_print_digits", default = 3), p_eps = getOption("marginaleffects_print_p_eps", default = 0.001), topn = getOption("marginaleffects_print_topn", default = 5), nrows = getOption("marginaleffects_print_nrows", default = 30), ncols = getOption("marginaleffects_print_ncols", default = 30), type = getOption("marginaleffects_print_type", default = TRUE), column_names = getOption("marginaleffects_print_column_names", default = TRUE), ... ) } \arguments{ \item{x}{An object produced by one of the \code{marginaleffects} package functions.} \item{style}{"summary", "data.frame", or "tinytable"} \item{digits}{The number of digits to display.} \item{p_eps}{p values smaller than this number are printed in "<0.001" style.} \item{topn}{The number of rows to be printed from the beginning and end of tables with more than \code{nrows} rows.} \item{nrows}{The number of rows which will be printed before truncation.} \item{ncols}{The maximum number of column names to display at the bottom of the printed output.} \item{type}{boolean: should the type be printed?} \item{column_names}{boolean: should the column names be printed?} \item{...}{Other arguments are currently ignored.} } \description{ This function controls the text which is printed to the console when one of the core \code{marginalefffects} functions is called and the object is returned: \code{predictions()}, \code{comparisons()}, \code{slopes()}, \code{hypotheses()}, \code{avg_predictions()}, \code{avg_comparisons()}, \code{avg_slopes()}. All of those functions return standard data frames. Columns can be extracted by name, \code{predictions(model)$estimate}, and all the usual data manipulation functions work out-of-the-box: \code{colnames()}, \code{head()}, \code{subset()}, \code{dplyr::filter()}, \code{dplyr::arrange()}, etc. Some of the data columns are not printed by default. You can disable pretty printing and print the full results as a standard data frame using the \code{style} argument or by applying \code{as.data.frame()} on the object. See examples below. } \examples{ library(marginaleffects) mod <- lm(mpg ~ hp + am + factor(gear), data = mtcars) p <- predictions(mod, by = c("am", "gear")) p subset(p, am == 1) print(p, style = "data.frame") data.frame(p) } marginaleffects/man/knit_print.marginaleffects.Rd0000644000176200001440000000065414631452336021774 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/print.R \name{knit_print.marginaleffects} \alias{knit_print.marginaleffects} \title{Print a marginaleffects object in knitr} \usage{ \method{knit_print}{marginaleffects}(x, ...) } \value{ A string with class \code{knit_asis} to be printed in Rmarkdown or Quarto documents. } \description{ Print a marginaleffects object in knitr } \keyword{internal} marginaleffects/DESCRIPTION0000644000176200001440000001322114632777612015130 0ustar liggesusersPackage: marginaleffects Title: Predictions, Comparisons, Slopes, Marginal Means, and Hypothesis Tests Version: 0.21.0 Authors@R: c(person(given = "Vincent", family = "Arel-Bundock", role = c("aut", "cre", "cph"), email = "vincent.arel-bundock@umontreal.ca", comment = c(ORCID = "0000-0003-2042-7063")), person(given = "Noah", family = "Greifer", role = "ctb", email = "noah.greifer@gmail.com", comment = c(ORCID = "0000-0003-3067-7154")), person("Etienne", "Bacher", email = "etienne.bacher@protonmail.com", role = "ctb", comment = c(ORCID = "0000-0002-9271-5075"))) Description: Compute and plot predictions, slopes, marginal means, and comparisons (contrasts, risk ratios, odds, etc.) for over 100 classes of statistical and machine learning models in R. Conduct linear and non-linear hypothesis tests, or equivalence tests. Calculate uncertainty estimates using the delta method, bootstrapping, or simulation-based inference. License: GPL (>= 3) Copyright: inst/COPYRIGHTS Encoding: UTF-8 URL: https://marginaleffects.com/ BugReports: https://github.com/vincentarelbundock/marginaleffects/issues RoxygenNote: 7.3.1 Depends: R (>= 3.6.0) Imports: checkmate, data.table, generics, insight (>= 0.19.7), methods, rlang, utils, Rcpp (>= 1.0.0) Enhances: knitr LinkingTo: Rcpp, RcppEigen Suggests: AER, Amelia, afex, aod, bench, betareg, BH, bife, biglm, blme, boot, brglm2, brms, brmsmargins, broom, car, carData, causaldata, clarify, cjoint, cobalt, collapse, conflicted, countrycode, covr, crch, DALEXtra, DCchoice, dbarts, distributional, dfidx, dplyr, emmeans, equivalence, estimatr, fixest, flexsurv, fmeffects, fontquiver, Formula, future, future.apply, fwb, gam, gamlss, gamlss.dist, geepack, ggdist, ggokabeito, ggplot2, ggrepel, glmmTMB, glmx, haven, here, itsadug, ivreg, kableExtra, lme4, lmerTest, logistf, magrittr, MatchIt, MASS, mclogit, MCMCglmm, missRanger, mgcv, mice, miceadds, mlogit, mlr3verse, modelbased, modelsummary, nlme, nnet, numDeriv, nycflights13, optmatch, ordinal, parameters, parsnip, partykit, patchwork, pkgdown, phylolm, plm, polspline, poorman, posterior, pscl, purrr, quantreg, Rchoice, REndo, rcmdcheck, remotes, reticulate, rmarkdown, rms, robust, robustbase, robustlmm, rsample, rstanarm, rstantools, rsvg, sampleSelection, sandwich, scam, spelling, speedglm, survey, survival, svglite, systemfonts, tibble, tictoc, tidymodels, tidyr, tidyverse, tinysnapshot, tinytable (>= 0.2.0), tinytest, titanic, truncreg, tsModel, withr, workflows, yaml, xgboost, testthat (>= 3.0.0), altdoc Collate: 'RcppExports.R' 'backtransform.R' 'bootstrap_boot.R' 'bootstrap_fwb.R' 'bootstrap_rsample.R' 'bootstrap_simulation.R' 'broom.R' 'by.R' 'ci.R' 'comparisons.R' 'complete_levels.R' 'conformal.R' 'datagrid.R' 'deprecated.R' 'equivalence.R' 'get_coef.R' 'get_contrast_data.R' 'get_contrast_data_character.R' 'get_contrast_data_factor.R' 'get_contrast_data_logical.R' 'get_contrast_data_numeric.R' 'get_contrasts.R' 'get_group_names.R' 'get_hypothesis.R' 'get_jacobian.R' 'get_model_matrix.R' 'get_model_matrix_attribute.R' 'get_modeldata.R' 'get_predict.R' 'get_se_delta.R' 'get_term_labels.R' 'get_vcov.R' 'github_issue.R' 'hush.R' 'hypotheses.R' 'hypotheses_joint.R' 'hypothesis_helper.R' 'imputation.R' 'inferences.R' 'mean_or_mode.R' 'methods.R' 'set_coef.R' 'methods_AER.R' 'methods_MASS.R' 'methods_MCMCglmm.R' 'methods_Rchoice.R' 'methods_afex.R' 'methods_aod.R' 'methods_betareg.R' 'methods_bife.R' 'methods_biglm.R' 'methods_nnet.R' 'methods_brglm2.R' 'sanity_model.R' 'methods_brms.R' 'methods_crch.R' 'methods_dataframe.R' 'methods_dbarts.R' 'methods_fixest.R' 'methods_flexsurv.R' 'methods_gamlss.R' 'methods_glmmTMB.R' 'methods_glmx.R' 'methods_lme4.R' 'methods_mclogit.R' 'methods_mgcv.R' 'methods_mhurdle.R' 'methods_mlm.R' 'methods_mlogit.R' 'methods_mlr3.R' 'methods_nlme.R' 'methods_ordinal.R' 'methods_plm.R' 'methods_pscl.R' 'methods_quantreg.R' 'methods_rms.R' 'methods_robustlmm.R' 'methods_rstanarm.R' 'methods_sampleSelection.R' 'methods_scam.R' 'methods_stats.R' 'methods_survey.R' 'methods_survival.R' 'methods_tidymodels.R' 'methods_tobit1.R' 'modelarchive.R' 'myTryCatch.R' 'package.R' 'plot.R' 'plot_build.R' 'plot_comparisons.R' 'plot_predictions.R' 'plot_slopes.R' 'posterior_draws.R' 'predictions.R' 'print.R' 'recall.R' 'sanitize_comparison.R' 'sanitize_condition.R' 'sanitize_conf_level.R' 'sanitize_hypothesis.R' 'sanitize_hypothesis_formula.R' 'sanitize_interaction.R' 'sanitize_newdata.R' 'sanitize_numderiv.R' 'sanitize_type.R' 'sanitize_variables.R' 'sanitize_vcov.R' 'sanity.R' 'sanity_by.R' 'sanity_dots.R' 'settings.R' 'slopes.R' 'sort.R' 'tinytest.R' 'type_dictionary.R' 'unpack_matrix_cols.R' 'utils.R' Language: en-US Config/testthat/edition: 3 NeedsCompilation: yes Packaged: 2024-06-14 00:57:04 UTC; vincent Author: Vincent Arel-Bundock [aut, cre, cph] (), Noah Greifer [ctb] (), Etienne Bacher [ctb] () Maintainer: Vincent Arel-Bundock Repository: CRAN Date/Publication: 2024-06-14 08:30:02 UTC