From f19b07c9087166dd05c04e1b21eaea8c376d6d8a Mon Sep 17 00:00:00 2001 From: TitouanRobert Date: Thu, 7 Dec 2017 17:25:10 +0100 Subject: [PATCH] Revert "Develop" --- .travis.yml | 20 +- DESCRIPTION | 103 ++- NAMESPACE | 21 +- R/api_info.R | 161 ---- R/get_data_for_comp.R | 19 +- R/graph_utils.R | 323 -------- R/h5_utils.R | 112 --- R/h5_utils_plot.R | 128 ---- R/leafletDragPoints.R | 19 +- R/limitSizeGraph.R | 24 - R/map.R | 485 ++---------- R/map_helpers.R | 61 +- R/map_layout.R | 493 ++++-------- R/mod_XY.R | 110 --- R/mod_rpart.R | 18 - R/plot.R | 719 +++++------------- R/plot_XY.R | 49 -- R/plot_barplot.R | 12 +- R/plot_heatmap.R | 1 - R/plot_stats.R | 61 +- R/plot_thermal_group_capacities.R | 29 - R/plot_ts.R | 41 +- R/plot_utils.R | 134 ---- R/runApp.R | 16 - R/stack.R | 23 +- R/stack_exchanges.R | 277 +------ R/stack_map.R | 98 --- R/stack_prod.R | 377 ++------- R/zzz.R | 235 +++--- README.md | 7 +- antaresViz.Rproj | 2 - appveyor.yml | 6 - inst/AntaresViz.xlsx | Bin 11563 -> 0 bytes inst/GraphicalCharter.csv | 58 +- inst/application/global.R | 79 -- inst/application/server.R | 134 ---- inst/application/src/scripts/directoryInput.R | 169 ---- .../application/src/server/01_set_read_data.R | 228 ------ inst/application/src/server/02_load_data.R | 159 ---- .../src/server/03_data_selection.R | 106 --- inst/application/src/server/04_shared_input.R | 77 -- inst/application/src/server/05_modules.R | 174 ----- inst/application/src/server/06_module_map.R | 144 ---- inst/application/src/server/07_write_h5.R | 61 -- inst/application/src/tests/size_app.R | 41 - inst/application/src/ui/01_ui_import_data.R | 41 - inst/application/src/ui/02_ui_read_data.R | 92 --- inst/application/src/ui/03_ui_convert_h5.R | 67 -- inst/application/src/ui/04_ui_analysis.R | 31 - inst/application/src/ui/05_ui_prodstack.R | 17 - inst/application/src/ui/06_ui_exchange.R | 17 - inst/application/src/ui/07_ui_tsplot.R | 17 - inst/application/src/ui/08_ui_map.R | 62 -- inst/application/src/ui/09_ui_params.R | 20 - inst/application/src/ui/10_ui_help.R | 26 - inst/application/ui.R | 38 - inst/application/www/events.js | 13 - .../www/js/directory_input_binding.js | 57 -- inst/application/www/readAntares.html | 274 ------- inst/application/www/removeVirtualAreas.html | 178 ----- inst/application/www/spinner.gif | Bin 25080 -> 0 bytes inst/application/www/writeAntaresH5.html | 161 ---- inst/color.csv | 21 - inst/htmlwidgets/leafletDragPoints.js | 79 +- inst/mapLayout/ml.rda | Bin 303593 -> 0 bytes inst/moduleDev/moduleStackMap.R | 10 - inst/test_scripts/compare_test.R | 92 --- man/addShadows.Rd | 58 +- man/exchangesStack.Rd | 229 +++--- man/limitSizeGraph.Rd | 20 - man/mapLayout.Rd | 86 +-- man/modRpart.Rd | 23 - man/modXY.Rd | 27 - man/placeGeoPoints-shiny.Rd | 30 - man/plot.mapLayout.Rd | 236 +++--- man/plotMap.Rd | 327 ++++---- man/plotMapLayout.Rd | 31 - man/plotMapOptions.Rd | 204 ++--- man/plotThermalGroupCapacities.Rd | 26 - man/plotXY.Rd | 45 -- man/prodStack.Rd | 379 ++++----- man/runAppAntaresViz.Rd | 14 - man/stackMap.Rd | 27 - man/tsLegend.Rd | 130 ++-- man/tsPlot.Rd | 453 +++++------ tests/testthat/helper-init.R | 5 +- tests/testthat/test-exchangesStack.R | 18 - tests/testthat/test-getTSData.R | 56 -- tests/testthat/test-get_data_for_comp.R | 1 + tests/testthat/test-map.R | 34 - tests/testthat/test-prodStack.R | 27 - tests/testthat/test-stackExchanges.R | 31 - tests/testthat/test-ts_plot.R | 95 --- vignettes/antaresViz.Rmd | 195 ----- vignettes/antareslogo.png | Bin 19979 -> 0 bytes ...a_for_antaresViz_vignette_extralight.Rdata | Bin 216417 -> 0 bytes vignettes/maplyout_resized.gif | Bin 855530 -> 0 bytes vignettes/plot_resized.gif | Bin 649933 -> 0 bytes 98 files changed, 1651 insertions(+), 8083 deletions(-) delete mode 100644 R/api_info.R delete mode 100644 R/graph_utils.R delete mode 100644 R/h5_utils.R delete mode 100644 R/h5_utils_plot.R delete mode 100644 R/limitSizeGraph.R delete mode 100644 R/mod_XY.R delete mode 100644 R/mod_rpart.R delete mode 100644 R/plot_XY.R delete mode 100644 R/plot_thermal_group_capacities.R delete mode 100644 R/plot_utils.R delete mode 100644 R/runApp.R delete mode 100644 R/stack_map.R delete mode 100644 inst/AntaresViz.xlsx delete mode 100644 inst/application/global.R delete mode 100644 inst/application/server.R delete mode 100644 inst/application/src/scripts/directoryInput.R delete mode 100644 inst/application/src/server/01_set_read_data.R delete mode 100644 inst/application/src/server/02_load_data.R delete mode 100644 inst/application/src/server/03_data_selection.R delete mode 100644 inst/application/src/server/04_shared_input.R delete mode 100644 inst/application/src/server/05_modules.R delete mode 100644 inst/application/src/server/06_module_map.R delete mode 100644 inst/application/src/server/07_write_h5.R delete mode 100644 inst/application/src/tests/size_app.R delete mode 100644 inst/application/src/ui/01_ui_import_data.R delete mode 100644 inst/application/src/ui/02_ui_read_data.R delete mode 100644 inst/application/src/ui/03_ui_convert_h5.R delete mode 100644 inst/application/src/ui/04_ui_analysis.R delete mode 100644 inst/application/src/ui/05_ui_prodstack.R delete mode 100644 inst/application/src/ui/06_ui_exchange.R delete mode 100644 inst/application/src/ui/07_ui_tsplot.R delete mode 100644 inst/application/src/ui/08_ui_map.R delete mode 100644 inst/application/src/ui/09_ui_params.R delete mode 100644 inst/application/src/ui/10_ui_help.R delete mode 100644 inst/application/ui.R delete mode 100644 inst/application/www/events.js delete mode 100644 inst/application/www/js/directory_input_binding.js delete mode 100644 inst/application/www/readAntares.html delete mode 100644 inst/application/www/removeVirtualAreas.html delete mode 100644 inst/application/www/spinner.gif delete mode 100644 inst/application/www/writeAntaresH5.html delete mode 100644 inst/color.csv delete mode 100644 inst/mapLayout/ml.rda delete mode 100644 inst/moduleDev/moduleStackMap.R delete mode 100644 inst/test_scripts/compare_test.R delete mode 100644 man/limitSizeGraph.Rd delete mode 100644 man/modRpart.Rd delete mode 100644 man/modXY.Rd delete mode 100644 man/placeGeoPoints-shiny.Rd delete mode 100644 man/plotMapLayout.Rd delete mode 100644 man/plotThermalGroupCapacities.Rd delete mode 100644 man/plotXY.Rd delete mode 100644 man/runAppAntaresViz.Rd delete mode 100644 man/stackMap.Rd delete mode 100644 tests/testthat/test-exchangesStack.R delete mode 100644 tests/testthat/test-getTSData.R delete mode 100644 tests/testthat/test-map.R delete mode 100644 tests/testthat/test-prodStack.R delete mode 100644 tests/testthat/test-stackExchanges.R delete mode 100644 tests/testthat/test-ts_plot.R delete mode 100644 vignettes/antaresViz.Rmd delete mode 100644 vignettes/antareslogo.png delete mode 100644 vignettes/data_for_antaresViz_vignette_extralight.Rdata delete mode 100644 vignettes/maplyout_resized.gif delete mode 100644 vignettes/plot_resized.gif diff --git a/.travis.yml b/.travis.yml index e1ad58b..b50afc6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,31 +5,13 @@ dist: trusty sudo: required cache: packages -before_install: - sudo apt-get install -y libprotobuf-dev protobuf-compiler - -r: bioc-devel - -r_github_packages: - - hadley/devtools#1263 - - Bioconductor-mirror/zlibbioc - - Bioconductor-mirror/rhdf5 - - rte-antares-rpackage/manipulateWidget@develop - - rte-antares-rpackage/antaresMaps - - rte-antares-rpackage/antaresRead@develop - - rte-antares-rpackage/antaresProcessing@develop - addons: apt: - sources: - - sourceline: 'ppa:opencpu/jq' packages: - - libjq-dev - - valgrind - libgdal-dev - libproj-dev - libv8-3.14-dev - + include: - r: release - r: oldrel diff --git a/DESCRIPTION b/DESCRIPTION index 9e7dab2..3995a11 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,55 +1,48 @@ -Package: antaresViz -Type: Package -Title: Antares Visualizations -Version: 0.11.3 -Date: 2017-12-07 -Authors@R: c( - person("Jalal-Edine", "ZAWAM", , "jalal-edine.zawam@rte-france.com", role = c("aut", "cre")), - person("Francois", "Guillem", , "francois.guillem@rte-france.com", role = "aut"), - person("Benoit", "Thieurmel", email = "benoit.thieurmel@datastorm.fr", role = "aut"), - person(given = "Titouan", family = "Robert", email = "titouan.robert@datastorm.fr", role = "aut"), - person("Baptiste", "SEGUINOT", , "baptiste.seguinot@rte-france.com", role = "ctb"), - person("RTE", role = "cph") - ) -Maintainer: Jalal-Edine ZAWAM -Description: Visualize results generated by Antares, a powerful software - developed by RTE to simulate and study electric power systems - (more information about Antares here: ). - This package provides functions that create interactive charts to help - Antares users visually explore the results of their simulations. -URL: https://github.com/rte-antares-rpackage/antaresViz -BugReports: https://github.com/rte-antares-rpackage/antaresViz/issues -License: GPL (>= 2) | file LICENSE -LazyData: TRUE -Encoding: UTF-8 -Depends: - antaresRead (>= 2.0.0), - antaresProcessing (>= 0.12.0), - spMaps (>= 0.1) -Imports: - dygraphs (>= 1.1.1), - shiny (>= 0.13.0), - magrittr, - plotly (>= 4.5.6), - htmltools, - htmlwidgets (>= 0.7.0), - manipulateWidget (>= 0.8.0), - leaflet (>= 1.1.0), - sp, - webshot, - data.table, - methods, - lubridate, - geojsonio, - graphics, - stats, - leaflet.minicharts (>= 0.5.2), - assertthat -RoxygenNote: 6.0.1 -Suggests: testthat, - covr, - rhdf5 (>= 2.20.2), - rbokeh, - knitr, - visNetwork -VignetteBuilder: knitr +Package: antaresViz +Type: Package +Title: Antares Visualizations +Version: 0.11.1 +Date: 2017-07-17 +Authors@R: c( + person("Francois", "Guillem", , "francois.guillem@rte-france.com", role = c("aut", "cre")), + person("Jalal-Edine", "ZAWAM", , "jalal-edine.zawam@rte-france.com", role = "ctb"), + person("RTE", role = "cph") + ) +Maintainer: Francois Guillem +Description: Visualize results generated by Antares, a powerful software + developed by RTE to simulate and study electric power systems + (more information about Antares here: ). + This package provides functions that create interactive charts to help + Antares users visually explore the results of their simulations. +URL: https://github.com/rte-antares-rpackage/antaresViz +BugReports: https://github.com/rte-antares-rpackage/antaresViz/issues +License: GPL (>= 2) | file LICENSE +LazyData: TRUE +Encoding: UTF-8 +Depends: + antaresRead (>= 0.14.0), + antaresProcessing (>= 0.11.0) +Imports: + dygraphs (>= 1.1.1), + shiny (>= 0.13.0), + miniUI, + magrittr, + plotly (>= 4.5.6), + tibble, + htmltools, + htmlwidgets (>= 0.7.0), + manipulateWidget (>= 0.7.0), + leaflet (>= 1.1.0), + sp, + webshot, + data.table, + methods, + lubridate, + geojsonio, + graphics, + stats, + leaflet.minicharts (>= 0.5.0) +RoxygenNote: 6.0.1 +Suggests: testthat, + covr + diff --git a/NAMESPACE b/NAMESPACE index 79f1b51..2ba2da2 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,66 +1,47 @@ # Generated by roxygen2: do not edit by hand S3method(plot,antaresData) -S3method(plot,list) S3method(plot,mapLayout) -S3method(plot,simOptions) export(addShadows) export(colorScaleOptions) export(defaultTilesURL) export(exchangesStack) export(getInteractivity) -export(leafletDragPointsOutput) -export(limitSizeGraph) export(mapLayout) -export(modRpart) -export(modXY) export(plotMap) -export(plotMapLayout) export(plotMapOptions) -export(plotThermalGroupCapacities) -export(plotXY) export(prodStack) export(prodStackAliases) export(prodStackLegend) -export(renderLeafletDragPoints) -export(runAppAntaresViz) export(savePlotAsPng) export(setInteractivity) export(setProdStackAlias) -export(stackMap) export(tsLegend) export(tsPlot) import(antaresProcessing) import(antaresRead) -import(assertthat) import(data.table) import(dygraphs) import(htmltools) import(leaflet) import(leaflet.minicharts) import(manipulateWidget) +import(miniUI) import(shiny) -import(spMaps) importFrom(grDevices,col2rgb) importFrom(grDevices,colorRampPalette) importFrom(grDevices,colors) importFrom(grDevices,gray) importFrom(grDevices,rainbow) -importFrom(grDevices,rgb) importFrom(graphics,par) importFrom(graphics,plot) importFrom(methods,is) importFrom(plotly,add_bars) importFrom(plotly,add_heatmap) -importFrom(plotly,add_text) -importFrom(plotly,add_trace) importFrom(plotly,config) importFrom(plotly,layout) importFrom(plotly,plot_ly) -importFrom(shiny,runApp) -importFrom(stats,as.formula) importFrom(stats,density) importFrom(stats,lm) importFrom(stats,predict) importFrom(stats,quantile) -importFrom(utils,object.size) diff --git a/R/api_info.R b/R/api_info.R deleted file mode 100644 index db24422..0000000 --- a/R/api_info.R +++ /dev/null @@ -1,161 +0,0 @@ -.giveH5DataToApi <- function(sharerequest, infos, areas = NULL, links = NULL, clusters = NULL, districts = NULL){ - if(infos$isH5){ - gc() - if(length(sharerequest$mcYearh_l)==0) {mcYearh2 <- NULL}else{ - if("all"%in%sharerequest$mcYearh_l){ - mcYearh2 <- "all" - }else{ - mcYearh2 <- as.numeric(sharerequest$mcYearh_l) - } - } - if(!is.null(sharerequest$tables_l)) - { - if("areas" %in% sharerequest$tables_l){ - areas <- "all" - } - if("links" %in% sharerequest$tables_l){ - links <- "all" - } - if("clusters" %in% sharerequest$tables_l){ - clusters <- "all" - } - if("districts" %in% sharerequest$tables_l){ - districts <- "all" - } - } - readAntares(areas = areas, links = links, clusters = clusters,districts = districts , mcYears = mcYearh2, - timeStep = sharerequest$timeSteph5_l, opts = infos$dataInput) - }else{ - infos$dataInput - } -} - - - - - - - - -.giveDateInfos <- function(yD, params, xyCompare, minMax, tabl = NULL){ - use <- NULL - nulTab <- is.null(tabl) - if(!is.null(params)) - { - if(minMax == "min") - { - if(is.null(yD)){ - if(!nulTab) - { - use <- params$x[[1]][[tabl]]$dataDateRange[1] - } - else{ - use <- params$x[[1]]$dataDateRange[1] - } - }else if(xyCompare == "union"){ - use <- min( - do.call("c",(lapply(params$x, function(vv){ - if(nulTab){ - unique(vv$dataDateRange[1]) - }else{ - vv[[tabl]]$dataDateRange[1] - } - } - )))) - } else if(xyCompare == "intersect"){ - use <- max( - do.call("c",(lapply(params$x, function(vv){ - if(nulTab){ - unique(vv$dataDateRange[1]) - }else{ - vv[[tabl]]$dataDateRange[1] - } - } - )))) - } - } - if(minMax == "max") - { - if(is.null(yD)){ - if(!nulTab) - { - use <- params$x[[1]][[tabl]]$dataDateRange[2] - } - else{ - use <- params$x[[1]]$dataDateRange[2] - } - }else if(xyCompare == "union"){ - use <- max( - do.call("c",(lapply(params$x, function(vv){ - if(nulTab){ - unique(vv$dataDateRange[2]) - }else{ - vv[[tabl]]$dataDateRange[2] - } - } - )))) - } else if(xyCompare == "intersect"){ - use <- min( - do.call("c",(lapply(params$x, function(vv){ - if(nulTab){ - unique(vv$dataDateRange[2]) - }else{ - vv[[tabl]]$dataDateRange[2] - } - } - )))) - } - }} - use -} - -.giveParamH5 <- function(X_I, Y_I, xyCompare){ - if(X_I$isH5){ - opts <- X_I$dataInput - fid <- rhdf5::H5Fopen(opts$h5path) - timeStepS <- .getTimeStep(fid) - timeStepS <- as.character(timeStepS) - mcYearS <- opts$mcYears - tabl <- .getTableInH5(fid, timeStepS[1]) - rhdf5::H5Fclose(fid) - xPart = list( - timeStepS = timeStepS, - mcYearS = mcYearS, - tabl = tabl - ) - - }else{ - xPart = NULL - } - if(Y_I$isH5){ - opts <- Y_I$dataInput - fid <- rhdf5::H5Fopen(opts$h5path) - timeStepS <- .getTimeStep(fid) - timeStepS <- as.character(timeStepS) - mcYearS <- opts$mcYears - tabl <- .getTableInH5(fid, timeStepS[1]) - tabl <- tabl[tabl%in%c("areas", "districts")] - rhdf5::H5Fclose(fid) - yPart = list( - timeStepS = timeStepS, - mcYearS = mcYearS, - tabl = tabl - ) - }else{ - yPart = NULL - } - if(is.null(xPart) & is.null(yPart)){ - ret <- NULL - }else if(is.null(xPart)){ - ret <- yPart - }else if(is.null(yPart)){ - ret <- xPart - }else{ - ret <- list() - ret$timeStepS <- .compareOperation(list(xPart$timeStepS, yPart$timeStepS), xyCompare) - ret$mcYearS <- sort(.compareOperation(list(xPart$mcYearS, yPart$mcYearS), xyCompare)) - ret$tabl <- .compareOperation(list(xPart$tabl, yPart$tabl), xyCompare) - } - rhdf5::H5close() - ret -} \ No newline at end of file diff --git a/R/get_data_for_comp.R b/R/get_data_for_comp.R index 1f66a07..a26e64d 100644 --- a/R/get_data_for_comp.R +++ b/R/get_data_for_comp.R @@ -12,23 +12,15 @@ #' #' @noRd #' -.getDataForComp <- function(x, y = NULL, compare = NULL, compareOpts = NULL, processFun = as.antaresDataList, ...) { - - if(!is.list(x)){return(NULL)} +.getDataForComp <- function(x, y, compare, compareOpts, processFun = as.antaresDataList) { if (is.null(compareOpts)) compareOpts <- list() - - assert_that(is.function(processFun)) - - if (inherits(x, "antaresData")) { - x <- processFun(x, ...) + x <- processFun(x) if (!is.null(y)) { - assert_that(inherits(y, "antaresData")) - if (is.null(compare)) compare <- list() - y <- processFun(y, ...) + y <- processFun(y) x <- list(x, y) compareOpts$ncharts <- 2 } else { @@ -40,10 +32,7 @@ x <- replicate(compareOpts$ncharts, x, simplify = FALSE) } } else { - assert_that(is.list(x)) - assert_that(all(sapply(x, inherits, what = "antaresData")), - msg = "'x' is not an antaresData or a list of antaresData objects") - x <- lapply(x, processFun, ...) + x <- lapply(x, processFun) compareOpts$ncharts <- length(x) if (is.null(compare)) compare <- list() } diff --git a/R/graph_utils.R b/R/graph_utils.R deleted file mode 100644 index 4d4e2be..0000000 --- a/R/graph_utils.R +++ /dev/null @@ -1,323 +0,0 @@ -#' Compare options from length of data -#' -#' @param x list of data -#' @param compare character -#' -#' @noRd -.compOpts <- function(x, compare){ - - len <- 1 - - if("list" == class(x)[1]){ - len <- length(x) - } - if(length(x) > 1) - { - - ncol = ifelse(len > 2, 2 ,1) - nrow = floor((len-1)/2) + 1 + ifelse(len == 2, 1, 0) - return(list(ncharts = len, nrow = nrow, ncol = ncol)) - } - if(!is.null(compare)){ - return( - list(ncharts = 2, nrow = 2, ncol = 1) - ) - } - - return(list(ncharts = 1, nrow = 1, ncol = 1)) - -} - -#' Join date range -#' -#' @param params list of data -#' @param xyCompare character -#' @param minMax character -#' @param tabl character -#' -#' @noRd -.dateRangeJoin <- function(params, xyCompare, minMax, tabl = NULL){ - if(minMax == "min" & xyCompare == "union"){ - if(!is.null(tabl)) - { - date_range <- lapply(params$x, function(X){ - X[[tabl]]$dateRange[1] - }) - date_range <- date_range[which(sapply(date_range, function(x) !is.null(x)))] - - return(min(do.call("c",date_range))) - }else{ - date_range <- lapply(params$x, function(X){ - X$dateRange[1] - }) - date_range <- date_range[which(sapply(date_range, function(x) !is.null(x)))] - - return(min(do.call("c",date_range))) - } - } - if(minMax == "min" & xyCompare == "intersect"){ - if(!is.null(tabl)) - { - date_range <- lapply(params$x, function(X){ - X[[tabl]]$dateRange[1] - }) - date_range <- date_range[which(sapply(date_range, function(x) !is.null(x)))] - - return(max(do.call("c",date_range))) - }else{ - date_range <- lapply(params$x, function(X){ - X$dateRange[1] - }) - date_range <- date_range[which(sapply(date_range, function(x) !is.null(x)))] - - return(max(do.call("c",date_range))) - } - } - if(minMax == "max" & xyCompare == "union"){ - if(!is.null(tabl)) - { - date_range <- lapply(params$x, function(X){ - X[[tabl]]$dateRange[2] - }) - date_range <- date_range[which(sapply(date_range, function(x) !is.null(x)))] - - return(max(do.call("c",date_range))) - }else{ - date_range <- lapply(params$x, function(X){ - X$dateRange[2] - }) - date_range <- date_range[which(sapply(date_range, function(x) !is.null(x)))] - - return(max(do.call("c",date_range))) - } - } - if(minMax == "max" & xyCompare == "intersect"){ - if(!is.null(tabl)) - { - date_range <- lapply(params$x, function(X){ - X[[tabl]]$dateRange[2] - }) - date_range <- date_range[which(sapply(date_range, function(x) !is.null(x)))] - - return(min(do.call("c",date_range))) - }else{ - date_range <- lapply(params$x, function(X){ - X$dateRange[2] - }) - date_range <- date_range[which(sapply(date_range, function(x) !is.null(x)))] - - return(min(do.call("c",date_range))) - } - } -} - - - -#' Transform data -#' -#' @param x list of data -#' @param compare character -#' @param compareOpts list -#' @param processFun function -#' @param ... -#' -#' @noRd -.transformDataForComp <- function(x, compare = NULL, - compareOpts = NULL, - processFun = as.antaresDataList, ...) { - if(!is.list(x)){return(NULL)} - if (is.null(compareOpts)) compareOpts <- list() - assert_that(is.function(processFun)) - assert_that(is.list(x)) - assert_that(all(sapply(x, inherits, what = "antaresData")), - msg = "'x' is not an antaresData or a list of antaresData objects") - x <- lapply(x, processFun, ...) - compareOpts$ncharts <- length(x) - if (is.null(compare)) compare <- list() - compareOpts <- do.call(compareOptions, compareOpts) - list( - x = x, - compare = compare, - compareOpts = compareOpts - ) -} - -#' Transform x in homogeneous format, list of antaresdatalist / opts -#' -#' @param x list of data -#' -#' @noRd -.giveListFormat <- function(x){ - if(.isSimOpts(x) | "antaresData" %in% class(x)){ - list(.rescoverFormat(x)) - }else{ - if("list" %in% class(x)){ - lapply(x, .rescoverFormat) - }else{ - stop("class x must be antaresData or simOptions or list") - } - } -} - -#' Transform x in antaresdatalist / opts -#' -#' @param x data -#' -#' @noRd -.rescoverFormat <- function(x){ - if("antaresData" %in% class(x)) - { - re <- as.antaresDataList(x) - }else{ - if(.isSimOpts(x)){ - re <- x - }else{ - stop("class x must be antaresData or simOptions") - } - } - re -} - - -#' Test opst -#' -#' @param test if x is simOptions class -#' -#' @noRd -.isSimOpts <- function(x){ - "simOptions" %in% class(x) -} - - -#' Load h5 data -#' -#' @param sharerequest, list of mcYearh_l, tables_l and timeSteph5_l -#' @param dta, antaresdatalist or opts, if antaresdatalist do nothing, if opts load data -#' @param areas character -#' @param links character -#' @param clusters character -#' @param districts character -#' -#' @noRd -.loadH5Data <- function(sharerequest, dta, areas = NULL, links = NULL, clusters = NULL, - districts = NULL, h5requestFilter = list()){ - if(.isSimOpts(dta)){ - gc() - if(length(sharerequest$mcYearh_l)==0) {mcYearh2 <- NULL}else{ - if("all"%in%sharerequest$mcYearh_l){ - mcYearh2 <- "all" - }else{ - mcYearh2 <- as.numeric(sharerequest$mcYearh_l) - } - } - if(!is.null(sharerequest$tables_l)) - { - if("areas" %in% sharerequest$tables_l){ - areas <- "all" - } - if("links" %in% sharerequest$tables_l){ - links <- "all" - } - if("clusters" %in% sharerequest$tables_l){ - clusters <- "all" - } - if("districts" %in% sharerequest$tables_l){ - districts <- "all" - } - } - - - argS <- list(areas = areas, links = links, clusters = clusters,districts = districts , mcYears = mcYearh2, - timeStep = sharerequest$timeSteph5_l, opts = dta) - argS[names(h5requestFilter)] <- h5requestFilter - dt <- do.call(readAntares, - argS) - - dt <- as.antaresDataList(dt) - for(i in 1:length(dt)){ - if(all(names(dt[[i]])%in%.idCols(dt[[i]]))){ - dt[[i]] <- NULL - } - } - dt - }else{ - dta - } -} - - - - -#' List of h5 params -#' -#' @param X_I, list -#' @param xyCompare, character -#' -#' @noRd -.h5ParamList <- function(X_I, xyCompare, h5requestFilter = NULL){ - listParam <- lapply(1:length(X_I), function(i){ - x <- X_I[[i]] - if(.isSimOpts(x)){ - tmp <- .h5Inf(x) - h5_filter <- h5requestFilter[[i]] - h5_tables <- c("areas", "districts", "clusters", "links") - if(!is.null(h5_filter)){ - if(!(is.null(h5_filter$areas) & is.null(h5_filter$districts) & - is.null(h5_filter$links) & is.null(h5_filter$clusters))){ - h5_tables <- c("areas", "districts", "clusters", "links") - h5_tables <- h5_tables[which(c(!is.null(h5_filter$areas), !is.null(h5_filter$districts), - !is.null(h5_filter$clusters), !is.null(h5_filter$links)))] - } - } - tmp$tabl <- intersect(tmp$tabl, h5_tables) - rhdf5::H5close() - tmp - }else{ - mcY <- unique(unlist(lapply(x, function(y){unique(y$mcYears)}))) - timeStepS <- attributes(x)$timeStep - tabl <- names(x) - list( - timeStepS = timeStepS, - mcYearS = mcY, - tabl = tabl - ) - } - }) - res <- lapply(.transposeL(listParam), function(x){ - .compareOperation(x, xyCompare) - }) - - res$h5requestFilter <- h5requestFilter - res -} - -#' Load information from h5 file -#' -#' @param x, opts -#' -#' @noRd -.h5Inf <- function(x){ - fid <- rhdf5::H5Fopen(x$h5path) - timeStepS <- .getTimeStep(fid) - timeStepS <- as.character(timeStepS) - mcYearS <- x$mcYears - tabl <- .getTableInH5(fid, timeStepS[1]) - rhdf5::H5Fclose(fid) - xPart = list( - timeStepS = timeStepS, - mcYearS = mcYearS, - tabl = tabl - ) -} - - -.transposeL <- function(data){ - do.call(c, apply(do.call(rbind, data), 2, list)) -} - - -.testXclassAndInteractive <- function(x, interactive){ - if(!"antaresData" %in% class(x) & !interactive){ - stop("You can at moment only use no interactive mode with one no h5 antares study.") - } -} diff --git a/R/h5_utils.R b/R/h5_utils.R deleted file mode 100644 index c6718dc..0000000 --- a/R/h5_utils.R +++ /dev/null @@ -1,112 +0,0 @@ -.convertH5Filtering <- function(h5requestFiltering, x) -{ - if(length(h5requestFiltering)>0) - { - if(!is.list(h5requestFiltering[[1]])){ - if(!any(c("simOptions", "antaresDataTable") %in%class(x))) - { - h5requestFiltering <- rep(list(h5requestFiltering), length(x)) - }else{ - h5requestFiltering <- list(h5requestFiltering) - } - }else{ - if(class(x) == "list"){ - if(length(h5requestFiltering) != length(x)){ - h5requestFiltering <- h5requestFiltering[1:length(x)%%length(h5requestFiltering) + 1] - } - } - } - }else{ - if(!any(c("simOptions", "antaresDataTable") %in%class(x))) - { - h5requestFiltering <- replicate(length(x), list()) - }else{ - h5requestFiltering <- replicate(1, list()) - } - } - h5requestFiltering -} - - - -.getTableInH5 <- function(fid, timeStep){ - dataExist <- NULL - if(rhdf5::H5Lexists(fid, paste0(timeStep, "/areas"))) - { - dataExist <- c(dataExist, "areas") - } - if(rhdf5::H5Lexists(fid, paste0(timeStep, "/links"))) - { - dataExist <- c(dataExist, "links") - } - if(rhdf5::H5Lexists(fid, paste0(timeStep, "/clusters"))) - { - dataExist <- c(dataExist, "clusters") - } - if(rhdf5::H5Lexists(fid, paste0(timeStep, "/districts"))) - { - dataExist <- c(dataExist, "districts") - } - dataExist -} - -.getVariablesH5 <- function(fid, timeStep, tables){ - sapply(tables, function(X){ - struct <- .getstructure(fid, paste0(timeStep, "/", X, "/mcInd/", "/structure"))$variable - if("timeId"%in%struct){ - struct <- struct[struct!="timeId"] - } - struct - }, simplify = FALSE) -} - -.getClustersNames <- function(fid, timeStep){ - unique(unlist(lapply(strsplit(.getstructure(fid, paste0(timeStep, "/clusters/mcInd/structure"))$cluster, "/"), function(X)X[1]))) -} - -.getElements <- function(opts, tables, fid, timeStep){ - elements <- list() - if("areas" %in% tables) elements$areas <- opts$areaList - if("links" %in% tables) elements$links <- opts$linkList - if("districts" %in% tables) elements$districts <- opts$districtList - if("clusters" %in% tables){ - elements$clusters <- .getClustersNames(fid, timeStep) - } - elements -} - -.getDateRange <- function(opts, timeStep){ - tim <- .timeIdToDate(sort( - unique( - antaresRead::.h5ReadAntares(opts$h5path, timeStep = timeStep, select = "timeId", - areas = opts$areaList[1], mcYears = opts$mcYears[1], perf = FALSE)$timeId) - ), timeStep = timeStep, opts = opts) - dt <- as.Date(range(tim)) - dt -} - - -.getGraphFunction <- function(type){ - switch(type, - "ts" = .plotTS, - "barplot" = .barplot, - "monotone" = .plotMonotone, - "density" = .density, - "cdf" = .cdf, - "heatmap" = .heatmap, - stop("Invalid type") - ) -} - -.getTimeStep <- function(fid){ - timeSteps <- sapply(c("hourly", "daily", "weekly", "monthly", "annual"), function(X){ - rhdf5::H5Lexists(fid, X) - }) - names(timeSteps[which(timeSteps == TRUE)]) -} - -.compareOperation <- function(a, opType){ - if(length(a) == 1) return(unlist(unique(a))) - if(opType == "union") return(Reduce(union, a)) - if(opType == "intersect") return(Reduce(intersect, a)) -} diff --git a/R/h5_utils_plot.R b/R/h5_utils_plot.R deleted file mode 100644 index 4e81aa8..0000000 --- a/R/h5_utils_plot.R +++ /dev/null @@ -1,128 +0,0 @@ - -.getData <- function(path, table, mcYear, variable, elements, dateRange, timeStep){ - opts <- antaresRead::.getOptionsH5(path) - if(mcYear == "MC-All") - { - mcYear <- NULL - } - areas <- links <- clusters <- districts <- NULL - assign(table, as.character(elements)) - data <- antaresRead::.h5ReadAntares(path = path, - areas = areas, - links = links, - clusters = clusters, - districts = districts, - mcYears = mcYear, - select = variable, - timeStep = timeStep, - perf = FALSE) - if(nrow(data) == 0){return(data)} - - colsId <- antaresRead::getIdCols(data) - - if("cluster" %in% colsId){ - idV <- c("area", "cluster") - } else if ("area"%in%colsId){ - idV <- "area" - } else if ("link"%in%colsId){ - idV <- "link" - } else if ("district"%in%colsId){ - idV <- "district" - } - valueCol <- setdiff(names(data), colsId) - valueCol <- intersect(valueCol, variable) - - data <- data[,.SD, .SDcols = c("timeId", "time", valueCol, idV)] - if(length(idV) > 1){ - data[, "newKey" := paste0(lapply(.SD, as.character), collapse = " < "), .SDcols = idV,by=1:nrow(data)] - data[,c(idV) := NULL] - idV <- "newKey" - }else{ - setnames(data, idV, "newKey") - } - data$newKey <- as.character(data$newKey) - - if(ncol(data) > 4){ - data <- melt(data, c("newKey", "timeId", "time")) - data[, "newKey" := paste0(data$newKey, " - ", as.character(variable)),by=1:nrow(data)] - data[, variable := NULL] - valueCol <- "value" - } - - - odc <- c("timeId", "time", valueCol, "newKey") - setcolorder(data, odc) - setnames(data, names(data), c("timeId", "time", "value", "element")) - - data[,time := .timeIdToDate(timeId, timeStep, opts)] - data[time >= dateRange[1] & time <= dateRange[2]] - -} - -.doPlot <- function(.id, - path, - table, - mcYear, - variable, - elements, - timeStep, - data, - dateRange, - type, - minValue, - maxValue, - colors, - main, - ylab, - legend, - legendItemsPerRow, - width, - height, - opts, - colorScaleOpts, - group){ - - - data <- .getData(ifelse(length(path) == 1 , path , path[.id]), table, mcYear, variable, elements, dateRange, timeStep) - if(nrow(data) == 0){return(NULL)} - f <- .getGraphFunction(type) - - f( - data, - timeStep = timeStep, - variable = variable, - confInt = 0, - minValue = minValue, - maxValue = maxValue, - colors = colors, - main = if(length(main) <= 1) main else main[.id], - ylab = if(length(ylab) <= 1) ylab else ylab[.id], - legend = legend, - legendItemsPerRow = legendItemsPerRow, - width = width, - height = height, - opts = opts, - colorScaleOpts = colorScaleOpts, - group = group - ) - -} - - -.getstructure <- function(fid, strgp){ - gid <- rhdf5::H5Gopen(fid, strgp) - data <- rhdf5::h5dump(gid) - rhdf5::H5Gclose(gid) - if(length(which(data$reCalcVar!="")) > 0) - { - data$reCalcVar <- data$reCalcVar[which(data$reCalcVar!="")] - data$variable <- c(data$variable, data$reCalcVar) - data$reCalcVar <- NULL - } - data -} - -.tryCloseH5 <- function(){ - try(rhdf5::H5close(), silent = TRUE) -} - diff --git a/R/leafletDragPoints.R b/R/leafletDragPoints.R index 3dde8c6..3e6b4df 100644 --- a/R/leafletDragPoints.R +++ b/R/leafletDragPoints.R @@ -1,16 +1,13 @@ #' @noRd -leafletDragPoints <- function(geopoints, map = NULL, width = NULL, height = NULL, - init = FALSE, reset_map = FALSE, draggable = TRUE) { +leafletDragPoints <- function(geopoints, map = NULL, width = NULL, height = NULL) { if (!is.null(map)) map <- geojsonio::geojson_json(map) - if(!is.null(geopoints)){ - geopoints$avg <- (geopoints$lat + geopoints$lon) / 2 - - firstPoint <- which.min(geopoints$avg) - secondPoint <- which.max(geopoints$avg) - } + geopoints$avg <- (geopoints$lat + geopoints$lon) / 2 - x = list(geopoints = geopoints, map = map, init = init, reset_map = reset_map, draggable = draggable) + firstPoint <- which.min(geopoints$avg) + secondPoint <- which.max(geopoints$avg) + + x = list(geopoints = geopoints, map = map) attr(x, 'TOJSON_ARGS') <- list(dataframe = "rows") # create widget @@ -42,13 +39,13 @@ leafletDragPoints <- function(geopoints, map = NULL, width = NULL, height = NULL #' #' @name placeGeoPoints-shiny #' -#' @export +#' @noRd leafletDragPointsOutput <- function(outputId, width = '100%', height = '400px'){ htmlwidgets::shinyWidgetOutput(outputId, 'leafletDragPoints', width, height, package = 'antaresViz') } #' @rdname placeGeoPoints-shiny -#' @export +#' @noRd renderLeafletDragPoints <- function(expr, env = parent.frame(), quoted = FALSE) { if (!quoted) { expr <- substitute(expr) } # force quoted htmlwidgets::shinyRenderWidget(expr, leafletDragPointsOutput, env, quoted = TRUE) diff --git a/R/limitSizeGraph.R b/R/limitSizeGraph.R deleted file mode 100644 index 6d78631..0000000 --- a/R/limitSizeGraph.R +++ /dev/null @@ -1,24 +0,0 @@ -#' Use to change limit size of graph (in Mb) -#' -#' @param size \code{numeric} widget size autorized in modules (default 200) -#' @examples -#' \dontrun{ -#' limitSizeGraph(500) -#' } -#' -#' @export -limitSizeGraph <- function(size){ - options(antaresVizSizeGraph = size) -} - -controlWidgetSize <- function(widget){ - if(is.null(getOption("antaresVizSizeGraph"))){ - options(antaresVizSizeGraph = 200) - } - - if(round(as.numeric(object.size(widget)) / 1048000, 1) > getOption("antaresVizSizeGraph")){ - return(combineWidgets(antaresVizSizeGraphError)) - } else { - widget - } -} diff --git a/R/map.R b/R/map.R index a5b7aef..9ebc667 100644 --- a/R/map.R +++ b/R/map.R @@ -8,9 +8,7 @@ #' #' @param x #' Object of class \code{antaresDataList} created with -#' \code{\link[antaresRead]{readAntares}} and containing areas and links data. -#' It can be a list of \code{antaresData} objects. -#' In this case, one chart is created for each object. +#' \code{\link[antaresRead]{readAntares}} and containing areas and links data #' @param mapLayout #' Object created with function \code{\link{mapLayout}} #' @param colAreaVar @@ -64,26 +62,8 @@ #' @param options #' List of parameters that override some default visual settings. See the #' help of \code{\link{plotMapOptions}}. -#' @param sizeMiniPlot \code{boolean} variable size for miniplot #' @inheritParams prodStack #' -#' -#' @details -#' -#' compare argument can take following values : -#' \itemize{ -#' \item "mcYear" -#' \item "type" -#' \item "colAreaVar" -#' \item "sizeAreaVars" -#' \item "areaChartType" -#' \item "showLabels" -#' \item "popupAreaVars" -#' \item "labelAreaVar" -#' \item "colLinkVar" -#' \item "sizeLinkVar" -#' \item "popupLinkVars" -#' } #' @return #' An htmlwidget of class "leaflet". It can be modified with package #' \code{leaflet}. By default the function starts a shiny gadget that lets the @@ -100,41 +80,23 @@ #' # functions save and load #' #' layout <- readLayout() -#' ml <- mapLayout(layout = layout) +#' ml <- mapLayout(layout) #' save("ml", file = "ml.rda") #' -#' plotMap(x = mydata, mapLayout = ml) +#' plotMap(mydata, ml) #' #' # Specify the variables to use to control the color or size of elements. -#' plotMap(mydata, mapLayout = ml, +#' plotMap(mydata, ml, #' sizeAreaVars = c("WIND", "SOLAR", "H. ROR"), #' sizeLinkVar = "FLOW LIN.") #' #' # Change default graphical properties -#' plotMap(x = mydata, mapLayout = ml, options = list(colArea="red", colLink = "orange")) -#' plotMap(x = list(mydata, mydata), mapLayout = ml) -#' -#' # Use h5 for dynamic request / exploration in a study -#' # Set path of simulaiton -#' setSimulationPath(path = path1) -#' -#' # Convert your study in h5 format -#' writeAntaresH5(path = mynewpath) -#' -#' # Redefine sim path with h5 file -#' opts <- setSimulationPath(path = mynewpath) -#' plotMap(x = opts, mapLayout = ml) -#' -#' # Compare elements in a single study -#' plotMap(x = opts, mapLayout = ml, .compare = "mcYear") -#' -#' # Compare 2 studies -#' plotMap(x = list(opts, opts2), mapLayout = ml) +#' plotMap(mydata, ml, options = list(colArea="red", colLink = "orange")) #' #' } #' #' @export -plotMap <- function(x, mapLayout, colAreaVar = "none", sizeAreaVars = c(), +plotMap <- function(x, y = NULL, mapLayout, colAreaVar = "none", sizeAreaVars = c(), areaChartType = c("bar", "pie", "polar-area", "polar-radius"), uniqueScale = FALSE, showLabels = FALSE, @@ -150,59 +112,15 @@ plotMap <- function(x, mapLayout, colAreaVar = "none", sizeAreaVars = c(), compareOpts = list(), interactive = getInteractivity(), options = plotMapOptions(), - width = NULL, height = NULL, dateRange = NULL, xyCompare = c("union","intersect"), - h5requestFiltering = list(), - timeSteph5 = "hourly", - mcYearh5 = NULL, - tablesh5 = c("areas", "links"), - sizeMiniPlot = FALSE,...) { - - - if(!is.null(compare) && !interactive){ - stop("You can't use compare in no interactive mode") - } - - Column <- optionsT <- NULL - tpMap <- plotMapOptions() - - #Check compare - .validCompare(compare, c("mcYear", "type", "colAreaVar", "sizeAreaVars", "areaChartType", "showLabels", - "popupAreaVars", "labelAreaVar","colLinkVar", "sizeLinkVar", "popupLinkVars")) - - runScale <- ifelse(!identical(options[names(options)!="preprocess"] , - tpMap[names(tpMap)!="preprocess"]), FALSE, TRUE) + width = NULL, height = NULL) { type <- match.arg(type) areaChartType <- match.arg(areaChartType) - xyCompare <- match.arg(xyCompare) - - if(colAreaVar != "none" & colAreaVar%in%colorsVars$Column & runScale) - { - raw <- colorsVars[Column == colAreaVar] - options <- plotMapOptions(areaColorScaleOpts = colorScaleOptions( - negCol = "#FFFFFF", - zeroCol = rgb(raw$red, raw$green, raw$blue, maxColorValue = 255), - posCol = rgb(raw$red/2, raw$green/2, raw$blue/2, maxColorValue = 255))) - - } + options <- do.call(plotMapOptions, options) if (is.null(mcYear)) mcYear <- "average" - - if(!is.null(compare) && "list" %in% class(x)){ - if(length(x) == 1) x <- list(x[[1]], x[[1]]) - } - if(!is.null(compare) && ("antaresData" %in% class(x) | "simOptions" %in% class(x))){ - x <- list(x, x) - } - # .testXclassAndInteractive(x, interactive) - - h5requestFiltering <- .convertH5Filtering(h5requestFiltering = h5requestFiltering, x = x) - - - compareOptions <- .compOpts(x, compare) - if(is.null(compare)){ - if(compareOptions$ncharts > 1){ - compare <- "" - } + if (inherits(y, "mapLayout")) { + mapLayout <- y + y <- NULL } group <- paste0("map-group-", sample(1e9, 1)) @@ -210,26 +128,11 @@ plotMap <- function(x, mapLayout, colAreaVar = "none", sizeAreaVars = c(), # Check that parameters have the good class if (!is(mapLayout, "mapLayout")) stop("Argument 'mapLayout' must be an object of class 'mapLayout' created with function 'mapLayout'.") - init_dateRange <- dateRange - - # new_env for save and control mapLayout - env_plotFun <- new.env() - - processFun <- function(x, mapLayout) { + params <- .getDataForComp(x, y, compare, compareOpts, function(x) { if (!is(x, "antaresData")) { stop("Argument 'x' must be an object of class 'antaresData' created with function 'readAntares'.") } else { x <- as.antaresDataList(x) - if(!is.null(x$areas)){ - if(nrow(x$areas) == 0){ - x$areas <- NULL - } - } - if(!is.null(x$links)){ - if(nrow(x$links) == 0){ - x$links <- NULL - } - } if (is.null(x$areas) && is.null(x$links)) stop("Argument 'x' should contain at least area or link data.") } @@ -263,41 +166,19 @@ plotMap <- function(x, mapLayout, colAreaVar = "none", sizeAreaVars = c(), oldkeys <- lapply(x, key) if (attr(x, "synthesis")) { - - if(mcYear != "average"){ - .printWarningMcYear() - } - mcYear <- "average" } else { if (areas) setkeyv(x$areas, "mcYear") if (links) setkeyv(x$links, "mcYear") } - opts <- simOptions(x) - if(!is.null(x$areas)){ - x$areas[,time := .timeIdToDate(x$areas$timeId, attr(x, "timeStep"), opts)] - } - - if(!is.null(x$links)){ - x$links[,time := .timeIdToDate(x$links$timeId, attr(x, "timeStep"), opts)] - } - - if(is.null(init_dateRange)){ - if(!is.null(x$areas)){ - init_dateRange <- range(as.Date(x$areas$time)) - }else{ - init_dateRange <- range(as.Date(x$links$time)) - } - } - # Function that draws the final map when leaving the shiny gadget. plotFun <- function(t, colAreaVar, sizeAreaVars, popupAreaVars, areaChartType, uniqueScale, showLabels, labelAreaVar, colLinkVar, sizeLinkVar, popupLinkVars, type = c("detail", "avg"), mcYear, - initial = TRUE, session = NULL, outputId = "output1", - dateRange = NULL, sizeMiniPlot = FALSE, options = NULL) { + initial = TRUE, session = NULL, outputId = "output1") { + type <- match.arg(type) if (type == "avg") t <- NULL else if (is.null(t)) t <- 0 @@ -305,48 +186,16 @@ plotMap <- function(x, mapLayout, colAreaVar = "none", sizeAreaVars = c(), # Prepare data if (mcYear == "average") x <- syntx - # print("dateRange") - # print(dateRange) - if(!is.null(dateRange)){ - dateRange <- sort(dateRange) - # xx <<- copy(x$areas) - # dd <<- dateRange - if(!is.null(x$areas)) - { - # in case of missing transformation... - if("character" %in% class(x$areas$time)){ - x$areas[,time := .timeIdToDate(x$areas$timeId, attr(x, "timeStep"), simOptions(x))] - } - x$areas <- x$areas[time >= as.POSIXlt(dateRange[1], tz = "UTC") & time < as.POSIXlt(dateRange[2] + 1, tz = "UTC")] - } - if(!is.null(x$links)) - { - # in case of missing transformation... - if("character" %in% class(x$links$time)){ - x$links[,time := .timeIdToDate(x$links$timeId, attr(x, "timeStep"), simOptions(x))] - } - x$links <- x$links[time >= as.POSIXlt(dateRange[1], tz = "UTC") & time < as.POSIXlt(dateRange[2] + 1, tz = "UTC")] - } - } - if (initial) { - assign("currentMapLayout", mapLayout, envir = env_plotFun) - map <- .initMap(x, mapLayout, options) %>% syncWith(group) - } else if(!isTRUE(all.equal(mapLayout, get("currentMapLayout", envir = env_plotFun)))){ - assign("currentMapLayout", mapLayout) map <- .initMap(x, mapLayout, options) %>% syncWith(group) } else { - # in some case, map doesn't existed yet....! - if("output_1_zoom" %in% names(session$input)){ - map <- leafletProxy(outputId, session) - } else { - map <- .initMap(x, mapLayout, options) %>% syncWith(group) - } + map <- leafletProxy(outputId, session) } + map %>% .redrawLinks(x, mapLayout, mcYear, t, colLinkVar, sizeLinkVar, popupLinkVars, options) %>% .redrawCircles(x, mapLayout, mcYear, t, colAreaVar, sizeAreaVars, popupAreaVars, - uniqueScale, showLabels, labelAreaVar, areaChartType, options, sizeMiniPlot) + uniqueScale, showLabels, labelAreaVar, areaChartType, options) } # Create the interactive widget @@ -375,290 +224,78 @@ plotMap <- function(x, mapLayout, colAreaVar = "none", sizeAreaVars = c(), linkValColums = linkValColums, linkNumValColumns = linkNumValColumns, hideTimeIdSlider = hideTimeIdSlider, - timeId = timeId, - dateRange = init_dateRange + timeId = timeId ) - } + }) if (!interactive) { - x <- .cleanH5(x, timeSteph5, mcYearh5, tablesh5, h5requestFiltering) - + map <- params$x[[1]]$plotFun(timeId, colAreaVar, sizeAreaVars, popupAreaVars, areaChartType, + uniqueScale, showLabels, labelAreaVar, colLinkVar, + sizeLinkVar, popupLinkVars, type = type, mcYear = mcYear) + return(combineWidgets(map, title = main, width = width, height = height)) + } else { - params <- .getDataForComp(.giveListFormat(x), NULL, compare, compareOpts, processFun = processFun, mapLayout = mapLayout) - L_w <- lapply(params$x, function(X){ - X$plotFun(t = timeId, colAreaVar = colAreaVar, sizeAreaVars = sizeAreaVars, - popupAreaVars = popupAreaVars, areaChartType = areaChartType, - uniqueScale = uniqueScale, showLabels = showLabels, - labelAreaVar = labelAreaVar, colLinkVar = colLinkVar, - sizeLinkVar = sizeLinkVar, popupLinkVars = popupLinkVars, - type = type, mcYear = mcYear, dateRange = dateRange, - sizeMiniPlot = sizeMiniPlot, options = options) - }) - return(combineWidgets(list = L_w, title = main, width = width, height = height)) - - - } - - ##remove notes - mcYearH5 <- NULL - paramsH5 <- NULL - sharerequest <- NULL - timeStepdataload <- NULL - timeSteph5 <- NULL - x_in <- NULL - x_tranform <- NULL - - manipulateWidget( - { - if(!is.null(params)) + manipulateWidget( { - if(.id <= length(params$x)){ - .tryCloseH5() - - tmp_options <- optionsT - if(is.null(tmp_options)){ - tmp_options <- plotMapOptions() - } - - params$x[[.id]]$plotFun(t = params$x[[.id]]$timeId, - colAreaVar = colAreaVar, - sizeAreaVars = sizeAreaVars, - popupAreaVars = popupAreaVars, - areaChartType = areaChartType, - uniqueScale = uniqueScale, - showLabels = showLabels, - labelAreaVar = labelAreaVar, - colLinkVar = colLinkVar, - sizeLinkVar = sizeLinkVar, - popupLinkVars = popupLinkVars, - type = type, - mcYear = mcYear, - initial = .initial, - session = .session, - outputId = .output, - dateRange = dateRange, - sizeMiniPlot = sizeMiniPlot, - options = tmp_options) - - - } else { - combineWidgets("No data for this selection") - } - }else{ - combineWidgets() - } - }, - - x = mwSharedValue({x}), - x_in = mwSharedValue({ - .giveListFormat(x) - }), - options = mwSharedValue({options}), - optionsT = mwSharedValue({ - if(colAreaVar %in% colorsVars$Column & runScale){ - raw <- colorsVars[Column == colAreaVar] - plotMapOptions(areaColorScaleOpts = colorScaleOptions( - negCol = "#FFFFFF", - zeroCol = rgb(raw$red, raw$green, raw$blue, maxColorValue = 255), - posCol = rgb(raw$red/2, raw$green/2, raw$blue/2, maxColorValue = 255)) - ) - }else{ - options - } - }), - h5requestFiltering = mwSharedValue({h5requestFiltering}), - - paramsH5 = mwSharedValue({ - paramsH5List <- .h5ParamList(X_I = x_in, xyCompare = xyCompare, h5requestFilter = h5requestFiltering) - rhdf5::H5close() - paramsH5List - }), - H5request = mwGroup( - timeSteph5 = mwSelect(choices = paramsH5$timeStepS, - value = paramsH5$timeStepS[1], - label = "timeStep", - multiple = FALSE), - tables = mwSelect(choices = paramsH5[["tabl"]][paramsH5[["tabl"]] %in% c("areas", "links")], - value = { - if(.initial) {paramsH5[["tabl"]][paramsH5[["tabl"]] %in% c("areas", "links")]} else {NULL} - }, - label = "table", multiple = TRUE), - mcYearH5 = mwSelect(choices = c(paramsH5[["mcYearS"]]), - value = { - if(.initial){paramsH5[["mcYearS"]][1]}else{NULL} - }, - label = "mcYear", multiple = TRUE), - .display = {any(unlist(lapply(x_in, .isSimOpts)))} - ), - sharerequest = mwSharedValue({ - list(timeSteph5_l = timeSteph5, mcYearh_l = mcYearH5, tables_l = tables) - }), - x_tranform = mwSharedValue({ - sapply(1:length(x_in),function(zz){ - .loadH5Data(sharerequest, x_in[[zz]], h5requestFilter = paramsH5$h5requestFilter[[zz]]) - }, simplify = FALSE) - }), - - ##Stop h5 - mcYear = mwSelect({ - c("average", as.character(.compareOperation(lapply(params$x, function(vv){ - unique(vv$x[[1]]$mcYear) - }), xyCompare))) - }, - value = { if(.initial) mcYear else NULL}, - .display = any(unlist(lapply(params$x, function(X){X$showMcYear}))) - ), - type = mwRadio(list("By time id"="detail", "Average" = "avg"), value = type), - dateRange = mwDateRange( - value = { - if(.initial) params$x[[1]]$dateRange - else NULL + params$x[[.id]]$plotFun(params$x[[.id]]$timeId, colAreaVar, sizeAreaVars, popupAreaVars, areaChartType, + uniqueScale, showLabels, labelAreaVar, + colLinkVar, sizeLinkVar, popupLinkVars, type, mcYear, .initial, .session, + .output) }, - min = params$x[[1]]$dateRange[1], - max = params$x[[1]]$dateRange[2],label = "Daterange" - ), - - Areas = mwGroup( - colAreaVar = mwSelect( - choices = { - if (mcYear == "average") { - c("none", - as.character(.compareOperation(lapply(params$x, function(vv){ - unique(vv$areaValColumnsSynt) - }), xyCompare)) - ) - }else{ - c("none", as.character(.compareOperation(lapply(params$x, function(vv){ - unique(vv$areaValColumns) - }), xyCompare))) - } - }, - value = { - if(.initial) colAreaVar - else NULL - }, - label = "Color" - ), - sizeAreaVars = mwSelect( - { - as.character(.compareOperation(lapply(params$x, function(vv){ - unique(vv$areaNumValColumns) - }), xyCompare)) - }, - value = { - if(.initial) sizeAreaVars - else NULL - }, label = "Size", multiple = TRUE), - miniPlot = mwGroup( + + mcYear = mwSelect(c("average", unique(x[[1]]$mcYear)), mcYear, .display = params$x[[.id]]$showMcYear), + type = mwRadio(list("By time id"="detail", "Average" = "avg"), value = type), + + Areas = mwGroup( + colAreaVar = mwSelect( + choices = { + if (mcYear == "average") c("none", params$x[[.id]]$areaValColumnsSynt) + else c("none", params$x[[.id]]$areaValColumns) + }, + value = colAreaVar, + label = "Color" + ), + sizeAreaVars = mwSelect(params$x[[.id]]$areaNumValColumns, sizeAreaVars, label = "Size", multiple = TRUE), areaChartType = mwSelect(list("bar chart" = "bar", "pie chart" = "pie", "polar (area)" = "polar-area", "polar (radius)" = "polar-radius"), - value = { - if(.initial) areaChartType - else NULL - }), - sizeMiniPlot = mwCheckbox(FALSE), + value = areaChartType, .display = length(sizeAreaVars) >= 2), uniqueScale = mwCheckbox(uniqueScale, label = "Unique scale", .display = length(sizeAreaVars) >= 2 && areaChartType != "pie"), showLabels = mwCheckbox(showLabels, label = "Show labels", .display = length(sizeAreaVars) >= 2), popupAreaVars = mwSelect( - choices = - { - if (mcYear == "average") { - c("none", - as.character(.compareOperation(lapply(params$x, function(vv){ - unique(vv$areaValColumnsSynt) - }), xyCompare)) - ) - }else{ - c("none", as.character(.compareOperation(lapply(params$x, function(vv){ - unique(vv$areaValColumns) - }), xyCompare))) - } - }, - value = { - if(.initial) popupAreaVars - else NULL + choices = { + if (mcYear == "average") c("none", params$x[[.id]]$areaValColumnsSynt) + else c("none", params$x[[.id]]$areaValColumns) }, + popupAreaVars, label = "Popup", multiple = TRUE ), labelAreaVar = mwSelect( - choices = { - if (mcYear == "average") { - c("none", - as.character(.compareOperation(lapply(params$x, function(vv){ - unique(vv$areaValColumnsSynt) - }), xyCompare)) - ) - }else{ - c("none", as.character(.compareOperation(lapply(params$x, function(vv){ - unique(vv$areaValColumns) - }), xyCompare))) - } + choices = { + if (mcYear == "average") c("none", params$x[[.id]]$areaValColumnsSynt) + else c("none", params$x[[.id]]$areaValColumns) }, - value = { - if(.initial) labelAreaVar - else NULL - }, label = "Label", + labelAreaVar, label = "Label", .display = length(sizeAreaVars) < 2 - ), - .display = any(sapply(params$x, function(p) {"areas" %in% names(p$x)})) + ) ), Links = mwGroup( - colLinkVar = mwSelect( - { - c("none", - as.character(.compareOperation(lapply(params$x, function(vv){ - unique(vv$linkValColums) - }), xyCompare))) - }, - value = { - if(.initial) colLinkVar - else NULL - }, label = "Color"), - sizeLinkVar = mwSelect({c("none", - as.character(.compareOperation(lapply(params$x, function(vv){ - unique(vv$linkNumValColumns) - }), xyCompare)) - )}, - value = { - if(.initial) sizeLinkVar - else NULL - }, label = "Width"), - popupLinkVars = mwSelect( { c("none", - as.character(.compareOperation(lapply(params$x, function(vv){ - unique(vv$linkValColums) - }), xyCompare))) - }, - value = { - if(.initial) popupLinkVars - else NULL - }, label = "Popup", multiple = TRUE), - .display = any(sapply(params$x, function(p) {"links" %in% names(p$x)})) + colLinkVar = mwSelect(c("none", params$x[[.id]]$linkValColums), colLinkVar, label = "Color"), + sizeLinkVar = mwSelect(c("none", params$x[[.id]]$linkNumValColumns), sizeLinkVar, label = "Width"), + popupLinkVars = mwSelect(params$x[[.id]]$linkValColums, popupLinkVars, label = "Popup", multiple = TRUE) ), - mapLayout = mwSharedValue(mapLayout), - main = mwText(main, label = "title"), - params = mwSharedValue({ - .getDataForComp(x_tranform, NULL, compare, compareOpts, - processFun = processFun, mapLayout = mapLayout) - }), + .viewer = "browser", .width = width, .height = height, - .compare = { - compare - }, - .compareOpts = { - compareOptions - }, - .return = function(w, e) {combineWidgets(w, title = main, width = width, height = height)}, - ... + .return = function(w, e) combineWidgets(w, title = main, width = width, height = height), + .compare = params$compare, + .compareOpts = params$compareOpts ) - + } } - - diff --git a/R/map_helpers.R b/R/map_helpers.R index 14322bf..4f1ba4c 100644 --- a/R/map_helpers.R +++ b/R/map_helpers.R @@ -29,8 +29,6 @@ #' @noRd .getColAndSize <- function(data, coords, mergeBy, mcy, t, colVar, sizeVar, popupVars, colorScaleOpts, labelVar = NULL) { - - if (mcy != "average") data <- data[J(as.numeric(mcy))] @@ -62,25 +60,13 @@ if (colVar != "none") { if (is.numeric(data[[colVar]])) { rangevar <- range(data[[colVar]]) - if(length(colorScaleOpts$breaks) > 1 ){ - if(min(rangevar) < min(colorScaleOpts$breaks)){ - colorScaleOpts$breaks <- c(min(rangevar), colorScaleOpts$breaks) - colorScaleOpts$colors <- c("noColor", colorScaleOpts$colors) - } - - if(max(rangevar) > max(colorScaleOpts$breaks)){ - colorScaleOpts$breaks <- c( colorScaleOpts$breaks, max(rangevar)) - colorScaleOpts$colors <- c( colorScaleOpts$colors, "noColor") - } - } - # Special case of FLOW LIN if (colVar == "FLOW LIN.") rangevar <- c(0, max(abs(rangevar))) if (rangevar[1] >= 0) { domain <- rangevar } else { - domain <- c(-min(rangevar), max(rangevar)) + domain <- c(-max(abs(rangevar)), max(abs(rangevar))) } if (colVar == "FLOW LIN.") colorScaleOpts$x <- abs(data[[colVar]]) @@ -133,7 +119,7 @@ timeStep, hourly = "%a %d %b %Y
%H:%M", daily = "%a %d %b %Y", - weekly = "W%V %Y", + weekly = "W%w %Y", monthly = "%b %Y", yearly = "%Y" ) @@ -159,12 +145,9 @@ .redrawCircles <- function(map, x, mapLayout, mcy, t, colAreaVar, sizeAreaVars, popupAreaVars, uniqueScale, showLabels, labelAreaVar, areaChartType, - options, sizeMiniPlot = FALSE) { + options) { if (is.null(x$areas)) return(map) - if (nrow(x$areas) == 0) return(map) - - timeStep <- attr(x, "timeStep") # Just in case, we do not want to accidentally modify the original map layout. @@ -176,7 +159,6 @@ options$areaColorScaleOpts, labelVar = labelAreaVar) ml$coords <- optsArea$coords - # Use default values if needed. if (is.null(optsArea$color)) optsArea$color <- options$areaDefaultCol @@ -231,41 +213,10 @@ } } - if(sizeMiniPlot) - { - if(is.matrix(optsArea$size)) - { - if(ncol(optsArea$size) > 1 ) - { - optsArea$Va <- rowSums(optsArea$size) - optsArea$VaP <- optsArea$Va / max(optsArea$Va) - fM <- 3 - optsArea$Ra <- 15 + (optsArea$VaP * fM * 30)/2 - } - } - } - - if(is.null(optsArea$Ra)){optsArea$Ra <- width} # Update areas - - #Apply colors defined in color.csv - if(is.null(options$areaChartColors)) - { - varS <- names(optsArea$maxSize) - colorDef <- colorsVars$colors[match(varS, colorsVars$Column)] - defCol <- c("#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", "#8c564b", - "e377c2", "#7f7f7f", "#bcbd22", "#17becf") - nbNa <- sum(is.na(colorDef)) - if(nbNa > 0) - { - colorDef[is.na(colorDef)] <- defCol[1:nbNa] - } - options$areaChartColors <- colorDef - } - map <- updateMinicharts(map, optsArea$coords$area, chartdata = optsArea$size, time = optsArea$coords$time, - maxValues = optsArea$maxSize, width = optsArea$Ra, + maxValues = optsArea$maxSize, width = width, height = options$areaMaxHeight, showLabels = showLabels, labelText = labels, type = areaChartType[[1]], @@ -314,8 +265,6 @@ .redrawLinks <- function(map, x, mapLayout, mcy, t, colLinkVar, sizeLinkVar, popupLinkVars, options) { if (is.null(x$links)) return(map) - if (nrow(x$links) == 0) return(map) - timeStep <- attr(x, "timeStep") @@ -348,7 +297,7 @@ labels = sizeLinkVar, digits = 2, supValues = optsLink$coords[, optsLink$popupVars, with = FALSE] - ), + ), opacity = 1) # Update the legend diff --git a/R/map_layout.R b/R/map_layout.R index eeab209..299f860 100644 --- a/R/map_layout.R +++ b/R/map_layout.R @@ -14,10 +14,8 @@ #' on the map. #' @param map #' An optional \code{\link[sp]{SpatialPolygons}} or -#' \code{\link[sp]{SpatialPolygonsDataFrame}} object. See \code{\link[spMaps]{getSpMaps}} +#' \code{\link[sp]{SpatialPolygonsDataFrame}} object. #' -#' @param map_builder \code{logical} Add inputs for build custom map ? Defaut to TRUE. -#' #' @return #' An object of class \code{mapLayout}. #' @@ -28,353 +26,179 @@ #' layout <- readLayout() #' ml <- mapLayout(layout) #' -#' # visualize mapLayout -#' plotMapLayout(ml) -#' #' # Save the result for future use #' save(ml, file = "ml.rda") -#' #' } #' #' @export -#' @import spMaps -#' -#' @seealso \code{\link{plotMapLayout}} -mapLayout <- function(layout, what = c("areas", "districts"), map = getSpMaps(), map_builder = TRUE) { - +#' +mapLayout <- function(layout, what = c("areas", "districts"), map = NULL) { what <- match.arg(what) - ui <- fluidPage( - changeCoordsUI("ml", map_builder = map_builder) - ) - - server <- function(input, output, session) { - callModule(changeCoordsServer, "ml", reactive(layout), what = reactive(what), - map = reactive(map), map_builder = map_builder, stopApp = TRUE) + if (what == "areas") { + coords <- copy(layout$areas) + info <- coords$area + links <- copy(layout$links) + } else { + coords <- copy(layout$districts) + info <- coords$district + links <- copy(layout$districtLinks) } - mapCoords <- shiny::runApp(shiny::shinyApp(ui = ui, server = server)) + links$x0 <- as.numeric(links$x0) + links$x1 <- as.numeric(links$x1) + links$y0 <- as.numeric(links$y0) + links$y1 <- as.numeric(links$y1) - mapCoords -} - -#' Visualize mapLayout output. -#' -#' @param mapLayout -#' object returned by function \code{\link{mapLayout}} -#' -#' @examples -#' -#' \dontrun{ -#' # Read the coordinates of the areas in the Antares interface, then convert it -#' # in a map layout. -#' layout <- readLayout() -#' ml <- mapLayout(layout) -#' -#' # visualize mapLayout -#' plotMapLayout(ml) -#' -#' } -#' -#' @export -#' -#' @seealso \code{\link{mapLayout}} -plotMapLayout <- function(mapLayout){ + mapCoords <- changeCoords(coords$x, coords$y, coords$color, info, map) + coords$x <- sp::coordinates(mapCoords)[, 1] + coords$y <- sp::coordinates(mapCoords)[, 2] - if(!is.null(mapLayout$all_coords)){ - coords <- data.frame(mapLayout$all_coords) - colnames(coords) <- gsub("^x$", "lon", colnames(coords)) - colnames(coords) <- gsub("^y$", "lat", colnames(coords)) - coords$info <- coords$area - } else if(is.null(mapLayout$all_coords)){ - coords <- data.frame(mapLayout$coords) - colnames(coords) <- gsub("^x$", "lon", colnames(coords)) - colnames(coords) <- gsub("^y$", "lat", colnames(coords)) - coords$info <- coords$area + if (what == "areas") { + links[coords, `:=`(x0 = x, y0 = y),on=c(from = "area")] + links[coords, `:=`(x1 = x, y1 = y),on=c(to = "area")] } else { - stop("No coordinates found in layout") + links[coords, `:=`(x0 = x, y0 = y),on=c(fromDistrict = "district")] + links[coords, `:=`(x1 = x, y1 = y),on=c(toDistrict = "district")] } - leafletDragPoints(coords, map = mapLayout$map, init = TRUE, draggable = FALSE) + if (!is.null(map)) { + coords$geoAreaId <- mapCoords$geoAreaId + coords <- coords[!is.na(coords$geoAreaId),] + + map <- map[coords$geoAreaId,] + } + + res <- list(coords = coords, links = links, map = map) + class(res) <- "mapLayout" + attr(res, "type") <- what + res } -# changeCoords Module UI function -changeCoordsUI <- function(id, map_builder = TRUE) { - # Create a namespace function using the provided id - ns <- NS(id) - - ref_map_table <- spMaps::getEuropeReferenceTable() - choices_map <- c("all", ref_map_table$code) - names(choices_map) <- c("all", ref_map_table$name) - - tagList( - fluidRow( - column(5, - if(map_builder){ - selectInput(ns("ml_countries"), "Countries : ", width = "100%", - choices = choices_map, selected = "all", multiple = TRUE) - } - ), - column(5, - if(map_builder){ - selectInput(ns("ml_states"), "States : ", width = "100%", - choices = choices_map, selected = NULL, multiple = TRUE) - } - ), - column(2, - if(map_builder){ - div(br(), actionButton(ns("set_map_ml"), "Set map"), align = "center") - } - ) - ), - fluidRow( - column(2, - div(br(), actionButton(ns("reset_ml"), "Re-Init layout"), align = "center") - - ), - column(width = 8, div(h3("Map Layout"), align = "center")), - column(2, - conditionalPanel( - condition = paste0("output['", ns("control_state"), "'] >= 2"), - div(br(), actionButton(ns("done"), "Done"), align = "center") - ) +#' Modify coordinates interactively +#' +#' This function helps to correct the coordinates of a set of spatial points by +#' creating an interactive map. Moreover, the function can be used to visually +#' associate points with polygons from a \code{\link[sp]{SpatialPolygons}} or +#' \code{\link[sp]{SpatialPolygonsDataFrame}} object. +#' +#' @param lon +#' Longitude of the points (x-axis) +#' @param lat +#' Latitude of the points (y-axis) +#' @param col +#' Vector of colors +#' @param info +#' A character vector that is displayed when one clicks on a marker. This helps +#' identify the points on the map. +#' @param map +#' A \code{\link[sp]{SpatialPolygons}} or +#' \code{\link[sp]{SpatialPolygonsDataFrame}} object +#' +#' @return +#' An object of class \code{\link[sp]{SpatialPoints}}. If parameter \code{map} +#' has been provided then the function returns a +#' \code{\link[sp]{SpatialPointsDataFrame}} with a column geoAreaId containing +#' the number of the polygon a point belongs to. +#' +#' @noRd +#' +changeCoords <- function(lon, lat, col = "blue", info = paste(lon, ",", lat), map = NULL) { + + points <- data.frame(lon = lon, lat = lat, oldLon = lon, oldLat = lat, + color = col, info = as.character(info), + stringsAsFactors = FALSE) + + # Find the bottom-left most and top right-most points + avgCoord <- rowMeans(points[, c("lon", "lat")]) + pt1 <- which.min(avgCoord) + pt2 <- which.max(avgCoord) + + # Keep a copy of the initial coordinates + points$oldLon <- points$lon + points$oldLat <- points$lat + + ui <- miniPage( + gadgetTitleBar("My Gadget"), + miniContentPanel( + fillRow( + flex = c(NA, 1), + tags$div( + style = "width:200px;", + tags$p(textOutput("order")), + htmlOutput("info"), + conditionalPanel( + condition = "input.state < 2", + imageOutput("preview", height="150px"), + tags$p(), + actionButton("state", "Next") + ) + ), + leafletDragPointsOutput("map", height = "100%") ) - ), - - hr(), - - fillRow( - flex = c(NA, 1), - tags$div( - style = "width:200px;", - tags$p(textOutput(ns("order"))), - htmlOutput(ns("info")), - conditionalPanel( - condition = paste0("output['", ns("control_state"), "'] < 2"), - imageOutput(ns("preview"), height="150px"), - tags$p(), - actionButton(ns("state"), "Next") - ) - ), - leafletDragPointsOutput(ns("map"), height = "700px") ) ) -} - -# changeCoords Module SERVER function -changeCoordsServer <- function(input, output, session, - layout, what = reactive("areas"), - map = reactive(NULL), map_builder = TRUE, stopApp = FALSE){ - - ns <- session$ns - - lfDragPoints <- reactiveValues(map = NULL, init = FALSE) - - current_state <- reactiveValues(state = -1) - output$control_state <- reactive({ - current_state$state - }) - - outputOptions(output, "control_state", suspendWhenHidden = FALSE) - - current_map <- reactive({ - if(!map_builder){ - map() - } else { - if(!is.null(map()) & input$set_map_ml == 0){ - map() - } else { - getSpMaps(countries = isolate(input$ml_countries), states = isolate(input$ml_states)) - } - } - }) - - data <- reactive({ - input$reset_ml - if(!is.null(layout())){ - if (what() == "areas") { - coords <- copy(layout()$areas) - info <- coords$area - links <- copy(layout()$links) - } else { - coords <- copy(layout()$districts) - info <- coords$district - links <- copy(layout()$districtLinks) - } - - links$x0 <- as.numeric(links$x0) - links$x1 <- as.numeric(links$x1) - links$y0 <- as.numeric(links$y0) - links$y1 <- as.numeric(links$y1) - - current_state$state <- 0 - - list(coords = coords, info = info, links = links) - } else { - NULL - } - }) - - data_points <- reactiveValues() - - observe({ - if(!is.null(data())){ - cur_points <- data.frame(lon = data()$coords$x, lat = data()$coords$y, - oldLon = data()$coords$x, oldLat = data()$coords$y, - color = data()$coords$color, info = as.character(data()$info), stringsAsFactors = FALSE) - isolate({ - data_points$points <- cur_points - - avgCoord <- rowMeans(data_points$points[, c("lon", "lat")]) - pt1 <- which.min(avgCoord) - pt2 <- which.max(avgCoord) - - data_points$points$lon[pt1] <- data_points$points$lat[pt1] <- 0 - - data_points$pt1 <- pt1 - data_points$pt2 <- pt2 - - }) - } - }) renderPreview <- function(pt) { renderPlot({ - points <- isolate(data_points$points) - if(!is.null(points)){ - col <- rep("#cccccc", nrow(points)) - col[pt] <- "red" - cex <- rep(1, nrow(points)) - cex[pt] <- 2 - par (mar = rep(0.1, 4)) - plot(points$oldLon, points$oldLat, bty = "n", xaxt = "n", yaxt = "n", - xlab = "", ylab = "", main = "", col = col, asp = 1, pch = 19, cex = cex) - } + col <- rep("#cccccc", nrow(points)) + col[pt] <- "red" + cex <- rep(1, nrow(points)) + cex[pt] <- 2 + par (mar = rep(0.1, 4)) + plot(points$oldLon, points$oldLat, bty = "n", xaxt = "n", yaxt = "n", + xlab = "", ylab = "", main = "", col = col, asp = 1, pch = 19, cex = cex) }) } - observeEvent(input$state, { - if(input$state > 0){ - current_state$state <- current_state$state + 1 - } - }) - - observeEvent(input$reset_ml, { - if(input$state >= 0){ - current_state$state <- 0 - } - }) - - observe({ - if (current_state$state == 0) { - lfDragPoints$map <- leafletDragPoints(data_points$points[data_points$pt1, ], isolate(current_map()), init = TRUE) - } - }) - - observe({ - if (current_state$state == 1) { - lfDragPoints$map <- leafletDragPoints(data_points$points[data_points$pt2, ]) - } - }) - - observe({ - if (current_state$state == 2) { - lfDragPoints$map <- leafletDragPoints(data_points$points[-c(data_points$pt1, data_points$pt2), ]) - } - }) - - observe({ - if(!is.null(input$map_init)){ - if(input$map_init){ - lfDragPoints$map <- leafletDragPoints(NULL, current_map(), reset_map = TRUE) - } - } - }) - - # Initialize outputs - output$map <- renderLeafletDragPoints({lfDragPoints$map}) - - coords <- reactive({ - coords <- matrix(input[[paste0("map", "_coords")]], ncol = 2, byrow = TRUE) - colnames(coords) <- c("lat", "lon") - as.data.frame(coords) - }) - - observe({ - if (current_state$state == 0) { - output$order <- renderText("Please place the following point on the map.") - output$info <- renderUI(HTML(data_points$points$info[data_points$pt1])) - output$preview <- renderPreview(data_points$pt1) - } else if (current_state$state == 1) { - isolate({ - data_points$points$lat[data_points$pt2] <- input[[paste0("map", "_mapcenter")]]$lat - data_points$points$lon[data_points$pt2] <- input[[paste0("map", "_mapcenter")]]$lng - output$info <- renderUI(HTML(data_points$points$info[data_points$pt2])) - output$preview <- renderPreview(data_points$pt2) - }) - } else if (current_state$state == 2) { - isolate({ - data_points$points <- .changeCoordinates(data_points$points, coords(), c(data_points$pt1, data_points$pt2)) - output$order <- renderText("Drag the markers on the map to adjust coordinates then click the 'Done' button") - output$info <- renderUI(HTML("

You can click on a marker to display information about the corresponding point.

")) - - }) - } - }) - - # get coord - cur_coords <- reactiveValues(data = NULL) - - # When the Done button is clicked, return a value - observeEvent(input$done, { - coords <- sp::SpatialPoints(coords()[, c("lon", "lat")], - proj4string = sp::CRS("+proj=longlat +datum=WGS84")) - map <- current_map() - if (!is.null(map)) { - map <- sp::spTransform(map, sp::CRS("+proj=longlat +datum=WGS84")) - map$geoAreaId <- 1:length(map) - coords$geoAreaId <- sp::over(coords, map)$geoAreaId - } - - # Put coords in right order - ord <- order(c(data_points$pt1, data_points$pt2, (1:length(coords))[-c(data_points$pt1, data_points$pt2)])) - mapCoords <- coords[ord,] - - final_coords <- data()$coords - final_links <- data()$links + server <- function(input, output, session) { + # Initialize outputs + points$lon[pt1] <- points$lat[pt1] <- 0 + output$map <- renderLeafletDragPoints({leafletDragPoints(points[pt1, ], map)}) + output$order <- renderText("Please place the following point on the map.") + output$info <- renderUI(HTML(points$info[pt1])) + output$preview <- renderPreview(pt1) - final_coords$x <- sp::coordinates(mapCoords)[, 1] - final_coords$y <- sp::coordinates(mapCoords)[, 2] + coords <- reactive({ + coords <- matrix(input$map_coords, ncol = 2, byrow = TRUE) + colnames(coords) <- c("lat", "lon") + as.data.frame(coords) + }) - if (what() == "areas") { - final_links[final_coords, `:=`(x0 = x, y0 = y),on=c(from = "area")] - final_links[final_coords, `:=`(x1 = x, y1 = y),on=c(to = "area")] - } else { - final_links[final_coords, `:=`(x0 = x, y0 = y),on=c(fromDistrict = "district")] - final_links[final_coords, `:=`(x1 = x, y1 = y),on=c(toDistrict = "district")] - } + observeEvent(input$state, { + if (input$state == 1) { + points$lat[pt2] <- input$map_mapcenter$lat + points$lon[pt2] <- input$map_mapcenter$lng + output$map <- renderLeafletDragPoints({leafletDragPoints(points[pt2, ])}) + output$info <- renderUI(HTML(points$info[pt2])) + output$preview <- renderPreview(pt2) + } else if (input$state == 2) { + points <- .changeCoordinates(points, coords(), c(pt1, pt2)) + output$map <- renderLeafletDragPoints({leafletDragPoints(points[-c(pt1, pt2), ])}) + output$order <- renderText("Drag the markers on the map to adjust coordinates then click the 'Done' button") + output$info <- renderUI(HTML("

You can click on a marker to display information about the corresponding point.

")) + } + }) - if (!is.null(map)) { - final_coords$geoAreaId <- mapCoords$geoAreaId - final_coords_map <- final_coords[!is.na(final_coords$geoAreaId),] - map <- map[final_coords_map$geoAreaId,] + # When the Done button is clicked, return a value + observeEvent(input$done, { + coords <- sp::SpatialPoints(coords()[, c("lon", "lat")], + proj4string = sp::CRS("+proj=longlat +datum=WGS84")) + if (!is.null(map)) { + map <- sp::spTransform(map, sp::CRS("+proj=longlat +datum=WGS84")) + map$geoAreaId <- 1:length(map) + coords$geoAreaId <- sp::over(coords, map)$geoAreaId + } - res <- list(coords = final_coords_map, links = final_links, map = map, all_coords = final_coords) - } else { - res <- list(coords = final_coords, links = final_links, map = map, all_coords = final_coords) - } - - class(res) <- "mapLayout" - attr(res, "type") <- what() - - cur_coords$data <- res - - if(stopApp){ - stopApp(res) - } - }) + # Put coords in right order + ord <- order(c(pt1, pt2, (1:length(coords))[-c(pt1, pt2)])) + coords <- coords[ord,] + + stopApp(coords) + }) + } - return(reactive(cur_coords$data)) + runGadget(ui, server, viewer = browserViewer()) } .changeCoordinates <- function(points, coords, pts = 1:nrow(points)) { @@ -438,8 +262,6 @@ changeCoordsServer <- function(input, output, session, #' be stored in a variable and modified with package #' \code{\link[leaflet]{leaflet}} #' -#' @method plot mapLayout -#' #' @examples #' \dontrun{ #' # Read the coordinates of the areas in the Antares interface, then convert it @@ -495,9 +317,7 @@ plot.mapLayout <- function(x, colAreas = x$coords$color, dataAreas = 1, } # Add custom elements - if(is.function(preprocess)){ - map <- preprocess(map) - } + map <- preprocess(map) # Add links if (links) { @@ -510,18 +330,17 @@ plot.mapLayout <- function(x, colAreas = x$coords$color, dataAreas = 1, if (areas) { areaChartType <- match.arg(areaChartType) - - # fix bug if set map wihout any intersection with areas...! - map <- tryCatch(addMinicharts(map, lng = x$coords$x, lat = x$coords$y, - chartdata = dataAreas, fillColor = colAreas, - showLabels = !is.null(labelArea), - labelText = labelArea, - width = areaMaxSize, - height = areaMaxHeight, - layerId = x$coords$area, - opacity = opacityArea, - labelMinSize = labelMinSize, - labelMaxSize = labelMaxSize), error = function(e) map) + + map <- addMinicharts(map, lng = x$coords$x, lat = x$coords$y, + chartdata = dataAreas, fillColor = colAreas, + showLabels = !is.null(labelArea), + labelText = labelArea, + width = areaMaxSize, + height = areaMaxHeight, + layerId = x$coords$area, + opacity = opacityArea, + labelMinSize = labelMinSize, + labelMaxSize = labelMaxSize) } diff --git a/R/mod_XY.R b/R/mod_XY.R deleted file mode 100644 index 4780ca4..0000000 --- a/R/mod_XY.R +++ /dev/null @@ -1,110 +0,0 @@ -# Copyright © 2016 RTE Réseau de transport d’électricité - -#' Make X-Y bockey plot, interactive version -#' -#' @param x optsH5 or list of optsH5 -#' @param xyCompare -#' Use when you compare studies, can be "union" or "intersect". If union, all -#' of mcYears in one of studies will be selectable. If intersect, only mcYears in all -#' studies will be selectable. -#' -#' -#' @examples -#' \dontrun{ -#' opts <- setSimulationPath("h5File") -#' modXY(opts) -#' modXY(list(opts, opts)) -#' -#' } -#' -#' @export -modXY <- function(x, xyCompare = c("union","intersect")) -{ - #remove notes - x_in <- timeSteph5 <- allVar <- NULL - transformFunction <- x_tranform <- dateRange <- variableX <- variableY <- paramsH5 <- mcYearh <- sharerequest <- NULL - compareOptions <- .compOpts(x, NULL) - compare <- NULL - if(compareOptions$ncharts>1)compare<-"" - xyCompare <- match.arg(xyCompare) - manipulateWidget( - { - transform <- NULL - if(transformFunction == "log"){ - transform <- log - } - dt <- list() - bock <- list() - if(!is.null(x_tranform[[.id]])) - { - try(plotXY(.selectByRange(x_tranform[[.id]], dateRange), - x = variableX,y = variableY, transform = transform), silent = TRUE) - } - }, - x = mwSharedValue({x}), - x_in = mwSharedValue({ - .giveListFormat(x) - }), - paramsH5 = mwSharedValue({ - paramsH5List <- .h5ParamList(X_I = x_in, xyCompare = xyCompare) - rhdf5::H5close() - paramsH5List - }), - H5request = mwGroup( - timeSteph5 = mwSelect(choices = paramsH5$timeStepS, - value = paramsH5$timeStepS[1], - label = "timeStep", - multiple = FALSE), - tables = mwSelect(choices = paramsH5[["tabl"]], - value = { - if(.initial) {paramsH5[["tabl"]]} else {NULL} - }, - label = "table", multiple = TRUE), - mcYearh = mwSelect(choices = c(paramsH5[["mcYearS"]]), - value = { - if(.initial){paramsH5[["mcYearS"]][1]}else{NULL} - }, - label = "mcYear", multiple = TRUE), - .display = {any(unlist(lapply(x_in, .isSimOpts)))} - ), - sharerequest = mwSharedValue({ - list(timeSteph5_l = timeSteph5, mcYearh_l = mcYearh, tables_l = tables) - }), - x_tranform = mwSharedValue({ - sapply(1:length(x_in),function(zz){ - dta <- mergeAllAntaresData(.loadH5Data(sharerequest, x_in[[zz]])) - dta$timeId <- .timeIdToDate(dta$timeId, timeSteph5, x_in[[zz]]) - dta - }, simplify = FALSE) - - }), - transformFunction = mwSelect(c("None", "log")), - allVar = mwSharedValue({.compareOperation( - {var = lapply(x_tranform, function(X){names(X)[unlist(lapply(X, class)%in%c("numeric", "integer"))]}) - var} - , xyCompare)}), - variableX = mwSelect(choices = { - variableY - allVar - }), - variableY = mwSelect(choices = allVar[!allVar%in%variableX]), - dateRange = mwDateRange( - value = { - if(.initial & !is.null(x_tranform)) range(x_tranform[[1]]$timeId) - else NULL - }, - min = if(!is.null(x_tranform))range(x_tranform[[1]]$timeId)[1], - max = if(!is.null(x_tranform))range(x_tranform[[1]]$timeId)[2],label = "Daterange" - ), - .compare = { - compare - }, - .compareOpts = { - compareOptions - } - ) -} - -.selectByRange <- function(X, dateRange){ - X[timeId>=dateRange[1] & timeId<=dateRange[2]] -} diff --git a/R/mod_rpart.R b/R/mod_rpart.R deleted file mode 100644 index 4fdb34a..0000000 --- a/R/mod_rpart.R +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright © 2016 RTE Réseau de transport d’électricité - -#' Make rpart from antares data -#' -#' @param data an antaresData after use of \code{\link[antaresProcessing]{mergeAllAntaresData}} -#' -#' @examples -#' \dontrun{ -#' setSimulationPath("Mystud", 1) -#' mydata <- readAntares(areas = "all", select = "OIL") -#' mydata <- mergeAllAntaresData(mydata) -#' modRpart(mydata) -#' } -#' -#' @export -modRpart <- function(data){ - visNetwork::visTreeEditor(data.frame(data)) -} \ No newline at end of file diff --git a/R/plot.R b/R/plot.R index b642240..a524da2 100644 --- a/R/plot.R +++ b/R/plot.R @@ -7,7 +7,7 @@ #' @param x #' Object of class \code{antaresData}. Alternatively, it can be a list of #' \code{antaresData} objects. In this case, one chart is created for each -#' object. Can also be opts object from h5 file or list of opts object from h5 file. +#' object. #' @param table #' Name of the table to display when \code{x} is an \code{antaresDataList} #' object. @@ -23,7 +23,6 @@ #' data, this parameter has to be the concatenation of the area name and the #' cluster name, separated by \code{" > "}. This is to prevent confusion #' when two clusters from different areas have the same name. -#' @param variable2Axe \code{character}, variables on second axis. #' @param type #' Type of plot to draw. "ts" creates a time series plot, "barplot" creates #' a barplot with one bar per element representing the average value of the @@ -52,7 +51,7 @@ #' @param aggregate #' When multiple elements are selected, should the data be aggregated. If #' "none", each element is represented separetly. If "mean" values are -#' averaged and if "sum" they are added. You can also compute mean ans sum by areas. +#' averaged and if "sum" they are added. #' @param colors #' Vector of colors #' @param ylab @@ -61,13 +60,9 @@ #' A list of parameters that control the creation of color scales. It is used #' only for heatmaps. See \code{\link{colorScaleOptions}}() for available #' parameters. -#' @param xyCompare -#' Use when you compare studies, can be "union" or "intersect". If union, all -#' of mcYears in one of studies will be selectable. If intersect, only mcYears in all -#' studies will be selectable. -#' @param highlight highlight curve when mouse over -#' @param secondAxis add second axis to graph -#' +#' +#' @param ... +#' currently unused #' @inheritParams prodStack #' #' @return @@ -84,100 +79,56 @@ #' If the input data has a annual time step, the function creates a barplot #' instead of a line chart. #' -#' compare argument can take following values : -#' \itemize{ -#' \item "mcYear" -#' \item "main" -#' \item "variable" -#' \item "type" -#' \item "confInt" -#' \item "elements" -#' \item "aggregate" -#' \item "legend" -#' \item "highlight" -#' \item "stepPlot" -#' \item "drawPoints" -#' \item "secondAxis" -#' } #' #' @examples #' \dontrun{ -#' setSimulationPath(path = path1) -#' mydata <- readAntares(areas = "all", timeStep = "hourly") -#' plot(x = mydata) +#' setSimulationPath() +#' mydata <- readAntares("all", timeStep = "monthly") +#' plot(mydata) +#' plot(mydata, "LOAD") #' #' # Plot only a few areas -#' plot(x = mydata[area %in% c("area1", "area2", "area3")]) +#' plot(mydata[area %in% c("area1", "area2", "area3")]) #' #' # If data contains detailed results, then the function adds a confidence #' # interval -#' dataDetailed <- readAntares(areas = "all", timeStep = "hourly", mcYears = 1:2) -#' plot(x = dataDetailed) +#' dataDetailed <- readAntares("all", timeStep = "monthly", synthesis = FALSE) +#' plot(dataDetailed) #' #' # If the time step is annual, the function creates a barplot instead of a #' # linechart -#' dataAnnual <- readAntares(areas = "all", timeStep = "annual") -#' plot(x = dataAnnual) +#' dataAnnual <- readAntares("all", timeStep = "Annual") +#' plot(dataAnnual) #' -#' # Compare two simulaitons #' # Compare the results of two simulations #' setSimulationPath(path1) -#' mydata1 <- readAntares(areas = "all", timeStep = "daily") +#' mydata1 <- readAntares("all", timeStep = "daily") #' setSimulationPath(path2) -#' mydata2 <- readAntares(areas = "all", timeStep = "daily") -#' -#' plot(x = list(mydata1, mydata2)) +#' mydata2 <- readAntares("all", timeStep = "daily") #' -#' # When you compare studies, you have 2 ways to defind inputs, union or intersect. -#' # for example, if you chose union and you have mcYears 1 and 2 in the first study -#' # and mcYears 2 and 3 in the second, mcYear input will be worth c(1, 2, 3) -#' # In same initial condition (study 1 -> 1,2 ans study 2 -> 2, 3) if you choose intersect, -#' # mcYear input will be wort 2. -#' # You must specify union or intersect with xyCompare argument (default union). -#' plot(x = list(mydata1[area %in% c("a", "b")], -#' mydata1[area %in% c("b", "c")]), xyCompare = "union") -#' plot(x = list(mydata1[area %in% c("a", "b")], -#' mydata1[area %in% c("b", "c")]), xyCompare = "intersect") +#' plot(mydata1, mydata2) #' -#' # Compare data in a single simulation #' # Compare two periods for the same simulation -#' plot(x = mydata1, compare = "dateRange") +#' plot(mydata1, compare = "dateRange") #' #' # Compare two Monte-Carlo scenarios -#' detailedData <- readAntares(areas = "all", mcYears = "all") -#' plot(x = detailedData, .compare = "mcYear") -#' -#' # Use h5 for dynamic request / exploration in a study -#' # Set path of simulaiton -#' setSimulationPath(path = path1) -#' -#' # Convert your study in h5 format -#' writeAntaresH5(path = mynewpath) -#' -#' # Redefine sim path with h5 file -#' opts <- setSimulationPath(path = mynewpath) -#' plot(x = opts) -#' -#' # Compare elements in a single study -#' plot(x = opts, .compare = "mcYear") -#' # Compare 2 studies -#' plot(x = list(opts, opts2)) +#' detailedData <- readAntares("all", mcYears = "all") +#' plot(detailedData[mcYear == 1], detailedData[mcYear == 2]) #' +#' # To do the same thing, with antaresDataList objects, one can use 'subset' +#' detailedData <- readAntares(areas = "all" links = "all", mcYears = "all") +#' plot(subset(detailedData, mcYears = 1), subset(detailedData, mcYears = 2)) #' } #' -#' -#' -#' #' @export -tsPlot <- function(x, table = NULL, variable = NULL, elements = NULL, - variable2Axe = NULL, +tsPlot <- function(x, y = NULL, table = NULL, variable = NULL, elements = NULL, mcYear = "average", type = c("ts", "barplot", "monotone", "density", "cdf", "heatmap"), dateRange = NULL, confInt = 0, minValue = NULL, maxValue = NULL, - aggregate = c("none", "mean", "sum", "mean by areas", "sum by areas"), + aggregate = c("none", "mean", "sum"), compare = NULL, compareOpts = list(), interactive = getInteractivity(), @@ -187,51 +138,12 @@ tsPlot <- function(x, table = NULL, variable = NULL, elements = NULL, legend = TRUE, legendItemsPerRow = 5, colorScaleOpts = colorScaleOptions(20), - width = NULL, height = NULL, xyCompare = c("union","intersect"), - h5requestFiltering = list(), highlight = FALSE, stepPlot = FALSE, drawPoints = FALSE, - secondAxis = FALSE, - timeSteph5 = "hourly", - mcYearh5 = NULL, - tablesh5 = c("areas", "links"),...) { - + width = NULL, height = NULL, ...) { - if(!is.null(compare) && !interactive){ - stop("You can't use compare in no interactive mode") - } - - #Check compare - .validCompare(compare, c("mcYear", "main", "variable", "type", "confInt", "elements", "aggregate", "legend", - "highlight", "stepPlot", "drawPoints", "secondAxis")) - - if(is.list(compare)){ - if("secondAxis" %in% names(compare)){ - compare <- c(compare, list(variable2Axe = NULL)) - } - } else if(is.vector(compare)){ - if("secondAxis" %in% compare){ - compare <- c(compare, "variable2Axe") - } - } - - xyCompare <- match.arg(xyCompare) type <- match.arg(type) aggregate <- match.arg(aggregate) colorScaleOpts <- do.call(colorScaleOptions, colorScaleOpts) - init_elements <- elements - init_dateRange <- dateRange - - if(!is.null(compare) && "list" %in% class(x)){ - if(length(x) == 1) x <- list(x[[1]], x[[1]]) - } - if(!is.null(compare) && ("antaresData" %in% class(x) | "simOptions" %in% class(x))){ - x <- list(x, x) - } - # .testXclassAndInteractive(x, interactive) - - h5requestFiltering <- .convertH5Filtering(h5requestFiltering = h5requestFiltering, x = x) - - # Generate a group number for dygraph objects if (!("dateRange" %in% compare)) { group <- sample(1e9, 1) @@ -239,443 +151,188 @@ tsPlot <- function(x, table = NULL, variable = NULL, elements = NULL, group <- NULL } - compareOptions <- .compOpts(x, compare) - if(is.null(compare)){ - if(compareOptions$ncharts > 1){ - compare <- list() + # Preprocess data for comparison + tmp <- .getDataForComp(x, y, compare, compareOpts) + x <- tmp$x + compare <- tmp$compare + compareOpts <- tmp$compareOpts + + timeStep <- attr(x[[1]], "timeStep") + opts <- simOptions(x[[1]]) + + .prepareParams <- function(x) { + idCols <- .idCols(x) + + dt <- x[, .( + timeId = timeId, + time = .timeIdToDate(timeId, timeStep, simOptions(x)), + value = 0) + ] + + if ("cluster" %in% idCols) { + dt$element <- paste(x$area, x$cluster, sep = " > ") + } else if ("district" %in% idCols) { + dt$element <- x$district + } else if ("link" %in% idCols) { + dt$element <- x$link + } else if ("area" %in% idCols) { + dt$element <- x$area + } else stop("No Id column") + + if ("mcYear" %in% names(x) && length(unique(x$mcYear)) > 1) { + dt$mcYear <- x$mcYear } + + dataDateRange <- as.Date(range(dt$time)) + if (is.null(dateRange) || length(dateRange) < 2) dateRange <- dataDateRange + + uniqueElem <- sort(as.character(unique(dt$element))) + if (is.null(elements)) { + elements <- uniqueElem + if (length(elements) > 5) elements <- elements[1:5] + } + + list( + dt = dt, + idCols = idCols, + valueCols = setdiff(names(x), idCols), + showConfInt = !is.null(x$mcYear) && length(unique(x$mcYear) > 1), + dataDateRange = dataDateRange, + dateRange = dateRange, + uniqueElem = uniqueElem, + uniqueMcYears = unique(x$mcYear), + elements = elements + ) } + + params <- lapply(x, function(o) lapply(o, .prepareParams)) - processFun <- function(x, elements = NULL, dateRange = NULL) { - assert_that(inherits(x, "antaresData")) - x <- as.antaresDataList(x) + # Function that generates the desired graphic. + plotFun <- function(table, mcYear, id, variable, elements, type, confInt, dateRange, + minValue, maxValue, aggregate, legend) { - lapply(x, function(x) { - idCols <- .idCols(x) - valueCols <- setdiff(names(x), idCols) - timeStep <- attr(x, "timeStep") - opts <- simOptions(x) - - dt <- x[, .( - timeId = timeId, - time = .timeIdToDate(timeId, attr(x, "timeStep"), simOptions(x)), - value = 0) - ] - - if ("cluster" %in% idCols) { - dt$element <- paste(x$area, x$cluster, sep = " > ") - } else if ("district" %in% idCols) { - dt$element <- x$district - } else if ("link" %in% idCols) { - dt$element <- x$link - } else if ("area" %in% idCols) { - dt$element <- x$area - } else stop("No Id column") - - if ("mcYear" %in% names(x)) { - dt$mcYear <- x$mcYear - } - - dataDateRange <- as.Date(range(dt$time)) - if (is.null(dateRange) || length(dateRange) < 2) dateRange <- dataDateRange - - uniqueElem <- sort(as.character(unique(dt$element))) - if (is.null(elements)) { - elements <- uniqueElem - # if (length(elements) > 5) elements <- elements[1:5] - } - - # Function that generates the desired graphic. - plotFun <- function(mcYear, id, variable, variable2Axe, elements, type, confInt, dateRange, - minValue, maxValue, aggregate, legend, highlight, stepPlot, drawPoints, main) { - if (is.null(variable)) variable <- valueCols[1] - if (is.null(dateRange)) dateRange <- dateRange - if (is.null(type) || !variable %in% names(x)) { - return(combineWidgets()) - } - if(variable[1] == "No Input") {return(combineWidgets("No data"))} - dt <- .getTSData( - x, dt, - variable = c(variable, variable2Axe), elements = elements, - uniqueElement = uniqueElem, - mcYear = mcYear, dateRange = dateRange, aggregate = aggregate - ) - - if (nrow(dt) == 0) return(combineWidgets("No data")) - - if(type == "ts"){ - if(!is.null(dateRange)) - { - if(dt$time[1] > dateRange[1]){ - dt <- dt[c(NA, 1:nrow(dt))] - dt$time[1] <- dateRange[1] - } - nrowTp <- nrow(dt) - if(dt$time[nrowTp] < dateRange[2]){ - dt <- dt[c(1:nrow(dt), NA)] - dt$time[nrowTp + 1] <- dateRange[2] - } - } - - } - - f <- switch(type, - "ts" = .plotTS, - "barplot" = .barplot, - "monotone" = .plotMonotone, - "density" = .density, - "cdf" = .cdf, - "heatmap" = .heatmap, - stop("Invalid type") - ) - - variable2Axe <- apply(expand.grid(elements, variable2Axe), 1, function(X){paste(X, collapse = " __ ")}) - - - f( - dt, - timeStep = timeStep, - variable = variable, - variable2Axe = variable2Axe, - confInt = confInt, - minValue = minValue, - maxValue = maxValue, - colors = colors, - main = main, - ylab = if(length(ylab) == 1) ylab else ylab[id], - legend = legend, - legendItemsPerRow = legendItemsPerRow, - width = width, - height = height, - opts = opts, - colorScaleOpts = colorScaleOpts, - group = group, - highlight = highlight, - stepPlot = stepPlot, - drawPoints = drawPoints - ) - + if (is.null(variable)) variable <- params[[id]][[table]]$valueCols[1] + if (is.null(dateRange)) dateRange <- params[[id]][[table]]$dateRange + if (is.null(type) || is.null(table) || !variable %in% names(x[[id]][[table]])) { + return(combineWidgets()) + } + if (length(elements) == 0) { + return(combineWidgets("Choose at least one element")) + } + + dt <- params[[id]][[table]]$dt + dt$value <- x[[id]][[table]][, get(variable)] + + if (!is.null(mcYear) && mcYear != "average") { + mcy <- mcYear # Just to avoid name confusion in the next line + dt <- dt[mcYear == mcy] + } + + if (length(elements) == 0) { + elements <- params[[id]][[table]]$uniqueElem[1:5] + } + if (!"all" %in% elements) dt <- dt[element %in% elements] + dt <- dt[as.Date(time) %between% dateRange] + + if (nrow(dt) == 0) return(combineWidgets()) + + if (aggregate != "none" && length(params[[id]][[table]]$uniqueElem) > 1) { + if (aggregate == "mean") { + dt <- dt[, .(element = as.factor(variable), value = mean(value)), + by = c(.idCols(dt))] + } else if (aggregate == "sum") { + dt <- dt[, .(element = as.factor(variable), value = sum(value)), + by = c(.idCols(dt))] } - list( - plotFun = plotFun, - dt = dt, - x = x, - idCols = idCols, - valueCols = valueCols, - showConfInt = !is.null(x$mcYear) && length(unique(x$mcYear) > 1), - dataDateRange = dataDateRange, - dateRange = dateRange, - uniqueElem = uniqueElem, - uniqueMcYears = unique(x$mcYear), - elements = elements, - timeStep = timeStep, - opts = opts - ) - }) + } + + f <- switch(type, + "ts" = .plotTS, + "barplot" = .barplot, + "monotone" = .plotMonotone, + "density" = .density, + "cdf" = .cdf, + "heatmap" = .heatmap, + stop("Invalid type") + ) + f( + dt, + timeStep = timeStep, + variable = variable, + confInt = confInt, + minValue = minValue, + maxValue = maxValue, + colors = colors, + main = if(length(main) == 1) main else main[id], + ylab = if(length(ylab) == 1) ylab else ylab[id], + legend = legend, + legendItemsPerRow = legendItemsPerRow, + width = width, + height = height, + opts = opts, + colorScaleOpts = colorScaleOpts, + group = group + ) + } + if (is.null(table)) table <- names(params[[1]])[1] + if (is.null(mcYear)) mcYear <- "average" # If not in interactive mode, generate a simple graphic, else create a GUI # to interactively explore the data if (!interactive) { - - - x <- .cleanH5(x, timeSteph5, mcYearh5, tablesh5, h5requestFiltering) - params <- .transformDataForComp(.giveListFormat(x), compare, compareOpts, - processFun = processFun, - elements = elements, dateRange = dateRange) - - # paramCoe <- .testParamsConsistency(params = params, mcYear = mcYear) - # mcYear <- paramCoe$mcYear - if (is.null(table)) table <- names(params$x[[1]])[1] - if (is.null(mcYear)) mcYear <- "average" - L_w <- lapply(params$x, function(X){ - X[[table]]$plotFun(mcYear, 1, variable, variable2Axe, elements, type, confInt, dateRange, - minValue, maxValue, aggregate, legend, highlight, stepPlot, drawPoints, main) - }) - return(combineWidgets(list = L_w)) - + return(plotFun(table, mcYear, 1, variable, elements, type, confInt, dateRange, + minValue, maxValue, aggregate, legend)) } typeChoices <- c("time series" = "ts", "barplot", "monotone", "density", "cdf", "heatmap") - ##remove notes - table <- NULL - x_in <- NULL - paramsH5 <- NULL - timeSteph5 <- NULL - mcYearH5 <- NULL - sharerequest <- NULL - timeStepdataload <- NULL - x_tranform <- NULL - - manipulateWidget({ - .tryCloseH5() - if(.id <= length(params$x)){ - - if(length(variable) == 0){return(combineWidgets(paste0("Please select some variables")))} - - if(length(elements) == 0){return(combineWidgets(paste0("Please select some elements")))} - - if(length(params[["x"]][[max(1,.id)]]) == 0){return(combineWidgets(paste0("No data")))} - - if(is.null(params[["x"]][[max(1,.id)]][[table]])){return(combineWidgets(paste0("Table ", table, " not exists in this study")))} - - if(!secondAxis){ - variable2Axe <- NULL - } else { - aggregate <- "none" - } - widget <- params[["x"]][[max(1,.id)]][[table]]$plotFun(mcYear, .id, variable, variable2Axe, elements, type, confInt, - dateRange, minValue, maxValue, aggregate, legend, - highlight, stepPlot, drawPoints, main) - controlWidgetSize(widget) - } else { - combineWidgets("No data for this selection") - } - }, - x = mwSharedValue({x}), - - # #Output - # outPutGraph = mwSharedValue({ - # ls() - # }), - - - x_in = mwSharedValue({ - .giveListFormat(x) - }), - - h5requestFiltering = mwSharedValue({h5requestFiltering}), - - paramsH5 = mwSharedValue({ - .h5ParamList(X_I = x_in, xyCompare = xyCompare, h5requestFilter = h5requestFiltering) - }), - - - H5request = mwGroup( - timeSteph5 = mwSelect(choices = paramsH5$timeStepS, - value = paramsH5$timeStepS[1], - label = "timeStep", - multiple = FALSE + manipulateWidget( + plotFun(table, mcYear, .id, variable, elements, type, confInt, dateRange, minValue, + maxValue, aggregate, legend), + + table = mwSelect(names(params[[.id]]), value = table, .display = length(params[[.id]]) > 1), + mcYear = mwSelect( + choices = c("average", params[[.id]][[table]]$uniqueMcYears) , + mcYear, + .display = params[[.id]][[table]]$showConfInt ), - tables = mwSelect(choices = paramsH5[["tabl"]], - value = { - if(.initial) {paramsH5[["tabl"]][1]}else{NULL} - }, - label = "table", multiple = TRUE + variable = mwSelect( + choices = params[[.id]][[table]]$valueCols, + value = variable ), - mcYearH5 = mwSelect(choices = c(paramsH5[["mcYearS"]]), - value = { - if(.initial){paramsH5[["mcYearS"]][1]}else{NULL} - }, - label = "mcYear", multiple = TRUE + type = mwSelect( + choices = { + if (timeStep == "annual") "barplot" + else if (timeStep %in% c("hourly", "daily")) typeChoices + else typeChoices[1:5] + }, + value = type, + .display = timeStep != "annual" ), - .display = { - any(unlist(lapply(x_in, .isSimOpts))) - }), - - sharerequest = mwSharedValue({ - list(timeSteph5_l = timeSteph5, mcYearh_l = mcYearH5, tables_l = tables) - }), - - x_tranform = mwSharedValue({ - dataInApp <- sapply(1:length(x_in),function(zz){ - .loadH5Data(sharerequest, x_in[[zz]], h5requestFilter = paramsH5$h5requestFilter[[zz]]) - }, simplify = FALSE) - dataInApp - }), - - table = mwSelect( - { - if(!is.null(params)){ - out <- as.character(.compareOperation( - lapply(params$x, function(vv){ - unique(names(vv)) - }), xyCompare)) - if(length(out) > 0){out}else{"No Input"} - } - }, - value = { - if(.initial) table - else NULL - }, .display = length(as.character(.compareOperation( - lapply(params$x, function(vv){ - unique(names(vv)) - }), xyCompare))) > 1 - ), - - mcYear = mwSelect( - choices = { - c("average", if(!is.null(params)){ - as.character(.compareOperation(lapply(params$x, function(vv){ - unique(vv[[table]]$uniqueMcYears) - }), xyCompare)) - }) - }, - value = { - if(.initial) "average" - else NULL - }, multiple = FALSE - ), - - variable = mwSelect( - choices = { - if(!is.null(params)){ - out <- as.character(.compareOperation(lapply(params$x, function(vv){ - unique(vv[[table]]$valueCols) - }), xyCompare)) - if(length(out) > 0){out} else {"No Input"} - } - }, - value = { - if(.initial) as.character(.compareOperation(lapply(params$x, function(vv){ - unique(vv[[table]]$valueCols) - }), xyCompare))[1] - else NULL - }, multiple = TRUE - ), - - secondAxis = mwCheckbox(secondAxis), - variable2Axe = mwSelect(label = "Variables 2nd axis", - choices = { - if(!is.null(params)){ - out <- as.character(.compareOperation(lapply(params$x, function(vv){ - unique(vv[[table]]$valueCols) - }), xyCompare)) - out <- out[!out%in%variable] - if(length(out) > 0){out} else {"No Input"} - } - }, - value = { - if(.initial) NULL - else NULL - }, multiple = TRUE, .display = secondAxis - ), - type = mwSelect( - choices = { - if (timeStepdataload == "annual") "barplot" - else if (timeStepdataload %in% c("hourly", "daily")) typeChoices - else typeChoices[1:5] - }, - value = { - if(.initial) type - else NULL - }, - .display = timeStepdataload != "annual" - ), - - dateRange = mwDateRange(value = { - if(.initial){ - res <- NULL - if(!is.null(params) & ! is.null(table)){ - res <- c(.dateRangeJoin(params = params, xyCompare = xyCompare, "min", tabl = table), - .dateRangeJoin(params = params, xyCompare = xyCompare, "max", tabl = table)) - if(any(is.infinite(c(res)))) - {res <- NULL} - } - ##Lock 7 days for hourly data - if(!is.null(params$x[[1]][[table]]$timeStep)) - { - if(params$x[[1]][[table]]$timeStep == "hourly"){ - if(params$x[[1]][[table]]$dateRange[2] - params$x[[1]][[table]]$dateRange[1]>7){ - res[1] <- params$x[[1]][[table]]$dateRange[2] - 7 - } - } - - } - - res - }else{NULL} - }, - min = { - if(!is.null(params) & ! is.null(table)){ - R <- .dateRangeJoin(params = params, xyCompare = xyCompare, "min", tabl = table) - if(is.infinite(R)){NULL}else{R} - } - }, - max = { - if(!is.null(params) & ! is.null(table)){ - R <- .dateRangeJoin(params = params, xyCompare = xyCompare, "max", tabl = table) - if(is.infinite(R)){NULL}else{R} - } - }, - .display = timeStepdataload != "annual" - ), - - confInt = mwSlider(0, 1, confInt, step = 0.01, - label = "confidence interval", - .display = params$x[[max(1,.id)]][[table]]$showConfInt & mcYear == "average" - ), - - minValue = mwNumeric(minValue, "min value", - .display = type %in% c("density", "cdf") - ), - - maxValue = mwNumeric(maxValue, "max value", - .display = type %in% c("density", "cdf") - ), - - elements = mwSelect( - choices = { - c( if(!is.null(params)){ - as.character(.compareOperation(lapply(params$x, function(vv){ - unique(vv[[table]]$uniqueElem) - }), xyCompare)) - }) - }, - value = { - if(.initial) {as.character(.compareOperation(lapply(params$x, function(vv){ - unique(vv[[table]]$uniqueElem) - }), xyCompare))[1]} - }, - multiple = TRUE - ), - - aggregate = mwSelect(c("none", "mean", "sum", "mean by areas", "sum by areas"), - value ={ - if(.initial) aggregate - else NULL - }, .display = !secondAxis - ), - - legend = mwCheckbox(legend, .display = type %in% c("ts", "density", "cdf")), - highlight = mwCheckbox(highlight), - stepPlot = mwCheckbox(stepPlot), - drawPoints = mwCheckbox(drawPoints), - timeStepdataload = mwSharedValue({ - attributes(x_tranform[[1]])$timeStep - }), - - main = mwText(main, label = "title"), - - params = mwSharedValue({ - .transformDataForComp(x_tranform, compare, compareOpts, processFun = processFun, - elements = init_elements, dateRange = init_dateRange) - }), - - .compare = { - compare - }, - .compareOpts = { - compareOptions - }, - ... + dateRange = mwDateRange( + value = params[[1]][[table]]$dateRange, + min = params[[.id]][[table]]$dataDateRange[1], + max = params[[.id]][[table]]$dataDateRange[2], + .display = timeStep != "annual" + ), + confInt = mwSlider(0, 1, confInt, step = 0.01, label = "confidence interval", + .display = params[[.id]][[table]]$showConfInt & mcYear == "average"), + minValue = mwNumeric(minValue, "min value", .display = type %in% c("density", "cdf")), + maxValue = mwNumeric(maxValue, "max value", .display = type %in% c("density", "cdf")), + elements = mwSelect( + choices = c("all", params[[.id]][[table]]$uniqueElem), + value = elements, + multiple = TRUE + ), + aggregate = mwSelect(c("none", "mean", "sum"), aggregate), + legend = mwCheckbox(legend, .display = type %in% c("ts", "density", "cdf")), + .compare = compare, + .compareOpts = compareOpts ) + } - #' @export #' @rdname tsPlot -#' @method plot antaresData plot.antaresData <- tsPlot - -#' @export -#' @rdname tsPlot -#' @method plot simOptions -plot.simOptions <- tsPlot - -#' @export -#' @rdname tsPlot -#' @method plot list -plot.list <- tsPlot - diff --git a/R/plot_XY.R b/R/plot_XY.R deleted file mode 100644 index e002895..0000000 --- a/R/plot_XY.R +++ /dev/null @@ -1,49 +0,0 @@ -# Copyright © 2016 RTE Réseau de transport d’électricité - -#' Plot density between X et Y with rbokeh -#' -#' This function take somes arguments from rbokeh and make plot. -#' -#' @param data \code{data.frame} can be antaresData object -#' @param x \code{character}, x variable -#' @param y \code{character}, y variable -#' @param precision \code{numeric} precision for plot -#' @param sizeOnCount \code{boolean}, should addapt size of object based on count -#' @param outLine \code{boolean}, add outline on your shape -#' @param transform \code{funciton}, transform function apply on count (by cells), can be log -#' -#' @examples -#' \dontrun{ -#' -#' setSimulationPath("myStudy") -#' myData <- readAntares() -#' -#' plotXY(myData, "NODU", "LOAD", precision = 50, -#' sizeOnCount = FALSE) -#' -#' myData <- readAntares(areas = "all", links = "all") -#' myData <- mergeAllAntaresData(myData) -#' plotXY(myData, "OP. COST_max_b", "OP. COST_max_c", precision = 50, -#' sizeOnCount = FALSE) -#' -#' -#' } -#' -#' @export -plotXY <- function(data, x, y, precision = 30, sizeOnCount = FALSE, outLine = TRUE, - transform = NULL) -{ - if(!requireNamespace("rbokeh")){ - stop("You should install 'rbokeh' library") - } - if(!"data.frame"%in%class(data)){ - stop("data should be a data.frame") - } - - suppressWarnings(p <- rbokeh::figure() %>% - rbokeh::ly_hexbin(x, y, data, xbins = precision, - style = ifelse(sizeOnCount,"lattice", "colorramp"), - palette = c("Spectral10"), line = !outLine, trans = transform)) - - p -} diff --git a/R/plot_barplot.R b/R/plot_barplot.R index d62e8a5..0a9d731 100644 --- a/R/plot_barplot.R +++ b/R/plot_barplot.R @@ -4,7 +4,7 @@ #' value over time steps. #' #' @noRd -#' +#' .barplot <- function(dt, timeStep, variable, confInt = 0, maxValue, colors = NULL, main = NULL, @@ -32,13 +32,11 @@ dt <- dt[, .getConfInt(value), by = .(element)] } } - # print(dt) - dt[,"element" := as.character(element)] - variable <- paste0(variable, collapse = " ; ") + if (is.null(ylab)) ylab <- variable - if (is.null(main) | isTRUE(all.equal("", main))) main <- paste("Comparison of", variable) + if (is.null(main)) main <- paste("Comparison of", variable) - g <- plot_ly(dt, textfont = list(color = '#000000')) %>% + g <- plot_ly(dt) %>% config(displayModeBar = FALSE) %>% layout(title = main, yaxis = list(title = ylab)) @@ -56,8 +54,6 @@ ) ) } - g <- g %>% add_text(x = ~element, y = ~value, text = ~round(value, 2))%>% - layout(showlegend = FALSE) combineWidgets(g, width = width, height = height) } diff --git a/R/plot_heatmap.R b/R/plot_heatmap.R index 76fcc2d..b5aee77 100644 --- a/R/plot_heatmap.R +++ b/R/plot_heatmap.R @@ -108,7 +108,6 @@ res } - variable <- paste0(variable, collapse = " ; ") if (is.null(ylab)) ylab <- variable plot_ly(x) %>% config(displayModeBar = FALSE) %>% diff --git a/R/plot_stats.R b/R/plot_stats.R index 1e29415..355e08a 100644 --- a/R/plot_stats.R +++ b/R/plot_stats.R @@ -1,5 +1,5 @@ -.plotMonotone <- function(dt, timeStep, variable, variable2Axe = NULL, confInt = NULL, maxValue, - main = NULL, ylab = NULL, highlight = FALSE, stepPlot = FALSE, drawPoints = FALSE, ...) { +.plotMonotone <- function(dt, timeStep, variable, confInt = NULL, maxValue, + main = NULL, ylab = NULL, ...) { uniqueElements <- sort(unique(dt$element)) plotConfInt <- FALSE @@ -29,17 +29,15 @@ } } - variable <- paste0(variable, collapse = " ; ") if (is.null(ylab)) ylab <- variable - if (is.null(main) | isTRUE(all.equal("", main))) main <- paste("Monotone of", variable) + if (is.null(main)) main <- paste("Monotone of", variable) - .plotStat(dt, ylab = ylab, main = main, uniqueElements = uniqueElements, variable2Axe = variable2Axe, - highlight = highlight, stepPlot = stepPlot, drawPoints = drawPoints, ...) + .plotStat(dt, ylab = ylab, main = main, uniqueElements = uniqueElements, ...) } -.density <- function(dt, timeStep, variable, variable2Axe = NULL, minValue = NULL, maxValue = NULL, - main = NULL, ylab = NULL, highlight = FALSE, stepPlot = FALSE, drawPoints = FALSE, ...) { +.density <- function(dt, timeStep, variable, minValue = NULL, maxValue = NULL, + main = NULL, ylab = NULL, ...) { uniqueElements <- sort(unique(dt$element)) @@ -53,17 +51,15 @@ dt <- dt[, .getDensity(value), by = element] - variable <- paste0(variable, collapse = " ; ") if (is.null(ylab)) ylab <- "Density" - if (is.null(main) | isTRUE(all.equal("", main))) main <- paste("Density of", variable) + if (is.null(main)) main <- paste("Density of", variable) - .plotStat(dt, ylab = ylab, main = main, uniqueElements = uniqueElements,variable2Axe = variable2Axe, - highlight = highlight, stepPlot = stepPlot, drawPoints = drawPoints,...) + .plotStat(dt, ylab = ylab, main = main, uniqueElements = uniqueElements, ...) } -.cdf <- function(dt, timeStep, variable, variable2Axe = NULL, minValue = NULL, maxValue = NULL, - main = NULL, ylab = NULL, highlight = FALSE, stepPlot = FALSE, drawPoints = FALSE, ...) { +.cdf <- function(dt, timeStep, variable, minValue = NULL, maxValue = NULL, + main = NULL, ylab = NULL, ...) { uniqueElements <- sort(unique(dt$element)) @@ -76,12 +72,10 @@ dt <- dt[, .getCDF(value), by = element] - variable <- paste0(variable, collapse = " ; ") if (is.null(ylab)) ylab <- "Proportion of time steps" - if (is.null(main) | isTRUE(all.equal("", main))) main <- paste("Cumulated distribution of", variable) + if (is.null(main)) main <- paste("Cumulated distribution of", variable) - .plotStat(dt, ylab = ylab, main = main, uniqueElements = uniqueElements, variable2Axe = variable2Axe, - highlight = highlight, stepPlot = stepPlot, drawPoints = drawPoints, ...) + .plotStat(dt, ylab = ylab, main = main, uniqueElements = uniqueElements, ...) } @@ -113,8 +107,7 @@ .plotStat <- function(dt, ylab, main, colors, uniqueElements, legend, legendItemsPerRow, width, height, - plotConfInt = FALSE, highlight = FALSE, - stepPlot = FALSE, drawPoints = FALSE,variable2Axe = NULL, ...) { + plotConfInt = FALSE, ...) { dt <- dcast(dt, x ~ element, value.var = "y") if (is.null(colors)) { @@ -131,9 +124,7 @@ gridLineColor = gray(0.8), axisLineColor = gray(0.6), axisLabelColor = gray(0.6), - labelsKMB = TRUE, - stepPlot = stepPlot, - drawPoints = drawPoints + labelsKMB = TRUE ) %>% dyAxis("y", label = ylab, pixelsPerLabel = 60) %>% dyLegend(show = "never") %>% @@ -142,31 +133,9 @@ unhighlightCallback = JS_resetLegend(legendId) ) - - if(length(variable2Axe)>0){ - for( i in variable2Axe) - { - g <- g %>% dySeries(i, axis = 'y2') - } - } - - - if(highlight) - { - g <- g %>% dyHighlight(highlightSeriesOpts = list(strokeWidth = 2)) - } - if (plotConfInt) { for (v in uniqueElements) { - axis = NULL - if(length(variable2Axe)>0) - { - if(v%in%variable2Axe) - { - axis <- "y2" - } - } - g <- g %>% dySeries(paste0(v, c("_l", "", "_u")), axis = axis) + g <- g %>% dySeries(paste0(v, c("_l", "", "_u"))) } } diff --git a/R/plot_thermal_group_capacities.R b/R/plot_thermal_group_capacities.R deleted file mode 100644 index 9b3cc60..0000000 --- a/R/plot_thermal_group_capacities.R +++ /dev/null @@ -1,29 +0,0 @@ -#' Plot for Thermal Group Capacities -#' -#' @param data data.table of Thermal Group capacities -#' @param area areas to select, default all -#' @param main title -#' -#' @examples -#' \dontrun{ -#' opts <- setSimulationPath(getwd()) -#' plotThermalGroupCapacities( thermalGroupCapacities(opts)) -#' } -#' -#' @export -plotThermalGroupCapacities <- function(data, area = 'all', main = "Thermal group capacities"){ - if(area != 'all'){ - areaTp <- area - data <- data[area %in% areaTp] - } - data <- data.table::dcast(data, area~group, value.var = "thermalGroupCapacity") - data <- data[,lapply(.SD, function(X){X[is.na(X)] <- 0;X}), .SDcols = 1:ncol(data)] - toPLot <- names(data)[names(data)!="area"] - p <- plot_ly(data, type = 'bar') %>% - layout(title = main, yaxis = list(title = 'MWh'), barmode = 'stack') - for(i in toPLot){ - p <- p %>% add_trace(x = ~area,y = as.formula(paste0("~`", i, "`")), name = i) - } - suppressWarnings(print(p)) -} - diff --git a/R/plot_ts.R b/R/plot_ts.R index ec47cba..1525485 100644 --- a/R/plot_ts.R +++ b/R/plot_ts.R @@ -16,15 +16,14 @@ #' #' @noRd #' -.plotTS <- function(dt, timeStep, variable, variable2Axe = NULL, confInt = 0, maxValue, +.plotTS <- function(dt, timeStep, variable, confInt = 0, maxValue, colors = NULL, main = NULL, ylab = NULL, legend = TRUE, legendItemsPerRow = 5, group = NULL, - width = NULL, height = NULL, highlight = FALSE, stepPlot = FALSE, drawPoints = FALSE, ...) { - + width = NULL, height = NULL, ...) { uniqueElements <- sort(unique(dt$element)) plotConfInt <- FALSE @@ -50,16 +49,8 @@ dt <- dcast(dt, time ~ element, value.var = "value") # Graphical parameters - if(length(uniqueElements)> 1) - { - variable <- paste0(uniqueElements, collapse = " ; ") - }else{ - variable <- paste0(uniqueElements, " - ", variable) - - } - if (is.null(ylab)) ylab <- variable - if (is.null(main) | isTRUE(all.equal("", main))) main <- paste("Evolution of", variable) + if (is.null(main)) main <- paste("Evolution of", variable) if (is.null(colors)) { colors <- substring(rainbow(length(uniqueElements), s = 0.7, v = 0.7), 1, 7) } else { @@ -76,9 +67,7 @@ axisLabelColor = gray(0.6), labelsKMB = TRUE, colors = colors, - useDataTimezone = TRUE, - stepPlot = stepPlot, - drawPoints = drawPoints + useDataTimezone = TRUE ) %>% dyAxis("x", rangePad = 10) %>% dyAxis("y", label = ylab, pixelsPerLabel = 60, rangePad = 10) %>% @@ -88,30 +77,10 @@ highlightCallback = JS_updateLegend(legendId, timeStep), unhighlightCallback = JS_resetLegend(legendId) ) - if(length(variable2Axe)>0){ - for( i in variable2Axe) - { - g <- g %>% dySeries(i, axis = 'y2') - } - } - - - if(highlight) - { - g <- g %>% dyHighlight(highlightSeriesOpts = list(strokeWidth = 2)) - } if (plotConfInt) { for (v in uniqueElements) { - axis = NULL - if(length(variable2Axe)>0) - { - if(v%in%variable2Axe) - { - axis <- "y2" - } - } - g <- g %>% dySeries(paste0(v, c("_l", "", "_u")), axis = axis) + g <- g %>% dySeries(paste0(v, c("_l", "", "_u"))) } } diff --git a/R/plot_utils.R b/R/plot_utils.R deleted file mode 100644 index 4d84a65..0000000 --- a/R/plot_utils.R +++ /dev/null @@ -1,134 +0,0 @@ -#' Return a table representing a time series. -#' -#' @param x a table of class antaresDataTable -#' @param tpl template of a time series. It must contain columns element, timeId, -#' time, value and eventually column mcYear -#' @param variable name of one column in x -#' @param uniqueElement a vector containing the unique elements present in x. -#' @param mcYear Monte-Carlo year to keep -#' @param dateRange a vector of two dates -#' @param aggregate type of aggregation to perform -#' -#' @return A table containing the same columns as tpl: element, timeId, -#' time, value and eventually column mcYear -#' -#' @noRd -.getTSData <- function(x, tpl, variable, elements, - uniqueElement = unique(tpl$element), - mcYear = NULL, - dateRange = NULL, aggregate = c("none", "mean", "sum", "mean by areas", "sum by areas")) { - - if(length(variable) == 0){return(tpl[0])} - if("all" %in% elements) elements <- uniqueElement - aggregate <- match.arg(aggregate) - assert_that(inherits(x, "data.table")) - assert_that(inherits(tpl, "data.table")) - assert_that(are_equal(nrow(x), nrow(tpl))) - assert_that(all(sapply(variable, is.string))) - - variable <- variable[variable%in%names(x)] - if (!is.null(dateRange)) assert_that(are_equal(length(dateRange), 2)) - - listVar <- sapply(variable, function(V){ - tpl$value <- x[,.SD, .SDcols = V] - tpl - }, simplify = FALSE) - if(length(listVar) > 1){ - sapply(names(listVar), function(N){ - listVar[[N]][,element := paste(element, '__' , N)] - }) - tpl <- rbindlist(listVar) - elements <- as.vector(sapply(elements, function(X){paste(X, "__", variable)})) - }else{ - tpl <- listVar[[1]] - } - - # Filtering data if required - if (!is.null(mcYear) && mcYear != "average") { - mcy <- mcYear # Just to avoid name confusion in the next line - tpl <- tpl[mcYear %in% mcy] - }else{ - if(!"mcYear" %in% names(tpl)) - if(mcYear != "average") - { - .printWarningMcYear() - } - } - - # if (length(elements) == 0) elements <- uniqueElement[1:5] - if (!"all" %in% elements) tpl <- tpl[element %in% elements] - if (!is.null(dateRange)) tpl <- tpl[as.Date(time) %between% dateRange] - - # Aggregating values - if (aggregate != "none" && length(uniqueElement) > 1) { - if (aggregate == "mean") { - if(length(variable) == 1){ - tpl <- tpl[, .(element = as.factor(variable), value = mean(value)), - by = c(.idCols(tpl))] - }else{ - tpl <- tpl[, .(element = as.factor("Mean"), value = mean(value)), - by = c(.idCols(tpl))] - } - - } else if (aggregate == "sum") { - - if(length(variable) == 1){ - tpl <- tpl[, .(element = as.factor(variable), value = sum(value)), - by = c(.idCols(tpl))] - }else{ - tpl <- tpl[, .(element = as.factor("Sum"), value = sum(value)), - by = c(.idCols(tpl))] - } - } else if (aggregate == "mean by areas"){ - - tpl$areas <- unlist(lapply(strsplit(tpl$element, "__"),function(X) X[1])) - tpl$element <- unlist(lapply(strsplit(tpl$element, "__"),function(X) X[2])) - - tpl <- tpl[, .(value = mean(value)), - by = c(.idCols(tpl), "element")] - } else if (aggregate == "sum by areas"){ - - tpl$areas <- unlist(lapply(strsplit(tpl$element, "__"),function(X) X[1])) - tpl$element <- unlist(lapply(strsplit(tpl$element, "__"),function(X) X[2])) - - tpl <- tpl[, .(value = sum(value)), - by = c(.idCols(tpl), "element")] - } - } - - tpl -} - -.printWarningMcYear <- function(){ - warning("You have mc-all data and you specify mcYear, it will be ignored") -} - - -.cleanH5 <- function(x, timeSteph5, mcYearh5, tablesh5, h5requestFiltering) -{ - share <- list(timeSteph5_l = timeSteph5, mcYearh_l = mcYearh5, tables_l = tablesh5) - x <- .giveListFormat(x) - x <- sapply(1:length(x),function(zz){ - .loadH5Data(share, x[[zz]], h5requestFilter = h5requestFiltering[[zz]]) - }, simplify = FALSE) - x -} - - -.validCompare <- function(compare, values){ - if(!is.null(compare)){ - if(is.list(compare)){ - compare_values <- names(compare) - } else if(is.vector(compare)){ - compare_values <- compare - } else { - stop("'compare' must be a vector or a named list") - } - if(!all(compare_values %in% values)){ - invalid <- compare_values[!compare_values %in% values] - stop(paste0("Invalid arguments for 'compare' : '", paste0(invalid, collapse = "', '"), - "'. Possible values : '", paste0(values, collapse = "', '"), "'.")) - } - } - invisible(TRUE) -} \ No newline at end of file diff --git a/R/runApp.R b/R/runApp.R deleted file mode 100644 index b2c8ef5..0000000 --- a/R/runApp.R +++ /dev/null @@ -1,16 +0,0 @@ -#' Run app antaresViz -#' -#' \code{runAppAntaresViz} run antaresViz App. -#' -#' @return -#' an App Shiny. -#' -#' @importFrom shiny runApp -#' @export -runAppAntaresViz <- function() { - ctrl <- shiny::runApp(system.file("application", package = "antaresViz") , launch.browser = TRUE) - suppressWarnings(try(rm(list = c("directoryInput", "readDirectoryInput", - "updateDirectoryInput"), envir = .GlobalEnv), silent = TRUE)) - gc(reset = TRUE) - invisible(TRUE) -} \ No newline at end of file diff --git a/R/stack.R b/R/stack.R index 7c32b1b..92e6916 100644 --- a/R/stack.R +++ b/R/stack.R @@ -43,7 +43,7 @@ #' @noRd .plotStack <- function(x, timeStep, opts, colors, lines = NULL, lineColors = NULL, legendId = "", groupId = legendId, main = "", ylab = "", - width = NULL, height = NULL, dateRange = NULL, stepPlot = FALSE, drawPoints = FALSE) { + width = NULL, height = NULL) { variables <- setdiff(names(x), c("timeId", lines)) @@ -84,21 +84,6 @@ dt$totalNeg <- dt$totalNeg + negValues } - ##Add first and last row of not in range - if(!is.null(dateRange)) - { - if(dt$time[1] > dateRange[1]){ - dt <- dt[c(NA, 1:nrow(dt))] - dt$time[1] <- dateRange[1] - } - nrowTp <- nrow(dt) - - if(dt$time[nrowTp] < dateRange[2]){ - dt <- dt[c(1:nrow(dt), NA)] - dt$time[nrowTp + 1] <- dateRange[2] - } - } - # 5- Finally plot !! colors <- unname(c("#FFFFFF", rev(colors), colors)) @@ -112,12 +97,10 @@ axisLineColor = gray(0.6), axisLabelColor = gray(0.6), strokeWidth = 0, - useDataTimezone = TRUE , - stepPlot = stepPlot, - drawPoints = drawPoints + useDataTimezone = TRUE ) %>% dyAxis("x", rangePad = 10) %>% - dyAxis("y", label = ylab, rangePad = 10, pixelsPerLabel = 50, valueRange = c(min(dt$totalNeg, na.rm = TRUE) * 1.1, NA)) %>% + dyAxis("y", label = ylab, rangePad = 10, pixelsPerLabel = 50, valueRange = c(min(dt$totalNeg) * 1.1, NA)) %>% dyLegend(show = "never") %>% dyCallbacks( highlightCallback = JS_updateLegend(legendId, timeStep), diff --git a/R/stack_exchanges.R b/R/stack_exchanges.R index cedae9e..1e40952 100644 --- a/R/stack_exchanges.R +++ b/R/stack_exchanges.R @@ -21,97 +21,30 @@ #' A htmlwidget of class \code{dygraph}. It can be modified with functions from #' package \code{dygraphs}. #' -#' -#' @details -#' Compare argument can take following values : -#' \itemize{ -#' \item "mcYear" -#' \item "main" -#' \item "unit" -#' \item "area" -#' \item "legend" -#' \item "stepPlot" -#' \item "drawPoints" -#' } -#' #' @examples #' \dontrun{ #' mydata <- readAntares(links = "all", timeStep = "daily") -#' exchangesStack(mydata) +#' exchangeStack(mydata) #' #' # Also display exchanges with the rest of the world #' mydata <- readAntares(areas = "all", links = "all", timeStep = "daily") #' exchangesStack(mydata) -#' -#' # Use compare : -#' exchangesStack(mydata, compare = "mcYear") -#' exchangesStack(mydata, compare = "area") -#' exchangesStack(mydata, compare = "unit") -#' exchangesStack(mydata, compare = "legend") -#' #' } #' #' @export -exchangesStack <- function(x, area = NULL, mcYear = "average", +exchangesStack <- function(x, y = NULL, area = NULL, mcYear = "average", dateRange = NULL, colors = NULL, main = NULL, ylab = NULL, unit = c("MWh", "GWh", "TWh"), compare = NULL, compareOpts = list(), interactive = getInteractivity(), legend = TRUE, legendId = sample(1e9, 1), groupId = legendId, legendItemsPerRow = 5, - width = NULL, height = NULL, - xyCompare = c("union","intersect"), - h5requestFiltering = list(), - stepPlot = FALSE, drawPoints = FALSE, - timeSteph5 = "hourly", - mcYearh5 = NULL, - tablesh5 = c("areas", "links"), ...) { - - - if(!is.null(compare) && !interactive){ - stop("You can't use compare in no interactive mode") - } - + width = NULL, height = NULL) { - - #Check compare - .validCompare(compare, c("mcYear", "main", "unit", "area", "legend", "stepPlot", "drawPoints")) - unit <- match.arg(unit) if (is.null(mcYear)) mcYear <- "average" - init_area <- area - - xyCompare <- match.arg(xyCompare) - - init_dateRange <- dateRange - - if(!is.null(compare) && "list" %in% class(x)){ - if(length(x) == 1) x <- list(x[[1]], x[[1]]) - } - if(!is.null(compare) && ("antaresData" %in% class(x) | "simOptions" %in% class(x))){ - x <- list(x, x) - } - # .testXclassAndInteractive(x, interactive) - - - h5requestFiltering <- .convertH5Filtering(h5requestFiltering = h5requestFiltering, x = x) - - # Generate a group number for dygraph objects - if (!("dateRange" %in% compare)) { - group <- sample(1e9, 1) - } else { - group <- NULL - } - - compareOptions <- .compOpts(x, compare) - if(is.null(compare)){ - if(compareOptions$ncharts > 1){ - compare <- list() - } - } - - processFun <- function(x) { + params <- .getDataForComp(x, y, compare, compareOpts, function(x) { if (!is(x, "antaresData")) stop("'x' should be an object of class 'antaresData created with readAntares()'") row <- NULL # exchanges with rest of the world @@ -129,6 +62,7 @@ exchangesStack <- function(x, area = NULL, mcYear = "average", row <- x$areas[, .(area, link = paste(area, " - ROW"), timeId, flow = - `ROW BAL.`, to = "ROW", direction = 1)] } + } x <- x$links } @@ -140,15 +74,15 @@ exchangesStack <- function(x, area = NULL, mcYear = "average", opts <- simOptions(x) dataDateRange <- as.Date(.timeIdToDate(range(x$timeId), timeStep, opts)) - if (length(init_dateRange) < 2) init_dateRange <- dataDateRange + if (length(dateRange) < 2) dateRange <- dataDateRange linksDef <- getLinks(namesOnly = FALSE, withDirection = TRUE, opts = opts) linksDef <- linksDef[link %in% x$link] areaList <- linksDef[, unique(area)] - if (is.null(init_area)) init_area = areaList[1] + if (is.null(area)) area = areaList[1] - plotFun <- function(id, area, dateRange, unit, mcYear, legend, stepPlot, drawPoints, main) { + plotFun <- function(id, area, dateRange, unit, mcYear, legend) { # Prepare data for stack creation a <- area linksDef <- getLinks(area, opts = simOptions(x), namesOnly = FALSE, @@ -163,25 +97,21 @@ exchangesStack <- function(x, area = NULL, mcYear = "average", mcy <- mcYear dt <- dt[mcYear == mcy] if (!is.null(row)) row <- row[mcYear == mcy, .(area, link, timeId, flow, to, direction)] - }else{ - .printWarningMcYear() - } - + } dt <- merge(dt[as.Date(.timeIdToDate(timeId, timeStep, simOptions(x))) %between% dateRange, .(link, timeId, flow = `FLOW LIN.`)], - linksDef, by = "link") + linksDef, + by = "link") if (!is.null(row)) { row <- row[as.Date(.timeIdToDate(timeId, timeStep, simOptions(x))) %between% dateRange] dt <- rbind(dt, row[area == a]) } dt[, flow := flow * direction / switch(unit, MWh = 1, GWh = 1e3, TWh = 1e6)] - if(nrow(dt) == 0){return(combineWidgets("No data"))} - dt <- dcast(dt, timeId ~ to, value.var = "flow") # Graphical parameters - if (is.null(main) | isTRUE(all.equal("", main))) main <- paste("Flows from/to", area) + if (is.null(main)) main <- paste("Flows from/to", area) if (is.null(ylab)) ylab <- sprintf("Flows (%s)", unit) if (is.null(colors)) { colors <- substring(rainbow(ncol(dt) - 1, s = 0.7, v = 0.7), 1, 7) @@ -192,7 +122,7 @@ exchangesStack <- function(x, area = NULL, mcYear = "average", # Stack g <- .plotStack(dt, timeStep, opts, colors, legendId = legendId + id - 1, groupId = groupId, - main = main, ylab = ylab, stepPlot = stepPlot, drawPoints = drawPoints) + main = main, ylab = ylab) if (legend) { # Add a nice legend @@ -201,186 +131,37 @@ exchangesStack <- function(x, area = NULL, mcYear = "average", legendId = legendId + id - 1) } else legend <- NULL + combineWidgets(g, footer = legend, width = width, height = height) + } list( plotFun = plotFun, areaList = areaList, - area = init_area, + area = area, dataDateRange = dataDateRange, - dateRange = init_dateRange, + dateRange = dateRange, displayMcYear = displayMcYear, x = x ) - } - - if (!interactive) { - x <- .cleanH5(x, timeSteph5, mcYearh5, tablesh5, h5requestFiltering) - - params <- .getDataForComp(.giveListFormat(x), NULL, compare, compareOpts, processFun = processFun) - L_w <- lapply(params$x, function(X){ - X$plotFun(1, X$area, X$dateRange, unit, mcYear, legend, stepPlot, drawPoints, main) - }) - return(combineWidgets(list = L_w)) - - - } - - table <- NULL - - ##remove notes - mcYearH5 <- NULL - paramsH5 <- NULL - sharerequest <- NULL - timeStepdataload <- NULL - timeSteph5 <- NULL - x_in <- NULL - x_tranform <- NULL + }) + if (!interactive) return(params$x[[1]]$plotFun(1, params$x[[1]]$area, params$x[[1]]$dateRange, unit, mcYear, legend)) manipulateWidget( - { - .tryCloseH5() - if(.id <= length(params$x)){ - widget <- params$x[[max(1,.id)]]$plotFun(.id, area, dateRange, unit, mcYear, legend, stepPlot, drawPoints, main) - controlWidgetSize(widget) - } else { - combineWidgets("No data for this selection") - } - }, - x = mwSharedValue(x), - h5requestFiltering = mwSharedValue({h5requestFiltering}), - - x_in = mwSharedValue({ - .giveListFormat(x) - }), - - paramsH5 = mwSharedValue({ - .h5ParamList(X_I = x_in, xyCompare = xyCompare, h5requestFilter = h5requestFiltering) - }), - - H5request = mwGroup( - timeSteph5 = mwSelect(choices = paramsH5$timeStepS, - value = paramsH5$timeStepS[1], - label = "timeStep", - multiple = FALSE - ), - mcYearH5 = mwSelect(choices = c(paramsH5[["mcYearS"]]), - value = { - if(.initial){paramsH5[["mcYearS"]][1]}else{NULL} - }, - label = "mcYear", - multiple = TRUE - ), - .display = { - any(unlist(lapply(x_in, .isSimOpts))) - } - ), - - sharerequest = mwSharedValue({ - list(timeSteph5_l = timeSteph5, mcYearh_l = mcYearH5, tables_l = NULL) - }), - - - x_tranform = mwSharedValue({ - areas = "all" - links = "all" - if(length(paramsH5$h5requestFilt[[1]]) > 0){ - areas <- NULL - links <- NULL - } - sapply(1:length(x_in),function(zz){ - .loadH5Data(sharerequest, x_in[[zz]], areas = areas, links = links, h5requestFilter = paramsH5$h5requestFilter[[zz]]) - }, simplify = FALSE) - }), - - mcYear = mwSelect({ - allMcY <- c("average", if(!is.null(params)){ - as.character(.compareOperation(lapply(params$x, function(vv){ - unique(vv$x$mcYear) - }), xyCompare))}) - allMcY - }, - value = { - if(.initial) mcYear - else NULL - }, - .display = { - length(c("average", if(!is.null(params)){ - as.character(.compareOperation(lapply(params$x, function(vv){ - unique(vv$x$mcYear) - }), xyCompare))})) != 1} - ), - - area = mwSelect({ - if(!is.null(params)){ - as.character(.compareOperation(lapply(params$x, function(vv){ - unique(vv$areaList) - }), xyCompare))} - }, - value = { - if(.initial) area - else NULL - }), - - dateRange = mwDateRange(value = { - if(.initial){ - res <- NULL - if(!is.null(params)){ - res <- c(.dateRangeJoin(params = params, xyCompare = xyCompare, "min", tabl = NULL), - .dateRangeJoin(params = params, xyCompare = xyCompare, "max", tabl = NULL)) - } - - ##Lock 7 days for hourly data - if(!is.null(attributes(params$x[[1]]$x)$timeStep)) - { - if(attributes(params$x[[1]]$x)$timeStep == "hourly"){ - if(params$x[[1]]$dateRange[2] - params$x[[1]]$dateRange[1]>7){ - res[1] <- params$x[[1]]$dateRange[2] - 7 - } - } - } - - res - }else{NULL} - }, - min = { - if(!is.null(params)){ - .dateRangeJoin(params = params, xyCompare = xyCompare, "min", tabl = NULL) - } - }, - max = { - if(!is.null(params)){ - .dateRangeJoin(params = params, xyCompare = xyCompare, "max", tabl = NULL) - } - }, - .display = timeStepdataload != "annual" - ), - + params$x[[.id]]$plotFun(.id, area, dateRange, unit, mcYear, legend), + mcYear = mwSelect(c("average", unique(params$x[[.id]]$x$mcYear)), + mcYear, + .display = params$x[[.id]]$displayMcYear), + area = mwSelect(params$x[[.id]]$areaList, area), + dateRange = mwDateRange(params$x[[1]]$dateRange, + min = params$x[[.id]]$dataDateRange[1], + max = params$x[[.id]]$dataDateRange[2]), unit = mwSelect(c("MWh", "GWh", "TWh"), unit), - legend = mwCheckbox(legend), - stepPlot = mwCheckbox(stepPlot), - drawPoints = mwCheckbox(drawPoints), - timeStepdataload = mwSharedValue({ - attributes(x_tranform[[1]])$timeStep - }), - - main = mwText(main, label = "title"), - - params = mwSharedValue({ - .getDataForComp(x_tranform, NULL, compare, compareOpts, - processFun = processFun) - }), - - .compare = { - compare - }, - .compareOpts = { - compareOptions - }, - ... + .compare = params$compare, + .compareOpts = params$compareOpts ) } diff --git a/R/stack_map.R b/R/stack_map.R deleted file mode 100644 index 336cfc8..0000000 --- a/R/stack_map.R +++ /dev/null @@ -1,98 +0,0 @@ - -# Copyright © 2016 RTE Réseau de transport d’électricité - -#' plot stack and map -#' -#' -#' @param x \code{antaresDataList} antaresDataList contian areas ans links. -#' @param mapLayout -#' Object created with function \code{\link{mapLayout}} -#' -#' @examples -#' \dontrun{ -#' mydata <- readAntares(areas = "all", links = "all") -#' -#' layout <- readLayout() -#' ml <- mapLayout(layout = layout) -#' -#' stackMap(x = mydata, mapLayout = ml) -#' } -#' -#' @export -stackMap <- function(x, mapLayout) -{ - colorArea <- colorLink <- sizeArea <- dateRange <- NULL - manipulateWidget(.expr = { - ColorArea2 <- colorArea - if(is.null(ColorArea2)){ - ColorArea2 <- "none" - } - - colorLink2 <- colorLink - if(is.null(colorLink2)){ - colorLink2 <- "none" - } - - - sizeArea2 <- sizeArea - if(is.null(sizeArea2)){ - sizeArea2 <- "none" - } - combineWidgets(nrow = 1, ncol = 2, - exchangesStack(x, area = area, interactive = FALSE, dateRange = dateRange), - plotMap(x, mapLayout = mapLayout, colLinkVar = colorLink2, - colAreaVar = ColorArea2, interactive = FALSE, - dateRange = dateRange, sizeAreaVars = sizeArea2, - areaChartType = areaChartType, sizeMiniPlot = sizeMiniPlot)) - - }, - area = mwSelect(label = "area", levels(x$areas$area)), - dateRange = mwDateRange(value = { - if(attr(x, "timeStep") != "hourly") - { - ra <- range(x$areas$time) - }else{ - if(max(x$areas$time)-min(x$areas$time)>3){ - ra = c(max(x$areas$time)-3600*24*3, max(x$areas$time)) - }else{ - ra <- range(x$areas$time) - - } - } - - ra - }, - min = min(x$areas$time), max = max(x$areas$time)), - Area = mwGroup( - colorArea = mwSelect(choices = { - names(x$areas)[!names(x$areas) %in% getIdCols(x$areas)] - },value = "LOAD", label = "Color"), - - - sizeArea = mwSelect(choices = { - names(x$areas)[!names(x$areas) %in% getIdCols(x$areas)] - }, label = "Size", multiple = TRUE), - - - miniPlot = mwGroup( - areaChartType = mwSelect(list("bar chart" = "bar", - "pie chart" = "pie", - "polar (area)" = "polar-area", - "polar (radius)" = "polar-radius"), - value = { - if(.initial) areaChartType - else NULL - }), - sizeMiniPlot = mwCheckbox(FALSE) - ), - - .display = TRUE), - - Link = mwGroup( - colorLink = mwSelect(choices = { - names(x$links)[!names(x$links) %in% getIdCols(x$links)] - },value = "FLOW LIN.", label = "Color"), - - .display = TRUE) - ) -} diff --git a/R/stack_prod.R b/R/stack_prod.R index 2e3df4c..48dc8f8 100644 --- a/R/stack_prod.R +++ b/R/stack_prod.R @@ -9,9 +9,10 @@ #' @param x #' An object of class \code{antaresData} created with function #' \code{\link[antaresRead]{readAntares}} containing data for areas and or -#' districts. it can be a list of \code{antaresData} objects. -#' In this case, one chart is created for each object. -#' Can also contains opts who refer to a h5 file or list of opts. +#' districts. +#' @param y +#' Optional object of class \code{antaresData}. If it is specified, then two +#' charts are generated. #' @param stack #' Name of the stack to use. One can visualize available stacks with #' \code{prodStackAliases} @@ -34,8 +35,7 @@ #' An optional character vector containing names of parameters. When it is set, #' two charts are outputed with their own input controls. Alternatively, it can #' be a named list with names corresponding to parameter names and values being -#' list with the initial values of the given parameter for each chart. See details -#' if you are drawing a map. +#' list with the initial values of the given parameter for each chart. #' @param compareOpts #' List of options that indicates the number of charts to create and their #' position. Check out the documentation of @@ -84,21 +84,9 @@ #' @param description #' Description of the stack. It is displayed by function #' \code{prodStackAliases}. -#' @param xyCompare -#' Use when you compare studies, can be "union" or "intersect". If union, all -#' of mcYears in one of studies will be selectable. If intersect, only mcYears in all -#' studies will be selectable. -#' @param h5requestFiltering Contains arguments used by default for h5 request, -#' typically h5requestFiltering = list(select = "NUCLEAR") -#' @param stepPlot \code{boolean}, step style for curves. -#' @param drawPoints \code{boolean}, add points on graph -#' @param timeSteph5 \code{character} timeStep to read in h5 file. Only for Non interactive mode. -#' @param mcYearh5 \code{numeric} mcYear to read for h5. Only for Non interactive mode. -#' @param tablesh5 \code{character} tables for h5 ("areas" "links", "clusters" or "disticts"). Only for Non interactive mode. -#' @param ... Other arguments for \code{\link{manipulateWidget}} #' #' @return -#' \code{prodStack} returns an interactive html graphic. If argument +#' \code{prodStackAliases} returns an interactive html graphic. If argument #' \code{interactive} is \code{TRUE}, then a shiny gadget is started and the #' function returns an interactive html graphic when the user clicks on button #' "Done". @@ -109,27 +97,15 @@ #' #' @seealso \code{\link{prodStackLegend}} #' -#' @details -#' compare argument can take following values : -#' \itemize{ -#' \item "mcYear" -#' \item "main" -#' \item "unit" -#' \item "areas" -#' \item "legend" -#' \item "stack" -#' \item "stepPlot" -#' \item "drawPoints" -#' } #' @examples #' \dontrun{ #' mydata <- readAntares(areas = "all", timeStep = "daily") #' #' # Start a shiny gadget that permits to choose areas to display. -#' prodStack(x = mydata, unit = "GWh") +#' prodStack(mydata, unit = "GWh") #' #' # Use in a non-interactive way -#' prodStack(x = mydata, unit = "GWh", areas = "fr", interactive = FALSE) +#' prodStack(mydata, unit = "GWh", areas = "fr", interactive = FALSE) #' #' # Define a custom stack #' setProdStackAlias( @@ -138,7 +114,7 @@ #' colors = c("green", "orange") #' ) #' -#' prodStack(x = mydata, unit = "GWh", stack = "Wind and solar") +#' prodStack(mydata, unit = "GWh", stack = "Wind and solar") #' #' # In a custom stack it is possible to use computed values #' setProdStackAlias( @@ -152,46 +128,12 @@ #' lineColors = "#42EB09" #' ) #' -#' prodStack(x = mydata, unit = "GWh", stack = "renewable") -#' -#' # Use compare -#' prodStack(x = mydata, compare = "areas") -#' prodStack(x = mydata, unit = "GWh", compare = "mcYear") -#' prodStack(x = mydata, unit = "GWh", compare = "main") -#' prodStack(x = mydata, unit = "GWh", compare = "unit") -#' prodStack(x = mydata, unit = "GWh", compare = "areas") -#' prodStack(x = mydata, unit = "GWh", compare = "legend") -#' prodStack(x = mydata, unit = "GWh", compare = "stack") -#' prodStack(x = mydata, unit = "GWh", compare = c("mcYear", "areas")) -#' -#' -#' # Compare studies -#' prodStack(list(mydata, mydata)) -#' -#' -#' # Use h5 opts -#' # Set path of simulaiton -#' setSimulationPath(path = path1) -#' -#' # Convert your study in h5 format -#' writeAntaresH5(path = mynewpath) -#' -#' # Redefine sim path with h5 file -#' opts <- setSimulationPath(path = mynewpath) -#' prodStack(x = opts) -#' -#' # Compare elements in a single study -#' prodStack(x = opts, .compare = "mcYear") -#' -#' # Compare 2 studies -#' prodStack(x = list(opts, opts2)) -#' -#' +#' prodStack(mydata, unit = "GWh", stack = "renewable") #' #' } #' #' @export -prodStack <- function(x, +prodStack <- function(x, y = NULL, stack = "eco2mix", areas = NULL, mcYear = "average", @@ -203,46 +145,12 @@ prodStack <- function(x, legend = TRUE, legendId = sample(1e9, 1), groupId = legendId, legendItemsPerRow = 5, - width = NULL, height = NULL, xyCompare = c("union","intersect"), - h5requestFiltering = list(), stepPlot = FALSE, drawPoints = FALSE, - timeSteph5 = "hourly", - mcYearh5 = NULL, - tablesh5 = c("areas", "links"),...) { - - if(!is.null(compare) && !interactive){ - stop("You can't use compare in no interactive mode") - } + width = NULL, height = NULL) { - #Check compare - .validCompare(compare, c("mcYear", "main", "unit", "areas", "legend", "stack", "stepPlot", "drawPoints")) - - xyCompare <- match.arg(xyCompare) unit <- match.arg(unit) if (is.null(mcYear)) mcYear <- "average" - if(!is.null(compare) && "list" %in% class(x)){ - if(length(x) == 1) x <- list(x[[1]], x[[1]]) - } - if(!is.null(compare) && ("antaresData" %in% class(x) | "simOptions" %in% class(x))){ - x <- list(x, x) - } - - # .testXclassAndInteractive(x, interactive) - - h5requestFiltering <- .convertH5Filtering(h5requestFiltering = h5requestFiltering, x = x) - - compareOptions <- .compOpts(x, compare) - if(is.null(compare)){ - if(compareOptions$ncharts > 1){ - compare <- "" - } - } - - init_areas <- areas - init_dateRange <- dateRange - - processFun <- function(x) { - + params <- .getDataForComp(x, y, compare, compareOpts, function(x) { # Check that input contains area or district data if (!is(x, "antaresData")) stop("'x' should be an object of class 'antaresData created with readAntares()'") @@ -257,52 +165,40 @@ prodStack <- function(x, if (is.null(x$area)) x$area <- x$district timeStep <- attr(x, "timeStep") opts <- simOptions(x) - if (is.null(init_areas)) { - init_areas <- unique(x$area)[1] + if (is.null(areas)) { + areas <- unique(x$area)[1] } # should mcYear parameter be displayed on the UI? displayMcYear <- !attr(x, "synthesis") && length(unique(x$mcYear)) > 1 dataDateRange <- as.Date(.timeIdToDate(range(x$timeId), timeStep, opts)) - if (length(init_dateRange) < 2) init_dateRange <- dataDateRange + if (length(dateRange) < 2) dateRange <- dataDateRange - plotWithLegend <- function(id, areas, main = "", unit, stack, dateRange, mcYear, legend, stepPlot, drawPoints) { - if (length(areas) == 0) return (combineWidgets("Please choose an area")) + plotWithLegend <- function(id, areas, main = "", unit, stack, dateRange, mcYear, legend) { + if (length(areas) == 0) return ("Please choose an area") stackOpts <- .aliasToStackOptions(stack) + dt <- x[area %in% areas] if (mcYear == "average") dt <- synthesize(dt) else if ("mcYear" %in% names(dt)) { mcy <- mcYear dt <- dt[mcYear == mcy] - }else{ - .printWarningMcYear() } if (!is.null(dateRange)) { dt <- dt[as.Date(.timeIdToDate(dt$timeId, timeStep, opts = opts)) %between% dateRange] } - if(nrow(dt) == 0){ - return (combineWidgets("No data for this selection")) - } - p <- try(.plotProdStack(dt, - stackOpts$variables, - stackOpts$colors, - stackOpts$lines, - stackOpts$lineColors, - main = main, - unit = unit, - legendId = legendId + id - 1, - groupId = groupId, - dateRange = dateRange, - stepPlot = stepPlot, drawPoints = drawPoints), silent = TRUE) - - if("try-error" %in% class(p)){ - return (combineWidgets(paste0("Can't visualize stack '", stack, "'
", p[1]))) - } - + p <- .plotProdStack(dt, + stackOpts$variables, + stackOpts$colors, + stackOpts$lines, + stackOpts$lineColors, + main = main, + unit = unit, + legendId = legendId + id - 1, groupId = groupId) if (legend) { l <- prodStackLegend(stack, legendItemsPerRow, legendId = legendId + id - 1) } else { @@ -317,208 +213,34 @@ prodStack <- function(x, x = x, timeStep = timeStep, opts = opts, - areas = init_areas, + areas = areas, displayMcYear = displayMcYear, dataDateRange = dataDateRange, - dateRange = init_dateRange + dateRange = dateRange + ) - } + }) + if (!interactive) { - x <- .cleanH5(x, timeSteph5, mcYearh5, tablesh5, h5requestFiltering) - - - params <- .getDataForComp(x = .giveListFormat(x), - y = NULL, compare = compare, - compareOpts = compareOptions, - processFun = processFun) - - - - L_w <- lapply(params$x, function(X){ - X$plotWithLegend(1, areas, main, unit, - stack, params$x[[1]]$dateRange, - mcYear, legend, stepPlot, drawPoints) - }) - return(combineWidgets(list = L_w)) - - } else { - # just init for compare & compareOpts - # init_params <- .getDataForComp(x, y, compare, compareOpts, function(x) {}) + return(params$x[[1]]$plotWithLegend(1, areas, main, unit, stack, params$x[[1]]$dateRange, mcYear, legend)) } - - table <- NULL - - ##remove notes - mcYearhH5 <- NULL - paramsH5 <- NULL - sharerequest <- NULL - timeStepdataload <- NULL - timeSteph5 <- NULL - x_in <- NULL - x_tranform <- NULL - - manipulateWidget( - { - .tryCloseH5() - if(.id <= length(params$x)){ - widget <- params$x[[max(1,.id)]]$plotWithLegend(.id, areas, main, - unit, stack, dateRange, - mcYear, legend, - stepPlot, drawPoints) - controlWidgetSize(widget) - } else { - combineWidgets("No data for this selection") - } - }, - x = mwSharedValue({x}), - x_in = mwSharedValue({ - .giveListFormat(x) - }), - h5requestFiltering = mwSharedValue({ - h5requestFiltering - }), - paramsH5 = mwSharedValue({ - tmp <- .h5ParamList(X_I = x_in, xyCompare = xyCompare, - h5requestFilter = h5requestFiltering) - tmp - }), - H5request = mwGroup( - timeSteph5 = mwSelect(choices = paramsH5$timeStepS, - value = paramsH5$timeStepS[1], - label = "timeStep", - multiple = FALSE - ), - tables = mwSelect(choices = paramsH5[["tabl"]][paramsH5[["tabl"]]%in%c("areas", "districts")], - value = { - if(.initial) {paramsH5[["tabl"]][paramsH5[["tabl"]]%in%c("areas", "districts")][1]}else{NULL} - }, - label = "table", - multiple = FALSE - ), - mcYearhH5 = mwSelect(choices = c(paramsH5[["mcYearS"]]), - value = { - if(.initial){paramsH5[["mcYearS"]][1]}else{NULL} - }, - label = "mcYear", - multiple = TRUE - ), - .display = { - any(unlist(lapply(x_in, .isSimOpts))) - } - ), - - sharerequest = mwSharedValue({ - list(timeSteph5_l = timeSteph5, mcYearh_l = mcYearhH5, tables_l = tables) - }), - - - - x_tranform = mwSharedValue({ - - h5requestFilteringTp <- paramsH5$h5requestFilter - if(!is.null(sharerequest)) - { - for(i in 1:length(h5requestFilteringTp)) - { - if(sharerequest$tables == "areas"){ - h5requestFilteringTp[[i]]$districts = NULL - } - if(sharerequest$tables == "districts"){ - h5requestFilteringTp[[i]]$areas = NULL - } - } - } - - sapply(1:length(x_in),function(zz){ - .loadH5Data(sharerequest, x_in[[zz]], h5requestFilter = h5requestFilteringTp[[zz]]) - }, simplify = FALSE) - }), - - params = mwSharedValue({ - .getDataForComp(x_tranform, NULL, compare, - compareOpts = compareOptions, - processFun = processFun) - }), - - ##End h5 - mcYear = mwSelect({ - c("average", .compareOperation(lapply(params$x, function(vv){ - unique(vv$x$mcYear) - }), xyCompare)) - }), - + params$x[[.id]]$plotWithLegend(.id, areas, main, unit, stack, dateRange, mcYear, legend), + mcYear = mwSelect(c("average", unique(params$x[[.id]]$x$mcYear)), .display = params$x[[.id]]$displayMcYear), main = mwText(main, label = "title"), - - dateRange = mwDateRange(value = { - if(.initial){ - res <- NULL - if(!is.null(params)){ - res <- c(.dateRangeJoin(params = params, xyCompare = xyCompare, "min", tabl = table), - .dateRangeJoin(params = params, xyCompare = xyCompare, "max", tabl = table)) - ##Lock 7 days for hourly data - if(params$x[[1]]$timeStep == "hourly"){ - if(params$x[[1]]$dateRange[2] - params$x[[1]]$dateRange[1]>7){ - res[1] <- params$x[[1]]$dateRange[2] - 7 - } - - - } - } - - - - res - }else{NULL} - }, - min = { - if(!is.null(params)){ - .dateRangeJoin(params = params, xyCompare = xyCompare, "min", tabl = table) - } - }, - max = { - if(!is.null(params)){ - .dateRangeJoin(params = params, xyCompare = xyCompare, "max", tabl = table) - } - } - ), - - - + dateRange = mwDateRange(params$x[[1]]$dateRange, + min = params$x[[.id]]$dataDateRange[1], + max = params$x[[.id]]$dataDateRange[2]), stack = mwSelect(names(pkgEnv$prodStackAliases), stack), - unit = mwSelect(c("MWh", "GWh", "TWh"), unit), - - areas = mwSelect({ - as.character(.compareOperation(lapply(params$x, function(vv){ - unique(vv$x$area) - }), xyCompare)) - }, - value = { - if(.initial){ - as.character(.compareOperation(lapply(params$x, function(vv){ - unique(vv$x$area) - }), xyCompare))[1] - } - else{NULL}}, - multiple = TRUE - ), - + areas = mwSelect(as.character(unique(params$x[[.id]]$x$area)), areas, multiple = TRUE), legend = mwCheckbox(legend), - stepPlot = mwCheckbox(stepPlot), - drawPoints = mwCheckbox(drawPoints), - .compare = { - compare - }, - .compareOpts = { - compareOptions - }, - ... + .compare = params$compare, + .compareOpts = params$compareOpts ) } - #' Returns the variables and colors corresponding to an alias #' #' @param variables @@ -577,9 +299,9 @@ prodStack <- function(x, #' #' @noRd .plotProdStack <- function(x, variables, colors, lines, lineColors, - main = NULL, unit = "MWh", legendId = "", - groupId = legendId, - width = NULL, height = NULL, dateRange = NULL, stepPlot = FALSE, drawPoints = FALSE) { + main = NULL, unit = "MWh", legendId = "", + groupId = legendId, + width = NULL, height = NULL) { timeStep <- attr(x, "timeStep") @@ -591,17 +313,18 @@ prodStack <- function(x, for (n in names(formulas)) { dt[,c(n) := x[, eval(formulas[[n]]) / switch(unit, MWh = 1, GWh = 1e3, TWh = 1e6)]] } + .plotStack(dt, timeStep, simOptions(x), colors, lines, lineColors, legendId, groupId, main = main, ylab = sprintf("Production (%s)", unit), - width = width, height = height, dateRange = dateRange, stepPlot = stepPlot, drawPoints = drawPoints) + width = width, height = height) } #' @rdname tsLegend #' @export prodStackLegend <- function(stack = "eco2mix", - legendItemsPerRow = 5, legendId = "") { - + legendItemsPerRow = 5, legendId = "") { + stackOpts <- .aliasToStackOptions(stack) tsLegend( @@ -612,7 +335,3 @@ prodStackLegend <- function(stack = "eco2mix", legendId = legendId ) } - - - - diff --git a/R/zzz.R b/R/zzz.R index d41efcb..df5f857 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -1,126 +1,109 @@ -#Copyright © 2016 RTE Réseau de transport d’électricité - -#' @import data.table -#' @import antaresRead -#' @import antaresProcessing -#' @import dygraphs -#' @import shiny -#' @import htmltools -#' @import manipulateWidget -#' @import leaflet -#' @import leaflet.minicharts -#' @import assertthat -#' @importFrom plotly plot_ly layout config add_bars add_heatmap add_text add_trace -#' @importFrom grDevices col2rgb colorRampPalette colors gray rainbow rgb -#' @importFrom graphics plot par -#' @importFrom methods is -#' @importFrom stats density quantile lm predict -#' @importFrom utils object.size -#' @importFrom stats as.formula -#' -globalVariables( - c("value", "element", "mcYear", "suffix", "time", "timeId", "dt", ".", - "x", "y", ".id", ".initial", ".session", "FLOW LIN.", "area", "direction", - "flow", "formulas", "link", ".output", "J", "ROW BAL.", "change", "to", - "wdayId", "weekId") -) - -.idCols <- antaresRead:::.idCols -.timeIdToDate <- antaresRead:::.timeIdToDate -.getTimeId <- antaresRead:::.getTimeId -.mergeByRef <- antaresRead:::.mergeByRef -.checkColumns <- antaresProcessing:::.checkColumns -.checkAttrs <- antaresProcessing:::.checkAttrs - -DEFAULT_CAT_COLORS <- c("#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", - "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf") - -# Private variables accessible only by functions from the package -pkgEnv <- antaresRead:::pkgEnv - -.onLoad <- function(libname, pkgname) { - setInteractivity("auto") - options(antaresVizSizeGraph = 200) -} - -# Generate the list of aliases for function prodStack() -# -# The definition of the variables used in aliases is stored in file -# "GraphicalCharter.csv" -graphicalCharter <- fread(input=system.file("GraphicalCharter.csv", package = "antaresViz")) - -formulas <- lapply(graphicalCharter$formula, function(s) parse(text = s)) -names(formulas) <- graphicalCharter$name - -colors <- graphicalCharter[, rgb(red, green, blue, maxColorValue = 255)] -names(colors) <- graphicalCharter$name - - -needed <- graphicalCharter$Needed_Col -names(needed) <- graphicalCharter$name -needed <- strsplit(needed, ",") -# Private function that generates a production stack alias, given a list of -# variable names. The variable names need to be present in file -# GraphicalCharter.csv -.getProdStackAlias <- function(description = "", var = NULL, lines = NULL) { - list( - description = description, - nedded_col = unique(unlist(needed[var])), - variables = formulas[var], - colors = unname(colors[var]), - lines = formulas[lines], - lineColors = unname(colors[lines]) - ) -} - -# List of aliases for parameter "variables" in function prodStack() -# -# Each element has five elements: -# - description: A concise description of the production stack. -# - variables: Definition of the variables to draw -# - colors: Vector of colors with same length as "variables" -# - lines: (optional) Definition of curves to draw on top of the stack -# - lineColors: Vector of colors with same length as lines. Mandatory only if -# "lines" is set -# -pkgEnv$prodStackAliases <- list( - - eco2mix = .getProdStackAlias( - description = "Production stack used on Eco2mix website: - http://www.rte-france.com/fr/eco2mix/eco2mix-mix-energetique", - var = c("pumpedStorage", "import/export", "bioenergy", "wind", "solar", - "nuclear", "hydraulic", "gas", "coal", "lignite", "oil", "other"), - lines = c("load", "totalProduction") - ), - - thermalFirst = .getProdStackAlias( - description = "thermal first", - var = c("pumpedStorage", "import/export", "nuclear", "lignite", "coal", "gas", - "oil", "mixFuel", "misc. DTG", "bioenergy", "wind", "solar", - "hydraulicRor", "hydraulicStor") - ), - - netLoad = .getProdStackAlias( - description = "netLoad", - var = c("pumpedStorage", "import/export", "nuclear", "lignite", "coal", "gas", - "oil", "mixFuel", "misc. DTG", "hydraulicStor"), - lines = c("netLoad") - ), - - mustRun = .getProdStackAlias( - description = "must-run", - var = c("pumpedStorage", "import/export", "mustRunTotal", "thermalDispatchable", - "hydraulicDispatchable", "renewableNoDispatchable") - ) -) - -rm(graphicalCharter, formulas, colors) - - -colorsVars <- fread(input=system.file("color.csv", package = "antaresViz")) -colorsVars$colors <- rgb(colorsVars$red, colorsVars$green, colorsVars$blue, maxColorValue = 255) - - -# message limit size -antaresVizSizeGraphError = "Too much data, please reduce selection. If you work with hourly data, you can reduce dateRange selection. -You can also use 'limitSizeGraph' function in R or 'Memory Controls' panel in shiny to update this." \ No newline at end of file +#Copyright © 2016 RTE Réseau de transport d’électricité + +#' @import data.table +#' @import antaresRead +#' @import antaresProcessing +#' @import dygraphs +#' @import miniUI +#' @import shiny +#' @import htmltools +#' @import manipulateWidget +#' @import leaflet +#' @import leaflet.minicharts +#' @importFrom plotly plot_ly layout config add_bars add_heatmap +#' @importFrom grDevices col2rgb colorRampPalette colors gray rainbow +#' @importFrom graphics plot par +#' @importFrom methods is +#' @importFrom stats density quantile lm predict +#' +globalVariables( + c("value", "element", "mcYear", "suffix", "time", "timeId", "dt", ".", + "x", "y", ".id", ".initial", ".session", "FLOW LIN.", "area", "direction", + "flow", "formulas", "link", ".output", "J", "ROW BAL.", "change", "to", + "wdayId", "weekId") +) + +.idCols <- antaresRead:::.idCols +.timeIdToDate <- antaresRead:::.timeIdToDate +.getTimeId <- antaresRead:::.getTimeId +.mergeByRef <- antaresRead:::.mergeByRef +.checkColumns <- antaresProcessing:::.checkColumns +.checkAttrs <- antaresProcessing:::.checkAttrs + +DEFAULT_CAT_COLORS <- c("#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", + "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf") + +# Private variables accessible only by functions from the package +pkgEnv <- antaresRead:::pkgEnv + +.onLoad <- function(libname, pkgname) { + setInteractivity("auto") +} + +# Generate the list of aliases for function prodStack() +# +# The definition of the variables used in aliases is stored in file +# "GraphicalCharter.csv" +graphicalCharter <- fread(input=system.file("GraphicalCharter.csv", package = "antaresViz")) + +formulas <- lapply(graphicalCharter$formula, function(s) parse(text = s)) +names(formulas) <- graphicalCharter$name + +colors <- graphicalCharter[, rgb(red, green, blue, maxColorValue = 255)] +names(colors) <- graphicalCharter$name + +# Private function that generates a production stack alias, given a list of +# variable names. The variable names need to be present in file +# GraphicalCharter.csv +.getProdStackAlias <- function(description = "", var = NULL, lines = NULL) { + list( + description = description, + variables = formulas[var], + colors = unname(colors[var]), + lines = formulas[lines], + lineColors = unname(colors[lines]) + ) +} + +# List of aliases for parameter "variables" in function prodStack() +# +# Each element has five elements: +# - description: A concise description of the production stack. +# - variables: Definition of the variables to draw +# - colors: Vector of colors with same length as "variables" +# - lines: (optional) Definition of curves to draw on top of the stack +# - lineColors: Vector of colors with same length as lines. Mandatory only if +# "lines" is set +# +pkgEnv$prodStackAliases <- list( + + eco2mix = .getProdStackAlias( + description = "Production stack used on Eco2mix website: + http://www.rte-france.com/fr/eco2mix/eco2mix-mix-energetique", + var = c("pumpedStorage", "import/export", "bioenergy", "wind", "solar", + "nuclear", "hydraulic", "gas", "coal", "lignite", "oil", "other"), + lines = c("load", "totalProduction") + ), + + thermalFirst = .getProdStackAlias( + description = "thermal first", + var = c("pumpedStorage", "import/export", "nuclear", "lignite", "coal", "gas", + "oil", "mixFuel", "misc. DTG", "bioenergy", "wind", "solar", + "hydraulicRor", "hydraulicStor") + ), + + netLoad = .getProdStackAlias( + description = "netLoad", + var = c("pumpedStorage", "import/export", "nuclear", "lignite", "coal", "gas", + "oil", "mixFuel", "misc. DTG", "hydraulicStor"), + lines = c("netLoad") + ), + + mustRun = .getProdStackAlias( + description = "must-run", + var = c("pumpedStorage", "import/export", "mustRunTotal", "thermalDispatchable", + "hydraulicDispatchable", "renewableNoDispatchable") + ) +) + +rm(graphicalCharter, formulas, colors) \ No newline at end of file diff --git a/README.md b/README.md index cccd3c0..80d17f5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [![CRAN_Status_Badge](http://www.r-pkg.org/badges/version/antaresViz)](https://cran.r-project.org/package=antaresViz) [![Travis-CI Build Status](https://travis-ci.org/rte-antares-rpackage/antaresViz.svg?branch=master)](https://travis-ci.org/rte-antares-rpackage/antaresViz) -[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/github/rte-antares-rpackage/antaresViz?branch=master&svg=true)](https://ci.appveyor.com/project/rte-antares-rpackage/antaresViz)[![codecov](https://codecov.io/gh/rte-antares-rpackage/antaresViz/branch/develop/graph/badge.svg)](https://codecov.io/gh/rte-antares-rpackage/antaresViz) +[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/github/rte-antares-rpackage/antaresViz?branch=master&svg=true)](https://ci.appveyor.com/project/rte-antares-rpackage/antaresViz) # The package antaresViz: visualize the results of an Antares simulation @@ -67,15 +67,10 @@ myData <- readAntares(areas = "all", links = "all") plotMap(myData, myMapLayout) ``` -You can use `spMaps` to set a map background or download some files at http://www.gadm.org/country. - ## Contributing: Contributions to the library are welcome and can be submitted in the form of pull requests to this repository. -## ANTARES : - Antares is a powerful software developed by RTE to simulate and study electric power systems (more information about Antares here : ). - ## License Information: Copyright 2015-2016 RTE (France) diff --git a/antaresViz.Rproj b/antaresViz.Rproj index df159b9..fec809a 100644 --- a/antaresViz.Rproj +++ b/antaresViz.Rproj @@ -12,8 +12,6 @@ Encoding: UTF-8 RnwWeave: Sweave LaTeX: pdfLaTeX -LineEndingConversion: Posix - BuildType: Package PackageUseDevtools: Yes PackageInstallArgs: --no-multiarch --with-keep.source diff --git a/appveyor.yml b/appveyor.yml index 4de1121..e32d316 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -14,12 +14,6 @@ install: build_script: - travis-tool.sh install_deps - - travis-tool.sh install_bioc zlibbioc - - travis-tool.sh install_bioc rhdf5 - - ./travis-tool.sh install_github rte-antares-rpackage/antaresRead@develop - - ./travis-tool.sh install_github rte-antares-rpackage/antaresProcessing@developTit - - ./travis-tool.sh install_github rte-antares-rpackage/manipulateWidget@develop - - ./travis-tool.sh install_github rte-antares-rpackage/antaresMaps test_script: - travis-tool.sh run_tests diff --git a/inst/AntaresViz.xlsx b/inst/AntaresViz.xlsx deleted file mode 100644 index 47b0150af58446176ef55aad207f534b96913905..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11563 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 diff --git a/inst/GraphicalCharter.csv b/inst/GraphicalCharter.csv index 19c2e20..b3a88fd 100644 --- a/inst/GraphicalCharter.csv +++ b/inst/GraphicalCharter.csv @@ -1,29 +1,29 @@ -name;red;green;blue;formula;Needed_Col -pumpedStorage;17;71;185;PSP;PSP -import/export;150;150;150;-(BALANCE + `ROW BAL.`);BALANCE,ROW BAL. -mustRunTotal;120;136;194;mustRunTotal;mustRunTotal -mustRunPartial;120;236;194;mustRunPartial;mustRunPartial -mustRun;220;236;94;mustRun;mustRun -bioenergy;22;106;87;`MISC. NDG`;MISC. NDG -wind;116;205;185;WIND;WIND -solar;242;116;6;SOLAR;SOLAR -nuclear;245;179;0;NUCLEAR;NUCLEAR -hydraulic;39;114;178;`H. ROR`+`H. STOR`;H. ROR,H. STOR -gas;243;10;10;GAS;GAS -coal;172;140;53;COAL;COAL -other;173;255;47;`MISC. DTG` + `MIX. FUEL`;MISC. DTG,MIX. FUEL -load;135;86;39;LOAD;LOAD -renewable;0;255;0;WIND+SOLAR+`H. ROR`+`H. STOR`+`MISC. NDG`;WIND,SOLAR,H. ROR,H. STOR,MISC. NDG -renewableNoDispatchable;0;255;0;WIND+SOLAR+`H. ROR`+`MISC. NDG`;WIND,SOLAR,H. ROR,MISC. NDG -thermal;77;77;77;NUCLEAR+LIGNITE+COAL+GAS+OIL+`MIX. FUEL`+`MISC. DTG`;NUCLEAR,LIGNITE,COAL,GAS,OIL,MIX. FUEL,MISC. DTG -thermalDispatchable;100;100;100;NUCLEAR+LIGNITE+COAL+GAS+OIL+`MIX. FUEL`+`MISC. DTG`;NUCLEAR,LIGNITE,COAL,GAS,OIL,MIX. FUEL,MISC. DTG -hydraulicDispatchable;39;114;178;`H. STOR`;H. STOR -lignite;180;130;43;LIGNITE;LIGNITE -oil;131;86;162;OIL;OIL -mixFuel;127;84;156;`MIX. FUEL`;MIX. FUEL -misc. DTG;173;255;47;`MISC. DTG`;MISC. DTG -hydraulicRor;61;96;125;`H. ROR`;H. ROR -hydraulicStor;84;151;208;`H. STOR`;H. STOR -totalProduction;235;155;166;NUCLEAR+LIGNITE+COAL+GAS+OIL+`MIX. FUEL`+`MISC. DTG`+WIND+SOLAR+`H. ROR`+`H. STOR`+`MISC. NDG` + pmax(0, PSP);NUCLEAR,LIGNITE,COAL,GAS,OIL,MIX. FUEL,MISC. DTG,WIND,SOLAR,H. ROR,H. STOR,MISC. NDG,PSP -netLoad;101;180;197;netLoad;netLoad -thermalAvailability;1;1;1;`AVL DTG`;AVL DTG +name red green blue formula +pumpedStorage 17 71 185 PSP +"import/export" 150 150 150 -(BALANCE + `ROW BAL.`) +mustRunTotal 120 136 194 mustRunTotal +mustRunPartial 120 236 194 mustRunPartial +mustRun 220 236 94 mustRun +bioenergy 22 106 87 `MISC. NDG` +wind 116 205 185 WIND +solar 242 116 6 SOLAR +nuclear 245 179 0 NUCLEAR +hydraulic 39 114 178 `H. ROR`+`H. STOR` +gas 243 10 10 GAS +coal 172 140 53 COAL +other 173 255 47 `MISC. DTG` + `MIX. FUEL` +load 135 86 39 LOAD +renewable 0 255 0 WIND+SOLAR+`H. ROR`+`H. STOR`+`MISC. NDG` +renewableNoDispatchable 0 255 0 WIND+SOLAR+`H. ROR`+`MISC. NDG` +thermal 77 77 77 NUCLEAR+LIGNITE+COAL+GAS+OIL+`MIX. FUEL`+`MISC. DTG` +thermalDispatchable 100 100 100 NUCLEAR+LIGNITE+COAL+GAS+OIL+`MIX. FUEL`+`MISC. DTG` +hydraulicDispatchable 39 114 178 `H. STOR` +lignite 180 130 43 LIGNITE +oil 131 86 162 OIL +mixFuel 127 84 156 `MIX. FUEL` +"misc. DTG" 173 255 47 `MISC. DTG` +hydraulicRor 61 96 125 `H. ROR` +hydraulicStor 84 151 208 `H. STOR` +totalProduction 235 155 166 NUCLEAR+LIGNITE+COAL+GAS+OIL+`MIX. FUEL`+`MISC. DTG`+WIND+SOLAR+`H. ROR`+`H. STOR`+`MISC. NDG` + pmax(0, PSP) +netLoad 101 180 197 netLoad +thermalAvailability 1 1 1 `AVL DTG` \ No newline at end of file diff --git a/inst/application/global.R b/inst/application/global.R deleted file mode 100644 index aa08f50..0000000 --- a/inst/application/global.R +++ /dev/null @@ -1,79 +0,0 @@ -require(shiny) -require(antaresRead) -require(antaresViz) -require(manipulateWidget) -require(data.table) - - -# choose a directory -source("src/scripts/directoryInput.R") - -# shared inputs -.global_shared_prodStack <- data.frame( - module = "prodStack", - panel = "prodStack", - input = c("dateRange", "unit", "mcYear", "mcYearh", "timeSteph5", "legend", "drawPoints", "stepPlot"), - type = c("dateRangeInput", "selectInput", "selectInput", "selectInput", "selectInput", - "checkboxInput", "checkboxInput", "checkboxInput"), stringsAsFactors = FALSE) - -.global_shared_plotts <- data.frame( - module = "plotts", - panel = "tsPlot", - input = c("dateRange", "mcYear", "mcYearh", "timeSteph5", "legend", "drawPoints", "stepPlot"), - type = c("dateRangeInput", "selectInput", "selectInput", "selectInput", - "checkboxInput", "checkboxInput", "checkboxInput"), stringsAsFactors = FALSE) - - -.global_shared_plotMap <- data.frame( - module = "plotMap", - panel = "Map", - input = c("dateRange", "mcYear", "mcYearh", "timeSteph5"), - type = c("dateRangeInput", "selectInput", "selectInput", "selectInput"), stringsAsFactors = FALSE) - -.global_shared_exchangesStack <- data.frame( - module = "exchangesStack", - panel = "exchangesStack", - input = c("dateRange", "unit", "mcYear", "mcYearh", "timeSteph5", "legend", "drawPoints", "stepPlot"), - type = c("dateRangeInput", "selectInput", "selectInput", "selectInput", "selectInput", - "checkboxInput", "checkboxInput", "checkboxInput"), stringsAsFactors = FALSE) - -.global_shared_input <- rbind(.global_shared_prodStack, .global_shared_plotts, .global_shared_plotMap, .global_shared_exchangesStack) - - -.global_build_input_data <- function(data){ - data$input_id <- paste0(data$module, "-shared_", data$input) - data$last_update <- NA - data$update_call <- "" - class(data$last_update) <- c("character") - data <- data.table(data) - data -} - -#------------ -# compare -#----------- - -.global_compare_prodstack <- c("mcYear", "main", "unit", "areas", "legend", - "stack", "stepPlot", "drawPoints") - -.global_compare_exchangesStack <- c("mcYear", "main", "unit", "area", - "legend", "stepPlot", "drawPoints") - -.global_compare_tsPlot <- c("mcYear", "main", "variable", "type", "confInt", "elements", - "aggregate", "legend", "highlight", "stepPlot", "drawPoints", "secondAxis") - -.global_compare_plotMap <- c("mcYear", "type", "colAreaVar", "sizeAreaVars", "areaChartType", "showLabels", - "popupAreaVars", "labelAreaVar","colLinkVar", "sizeLinkVar", "popupLinkVars") - - -#----- generate help for antaresRead function -# library(tools) -# add.html.help <- function(package, func, tempsave = paste0(getwd(), "/temp.html")) { -# pkgRdDB = tools:::fetchRdDB(file.path(find.package(package), "help", package)) -# topics = names(pkgRdDB) -# rdfunc <- pkgRdDB[[func]] -# tools::Rd2HTML(pkgRdDB[[func]], out = tempsave) -# } -# add.html.help("antaresRead", "readAntares", "inst/application/www/readAntares.html") -# add.html.help("antaresRead", "removeVirtualAreas", "inst/application/www/removeVirtualAreas.html") -# add.html.help("antaresRead", "writeAntaresH5", "inst/application/www/writeAntaresH5.html") diff --git a/inst/application/server.R b/inst/application/server.R deleted file mode 100644 index 23fae84..0000000 --- a/inst/application/server.R +++ /dev/null @@ -1,134 +0,0 @@ -function(input, output, session) { - - #---------------- - # Write h5 - #---------------- - source("src/server/07_write_h5.R", local = T) - - #---------------- - # set / read data - #---------------- - source("src/server/01_set_read_data.R", local = T) - - #---------------- - # shared parameters - #---------------- - - modules <- reactiveValues(prodStack = NULL, exchangesStack = NULL, plotts = NULL, plotMap = NULL) - - # all data loaded by user, with informations - list_data_all <- reactiveValues(antaresDataList = list(), params = list(), - have_links = c(), have_areas = c(), opts = list()) - - # set of controls - list_data_controls <- reactiveValues(have_links = FALSE, have_areas = FALSE, - n_links = -1, n_areas = -1, n_maps = -1) - - - #----------------- - # Importation de nouvelles donnees - #----------------- - - source("src/server/02_load_data.R", local = T) - - #---------------- - # Dataset selection - #---------------- - source("src/server/03_data_selection.R", local = T) - - #----------------- - # modules - #----------------- - - # launch when click on ""Launch Analysis" button - # and get back which opts / data to keep - ind_keep_list_data <- reactive({ - if(input$update_module > 0){ - isolate({ - names_input <- names(input) - keep_input <- names_input[grepl("^list_study_check", names_input)] - keep_input <- keep_input[as.numeric(gsub("list_study_check", "", keep_input)) <= length(list_data_all$antaresDataList)] - if(length(keep_input) > 0){ - keep_input <- sort(keep_input) - final_keep <- sapply(keep_input, function(x){ - input[[x]] - }) - - # all to keep - ind_all <- which(final_keep) - - # with areas - ind_areas <- intersect(which(list_data_all$have_areas), ind_all) - - # with links - ind_links <- intersect(which(list_data_all$have_links), ind_all) - - list(ind_all = ind_all, ind_areas = ind_areas, ind_links = ind_links) - } else { - NULL - } - }) - } else { - NULL - } - }) - - #------------------ - # prodStack, plotTS & stackExchange - #------------------ - - source("src/server/05_modules.R", local = T) - - #------------ - # plotMap - #------------ - - source("src/server/06_module_map.R", local = T) - - #---------------- - # shared inputs - #---------------- - - source("src/server/04_shared_input.R", local = T) - - #---------------- - # memory options - #---------------- - observe({ - if(!is.na(input$ram_limit)){ - antaresRead::setRam(input$ram_limit) - } - }) - - observe({ - if(!is.na(input$data_module)){ - limitSizeGraph(input$data_module) - } - }) - - #---------------- - # quit - #---------------- - - # in case of classic use : - observe({ - if(input$quit > 0){ - stopApp(returnValue = TRUE) - } - }) - - # in case of Rinno / packaging app for windows - # (and so comment previous observe....!) - # - # observe({ - # if(input$quit > 0){ - # stopApp() - # q("no") - # } - # }) - # - # session$onSessionEnded(function() { - # stopApp() - # q("no") - # }) -} diff --git a/inst/application/src/scripts/directoryInput.R b/inst/application/src/scripts/directoryInput.R deleted file mode 100644 index 3e0df04..0000000 --- a/inst/application/src/scripts/directoryInput.R +++ /dev/null @@ -1,169 +0,0 @@ -#' Choose a Folder Interactively (Mac OS X) -#' -#' Display a folder selection dialog under Mac OS X -#' -#' @param default which folder to show initially -#' @param caption the caption on the selection dialog -#' -#' @details -#' Uses an Apple Script to display a folder selection dialog. With \code{default = NA}, -#' the initial folder selection is determined by default behavior of the -#' "choose folder" Apple Script command. Otherwise, paths are expanded with -#' \link{path.expand}. -#' -#' @return -#' A length one character vector, character NA if 'Cancel' was selected. -#' -if (Sys.info()['sysname'] == 'Darwin') { - choose.dir = function(default = NA, caption = NA) { - command = 'osascript' - args = '-e "POSIX path of (choose folder{{prompt}}{{default}})"' - - if (!is.null(caption) && !is.na(caption) && nzchar(caption)) { - prompt = sprintf(' with prompt \\"%s\\"', caption) - } else { - prompt = '' - } - args = sub('{{prompt}}', prompt, args, fixed = T) - - if (!is.null(default) && !is.na(default) && nzchar(default)) { - default = sprintf(' default location \\"%s\\"', path.expand(default)) - } else { - default = '' - } - args = sub('{{default}}', default, args, fixed = T) - - suppressWarnings({ - path = system2(command, args = args, stderr = TRUE) - }) - if (!is.null(attr(path, 'status')) && attr(path, 'status')) { - # user canceled - path = NA - } - - return(path) - } -} else if (Sys.info()['sysname'] == 'Linux') { - choose.dir = function(default = NA, caption = NA) { - command = 'zenity' - args = '--file-selection --directory --title="Choose a folder"' - - suppressWarnings({ - path = system2(command, args = args, stderr = TRUE) - }) - - #Return NA if user hits cancel - if (!is.null(attr(path, 'status')) && attr(path, 'status')) { - # user canceled - return(default) - } - - #Error: Gtk-Message: GtkDialog mapped without a transient parent - if(length(path) == 2){ - path = path[2] - } - - return(path) - } -} - -#' Directory Selection Control -#' -#' Create a directory selection control to select a directory on the server -#' -#' @param inputId The \code{input} slot that will be used to access the value -#' @param label Display label for the control, or NULL for no label -#' @param value Initial value. Paths are exapnded via \code{\link{path.expand}}. -#' -#' @details -#' This widget relies on \link{\code{choose.dir}} to present an interactive -#' dialog to users for selecting a directory on the local filesystem. Therefore, -#' this widget is intended for shiny apps that are run locally - i.e. on the -#' same system that files/directories are to be accessed - and not from hosted -#' applications (e.g. from shinyapps.io). -#' -#' @return -#' A directory input control that can be added to a UI definition. -#' -#' @seealso -#' \link{updateDirectoryInput}, \link{readDirectoryInput}, \link[utils]{choose.dir} -directoryInput = function(inputId, label, value = NULL) { - if (!is.null(value) && !is.na(value)) { - value = path.expand(value) - } - - tagList( - singleton( - tags$head( - tags$script(src = 'js/directory_input_binding.js') - ) - ), - - div( - class = 'form-group directory-input-container', - shiny:::`%AND%`(label, tags$label(label)), - div( - span( - class = 'col-xs-9 col-md-11', - style = 'padding-left: 0; padding-right: 5px;', - div( - class = 'input-group shiny-input-container', - style = 'width:100%;', - div(class = 'input-group-addon', icon('folder-o')), - tags$input( - id = sprintf('%s__chosen_dir', inputId), - value = value, - type = 'text', - class = 'form-control directory-input-chosen-dir', - readonly = 'readonly' - ) - ) - ), - span( - class = 'shiny-input-container', - tags$button( - id = inputId, - class = 'btn btn-default directory-input', - '...' - ) - ) - ) - ) - - ) - -} - -#' Change the value of a directoryInput on the client -#' -#' @param session The \code{session} object passed to function given to \code{shinyServer}. -#' @param inputId The id of the input object. -#' @param value A directory path to set -#' @param ... Additional arguments passed to \link{\code{choose.dir}}. Only used -#' if \code{value} is \code{NULL}. -#' -#' @details -#' Sends a message to the client, telling it to change the value of the input -#' object. For \code{directoryInput} objects, this changes the value displayed -#' in the text-field and triggers a client-side change event. A directory -#' selection dialog is not displayed. -#' -updateDirectoryInput = function(session, inputId, value = NULL, ...) { - if (is.null(value)) { - value = choose.dir(...) - } - session$sendInputMessage(inputId, list(chosen_dir = value)) -} - -#' Read the value of a directoryInput -#' -#' @param session The \code{session} object passed to function given to \code{shinyServer}. -#' @param inputId The id of the input object -#' -#' @details -#' Reads the value of the text field associated with a \code{directoryInput} -#' object that stores the user selected directory path. -#' -readDirectoryInput = function(session, inputId) { - session$input[[sprintf('%s__chosen_dir', inputId)]] -} diff --git a/inst/application/src/server/01_set_read_data.R b/inst/application/src/server/01_set_read_data.R deleted file mode 100644 index 802dd44..0000000 --- a/inst/application/src/server/01_set_read_data.R +++ /dev/null @@ -1,228 +0,0 @@ -#---------------- -# set / read data -#---------------- - -# observe directory -observeEvent( - ignoreNULL = TRUE, - eventExpr = { - input$directory - }, - handlerExpr = { - if (input$directory > 0) { - # condition prevents handler execution on initial app launch - path = choose.dir(default = readDirectoryInput(session, 'directory')) - updateDirectoryInput(session, 'directory', value = path) - } - } -) - -output$directory_message <- renderText({ - if(input$directory == 0){ - "Please first choose a folder with antares output" - } else { - "No antares output found in directory" - } -}) - -# list files in directory -dir_files <- reactive({ - files = list.files(readDirectoryInput(session, 'directory'), full.names = T) - data.frame(name = basename(files), file.info(files)) -}) - -# have antares study in directory ? -is_antares_results <- reactive({ - dir_files <- dir_files() - is_h5 <- any(grepl(".h5$", dir_files$name)) - is_study <- all(c("output", "study.antares") %in% dir_files$name) - list(is_h5 = is_h5, is_study = is_study) -}) - -output$ctrl_is_antares_study <- reactive({ - is_antares_results()$is_study -}) - -output$ctrl_is_antares_h5 <- reactive({ - is_antares_results()$is_h5 -}) - -outputOptions(output, "ctrl_is_antares_study", suspendWhenHidden = FALSE) -outputOptions(output, "ctrl_is_antares_h5", suspendWhenHidden = FALSE) - -# if have study, update selectInput list -observe({ - is_antares_results <- is_antares_results() - if(is_antares_results$is_h5 | is_antares_results$is_study){ - isolate({ - if(is_antares_results$is_study){ - files = list.files(paste0(readDirectoryInput(session, 'directory'), "/output"), full.names = T) - } - if(is_antares_results$is_h5){ - files = list.files(readDirectoryInput(session, 'directory'), pattern = ".h5$", full.names = T) - } - if(length(files) > 0){ - files <- data.frame(name = basename(files), file.info(files)) - choices <- rownames(files) - names(choices) <- files$name - } else { - choices <- NULL - } - updateSelectInput(session, "study_path", "Select a simulation", choices = choices) - }) - } -}) - -# init opts after validation -opts <- reactive({ - if(input$init_sim > 0){ - opts <- - tryCatch({ - setSimulationPath(isolate(input$study_path)) - }, error = function(e){ - showModal(modalDialog( - title = "Error setting file", - easyClose = TRUE, - footer = NULL, - paste("Directory/file is not an Antares study : ", e, sep = "\n") - )) - NULL - }) - if(!is.null(opts)){ - if(is.null(opts$h5)){ - opts$h5 <- FALSE - } - # bad h5 control - if(opts$h5){ - if(length(setdiff(names(opts), c("h5", "h5path"))) == 0){ - showModal(modalDialog( - easyClose = TRUE, - footer = NULL, - "Invalid h5 file : not an Antares study." - )) - opts <- NULL - } - } - } - opts - } else { - NULL - } -}) - -output$current_opts_h5 <- reactive({ - opts()$h5 -}) - -outputOptions(output, "current_opts_h5", suspendWhenHidden = FALSE) - -current_study_path <- reactive({ - if(input$init_sim > 0){ - rev(unlist(strsplit(isolate(input$study_path), "/")))[1] - } -}) - -output$current_opts <- renderText({ - current_study_path() -}) - -# control : have not null opts ? -output$have_study <- reactive({ - !is.null(opts()) -}) - -outputOptions(output, "have_study", suspendWhenHidden = FALSE) - -observe({ - if(input$init_sim > 0){ - updateTabsetPanel(session, inputId = "args", selected = "Read data") - } -}) - - -#-------------------------------------- -# update readAntares / opts parameters -#-------------------------------------- -observe({ - opts <- opts() - if(!is.null(opts)){ - isolate({ - # areas - areas <- c("all", opts$areaList) - updateSelectInput(session, "read_areas", "Areas :", choices = areas, selected = areas[1]) - - # links - links <- c("all", opts$linkList) - updateSelectInput(session, "read_links", "Links :", choices = links, selected = NULL) - - # clusters - clusters <- c("all", opts$areasWithClusters) - updateSelectInput(session, "read_clusters", "Clusters :", choices = clusters, selected = NULL) - - # districts - districts <- c("all", opts$districtList) - updateSelectInput(session, "read_districts", "Districts :", choices = districts, selected = NULL) - - # mcYears - mcy <- c(opts$mcYears) - updateSelectInput(session, "read_mcYears", "mcYears :", choices = mcy, selected = mcy[1]) - - # select - slt <- unique(do.call("c", opts$variables)) - updateSelectInput(session, "read_select", "Select :", choices = slt, selected = NULL) - - # removeVirtualAreas - updateSelectInput(session, "rmva_storageFlexibility", "storageFlexibility :", choices = opts$areaList, selected = NULL) - updateSelectInput(session, "rmva_production", "production :", choices = opts$areaList, selected = NULL) - - }) - } -}) - -observe({ - RL <- input$read_links - isolate({ - if(!is.null(RL)) { - if(length(RL) == 0) { - updateCheckboxInput(session, "read_linkCapacity", "linkCapacity", FALSE) - } - } else { - updateCheckboxInput(session, "read_linkCapacity", "linkCapacity", FALSE) - } - }) - -}) - -observe({ - RC <- input$read_clusters - opts <- opts() - isolate({ - if(!is.null(RC)) { - if(length(RC) == 0) { - updateCheckboxInput(session, "read_thermalAvailabilities", "thermalAvailabilities", FALSE) - updateCheckboxInput(session, "read_thermalModulation", "thermalModulation", FALSE) - } - } else { - updateCheckboxInput(session, "read_thermalAvailabilities", "thermalAvailabilities", FALSE) - updateCheckboxInput(session, "read_thermalModulation", "thermalModulation", FALSE) - } - }) - -}) - -observe({ - opts <- opts() - if(!is.null(opts)) { - isolate({ - # browser() - if(!opts$parameters$general$`year-by-year`){ - updateRadioButtons(session, "read_type_mcYears", "mcYears :", - c("synthetic"), inline = TRUE) - updateCheckboxInput(session, "read_hydroStorage", "hydroStorage", FALSE) - } else { - updateRadioButtons(session, "read_type_mcYears", "mcYears :", - c("synthetic", "all", "custom"), inline = TRUE) - } - }) - } -}) \ No newline at end of file diff --git a/inst/application/src/server/02_load_data.R b/inst/application/src/server/02_load_data.R deleted file mode 100644 index 646e0c0..0000000 --- a/inst/application/src/server/02_load_data.R +++ /dev/null @@ -1,159 +0,0 @@ -#----------------- -# Importation de nouvelles donnees -#----------------- -observe({ - if(input$import_data > 0){ - isolate({ - if(!is.null(opts())){ - # not a .h5 file, so read data - if(!opts()$h5){ - # Treat mcYears - if(input$read_type_mcYears == "synthetic"){ - mcYears <- NULL - } else if(input$read_type_mcYears == "all"){ - mcYears <- "all" - } else { - mcYears <- as.numeric(input$read_mcYears) - } - - # import data - data <- withCallingHandlers({ - tryCatch({ - readAntares(areas = input$read_areas, links = input$read_links, clusters = input$read_clusters, - districts = input$read_districts, misc = input$read_misc, - thermalAvailabilities = input$read_thermalAvailabilities, - hydroStorage = input$read_hydroStorage, hydroStorageMaxPower = input$read_hydroStorageMaxPower, - reserve = input$read_reserve, linkCapacity = input$read_linkCapacity, - mustRun = input$read_mustRun, thermalModulation = input$read_thermalModulation, - select = input$read_select, mcYears = mcYears, timeStep = input$read_timeStep, - opts = opts(), - # parallel = input$read_parallel, - simplify = TRUE, showProgress = FALSE)}, - error = function(e){ - showModal(modalDialog( - title = "Error reading data", - easyClose = TRUE, - footer = NULL, - paste("Please update input. Error : ", e, sep = "\n") - )) - list() - })}, - warning = function(w){ - showModal(modalDialog( - title = "Warning reading data", - easyClose = TRUE, - footer = NULL, - w - )) - } - ) - - # removeVirtualAreas - if(input$rmva_ctrl){ - if(length(data) > 0){ - data <- withCallingHandlers({ - tryCatch({ - removeVirtualAreas(x = data, - storageFlexibility = input$rmva_storageFlexibility, - production = input$rmva_production, - reassignCosts = input$rmva_reassignCosts, - newCols = input$rmva_newCols)}, - error = function(e){ - showModal(modalDialog( - title = "removeVirtualAreas : error", - easyClose = TRUE, - footer = NULL, - paste("Please update input. Error : ", e, sep = "\n") - )) - list() - })}, - warning = function(w){ - showModal(modalDialog( - title = "removeVirtualAreas : warning", - easyClose = TRUE, - footer = NULL, - w - )) - } - ) - } - } - - if(length(data) > 0){ - # save params - params <- list( - areas = input$read_areas, links = input$read_links, clusters = input$read_clusters, - districts = input$read_districts, misc = input$read_misc, - thermalAvailabilities = input$read_thermalAvailabilities, - hydroStorage = input$read_hydroStorage, hydroStorageMaxPower = input$read_hydroStorageMaxPower, - reserve = input$read_reserve, linkCapacity = input$read_linkCapacity, - mustRun = input$read_mustRun, thermalModulation = input$read_thermalModulation, - select = input$read_select, mcYears = mcYears, timeStep = input$read_timeStep, - parallel = input$read_parallel - ) - - n_list <- length(list_data_all$antaresDataList) + 1 - list_data_all$antaresDataList[[n_list]] <- data - - # write params and links control - list_data_all$params[[n_list]] <- params - list_data_all$opts[[n_list]] <- opts() - if(!is.null(input$read_links)){ - list_data_all$have_links[n_list] <- TRUE - } else { - list_data_all$have_links[n_list] <- FALSE - } - have_areas <- is.null(input$read_areas) & is.null(input$read_links) & is.null(input$read_clusters) & - is.null(input$read_districts) | !is.null(input$read_areas) - if(have_areas){ - list_data_all$have_areas[n_list] <- TRUE - } else { - list_data_all$have_areas[n_list] <- FALSE - } - names(list_data_all$antaresDataList)[[n_list]] <- current_study_path() - } - - } else { - params <- list( - areas = input$read_areas, links = input$read_links, - clusters = input$read_clusters, districts = input$read_districts, - select = input$read_select - ) - - # a .h5 file, so return opts... - n_list <- length(list_data_all$antaresDataList) + 1 - list_data_all$antaresDataList[[n_list]] <- opts() - - # write params and links control - list_data_all$params[[n_list]] <- params - list_data_all$opts[[n_list]] <- opts() - if(!is.null(input$read_links)){ - list_data_all$have_links[n_list] <- TRUE - } else { - list_data_all$have_links[n_list] <- FALSE - } - have_areas <- is.null(input$read_areas) & is.null(input$read_links) & is.null(input$read_clusters) & - is.null(input$read_districts) | !is.null(input$read_areas) - if(have_areas){ - list_data_all$have_areas[n_list] <- TRUE - } else { - list_data_all$have_areas[n_list] <- FALSE - } - names(list_data_all$antaresDataList)[[n_list]] <- current_study_path() - } - } - }) - } -}) - -observe({ - if(input$import_data > 0){ - updateTabsetPanel(session, inputId = "tab_data", selected = "Analysis") - } -}) - -# control : have data -output$have_data <- reactive({ - length(list_data_all$antaresDataList) > 0 -}) -outputOptions(output, "have_data", suspendWhenHidden = FALSE) \ No newline at end of file diff --git a/inst/application/src/server/03_data_selection.R b/inst/application/src/server/03_data_selection.R deleted file mode 100644 index 33190c2..0000000 --- a/inst/application/src/server/03_data_selection.R +++ /dev/null @@ -1,106 +0,0 @@ -#------------------ -# gestion de la liste -#------------------ -output$info_list <- renderUI({ - list_data <- list_data_all$antaresDataList - if(length(list_data) > 0){ - isolate({ - # affichage du nom de l'etude - study <- lapply(1:length(list_data), function(i) { - study_name <- paste0("list_study_", i) - div( - h4(textOutput(study_name)), style = 'height:24px', align = "center") - }) - # checkbox de selection - check_list <- lapply(1:length(list_data), function(i) { - check_name <- paste0("list_study_check", i) - div( - checkboxInput(check_name, "Include study in analysis", value = TRUE), align = "center") - }) - # bouton pour afficher les parametres - params_list <- lapply(1:length(list_data), function(i) { - btn_name <- paste0("list_study_params", i) - div( - actionButton(btn_name, "View parameters"), align = "center") - }) - # bouton pour supprimer les donnees - rm_list <- lapply(1:length(list_data), function(i) { - btn_name <- paste0("list_study_rm", i) - div( - actionButton(btn_name, "Remove study"), align = "center") - }) - # format et retour - fluidRow( - column(3, do.call(tagList, study)), - column(3, do.call(tagList, params_list)), - column(3, do.call(tagList, check_list)), - column(3, do.call(tagList, rm_list)) - ) - }) - }else { - # element vide si pas de donnees - fluidRow() - } -}) - -# creation des outputs -# - titre de l'etude -# - print des parametres -observe({ - # lancement lors de la recuperation des donnees formatees - list_data_tmp <- list_data_all$antaresDataList - if(length(list_data_tmp) > 0){ - isolate({ - ctrl <- lapply(1:length(list_data_tmp), function(i) { - study_name <- paste0("list_study_", i) - study_params <- paste0("list_study_params", i) - output[[study_name]] <- renderText({ - paste0("Study : ", names(list_data_tmp)[i]) - }) - - output[[study_params]] <- renderPrint({ - str(list_data_all$params[[i]]) - }) - }) - }) - } -}) - -# observe locaux pour l'affichage des parametres -# et pour la suppression des etudes -for(j in 1:16){ - local({ - l_j <- j - observe({ - if(!is.null(input[[paste0("list_study_params", l_j)]])){ - if(input[[paste0("list_study_params", l_j)]] > 0){ - showModal(modalDialog( - easyClose = TRUE, - footer = NULL, - verbatimTextOutput(paste0("list_study_params", l_j)) - )) - } - } - }) - - observe({ - if(!is.null(input[[paste0("list_study_rm", l_j)]])){ - if(input[[paste0("list_study_rm", l_j)]] > 0){ - isolate({ - # print("remove") - # print(l_j) - # print(object_size(list_data_all$antaresDataList)) - # print(object_size(list_data_all$antaresDataList[l_j])) - # print(mem_change(list_data_all$antaresDataList[l_j] <- NULL)) - # print(object_size(list_data_all$antaresDataList)) - # print(object_size(list_data_all$antaresDataList[l_j])) - list_data_all$antaresDataList[l_j] <- NULL - list_data_all$params[l_j] <- NULL - gc(reset = TRUE) - - }) - } - } - }) - }) -} \ No newline at end of file diff --git a/inst/application/src/server/04_shared_input.R b/inst/application/src/server/04_shared_input.R deleted file mode 100644 index 28b450c..0000000 --- a/inst/application/src/server/04_shared_input.R +++ /dev/null @@ -1,77 +0,0 @@ -input_data <- reactiveValues(data = .global_build_input_data(.global_shared_input), cpt = 0) - -observe({ - input_data$cpt - current_input_data <- input_data$data - for (ii in 1:nrow(current_input_data)){ - local({ - i <- ii - observe({ - current_value <- input[[current_input_data[i, input_id]]] - if(!is.null(current_value) & input$is_shared_input){ - isolate({ - current_input_data[i, last_update := as.character(Sys.time())] - if(isolate(current_input_data$update_call[i]) != ""){ - eval(parse(text = isolate(current_input_data$update_call[i]))) - isolate(current_input_data[i, update_call := ""]) - } - }) - } - }) - }) - } -}) - -observe({ - current_nav <- input[['nav-id']] - current_input_data <- isolate(input_data$data) - data_shared_input <- current_input_data[panel %in% current_nav] - if(nrow(data_shared_input) > 0 & input$is_shared_input){ - for(ii in 1:nrow(data_shared_input)){ - local({ - i <- ii - last_update_input <- current_input_data[!panel %in% current_nav & - input%in%data_shared_input[i, input] & - !is.na(last_update)][order(last_update, decreasing = TRUE)] - if(nrow(last_update_input) >= 1){ - if(data_shared_input[i, type] %in% "dateRangeInput"){ - if(!is.null(isolate({input[[data_shared_input[i, input_id]]]}))){ - updateDateRangeInput(session, data_shared_input[i, input_id], - start = isolate({input[[last_update_input[1, input_id]]][1]}), - end = isolate({input[[last_update_input[1, input_id]]][2]})) - } else { - expr <- paste0("updateDateRangeInput(session, '", data_shared_input[i, input_id], - "', start = '", isolate({input[[last_update_input[1, input_id]]][1]}), - "', end = '", isolate({input[[last_update_input[1, input_id]]][2]}), "')") - isolate({ - input_data$data[input_id %in% data_shared_input[i, input_id], update_call := expr] - }) - - } - - } else if(data_shared_input[i, type] %in% "selectInput"){ - if(!is.null(isolate({input[[data_shared_input[i, input_id]]]}))){ - updateSelectInput(session, data_shared_input[i, input_id], - selected = isolate({input[[last_update_input[1, input_id]]]})) - } else { - expr <- paste0("updateSelectInput(session, '", data_shared_input[i, input_id], - "', selected = '", isolate({input[[last_update_input[1, input_id]]]}), "')") - isolate({ - input_data$data[input_id %in% data_shared_input[i, input_id], update_call := expr] - }) - } - }else if(data_shared_input[i, type] %in% "checkboxInput"){ - if(!is.null(isolate({input[[data_shared_input[i, input_id]]]}))){ - updateCheckboxInput(session, data_shared_input[i, input_id], - value = isolate({input[[last_update_input[1, input_id]]]})) - } else { - expr <- paste0("updateCheckboxInput(session, '", data_shared_input[i, input_id], - "', value = ", isolate({input[[last_update_input[1, input_id]]]}), ")") - input_data$data[input_id %in% data_shared_input[i, input_id], update_call := expr] - } - } - } - }) - } - } -}) \ No newline at end of file diff --git a/inst/application/src/server/05_modules.R b/inst/application/src/server/05_modules.R deleted file mode 100644 index 0904045..0000000 --- a/inst/application/src/server/05_modules.R +++ /dev/null @@ -1,174 +0,0 @@ -observe({ - ind_keep_list_data <- ind_keep_list_data() - isolate({ - if(input$update_module > 0){ - if(is.null(ind_keep_list_data)){ - showModal(modalDialog( - easyClose = TRUE, - footer = NULL, - "No study selected" - )) - } else { - # plotts and prodStack - ind_areas <- ind_keep_list_data$ind_areas - if(length(ind_areas) > 0){ - # init / re-init module prodStack - id_prodStack <- paste0("prodStack_", round(runif(1, 1, 100000000))) - - # update shared input table - input_data$data[grepl("^prodStack", input_id), input_id := paste0(id_prodStack, "-shared_", input)] - - output[["prodStack_ui"]] <- renderUI({ - mwModuleUI(id = id_prodStack, height = "800px", fluidRow = TRUE) - }) - - .compare <- input$sel_compare_prodstack - if(input$sel_compare_mcyear){ - .compare <- unique(c(.compare, "mcYear")) - } - if(!is.null(.compare)){ - list_compare <- vector("list", length(.compare)) - names(list_compare) <- .compare - # set main with study names - if(length(ind_areas) != 1){ - list_compare$main <- names(list_data_all$antaresDataList[ind_areas]) - } - .compare <- list_compare - } else { - .compare = NULL - } - mod_prodStack <- prodStack(list_data_all$antaresDataList[ind_areas], xyCompare = "union", - h5requestFiltering = list_data_all$params[ind_areas], - unit = "GWh", interactive = TRUE, .updateBtn = TRUE, - .updateBtnInit = TRUE, compare = .compare, .runApp = FALSE) - - if("MWController" %in% class(modules$prodStack)){ - modules$prodStack$clear() - } - - modules$prodStack <- mwModule(id = id_prodStack, mod_prodStack) - - # init / re-init module plotts - id_ts <- paste0("plotts_", round(runif(1, 1, 100000000))) - - # update shared input table - input_data$data[grepl("^plotts", input_id), input_id := paste0(id_ts, "-shared_", input)] - - output[["plotts_ui"]] <- renderUI({ - mwModuleUI(id = id_ts, height = "800px", fluidRow = TRUE) - }) - - .compare <- input$sel_compare_tsPlot - if(input$sel_compare_mcyear){ - .compare <- unique(c(.compare, "mcYear")) - } - if(!is.null(.compare)){ - list_compare <- vector("list", length(.compare)) - names(list_compare) <- .compare - # set main with study names - if(length(ind_areas) != 1){ - list_compare$main <- names(list_data_all$antaresDataList[ind_areas]) - } - .compare <- list_compare - } else { - .compare = NULL - } - mod_plotts <- plot(list_data_all$antaresDataList[ind_areas], xyCompare = "union", - h5requestFiltering = list_data_all$params[ind_areas], - interactive = TRUE, .updateBtn = TRUE, - .updateBtnInit = TRUE, compare = .compare, .runApp = FALSE) - - if("MWController" %in% class(modules$plotts)){ - modules$plotts$clear() - } - - modules$plotts <- mwModule(id = id_ts, mod_plotts) - - list_data_controls$n_areas <- length(ind_areas) - list_data_controls$have_areas <- TRUE - } else { - list_data_controls$have_areas <- FALSE - } - - # exchange - ind_links <- ind_keep_list_data$ind_links - if(length(ind_links) > 0){ - # init / re-init module exchangesStack - id_exchangesStack <- paste0("exchangesStack_", round(runif(1, 1, 100000000))) - - # update shared input table - input_data$data[grepl("^exchangesStack", input_id), input_id := paste0(id_exchangesStack, "-shared_", input)] - - output[["exchangesStack_ui"]] <- renderUI({ - mwModuleUI(id = id_exchangesStack, height = "800px", fluidRow = TRUE) - }) - - .compare <- input$sel_compare_exchangesStack - if(input$sel_compare_mcyear){ - .compare <- unique(c(.compare, "mcYear")) - } - if(!is.null(.compare)){ - list_compare <- vector("list", length(.compare)) - names(list_compare) <- .compare - # set main with study names - if(length(ind_links) != 1){ - list_compare$main <- names(list_data_all$antaresDataList[ind_links]) - } - .compare <- list_compare - } else { - .compare = NULL - } - mod_exchangesStack <- exchangesStack(list_data_all$antaresDataList[ind_links], xyCompare = "union", - h5requestFiltering = list_data_all$params[ind_links], - interactive = TRUE, .updateBtn = TRUE, - .updateBtnInit = TRUE, compare = .compare, .runApp = FALSE) - - if("MWController" %in% class(modules$exchangesStack)){ - modules$exchangesStack$clear() - } - - modules$exchangesStack <- mwModule(id = id_exchangesStack, mod_exchangesStack) - - # save data and params - list_data_controls$n_links <- length(ind_links) - list_data_controls$have_links <- TRUE - } else { - list_data_controls$have_links <- FALSE - } - - if(!list_data_controls$have_areas & !list_data_controls$have_links){ - showModal(modalDialog( - easyClose = TRUE, - footer = NULL, - "No study with at least one area and/or link selected" - )) - } - } - } - - input_data$cpt <- isolate(input_data$cpt) +1 - }) -}) - -# control : have link in data -output$have_data_links <- reactive({ - list_data_controls$have_links -}) -outputOptions(output, "have_data_links", suspendWhenHidden = FALSE) - -# control : have areas in data -output$have_data_areas <- reactive({ - list_data_controls$have_areas -}) -outputOptions(output, "have_data_areas", suspendWhenHidden = FALSE) - -# change page -observe({ - if(input$update_module > 0){ - if(list_data_controls$have_areas & list_data_controls$n_areas >= 1){ - updateNavbarPage(session, inputId = "nav-id", selected = "prodStack") - } else if(list_data_controls$have_links & list_data_controls$n_links >= 1){ - updateNavbarPage(session, inputId = "nav-id", selected = "exchangesStack") - } - } -}) \ No newline at end of file diff --git a/inst/application/src/server/06_module_map.R b/inst/application/src/server/06_module_map.R deleted file mode 100644 index 21b61c5..0000000 --- a/inst/application/src/server/06_module_map.R +++ /dev/null @@ -1,144 +0,0 @@ -# list of opts for set layout -layout <- reactive({ - ind_keep_list_data <- ind_keep_list_data() - isolate({ - if(!is.null(ind_keep_list_data)){ - ind_map <- unique(sort(c(ind_keep_list_data$ind_areas, ind_keep_list_data$ind_links))) - if(length(ind_map) > 0){ - if(packageVersion("antaresRead") <= '2.0.0'){ - readLayout(opts = list_data_all$opts[ind_map][[1]]) - } else { - readLayout(opts = list_data_all$opts[ind_map]) - } - }else{ - NULL - } - } else { - NULL - } - }) -}) - -ml <- reactiveVal() -# module for set and save layout -ml_builder <- callModule(antaresViz:::changeCoordsServer, "ml", layout, - what = reactive("areas"), stopApp = FALSE) - -observe({ - ml(ml_builder()) -}) - -observe({ - ml_file <- input$import_layout - if (!is.null(ml_file)){ - tmp_ml <- try(readRDS(ml_file$datapath), silent = TRUE) - if("mapLayout" %in% class(tmp_ml)){ - ml(tmp_ml) - } else { - showModal(modalDialog( - title = "Invalid map layout file", - easyClose = TRUE, - footer = NULL, - "Must be a valid .RDS file (class 'mapLayout')" - )) - } - } -}) - -# control : have a not null layout, and so print map module ? -print_map <- reactiveValues(value = FALSE) - -observe({ - if(!is.null(ml())){ - print_map$value <- TRUE - } else { - print_map$value <- FALSE - } -}) - - -output$current_layout <- renderLeafletDragPoints({ - if(!is.null(ml())){ - plotMapLayout(ml()) - } -}) - -output$must_print_map <- reactive({ - print_map$value -}) - -outputOptions(output, "must_print_map", suspendWhenHidden = FALSE) - -observe({ - ml <- ml() - ind_keep_list_data <- ind_keep_list_data() - isolate({ - if(input$update_module > 0){ - if(!is.null(ind_keep_list_data)){ - ind_map <- unique(sort(c(ind_keep_list_data$ind_areas, ind_keep_list_data$ind_links))) - if(length(ind_map) > 0){ - if(!is.null(ml)){ - # init / re-init module plotMap - id_plotMap <- paste0("plotMap_", round(runif(1, 1, 100000000))) - - # update shared input table - input_data$data[grepl("^plotMap", input_id), input_id := paste0(id_plotMap, "-shared_", input)] - - output[["plotMap_ui"]] <- renderUI({ - mwModuleUI(id = id_plotMap, height = "800px", fluidRow = TRUE) - }) - - .compare <- input$sel_compare_plotMap - if(input$sel_compare_mcyear){ - .compare <- unique(c(.compare, "mcYear")) - } - if(!is.null(.compare)){ - list_compare <- vector("list", length(.compare)) - names(list_compare) <- .compare - # set main with study names - if(length(ind_map) != 1){ - list_compare$main <- names(list_data_all$antaresDataList[ind_map]) - } - .compare <- list_compare - } else { - .compare = NULL - } - - mod_plotMap <- plotMap(list_data_all$antaresDataList[ind_map], ml, - interactive = TRUE, .updateBtn = TRUE, - .updateBtnInit = TRUE, compare = .compare, - h5requestFiltering = list_data_all$params[ind_map], - xyCompare = "union", .runApp = FALSE) - - if("MWController" %in% class(modules$plotMap)){ - modules$plotMap$clear() - } - - modules$plotMap <- mwModule(id = id_plotMap, mod_plotMap) - # save data and params - list_data_controls$n_maps <- length(ind_map) - } - } - } - } - }) -}) - -# download layout -output$download_layout <- downloadHandler( - filename = function() { - paste('mapLayout-', Sys.Date(), '.RDS', sep='') - }, - content = function(con) { - saveRDS(ml(), file = con) - } -) - -# change page -observe({ - if(!is.null(input[['ml-done']])){ - if(input[['ml-done']] > 0){ - updateNavbarPage(session, inputId = "nav-id", selected = "Map") - } - } -}) \ No newline at end of file diff --git a/inst/application/src/server/07_write_h5.R b/inst/application/src/server/07_write_h5.R deleted file mode 100644 index becfce3..0000000 --- a/inst/application/src/server/07_write_h5.R +++ /dev/null @@ -1,61 +0,0 @@ - - -observe({ - if(input$write_h5 > 0){ - isolate({ - print(readDirectoryInput(session, 'output_h5')) - # Write h5 - withCallingHandlers({ - tryCatch({ - writeAntaresH5( - path = readDirectoryInput(session, 'output_h5'), timeSteps = input$timeSteps_h5, - writeMcAll = input$writeMcAll_h5, misc = input$misc_h5, - thermalAvailabilities = input$thermalAvailabilities_h5, - hydroStorage = input$hydroStorage_h5, - hydroStorageMaxPower = input$hydroStorageMaxPower_h5, - reserve = input$reserve_h5, - linkCapacity = input$linkCapacity_h5, - mustRun = input$mustRun_h5, - thermalModulation = input$thermalModulation_h5, - overwrite = input$overwrite_h5, - opts = opts() - )}, - error = function(e){ - showModal(modalDialog( - title = "Error Writing h5", - easyClose = TRUE, - footer = NULL, - paste("Please update input. Error : ", e, sep = "\n") - )) - list() - })}, - warning = function(w){ - showModal(modalDialog( - title = "Warning Writing h5", - easyClose = TRUE, - footer = NULL, - w - )) - } - ) - }) - } -}) - - -# observe directory -observeEvent( - ignoreNULL = TRUE, - eventExpr = { - input$output_h5 - }, - handlerExpr = { - if (input$output_h5 > 0) { - # condition prevents handler execution on initial app launch - path = choose.dir(default = readDirectoryInput(session, 'output_h5')) - updateDirectoryInput(session, 'output_h5', value = path) - } - } -) - - \ No newline at end of file diff --git a/inst/application/src/tests/size_app.R b/inst/application/src/tests/size_app.R deleted file mode 100644 index 9363367..0000000 --- a/inst/application/src/tests/size_app.R +++ /dev/null @@ -1,41 +0,0 @@ -library(shiny) -library(manipulateWidget) -library(antaresViz) -library(pryr) - -ui <- fluidPage( - uiOutput("io"), - actionButton("goButton", "Go!") -) - - -server <- function(input, output, session) { - - tmp_prodstack <- NULL - - data <- reactiveValues(opts = setSimulationPath("C:\\Users\\Datastorm\\Desktop\\antares\\20171114-1533eco-base_30mc.h5")) - - output$io <- renderUI({ - mwModuleUI(paste0("mod2"), height = "800px") - }) - - observe({ - - print("object_size(session)") - print(object_size(session)) - input$goButton - isolate({ - prodStack <- prodStack(data$opts, xyCompare = "union", - unit = "GWh", interactive = TRUE, .updateBtn = TRUE, - .updateBtnInit = TRUE, .runApp = FALSE) - - if("MWController" %in% class(tmp_prodstack)){ - tmp_prodstack$clear() - } - tmp_prodstack <<- mwModule(id = paste0("mod2"), prodStack) - }) - }) - -} - -shinyApp(ui, server) \ No newline at end of file diff --git a/inst/application/src/ui/01_ui_import_data.R b/inst/application/src/ui/01_ui_import_data.R deleted file mode 100644 index 0578880..0000000 --- a/inst/application/src/ui/01_ui_import_data.R +++ /dev/null @@ -1,41 +0,0 @@ -tabPanel("Import Data", - h3("Antares study selection"), - fluidRow( - column(7, - directoryInput('directory', label = 'Select an antares study', - value = '') - ), - conditionalPanel(condition = "output.ctrl_is_antares_study | output.ctrl_is_antares_h5", - column(3, - selectInput("study_path", "Select a simulation", choices = NULL, selected = NULL) - ), - column(2, - div(br(), - actionButton("init_sim", "Set simulation", icon = icon("check-circle")), - align = "center" - ) - ) - ), - conditionalPanel(condition = "output.ctrl_is_antares_study === false & output.ctrl_is_antares_h5 === false", - column(5, - h3(textOutput("directory_message"), style = "color : red") - ) - ) - ), - - conditionalPanel(condition = "output.have_study", - hr(), - div(fluidRow( - column(6, - h3("ANTARES Simulation :", align = "right") - ), - column(6, - h3(textOutput("current_opts"), align = "left") - ) - )), - tabsetPanel(id = "args", - source("src/ui/02_ui_read_data.R", local = T)$value, - source("src/ui/03_ui_convert_h5.R", local = T)$value - ) - ) -) \ No newline at end of file diff --git a/inst/application/src/ui/02_ui_read_data.R b/inst/application/src/ui/02_ui_read_data.R deleted file mode 100644 index 20bdcee..0000000 --- a/inst/application/src/ui/02_ui_read_data.R +++ /dev/null @@ -1,92 +0,0 @@ -tabPanel("Read data", - h3("readAntares parameters"), - fluidRow( - column(3, - selectInput("read_areas", "Areas :", choices = NULL, selected = NULL, multiple = TRUE) - ), - column(3, - selectInput("read_links", "Links :", choices = NULL, selected = NULL, multiple = TRUE) - ), - column(3, - selectInput("read_clusters", "Clusters : ", choices = NULL, selected = NULL, multiple = TRUE) - ), - column(3, - selectInput("read_districts", "Districts :", choices = NULL, selected = NULL, multiple = TRUE) - ) - ), - conditionalPanel(condition = "output.current_opts_h5 === false", - fluidRow( - column(3, - checkboxInput("read_misc", "misc", FALSE), - checkboxInput("read_reserve", "reserve", FALSE) - ), - column(3, - checkboxInput("read_thermalAvailabilities", "thermalAvailabilities", FALSE), - checkboxInput("read_linkCapacity", "linkCapacity", FALSE) - ), - column(3, - checkboxInput("read_hydroStorage", "hydroStorage", FALSE), - checkboxInput("read_mustRun", "mustRun", FALSE) - ), - column(3, - checkboxInput("read_hydroStorageMaxPower", "hydroStorageMaxPower", FALSE), - checkboxInput("read_thermalModulation", "thermalModulation", FALSE) - ) - ), - fluidRow( - column(3, - selectInput("read_timeStep", "timeStep :", choices = c("hourly", "daily", "weekly", - "monthly", "annual")) - ), - column(3, - radioButtons("read_type_mcYears", "mcYears :", - c("synthetic", "all", "custom"), inline = TRUE) - ), - conditionalPanel(condition = "input.read_type_mcYears === 'custom'", - column(3, - selectInput("read_mcYears", "Choose mcYears :", choices = NULL, selected = NULL, multiple = TRUE) - ) - ) - # ,column(3, - # checkboxInput("read_parallel", "parallel", FALSE) - # ) - ) - ), - fluidRow( - column(12, - selectInput("read_select", "Select :", choices = NULL, selected = NULL, - width = "100%", multiple = TRUE) - ) - ), - conditionalPanel(condition = "output.current_opts_h5 === false", - fluidRow( - column(3, - h4("removeVirtualAreas :") - ), - column(3, - checkboxInput("rmva_ctrl", "enabled", FALSE) - ) - ), - conditionalPanel(condition = "input.rmva_ctrl", - fluidRow( - column(3, - selectInput("rmva_storageFlexibility", "storageFlexibility :", choices = NULL, selected = NULL, multiple = TRUE) - ), - column(3, - selectInput("rmva_production", "production :", choices = NULL, selected = NULL, multiple = TRUE) - ), - - column(3, - br(), - checkboxInput("rmva_reassignCosts", "reassignCosts", FALSE) - ), - - column(3, - br(), - checkboxInput("rmva_newCols", "newCols", FALSE) - ) - ) - ) - ), - div(actionButton("import_data", "Validate & import data", icon = icon("upload")), align = "center") -) \ No newline at end of file diff --git a/inst/application/src/ui/03_ui_convert_h5.R b/inst/application/src/ui/03_ui_convert_h5.R deleted file mode 100644 index 893f78c..0000000 --- a/inst/application/src/ui/03_ui_convert_h5.R +++ /dev/null @@ -1,67 +0,0 @@ -tabPanel("Convert to h5", - conditionalPanel(condition = "output.have_study && output.current_opts_h5 === false", - fluidRow( - column(12, - h3("writeAntaresH5 parameters"), - fluidRow( - column(6, - directoryInput('output_h5', label = 'Select where study will be write', - value = getwd())), - - column(3, - selectInput("timeSteps_h5", label = "timeStep :", - choices = c("hourly", "daily", "weekly","monthly", "annual"), - multiple = TRUE, selected = "hourly")) - ), - - - fluidRow( - column(3, - checkboxInput("overwrite_h5", label = "overwrite" , TRUE)), - column(3, - checkboxInput("writeMcAll_h5", label = "writeMcAll" , TRUE) - ) - - ), - - fluidRow( - - column(3, - checkboxInput("misc_h5", label = "misc") - ), - column(3, - checkboxInput("thermalAvailabilities_h5", label = "thermalAvailabilities") - ), - column(3, - checkboxInput("mustRun_h5", label = "mustRun") - ), - column(3, - checkboxInput("thermalModulation_h5", label = "thermalModulation") - ) - ) - , - fluidRow( - column(3, - checkboxInput("hydroStorage_h5", label = "hydroStorage") - ), - column(3, - checkboxInput("hydroStorageMaxPower_h5", label = "hydroStorageMaxPower") - ), - column(3, - checkboxInput("reserve_h5", label = "reserve") - ), - column(3, - checkboxInput("linkCapacity_h5", label = "linkCapacity") - ) - ), - fluidRow( - column(12, - div(actionButton("write_h5", "Convert study to h5", icon = icon("floppy-o")), align = "center") ) - ) - ) - ) - ), - conditionalPanel(condition = "output.have_study && output.current_opts_h5 === true", - h3("Already a .h5 study...!") - ) -) \ No newline at end of file diff --git a/inst/application/src/ui/04_ui_analysis.R b/inst/application/src/ui/04_ui_analysis.R deleted file mode 100644 index 69341e0..0000000 --- a/inst/application/src/ui/04_ui_analysis.R +++ /dev/null @@ -1,31 +0,0 @@ -tabPanel("Analysis", - conditionalPanel(condition = "output.have_data === true", - div(h3("Analysis parameters"), align = "center"), - h3("Studies :"), - uiOutput("info_list"), - h3("Compare :"), - fluidRow( - - column(3, - selectInput("sel_compare_prodstack", "prodStack :", choices = .global_compare_prodstack, selected = NULL, multiple = TRUE) - ), - column(3, - selectInput("sel_compare_exchangesStack", "exchangesStack :", choices = .global_compare_exchangesStack, selected = NULL, multiple = TRUE) - ), - column(3, - selectInput("sel_compare_tsPlot", "tsPlot : ", choices = .global_compare_tsPlot, selected = NULL, multiple = TRUE) - ), - column(3, - selectInput("sel_compare_plotMap", "plotMap :", choices = .global_compare_plotMap, selected = NULL, multiple = TRUE) - ) - ), - - checkboxInput("sel_compare_mcyear", "mcYear on all modules ?", FALSE), - - br(), - div(actionButton("update_module", "Launch Analysis", icon = icon("upload")), align = "center") - ), - conditionalPanel(condition = "output.have_data === false", - h3("No data imported from 'Import Data' panel", style = "color : red") - ) -) \ No newline at end of file diff --git a/inst/application/src/ui/05_ui_prodstack.R b/inst/application/src/ui/05_ui_prodstack.R deleted file mode 100644 index 10a7ee4..0000000 --- a/inst/application/src/ui/05_ui_prodstack.R +++ /dev/null @@ -1,17 +0,0 @@ -tabPanel("prodStack", - fluidRow( - column(12, - conditionalPanel(condition = "output.have_data", - conditionalPanel(condition = "output.have_data_areas", - uiOutput("prodStack_ui") - ), - conditionalPanel(condition = "output.have_data_areas === false", - h3("No areas imported") - ) - ), - conditionalPanel(condition = "output.have_data === false", - h3("No data imported") - ) - ) - ) -) \ No newline at end of file diff --git a/inst/application/src/ui/06_ui_exchange.R b/inst/application/src/ui/06_ui_exchange.R deleted file mode 100644 index 1154103..0000000 --- a/inst/application/src/ui/06_ui_exchange.R +++ /dev/null @@ -1,17 +0,0 @@ -tabPanel("exchangesStack", - fluidRow( - column(12, - conditionalPanel(condition = "output.have_data", - conditionalPanel(condition = "output.have_data_links", - uiOutput("exchangesStack_ui") - ), - conditionalPanel(condition = "output.have_data_links === false", - h3("No links imported") - ) - ), - conditionalPanel(condition = "output.have_data === false", - h3("No data imported") - ) - ) - ) -) \ No newline at end of file diff --git a/inst/application/src/ui/07_ui_tsplot.R b/inst/application/src/ui/07_ui_tsplot.R deleted file mode 100644 index a3948dc..0000000 --- a/inst/application/src/ui/07_ui_tsplot.R +++ /dev/null @@ -1,17 +0,0 @@ -tabPanel("tsPlot", - fluidRow( - column(12, - conditionalPanel(condition = "output.have_data", - conditionalPanel(condition = "output.have_data_areas", - uiOutput("plotts_ui") - ), - conditionalPanel(condition = "output.have_data_areas === false", - h3("No areas imported") - ) - ), - conditionalPanel(condition = "output.have_data === false", - h3("No data imported") - ) - ) - ) -) \ No newline at end of file diff --git a/inst/application/src/ui/08_ui_map.R b/inst/application/src/ui/08_ui_map.R deleted file mode 100644 index ae5840f..0000000 --- a/inst/application/src/ui/08_ui_map.R +++ /dev/null @@ -1,62 +0,0 @@ -navbarMenu("plotMap", - tabPanel("Layout Builder", - fluidRow( - column(12, - conditionalPanel(condition = "output.have_data", - antaresViz:::changeCoordsUI("ml") - ), - conditionalPanel(condition = "output.have_data === false", - h3("No data imported") - ) - - ) - ) - ), - tabPanel("Current Layout", - fluidRow( - column(12, - conditionalPanel(condition = "output.must_print_map", - div(h3("Current map layout"), align = "center"), - leafletDragPointsOutput("current_layout", height = "700px") - ), - conditionalPanel(condition = "output.must_print_map === false", - h3("Please set or import a map layout before.") - ), - hr(), - fluidRow( - column(6, - - conditionalPanel(condition = "output.must_print_map", - div(br(), downloadButton('download_layout', 'Download Layout'), align = "center") - ) - - ), - column(6, - div(fileInput("import_layout", "Import a layout", - accept = c(".RDS", ".rds", ".Rds") - ), align = "center") - ) - ) - - ) - ) - - ), - tabPanel("Map", - fluidRow( - column(12, - conditionalPanel(condition = "output.have_data", - conditionalPanel(condition = "output.must_print_map", - uiOutput("plotMap_ui") - ), - conditionalPanel(condition = "output.must_print_map === false", - h3("Please set or import a map layout before.") - ) - ), - conditionalPanel(condition = "output.have_data === false", - h3("No data imported") - ) - ) - ) - ) -) \ No newline at end of file diff --git a/inst/application/src/ui/09_ui_params.R b/inst/application/src/ui/09_ui_params.R deleted file mode 100644 index 07d576d..0000000 --- a/inst/application/src/ui/09_ui_params.R +++ /dev/null @@ -1,20 +0,0 @@ -tabPanel("Parameters", - fluidRow( - column(2, checkboxInput("is_shared_input", label = "Share inputs between modules ?", value = TRUE)), - column(2, h4("readAntares RAM limit (in Go) : ")), - column(3, div(numericInput("ram_limit", label = NULL, - min = 1, max = 10, value = { - if(!is.null(getOption("maxSizeLoad"))){ - getOption("maxSizeLoad") - } else {10} - }), align = "center")), - column(2, h4("antaresViz data module (in Mb) : ")), - column(3, div(numericInput("data_module", label = NULL, - min = 1, max = 10, value = { - if(!is.null(getOption("antaresVizSizeGraph"))){ - getOption("antaresVizSizeGraph") - } else {200} - }), align = "center")) - - ) -) \ No newline at end of file diff --git a/inst/application/src/ui/10_ui_help.R b/inst/application/src/ui/10_ui_help.R deleted file mode 100644 index c037a67..0000000 --- a/inst/application/src/ui/10_ui_help.R +++ /dev/null @@ -1,26 +0,0 @@ -tabPanel("Help", - fluidRow( - column(width = 12, - HTML(text = "For any questions, please contact RTE-ANTARES-RPACKAGE Team .

"), - tabsetPanel( - tabPanel("R function readAntares", - fluidRow( - column(12, includeHTML("www/readAntares.html")) - ) - ), - tabPanel("R function removeVirtualAreas", - fluidRow( - column(12, includeHTML("www/removeVirtualAreas.html")) - ) - ), - tabPanel("R function writeAntaresH5", - fluidRow( - column(12, includeHTML("www/writeAntaresH5.html")) - ) - ) - ) - - ) - - ) -) \ No newline at end of file diff --git a/inst/application/ui.R b/inst/application/ui.R deleted file mode 100644 index 6bd73aa..0000000 --- a/inst/application/ui.R +++ /dev/null @@ -1,38 +0,0 @@ -# Define UI for antaresViz app -navbarPage(title = "antaresViz", id = "nav-id", inverse= TRUE, collapsible = TRUE, position = "fixed-top", - header = fluidRow( - column(12, - br(), br(), br(), - singleton(tags$script(src = 'events.js')), - div(id = "import_busy", tags$img(src= "spinner.gif", height = 100, - style = "position: fixed;top: 50%;z-index:10;left: 48%;")) - ) - ), windowTitle = "antaresViz", - tabPanel("Data", - fluidRow( - column(12, - tabsetPanel(id = "tab_data", - source("src/ui/01_ui_import_data.R", local = T)$value, - source("src/ui/04_ui_analysis.R", local = T)$value - ) - ) - ) - ), - - source("src/ui/05_ui_prodstack.R", local = T)$value, - - source("src/ui/06_ui_exchange.R", local = T)$value, - - source("src/ui/07_ui_tsplot.R", local = T)$value, - - source("src/ui/08_ui_map.R", local = T)$value, - - source("src/ui/09_ui_params.R", local = T)$value, - - source("src/ui/10_ui_help.R", local = T)$value, - - footer = div(hr(), actionButton("quit", "Quit application", icon = icon("sign-out")), align = "center") -) - - - diff --git a/inst/application/www/events.js b/inst/application/www/events.js deleted file mode 100644 index dfeb11f..0000000 --- a/inst/application/www/events.js +++ /dev/null @@ -1,13 +0,0 @@ -$(function() { - $(document).on({ - - 'shiny:busy': function(event) { - $('#import_busy').css("visibility", "visible"); - }, - - 'shiny:idle': function(event) { - $('#import_busy').css("visibility", "hidden"); - } - }); - -}); \ No newline at end of file diff --git a/inst/application/www/js/directory_input_binding.js b/inst/application/www/js/directory_input_binding.js deleted file mode 100644 index f4decc7..0000000 --- a/inst/application/www/js/directory_input_binding.js +++ /dev/null @@ -1,57 +0,0 @@ -(function() { -/** - * Shiny Registration - */ - -var directoryInputBinding = new Shiny.InputBinding(); -$.extend(directoryInputBinding, { - find: function(scope) { - return( $(scope).find(".directory-input") ); - }, - initialize: function(el) { - // called when document is ready using initial values defined in ui.R - // documented in input_binding.js but not in docs (articles) - }, - getId: function(el) { - return($(el).attr('id')); - }, - getValue: function(el) { - return($(el).data('val') || 0); - }, - setValue: function(el, value) { - $(el).data('val', value); - }, - receiveMessage: function(el, data) { - // This is used for receiving messages that tell the input object to do - // things, such as setting values (including min, max, and others). - // documented in input_binding.js but not in docs (articles) - var $widget = $(el).parentsUntil('.directory-input-container').parent(); - var $path = $widget.find('input.directory-input-chosen-dir'); - - console.log('message received: ' + data.chosen_dir); - - if (data.chosen_dir) { - $path.val(data.chosen_dir); - $path.trigger('change'); - } - }, - subscribe: function(el, callback) { - $(el).on("click.directoryInputBinding", function(e) { - var $el = $(this); - var val = $el.data('val') || 0; - $el.data('val', val + 1); - - console.log('in subscribe: click'); - callback(); - }); - }, - unsubscribe: function(el) { - $(el).off(".directoryInputBinding"); - } -}); - -Shiny.inputBindings - .register(directoryInputBinding, "oddhypothesis.directoryInputBinding"); - - -})(); diff --git a/inst/application/www/readAntares.html b/inst/application/www/readAntares.html deleted file mode 100644 index d7fc0ea..0000000 --- a/inst/application/www/readAntares.html +++ /dev/null @@ -1,274 +0,0 @@ -R: Read the data of an Antares simulation - - - - -
readAntaresR Documentation
- -

Read the data of an Antares simulation

- -

Description

- -

readAntares is a swiss-army-knife function used to read almost every -possible time series of an antares Project at any desired time resolution -(hourly, daily, weekly, monthly or annual). -

-

It was first designed to read -output time series, but it can also read input time series. The input time -series are processed by the function to fit the query of the user (timeStep, -synthetic results or Monte-Carlo simulation, etc.). The few data that are not -read by readAntares can generally by read with other functions of the -package starting with "read" (readClusterDesc, -readLayout, readBindingConstraints) -

- - -

Usage

- -
-readAntares(areas = NULL, links = NULL, clusters = NULL,
-  districts = NULL, misc = FALSE, thermalAvailabilities = FALSE,
-  hydroStorage = FALSE, hydroStorageMaxPower = FALSE, reserve = FALSE,
-  linkCapacity = FALSE, mustRun = FALSE, thermalModulation = FALSE,
-  select = NULL, mcYears = NULL, timeStep = c("hourly", "daily", "weekly",
-  "monthly", "annual"), opts = simOptions(), parallel = FALSE,
-  simplify = TRUE, showProgress = TRUE)
-
- - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
areas -

Vector containing the names of the areas to import. If -NULL no area is imported. The special value "all" tells the -function to import all areas. By default, the value is "all" when no other argument is enter and "NULL" when other arguments are enter.

-
links -

Vector containing the name of links to import. If NULL no -area is imported. The special value "all" tells the function to -import all areas. Use function getLinks to import all links -connected to some areas.

-
clusters -

Vector containing the name of the areas for which you want to -import results at cluster level. If NULL no cluster is imported. The -special value "all" tells the function to import clusters from all -areas.

-
districts -

Vector containing the names of the districts to import. If NULL, -no district is imported. The special value "all" tells the function to import all -districts.

-
misc -

Vector containing the name of the areas for which you want to -import misc.

-
thermalAvailabilities -

Should thermal availabilities of clusters be imported ? If TRUE, the column -"thermalAvailability" is added to the result and a new column "availableUnits" -containing the number of available units in a cluster is created.If synthesis is set to TRUE then -"availableUnits" contain the mean of avaible units on all MC Years.

-
hydroStorage -

Should hydro storage be imported ?

-
hydroStorageMaxPower -

Should hydro storage maximum power be imported ?

-
reserve -

Should reserve be imported ?

-
linkCapacity -

Should link capacities be imported ?

-
mustRun -

Should must run productions be added to the result? If TRUE, -then four columns are added: mustRun contains the production of -clusters that are in complete must run mode; mustRunPartial -contains the partial must run production of clusters; mustRunTotal -is the sum of the two previous columns. Finally thermalPmin is -similar to mustRunTotal except it also takes into account the production -induced by the minimum stable power of the units of a cluster. More -precisely, for a given cluster and a given time step, it is equal to -min(NODU x min.stable.power, mustRunTotal).

-
thermalModulation -

Should thermal modulation time series be imported ? If TRUE, the -columns "marginalCostModulation", "marketBidModulation", "capacityModulation" -and "minGenModulation" are added to the cluster data.

-
select -

Character vector containing the name of the columns to import. If this -argument is NULL, all variables are imported. Special names -"allAreas" and "allLinks" indicate to the function to import -all variables for areas or for links. Since version 1.0, values "misc", -"thermalAvailabilities", "hydroStorage", "hydroStorageMaxPower", "reserve", -"linkCapacity", "mustRun", "thermalModulation" are also accepted and can -replace the corresponding arguments. The list of available variables can be -seen with the command simOptions()$variables. Id variables like -area, link or timeId are automatically imported.

-
mcYears -

Index of the Monte-Carlo years to import. If NULL, synthetic results -are read, else the specified Monte-Carlo simulations are imported. The -special value all tells the function to import all Monte-Carlo -simulations.

-
timeStep -

Resolution of the data to import: hourly (default), daily, -weekly, monthly or annual.

-
opts -

list of simulation parameters returned by the function -setSimulationPath

-
parallel -

Should the importation be parallelized ? (See details)

-
simplify -

If TRUE and only one type of output is imported then a -data.table is returned. If FALSE, the result will always be a list of class -"antaresData".

-
showProgress -

If TRUE the function displays information about the progress of the -importation.

-
- - -

Details

- -

If parameters areas, links, clusters and districts -are all NULL, readAntares will read output for all areas. -By default the function reads synthetic results if they are available. -

-

readAntares is able to read input time series, but when they are not -stored in output, these time series may have changed since a simulation has -been run. In such a case the function will remind you this danger with a -warning. -

-

When individual Monte-Carlo simulations are read, the function may crash -because of insufficient memory. In such a case, it is necessary to reduce -size of the output. Different strategies are available depending on your -objective: -

- -
    -
  • Use a larger time step (parameter timeStep) -

    -
  • -
  • Filter the elements to import (parameters areas,links, -clusters and districts) -

    -
  • -
  • Select only a few columns (parameter select) -

    -
  • -
  • read only a subset of Monte-Carlo simulations (parameter -mcYears). For instance one can import a random sample of -100 simulations with mcYears = sample(simOptions()$mcYears, 100) -

    -
- - - -

Value

- -

If simplify = TRUE and only one type of output is imported -then the result is a data.table. -

-

Else an object of class "antaresDataList" is returned. It is a list of -data.tables, each element representing one type of element (areas, links, -clusters) -

- - -

Parallelization

- -

If you import several elements of the same type (areas, links, clusters), you -can use parallelized importation to improve performance. Setting the -parameter parallel = TRUE is not enough to parallelize the -importation, you also have to install the package -foreach -and a package that provides a parallel backend (for instance the package -doParallel). -

-

Before running the function with argument parallel=TRUE, you need to -register your parallel backend. For instance, if you use package "doParallel" -you need to use the function registerDoParallel once per -session. -

- - -

See Also

- -

setSimulationPath, getAreas, -getLinks, getDistricts -

- - -

Examples

- -
-## Not run: 
-# Import areas and links separately
-
-areas <- readAntares() # equivalent to readAntares(areas="all")
-links <- readAntares(links="all")
-
-# Import areas and links at same time
-
-output <- readAntares(areas = "all", links = "all")
-
-# Add input time series to the object returned by the function
-areas <- readAntares(areas = "all", misc = TRUE, reserve = TRUE)
-
-# Get all output for one area
-
-myArea <- sample(simOptions()$areaList, 1)
-myArea
-
-myAreaOutput <- readAntares(area = myArea,
-                            links = getLinks(myArea, regexpSelect=FALSE),
-                            clusters = myArea)
-
-# Or equivalently:
-myAreaOutput <- readAntaresAreas(myArea)
-
-# Use parameter "select" to read only some columns.
-
-areas <- readAntares(select = c("LOAD", "OV. COST"))
-
-# Aliases can be used to select frequent groups of columns. use showAliases()
-# to view a list of available aliases
-
-areas <- readAntares(select="economy")
-
-
-## End(Not run)
-
- - - diff --git a/inst/application/www/removeVirtualAreas.html b/inst/application/www/removeVirtualAreas.html deleted file mode 100644 index 842c7fb..0000000 --- a/inst/application/www/removeVirtualAreas.html +++ /dev/null @@ -1,178 +0,0 @@ -R: Remove virtual areas - - - - -
removeVirtualAreasR Documentation
- -

Remove virtual areas

- -

Description

- -

This function removes virtual areas from an antaresDataList object and -corrects the data for the real areas. The antaresDataList object -should contain area and link data to function correctly. -

- - -

Usage

- -
-removeVirtualAreas(x, storageFlexibility = NULL, production = NULL,
-  reassignCosts = FALSE, newCols = TRUE)
-
- - -

Arguments

- - - - - - - - - - - - -
x -

An object of class antaresDataList with at least components -areas and links.

-
storageFlexibility -

A vector containing the names of the virtual -storage/flexibility areas.

-
production -

A vector containing the names of the virtual production -areas.

-
reassignCosts -

If TRUE, the production costs of the virtual areas are -reallocated to the real areas they are connected to. If the virtual areas -are connected to a virtual hub, their costs are first reallocated to the -hub and then the costs of the hub are reallocated to the real areas.

-
newCols -

If TRUE, new columns containing the production of the virtual -areas are added. If FALSE their production is added to the production of -the real areas they are connected to.

-
- - -

Details

- -

Two types of virtual areas have been defined corresponding to different types -of modeling in Antares and different types of post-treatment to do: -

- -
    -
  • Flexibility/storage areas are areas created to model -pumping unit or any other flexibility that behave as a storage. For those -virtual areas, the important results are flows on the links. -

    -
  • -
  • Production areas are areas created to isolate some generation from -the "real" areas. They can be isolate for several reasons: to distinguish -time-series (for example wind onshore/offshore), to select some specific -unit to participate to day-ahead reserve, etc. -

    -
- -

removeVirtualAreas performs different corrections: -

- -
    -
  • Correct the balance of the real areas by removing the flows -to or from virtual areas. -

    -
  • -
  • If parameter reassignCosts is TRUE, then the costs of the -virtual areas are reassigned to the real areas they are connected to. The -affected columns are OV. COST, OP. COST, CO2 EMIS. -and NP COST. If a virtual area is connected to a single real area, -all its costs are attributed to the real area. If it is connected to -several real areas, then costs at a given time step are divided between -them proportionally to the flows between them and the virtual area. -

    -
  • -
  • For each storage/flexibility area, a column named like the area is -created. It contains the values of the flow between the virtual area and -the real areas. This column is interpreted as a production of -electricity: it is positive if the flow from the virtual area to the real -area is positive and negative otherwise. If parameter newCols is -FALSE, the values are added to the variable PSP and the -columns is removed. -

    -
  • -
  • If the parameter production is specified, then the non null -productions of the virtual areas are either added to the ones of the real -areas they are connected to if newCols = FALSE or put in new -columns if newCols = TRUE. In the second case the columns are -named *_virtual where "*" is a type of -production (wind, solar, nuclear, ...). Productions that are zero for -all virtual areas are omited. -If virtual production areas contains clusters then they will be move to the -real area. -

    -
  • -
  • Finally, virtual areas and the links connected to them are removed -from the data. -

    -
- -

The functions makes a few assumptions about the network. if they are -violated it will not act correctly: -

- -
    -
  • storage/flexibility -areas can be connected to other storage/flexibility areas (hubs), but at -least one of them is connected to a real area. That means that there is -no group of virtual areas disconnected from the real network. If such a -group exists, you can either remove them manually or simply not import -them. -

    -
  • -
  • production areas are connected to one and only one real area. They -cannot be connected to virtual areas. But a real area may by connected to -several production areas. -

    -
- - - -

Value

- -

An antaresDataList object in which virtual areas have been removed and -data of the real has been corrected. See details for an explanation of the -corrections. -

- - -

Examples

- -
-## Not run: 
-
-# Assume we have a network with two virtual areas acting as pump storage and
-# an area representing offshore production
-#
-#  offshore
-#     |
-# real area - psp in
-#           \
-#             psp out
-#
-
-data <- readAntares(areas="all", links="all")
-
-# Remove pump storage virtual areas
-
-correctedData <- removeVirtualAreas(data, 
-                                    storageFlexibility = c("psp in", "psp out"),
-                                    production = "offshore")
-
-## End(Not run)
-
-
- - - diff --git a/inst/application/www/spinner.gif b/inst/application/www/spinner.gif deleted file mode 100644 index d79561d51399938ee8f5dbe23030dc17de9a7bc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25080 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: Convert antares output to h5 file - - - - -
writeAntaresH5R Documentation
- -

Convert antares output to h5 file

- -

Description

- -

Convert antares output to h5 file -

- - -

Usage

- -
-writeAntaresH5(path = getwd(), timeSteps = c("hourly", "daily", "weekly",
-  "monthly", "annual"), opts = simOptions(), writeMcAll = TRUE,
-  compress = 1, misc = FALSE, thermalAvailabilities = FALSE,
-  hydroStorage = FALSE, hydroStorageMaxPower = FALSE, reserve = FALSE,
-  linkCapacity = FALSE, mustRun = FALSE, thermalModulation = FALSE,
-  allData = FALSE, writeAllSimulations = FALSE, nbCores = 4,
-  removeVirtualAreas = FALSE, storageFlexibility = NULL,
-  production = NULL, reassignCosts = FALSE, newCols = TRUE,
-  overwrite = FALSE, supressMessages = FALSE)
-
- - -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
path -

character folder where h5 file will be write (default getwd())

-
timeSteps -

character timeSteps

-
opts -

list of simulation parameters returned by the function setSimulationPath. Defaut to antaresRead::simOptions()

-
writeMcAll -

boolean write mc-all

-
compress -

numeric compress level

-
misc -

boolean see readAntares

-
thermalAvailabilities -

boolean see readAntares

-
hydroStorage -

boolean see readAntares

-
hydroStorageMaxPower -

boolean see readAntares

-
reserve -

boolean see readAntares

-
linkCapacity -

boolean see readAntares

-
mustRun -

boolean see readAntares

-
thermalModulation -

boolean see readAntares

-
allData -

boolean add all data with a single call (writeMcAll, misc, thermalAvailabilities, hydroStorage, hydroStorageMaxPower -reserve, linkCapacity, mustRun, thermalModulation).

-
writeAllSimulations -

boolean, write all simulations of your antares study.

-
nbCores -

numeric, number of cores to use, only used if writeAllSimulations is TRUE

-
removeVirtualAreas -

boolean, remove virtual areas, see removeVirtualAreas

-
storageFlexibility -

character, see removeVirtualAreas

-
production -

character, see removeVirtualAreas

-
reassignCosts -

boolean, see removeVirtualAreas

-
newCols -

boolean, see removeVirtualAreas

-
overwrite -

boolean, overwrite old file

-
supressMessages -

boolean, supress messages from readAntares and removeVirtualAreas

-
- - -

Examples

- -
-
-## Not run: 
-# Write simulation one by one
-setSimulationPath("C:/Users/MyUser/Mystudy", 1)
-writeAntaresH5()
-
-# Write all simulations
-setSimulationPath("C:/Users/MyUser/Mystudy")
-writeAntaresH5(writeAllSimulations = TRUE)
-
-# Choose timestep to write
-setSimulationPath("C:/Users/MyUser/Mystudy", 1)
-writeAntaresH5(timeSteps = "hourly")
-
-# Write with additionnal information
-writeAntaresH5(timeSteps = "hourly",
-   misc = TRUE, thermalAvailabilities = TRUE,
-   hydroStorage = TRUE, hydroStorageMaxPower = TRUE, reserve = TRUE,
-   linkCapacity = TRUE, mustRun = TRUE, thermalModulation = TRUE)
-
-# Write all data with a shorcut 
-writeAntaresH5(allData = TRUE)
-
-
-## End(Not run)
-
- - - diff --git a/inst/color.csv b/inst/color.csv deleted file mode 100644 index b2dcc13..0000000 --- a/inst/color.csv +++ /dev/null @@ -1,21 +0,0 @@ -red;green;blue;Column -17;71;185;PSP -120;136;194;mustRunTotal -120;236;194;mustRunPartial -220;236;94;mustRun -22;106;87;MISC. NDG -116;205;185;WIND -242;116;6;SOLAR -245;179;0;NUCLEAR -243;10;10;GAS -172;140;53;COAL -135;86;39;LOAD -39;114;178;H. STOR -180;130;43;LIGNITE -131;86;162;OIL -127;84;156;MIX. FUEL -173;255;47;MISC. DTG -61;96;125;H. ROR -84;151;208;H. STOR -101;180;197;netLoad -1;1;1;AVL DTG diff --git a/inst/htmlwidgets/leafletDragPoints.js b/inst/htmlwidgets/leafletDragPoints.js index b3de06f..8e6041a 100644 --- a/inst/htmlwidgets/leafletDragPoints.js +++ b/inst/htmlwidgets/leafletDragPoints.js @@ -14,22 +14,14 @@ HTMLWidgets.widget({ ).addTo(map); var points = []; - var mapLayer; - var markersLayer = []; - - function clear_polyline() { - map.removeLayer( linesFeatureLayer ); - } // Function that updates shiny input function updateShinyInput() { var coords = points.map(function(p) { return p.marker.getLatLng(); }); - if(HTMLWidgets.shinyMode){ - Shiny.onInputChange(el.id + "_coords", coords); - Shiny.onInputChange(el.id + "_mapcenter", map.getCenter()); - } + Shiny.onInputChange(el.id + "_coords", coords); + Shiny.onInputChange(el.id + "_mapcenter", map.getCenter()); } map.on("moveend", updateShinyInput); @@ -40,66 +32,37 @@ HTMLWidgets.widget({ return { renderValue: function(x) { - if(x.init){ - for(var i=0;iv;_t4QZpBelNSPqRq_J?8MSlPI73E{H% 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⪻9 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
a6SziMdk7UqR) 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

b98gMMqfqIQkmU529n&*I z{_7WNsU=mUKPC4_KT6i3{d2%D8mB}=c$c{IdQ^{Ji8XyRprjMosgl9`*Evw0N-zDF z3?)4-Y0cZO$ohW4WdBNHdHSK8PWDCB&z1D}XBmAgK&2l__?))~YAU@e(WmyR`ILB1 zqIH(6B70R5!`ds?w}&4e?f9>LR08G^UrH1oQvkh;=<6H58WF#h&wqInzkUVNM-_fe zVdcrR{$JziBMmCLFC%$S*{iQ)CrgdU-juduUlR%B`2aYQ$3H5y)R#W)P-;PVD!*1z zYC!wNuRKOCCH;;t{v2oPOlJ0%J^y7zeEju<@GPB7cDQr`zYnOTmOdl;mN}q3{J64d zWJk-+v;E>F;rDwe;r;s(wfp^z@cENYUuP+2Uuh{1B)eKZgXFOM0S*4+Mx|C)QUAXlw64E0;`876qz``&kp2C;pY-By z4C%|?C|XF^EWEB){E#~JC^J~?K)ns>r!jedH&U<*0KGst`Co|T58=iUOu8y>-haiT}>_+ zN3Z4!j?o*>f>-oLw4jvUlvY#kGIi4`POhd;Z)mF-WZ%lGmCMz1=#6YaW%jLS;{|d- zy8o?j@6hidy|FF0;9%CN4a#Gvy+D?I>+@DX7uL?GYU;Ac$ke(QM2EU}{JJCL0>!v! zXUV^!57?bv?H638Z#1YK;lI5AyuPzn_#e@m-)h$uOx;lhc!YfdU{uxAy}rP60FO7I z?B6~y&`UADTrH5k@t_vM`j6oIp?)xf5;k84ejcn}i{T^T-&Dssy3iZ!0(XAAf5E$< zqFrj;UtT@|***YuK#IR#`<3TE=&!@?|BZ}*;j;Wm-Fo-Qfo)@dL;6jF_Wik z@=NMG=_^2WgV1j?w3%f?rQiUgBWJWdcU?^ak9>^BMG0 z$d#I0?E}4muWrKki&eY@@ zeTW|#gB{HLMgk7yKkC}HO%RPj9#6nxTCYYK|IHA?+feC>NPd^b^FLQwR!yIa!o59AIv|K zuSdHak~@uL{u?7GAEhr4Xe{IP2lX+$9s;jb^u+^>P5eB9`sY(gUp1Ubo;7Uwbp!ek z9W`dLZ<=gnWo5r3{Jbby`kUn}_aqQ5zhhg`0uPxx!r(E2rh)0ZDKOV~X2G{06i1_zK_Xa$hn)0#nY zs+CCiXg%lY<|EhcN%l>9BI&>OD*6(I_7S4Db}Fq~`zF~P?GLmL?XN^1?Na_r7Ljrt z9iqRE73qnNJ?WQ@4dJU}OZHhuM0n`%pGs+tali5MiTUo+x>fUCB))2&AiJf#i`K6l z!{dSa70FXq90NY{S-(JjT&%~D_@PxydZVTIk+G8N_wOV|1a%> z$?j-plHO{+;rpZg50ZBsQ?f5Qfu!#$*oSW?uZLkI-#SxBpLOOi`Y$K>&{@OJ52*Mw z4JX%GNqDK+Z6W&WoTU9nCyDHy&NZTk&OPFr&K=S>om5^9 zRP!vN_3K2CUa0U}P5jo`k8zs-#*<#@+$4F`dCuCEF**B8{L(2Sy6I{YKXr}xevxwB z=7g`V1L3RdPWDRIn$>q_^?qazbOU&OK>c>&uWl0U`?|TTUk33(_X^3k?tNY!)8x9J zi2u5O`F3)-UPHbUAW#>J1{hqc@)L(~BVe*4sq(KyMd= ziv1@_uD6)%j_wEYZ*;#B-*tbG{3_R_g4OJcH70Ca3tEq!71HRYB!CCli157P9eTX@Ax`!OIcGJHYEj zRQ-G>NN@Gd(|)aYne;^OF4<+hm!z+%FZA@LdGwEweCxj(9mL;k3$pAz0B`sv>wKI+R!4ps09?MM3C$iLHH#nVGgu0NIa8%}=RKjxiEa;$%x z=&ApS=4-(8rh$O?qhCgJ&@ZC>PYD}rBD>h&9PzoqWqy5fd4u1CkAX4CkAVv-w-QbykQdU*A4IRa;_#fY)ATK*q@iHI=Lb9iwsZG{$-fMkB@eb`Ld7Pu!`nyq|4ir zD0w4OqF*B`@*5g8qj?%Rk-RtZB0JuwFUfPGL1c#-Eu`@qohSRysE}`ueosJ$&^mde zk2J55o@K{7y&~mCmWA(U!M`^$+1v3}rM29s0sny>PHv>NX{|-`e7TVteZa@aFzo%* zI@C9(4*?lj4_IsE9U?b!;M<{pkHsC+X@{>!^} zyodP0C}u>*>_os#d_Cq}!}r5HOZaioZu*;!cPEC_!zI@{X12k2D<7?G@eA!X@gE>U zzdbx&K60aT*E^=}0v;)RJ=)7_IzBjz@e}9+Mn)G4-%q-TbzdIQF~dq;50(9u@cQxh zlV1Se`}CnCqk>Iq?av*MH(o^ZH(o^RXuO1PA5vdGht}0NoTm?-kLKz2PTn|#UzZ$Z ze%yR{;~Bu?0^lMZAGBY?_p_EazHYqMdJHEwHhr|#cC|omY)k7iZjJJ)e7SKqqQ9{p zzs@MR@p!%*DK}og+U?=#EteaAAwC+v2c1eW&KrJS)W4wh7(aG;Kf?jfAMyOccn|q< zh}`%--w)+1TA%R^`oNR%HR5OE8N~O-o%nh+d1L1{9dA62lsC3#_?wYDG`3>v^WZ-e zh3B3m7meG~_>Ft=^-=Q1Q;3g^=dkvRNgf(UK^|p*%fX+P7$@~<@=%Bhdz8|?9ZR@}{D1SDw#UcMx08RI-<< z@p73SHf8c4?%wfc0m@^^o*B<)FqWqeoAbeqNNVc>9O;#yp;*UU`~np;X~Cc&@xk~v zPk-R`fyw!Erf*97@`T}ki?u(`*0qu8>td2W;~-wYt?Tt<9LbIG6sDgctbZG32b6lF z)c=l*ZtZz_LVYLVk4o8;+GO`XY#s`@M}Dhm!rsfd2CB~ zHttOOS7RHdFX}`OqjI*deI+^><7`K@Hhu@5-+=9TexQA4;){_RPfygh916S=2wvS-hVWAvb);`%Ngn zCVyJh?hfzApue(YRB#r{2l=zSktfUlu)Ll2UdoGV zucG{db|l4x+KcI&KzkX>+bQ#N%I9+^KGPmfd1P%jvP-Ib+BM44YTcqQdw} zJQ`nf5Xqg!9m*SM#1UUqFoosg3n=c_Sk3b9!L%NY-YoCjjPi2oFDU=4ewgfz>UsQZxKs9--@hx#z0zxpVOd(|hAe5)TJywxKqub>{t&Lce8x4+fc zr>R*!S?wF;0n|RRbEOCD+(^#Ok*@IajdqtvZq)V@zG@pNKc%*c@KRe%`lc4e&Y|XD zoN&xDhU7+dKBa^#K31Ji`4K^ z^(bLDotszs(66UdIud;=H3|QUFGS~x+jMWK;vCVj;xs#_m(#tgiW1geoqn~Xg1|%wR34}E(aP)mJr0a_h3>Jb)~)OpPUo$a?EXY$UpkkqWcNf=<89#YdEohJ zy6;nYo$fVM-U1#Q0olEZ%3-8ODta+k$$llKGMdr%E#0%ItR+|_Bz&vbJ&>wYT2Iwc zT7T6}8n-Hj-Fv8^`K#GIp6b5*eHpdXsw#FLg2C$6{J2r7=hckf)r>EHO{u@?{vof& zfhY%%d@JuG{$+ao_cHPO?`OK7P-8^=s<9w>scA^()AjZAD>^kEv<{`7)l8vv*G%W- zCaPXd_(JzS zYQqUnrM;*V(0b~0iNCdf=w4s#N?KoSC_f+YVE1rp^6B14%@pEejW693s%gXQ3a`gE z)l}>MTf^V)h)VsN!|2QG%imDalj;Ga-&NMUys4?~wN$>L`!|)Z>0Ur3yH{3uk=9qa zj>i-21IUh7D()>n->Rrx#ZkhmViwc8RwUQuKbU=4!R(Nf+W%Qg_rm`4AU>A`@brvK zEo)EXlsV9I)jd#lPqXw0$#q#ny0=nhMfcUpoQYm#o#{tj%C_)&0?78GGR1lT3+SF# zSpu7v>0?=Ic7N>;yEm0hc2ade>JG`}uUG6oX)#Za`uk767{7mIuzPsB$zG}MTluj5 zwzU3|a(+FLsU^&AsNh4o4^(o2?){WZq4kwG(YVE?{5`_D)S|v$Qi28uQa?Txnne5+ zq<)x1_b=a{`jWCZUXc1Oa?AJ>&_Dn3mI)fxg4DO?9xp2Ls7rn657RPJ+~f153Jg>L(Dc4*Yb_EK(pmqWGD3 zfiT`tXVl9OfiPjx@XOPt351t7Bp9`j2!yvXhv^!e5C|U)cVE`YT_Aip;90AXM*`uS zUhd1ahYEymBi)znNB_JH?#r4!tP{S{MExK&;gf6BK4%*0(LUqyFzsn*pWb|!&a!R- z;f+@s=dYri`cx-$^s_o)^3~xr2Xf9t(KAbj_|T&G~kKGQjZyVfhrkJzy5v z9});F0vcFX)B?Uo`%r=$aniiaU{Bs(L86{q-i zfbpn*4!j=o_@lj31M3F{XupEiS9y!(SHg<-{QB!*B~ORWQNl`3T1RCs;NcZn-*0fp z97k_JA;xWhdJmMl1FG}uM7;p>KSQ}GKMu;1LgsXwgz_#nz5+j#w-G%n2eI*G3|}c* zZyY}^U=Fpfas<8WK#y6#V>aNG1~zKj1j6dpplc(*IKrzoh38A8uug~S>o)WA3ph1n zdM{LcI=wHcu6RF^&&rn=l5}bQyZzTKlg|8o6`AM*wvSuU-WN)}&v1ZY~^)H@LMF?9|%T{*vTSwlV?$Mdn@miOA)j`JJyr~3M`6wWWy zxX!+29p^Wy3ny^KI)aZlTb`c5`HgsaENlbTF?@Sx_dRnszhQf})EKG*PH!7{_yM3> zy0w-Nux@JB?x*P2?Tu!*i1QnnTlV?NYK$j{>%3|k#t)cqbrI+_X84C^VNHxWX-9K@0XkFfPN?Jj27X*TJrDEs^X%+#2kj+)Tm5*3`Fa(OUDFeM>pA0% zMwv0^=X1YvE1o}G*#aH^O`M;w`LVEq_ne>i`JjIHu}<&e{>DxihwEDCv!gBAHyiTl zC+O`{uz&NhW}IJ-nQqbCS-{o#Q-q*zkJeK&>p(xB<>Skal%n4vPOSp`5*oECJ~R&F z`P-kr7Yrzh>k^mD`E`GvZsqUD`E{#xTd@#y=sK<2_H6K>v$orEyQQ3;m&v-QMPZy@ zE3*YUA)teEp27Vt=)4lch^5)ujK2Y?yTNUT$ z8c;D{BKYWXc!6Fs;N@~+T~uq#=k_v1wiEPr*LODG203vPhmY)j4DktFTv1QHjUZv0ri}@+CTaXv?&KDcT zgU@EIoXu+rIX}~vX0w}PT;t0ohh||OqpcY4#85m!1eMib~lm(l6P8x2;Nox1$jhViUll;AIBROgacvmNE z)>FWH!B?CLX_i}2sp6%>f5(~ zHw^AwS;9$b=8jzpd6(2`lteD*0JsbK3Oy4T!N2cjJ^7yBggF z3@nLw3j1OF(QGzv7aD&Y|2qkK-{@HIm6_mkLp8n8KNIWe*dV!cD<9CS!S0maQQ)g? zySOe#d3rV&Qg8|QX;mf7+YkBI+|zdG-2l+z;>m}YS5kE{d}P%=PEzqU=4>{~BXB}QY{fFF_{5he$`k~v9nuEG7fVovhC zyy%Q{7oexv>@0Ph#gj5@|2<|NPlv<=Kd`PsOh6TH#?`Sk1& zrV{}dpM2O1e14ifcI_EsPLg{sb5%b0{pelN{2ktalUn_lZ_7y@)>yvX2f4`cu)okA z_&lgfe*X^b9z^Jk5rJ+GI`45g0l9iGL96m8=#y<&F)-~V;Eg$Zn}QBGX3KqNMFVO^ zzOIBkX3xl<%+vcpWb(TsDBu5{)LwlYprws?Q!7rA{wlV4PvCp&+@lQeS#on&x>d>p zPIALx>!4F2PLd`#RI?l7rM?NZD{=!IJ!ij>D<_d3`|#}Td$j8vbMEX}^b=@RszXlG zGG}_V%>vv$q~KXCU|L+4>5%^$zG;`f1K*o%Y$Qu>V7@gyC-iHJ`FFPs)Z_8+u<>h! zd2UHNdnAEwH>(cS?nV8r$(gGz{lfDX3cZxv9+=)zj&`@(6#BG;9;F-Wje)(9+J;#-exr2?d`hWXw-o!bU{O}O^2YLi{+a*w7*tus$U2`UB6N2vjlX! zUiU_`7IaGKn9|z}a*{gM*-Q+6q<-7KCCd@;j3{>k=1;k?Bef0al5%Wc``w`1)wsx4 zbAU(k?BXU-m_J$aW~e{tn%sVC0MF;-QF~lQ_pP7*>a~>K0g#KUTg+ybC2*3Y)RQ@K z;F~xi?Vm zRW=e(tNqQ{;QMZkN10;(4 z3ej%c@9g1|U>A1kJj%EXyRj>K&?1c<|AI${;-(X@j$Jc9JpY3A?&>#aK|1ty`>>>W zS9G$eOkKpe%P%I+vTk{`!{|G`Q5rd?b2(&Ep6(Y z`hqT-ONSIp!+e{^n#~$$hw)Zd3=kIr+QoI{^>o7vx9I+m^9|v5%c>y1>)SkSV-I}S zm>b+LfZndYl$JOL&sW7Jf6&BuD+?EB`+^=Z#p{+1gxtiq+DP_bT`Qu@W`4uEmp?Vx zzY*guKib>o3iNjQrXdBpf&cQ{P+KpoZv~fjiKpj^1%npx`n#fk{NZBoWBEB7$#cl- z@(str;1|@l|2#HU3;Rm6bBb&%*0J3B!_#EYZTZ2iLl%O*%V)1!J`#8=9{jXT>{U*( zaPP*i)vzNA650+M3;kbk{MVRe;Qzc+LkjYtS2N=_ew~i~6Ra;9EQ37?8@_dj5PTi? z)kYkQ`NwkOfA<4l$961<9P)vaj43$z@CwEm6K$W+tpO(){Ve%|Bj^))IJSi`^lnsf zP`|F&k47zv>*fRb8znWHxd?hZN>~yhfZl`@pUeq`e2l!4G=E?WCmAs`e@X-B`|!bc zOXmUxS#@r80{sKEAKlJ@-VGbs>PGW)&@H+c%(08u}7Y)mSN81rQ8g%c*Te3 zdXG3sb$^F^<1bEJF;Z5#$dMEOIl1whkKFFEl??}b+{ci_Z%H-&Xqx^Ut*XPnJi z8FJ#+kH?osSaIT4eM*+xJIje*u3GNf%#0I1%k=K8iE*BWwfbp~@t@=@&@=1`=rGgk z!XZxlcv;(Fw-#{X?7fd}do1C^56bhWbVvbQ)N{g%ZJhZ2!){w6v^nv;9S@BK#ejA; zl0PKROY=y&Jjquc&ZIdNvx;%Qwlf2NgYaEm-noIXK){XVQeeE{N5 z(DhcQ_O~|R`K``{KEd2d_5*{}Le#d=elU-78GI4SSq504db z;_K(y4t)&#ufK>nyBYYW4CvG%0(4E;WHw6*zNP99TA0xc zZ|g^ZlZIv|f?g@pi<^45)zc$&MakmY7}Vb?^l@JLFZCBr=IomaSm+Y^ z_!7-41PtIr9ee**`k@ogL(1w}Ig@G2~;%G`-QAP~MtQ z=V&w$a792PU*NT2{Gf&U=)Zo+v9bIwysqu*Y-t4fUvr{;x*6!dX3C+zgF%PbeL;Qq z1Fp_}vFlVQpw`6Ghf$9Cn>5c4PkMFQ-~5>X-dXg?=j*iY*H4C|fu zGWbe==+ms>JJLjbIq^)do|D>O-f5Na_d)lm>$`2Qg8i9%Cwx>x=xzAlh1~=fj0%x;r|rNA$AhF7CS z(8E!o;UP`NapDkrlY`5ya^jIQTW;wFK8+}NZ&!?Yg8bZ~Ur9M};F=LyTOjvCnil%R z0H5C7o_dZ1f23y%xwTcCSW;&;Ck%2Z+MPXo5%j*tsjY(wFmCtJeNGf$UETWZkZ(f2 zt}8NE@$2aF);=K;bnMd0;K3^3)A`!g0C&hu=OMWZTS8ts1sio*lFf-bMt0jS0)0B1 z2xw!Cb+kV>@wDzj!0;UVP3t*vTY31%A;7cEu&G(AvEJ4bq}|^_K0IoR&Uiu}T<6Z; z48K+Ev;}?v_~p1I{zzmhC$=q1k*&mdHk+P$RstVuULIgyTdtCNW1kaSeTRPzysh5$ zoVX2oWA&qLU?tYq(mB25%vONz&K3h7{Y%-R==4nBZxNLu4Tt?Rw~2}C3VOBJR()+6 z_+$E1SeFKQZ2IO<^&hOS$*tJth2XErf*~K=W8e;lzzA%L?CvF2+9=Pd5X- zOq$#HEqs9bl=#C1;HydJI)^`4XY*AleL^t5MITOm2-a(re9>?R|D*D8#Z8|>o^48l z`u4{-HoZzBx`7Wi@^#C0;<>GC{GWKpiTwo8<7cpg_TPj22g3e1na$Z7Xvc}2M~R-a z?g+YB_csnQ<;3o%)-A1t-gpY0eYyj?&~{0vT`K6*E@b+WQP8(`%bd;QcXMJdq2*f% z^sw`!KF8N#{w}d@(JL@-m%z{EFVL<-Nu7f;_|(C#rByQ4*+FtLr$5%yUL)4b9^_aGmWR4PpGXM>~N#=X&3*Zonc7k%G20~8jf>|8IE}j zCasG~10D_5=#A}%=lbt28uEN?pq@W<8}wA~dfKIy(0kpmi-zm*Tvr?u*Bj&N_{E&F z03WpF!B;}h0S2bGJO(+_x)FTE0DRUu{NY(|*lTU4iUFC>2kq=Vu00@UI+l^I>abqz zPK7<)iaAl;c*su|Kr6^uG$*P_!#;!h>gGvv-?!pK6=|YeivUhkKG$UbxJ{hs&y=Dw z$=;mk_hTDBVIn6gJDN1_+eA)OYVNk88vRN}wZCa-#)*Cm66M+#aiZ_{E#EfP=0x9a zm3`?^3)o((GUEnd7qeMf4*+e)u5(AfZ>>urR-FPo;kG<~0pLZgioBPAK@|gz1#_aW zH#dGWm;u;Pt8zN(i)v!Q`~gH5>E8xPS1%S-gBZt-tR5oM4#@p`q3Boe^^$1 zZM=vRz3XDCSJ#0Pz51p%#=8+GdeJu2X08<{dNxLpZxTH%YE`@u&!5iK8$A!>}S7$>!5&j~}(@0u(8{C%A0 z>N%gD4YN2=^35Rs;%1!aid)Y~2Oe>vq^sE@)*s_UiH~d~LvC}TOSXd+H9-Bvorr^; za-s`rCWkb^pYsi4o6nuYiQ+CM&0PpSoa!`a(XpkR=;T~!_fuy%(b2R)i#mY*hdui@ zeu(lxkJuKg!QcIso!xe&aH8E6A6_{01?1yS%)fg@imc!nC))F=>`Qa-ac}$B=4~jga5=L}r&8}hy`KCW9Q(0Oh5r)@;w*XjrHN0)+5t77se$D!ZKgIfm&wB$rFyDi_m zgFHsh$XxZym=i7E(5mBgZh5JcuVxxMSU~mM04`vy6gcT zX0=u1zeLmbEzo@l{!RX4)ahm{V051oV^4FUDd9Wh*C4M`q=<(wZ}Fy*oUymGst_-T z#_o(iat(SCn%n9pKkmp==`Ag#oG5s6@RdoR!>~c?mX1Mr$jPUk0nn=<2ZOJ4gd7gt zU41PM{201pN9sM$ame(tFI@l!k1UBafjkVjJ!j7Z(5atcg#@0b0UZARzLFFaw2=)KL6rGc9HFGc80v!dN0sAgz;?}R9`g$ zJ}tjz2knLZvMPyu{S*AMnwCAhH4pd2oXv*5Th#>h%|gGH&1bed2|8HaFx9^gXr6bs z^e5JB79G?#5c1Gu(U1?XKo=8vsNDq6+hmxjzAN}(oc~5W?hq$x{L5_i2;gh<4)y|k zGSW?cKLhgKD7V|T#?aG7e4gA6;|zC;{($FAHU;%v1iNF}FsLtwbv0Wh$}NIjG7fQz z?gaWas@?cC2YTADbkL%S;D3Yt{Tn*L9_c?xZ#fb2rn@ilRhsJX3%UFltnBM3XRh(~~dw9s2eVp&#{HLC`tvKI`XN5j(0Dr%3f8!yZ zmrUz8H=&sGExzM< z-$C5so98&Km1hssUuYLKQsA3;{kf5AG+@?1wMQ5~BXj27@JDDD zdUVfltSf!Yk2COdd~Y3*1ULbo+csV24mAYSF3x{{7O=-^Ya8(Iw)(&>by#=0Ez#xX zVvXuWXqUD_>?>^xsNOz19qX1ezR9<9b8Z8FxyGW15a4%h*~C3RL60l*J9*p#K9`M# zHqk%M`6gbAv4?*7Ca&(V{vz5X^;x`OGv-UWuJK#{2HJJkZ0f_;=k8uw^A_#$cel^M zx-WHgz7$!&`CiN(_@)KcajA3ftF~PMeO}!*u&kXZADSeLlmpL$xos!)2mKERhKxD&3-v$K z?==KI2dg3mp9G%!Q_rqzf_e9yG~3k|da`F=r@Tt=ZTFBhU7ll}o%a^55uyK%k>h{p zgD=}f?Xz28z1y_`f&aF)ptB?3IKoR=ze5N5RE_e^b=t~L{jrY&NueJ*(L9wN3r{C2i(MZ)?`7i0oU?$gIugr6JB2gJl1fkjLn2FGoCtUaztpJ1GbHv^wimqgRIj_pCQK1bJSqp4dBM2@iW4B5v_rbMn`e zBJ^L|;_{=FS%4-_3w$x|I^J%*!aAgY;PZxP;>$)S*frp@k>?BgZ+Or?`!n!f&+94d z+q&Cm2fD--n`d~UeQbxNe;QyNtGivCe`q4`GTHd>I^=Pc|E}YSz-yIvLge8eobO70 z9LU9rYd@cU$NHk58xPHa9bH+vL~}Rzvf4U!-5%&sY{<>gFbl2fp9x zLj7;Or*+(_LU~htIlV9Bqyg+Zv(Fi9pS*n*<3j##{h|48@_L2!-C%Ys^(pCTN(Sr( z^gV@_<7dE2Gk<;!#<{}pOIUB>FS0k6Mq(d61=!?mS|{-7QYg)TIe_-1Bq7b4ID@rU z_H!gVb%E`x3Hs~xFZhti=D9F~#y!vW-LrLLBAdgWo*5iEC=z;j#v-{v9Km(dz@!9H@E=|{Q+#sPnBxzai=KBNBU{^la`VN^H>o5uW&~G`(i>y=r z{8w{1U$HjXZ(k1Fc=r5?@j>67p7{&gLC$=Nh^`zz4*XB=TC59l&^;;EJ{5A_ zjko7$-(?Evd&hX{*Rf09$Qa01hZWA2k!asxTwGT<@aYhDxAYq5-?4Yg%{{T+PMQfr zs~{JhYUk`t10A|}mVF)ox^>;P@M?e9(XN?Z4NI_JbbXn-@I3b2ZpN2x+z0);sy7XI z1NwCH9P;Tc*3tRKhi7wP7duBdTMP%CJFi`HFAV!q=P^bd7lVGC7JUnu3w+vN)H(YH z{k*Q-KQRjJyuyQ%x5Llys(n__68h`)V!Qr6v~O24>+@&WW6#_MrikBtTVL_HGz4=)c>Tib2D%J~v^~yjNI{+mU(wZ)BjIolDLI>?^>Ee>T@af7_;m5pVgr?VPh`2JrQ0=s3<8 z^4GdS{E?rKzcv=H{KvztwQ0TZss`5E=E;<%)?(m2#i-+N=v(`dBQ)lMj~(8$zj+1o zcZh8oFd1^~m8f&}0Pt@w${wBt`SDucbZ{E*ZuikJY8=LEE7;?*4tmq3hlTSk(53Z? zJuX>*9@+2hH^Q!Zw0N^3_XNE=onAaW9rE1SbK>cryd353kk5mjc0Xz1 zavl4o_q^EVx9)Pj!Zv^Qx?-KeZAtSw0dL{wXP=e>AI>fLT?zazF3A3TG337ITCFMr ztXtGRMJk0o5`TEHvorWCvDkdj1$awN9Gv_a`=MXX9v4l>yEH9P&`Pp$E#z~chUd{-@TGt0_&?#$?*Zms4J)yK_c78N za}?|A-F}C>59r*d_HM~<$iaZn0qMUn?x2q)OI$#YAq5*c?gl@H4$NGY0r?slvhdn$ z;4}0?(p-yeoNwTzQ2SPp*C77|x{l}{G&HMwDb^J@NK>Q^z68#GZ@U=l4?0paV<7Zr z#Q2_*3_-tj+l4i+M5&4V7!S%1`l?{z%I327j+!_LHO_wFV;Yg z!rc!_lA-^T`VaYZ0rECs!4CPVAdH(5=97qcc(n80ypdS%sKotSdxQbHbb0p}{X_PJ zgl~gg897+1;v(=5e(7_`9dsKpdB~^USa;Ckwt=@n*I|>dc$@}(hFPu^iD2i48Y%7} z`VQGs=rg(Nzm${e9DA>?r~i=2i>FV;I70@R>J_8^kc6T$hLD4yb}K4=W4%L9*(V$Z zzlOD)Rk#xT9=6xE<^hT%o9&>g#^kCR^|KaJV4-6guryv`xD$Iy`@G3=s15$(-@3DDtKejb>KOAOU<+-%scjesn>hZVQjO`ZWqD7F#$Sp zYa!=j4x1d{=MB@0>#6~{n>ggJe+bX-`O_oT!fs7^X8Cq4)-iEoonu$n&j~xayqg96 zn&3b2j5+3+Xn#Am5$x8ujWKcQz;mqE#fGzZIjgpjRKbr33wm$64tR%!KQt}@UB`^l z3w;AT#CadY2GC8ZQRX;DQ4hrSpO?--+*V>oA8m(p;zJQ`BOAtm!`PCQO|~4 zPHUCry$cxGPWkdJS`@A-pHFCUHdFNhrd zY#8kOqTh4&c|xC;^d6xx1^il)x^zPv=ojI1Y~1XHfGI)#=V50fuLbqf!Sg7?g;!f) z-H}(9ZX5T=YhV*BpW&n1-(w(Hk;*)_NRit4}Zi3r-|d9Uz&`~4uJC># z^!PgOzhNDzeEfiQ$lb|LzQy93+syyW;^QCe4-fc!4dm|0ddd?Ot){$4$y-H!PozEz zajS?EIr8yYD^AqukixGNaa$0NgmR)Da}@EBNJRNQk(i&a87Gn^U_M(;B%?S{)Q935 z(STwaXD}Z}wgu$loyVML;Cn^) z$UllgDP9qU)+y*98clJpX!IGy`bDGnDdH2+=q`$QK@`gBLtPd05RIaEOcX-?wJ30b zf-j;$xwOvyL|;)qe?^=rT0a+bM*ZPr8ZRYT5%-GZlou7j7^C{8g4*BDv%pyge zMU=_Mp`b$sAE%z>MCrwf_*ay^R1uGhZn1f9IV$o8qMLIRag8YLn<8!y$%~18*VuZJ zDXtM+Ij-QlD30P3(aCFwPbPArqj`!rQgnELBJLOMTc_~vMVrnl{Cm;HjtaREt;$m5 zi$p6@74jikO7Wa1lFuuqaH5D5h5U(@P~0k7L~S$j8zM;!hMWmp$t7S$0bi z2Z>g!C;mh~Q^b9uRe=gU60JF>h%ZGO`1T7y7mBk*XFC!f6UDLi?f-y&Ozy86EA&p3 z_L|mzm-5@9yG#!rG$Z~!VET}qOzX~#p>dw2Zn^px^IqURLnie4O22RXI{QRJ2E#-^E>VXQq5~~>~&Q-*MGR)T#^^^w^Ym!|NYnChGSg{t#msp$R zRjf_tCSsj#inw2_D^{HAi1jF+B5pwXEjC!H$UBJ*>J)h*aYM>uiyLlJ=(D)tz5E6D z)H$&s<+a6zM0ar`vR`5&%D;#klU$39$t_M-hs+@9>TxC8BH;tq5!C+^r< zu|J4A-B#>h;x3f86L+aq$eXx3jDOxd-oQ_Yb=}1{9NA&9A8+5sapK;*yn;@>dAs1oiThF>O6*VhN^yU(x8ebB ziEo4S75l4rFq6BXbUr8^MtUS3#^WEsi37>*ivwxD6o*irRy>x`J&f{N;_o->o=f^Jo=5wgcmdgI@gko8(32=LTIVv# zr;3;J^eN}W(FuzEQoNGvxOnvpg&vDzc{}of6R)HFSj^5H#G9DDZKnK`cyl4~a|_u) z@m76>T@r6)^KRqk`N4^IOriDfB0omFhw1k|3tG?q7)3rl*#fO=G9%1F9 z%nlq=CpsSMOY1zw_^f<>1wlI*IAPUQcH zk7O(I-u3m3NbU|ZdwPicQ5C%owIn;G#Pc|vUx|+~dw7(sSIMvAy{X?x+E2u%$R87* zVRCVX;dw?=;b)3ZlfNK7MfpwfDK`E|UjCld!!xNw@3V>2|GXi!zvM;qW#CRx$GaGBZVEANTU z$-KP*-;!_BxYz0YQJj)TbW7#^J=j}0lP@{>n_@Znb>cLpKXN+fQ`O&O`_fJFx5YOX zDe~Il8>Ez#wZ`~k0y~XxF6@IMWP4chAx1=NoX^f6?CKqXRPeYu>_OVo^2dRuNsr-JG ziuSxc52|l}gZw`6Er#c~-kxRvLjUdpkMwd{_iZzh^V@8nQLZy%0pXJwP5V=3 z4ACXMjO0fNZ!`OMo9%nIDgR#oJcI0Q=5d7|EY2`goY#tP)A@_|Hu>4&j0~Dz+3x;u zh2JO6X7c`s`3n!3ozL0Bo-_VuGkJdSQsFm>?=yRJpZPQQnf%di+4mfNeX#dA zY=6q8`v+onA4L3+(d!@c?WmKVWispIGA94xF7wlr z^t&IeIOi4LWBYd&^HZ}H(LS8T?D1U@t^W?)hY;U6Me9+uXZoUScaPb@d(4jAJEAy8 zQ$4>+c>r-1#i6QkZkv)Ha$^edHFXZzRi*v9E@JkK*(FsygYp8R-;G9!`$u9$JdFBu zCPx``-YCwZ`yAqXykAuf{_y+Q)OxwhaaY98;vA;m51TQ_{Ikbw-*{$4<(F)Keo6Nv z#IKk=e?67_>Nknx55A#uGVvQ7>i?SAuRO|+i1P<2;#n1ZOL3t%uOsPu9`ncZC_WSC z(Y-41Tc$^^`F-UT=4bodOJ>(!(mB5P}F0D`b{3Wv^ zFWEk$T+b^y_ZPor{_$((H@{}}Z<(EVdz}3Lw-gtP-!eYF3n#w5|D`xz7Jp#=%tvM) z-fyDu@+toyetTOH|BBzT_~{Mvo8M5psp6j!ua_*|c**R{E4B}+=J%pFMsW`ia{ivD z?}d6iKIqfF^nvNCs-F1;Dtwuqe`5aqr!6EepBNtt7`+O4{LXRW&&)qmwku%!askt$ z0%pGpnBQK&uT#c}iI34{``05&wpq8*mvef7mrcgYY_in_M(LO!=-Jh zed!T;UPAZ0#6L`lzTf_RT;@N2r@W)Mn9jMyKPWFFE@u8tF^f-&nLH}{|6p<056Xv$ ze>Nih`N{0gFBWf?F@68T_NTIIWdD9KeJ)}4Oxa&K{|^>V6w`f9adBV8{U+7?Kbbr$ z=PzdVNBLa2-fwJw{>uC{B`o6kWM0p|LMHD8bl*f({>=Q-BIcJU`+apJ|K+Q_BL6G? z+LzYxjbAUG7qhs$8Zr&6!FD{;s%K`gHDY9 z&XhNixX}57#D&S5vb`($#S&NYt0k@!KS|suUoUZ2CwX?Ke5Irn`Dv0?VMKR#ihm{U zyJ$WSvVSV5YR{m@14SM|;z8#&_5E1cjr_fOJSg5(;iII#vY*>W#uu`W5;rD)s{X8f z8%Ec*Ozt|8A1Ud;eo&A6Nv}qy(I3GpI71KM)pnOPJWxjgZu@FC;15yPx8+sZODI@w5R-tq$B0~C0%I$ zlXRtfS(0uP7fZU69h7*JUnA*3`>sT^M3FC(NN69GNXRddh-v>*)%!uNqBJ;(l=g9n zl;U-Xl=f4Jgz^ol_A>JCBz;;d@dKpCIYO-R@@u&Dl z(vR|R_3#JbF@VX(0J^^|8OZoOkkN0DtHK|V3}Sp4%=9{d>2(0bZ<0ZDekB>e_^BF? z^0KON2L4gxp(Fz-|MJgym>n9-^n3{U>yn}5Z%c+TJF3W6&H-flt9nj(KFKi3lSqa# zy&rOl=%R!}$$ydzqdbLV80BpxL6irO1W}wX3CbXSA6}@q?o1Ss*N^CZ=LL&*=21X7$L2_iqEo^EWP z86K#J`y?Y6J|ifelnkfy4N1@=lF#8fY#ch@lMJJCs(QLn-d9D>q55P$hS2?3$q;6L zhEiN638HvGGMw&Zs^$%*yo6*V`A3q`6qicIGWw2Vc0G*p){==ANzW$Hxn4cw_jS;J zBE{p93Cz!!Kz@*9JmqaABw@_%jL%c#(Ipd@K2BnE4X1d% z9@6=&WGeZ+lBvv|O{V<4WFo(RtjBnC-l&>)9HaL*CVyio9+iYqUPLmU*^f!gkDAQv z?G#4m$yH=ur!xCDtpnjVmEuv!6w3EVCet~Xie5@OO{Dy%WIW@Ga{e)F9|>i4cNE3( zDi}ubm}CNzVvA0nPhb;?Z>f{rAH`CueY@gY~{D(c1 z@00A|?-60&+spUA$w~I{^CBMG$NUCmyS+@$579jr$ziq+9$|j?5#~=HVSGQv_OTOm zKSpwj-XE)nl%JBsQ9fJ+PY)tKouT)ZC1>froa7wy_u}cjD@i=_56&~cKc4ADJoBI8 z*}kWIp1|VIB%aQ9Imuyun7q<#51^IuX}oR!MrcsbpRklbW(%FQzJ zKhs&>A%n^19p*pYr*mpaHe1(27T-Q%a;SK38T8Jja|_9nE{gjglBX=bc){f174th^ z)4dtVYbL+1S^X;}zpwcIF@Tg;R+V4Udu);yj33Y0KJ=XVqt97?jq4^nc5#e+(HIZNj(l6boRAW5)NoK7sXE}S-gLO?vtwQz)?2e3C6cmxs*RV!~EhnW~bs9 zf0TN8$)5J${Kf0N6z5AS{kux<5lWI-{_!e{^RBbJhze3ZS(3u~ zsq~l0dm7z$l%z2`aFfZ`Ew=u2Iv5PhPrnE{Pw4<@S{d@K4Ed+Rx~O5NKioac`F8oVJUUpPo;OlH zR}&67*l=ZOS4XNh;_LMlqbvUSy2eUm)#~sc)fw|h^8K3&>w<5%mwXfm>#lzEmre%E z7%)06UQJl{<4>2Q?W7kD;5JTe*Z;r0f<0lOT%`>S{y=iBX` zjo+{c&ez*5!hwHbxBIF4C%Ht|a&*~pX8ymehkt7N?@ya~TL1I^HlF`aacs!Y1I(IL@qYX{NU@k~7zin^810 zk~6E}%Lh5LpFJ|Uu_2sUAw4&H<1wS4p@1`c!1`s}$ZWR^QZ@E7$Ol%-qW8?qf=f!*<*mz3#gP+evg{L%&d@<=A%5_UKDb|x_ z(%ve)LwDGucPLht-XUL4ddFUo%aUf&nVj?v*>dS!+FPaf=&rQ%KHWuqbzSsp^=A_TIu5Vei>>mO% z?ESKp{vQ_nmja{DSq$MBcz`osawD@_i+s-f2+z1E&cf4U#+x~u>bdk8f9bcHlRl-x zc9BR4AF@&>7;x$3YSroH&p$xKd zq^~I&lD?+wq4YInv8Aub`;xw(TW`{r6fH|%leZ#$!zA|&Mg44?|3Gm4|1H5S4`|C4 z*l7cikq>9@%lQYvdyXIac4W%^|DNFSyd=sw%M{*3SaX)iD4VHqmPurSEYI;Ug0qY! zf?Lkz%V5w--t>UbdtqV>@>SzV-%xs}o^XtyugN`?zNTv{(l_)vg{s|Ky6z%p9_xUdgZoyd(`DS?IkbtxHPaD&+We(=^ z8Do|k!dXk6UYV9J=d49)V=StyIqM#*UH7Ol&Cf>G!=9)=n9o`F<=Yu?*2DPv4V?9u zfGe}zInH_n>(AzqzNY&^(pL$J?|(>NQNBw0isCuxE6S5g75B;p)<0JQ_jh|bt=m|KP->iK&t0>yMmGesTt!VSit5qacqhW>1PGd?kt zlYY=C5Zdhi2SdjO6towmy8hQ1*s=}3hse2>X0)eR)$*G!2%gU~IF+-?h@0^)?I35B z!ZS|DSt-1;QJmEoo?!<#t0R27Iy`6XzYxP(a%3V^kj*3gKp9NwdwMfO`i?Re(sz_u zk-m>0hQ6Z=u{57C_#H*QDh7R^lM3la=6!vnH?LLW6a2r|z?R#6ooJhnvB{6(T0Y`8_cX3$Ccj64;MaM=t8pzi5o20L@){GtwOm4) z+Hw-_1PHm7Q+Z8H|9TSdol=I{E;~XHDE&)0 zcxg4|uBFwK3zz<-9F4SwzL_NxY*U1NG{0GAaIA}!fDv18Cy+)@d2Tg z?HR*c8S$KxIWHIj)i^R8N|LLf9=!}C(<4oj>AzMuAF_t@vVzQz4u@q1bSNX!BTZ%f z|L?sztG$;r}JU6F9dD^5)!i$qRH3C9ltY5)sgS z(i+1oM{B_Kn&;F!@%+VF|5fpvd+^?eTf5=;u+-?N+8or!f0?b0cH0Z)VB2m{;_dB&=7Znp_P zx92>5KAhVdvIK7VG``z?2D6)8nQ~RYxqW8y{37qwt(eXCgN^@{7aSgv*XvfwU?o`= zcSC+2j&pB7g6OWt=%Y(`y6f=k3#ngU6JAh3Cv#pvZ8&!`Mn@CAY+c`8gD$*#LyJhmvFY0hm8Ki(+LZ39_Mw|!)x z-43$(_OSjjjPFql?`ZaX9m9V+(M{FwD9MjoJSn;g|C{_cX#a_)+Xj{V%Jk^;N2bGk zm`b{JC#~Q!OwgYS%Eki@71?7eE<3IG`kJ(?`^ksRP+z9AKxb$(PWo$H(dln+c7KM= zmR^R%{z11aq(7Kt{>dzOF`Yt4ztb&z={M#~f1_KH(r>r`|GMI-Qm2(CrwR7JY?4rb)LqWSaDrx=e#^QOne$6>lxc z)F{s)Q=_jE$OOF=JEu&YzLFx-pi?%P2GLtJo;IyVrcFMvOsiP&)dHC&!&8G!*<|W; z8%w#f%e2NQZuO})3IjSVlNr)2EgAc|h0KJ$t|4n`phzponu!SCW^_6vYerv(l{KN$ zNtqGda*{Qo45q9h@mr?fL2*l&$?t#IV21sVee5m5faV|bI9YR(*j8tk{9}W0xVf&a zS!Te0y`#6>%SWN`nRoEMa~^zT-Y1UaT5jfjX!y$OnXetoeCHLYAN~$_@jf(s@m;*{ zEmVyoGo@oKSu^r|Wu|mJL&m?R(hLI9oDy)d=3$ECZdr52kmhtD|M#h2n_JDcjS>cPGGUokn}dt~L7)Yv=dQ{B+4#RCkTYj=^UMNV0Fx&S5fri;chZ%V+)gv>N^ zbg@9zgDw`zdeT9!@v61e<={1ILDN`NbqGJd#$Z-gZ z8i%oHF^GI5M=|ePHs%~VlYlt3WBt8Y|F*2Z8~IRvFOr}MY#>h zXLQtO^J!A%)lr>2Z_M{cl5WF2SGnR%Jy{2O z<3rY-zThEiPbqU*d%7Vi^P-y|vi5WXRn~#NL?Y`%Hvwgx8SFwg5M^CNiW?NNE_4%E z)|qb9sbCkj_jjS2DzYx*gQ)720`Eg_Jji;|4P{v`x@jx(VS6@5Hz8y~-bZPtT-SdP zNQ?imh3XwVD$nXJH0aN9E${jN5Xk8dYP)D`{cltGW}Hm`G2BMNEKfILtW5_B9&Fl> z0NQwwK-qMspuxt6FMDz}y?Dk?<7~!~(`_@31i>bh1VuT%jH9bDG9g`glL_gSESZo} z_c9;)G@h&{V|Xvd2wyrql=;%tWto_cS7jnr--FI-*!chVc_~+~3)2ez7yz+uF%MIB z{4;f*y`WAm_@l zam8%BJ|tMmb;)|u;hIcF?;OZvboWdqqdQ$P8Gq&jZ`zOUfT>__x-%t{(YKFe63Q&g zM0A%^)-zY}O&?iLdUsFOgYLN1Z$0!a7@0SH+pT^pWKg*Ua&%`>=0|r)WxZK+(1(rJ zheZ*6SoF|`q8hfY|9gw!`rvMO$KzLFLi_yqQnmCS0x5sDYu&u6&HtT1s#S2VnY2~8 z-r_BTHRqbn1TTxidDk2!P%p@5aV=(Pk~S>eBIX4}jdL49zKvTT3%~oYu)hOKleqB$ z7Rk9e($?kX%))sOmNse2`gP**K)DB{QQQK_g1L=l>5Z8z>|aQV;I@(k+%1ZQ^$SR_ z-Db0XGye_FU}=kRmKGVs))U5HI7^32VdE*w6DU9EHk!2yB1`Eukfk$}>s7)K2FKIZ zs~V?2>nCFC?#j|kL)p5N_$c8ZmcHuE(kEiJ4vyj9jp5me$HND7r01@6)ZXt$w$5*fTsKB?<<9{>KF>osyoT$2ee*DK6GJmS}xQ$Owt;;-v- z!pk*>8KyK^x9fQxAC&hqLwK0sb&Pf_*VC;35jOt;N&~s>e`>lzsex9d3%!_xenyV zx8Ym^+4_~RE1RbW!$aAA7|DZbo^XcO47UFH%+Rl7bckg5Enw@LM{?u3fbmTUXEObq z%IFzR={46dhDSg4Tsi*;(lghIjE~B3mNWd7a0TO^5}#P|3|tqp@?3_ma{k$jK64l! z<|^AU`5DjbOfWBhIra1!#@aJG;yRe|V<4l`K!$gJw&C<8eN=6XgBhI{{o6WX*oL>3 z$>U~5&uwg+9c+Dj*f{%G{VulQ9b|HPimm%1D=YOQiS@g{#y`i_pTOvGiQ$#R@KEYa z65~$-ldEL5o>bCn*INv)42JJbN?W_8uyK{+D50FK_cr5yHXHW|(|@I&zGiath1n$y z){fZ=H%*py)#0Cy;@tF^T~R`9X74nZeX09@LN|40pEQ|$*Jk$V-^bBp^9vXq|1v&T zGI=d!>weGVJ&!zA75*<6y>eOqdyEfv7@aa$JLSHX!uWEXji=1U)`ko9On=Uzhk2#m~|K29dFM9b!){ZXq$lB7&O|n+>@fn#r%N@A0P|}TF?vlCE%O^5tx~wj9q|5X&dzQts zJEV9SSZ0@~xJx3lr;i`jL*}45tX6!?S>{L|lc|SvM@8m92e2{+x)3UJq?a01?VQ`iPRuhFI@ zzXOY89r%~OvQbYT*^)WYM{s0L^brje-<{|sH<=r~tR!p2_~FUc)rRHRTGLDVGS6tm z%T%(~bi5>M&FjlRgRG3`3$;p^m44shmMz2 z_P~e9gAWVjeCXqcvL1A?Th@cgZI2m>kI>0_vH+_Wz3eOVrI+?(zH|ji=1VUt$wc&# zE18%b4~ghwl`;`KzVqer$*#{ZD97!=0=gdb(IQzdW(P%dvqmN^R@_CC`LXkQDg9`g z${tFjiXVxrpO^I$%~8CZBol=)Jm{rv6~4XbE?j-?ls=*&>&fJ%7o(T5y)S(vOD1Be zFBN`l-4d3H6RlSq%gK7t$8BUi>6o%U5N7tvn+4w9^kV=rA${yj=EIJWeCQ6Iif>9h zdog|UrH^F(0}nCNLovGtA)${isPIz;)_&|XMZ)w^OfNCjk3$#r>&q;~Ct-HMkJ%w* zfxEYm{r!Fr7Q=qW6J^b5ja_Y#+UxgPWET~Rz4p{FEq#o@%zPQPBxg? zzoE?(AA6S#<>h%lCmX_!NduVO9!wu$lnr9^q<#HABqaX+Zxa&MXFETQ@b&{D{gVrV z{&{n2TGcWek3-)7Wroa_v%X9Lo^=vAHr9z0h*@7^w}{WNTg9iyv9`WR4y*Njb{qLN zIq24x$YHWRNe-6vem2flaGThEHFj!)g@UVea%4@NM99~ z4P)ooL+NchS$~%5R0>8vdb?WYPhVk?^?RiF%Asr^UD1;b4yBy+F#5GiSs+WD2GQHo zZ2tei;Ku*s9JS!(m6QiVIoa^3R(IDI{e!_Prp^I+rmpk0MO#?{pEyx|Zdt%~_7yks>1-PxPz& zSr6SvaFqDShO*PEq0Dj(VV>d;`uve>D19D8#qgob(hjAc`&Kb7nC;9XnI#ROTgH!}-NJw*R*E z{J#qTC(8AW3CnBo-wA;6CeG%;SFd$`Abh#)87+My&UWKL>7mQt-7!OE- zXIn_2q@5NClwBiA1=yKW=x=9B0%hk+0%PY&p|)L5K6HD>*@cpT+RdZT&n}8mEOzVI z^Ic?N?DkWrY{zaY*Sb!M6KL7SrxGDVVB%35B+HANlbQa(3_8czG16+r6Qbl-+AK{wvn+1Emn`elomk z2`_ssTDN@zHh*JMVEZPdsP;x=vF(j19M161 z)i{R}to>1E!!8=%A)55WA&Qlia3!PTdg8akPB#8=*8eKq$aIjCoI2cO z^uNWP-)7_7Cw+6sX7CBgv%_=7zqcf(4&NF4!{{MkciGLUo#QY@&tO(RirqpO%kIFB zr*wkknmSQ zJ+g-?*o@ZeWX_&Duq)!N2w$i6B`Hns(r>4Jr2kH%NKTw)(>k5@ll^gSLF;n%py$r5X+CEU!q>SKd)|fk;oP3=k8?ZX zzq2RN$+-jB59eNd|A(A2JF;-@Npj)boz2&Y*6rMml{>QellK%{BWL3 z`sloc*5!PhmCvzq8qv==pX`M52coNU1@(7PBYAPrrggY9COfBs4QYRLX-@dKv|{DM zguhE7&F8|dQMo)M{dRdq^5K$2a^Z5F=;jhb{BoI2^mZ9d__>T^Fp%ts%Mg-Zm)^uD z7a^Oc3pti99m&qQcoE-S+OYl}qz5i8e7`i##g*3U;!de#7f+(6s$W}*P+Z!uex7_i z@b+Z&jwH`6=EP4IW1^#qE?R_#b2a1pXTsN+T@Q19!T9l%|GYJpp8?4_ICMVa~cxn9ejd)JpnFTk=jM#AO-Qa) z(2D5gV#DOZk;YNM);xY2ITvsCJdp8m7~}I$vKJ~j8BTWIC6tE;ITv=M=Q5Sar4oiQ zeugssj%0EaO!Raa!}uJ=^kO`%+hsD-hZ#gSmwB{5xGZ7qmNU4D=;E@DjlY@IZ=s_A z7sU}N`t2fmxg28aJHqBU#>PL*)_aMqiyig4$l18JnEqywp1UwPa(Tt%@+UhoVMjl% zjoDFI19nuS&yM&E*-=;%c9iSNj*yghPMp}0vkN;C?Wnx#!j4FkunRjHQQk>W9vv#- z0Ct4r&yL`fM}>jx$YvHh+KFaI+MC%CHG6|Zbu@R1;dzANeV&b@JfeHRj{dS3{P!yr zS?q}FK0Bg&$c}=QN9NDj(NaD;k}Y6(7qfB7`Er!%sILCVjve)|H%?rCvvo7*=EaWQ zda|n(BiNMz)fET!X2oQ7Wnv;b+EZS&P(pU3>$aC&Nl?OV?25xCqOV&lyV|gXU6okQ z-c;Gl$~##5-RupOlk5sd9IHRau8N#zM}rA$o(t^FlLX>}TLQz29mTp`W$U=k)+JZI z@j-ry+ikY4JFI;+yK<4k=DW}8GuV8G!H49Z_3J#u=08pH>2`@-Wx2wRO4*U383HuI?9Q@?z%)DcNQP1-t1|~-k`E$Zwz^oytsE@Z$OPC{M;wgRU7wN7pJi?OTa;s3Xx{oY3h?R{%l8{N z_Z52+eRVMJ+9A>N&tTjgO(RZm=)Y4h;M_@1&VBny>t;9ce1}eHVhYCDeXV1iHR?~e zottg!!@0*TD`@1upL4(LlPCOucGq_`eYgsEWDe}z{@ZlU{ch&=m8DUf`@PLs>FPZE zWIX=EM$Y}g!gg~qdrQB@%`i`HM)W)*z=v9i zy>6soy#1v~>KOla?7Sye(f`IrdE_g!Pn%OyHWPT<>~Gy%2WDX1QD0_gbpt&@Q)Z7}jHDMo4{{zpBm4}1Zs0t6ro2Bn)CbSSliVHUoJXrq5hs(-uSw{> z(INSqhpD&S@=T8Nu$z$A*@J)X^n60v56;7_ncdPt^y{$kX3>ir&O`j&I1KoB1S|+k z`PrKD81ry#zjx>tp0-w63B1C0e3`GC#(9M9*uGIvQV%DpS+{7_lJgkfpuo5%<_(Q) zuy+aY8aXNJrcDIKS^IGN*NvRVil=89F2VeZCXHDA5#@Q2UuMlidCu!{+r7YJ_803W zdr_WwJyFQ7bNt!aliHoFnY4!Mq7qxMS zLjCw_YQc%XZ^9e-`Wn!0(yFTEnp}Om9erm{v{BmB_XhSp znqLpUY55sMW1R0Z8ysALasPZRXrwRaTB$GHH*V*2u9aRz!ixkou9eQf5sR;fpzING ztaA?6s)1}o%o%~Iok#T+wc$@NfBD#l+w|9CoSX;FTAU}f!)1s?K;o~b}57KYDq@);j%`~3&*(8KSN5@ zFiu2@uBQb1&jRh5KaDVdq}t7rT-e2p{?Q9H(QbFNZkuLCocpfi+?suW+s3F3m%(mr zEo%CtH|*Gcd@}7LZl@)#gVj+!WYS>!EBFbk zw+!s{8vaDY3gc;E@L$4tyN2;YJ*L;T#B;AUV}>1pzhLnvEOj^9>8gEuw+8q({NeZ| z8}l~!7V={h@Y8Dk>fRyvsed;=pKQTjxmrDYOc4CXI-^yee!+jNuFb7$4*&5_QDD=~ zqu@VkFKcK6zw^`3SC5;Z{?((|GYsI5=8OsXHW_~JeYG*e%+WtRyTQH+_^me$_XX9W z{#uU3@m>!(*Q=p{X0PE_UTthVWenOS)s2W*#rwf`zP%5^cn6EaPJIJj{VT@=&P2Jx-|cHH zFs}3JK#S|}zn!P{Xnz^=I*&^1(H{NmuIwtCgtFD=SGn=P!_48t{&(ot^jI7By}-Be z**3Q45GOR8F?)O{@X&MdNZy3@n%`##e9>NQhuV-gC7erbj}4a_BF-sSKchb$am?3e z&$O};pA{yZn`wx6|7pAH=1&ke9pl%>$4QY#y@8^e68v)6cHz3|D)iqR{nPIx z;+@qaN37g~_-d)!!F%QCKR>%ihr5W^W(wy$*@<{E4C~#7_$ajf46R_y6SR86#SMtV zxK=;?pJKcgd5+(fpsdxkG@&2j-|~jjs|pbJmU=hMZH73wWO~H$3;CS$&(IB5MTon9 zs0X&VgSh*LF!X=Aq-FY058MkWlLOCv4NA}7M!!9?*AARw#5wP+4NK_-{0{uqyd9rk4|nEtET4anbKclg zGi?CIi~Tf1Z4cu46*qL-6;1=}vf;|uHk|YFLB7W$Fz(V0VYeG1o{y-Rq3r=Y=NdFp ztHwC9uZ$VK19;7D^X+{z4)FBz3C*nQpU*wJZ}c*h=LKIm_XqgQH_ZJz{vF^;-PU~G zY?1Y<4?RJrMPq!ABZTgN88L-59eaO4qqaUq@vvEp~q!s ztfS+bfP_?x;}!nEtqA>F+uE&YjegF_HQxh3msVOQ_ME`F#QnbG4JU5=RZ%luz&-8W3mj$pB=CjvIpFz(ppE-W=j^|uj7S4N>4m#Mi z9*>4-|)VhjB;0Jwa~_R?p;1&t7zOLA>j7t2BD?Mm&EWlXW8*GR&IwXx^x?PFcRGUG_td3DlPSB)8Vk%53(x7#=gvEMYawm7Yw^DnTg*CqqlWs5Bj zJno`j@93sEJ7MPsdM`5=2pBXb;f+BW=Q@Gp#&zWjKOHUX51TCm;&-C|&YV4dzaa{DA%1VG0zK%Jo4-j5;cvj9H|!R!!2UhyNn)?gm~W_j%535ARRHf7ml&ZGT5R-}Tt>-F~C` zdDgwz^$T+Ewr0xg$-^+u%C=Wd%?3WpTOQ0hhko-H$)l`+@7(K&5)SnJ?N83jgnP}Ys!H|h}d z>G%AH>&8GIK9=|BbOv(&MyE&nnl^w*BbH8uUZnB-N4qNrRu!&?-e0Vkvhx=7>GZBM z`f;#tM}B18n2qv=4Fmmh;V-OOBkKgbIj_OgIOZwr1SsLh{{kv`?VmyTzxm-j|Ct@4ydrd3LVBZaM7U)3_6da)IB|6`GlSU?-mJyAqd!^*suB zqPFzFzre278y5hd%u50BZ!zA(#);lD;ctE4J|gA;@c-TOVCGNoO`YHGArJbl8?H40 z{f(Bp`gcQpGu}_w$hlhQtoqy>e6{~@FyjsQ>DYhF@Hg=590eA~A9&W++wEJ{a9n@R z)pF(0cJ07t%Z?+WuR^|>{Av1Ziw);$vNf-RDaL7{?)}IO^E9=(l3))1vdOB%Ud=FH zqtlZ-U*NgnxZZO{$^QjDI-{2d`EB$!AvYQQ8Xq{?+8y&5m-@ePf?YB(FFj`(&*!&| z!!uD9{GML>9ek^vwSBcS=ujcfy5=aH$QG)xd!w-6IpJt8P89++AZY3ufxN}3@Aps-E)5S9%ci%dg!M+ z{2k}A#wsjrF~-|8{L7qk9_J&S+vIC)uVaC`>7?O=ciA^e9xLqs{(t7mJiSQnf27ZDq(%XRlrsJ z1{yNpV^#C#IpeW!S>>|jNi6m!E2;f8`dwdbT2TW0PE|`Hc|6I)mdVN!qz;jZIn!n> zUMfl^X8NC>Vd76Frq4a?<&XZ9kzcPVqCax-sFGLJWa5(G*;O+DZ8Z)!TvjF%%`Rs* z9Yp`Ek7-F)Fn@B&I9`Hh9gY6T_eo@;rts7vr;tX7jt#Ub&(~v({pf)VU&}nXe+gCYKP+;&sXrJs4m5YtJ@gsMXSV|n(JU}K;AA?FXr|KqY9@vr;OxM-*n|b_ZPi3Gs%DW4))UR}@DE$0 z0km+VVCt}`u{TY4HnCERePDmcl&hszx9r2{99!xGAhxt0K&nxi0qVa8; zb<)EyqR~z1Rg`FakX@wcR!uZI9J}5+;JNc#%M6`mMB}5dbnj_DJPqvu;@4G^Lcv3pO@F;AkgQ%SR}cqh@=e)PkpRcPP#dX2si z_z13*v5-q58Z*d((VL-?h#_`)or z{$t#`v2zGf|0KRh>8d|b?|7p#&jIc44LGCy0Nc5Ly74}*{=x7v@1km=-buw(5>fAR z?0Rvd72}207<74J{Or2lU*-|@H%^|P6oBt}@slH==&zGJFyCDtuy*Rcn_)z~$y!-l zjEAVdNR!X#KLp5kU`_z$*FWu#z70Cff(vX~@%)O41K@c}`EAlLAMGn7pZ@rae(HS# z>>F#mSqD1{(?4Mp?&?{swuy@3~{OPBcw4(h=y=0v`26#R{>Tv|dJ1@FC zY8LRiuKx2y7kqf=|4{K&ChE(mbqf7nUmiH+LO!o6LPxZKZyB|2L7vqQu59@Zy{^&R zExHKwmgP@9P_&Gw+nKc(T?QR%Y99`K7SwkL@JC!MjPHQ%EaCY5>(D-P*CItp=+l7u zE&%=}w`{44z&xGxpRHv;PlI|7fSjti$}&RWPZj%MA<$QT_UAM93+i&_LZ=pEzUFI( zmU{4`ZS`RT-Z$0NOE&yn4k#2iYl%O`^WBrNdIUK}OqXot^CxP*ub=kPJw()g$X@1O zmPFLPJ8Y@>kOipul;@}NFzlh?`zlfElsc-`)k@Uf-dVC!8uQ;cp6JaIC2Gye=Z&^_ z6195j{Vt5CJ#;b(H{drMlTCt=>sCC-_Fpc`cP=gUv< z?bo#2#RUDn{?Dt%V&0-H``%`JCThm%Cw|DHUoNlE$P9eR?0?`y{a#VpA^doMHBpUv zwMa=znW%35T{(GA7*Snb_aWpN;F5Q9HsbwXm36G{dr2!%6%6g)zkm>xzm=bDCLJOw z-_we=kI^S8Zz#X^Cn{C_YQZcO zS+BZCffwy-U(WK{4?Mn))Pg62&I)SZgm&L~Gk%qj;qm^|It04wlz+&DfiGWK!O8i+ z=jFezoiB-~EYWD0ajlxDxH<0@eGNVrQr`!_$2=cpNe=os4;~dA1+-SWvhfk{S_Che z@D$Ic%0;^~KyQZ3leqV2pJqSHvm0_ut#xSX4g(aFzcLnhbPig~>={8+6e@R5*aJQ# z(-zEKj(*uSdxB4a5Amzlt^0V0@(<)&d_^@O*zYQGOSg{cK4VQGP?c z4?Q8utvoLO=BjPq3VajAc1-^UdK$gi_2Ot(k~mwo68<3@+6VP-`1$@T!-g|6G1HABBESB zc9!>eQKFn{*XTPE`Z?P=qZj)c_+{y!cF%k5Jz~fcHR+putS& zJ#62TqjqTDY^(V?8SU;D9^H0_z1?^>t@;bSJ8zlsClz?+({ZHCN%ZVIgZ|k&j;f`B zu8HGvCmXa+>pzs;3%eP0%&s_zc?Rchi&1sqCtX}5<)KfMCC?wQ^V~_4QiT&bPPG!H zb8~d_YCMS2S&mO`r3z6xJz}Rg)*Yqzy8}y>;CW$Q@f+1JqGanNx-_$mC{4X~Zelp* zsjsw*C+HVbxB2#?l_!HJ4gIx z5yb$(sCi;%iDHzN;^>wz^o!&RBmXL%+Yz_B5iokbdR;!CtJE`@&zQH^x`g|lhbS)1 z>1eD0TpaRE;2!9?OfZZx0GzjHm8i)XqR90cSa1#WjOL|Aoy0hefVKOue^;E~C~>a= zc*N}@EB~N>+{kmX(#1qkSW9sPn|dzht}#_2ipp8WP8)U-Ma{gZIS$}&BH=AG!8qCI zsyzkZN5S4SFB0v#?-hk%Pep?>T4wNDMe}W5j(U)rmFqIldWR^QuFi1N0A16hmlO3d zZdRG1m^bLpBB?Q4GTc8j&&I-ibDi=q|MMEM>NjKj{5wnADE=ISiJ}SQasDNnG70S) zIa3sVc@V{Id?i*v=-*mi6@CnO?GKi#9Qohiamg#L>D@sTJyf{fc^J1sA;5Jd+Sl0g zODka9I)`#O)e%H7P_l&eK!qsgJbN=*1#;g>T_q8K@uhOI7knUB*~~saamZga&zSoF zc5JCByJdxWU($WS-U053Dx~FDfQV5hW_? zz5#FC`kwO~JYNmY@ED8d+o`M6&$5WpV?*~1*w-o5PZf0!B1Gv~u|(}EjC;Xv7=gT} z)VAiE#2CPjqQ(ouRfzJauF8q05&wb>7SjR%g{b!(?s5f`ch9}U|Ez7lgZ|opS7Yd~&E{9y})}?>_ z1AR!(ihPnWf+z{UkFv6WKlQ$H-{Fe*d+*~qDi`)`K5$Xc8~#}KJhDk2_PM<`%C4k^ zC}y3}vN407q@*W$w81YDyvnX|5GO}hH@<5dAd35^+WcyPKZRwq#g;ByUHr7i`0x>vi+exYA-iRlA=%ophLa)?zX3ZDymuAWmN3a=KCNmG^)g*Te@ z%e2jj!n>;y_dCLfLbpS?T3!-SXx~@U`Id($JRKFfKbA!l(jElQyp8!O3u7)+?j#C_ z{CNxSWBj%Qv4uZ9iNcmuHSaIud8J3Wb`o_1Ok%?8bC~ZwRdl&<8&Pl`6`JA#I&--h zOT$6e*x4{_6Y%Jp>SlKkqM-dCSYH!-DgOF49(h+m`s+FQGRzl;e;V=-`S1N1-fqi? z{ORlUi}V0vl2Z4SqJ8`Rp!-otMBZgtw~6rxBJWu8>(eP^BG2AbV$sw}2BjUiUE9OAh^#{HqicfM>MsH{s(Hyta0GI1iEgdbH!|@ts8O zT3VFN$}l3AwlF3Sc9q*7YI;*NiO6~6M?UTIBytNk2b&#kBXSP=$t3LOpm*M?e z&Rs9u&k)a?o!vHqXNjC?Xn+|Lt%he zn8@^dy&1Wk5Sc_@-WyowWDZO6>&WsDnZ0?bQO;pRW|MjFWaKBA)vhmfGB9pg!elF~ zmom#PO?y8YE^S4a2p64L1d1+_nuhpE~gzuiz^BNSVl- z-4=S*+mpzoPq(iZ1Rs~a=L^)a0D0dC@dAI!eJ^J==%1dN(6zm2n7_+x-h$V__aky? zM<(F6@Pzhs^mp&|`_d2kU--k9-@^0vhc}Mz2c3b8n2W}MeV&Ru!8?h}*PS(Q&I3=+ zXZSxcUJAsEtZ~mjQZX)`F8&e~&50?(yA^dB_G9taM zPWNI0p1p1??VRCBq}Q62Sf&B`k5vgt1)g;`CF+WSXJy<)0lbGw`#h8=dc!k3Zo>>M zo1MVBW$r4~>A<)1^qJduFP9FFGrfHl^TU3NF37;Rpu~rqvTubD3un}KJ$ za+C?;QF_k@?(#htchcFuIvsS9zws+_(Vs5u_h&NN({Bw}eL{Q6$ZryJ0go;2XvV%> zI_V3U6bO8IN?DJ*0q;(ZIsXyk8v-1S@%}6`GFZI@c|m5vyy9A8=u_-oVdz=dN1`p! zc^mXDdm%1V74}!JjxxUre>Kb~v4EWa?8GTj9HWkTF1v`vR=|z9rg;|duN}K1>q{|j z`{HehThJcrlm4d@c-`vl%a;PW21yxh1znE=uHz=dt}C9ET_^-xnc&yg2I!sft5XTXo@wZbFL=K7Yualg==Gk8&$W-R+YQ~O0&hHLcEn27VqC_4_ccYZM{Zoe zie$i)sI?Ks=)d7LdjERNZ%7aO)($$|5f?|OD-Xkd?QTPV@Ht|!%{Lv)8xS;}YXy9H z3tJP`fuD0W_O)(+@$-tGS5fx;Q7)>Cc`MG={1gV9|0Srr8IbkfuQLeqWjwOV%s@w| zws6&b&=sgO+#?MrbSmcZd)QrQf|SYcRwC6eEb11gOr-h_6*u91P^xd!#gVmyNd1&H zwnKbM^*_9E5$mzkAKnbN)qvk!%4Ht55veY{dY4%|MCy%O_pC!0*E&)*`6=M1!!=*k zi-^=;+j9A>;AbS2e^iL{h`@vnH}J(1R{X*Za*f`RRfm0%wA2yVlnsze?|gu}JNPw` zh-~f0I5K~9Tn^@wbB@N~PkP3;^zS`rH-70V{u$8RQa0%d@UW~~&td;7tyJe_$4kjc z+f{0S&Sz48X1<)648DKej=8W8@(!f&mL32;zIWjvwirLMEcNhg7LjThXLUcuD#U!QCxT9EQSqxsz~8;=^<=MSESvua{E5SF*@G{1@<--ilRd1FSq4thEHN#>e*W3;J!M^PALj^Y-<8Xs<|ksTGOm>+_t>;r&VKX5}i)U4V}o{k|8#?|W12 zUyg(vg8s!Vg5Y1_#*$0R^AfiUD=-}f*u86 zzbUplsCa=gk<+S_nmh;320B6Iq9cgh%z>r#(bz}M*6X?8hkdBIYFP^2yX8z1qR0;H zJ7?Ip9>0(MsC;9T&1dWro4&=Q=41bMFQSBf7j&-~`{ad!-c`BC%0R$8!?KIoXfIyb z?)R>k$d((ejaq^6jlo3o3HWQxk8GyyK>Z-qzE&Ohx><%Lyah1X*rFI=J$6kSB* z$4^fGj(C>W$}Qp80UCI(jrxrJzv|z7{%zpvOBv zcMUjq;kig4tE3kF1?$7tjYa#F`c?8rV8@~oSH7~afA*AZ9NT)b1A48-`*j_%R*uXdwjX+Q&0x}C8_TyMZ@~M9AvmV1NLw3 zxp8t0U^n$%34Mvl?fZciM%RH!lu@k|2QQPaSnq>HW z>3pTswAavIfk0Nn2o{kq**M^KQi;ev80}LO1-sndHDGG`fr<7&D``B7#Bi>i#A5Aw5HQfQc)WrsP z4|_sia4G+iy5Io(3|`BJ`Jd=JdgZ^+ck0S_QvG-z97SLAryx#Wkf5MLUq+@t=sSNE zmQ(Xt!xv;OrLTBZn9f}7YER>lpUB{srf;2-m!j(YLoRvh*0^QESHVuDuLqPjqwnyQ zccd?5kPoKlLcTEi;syDA^zC!ywGnwlPpHh6b4qs!~$y`%7isnP{By-tXC4DEcvM5t9WC#i~ z_g%^{6=L-1b79IXrozk+G-K|yv|{eRoJXJ2QFdn9otVlp4)nP>Wh>_X%UR60i3~kO z`h1u2MEYE~@+A74qp}gxZcLx!QZ{D_p0FAGL-%UBF#NjH=g*Wq=<{95-b@9YRSZ6V zhW=JYt{wFGQsr>wKF=t+w54(!eJ)7(EFx6ft@ks?_tGJ~ybsoCp3_5M~I9&~-6XM$+Sy z`|0yb%0C#n`xyRzF-6aLnZhq4nf|}@x!Zq*VVIJXD&ov|1^V3Rzk)PM%ykSy1!+WR zy{HH>^G7lGd6>d8Kk4&!!~8J({ie^osf?rjN=1IC;0$dal}XI?5!0C>?M$gy6?=w` zE3IFZrA(3bHMBidLK*spX!w#r}~PvziJPCE?%{dmQQtnsVkyN`WJ9T_E%d@>su|7zEMi;98>q>BCR*Ib4(o;=7uOW=7upf2d2J>4pVPMmKo2~ z8&MNy>a2(|P>A+l)vvU@RXZ6yw9x*oTFdbNnAWfABSzjEG=Hk`w126F)A&{W>2rLl zQy9I;({Z6Xj+R?>H1j-)@vAb8X09 zI=`s$(t1$kXZRaU`^P`JBN@N>NyoR!7Yeo!m0kwl5Nv1St)8JI+LO6O)k^+Q@P6cbq0Oz@E^>f>t3ilWG)q`VemCFmk|us-vNBj=w;|Sls4M# zDwWLhJqF%q^jSjZn}64`++gA~k-0X7@ne->hR=;m9$Cid)184s@n+8Cp{cZ>|7(9K9{+S!?R30+(hV)g;_{R-KzRQe0QyDv*qy1hb zhvD-aBgc?_4={XfWcxn4 z25c(iUX91Rqr3;Z!~xsdS?OMA-)cPBZ6n}y|MkZT}S>V=C0SThN8i z-0spPMcw#mdTvxH#K(Zloe2N>=?m2DTu0HR5&uWwG^UiO3sd24sFa~IQ-aaCl;+Es zDZDmR5zkqiE|BJ|N|(@F$du+>5JQ)sb$l>*bDo{UY+BBt5|Osd-KW;{-Kcg}Oexx- z(w2lNS!>ReI-SjwC><(!I#d#M7JUcnzml1=nG(sfm{P{Z;dCLmne@$l|8B*Zx_$6c zUOPjIzaPZTfRR&w3{7{aB)S3-F?U2=1Xt}at}PxCrmqIIa`uqxvp%1mil zd8U-7EK|`@hT_MP*h$lO?%GK)B}m1X%WKB=({hhxN_Gm1(-j?snTzFw!f8DVG5#zZ zM8~~wB<-)l>a;%!F&EGYFt;D^(>F!_yV-CgbH~XDCT@9XI>R?QQl(i}4?q8%K;Ibo zn<|B>M!3J|lC;Bj3=6h~Y%V3-ev1D+|7oWyR&xK+C0zgA5c!wBB-(Do1m+H5=7zaHy?5bXnBWkmZbC9(9MtBe!8?Pw~xNb@ZSxQeay|5L(l(in56xg+ehi!??2;* zARWitUb=KM_bYSx^$`5#JXnI4`(ycF9Q?bX@;7s9`R_0EW!irjzK3qY{7dD*gODei z&cFX|ie#=g8_ASj9)d$RMUH$y-+TA3oxUaAPLR1da_DB!(M;*<(Qjz~9Ye*99sJ+| zUE*7q@lRp;l5V@PE9iI@VJ=k?Ve*PdJzZj0oGFnk!Q{E|%oW8FlW4n13DEu~&6IMN zq}r9>$Bci8#M7l@hx}56xd~H@DLF3A#Qk`tgtsJBnDP?vGV7Mq6#7nSDJriajwdkJ z%?;gLDaDjfmSyt0JX7*nX$TILAXlPG;i}P>o7-uepz#lt+8!!#ZphpnWJJaHz2V!z zOqq4e>=sRTsMPULJ|BX!7&(lY0-Qr|D9;%)C5~s(cW~RyU`l5HE4|H>6rN7s&}uh> zS$Bp?Z_hBN=}w# zmC83{)-gloMo*>&O zFl3KO%sMhDhAxEqzm}xeq3nYFlQvT#f8t--e}~o!4d!N4^>{jOs%@rA`VWvqpGA$kHmr}yOn%XwNXt89e@zFvV6Qq8Uuq3>K2&4$G6er!CE!P2 znV~v^w#UD#3Et6sD^csgNI-^v1?J{nX{LnyP~IH6=~t53&q^+(^Y;YCF8^-+W%M|n zDIq>|W3U7xw*(V^5|5a?&-9Bk{w&H*>sf@!JHkvn3tge}_P=$9$^T;+KNey9a_FYv zAv{C-A92cF&%rlik0E{~>6@+X#xv{R_;`BV8PDv?{_)4`bB5NpA^Kw&dkHcn;s4#Z zJhaX-aWI0uGK4!o#TE831N8jieG9XW|6%q&zv;Zr{YCF9xxZ+Bxc$t&r{95r%#GFk z^sSQro`2pQ^e665IzMoK((CN-jn{Nu;{Kr5XYO};z2^2lV{Ytb_!zp$`y;(RbGsOP zU39+Wc4iLVO3CeD_C@dM^^V(4zi)Bd>3sqBHT_=1eMRqIxvg}Za9c0acw6ZT5q zahvG<61R!5LsP<&#Is`n<07xj{!6$|f4k2UfWB(~ra$?6nsA?Nd)>Gdb}Qc<_CgGL ze@rCK%3mPd(!+*shdK!N-mT*6*RT&PmQrXwFqd!(XHL6+2zJenmfbYRgmCj3A~Qcg zuI%YmOBO)i7mLMmq+!oAx2YlyzspGvri9N!=Oko)9@U58pR?&OFfp52h+_{&sZHS9+d>?fNj z0pGFX>e*Hpe>6OPOy>&1jmgZ&{ME@N_GwGxaA>tc8@sW2F`vWE-p*B z8_x@5t@I*Xe`9Nvfk%qXkYtE_0Jo~yGAm)Vmkb7HUFvRWY~9AxJhd`{C3rH zk)11`Pv2`_r}hG$PfqjA9JDWw4N8oHoJ&KBMufw!mxvqd?ZJGPCpUsspl6rSBD-=S zhqJ5fruE==0b6SHW60~cz9Q{tH{s54efujD{$tnh>7gF@;WS29l*tjUHHo|uy?}5n zY(3W*I}T5yEC4lnTXcf{=a3;prkzqdvX?-8RC4Ba-vUq*U4iu2(;gopjd|L7~i z85on2J<5`Bei-*TeppX9y*GuVBzOtu%j%9x#F=nD2krCGu^^nzI`?^VP7}_D#M#`c z6NK~bZU5-0^@Q`L-S3f$CgHq(A1^e258=F8-_L($HQ}^~L|$>NB%J3JzTe#^5KdEe z_XJ5r!l@5YihXmJaO$jbggZqD=Lw(9(_`j@Q;{0+D?^-c9#3$0__cBe4`ff+}!@@(M0s$$WO1b0lco#x-Jp?Wfxa?znx1s z8BTAbGgASlufEuQi*PP>)P-p201B2UdZPcr+9ICnrG#^y-TOY?kZ_Vqo%Ovz_sqD+ zEOMQ2PN#Q|_uvPd8@j;?{GB{5)@1}eBj3Yj7WJzZ7#}#&QS2Gy3A|%dw-I~>&248Tf!-F4 z)D@4RzpYt@Zu!p$CnT}AeOWi*Y>8GDNBw~2=G}x7<{c#?4n6La z8ofLU{<%wS{rE2Mx2yg6+;i@PvpYkDqlbCnck8Dt0sdWonr~Vq1MdE6Xw?ju$=IeBg7}q{2BZ9e^#~4dKw&?zpucV_=_fwe%+wF)u<1`4{8Dum8$l z0{!eNTzWI_*f4*g#R)}zcn(!v>p32Dx0U`X=m&q>lw971!M-6c?JwNj2-6mr_zS*$PUM;zx{CxTw1)3;e7YGoZN; ze!M&|;f@dd!29XiWmDi6-kHJty5Q5h)9>LW=+XO4dd)c4$?GTA%nABkcB^MQWp~f> zrpNr?S005u+ocf)9^%H6JmL3CZTWtQ0Pj-ytaIAX$5I*lwDqw2;8_)MH0-j#-D#T!^gZ9{C2thuaGdLNz!Y@m?X{`njUpU}ZoSV!;KyOB%UeI> z1^ZlDPjdo7Hy#1LIpTc_Ccuy8{5ag%0lDl`xaJQauft*Cigoahd7{GQ5&eMc^ggMX z09r*!w_}_`CGVk+@J|PuDCxttm?x*g9Si>FaGOpTDiIFnn&?ae$jPpalG;>-=XJ?{ zVu6plC}-TI6@WW>Kk&ofEoamI!&0nTA_DuEpI+-(gm^MXn#&oP%c+_`H2P*krw zdBrfC{X8pW1@gk|@&Kbq;S%|aN-tY)$atyxL!U}wkr^fEm;Y1qfIuH|50n4sf{x5?729**Q>yFMt0o)5nGiGW9v|>Z zuI~Nd1iOxpOSog=0eBDjkm?^d?cPVkn@n7Bt~cbAHJ1`z2LF=%>-X>)_?4@D+;ahT zly~s`&WAWqxJ!6`U|m)e2{1CiI7JuB)l@ty9;f3>v7z^a9sEi0Q+ky;?5o7fHGK>J zRuT@FcDZzzZ>2}F0oz~~WzVX`d9MK*T;4T+j*5<>Xa@46igC=&1F(lmf|pt*?610_ z&#{%#%Zl_TH{k~w2~EfUV*S^A(A$0m>-NNVDjYWC(bC`fGgV|*kD5#S7R>a+_*pkL zFGGG%qxLBG*-r%DthMh^3*5G^`mCiEybGTgEUd`VZp-!NXv zQ}6R^tVfd1ZfuT597}xcZ7+hHVxwL+s6b!iWNJ#AKxeFWhUt9d7hxIU@(Fkra&{DZ zg?Jk?S4*}N`Wrpw)+>3~Qy@RUNDF?;e|YV(=kPneV)d&7-Gn_L-nzE^(J=f|7n$jz z1Gw9K;3nX2{W#|_L4@7!xb$YR9%1*z`}SrWBkUhWRf~(!{%uCp(pjqsyZ3IN0oF?p-1;KnjItcrPbmWyM zpwpDpaj^{J8>11AnS|YNMIxzCld$U-`~DagK-f>I{5gTJ>sIQ09030{*9J8E77_Ln z)eIAxSi-LUp1M*S_^Quk%+lLK*j33~vmfBAYJQH$OAErTe)u%qkLA! zrPK9<{ixAVEE?m=MzpTK!b{ktJ3}{mV%+_{{DXlug)oWK&lj`a;;Z+PzdwQwck-Hp4h}3SnRW86~v` zddxlT`~BvA!oF7N_fTg$VP}g;3GKW~*q1&ny*X++VP8DdbkZ5}rGGEJvGh6MY`srA zZvX}^y@|MGUy|iLEUE~&S^ZkZ3XG5ImOP4i>9vM#v&Im1T4UV864)j!WvaReU3eOqoMD3b>zzH1}9U$i!iO4H>-(a8KR#WN< z{70Sy3t+#^?(s;J&r&x(JjFOiIs#M_4{y_<}AYA zdsv|*26_npShg=0aMv{z_M{rZ-XWK|Vgc+Js($O0kSbvZw{%?Q1Akk-N6E-Se_KZR zMBk^{&4tS+!Y@NE+#e@|Pr&CE`tQ>0 zt#XgQ1i^oTvPOHynh%ow_}RwA33rrXH~)|7SI0r0{*z>bJiw1%hU_L4F5t)# zWe)gV^R+nV0{p?dy7z+*#(Bwlskwsw;*yx1SD+vF1HTGdLEruQnK%p3bNi&wTq6J& zh4lsPZh|$X!BvFq(p%-e8+vnIm%8#e+UMIjil;$u^VEM8n1SE9bE0H&oe6u+X}?FM z@FPypjjdeZXFo5k+X24V+A6j=;McbKOl$-E+cvIh$#(d!ZEB%iegk3K7%Ule`yF9h zlosb)K|EXZ<=&;@(`tX~dUFr-@3&m@81ZO(=vJF7{E@xn%uz|iBeyn6<|N{TyTK{= z1o+{sIBRQi z7WYIu(dwalsdp~COYV!t4=0t4VLfsnYRdA zr66V(-m}=s#nN|v0iQy4Y5fTF%WF%Vy#s#aCKO+{10S+wFGt0oUFJo~H7>@>=w_XJ z3H;KI<^vJ1i)2&s?_}^f{;&!s4t^{?x!#}}@h?^!bb0~&XI#T#5CC;Yz@DzixkBPi$ZB%rMz-g4n(a!j=a21<6mN1Fv(hZEBfH({hz9QQ5@yseAJ8IpE`|PGn{e@Yk43X z)at5V^|8hL5pE|YgP*5k3+Lp(UJYfl=ZtD5wv7?ORU3e>v0OL8HWuyM;}+I;0J6>; z-G=dv^9j#7v^NUZlvI92`rEkJt55l>Zbs ziuJ-jp5O6_jszbs6~sCtVXv3ecNg&c@mFA z`*`T3Y0k@$uVBZ<_>5V?@b8AAGe?fT101WumP-X6#iezJz<>Q%zem21yXNe#{7dk& zCw`$DWI@0B^pa7z=&uN1U3Z24D&{sFr~I&TQie%kE&TK9(!5Ocm&?1)?FF9?KM|hp zm4N4j%VW;Lp6B9)CM+HH-^XhS&*Bw;TOWUIeg!Dox8RK-#`EfZ{&fX@a6!0I5c;{F z<@d1N5B|H;Y1{NW@Y|w((l zKj44)WlKiM!msjmMtiM?{I{kXy554m@_HnaeBpXz!VmMzZR$3n{YJi_yFBn- z*FD_%0REA4#wlbg@Ll8f&9{YJv)5sLggn_7Wdjdl{&n@oU-%JM*V`jAJwWIBT=qUG z#BsLghOkI+Vte&@xXoh7bM=pxY6JMp&OY3kF#x>ljrEi;E@wlc&H(I|E9fXb!5gsC zcye?<@H}vLut2`Mv3P0TFZe})z{`=Tz+WiSy0!vx-chJXqvEZY-znH$6|g-@HX8Kq zt(0`;hd%FhJ)hfx{`i)MXEkzdyC6 zWIy8Ne(iw9+wH@7sHD>;Dn4j9&L7m3C}X|1E!${5un64z}zAI@im z8@eSY>k`}Br!7|>L*6V1jjocyxLfT5noptUJZ;NW)fkt{POk}~?0fa*qyfm4RZ_K7 z0P&q=t?<$Y?N`p`-rEJgxWZqecpZL~X)JKX5O^*+8@g2>FQ(19u{9F?sTtVU!9FRR zl&kWyiS4=Q`YBIAH~FPekrVWhoFgT~gZNASm|hi(b>-Zxm|dIDetuGPc`W?;{A%~P z#o+(^UEd$d$-p;RN=O!de?cJf%0}qr!sFf#+Q_eI=Xeh#!M+(Deh>G8|0@}XX6!_~ zWbKcV6@vY*G#1)@f?sClq+DHv{FAw+ZX1>7GS|{^o7v~N{$k;Oz*@mnGa;j5y8C?d`}xJYTEvdz6B4xro_zE{UijPJ76!Pls`G$4!_QC)oDa^agQ?{=#3NY69dpzQ=(6RXX zIQUOtZhAEvdH#;{&B=WjSM;P_U###y{>`jsB{Q&J2S4{cn@*Hd>k9SV1$6E&u)o07 z8(vpRCJ9$s!QbwO^n~t#ocGuJL~A22mbglsT?YK6*-J)-!G2{dyf4Bo5ASzengabj zYRMVb4n7_`YRQGdu8(!wEmUBSM`5k&9^kobZr1r-&~Hh9^6$+7z{}_REgF7#_idDP z0r+A-2+fwy+L=89b8zuG?v&8K0<+TYenpRgW0 ztqvY7GHVzPtrPXcG~NdM*A+)eFGL=zEz*)xgkROJ7sz<>{Xg?xI0d&;uHco zUgX8M=FNHCH}JgfZB#D&zU`dD;(E|;{q#g^$#py*j?5^5f4x=;I&}>8epCAR%RTu2 z+uWF4#>gA*)~nclhJ5d$6ScFz=i7U-0o1tHg~@+wF7;tUIOpYZvTR(-rE!m)ife-`H~OAYfnWirW6+ z^|vOQyT0>(Y+9zT`hL$c6r3G`MS zcI)*+b(hZQNCi-4n@dOe!7tR5qZ6Gk!DGNSHqM5^mSt)wa=d_I{hp1`@`FIU+%y^%O+GU zCKMj+!a4TH52bj&bWopTe;S>yS>!=L*0YNG2p9QO@)0O`YTU(BF=-nRq@0$ZU^G7a+~F+wE(r$n(@2=B)cuNz0>eOw~a zrdAg3%aR^9HkYj+>%J$Z_v5|(TZV~)4qUQ1j;(vO`KGD`VNVX}xOBRbu&3zL@7MaZ!c}I}cY!4d zMS{VEJyj@2s2pLN$jAojW1LA>iSkF_HPuyU34KJ^vro!v z_lOg=`F-x}oG*k;s_OMuCKI+rXwMF3Rl>IP(30bTZyWk|4{YxK!SAf>xp^Iz@LtV! zawywt4}1$p+C1%|;1-2uula=S9RDld2zt@Vf;@Y}i2+-r_wdmtG|7m5bwC z%)!qp(#*@kXDz!P%naObbtgdMuD-XJQU zu){aSgnK|Q;b-GqLS6wXzplT9`Fpeq?R>fkJL0`h6d(L1yv|E?D)btDD0QWDHsBQ% zb|dIVIA)#e&IAm0+BOgV6hVq}@qRo!KGx;kN%&Xz`8g^#Cjiz9 zsIU`Z=g97uT?@d+-u7UAYs}vlb?fyg_{aX-;_E@r2s>I%xZ<52VIMT8H&BOu4y}FM z+wTR~q`Suv{fE`)@4$!m<9()`u#fo21};zo{Oa<~A95Tu7??O0_~OnK=f1E3r2oFb zjKQ-VeDCO8Y%b zz6DqoB|QuN5v$0ZO?^j?ogA65e}U5HAz_=R+je983a1dyF~D0= zqJ;No_CXW-G)wfy-VQqb7x5Qw!5ecP_K0`8vE>os?8H2$;1byXM8NCD5Af#`)4L^C zVf@LFHD$};e8LGM!)=pS7evr`k}jwuIB-3%1rCW$bS{f%hGDrh`rGd*qL7>b)57+SU@KCy@JEq@#or=;zEfbldAd z*tzy9Y&pc$^(DnQ!ieJ=chaki5bya%WdnLKKEI%Fjx+G*Z{uxrxPvua__+KKAfV$gqWxJ_Lq z=+}NuUBL(cdRo{$VFvO|)3qq+y^y1+KfO8}`g}%xXMz2nvw{WPknf*wj9W;3hkmYI zqBsqDecs#Wm;pR5T3z1xBJN&xzHXEgAnX>=dIJa8y`_||UlZ}sYR&f(`(k!$ed>w{ zuyb`sv+FJ5`E83$tq1)7ZDZK;dx(#BP71BcnD@@j z(A5}m)h=rqKTY;Oa7Vp<5A^YVx!=PQ=&>W+eBcqrbw+E+5$L1yuxWe>*w^~iv{JqL0` zsPEu?va*|~eAn-jmC^$F`p#Ldu7SRP7W+N2hTZ-wO4JU;xPd*8-;!{64z{ij*-khk ze&M~$hHyru30HnzLpXf7+}S)agu`#V^yW773*?E;T$f5Xf~tjcR$cEm-q~aK^2X-L%<+a75|9&v3-F0;XA`U#zG1gUM3D z5kH+_@&!=BJWBc!KjDne9MCKS@XSX(t>xpIfiKQh!I@HSO+eRl-rI)%!Gc#ee=z+p5s45KB19 z%?ix{k%Xga(zE@(4&kURi(BZdNI2@3%JvJrA{>o(g?9PPgroVUkkiFWI1~2{XkNnn ziGdljqW=O)MM;0U{-1uX%iD@V!qHk*Xn#JKaI_a)xv#aJaCCHfcG!deDGD(=d!ax5 zvreHLKtq>y7WMb$X^TZ?)&b9q9lVE(p@$jWCCc$!!kH-)v#Snxjg4N{-vj?9JIeOf zLw~bU*LwJZf78pa>t9YM9J9lrepjI{vkPI*<_8hZ?9F9+1y}#)_YG$4EDPW>pIbj= z$Myd_5B=_8THzdj3qbRB(&YtMl3`qOi*U%Sc2`VuT~9`ac5$!=N! zzAWY#PxgYnEZR)t<>nHO<;%f1;aDFXj0cWwchB~-HH5SOUQDX16V9?UM=`7m94~(rTk7`?-aMi+ zCX6AR<>Fqd`+g9P&vmEZdf35d1??v*wyR%V2fy(hnW&=-{HqN3`UAkvYP+f>{Ltf? zqmH8D(97ECt$u+=07XpWDZQ>!>)Ejqe!V`h<5C{z`fbfRhy5pKqg?XuIiSC>*GtXj z6X67;>U}bUz5{hESLcD=CduSKbE)5bu~lqaKqrX$`y}Mv{L4{H82Z^-Tbz3n*GUQQ)$q393 zIV`(rFZ93tae(0&`2Vi0kIc&8=Mh_)Zwi9HJ?WSBn0f;WR;2BQ--JKJdl2-#yTU$I z6L@xi>)9Up9plHkyz{`ky$%jbh4lz$-$A$I{lI(BmzC28yB~i0_)9nZ|468ibaW@- z#EG`ExS)S5R`oXb~AKCEc`t^+F?mB__)~Txi%dBcUeYij1KZe##O!U z&4{C{9a^%}k*BVn;rlfocD*Jx%Gw`!EO%{IN(uZqPh*GXjdz4|D^p13FYI@lXC=!M zu-KqqzyR~_cg}xsDVuQ0O#F_;%7f!(=)<(xvJpU4A}SOV*Qk7p!+h@QG8|MiNg^t~r*U{+80NA5TrfhGCAI6o1J(~zW z`beFlhF^S+4d#zUp6hX}DHVd`*r$7b;hY}K>$-ERwE%YLa!@+*6nUkyF<$67?9(ajb07zP{6XgV+y>;4 z58X@i&o2puKXt`RjR_kw3_nf@-5`tcpY;xRxj~LEZ2{9f0tn}; z9N*8zZo=ucnkteA{eItU8lMZke%?`GJHXEUo3x)${@H(sb-fAx+~2GHL>zQ}hbIq6 zV*a0Hr&_k|0vy15k|E*pXs6fMeJ9+JV^de`$pk#~N(JxP+);taf3_+TF2ApCcxy1> z3f%Tw|Bm`Su|z@qT?(r93nteCCcZte4RG}8|=vxTZvz&jgS||DJrtd6zfauVcJHoKrdYHWB+e zb%reA&Kj@x8S%?CZ7orL^oVe0KeYSOww-WUV{Yo{LO+%ZN|cK5Y`rks%?lR1<-?CcIKyA^v}5)bV_m&;o84v-B5&H9L%-k7q2GV zdB*2fNy1)^X4!7zy$E+c^>;bwYrbxx_VZ)t?>yZ30DL-9aSQtM285(%$N?%Z&2xah z=D+m)_T(brx_DZyCYa}Ako>zHa;(~FtZQ_aaMxs6+?{Sgxa*b_@yJ2Xn>`bC&gv0v zNc!t~J59pfQJ7)evWsxT7xFy2T}8MDb|^HnK{w_U*SrmWaFFdNK4Asn9+FPDQ@)aL z4=0@njN&ES*tC0Vb^(7}u+rh*@Td4pp64C=3HSKr!SBD^legxVVxPr5vv}|v7xxTx z{`@Q9Cfyi3SI0ejVemW?_Z)o=i<=VN8e9&%=c)4}&`%nDPKleoo<4_?PM=%mrqkyJ zxffjM^DwD*2hZ7)%QtqYcG@i?+2hTHcv*>d?+?&jK-hBF;821i+?v-0i zpEu*)rRx!J?^1Yg0Mh4;x%cSv&)j>v2G4nN@82D)E5I%FpwIa{V9w!`(dUV{59#w+ z+{g6!Ms7KC9;I?NeQxFnbKa$fJ~zdE%AEUYpwIVl8~X>(WpW!SeBh^nKL5+Dr_a}N zo2Jv}Y+kIS#}A!@X`<^KaO)?~=Z>Fj9IU^b2+8Vd8GThX#L)E8ayxmPanmU-0<^a`WzXzh_0i+&Hqcwcgu_B=cW~XuK8vG zeIELjJbg~;7JY7vdoyB%D^P7trU?xW&wQp?h?l2=3k9!E^Q8dnWYx^AcJ5Jk|q7ACKv} z4%~{RgXfdEl^f}ESe5iSQEnCE4@2$cEwnx!)93KH4_gM$?{mu-zj(l$_b#E%v%&xG zC)4Mc?lE!{Q|Bpb3Ad2Z2ILUcR^20 z^f^85^Zm43ujq4f+zuwrKhkwDxSyCf_)OQY;P%kx8M$9f>2vpA7(MmS=cKux66tea zADw9VI_v5B0Ub>j8cKnp;Yr zH|Cb;&~ZFu|Dpb}uEF!r+=oyM!bbhzfp#5`rJX3FA=vkHW&zS%4!JJ>!V9sApWa`rBGWC5X zG3R0@@1g7WOlHmr|2uC!bUvCoe`-nW^qD$1`t&){fBpIl9RvE@tDPZpp8nrC@wxQ5 z{D0@ihw8yF=iH}n9;_eoua1IACXH_vC3n?u-2}qaN3mq;&v56{=dtaW`abq!=<~<+ zbbht7XU=EatJCLx=NzQ#>)6xljGY7HZ_doQ;h}m#ZuI`bZZYGROPRVEOPTY;%N*!) z&)yxhpRZu*&-h-U>&C35>xbC+F?9|$-kPA5dxF?)=orwjfc`d=hg+w?zXP(WmM#Q; z0liUD-1?#VQ9L}OczJjv26%XQ#^N9Tdo+iJJb&rFk?7+U#q$WBQ9Ppo1?Ks!-MZ3m zJ>5N?n)=^v-T;4kGX9MiDMODEp+<>Ny+rwr*hArD7-Z9kX<|*s>Hcv;{Ugi|Jk|3P zdAyfy7p2oNzmnnW5nZ56 zxsfhVr~HB{ECxIc44r$-xFLCR7{2o8LS@RiOyNvMe|8(00zMm441!p{%LJOWuVTR>Q;f9S&A)mlXx{yzJFkMJu@8ZD?qTL>< z;0fsOnN26c2zmjxi(v5XrWS(P#BSGkn$Iw1A=u6oQV3xR*KB198U#`cqW6&g{%3&k zX#YPKV1pwhhmcReKS}%($3G$b8^^SbXM$@qgGmDaMlt~;hJXANQHCih*!b{Ikcu|^ z6Q*(hFF~w+yOBrqrU2nYX-?~kyGr*@_#d23pZULrH?jF4q?pdW`hO$3AR~If|0mh0 zUa9}JS65&8|Lgz%U-Q%00Y)t&{;Vc=cXE>`%i zni#A|yvbu!MhyH^3Vi2*zF)f0t6JdmpTBQfcp5R-u|)+9_jzcS~pU{d2TH!<^@*WM(Jn7%^s7Jg5t&m>!O8<;-vgGb_>Yh#h8nY8 z|24)qZEerU{4EsB=YNRjNe;!&+V>Je1Hp1R6X2azT<>Cm`List9uyE_$cicS`zc5a zZO0|NDdZuB4)aun&b^4ljHC^Do*@CirBDf{)Zwp$SQNzIw(mv<3X+ z&3XT>8S>}Z2NgZZBZfDn_oZ#UNx}49P69D3H0r25ElLdUzl{~Mb0vlk&Yx%=K`1z2 zmjU_8YF8<00&kh%w2sX8{}Wa^S;izme@`p&`Nlwh4GO&1{sK?Kv7+rCpx@_D7dHx{ z|8?Q97g*bkMp&PfP0J%jqlD|`mirPTVdF=lS3VOXvGBnB>x39do|ittc~6WcCAzIC z>a!~C%%M$^q2@)Q$@k;#2Y?e&;%Hh2CB zaZzH#PLtGr>Pd|3c;7z?X(UGW%B2^QLC;|&+nrB^7&+~8m{Ns)7m4Vk0N{7K}dH{4DbQV-*8F+`SEEcKcJXRbo8oEN*^ZZW2a}mU{lNez%txdH8i1I!O~F z&&fwNa=?%0>V4B5f{sV{Y^C^CjMJ&urUf~c$Tc6lg?6WL-f30PgX3zEg&RS4Zm(*M zxE3+uJa!(r2YRs;%e?y*c&*h;atqMU+ElP+CHR`Q25}2Mrm`AtY%GI5f)Ve^#7KWy zM1?B&oRTRrKPe5c=h3(}^iSC!ePk{4G5PnQu@-oq`~xLq2&ZS z3w)^^Y(7BAp=Dsy76SezFXGAK?;}Ptoj#r14QO`e1otWEo3}WR+Kh3QJJ=p^(1Tsk zp)nhbA%E7&@lSwffq=<%HQ3c{dkGe-mO*5!u;vthrjUn;hJ z2fdJkKbzb!en;fbXV;*oaP_|tQ-MDs=nEYhlE&e^!@a5c2r<0B63H$p4?0 zY|;FHeA#)S`fVcMhnbgLvf0G2{ra(He&p@;#=ydI%_;vU8?*&)~zAif}%fdSFg(9K|RW%gUy=Phv{(pR1y#x9({C0M6qaNh?#&;y}8rGw4 zv+m8_2>!lFD0z2c{rqaPZ^mA%J6%55Hv!+f$pxzuT8Ux(XS>p3z#5a3h(N$vS?#lL zu};>-WKUXzb@i#|CATAxuk!2`bt$Zm8NDkf*a6=~(Y!yMX~Zzg)W|FR>W24`S=v)ksrbLzP?Ltjpz?a zvn%-uJOS-kZ=mP(znY_WqTf%UU>zI$Y`E~VDGB!2d_$~o3GA^|chGMPH*>RfT0u8Z zN@?YO%-?Y2!sj$RZ>TmOpMQ6`Hu@(NX|HnAh9iX?bzGABwtREB&y@&pGTiXa2;xbAm1oqexc$4=u?6qmTT)zSQaO279_A}6<-}jJ% zKVXkFWp)oIq2DVhZ-BDT(ni&qt$1E~G2wze`1NT0)wTxu@i>?>^~+}pDnzSeop(Kz zGxZL}IdVedD7mfb&nd^kPBSb!%Fnq{(Bbb->^G+C)O6kiU88SA^Qb=sr%AlS_(>^i z_pE@PG|N=hE`vTNTqw(+{Aiql7ke%AEz+m5wgdhklH+qF9qnUgI?hnZqTtlWo4^mh zag?bb_I)F72Hl?o{fs=l^yNg*8=0L|ssuhq{xPI3fivWfnbuhY{ft&koJa9L=1bhR z#n_*W-JS4i6Z~OpUF#8J*g?eX9ZG>^biZy?Xablx%~X-amrw?*iXGV|6c5biKA|kvZVc(o{+9i=X-fPWk=ydwGb>KhrQ)t{t@Exv`=x`GAqT@TNZo*D+vyEgc zJtu%UzdzYnxG^5_ zd$Qqz%kJaE@Ss+=i6ZnAzR&N|F^u09{B7Ju|6x6@jwBknu>ZWIWg)DoiV+MWhSh-3`3jFLm zp73_M{xA${aXRxWYq)<$sp+j!;N9gyG<2bl{rv5#l7Rp4&7PFqO~mlX0sBX3cs^#l zN?u%_f}2}X5HDv^Zk)ah`f26d<$T~XM^pG~8SGSWurII``nuD6PHhkR@3}dhQ2>X&t|65%Ou}?u@0U;D@y~tw+{@etoQ#r7-l=*4a@Rj&WU+;@}oZ{VxyN$$&{;4ODbufNllzC43? z{Tfy-Z3}vzr-iTm3fQ^Pai$vNdZQ?tfc>0dGplO%G{j$%nr_Ah$n{j#^yXpc;lY%k zdpZ8Y{&d@ZR;C%`yj74mw*YwZ<@~<#LcfIqum8GZe#v6l<5tj5xnpR;c05 ze#OI8GTyL9MOo9sQpi)f$#DBt@K+jG8E{N=Sbz7lJ1U=n?wuV~yQ8*H(C({LLGeUjrrB8o;B<*+cVUgUX=a6ftPpLp2fILZ+xb41iV33f4e;JxkwyXj8aIfA06Y!E9(po6G|)POg{)YRqq(?ltTRINq-YQhbkSw--u{-uqmjs+y#6Im-M7Q9$u#melE!|gdPmKCL4xc z$|DA^mj}4weaPUMX=`jRo}V`ELUi7l}le<6&!{gdFelP>0^9ol-aJv;rZ3qgD0PzM-1-0DVN4R${_!^`=&8z6m*z9 zR~eB0eqfNLkS|ycc)TPvCgL+O*q4^|@GJ0z?Nl6f!j%|olP?Su6D0;ge`QaM$RY;* z%eAZ)$PfeHg&7`iK*vK*_L%uzVz6LBR_Pw_XSE?U%I_*MFxzH%XeaQP=>K{U-YJKtyjc`R!O&x_ zt;AqjdEy-5GGbuqD$FWWreI8}i9a#0{t!F9Q*@ZFg?UghAJ%d6`~j|N5(V2wIs(6W zX27COJWp(^ch(1f<*opC7Vs-rxC*#uQENqDy{je-+6@bmO!&=EbZH8xY+>^!LOkv|p_TJm$ZmppEG77BBR( zXH(F5vv(fR4{MD{d4>L+KU4Qhk0APy(p-<{jYR*@pYV0X6yC)(A07Zt_Pog2@FJpL z^etAr9dxS9b<^%>fq%2mBNls!{tLg1C71h%e)Avu3YVEgzb(dbMu98fNA-pqg2S-2 zPWa2tR>0bIha7z|{_M+1UZ076qd-TEZ#4z|o4J7XN4#v|5B~$!@h)w92K;p+K2J#t zBl?dN)Efz4;XN;QDB5!-+Vouk-qiS>bETkjYJ9iZR?Iu7qh;v`J%*{aubK%yw~SvK z{t*2u)MZbI11{u*9y-`d#@1!z~n?<+dC0TDs|8tSuUbwo7lE$pGIA zf>iugfWF)OwGm3t=c3YYj&n@bj|#3t#rZPrT1L^Yy?UD@J`v91A~LdwX#M zWf#BDN8;MxVDJqoma!U!-qa-+9>OnCk{<%Oe*@!1K9D!$x*W3AZN2+>4hbr(<&n! zXOH$*B}T8-LSJuQ*p)ni9B--j3h>``?!p%w{rk>ub6Qv8?5Zw6kHa4y%M+V37Qq5?pNUP9Vxra)HlC9QG>_Mz-$r*2hY*`n zrz10~T+vR-_7z5>-71*BR2c2M{T_ZEMQjrD&m3_rA~q*44oqD68_z0{SC(x+zi>P2 zdm3PvaK*T_#O8RK@udD9Vsq?vP-4?mViR}nis^cFVsm7aLUZ_Kz@x$y1MdM}C;ySf z^UxR#w|G~Ra?~@1kKWgTs+F%7(C~K9)(DIhk7%A1bA&El$uhBEWoz1eMgR>J*0Kr ze(3X{t(TfZ7~m>0g5u}UvGi&M$Z=Hd*X}FHNILWs zy{Gs6$MJwW{e(2A=bh{4@IkN90kw~kFhA;E-ZlZ)XRnEzNDA=mHGUWs1^e&Wbg@na zeDASn7O;ez;jb>N76YHV@;*s-!XDcnncFV|zU@BS1A{01Pq-uYy;a2)VzX1DGxNoH z%Z%G#X4*Tz;4jY2My@y)=DB(F$ z*yHw+a0<^a^SGPC_;yA`uoGaP?S@w`B*LB{8?F32FfLepY>gg!7;b*QaQiEa+Z4^a zYt~}GsOqJ8kYnTHTKTVn6!cbi4g_2oGDZP%ZJe5EW)AyrSi`Yen?}J&`?#>H--WSH zTH#OYr1IYlND`YhHwKKRh*B_uQ_(mK*N-3La~XL3Zu~A%^dUC>THZdE@ExOGx z!!SUw=>+nQ&BhytJ3FKStNRwL0lkgAkr`Gq(J#S!a1{J|<7L@X{J^*IQcZR$?6`4U z_jrHkeZzq$>CNEVzt-ld7yA9~rmmc03b}%cbB#f7y#nvSZJyBE?|OX?_}4n>a2Mz- z`4aX#8}aIXlsj7&{=JBGCe{Uc$TinXbu{q1q}S^^`x6`I;9IRbp#S+P33s{?H+J*9 zR9m2D?%N!Zw~&)NFYElIoy3NdpJ8mjmDsRbqGWDE-!?UgTA97X#=7H7Y(M0%dfSxn z8u4Jo@3d_r;>B`xlysjHv9WM9o*WK)kOjrLHxUmesjcf8=MkG38ouAp!0)G7g*~f< z9~q_d{X7r<(Wi=yKtFoX5@*e!H{HJhMz`R16RBdA;9uiN$EDZcM?GIRQUvx>YZ>ir z1U#zkRg2GP0bU3?y&QB^kJjs-L!MQ$_xYq^=u>POWes(R2=e)Z|i*@i189p zuNwrRPl!0uH z4La0`^^Z-OK9xMg`fKHSNfW@%iXEB(TEx2TK!(YYHe&tKg|9!nfLPZXH@tm4l~~u* zKc8#WMXamCEY~auBi5BaWdjtzXN7WlbsXU1MLf@bqW|H*ji6lgKU~W5A^^{2W$IVo zDFd3<1wX^M2h@-DseZ$nGQRhKatbfowh-%5`#&4M=Md|X8Ga8dvhchp>)Z~=Q?|1? zF9Cc%>Rrh)`we_4!r%Ohzm;PKw~-=MeR)LU)2R>ZpK zqr(yh=%?s;WTqMHS?t@j>@vpP{c`3=nJ32Ai*=qI54%5o03S8ugb@GcNKPF6JYJ?OMZs{O>^(Ng8un$CM{LKcit-b_orN9 zouVd@bh43HpA#+4omfq*ll8qDUPJ!mCu?_!^#Oh=h5N!#k1X#*C~E{riyHU+!;ceD}1Tv2+wr~39-JE9kcVo zJV1Tjh)n4H;t0`cjgv4xv@S#+a-~s+qHhxGGu_`46UvD7sm2?dU+EL;#C-22%f-Yx zUUaJPanL(b>nJu4@*Mm!ne7O94`!+U$pXL8u3B>5u-mS9XMOB*t#_-qyw!nTcZ=NE zybAp6Y)RC<2|wR4F?Gczvz`o0G**1zq5bG694TiCZ&$YU?4U3Q`)~g!1Cu7`tor`tv(7xW)d*UA0V*{u2 ziY4;V2JYA+GRDL@Xslw}N8kVrlz=;4r~>xXFg*CDrR&r8Vfhawt`9w0sr?XeG;1OGhyTg*5RetzUv;0&H`#QNCe zlo4xyH{SN>Ic?bexYDG3TJZN1aVuh;!Y@))zI6tnJ=1OcxnIy*_ThEjF|HIWo1h7M zT%Wb~D(@Q#p1d{*wUxYsLPN~|hzWg6J)GqOJVOG}vgg0M**(rlK zEmZhjGzEIS>&P0p6nWwS2@&GL&mJAr$W5X0?4=2AhKS?GbGL6&@TK6R(LLa|eAJ%5 zW#FT#_r2wE`2ADM%FD{IQ=?}D+s^8L!uqJqN!wx1Iyc)!WB5bO>#@}<;lEFIM3*^y zqhR37V957mjjG)Y@KK)jpurS={ph^5vJL#{;Z5w*VXsGo(i(Vqx^X+6EFKNflaE$_o9xp@?94H5+X_RpWB6=2tn zonLnCg8y}zjoY&p`t4{LpWKhQ?wG$fI|6y7BWw4OC*Z%cZ_?f=koV)MYL5ZfyXXA7 zLvMlq+xFN`X~>8D;)~}mgxr6obY@J^zMIbU|_P922#ns~3}_cL028Sh^G-WUrlYn{>#wNj%5ox(;S|iw!yw{ zy6>0WA)qroes^pN_MtOHj=5>z*@Tp;9l}1!>-(ux8Ag;r5|%cDzq_SYsb)v)*V)2l%mG zC>M0lbQs#4IyJfd5V4uF^}Tf|%3m=MgQKmjq7rU$N3HP&g_QV{ydsLus+yq*v$Wji}$!dpGo`YT&19ypA-5w&3$%i zDe!HI`{@z}Jb{-s?mmw9n}AW@KFU$=e>XGD&*HskwQ%{5JCJKdtlSn=^!r>mn(C$g zAILd=_cQjn%WsdZUI>5m+TScF2L6|}_KO|Nqu|}VAn1L`EX7ylu$%kz3u}1sUgLIn z2Rl3cG11?H_oD?lc_9n1f1mf@T%Pk53a+`LkwI+iL+nU{ zE8e#bXyo<-KPPZ(HDwphxy?y;8~@+H8o_Ka;Nj|zJhB9SV{g~y{|xrCpEGy)(oLW% z5iK`&Dg}?b3W8rZqc;CI=xwno|DSlgw=d3&{cH$-St67xj`i|i`;Z?D`P8?(}3#+tYUyBvrI}cQTai?=Hv1X__^WMRlj`Um(#;8ta3vC%-!p}i^2cQ>;|Jd zrvHII6($Qq4&&D;JYQiKli&Goc;TdM| z_k8Y)Bnmc0IwJl==jXpU1-cTaN5)DCQ&42mF3=mVb1?iW#z`iJ2n!%CrI$@FeTVpy z37(t&9dRi?X6wSsh;zjgDI>g~9~C!`0t@6-wIvNxg)vSo+Sl40c-7B`X|0CePP{w4 zH2*lU(NU{jrUtsY4+E!Hz)q92Z0pMuhT%{?G#q(r3iaMUlm}?SlDxxTQmO|_`$42)_?Z_uUYiiCzO7Og4irSj3;wKgsAUBLvVI#gHa;<*VNkV zCKdC?^TE%}cov;f1U~aa5$w9##D;Y@S4;+Zku#w)YcAw;*l{=SEb_in zMYShoN2f}YFFFasaq2u_zC>I!1uHZhsqZ8)W+ys<*R5!s_msxrxc8bg#^>`*3bO8u zhP_uRURZq_aE->BXH~Gny2$MTV$k#Ys)=iEQQx=rTdmt3iu`3`VrYu@d;gSaVqWn7 z4ZKsnWUd1Am@jDu`Wrf%1>Qjq8yn0{gn*AtU*$IUjiTUzx>JyI^N-k1cVVYs?Ynsb zu+z4v#q-xgpW8Qbd`#AZKr`B5LSiJr0aW)1XvK=@W$DeQfq#Qs7k*4LO`-*0-5 z>tK{Z^J>KBA#TvA*T_?cN4UH*Lwjs*>$((-JHD^bZWi^udt=p-0r-ESwUiL`UHRA> z-ybirZpRzir=P(51f#5!OW^moYQR(#*x|(N?g=xHw@#KyjZuO8iI=@pw;-NR$*X7A zLqDf(o;ket1F<_Dq zb5|TC#vzWA{;F`IVUIJvge!j{9!|Gft|o~?08K!$zu)=)=NS;*zyH5F1M;5(2LGQ9 zF#ON+8ixP#yvG0KXv6=*=QT$B-<`r3^}juZVb-IsA#v#zv1v-5TC%d@f1Df(D0BJA zx5wfC@Z^{>F{`{T;2m_6nB^;Hk6o=z%*uGOMYi=3vkKkCw~n!iS=Ds(ml3n-V*<u1zIMme@K>ElW z)BgW|gPNC(@ijFlBDRWLLxq=5{)a(#FW>Qdnn&vYp+PkXkw|b8*lk6KB&GPvgov-9 z4K!A8@Y%fJ`e1~bA3c;UD&tDbqoWqzSQ1IhBa#r&Y+}Bfj$HGdc8hQB#`8`p(zS;B z_fe7DNX!p(B7!mh$ajHdj)KJeG!?Nki1}v<{|!P$GmgaYV=M7vu-J&L1bukdR)RVN z-au?6od*vE+sf0$18h~22a846s%s8jHf^gVHCU{`R!3*>Or`DQ^|Yf*p^GZmPNB~@ z+G^96f!k_y(*{?gFQc|qp$|jb%1)sjKx)xokpYIE|BVAk{QuYiyl&MBFFQ@xJMLc! zU;FcatS0k)*@EViy8q7{KnfY-_(W;5v53U;myal%9YsjSmrqu$_X)|;td35LCghrp zMD9^U`n5}!c-sRB$-R6h^oc1UH~Iy1z5(8>)3)c?Mo9j_>Vq3F?)J_L@eAQdcRsGx z@|XiC=l@G{Dj~&Ov$89_gxnVyJMa~B%4=6^`L89UQRHf!{cl2EzI`7!9+Ce#=R(2; zbwb{Co?286M||(*@nI3>eOTW4(g+!$bLG{i!NC8qQ+v)5IPO=j#;cvkEZ?#tf-WM1 z^u5Y8x1K~ufBdn?Z=(o{w=$OmuO+Ne{YoN#>Ih3fRpV9Za>5c^BA1#tp0Gwsd3?xv z1Gsif+>}7TAfu=!b1;r1-QQ#SADHDmzi=_;jkq*ou@hkaC!1pxgf)ge>H3=j!V>=c zRzMZ_$1brtkp#NJ9#)Bd<$#WPX&*6OJU7Hx3(u1FR;L^$5ti)et94?aD_f~Ft{eUG zJ5IU9=Ma{HnbpZ`v@0C`WG$3JSc-z1t8{>0p}+HGCGaYR^0)*G6PC*RyYH5C5tiEO z2Cpf%2}>iVKs-R5u(ZEEdzjQqSd#)i*>;29DPe>!0rDGol+MizC#z%)_K4DxTw?BQ70grE z$>UrJd`js8I>&%trJ=S@8FH$%d30!lKg~6#7F9sc6T@=}FP_!y?}VnpAC!!(5|_dr zQWb7ej=-bBySb7d_EHypcuN!d)pW7*%YX)zhovue;0P;5?A=;#nA_I|9=Amy`5%4Pv?)a3`S#ITEc3r z%ZZrJ==V~gfB$*(Uuqv;-3GjuVpmVxdjK$p&94pnTt4+(W)|pPF^$-)3jfP;<8cv( z9kPzQNd-Wztho(d#}H>(5du0>;5XThrxrECKDm33D42lW_3sNWJ;3-p<;6Qa5f?X& z16RahUS7rcT50(0&5>3ou7Xa%s4;PYfZ2-GF+7-`rD?Q(>hEEC*Vi{sI}H2W)KJ~( z2s*bn=_|j2{6*%a4#mKG_x<){4a_Ss)}Esc{g(dyxqAZSd+_tvo@n4Lo8-OlAn=s+ z|J;2SdU;&F@Uj>DzS4qa@E-H4>n|MFgWhYm9Pg<$F?H75aNIpUt-x{4}q<+ui`ZwCvhkJqdBr*5|!28*%YkNkB&t&u^k1=3R!o z?NS1|LBRjM)nthx`03O~o&z60*mIjks1u8^(PF;f+d^#Y-nPi!#6o=3-M8Q05DUpm z;A0!HQ1v^tNM$Oq(C`RczH=0@&{|hIFDZvu=x&;CF))c(=vmsWFI-M6^zV6eyaPUi z^h+b8juHzaW4rY>m^U>Nm8VlhMh=PtJ{Vqx5qcaaD4%z}={eGMlTtOH{QgfP$I z+SRA0go%Y!TIY+%Xuy7>C=K*moxb~Ch=MLDlRxAFj#b?%3_h*=+@wXu6AK%cLHR5= zQh`2=pgU)L!?HMeVlnrJYH$MRJ9@nxy$$2$hy3ooYDz4e_IAEJ0e%+VmOH=CideWT z8~f*J9kE!OG$wAWB(Vq_s8Fi}{m_86GqvD%&*=t__C#WFeCGDEC+`!BQ=>Ll)q_sT z&iR%qfN7lffg#XeuEw3vPUz>x^}FwMppTnpYx@!~K7UEb%r}tl_6B{G7>qBwHL|E1 z_{y_K7AZr&86 zmZB#NdD?EQi*3gE&Q|XQw&ld)^GoeHhXB8s+-*+*{hwOLzbwMMKl4W3@dlkg8`@5f z!t(%?KR|zA%a|j&zlkN!Sm=K|vE==vbN#dxu@nrC*!0+mSdLM-TIZZXEQJmR`ixmj zEXTGgiA^mamg7vnT#Z1#q_tII80JfMAMbHp4me_Oi}?#;Il&TfHI-OO{Sd6`%$ zhicn}qFwE8()}0m#8T7y)ME8$VyR_xEb;)_CykX$835kNu}2iLClO11oy9w{%ZcT* z(z#78qlo3q(d!QXeM2l~@mC+nUrQ{_GdrJ0;FW!MAg;#%oG$7af+txkSLehGoA& z-{a=GLtfj6}{P7zV~pDFU^SM z-a8@2XN8GnblK{OqH~C4%%9&~(=hMI=i@!R;5%Mde?c$i#V?NtYKDGJZ$Z35k7t)R zcpHGv^YYtMw17YTb5hB;`^56fh`jV5;J@}GFYPb*$t%M?0`0fg=_`+iJa=Bpoj(D2 z9xOhhs1r^sAC7z<;DY`~8!nA_n?o$iH`o3&0^O>Dg_k=aZ*9`ZqJgKxvQd*|=z#Gr z7uNO#f$r;{pKQ7?{$0ZM_?VkMd{p!;$vpz5GKtVDE17H=6( ztVYj(pQD|>7kOTtSdH3zY|kq|KGTs!2?fMTpnGs1V8*q>U7Teh9yZUa;uS(M&Iti&d+xU*<6=*Vxb#` z73g#ni1ov-{&?qIG=iRfHaAa~g?)Z#9sfLaA+h|v4}J!J{BGd!;SButTf)!Xe9%j; z%GiNl(DxUqT|yPs(96QB^={B-$NHoaALygyMdn&#jB8pp{p$eq*)T;w_ZH~XTf0rz z)dhWz7~HQ|K1+Cbi?aWVE?R%h=jF~@!456yZD-suzfE!V#EYQ+M)in-7WnI)KeuTs z@O>$2@Orcae3{7}qzdVEj1v{m=7uej$Lr1FTM(0RP|X-V0u>BUU5m zeX`XkZ>y8{VJH6AZjz;=0EG|d4TSx6E#C2ivg^~3nUdi5$K}j**zZ_= z*gh#Q7JR>pS(s@EKYD%dPN*K@rOmKFysVd4wocSnnE*d;u^T(E3~}0QzH4kI{Q3E~ z`4%6cpQfLu79EFw)@Vu3ssg{&FO2pTfd8kD*Bwry^s?|0&&09Bvi*o$sv7js(fP?% z8T3AGe0b|M+;-O!9m<~J|5hES#~KSZvoFo_whB@=UaAPRoxnh`CqPQuGNBEy%M{Gw?eLO zB7^&Q%kP}=wa}O4SML?KTVbCb9si#>nD^e#>_HRqOOJ)d>n8B|_2qnvTbSP;bu6+5 z`uj6ylnzX|kxR@~l?d7U3V zSzV2kL9Hi{J_%|xuVb(@%k$E%awl2f8E^RHP(k%zRj#Y5QK4W-+Mbzc7A&n`!EXX zDT$4Mo?bt(TfZNE`+C!}$Nm)D^YCUS+TX}kXdD3DH`Ct=+CcxWZTx>>|7F>xbwqIv z#=Yz|@eoCSQ}*`cQ?OfkYxRMP&`;U-#XFvYezBpqQ_Q5{ymc$AKs*k5%lW-M=@asJ zw(`&2weY7a)pMJw;7^w#1+<%>@3hWmkNTjWV>9GZ_oM%?$lPZdz#9`8xZD&l>g_I} zhy?Z>tFWarNT4O+Ap;r^9xC6)4k ze}(4bp9(-vR*=r?(#*ObJ@MeRrO>C$ts@HSKwsWya35l++`qYsYFD#U4cQBMHQWPz zCSjgtM99oD(3_^tm^f-(R^L$S&~EAN$#()E7~g`)<|=iFa|_O`G;M9Vjawwr|=11%|h*oT^x4SrCxn8Dc3h_cfX zVlgFb@Jq6VX5-+8KMQq6el8g&9~B~K|ixl zWbCCx@rixElHJH`E9gUsv4;ZFuMk1&UEYV5SB}9a+e*`yrs!cmFZqjZ7n?@gSAf-&~Ld$7Lx4(glrfu6^DMf1yQrtQV5qy29;WuRJu!Co3zB9+yJ3C)BqWlhY_Aq?!p})+tB540%9ijXg?}NwbxMQ8trTI#lMe}p^ z5Y5kdJ6ewPZ#4c(j|c6*x=h=Hby0fIk69NOy`6WZpOXpA_gSX@EcF+LCI6A1(c@X# zZmc9a9$9CU2ji1#@llR*0$D?x7XFBYu0g@gHsb&U24Rs!uutmDsV zeVw5Fjdh}r#&go0o;RfL{dF*L z@sWv#ZierV4D9ly@qL^})BD8O|EDgE|1Z5RS@6<-!Ls0I@{S;rrv$6%ye7=7ALD3$ zv=C$Rukt*)UzL{ILYgz#bevmg(tk0tn8@T+Z3d4HlTUP+{H4d_VMC^WDjmlb zrnG)6X4C#=VL|_a#=>eQoyTpMb&pNk!Gg=IhjVECTg=@{kDpgY_d7EAbY9V*A6U$Z z8}us+JBB`odA4Tqwgnxx7KD;l1ANeb(X*IM`>)09O*B4pMi1r;-64L>a%nxAFwe%! zx;cYc&!#i{O$(#*`&2rgT1;j1K8?}GOgf${Oc**Q48Jq!xUiVQtY2!(I;+a8t3&IB zGPB+&mC)CVDpMfJ8JC2Z~<8XjpS6SbfywDXz=YtPSzI*?a z_QUs7ei{qEX7b6<`tXe2r?8$dcplS#0ArOh`K*Y^F9l4#%4OD#9420_G4XJX!JEzG zt!qpi=Fs|K-C)*k6f}IKoO}@^cy^=LH6DDwFq< znRO+J)+_52y`Hm9GI`+`v(6l${f%|#Bu!^1U+!n(Je%7?PBBzqxY4p?ezYJ zwUxMS*s}hRuGma9ha=d47~-+ zdN-F@KdflGvj`)HDZP(nnKJnP!MMTw4$G9$?{p>)PN)5lHI31mK9dJ^>HQ5$huJ@9 z&!gqnr1pis2}_;MM=UjFJyd1#t}3(ssxte9p=TAwzDkT96d3=KV(cneGWZvH)_6v5 z;*4Fz7&*r>>yHpKUXY$o`e}QSKAL~>jrK?Kk@>@ICq19Mr}G7Ar}H{#rtM2!Fn?gK zVenKxXQ0NQ-bocR{xQ8DBadkPkq5NhNeQiYa+lTvx$}8&e?kgre+U50Zy; zypjiWo+tO1Up(BU^A9Pe_jBYPAN>o6`}97Jlra32()%k?LhmcdefoWg+`}((@jj!s0(zfHa+qIsWYh6YGB(lrOrzIll0xSRa+c0pbUT26oy$>Un%r95wGyXh; z&xKwG$RehHF$0$h4dx%hytfe#df!HtG5+pFzh{u;jNVqz`vKysPq(jP^tPIrzlvVp z$trq3K~^z#Urn!%WDSGIkKQMf&5WIoGWIw|uU{mdvDYzrA3);hb%z{f91k* zJ~XbHiHj#p-W}?%q4%?-nz4U1)Bc3{#Z@g67enJKnYb@!eu*`d*GifG`&xtFL&$x` zA0N=`)IT`XUc~6>4x^``yj8^ff@>&`UT5Mim&r3%89&Zone%yr}Op!CVuxb_;)jU2xsKl#l%}66aPc`XCq^Of5xBv>F-x$9TUH6 z8NcV6SS-03s9dz$%=&cUC2n!hT_7Iv8lNdFYn{Phr|ehPYln77eC88v^x{7|i8 zg23{9X~g^?^%GIdFQMie6Z8B2*}|&I~(&R&_7_Sr+!L0nwY-{ z%N7Zh27Lx^KmAivGLnA(A$*Ko1?c@b5n$FmekLD{pySK@Pb-bD7kCf8C*~ihAI1T1 z3H1ZIt;GCJ68%HDo8JYN&HG8rb3cQ>JYt?r{WKQsS(H3@zEVX0Q0@wYXXrT{_z(6G z^9vMgAm%C42Y>QvzK78A?qYt3x1Z8iIx#;ink_1`ikKf|UH|KI$?4Y{bOrbS95aWquJl zgUO?Wi7QL`dnn;Z(!VgZqxZqYo}oMR%TPxqUgtA@=D@5YbC~#IGwnnEKb7H6hl#f# zKUEH)=`!zuM3MG8BG2$4$20goMP%sjnnddVMcki2)!2Ox;CM1*49%M7K}t$<_jWSe z+l_mlkjx}9WS){DiG)&_=O`&-5v39tlME#hA|(`3W+n9B=k8N|*4O)A|Fz!re}BLC zU9Ii8&l&dF^V#P-=dd_e`7-{l!0_(H{3pu`knYSrb!74(%jBb-k<|XU{-N>|2y#U? zMgl(@1Caj>Aa^SPe%Hl~lV1qRC)*(DT7LrN;w#+>4SZ}uJs>iSPBP4X$)F#0{X;ie zg8Y3(`E{+Q8#O@=K2kln1^rPzgZ}(v`qIEQcz$B#-q3O&PnGQV=Tt91ZeE>`Zryf$ zP0Q_R)4y_tZ&@!a{}|=Q^%1QHcsx9fcsyisUqYctoBmy)deG3O7nj+_(aTg{px#9) z=TC@h4ue@#ZlRw{)=xI;_Y#BGWT0O&;(Cwj%@5*Q#PqD_Hp=^bYF}mno(%7&tb7@5 zcUGJHzbHa`^PIt_jGis^TI@!70OJ3Swjq6AJpGkHtx@q zp2=-?r;+L5cZvttt53{6)OsUb-gHB{RM7X(-g9OjTKH5=9!4F)ej=IPt*3Y|C$8ZYNY8K?q-Tpg4PpEV zrsEb8*X4}fOBtOOQapDN*Cn)lu=7jtQwP_jr?K4tCO3ghFG4AOp!^ypAFE^04hP*v z`3{$g)olsv>)i-o0S{Mj{5;ejem=?tpZRnCZR7+04#VrVjFfKt0&l53 z<=a)*ElZT zYqS%*Dzt07N{kPA6)4xd3Y0J2i_7@w(32u*oWv_;pCH|3^>3p+o4vdC$?W@}42zd8O#@cn{D%^9tD~N(Hn&v~!E$m5+X%mydp_^?jbXG*0DRLO;&C zfbjw^hyHFxcv&d_ymM$@c`2x8yi|tADaN1FSgC#Gok6+eond@TML*9=Vfda3z3YC{VY+O6hU-Ay1J>$h=9K%aOzs5Vx_?&`%nU~J^b%xRR82a7T z@`t^pddrJvpQ;^V?Z$n?{`S5{dESS5!aK;?i)Z6cL_gd*-emUaS~B__UNV#Gljw)r zAT3`Fcv8B{0Y6&!$M|xF>D^fd)0y07uutVOnLK4Nx?NzOzU4BxxMC&Md)}2$Xw!aB5?zh`VsCV2Y??eR1&C%;+`rTk0C)J1L znZS6D-;CD`1bIzbzHMnW(CN@UWwST%eBf5CT{QH+rSuxV8^HN|zV04?)ZzZc`7A_PXqo)_IP&;1pW;_;N9Uay!V*2S5N`v-3=4N z&H;S}-AJxW2RY%#@wKJ`UQV;!Czb%+2iDB1=>_sIpj-Iei+c#qvO?px63B@~?T{}% ziwLjZAs<&0kYnQo{;TR!3D0mu)S+9tgr}P*@4e&`;c2=IySn=d;q|^_KYT3U(cwsW ztTpIgJImN^p1X-l)0&hkA}iw3==Mb}IiI-vm}B#Dl`e7lR{niqmr#JJ#?HGw5tlC? zbf!J2BrbJ57IErs#HFU;`(mvI;_~Xc%qhVJ;!?RfR?8H z;!@NY6*u_|aVh9`cg0DlckAV_yl)HOS@?RQUlDP+`X%K?z9YaD*ZBFd#O0d3f5=7X z@A{m*f|JLHOP+((@(F;?-QYmekx;*2k45igor%lMvGU#{_7IocQ91s{`w*A(yx49# z+=qrTRI%*oOq41x)1H1So(eOEs(2|6Wlg5 zjR4r*raS<~cVd#;rrUaL?@vwhU;RauxSV^WDN~(HT(U03cCW1G;WY--?%^m>n>u&tc2l&M=`BNQ?|I37sMq?On-OsRTV^;vYU%pv$HnbbJ z^kMZR<<08w2ZYD(`P3 zJX@n_C#e4%n3&eL5bTIe2mQin?Fi2*o3GjU0_uOA_iilM$^M;lA9${T_f&4dE;;rr z&6*DV3>xP?!2#^V(7=t3mC(M>e%sJF7SS31n?Q~S^4w#;8d{tD}#pJbn4Ug ze#Oa=dq#tOTwyNdKW_zGy`1(cDq1+yqn%k>jTnF}s`3|LVLt&ta7L4Nvkva7l#*u82a%DWknMYp6cC!R} zB(D#fO8ZaAo2j}5=yjIyA>*P&&kT6ZxF6Dx0_|n@nRZMFe(vU$4(h9b{&!w3&2EHo z-&2=cQwQbmt)Hnp2k3flsxjXd_;f7;%K3+_hTmVV2>BTU<*IwQ zPf&q&-dogKAA|W$mrWyg?}mAb(v7`>eK0T3SQxxb8{&Vxl;49l&w{vqs8hxYdx+z; zie4K+oUcM^3hu)^Kr!RQcng@<^qjaf>!Ab0<9pI~?1OeXM%V8Thj?CgR?VF>nBT}` z-(7Vb@cnZxal?KX*KeZn#{}R{-7~72RFw z2>$Nfx}9YwL5|+MN?i98{N9^Bi$?g)YWw}83D>U{;-N2EwYKA+{O1idH@%>K{n*Su zSr9kX%^LExJB+t3wx+mLKwY?8>&}g!O@kiu^O$&l{BZKmiw?KRr^cK2Sb3`l@H=`SZ_7uZJ}!$)xpD>MWRb$}!CwKNxu3_)^#QzRJr0hJ2DzEuv~8&~ zjBhIN`4!+Z`LpWy+raR=Z@Ung;#O&`E}(m;D*KG1(cWmJM6v_E!3X7gZxUfVT( zeFi#uM#pwmgZg6G`nU~1XODWP^l~UK%HLVJ805vhOVq)i@H??6-xLGwI!A4^TMu-z ze_iyN+8diwfyO@2&H%UcT`S>t%l$q>v_T)tz7F}^xrp#g9?evG3G_E8jn`JH0H}Sp zxx;C~(_5UlE{VbgZX4gjIP_)($M%JO^`@rpoIQf@w0kCh06*CJyGc{>$7!?L+HdJ^ zK!@B15Kr)|=j8a;0ezh0dS841^yVo~JN5Yq1LacCvPw-!zr17iuVuR+SyPGGN1s=jod4)Lr}rA3b)mkCe5szAvH58Vw;g>oIJ9m{I8Ndf+rCAXW&lX;3 zEKBbR(AX-F#vk`S%A^ECe0a~Z#8Uuq&z*f=5a$}*-ptoBfuCYkp842<2@fmVq zy&!Jf`sA8x8N?x*lH^vuhxm5gXCE>T;)hW8Pj$`^hlL6%f7C$Sy81JJUfznf_%_6^ zvD^*fk5!BHiw42Cg7W0n8bF-5Y)@&{bBO;IN5Z@T`kgZb<~b10FNm1<6y(%p!Q;gB z&!OBr->mklpxxP%EaVRZJ*H8+2L1UMp76c`apR=yP*W*n@oHL z`9Rz^Vf&D8Zh*&_{;z%J0v^MBe-HMD@d~?}C8$AsI;gqyd_M4t7kG#lK zz$Y7vX~!L)9jhRSw*cS%n-`7pgMKZ}a{UJaz0E?#%|CjJxadWXTR0T()Y>_2{s*Y9 z`hv5X4fT}_hkV`&bn0Vn^9te~7uD;Uhd&){qKHzm$bVl{prcubsc zb;>)kxrR7jUTQC@n@XGyt-HHYiCeGc5@2tp!cDrn?-}eN{b-H8~xEjXOX^qplW(VRdN9{JWC#TgxZ3Wbm8$PdQ zIpEdV$fBFEF2I1L7v5fm-&Oe9nOlf+dm48^yY2cHD6MrMPR$E*A9TA+oPO^-aMsw9 zI5n9B8o6{PPM-qjy*)XWIMpQR7u_x*P8Iy$L(Mi2r_#&0kM6>ANn=#Pab19lZc%}| ziPM9LK5mUN#Oc0)|EjwX>KD?BP!AEO+op-@y{w4StxH3`CPBTM-KL$&`v{QECo70k zepX1s>>A=!pdcNeQ^BBd3-tk?TSn!P)le@FW|;1=#OaE8`W`uV;*{g3GkYb}&vI4U zF*%SpWrQ#Cx(L6YmDevZhI%P-HZN5G|C5ogea+$b6CP#>^PzsiBW2TQX#Y@WjX&R@ zUfiT<$FDpFXwmo-;wPt_Q%W<-wh*TPH6OCN7jatjusmuZ)bqQvG$#|rHFajZh98V` z?AvLlx-<|cugHQP$Duw~IPp;p;3+;6(s%{vGpuN5St0a0oQ+$w?3(LRpzBb{xcNFj zPq#@rGd2Q#{2__qA54jp{np>^uKC1i;N0&E9>TaRuLT;G0PH7@ieC!!(d|F6v_uuG0QwiBP|bS92Uk?A|`WdRH^OBikjaQU>8kDz>q zW#I+CO^L%N*OGhtLW#qNTM02q3yH()h>)KXt%yTKMs9IeUE=WcLgUlekHn!^qdanc z4RN?vGc3Okl)r7^w#hA%IAp90^D`Yw98Nu(snW@TI2`jfOUyV!9FF$WzdxiiaY(MW z=y4s|NwTXc7zgbqIOrFWL&Ra z$3!SU?`-efE>M5g<)xP*iim@6Mc%P|z;A5D(kwF{;xOE8+Y%=k;^0g#&Lzabc6*6< zDU>r_92}ca0Z=jd<54KDx7}(*pUcESZE)igN5EIHf5DPkS-#ci5^X`aM>N}X9^6SOt!0-wI7VP!&g&F3ci!702h*c05h&N?mpQbRCG@L-pWjhq1)&NuaXXu*U#D%bXszo7j~d z4r%kht5?Diaz3jup)w`0(}>OT#{Zc9S&mVVG*G{(Vp!7v5XZb$5b9F)x$L4PaEjGZzM z5xYReMP3`B{u131E(hu_FfEbzjUaY&G{dGVFC=y|l(z+VLOau&%Of8`yVHK8?=b^9 z_|``qcms6tsm)8i4&$8sF)z7~46&P}k{DJ4cu$y9Yu#Ky>?D;FA9aTIhwIkwOY$Lh z!>SseErNcA2mTg--E4&(TR6+*nZ(Zhc1Y7BsPA^6L!Xy`r(1q(mp;(n&|S3yZGoRI z3&+iW2IXzijUCc~59T9fPAPUKcBVJ4xh${(7%{e;G0@d?ZGB?`^lRFy^1CzC({ESM zJA^`hZpm*Lhmm4P!`S-(8w(U3LOK0kGnKvoJq^~DNA`twOvVG>Vf+pXxexMTe2&ME zUM{2EB1(b&{K4sahC{z@vvcP8hXUR_w}`D9VSJ-==EA(xj$5!-AOqtc8C|A33C8PX zeK)8G+8^|`t^f#%C+P2ex=cG7| z-~Q0wq@Lv)!SC2jjIrqT3+ObFUT7W*bYH04_b`RE$9_zK@;)z|GB-oHnX-xN2f_2~ zIUQ7V;r;CQ={qZdp0i)oAJB#N{O#<;RiB96ylEX&13@1afAU|Q3-6aNto$JceAl?g z_V5FI!l^x?&?wMgF5tP|d&tK_z@H6PGnMWGzc(4hYg~YOF_GYJ-x9m+r~E^P0-fUA z^^2ZCJBifZfu0>#?)m}dJ$9)vI_T2x7Tm9^@Z|9>Ld3K1pR$TFX9IH^vkqkb|4qencO{J6eAxD<(_NbUGW0+ z@$nDvFCd?#Piyk`0zDu1vsy73`1v#x_2ub`K;tlYE~W9q7U<{o#D|lBpEvub@16k9 zxoKtk@1WlK>2m9$fWMiO6W3+{zL}}D16RN}&mH%1JqYj52&bJK4&ywnvhzhBpij#B z?~C36y;G|#dTKyFXTO9r&H;Ly--dd2p(^A@A>f%)uF)I|bj+G@Hz)=0&m0_e=oggB zcv#TO9pvVW#4P?Q@cC3j=IHKps!hr*ng{sTy-45v3gr7^udo?vfX8Q(y+f^`{V!{} z*4F6}yFU(mon_#k`ZP-EYj0>~Qyu~S#{%hMZ|fv;rq5$yzaXnLvtVJHU)kvF-N_dG zz{Wuu%|F2ZZFH~vHuniYF1g+k-p6K2*8%JkYxo*xq25tCPO$q&4=QW%89}VxD?8@}{4a7mF`0k2}fyANR zuaXhL8^Hh0wy8Mf39$WM!6yo{gEt$^0zYjxkfuTUQhW-pT{_*@2P1mZ~rsHEIy<&vHxBn7g`JP!M7D%-~Jo`(3b0$ z1#!pMka=&y0iRFDQm*v{KGkiSS92Hecu(_U!0)%SW-7^oUw;>(@n@Ao8?0XOrPC8= z|26q7Xav7qz9F`oE5rj&bER~&FFRXQwFl(jMSWDl0FaC4N^+r8UW#bk2j#9+6}{4j z`j>Q^GG_H^i+fIN)0t%laYE7|sodHp?ESvD4Ddhnk*}Q$^%FdoUU*F7qlaAoPaq%1 zeMjz-1$j;FZSyi3;*(QBcZ1^q?^Ab_O;sRHNUy{O* zFW^V*kDNR)E*;uCc4Cp&Js3w)w~)ru5bwnMn;l68IvkjO;Pl;g#D3pNjCc0o#o+b_ zHoHZ7LH`Hy?1v4^Z^Q49*V5cTsJ~}Q@5_8BzpLt+OJ^v*+a#n>1o-Wvaz^WyZ?wMy z@(|x4w%dE4XVyEEhurr?)haOl`+sCo+@btqdQm;}^D@F)wmbCmHm&A%N8r=P#%%%T zecJRuZ-v@cC6G)0>P4gWK>Rv1GgfXD$n~&$^WF&|e&%wMKRt)%aXrg7FLomiljDYb znh$a`z3bgoPLGMhVd{U)h{M@Hhz~(tGjB=t+EE7MOh;8JZxHVrc*~reX+<0@YcrdV zdlJX->UTp*b%|q?zImRchB&4)4EZ#%fjC~@soeM6Y2w&q9%vX#h*S43#yoGB=P8~1 zzNqOmaWb+ScH^=d%wK389_Bx@rWGjpz`SqHvXCZcn0L)t+x6XIm{DB(Urx#RQY!aKlx=V|fMEa=ziefEJfGhyD^as7can_!--X;f5o zCzCiEpV}+%hWV{U#OukCFi-Ap)H~M&%2_V`K0m}0;JEV0>+s%+u4BP`c%b&uiv=)0 zcO=2lBAB{GVR01&N= zDvbqv*IG`hoLE7e<0{IG>R~>AYG_p48Yp*WMEPdTg~a(BozG4s&S_yM#(TOG=i?pb zz5lua;HHX)qoBVNdrKs{VV_iaeB0V8z#jU)-3#*@cTR=;oCkC( zlC6(}xYxPlPE9@pM$S)9?tC6CL!2v&PmJ9H_|(Vu&aDY0&R^$rt)uNU>ZX|oWfB(! zy^sbY2jZftr19&sE^*P~56eH-i?|qV)|sggNL>1EcAua!mbh5SO?>LNkhs|1u#lge zPh6au!tdyL5*PmE%sPp_FLM1u0aAIp4DivsntG`3_GfAKR=RH6JufLuhPVu; z>s_ab3%Bb_=RvdD@?T!<)wXVi_oJ7`Yqe`2E@SWZzM=)~OzgdF@#$FN;+r-sZw~yv zU`f{xdhmOI;x!i-m&>Y-*IaG@zT19x=o1CM@7+6Yz8k>(PnAuoOo_{Zm5JfnP%l2r zYT2nR#O1KDevuA5A4w<~LCYU2kCls#Augw))SP-h|4*;u5g98WON;t z|7bOFIsZJl?&neBk{!Fz$+$Cd$u(Dt)n7zhF3(;x8s>v8xn(vL6{YaJRoUDJ=yYRG zhdxH}#O2QQoiDY`h)YSs$UVzpoX=HrWI&DOf`N({Lbsuzw7(tGlZu+*X*!)DB!hh`Gqy61~V!u*35xdGeX zvMlQGXuxO3u#^C8K$5>})%Jw9`+dB6wjANbQTt>@c!!6`oDu*Xj`dx7S)uWN)(Hnh z#Xp1g&(Cw8Xh!$hoa&&i0x+j~Vrjp(gjb?JZtgoZ!h4*9>yc$%Y35_c5#Ec$+~T)T z|K-cz7`k8P^}2c0M;i$5ZQQUM5dZROas8S1Yg|#)@v($2>lo57`!V4gci&llD4*~x zrdtKZ!tVpO8QV9g5$A}YRcUSe+1=wGU1O}W6}LpHQ{?X zFB+*c3t(8R{0#aWT%dGh55Ufe5i`x8{41H0HqibE3mw1a-B3^I?y9qr`tgI%X=6*>tqpra8IsZat+~! z#Ha6$fp)?a_&U>P5`OroiBBV*5dH@1A>WS!o|_Ccehz~1MKzQe4?Ifvn}7d46%6f0 znvH^UH}-nGX(0UV%hGp^gLd`{oiasggnxKe;yTMf!jFFw z+cj(>;U5{4cXSHC#OAK=wV~g`)=Mv47~A&#;54;u2Z0W8uBGXRI}`psgT|-B0iWH= z%Qss+#ZMYsU{cC2yR*d6fN+0nbh254v3mxA7BfNpyqDVxT0X{+DbPSp1$@=$+w zb-acj)Zcma_mEY${->Qr3wamd!;WWZePuFXJoXbG9R|9^s%gq>0eWr4^)ddo82>e< z=qtjQk&d_Qrl)@JlgfHWTp{U4)t z6#6^1JZGLAyg$C(-n|U?eA2-zc@MOI=B{@~Z)i7do&B&)K;N_PZCN!c8dpi-Q3(kjK)-jo2S?8ZJPX$rC`$eZ-ZR)1pb7QvE(tW64EWsL;oZp)=vng6>Fh1Q`*HA> z&d1>QvZJ}hJm{|+*QNQDn)0Jo!~04rA94-&TZ#Ewe&w3v56(XbzY6UJ|MkA`!f~KK z)mnQ+9pSkqa^l1JK;L&BGgV&Geb?XI$KMC|#koLXHI(~!qdZ0j+J7tR&?go6`_9PN znd;@cjJzaOkeByMrTa_xwOLVz*3oDCK;y^2zj`~q-Y1~Tx19%4o@NnOwWBA-PhCM= z_1EUivDrXeO|SBGK0G0=1DDE=eiuPpo#OafJ`Kc`94wIEHnotyTUH zLS)T*&+FzRe(CdkWXg%-ohn^2@5P9gvn{|Yk40i8uzJw6d!tmwh zP_A$LbXWBugqZVB$kzWNq~HCNxy|rw>AJ9Kb3cHM>Ez~hfU9p^_yDkA3HTi z!5_xGRc^{VC%|)u*Em&*@2*)re&=*=J^$OIzhidg#Zuy7ap9#wd|!aq$L-C13NWzQ zNIrvj^i!O_liN!?%wIQMG~xr4%vW~m3UGG#&pwmk{Qz&P(+N=CxcvN8eSo)hwy#l# z_eT~?fo_O>fGf@7>d?+7zaBHCl@vt2DwK^#Y zph{5Z?oi%hT1l|mcWB>y*0(qfC_m4Bg&>Z2m|A+Rv>XKOo>I&02K^cCe6rUI%Iin? zESRD~JhUxkW1hYv9-3DRc;gg^M<1`-pJVEXhidtj+A0{I^4*z({Erh4CGqnP1qH-I zvA6BDU17wd_w$a8YoUCvxmo?LK|4Jn1tr_J5s&Uqf;z`R`(2OhzWgYScyyXa+6@^= zJlZ!{xNQAHJlb8Fe12;&5jA&BOzSY1h<-h~=I=6@h<<)GyRR^Vh#DUnrhW7WcyDr6 z|Gq@ju&-kN0Vw}9Z&&vV;{lFZw0dO$5q;TPo^>Mtphm~W$8|*XIaGO!^&=wsc;Wkj z!wLZBM5I1R0N9g1?7cR?+XLm-$^*R9y>QHWBC0RjeR(qUQ~P{U`@7ym^gbtPhN&?T zy)F4tf8Y%f)f^-3K0>{!$fY&ud?G3zV&N1MM?_E0298_~<(_h}4t&7->9j7s8)S*7 zRR5a)C|b+|tHJLqCOUt;bzoO+@!%2g>JK z6VdHDx3k{?|AO3R6ZKRgx^-#4*(*yTx=|A(XQ59-*VRJHuEF@PROLM|2_vFhm82Oe zKZ)q#CHXa@uM*LPAl2@M--#%j@4oR6yw9wEvS-3bB067GvT6$8nQ{92{y{H^DBU;W zv`9ik=Z@b^R)_x14GxQK7fnQGSJx>u!no3wZ1i2cn263y)cY6uZL#LR}Q&E zL~)}B&*@~@RxfVY7aPS+@ciX<)DysW|Mdb_Q=r4X4)S3uo)XcXE|=Sl0DA7yPN{nd z^xDx-^~4CqyCWd9tP{N7q1<#a1^BabQes;7dr;o!bm9x>ci+6K(i?#1zL+cLT;CDV z-eUEDh4A~H^1=Q)K~DBsri~AWdVAl@oib}Hl(UHJvkCaPciR%1dBE2_;^3UQ@cXXC zp=D`FL=<^?@6vWaw}_Ri78^qU;WmpxV^WA{T~n;R80fN||9hb(&~LqbcGXVkCw#sC zaX$gPPn{%N2jg2SNcngT@LeOn<-Gv-w)*#{)!rb7t9x43SHSpI9o8yOh4BY>+%k#> zbPqD>GJQ-Q5e2?@cd{eMZD9NS4SivJ%eQxI{0#gEsP)wk1iCJBs(N$`@LQ4{`g8*D zak0s&g~NbO3$3=)wug4+$I8a;swSej!>q^7g?{}rEkCXW{g_o_d-dxCBAPkrSg{%O zJELo}@o3P?>2DVlw6i0kX=kIuVgP^NhuM|hfXCDwrw*&oW2o)z*tv`rUs(#R7-<&>qzXct3z%^bPd~ICPor1Mdff*QscofPO=s?ClBk9C)Q+ zDpWt1HZp{ccK>LZD8t{SKr}x>*3w+4#VCs(1RGti!eGN3hZt24e zC=uja??d;youIy+-wvyJ3-v^hPXGZ@r$z71~_CvLFpgj z{;lqG;(|!x{^hH$f#5U1ep_l&Q;7T5$u}160QfyMyK?AO;{HP}e`8`EJU=?+BKisS z9-nf&Hxgj7blmO@)AyTw8xQ?__lx=g{kE?`Pu2Y?4_#!!=JbR6$kZf z8%FN11Gp*Sk0Siu0=N)msG2>j1WEjs4NwY~IjQ>W-4c((a=e+xh2S-mP?)g3E`VNRD?ss+9 z4Ov_c@M-?WQ^5bb_v(~WIzhX;j@|FL3E;?ydBbI)efuT0KY^|{W9RyOxdiRqZ8p3D z?Opqz+D$!~xL=L9{pAF-duhzO6ZYA}JzMO-AL>EeGuDhyumbv?@h;920-h&xlV)TO zCho`6&Mz+l{EyD7cDtQH+!Lw2fPN1yyX4^!K-}Z_<`IWLZVniL+`#j`!j6p@fbTB9 zEw#566ZaikZLhBeer`2gVmlPZ9rMZZV zeoDUj0|8D?GY=mN{F*gm!R_tP|13#%<-#!HK6BaxNg43NFZh(B82X#8bUHB<#_M~? zRC55(d+LgHgI53@d=B^;yfY{6Q(_HIM??FP;gNmPfv&@JE)9El7@+5qecr&|VZXP$ zs{#IdWG)$)1M)AL8PwSy=qscbq5~d-pC~4Xz%C4W8|Y=20MK%RL>c(zmQ+<*4t#MN za>}_q@RwK}E4GIAT;IFwmL85E`qvF@9_ZZwUUro|{BC6kdJFAZIuD+s3i{q}wBRAcXYMA8P)`gpItb-A9+d??_4JaBsfF=&zr#%m0{hpcM5e4MiMV%seBk*tki!l~kKLaJdf6f9Q^<9F zfK<+aKkYAi@b3X1+iMNgxeoocdt0Zn4xZbQ-MJA!Cz6_d7MEK!>;DO5@B77Go8#~>f2x}Ja&bGM5a>+KzYSOZvl^YVZGl$TqXRFdVa<9O90ab4|%bi2d3t6wXaIVq{|tzm`<)2WMlZN+7eIt5(yA~mJGwI&P3ap*=u(;28A_xx*(2=F|R&}_Wt5fSb`u6QU+jtKWf2pSXv^~PhnE%g_y z$MMXg7uv-U;oR*NE0%&h&Y^S>65)(@cro3K0NcXDz_)1(KOc%O;4z7g%Z3QY(|SPH zF`Cd%G!c$Ej`c?DlwMUS9BGa9M$rrLuC~FE6feMUbZy0oEO9G~wyyhv}_BW&OIGqyjiE7GCm_i6rE&Ua-+@MswK)M%tvYkLe%X7rle zGt#Jo3iN**>y2l8^I~)zLFoW;CC&vr*SA3~u_Cxv1`&Evx(eW#(SvirekJqq0zV16 zz>gb`H$8GMQ4T!W#eXA4B40+z+7{l(_#e8R2e}11<;4Mhpyyu2*w1JtN26(flmF-U zJn5C8!ckPdKp#g%RRrB>5B)JY8U7vl>2VL}0r(7BjyF`g-b4C0F}ZLYgBKUtGk)0o zKs>DR3R9s~fb>ez)(Z?C=zC2mH*b-2lBX?}_y9$LhCS;Aqni z`hnl=e*wRNjt&&BCV+T#tI&b+1L*E(hxBrip#5;RM|!&a!1i5-;7y=zyO8d#IzW#T z@Sf_CHPmxO{c!L_zT0I3zVK{&6Yb2v45X7ar8n5a0V7c!TE=6niTY-A9sAM8D`Eigncc>}EY3mZ zj#u!S@<*Ep9@6naxm3JaRgi@CO>hMDLvY+fYOe(+kj{b>kTo6Zr@(tdsa+FfM*yF`1MDZ&Cqbq_ zY99pWA4%m>kcE2D+DG z9Q~`{c(zn71SdKme@~*_5}ZW4COA1mdf}?zM0e2JpG0sJ{fQu%wlfGIr3WA6f$}K~ zr$n@Wf&|8|LuiKu2hffSc2pz(w^4m5C4yM?`)0Jqf=I^4jSR01 zjGycI*l&0_%40Yi-#ThHKpxh)B0s{I9Is(lI){EoeuptR53iTnzt(y!?XI&!d0j)> zi6ny6Xmn^o}f{2Myy%cO<@*BnUCOQS>FlG$u zT@2b4L39MR7gdK>PH&|21%5{`xmv$odV#GVd?gzngKL@ogkjv%HqJQgFH~OYhXkQ$ z?^?$Zg7!kNG7j}25dE)UCE5)^a5Ae`ildJp8FVJRpKO7%vLuoJV~G>h ze4hAIYM%v@hD-gJU{Vl!#<)l@R)BboL4P9fW^&|ND2;;zLPn>d#nO0BFqH9YDB5ws zP+HCaU_Ij9T8`0W2$RntJEd`)V2F~`9|*`-)PGm{9_Zw%B#k=-yd;!MXJ#K9cS9=!Evgit%}Xjx^2?*ibu`4RAbOt!|x)cv@4x0D5bE677)< zmB-??_U#$p9U1=4G*0hGD!R81`8@KM{y=9wHE@qP~kap&b+_N#kdMLT*2Pu7%#-p`4G_i;8o=BA?DW;Fy0d!W_C0Y@VFz}=2woTA|FoBIA$;r zoEn4vDTVp(mU!e8y-6P4A7lRXDAVT_cnsrZ!HFSA*A{=77KQz__|@~wPG;jgMR1k* z<7)y2aULwV#>Rgg<4M7dLi9s5m|v-Sfpn_GxLr`e;;D+2h}Wwal%Ll)zZSeHkj}dWZ*e{(c!%?6K`o=l2h0-) zJ}^Ch{|4iZ_l!R8nLO0amCg$U^~@f9Wb*wn2kpv7hS$eL9LGmSm-@x1|8-2yKQKA` z@Cx;yt{>`oJsam|=0CnM`~MZ^>4I<6&YXw1nd!lI7H2l#1@wYOW`BOBVEpov(c`DQ zbY3WEWOl0o=c$6mG;Ftt(eXE~BidVGN2IH;6WSkPCzc12TY&v_qw&-PXx{_#Fg-9{YHhz8n{Rjfh4cJw zsF$sH^g#b5>^TzY(2LEZdr!uEOUwLKK~pNfLPa*O(nLQfRG%sJOF|VYC&}=h<%L@2 zNeXO!-5cZe)^>ZN9=6h}b^eWVAnb+qMks#?^8@nKK12Y-xKh{??V7MB&bNd;86GXq zy;)wOwLdwj-52&`&ppsS3%fVte6>4!?#kxNU56tcT^L?1{r2+0{8O)iQvcsJzo+s8 z2r-a4;TGnDFyPz~b}p*qXEsImN;8paL6K9(p4>MZY|UW#M_qh|m=0DMFJloWB}TyZM6%4RKy7G{AX)(17Ku3|St^h~*`W z**x78=QYBZGG}?Imi&VS%To?OdnL4{e5iwGHco5Cx0bw(<8sV@ zInmZ#tiLb-EcdgaX8v&T40=z{TwkmrQs=h1i$ z^vc~H$2Sb;DMEMFo&fEga45@92{8T<3eax~2VtBm9EA3_HDA>N3Cml#Q9FA6fAS{` z?^ZmSUOQh!ezoA|`V{qQ5XEZ@;KA}X9xP8XtQ_TSIL?2BVwS&?VEilO7+xc~A|G1w zn-pFnLQnJqLXPQeOMcLu*$*Mc!>x1?GrqOv8JS)U+mHNcDL0JeaXlE{JXju0n1S-^ z&g`F<xa6Yqti{qsJSh&m>?b&klm%>2w)4~<#$Am#lE`o7hDqPL_UBm25m@3jejL~t; zC22e$TvLnBEqVJ5%sxkAd@78=d7LnIIOh3ccVRnQFy0q#Q%64Tz4 zMd@=J@TLA0 zoi2?tgsWd7-&SH?K^VmH=YfTo-wa@WH-PawfZ3y#b%kY2ju+uPPdK0DYg^Y3m^}G+ zK>eAC@mp(Neu}R&Zz7zG^M_VB^G=rL1%#uMF`w&&^M^KlYRSVhJ!_F)j^%Ydsh@R) z^2`sk*7L$Vq$e8}hxwy6eV}#@^vsj3*R-_j$?~k8ED!3*;)apT9(z%{-o8yQrm*#i z7QOIQ!FXpD)rTY^oXzsIvs>uG^51?ePVi&v7tn4j`lhjjMoit9~NaK6_{ zPajqEUoHJl$9ccd?-laBbsdMn9F||6Qi61vG86eQiRtY`YHvpU&pHp2n=$J# zukFq3{Ro_Awb75!Ma<;2W!*tc`*Q}!{C*1`TI`(!Y>Mpqjlj;|$OZ^7(etKWZz>j?dr-89E}u&^)l zv#s$5jf=WLJi+{v951qaGbB!=u7oS zP=oQmpynmcr{1!BMGeb~)v$cRd(_L;dDeTDzo>bNdA8RqKlGB}`HIc|U$gwk8((a{ znvJ)H&FgE>p0~b##q$0yS7N@ZlFef)Sf1cn8qU|AvwU_r%k#9nuV8tnN?b<~RI+?# z%Y3ww`T>~dR^s}jpaSiFTYZ*?f5GNoN%!*!=P_o0pZcJjkP-IKO?! z@>V53F`w`N{ixsp+9SaOluy9}md`I{^ZsH+*Zba>?=NC`xk5JXd$=AbxX$1RBq1x4}Z|^3Ep75EO^86t~EIS64bCf##{7f zg0~Fcw=HtSU^UCDzs7Y^!K*(w?kWn`0^KnVZpEvd<(;16egVNVTsIdy#W+y#7~^=s z1D5}~%krHqd5=7Ql%E?cpVFE~VR`DC^2n!K=+6WmnK-?kpa@~{^$J`?1;!hH7ymT$(lBX^#BWt^QMAb$aD#P+7bA3eoIit<4`{1%@W&v z&|k*5>cKKVpNt;o>!RSx+c`=E$ejy(#nveR3cAN&VEzAp+z+mAB=Cym8w&j*qt< zrw8pE%Q+t?0{R_0uG)12$o;YT#d(oHkE5T~4Y@xC=Jcth)?0fOt6EAtE$}w z0pAa21<6Im!E^qs@7hp4$tU#L7Lc=KtNac6b^v4c_ZDJqr3e5Ze7N9shyu)o$Ox?j5`m)M+5_=WyD&o*#kkN3Ne=p$c?J-hMhU z6zp&E?^DiNfXA`XbEi=HoebY^RseqE>;l8I7odOXO^Syqz^-Oay^_8j?044lUiLe| zK4l$=)pLY#WgSvqO6~mxjalDKpj=LSzsP5R$Hlmcd9=M;ox!umLO;2>Uu(+V12pd9 z=SuUnxtncLDZE_mRs#KBb*mnf1AMr=Qnkx5pu=TSeB&hW;fi+BjMvc4)r7e|N?_;m zekJ@7!uy+!yL01VoHy60FAV`b&JXBjFb(?8-xvC9H1Ow^s#f`CXs^Jo>Ec@OE4S;3 zOdX8t?%BziW1(K*$}P3VFuwaDQ_T_>M{(d_|8N-JgJE^b8of}$^i$o0I&D9UMrPg9JSAm-FJij>K9DT>HzqB+AbSY3-!LsM)u(W zzZ;BJEsO{H{%kKBvl;A56Wt#UbZFN3TKxs$GZ_o(ab^$?%bq?~Yz_0?&ccXO!y&%z zHZOW@EZx7d3^8Cp}sBXI7Oa$`>P0xlU2{2#R z(R_De3B-3g+WY(dfVfT1IN-oan4jst4t;tQ;yJ?{(yjsGMUyTOshTj4Gwac8Tn+v9 z*YJzdt%JDncEhOt5Les#8K%vExYfxnw5$`f$3HrEiUP#7u8%Uix6=&)y7DGZ1!fqClS-WBtW;F*jZ_IVM+skW;E;{L#RY?^!xEMUH2eR=Mb zF?1hE%)zY&5WicE4vW!;c-gXfY0XxMdo425m!5$**Rp2!m08fQb&&C_{y-<|@@hBL z2>?&32Taj!dmb3}WY08+lWmWCTNMC)4sL=HO_)bG7TR99N%KkmzWVooZqCgh9}t(? zZ++ge6ZB(C?b&L8LwAh62ywr&b>W03G_TYlsPlW^1F!kK!~DH4{;r=wePDjVJDamJ z6~^K6*4MB*#QiQx9UDKVwAFKx*k0=h^HE39g8Vw*kHfG91(#r+W$$Hs-3;PpyE#4! z^5EI_x&H5?@ZQ#|IPU<=iwBl_@DIbh#3m>EB}ex^)m_Pmh51f@&zxOW@N60QXh2us zi>0Ua_M{IsQZIsp1n|Fr51(9=#o)=rNP@WHyl zv*`Yw46X7^cy{4Dc=aF;PGiCwitC}?npfeLZB?_TK)jqxnUcM>-p9 zdDjT|yYMG)XJDSeUm+W#4EVbaS~rx+t7~D+_Z3jiwdD80^T0<}-K1IRFc0B>a@l6dc zwLX5pZx1!=amxY!VUpS@yXd^L&TFM5o$r%oqi1v;|0(fwDagY})5%#{pf{t$BYM$! zrq>b>uaxl_WR-|5{S^?wNRHskh| z+NUr-oS7sW(;fId%c{fBeK4+>cfP*s4da|iX8i~Nd7C+6%m(%aiK>n7m z8=-I&=IP55ZhxK#<5(fzVMsaP5p+RN+yHtQ+;xfa9pLZEoC%(CK#w(Rh)hovA`E+% z_s}Mi2-ng5*uakP~%_fDQ7aOC-yj~9U-c&R4`WF~qHX=D<}8kHhokmm~8vfZowU#duke-{_O4oGyX9 z$8;&2G*Jhjdq5oJcg#cC*askATgC^;`G8(;4-G9_tw4nP2BwW$2Xr{l^m=nL*u8@~ z#xutOe(~P^$I76cM6ukdU(jyykW~xmKJjBgy&P1*?i|0FG;;&c^TgCk!&ZYloLKEM zKNiMuV)(ZBv(Vl#F8k$J;7juO&?oLdzav}3$%lY0iJCWbJfYpgCr0$%0djx%Ud4he z(67Wr3knK-p%V;m7XZ2ELvBHAR zzq9nb2RH#exdKHF9YMQxSsHks(6Sv5Jc20_f=rZN+b0e4@FsZwxqIM<5GeoU-J=2gDMZ*HUN?l=kDsD- zLsj7SrVjxJe4+hcA51k=zz+TP^VQ!9{_uCeh+c&-?q7PE=E^|N9~Mb7_kbRM-xj@Q zCFs=;`kfd&H|#E53h{&Rr_8w?JAsbBJ4J`>dPLl1dM(K|0@$v7!XJxG#9elb@r+I1 ziF_#Ywtny>?uw5(3_Up$;CHLUTTot6<-~fM zJgB$Cic-7>r*lTz>7;Y~rrH>6BBurvNYHZw!O+YY!#u zHUfTHqrTWwLU~OSUwxMoZS~X>m%goh1JCM)XZrzuno&&`8i3w9ogm(nC+>Rs0db~w z#9jCOeC2G~?(rx4hROmIpASr?{Y~E%{{zOOGj6c|_!-3AaMDptMStRMOy@t)jw#v) zcQfPsjfGIoEF)s>nmFR#SFKLPSU}v(7f(LF5Z+t*?Y?vx@Ud(@op`SsakpCdWR%}{ z;%?K^FY*u2W8nO2{%cf-yF)mC*kZuL@#zxV6)+yhtCxm(!L!qz+n?_MzPumjG!<%0CGFLZGjF0@~R$x0(rB3 zb0z&M$hD2>?JuDqht?%}?(Kly1FCyD^wfrS?oZ&dLB9Go?C<*;e(xXP*zYFPx4dk1 z1m>gemKv(venLMM1xGczg5Frll)kAcou5CPyxDH`r2M80(x4kul1>i z_x-*brrii=YiEFQc~&*h!+J(9dlR6WwVHYOY#7&o;X2y}Lp`hUD2M&GpOcROdF{U^ zf5Q!E$BM=~z(*^c=rwUL9?S9*5wgI4i_D6-4ZyE{^jrs!PqWNf-;aX4nTS^#FM;-r zj*RHF2>Lg?I_n43N5eyrYM~17`}o2M+hH8W7dkfN!MIE%FZI>}-OUb+=zR;`_Z>WV zb}s0rnML%PIY3vFh~DpNVSGlH&M*Js4ei)Im-T_)^=(wU_5uCUGkUVGGw6xVyQ)$f z;E&d-1qGk30W@~1bc1r5Uj+~Cp*_v5z3l9OpBhHZCgxCH{WLeJ(h1;W^=0!x9yJWb z$w#3dmAC#UyMkOO$ySvvhw=9OzU6}njI&#lWnFzL=>H&}xxb-a=N@C;Oo8{EjE)uE zZzk>?@*i2P0shL&aoM#kuI>A)-!7MidxO3HZC_@75#p@hrZ5iy|Jt;sK7Tvd_omtd zkI8>BOUNxFSNwTSHTawpm7=a*Jrt^U7f*CmF34XC@Iots3lK4DFXS zU-GzmwXOcEiQf+dg5P}ov~Uv0qwq~b(?tvT{q6blfjz*^zu)Mq-w5?S3@e<}3F6|q z7bn86L-~(Ubt>%v|Ia&vI(G*@_;nD_4gB2qc6BPZpx+;j3MOt4Pc=-7NbLsi8w%yu zoP+qNAvHX9#h~w-@%yy?}1tE*#Zb34Z+Z{Y%5U zQ21(c)-7oN>(fQ6rvY8QUbY@*P0RJn-ynv#pn=A1&~C%injcTV&;RV8+Wi3dwWiL` zJ4AzjZ|XPKCko(?eK7w9KmB9-r;s#=KO3WGy7dD*exKRlbtjbw|IE0dMb|t2s9JtZ z0l)iaviRt6plfsN?Jv$CCo(n@BqKnsWOCLG=>~EjV|-NW7L2dC{B&YN6F`-U`BTB~ z{&87Q&;{bZ-(lwK3WtH;tf`%P65^I$XU{DP2LJeL!IM1`fIh#xu4Kf+_?tEFCQHE2 zHk*Y$(+B=FTjcCIbNqjv+511wk>7s`PPv#socQNO>FckHTjkEZ-E>opaIo_os_K+| z0N*ZJ4I@3lE_NLl-n0Vje0Rad>4zQwj2XA*C+L5-^Gj?>ByHu|8(5D$vlGVk)o-&H z@ub_<(-~6WMq5vKKxUCb+i)$UHyG;8}AzolVWU}-`o}gbcab0|eK|I{7K6uU` zm{++O;ygw0OFgEJylF%I z`me#WpMd|6e;FNS1%5(47{BlA5qVVe^Cf_tvR~%+ZG+wYIt+1!e!9;o;Qa!+bpI4< z_Ymwu&&IFsI#d7M`F^kIKo^x$;$xG6|2jQ-Ip_j@I*zK{cwmoohMf=m4dr!QpUXa8 z5B_nk^;oyM|M8bQBU0Ld{m>C4{MrNdSjWrqqvquQdDavklYxGxPaJ*fY}sL}oYOW%g}yrYyt{=JY&+<6xIhpAR$!x>#J# zuF|Id<3;h!-!N{A3;rki0v-C_D4g&T{EtoItZ(Px+1Avut{Uv8?Rv8!8;FYr&heRd z2BN7dlj z=YGX}Bk-qFkJc&ghjICeZhsjKerVd*?8+L5+ol&K%~S(<^-BrrJOc3X?~ENM z80fgPcaU5W^uIK1%U_9ZOO&2=DIM%)Mi=y9?hh5m6I}GR( zw!m-GduVUXk*X(}AV;fzeh$D?aZ(lZzhnR8%qF12c6-J6C}?lnw=UD}0bREr zUSeGZ^0#wDJ@+!1xc7j!h=@#66{{*(49>d!}P# zA9}7qnvAK2Ht6ly>PJ>5p}q7&>H#jm_l(gVu8Lr{&fhA&=?n4wMdt;#g%A(sswd5i zg?_H3EGXd7a}W+r;39yJ_cf|XIM|(s*1iT*z8;Cq*Ta0wy;QxIeFqqK>9WwL+F*xD zpUnEc3i$tIaQ=qAApbAdFR}Iox>bc;NuL1xulh4Ni^iR=Hac2<13X^4-Tq3y|9@j1 zB$o^Gj+)$xxi8F#``deklXe6BK1?dkvw%4AC$*!XAAbzBUhLXQL^5GsL5;FR)B(>a z5UE|u-{iTKh%^#?4T@$Ekq%u45d05RdUyOtMjO;^Zn~(XLPVyW#7F&7h{)_z!tbqh z0Lz9OMR^mEg5)Me@`sAu(gzuA>XL^Pn(_UevuBC_suaO*ZZ zBC^5t8IeP$piT?>5|QI9UjxIvMC9Ci*0)p-BI0fA_%m}55xFXEc^}qHL~ak7jb4Wl z(cl#cztaJ~A)lhdURx5;P^Zb6`~-kI3MY&Oyo5q=vI+Dfo@5@L)Rl-l4>sk{bALQf z4eD?V-j7bg^K8bBg?J9=GGWm3_WscT?{sW5j3J^){SR(~dAewd;gh|(pNVLyZ`I>X z$BD?-QnkyoVt~s)|B{Gk+PK1r#n9gLpOdqv1N~;stsdM3@SlB9wVQ-bM02_X>~8}4 z&KZ5I&=%_Z>*Q~I3v}@>yW}x}K35dy<-&O8%-Ef~`zaC4I|y;}B_dkjIOg>Nz<2TI z(}%BR6H%ay-{uAHh$yJNdH8wwJ@|~E0dY0(FYLsnVLyOR8|22kc1|OrjThgYa0fna?g(~X zpNL|jCvc|gi758M4V_>Z?-o2SO|Ie8(tc~yi8QIZim-HcrM;_X}EqpKzdF9@T=&qUzFEkfCrj##(=yPj_oiM z;(O7ZxJez-LB0!CLc9U^-Ind*oA#239$v_MFc;*etZu%_aNx%am1g7RYl*0OVM&lN z)O-6Oym21jQ|Dxrs0HnRY(K5^J&gBbqFZ_*(DUo;x4p=)=)idzjaXYAY_wocamSPkN4^ z=>1A@@(1ASyODyDpqqfdVx2O@qdI-oca`w~waPpp{u8~~_GHghz~{xgWB29Z{flmf zX@Ou5DxZaxsR6$#cPSpJQ;weVcKf37jQ!BhojvXwMnJj3t~%THfL<1s1atT+W!@ zwHtv>SNslcy#)Gu)$VdT_c)N}cljF)Kpt;+)=r%XdYE^n>4F~UMgGW0wX;Bng6aa7 zFwn2N@(rV?eZIGJ@SFia_j}i5$__v~cT4!gO@My++j4ds06Ti~=IO%$Acr?+jJ&x3 z>fiM7i<(4#|778`9>#O))G0@LuGPK7@W$s*?|zrCEk;nTc*o^-OTa!oSh6kQr0W0B zzq#ts>jKb^^S%a;L2e2Ul?0^%zV}vu{R8>A+bQ(vDxmM3UJaw>(DMf4e#)5wp0^^l z9ULJKc=ay{o<5R@t|#y6>JRj|M)RnE-!%vQKdV76uU$1feHG|^<9hGfP~b~`z!w`I z81Joq`oHXfUbpOjFP;c`dGpLEr=Ng#-qVBI==p~?H0LXK0{&fHH38z zYqQtNalrS?0ps?bhu_a{R=cbPcxNh@GOy~nR|0=BlV9qe27NiN;1#q0+Bui{ z(jWxJd3GYiD?pEPzw;itfV^c?I$9`!JYBddA65u*ck!LF_im7*D~p0UU4(I5?^k?1 z2g>DHRJ+~I1w1!pztkK9skjwm6<`HSYhk~ead#L=}+kGPZIq~x)_AZ?Td_6yV<8&Rc1LrB z3bdbcTW2fGTSci;Ja~Rk?)2a>2fKhDNz?AwFcj#Ob`Iiop!=C2^OdfEKAsVw+_cau zBlzI9v3bzXpQyV}z|Lew74Ys;df&=zHecMvm+Yqc+ZOgh`HMb^hq_R{XAJCq9Q5@3-o!IO;LkH=8P9mT9OyW&^z~(+!`bE1^TtGJ zbUzE&fisuJ?b!!(IDKKLjvVkWb>@|f<1qddzwn= zjn|*{SOvxrKU96$43L{cO^a4Lz&H*`vMfSDzYcPE?qOV?W|J<^P8{dm{|m%52fGGe zk^%WSXqHz3^9NCay=(JM7*E0q57!_lpZI5qO*Zf&sXQ$9F_b%c#C-iy=>Pcdr8PBR z=Ti1QZ%^aD)XsG(sX&+1voPNS`*?a;>8sh`2hJFMv1teP{akLts2`tI|~U-k$3 zjqPPWp3-spHUG{q?u@gc&-U&EzB%Y@4}|`*9vPlV19{56=)S3(>UEdki!cuqWj}m0 zAQHxT;r8V0tKg4v4Cea$0{O~G?|!!g_`|Oinqc0^V0_POLu% z{JSczY5E5Gy?V>BUr~FoJ5vvCn+^24)^vVF1kmfotau@T`gz@78Z<-sy!+gw4Cp^! z&gzIM$X|Z(v`0Z8kGFK)H`reQ=sWVpH;6B9?H$;oH}LD$O~rUwz^h;@_)*|{!LP6H z_5xk+j5I3_2D;rHYN|0F@GtZU&RGU}P*|M5;RVp?es4X|4(RWGjC;fr`dszJb`{XE zxXi*u0r>Y|y7z!PpeGMam%g=w=hA1Eb=N^op6vX+ke)mESOU9kdw*5G=rsODvH-fZC8+aXqoJApp$tY&?C3b1xb zL`oRgv)WfpIlKuFcer=!^8xU#(=FgryHVG0II^{FtC}5A4?WuaSKg zLOVZlFL_)AxoWVTuhfH{_p9iZPW^P_jp{+Yz)$_$mUuQB>|axO0gs;F`|HrQL#sf~ ze|Mer?N&E{X|E$cfqwj1Idf2V=(kyLCF3E;Q}Zpuw0q#Enwz~=MkUeb-;3yZ!OcA^ z>w1BlH4pqLcP)T;$dt=GmGmVZvRk`M=bQjmjp%jLmw2>~*z(>dg?Mx@9N06J!W+Hc z4@w{&9cPccQTCL0$ZhMU+OCv%bgm7~*|mvybcyMvdTKB6=xTK(!|4({7rE@rfpVSC z|6XV}9_k$oi`g3l?Y#2aT-phq)AWB&kcW02<&_Nj4)tcJE0MC1Cr@nYcJdB@(#dHRGo5adIONM$TYxegIu!G<0^?%(0x|?X7>&2tL z-|XV2Q~-EvsZ$})Zr@Hfv@@Vw-<{`rjjIV)Z1|I#Au+V{a?J!mmS`15J|?SIB%EMKm$ zai@@oBODK9_nY>A5q4cT~7uKKKyhK98~%R-7irnzTJ=N0rs@N!x{TUA(iF_46dgooeN;#zVgy z0Vc>0;|@EsmUM#lWoSF0#Hfju*8@oVIYf+p(Pt}w43Bp7_gG@wmEqf))mNhMQ0w@_ z8}UOB@kZRBE#8O+^@um(2dLsrc;Jb66Mm2*-bgn@rxWo8{P08^K{t{wC*t+Hqz3|s z!|4ZTPXOXZa`8I+a810HZeTVe;xPPxOdLi(fY=BSH@=J4;>K$6+8pTyb@5vIA;NR0 zj~~E^!<(fa*oY(WfFE5l7Mu;KKmoht%Roy7Brx;5$XSp_+~FZ$*^R`v0FI z{*!vyb~rK>a!gC3)o4|4RY2CPo>0({-(Z@fj!}Mwh5ycoL)A z$Y7&lDtKC7uifFlo#OOK-iqRFf>FOmu#3+}R19*`NAZcs=3<|nY zDubtJdFbaTtq<>yv-+t_Ff(X5U1D^BLcl8r1bp32EYJ`~pWDg^fFOdJt*J)9w925 zWb+-r0^B)PYpXH9^sD(cYh?hBQ;Xk?4J9fs2jvq#AENU0vDW6N6+~5@mJ21S>a-nz zS{94n^w1@$ea32Sj3Go-=4!r6p9-RKLN9OQ>=MVj(*y=4eH@1M&ei|h_U$T3&ZCh1VHh>6#(Tk{Z}3x z2rh7MKUw!wqrU`TN%WCXAHHq+mjW=5DBnYdE8jo{DCYoU%Vdah7BWov0y0WDn=;ym zD5sxVTnQSkoJz|dBFa0$^7*a+rGleJl-I!TL!e$LE5DY$hw__HP?Wb(!GPZnu-}tG zz`~&4vnXiF*;LTr`3n2}9u+ib{|OZo!1Fn+2fx3d?Lhr9TCSpX9OCVGR;PG7{nij% z#`ZYrH(uf$_^qpW2Y!1d-htn)ig)5SiQ=8~TR(7lyYY+?@owshK+yK$8DZl6c$S6u z0DjvjK7ePkiR17aN^u;X6(x?tGdjd^c!rYr0DfyHK7ikxiT5+Omwww74A4^g?Ynpn zgS+S%0PS1G@ecy0{@)6mnp~2MwZg{^QG|e{daz{^iZ{-mBHVfYOKuuKov}^T<@+(B?Vf6Hg z!$OJDgHl+w_3D5X&g0qtI-c*hf^+YFC~Xi=1|pv6+kL<^*J z2?eM1{ZHzW0RIjsK+4_Gl_{%YKgv4H@)@BEQ`Tn|QHxnR4Q9C*-NZ-eSB4-Ui36h= zyuk7t?&uzGEJwtL9t{gq&j!I6CO>9w9ca2Z?^y0yusm_?+EadRqhA>}5%E@e>yCU7 zysaLJLwO58^L68|$$$mfQGCN>0mLeMy6f~B0v2Q6TZgkj5F^DsdHw0hD3FJqL$C+XLgu0(taPvH`$jFg^= zC{D$%;KgT*rC*7Q&*CYX;&eRSRGf~dB#2X)>pY34y@^lI(-0sSKh9j`aXeL2e2iJl zqm$7BC*#+g;v_s3n$hha6w35JR;UYdJwwtVMtI?OwD8BOzZ7ckn-x_JtIqsOg~}vK zPpKsWg{Wi#_ljCL5Xc%TxFE1!P_UGmsjF;9l)Iu}D{E8B27=X(LJ&MB+77tNq0|z> z@7`$nl&8|?sYIEFv6iwKbDc^UJGDX`<{Ehn+A>8SKm{CJwJGbTrMw#8@de6tMS)lP z!4#>QLcq6@DP$>z3QBkB_+UJFs6a|rF$Pq+#uWGlDopG9%h-=nA}XHJ0gBK6JfHnP z^;#76I^x+{zoq>Gq?gh?rr<68++%p;QMd*S04tZy=pKijMrl7Qx1YV=i6Mm2Cib4i z#7Y6^p_CRggR-0%ob?Q!gUE+g{I)ZERx>)SpzQ!2b1t5dn|rNCxVj9_u2$i^l?p@8U5#;yZZUg!pz2hN8FW zdzjPQp~uHSzjxkAk8u#+V}`kU(A4htfFh1VH~rN>>20eQe<8O7DRq{lCd-{P?!;9GdDr<(6r{+%p_=I`(rF7Z3+Q1-Redryx6NG0NWJQhP-kH->->+yIuaXlWJ zD6UhG9={{5rAdcIXa|o|5x>J@MVMUwgF~A5AJ6etKa730;wT_^-G1Tr9+xblz%e^@c|WH`80DlF`(EJ!Qd}tkSMJ8j zb!QH+Ga6)N83v8fkSklUxnoNNr_RQy*An5faklj5#v(Zhn*)zyjLGKHa>Off=SoJV#LclPahlKss()B5uNS zVa30aFrxfzC_Vp9{2R}Q6aQin=Px`5Puw&^dLEtlCp8Q_XkSx$uBrGdo--=`i04>~ z>+sx5@drE?Tr54W=VuGO|3QKK|F;UPVzg;g`XfNF*-C5c&2xV#@Ig_+tIjq>|5Aac z6O}}kb!&n9S=Nq46e@FZN~E%iW!Yj-Kvh2BL=k z4hrxbBLn3JOabq+B#d-Q28y1@6fBxWt}O;&F;m=7rm%OIq871;_9jazU1j~}u_;+0 zGgOaT6pblpHRb}8>*;ta+Z62=_M_5;jk^aMH;0O>GMeI}OH{^VB%|Vk<5Zc&>dj;I zTC$*vSpA@uEGR2?h`nd@mvlxCE|H}k=Qoka-~m$NroI?SG}4FyJWPW=D(W|D>A`v8 zuS|iy;{l=K?|1;C_zNBoCH|sD~b6A%0r|HOlbS{1L6D*g@l9S;x^ zH>F~P)1q+ARACDN&yi9^m&o8j%aV3@5SK)@TzYVgqyyq3>4=_O(uvkT1@Nl$pk7HQ zJg`dAiM{VgBcAW@JW+Z;oum^rICF?Z4lgc|$f3t?rB~;X(uheShlWZbhX$Pq(g;h^1#>ZyE_g7Ur0XDQgd*vxDm_4xwfheWZ~Y%nA;0fYj|`m;0}j6X zwW`Bk3cqG%?Xgvp#s5;_mlEYJEc@A=DMBx%NUF^9Xfwq#Wgc$;^HerWQLLFl4qysp zMHP^=)zf6{DYEw3V>zW?Y%11-NjRl%RPif`QZ1V*yXwB86 zqTx_FO@D_eMJD2*bc;<(^okk~cz(&IY%Sw@h6=BAAE)L@#k4$3vC5GTN>ywM`JTbw zj884}Yi9J8WrmIMQPSn4^rj$57d$y!(iKlClyt?L7$jX=1f2?W7AOYZz#!>_Css>3 z;z?4H4m45_5lMSG<*EV&#*?QcGE_mvfuiHd$>L^eV0Hk+^)-o1lr-d($dpJ8ghYmB zrC&gOi~uCEc%rtXJ)USQX^$t+N;=>PUXqU0(yY0p6Fp(j4F6(=%1Ao)2Sd^fkcRSLa60~! zF7veYhY^aT6P^SqkyDYLj3w!eC;dsfsz^_4lyt>)J4rWYD7xW#pQH!PdASiuPn;@B zdSX&oB9B>ki9Fu)CF#B&4OurlIZe`Sv2;o(=}J#P9(Y0H(&#?V{Io8?3XGevY_if_-}_h$-Z$dbFNOd)%t0a0u~d=$&DoMHhQKE*5O z!4)qdUW(Vz@F+GgJmr{SX=%@hg1l|-=-$Eo-h%PYP_1y+29k&t33j$g3~ z4Upmsj4%`*F+A>L`-(R)f>OMV$!SFv!6?=+{5~*x$})r1lKWxwmzd%*lEk<#Duy8* zbtf^z1#^jklXOlm(Zj1!B)ZH~YEw`AgGjWfAV(631|Ib%>4Q5lBx-o&mqe{UmQ%xA zfkX{=U`W(crOQqdO`1Dc0PQW6uD?oje5DbKM3X8M7$nU{sAxL+(sfsf9)%A9FFYEr z6<;G z(w`cVJw!49k0_N`u4n`u~H15BQH2e8J5zF#~!KiOUgH-@W3$6nvwf!N`MsdjCrWA4HTiSki9~Q;62& z9#g>k%(LELiXFp}gQ3imwa4ib@5+eu2YBV&h3dhDT8B~WJiO@4TwSeBZ z8X<9H9?TxkVwc!5!Lz|t8i`F9hQI^q27zNlVpkwdT1xCO1aB2ECk_?Q8PD98xKPj9 z1t6Z?-r66Jc}5GswRpN<<)k-|^@&k$I z4Cx#a_#@qeCy~(5>Ht8@dP~H|ajrWIFJX}kqaof*BJse(*CoS@F|-}_LYj@04981v zB*TL+L>&GILpBLs5-O1}JS4amQ6j-hStSxW2Ye5B;D(J>{6^s3Kgmd3mzRvh4H}YB zc&UkGG+qWH8I4IKi5FhBAo0S>%_O7naCyl{Jk(h-5)V(7j9{Vci1E@@3r3%RP!Oa4 zRzXyph8ld|QVW`DHfZ^?@V^w~*v|Bax`k2yQb8m{+BLoJcYT{6WFKXoW{ORdJD0{ z0hfU!(%a*NZSA=HLC@oc>+zDIm=%=>S}ZxU+(NvaQX;I!c13vVu|$OH`;y^!>wrYe zJOzihDM~zP=yV1k6ZDaMoZF1HlFubJvB~H$#^Pzst?wnnaSl10 zhISv?@EnY%lS_DbyCI|3KPZsNf9zovjlbw!^O{JO99sC~ZP&jPXxW}^%{8lL{p&fB z;&A2>B&Z0Aa~TX~mVN_7Qe;#%gJRKWzQyKo=n1yZi z7^89dM{yLZFJ}0=GrWgjvP6-`Jfsclzb^~T^x3#{*|^w78bw`9rYN$FG_CI~|BnZr z!aUtr)()e;WI3k&B>{MCkz_fY^MHq0&XNhsyJB)9fO?+I0CAmC62Jt18D6U=S&G-% zNS3m!=R!QTUa}wz=Q<0F(IYOv_$%OMIUQQ;Jh zGI$6>RfXM{eN@&6v_df}_XrJ;LK%jZ3QurusPGsSUg0GwutFV%m@RaZti^Rl$r_eDTunX1G9n3~ zp*CKZ0aERT%Jm>v4mCBmy^ZNFvyB#fGIA za&EwTBP1Je1B+xM-eV`(#PHvQ8z>~3a085FBZ~+&uqnEb8^gbrZdX}sS$NQ8d z>zKhny8S=D6HYPujl~q5PDB!Oe{X~)|1X7#_50|sEbZTV%vnS+hGogNGtaW0&5;hG zA}JnZS+fJogX}@UR!n3b>Lj!L=a`4fVb7Ut?sS%Uv=lbC%Vz!LvHEO1u{AmHg?X?~ ztiKm*u5^xhw8IRaZ5XO5Zesm}VkoM(fYod9{9@+WTjpYem}hfi<8WnjJ3Hp_*)oix zCG(K|nFq9FBbG1d#+-12x6YIWp2BKjc*m3BSx~{ z8DAt@@uC#T7TlR7*}@cL>m}*;UXpEi0jy*@RXhtK*}(*SM~ZZ3ltj9T9zxrlc#)Z8 zCtmC**@YJZNp?Mx?mUw0W*&DpRg7%_$4D3WCA)A-Xlp%oakpeMRcvJ zL9&5)`b`Ya7~D}LiNyL}~+S$QEa5f&vBg$~_Y$Ys9 z_+Xv%<{-%fmYpl19_=DP+z}*sD2JY~_4iav%a>H+Lj6PBP#}4jA-&m5@(8y^N=lt@ zUF`SJ3e7^&nI}(o8)N{hO}itSWmj8?+LtTS<5HgalP)b4km3%Y0~F# z%Xt1l05$$&0sPWG=Rt8Sk-YyMuOKtzF9F=M+QqwPm#Tj$fG*$>*g96ro@^GXDV<~K z>y|Wk1WQ9lv-Pkj^bksGSXz1_3Z{}B3ak>_d7^lnW!++!K(<)smN{ZL6U-J*7tiV) zWeSka>PbU9pSEmfiw6<0c6^y)EMs%H09OAnEkCt&oRZIYwV0%qP2%6-mAaC*snRV| zlDBN<#ap~GPx7861#0n%FUbeCp7WN5N-&qIW+B?^XSmK(#nxM1g3key6!v>&pBku;Eh@s$Pk9{Y!y$CrU%vI?M>RPBVt> zsF=XMikZcBOax=dptOMr>OQuhx|=ODwrm0qX9B#IZR!tU>o`kTKU3LyiI}z5mnncg z6Lb}}L!>9$+}?}rnCQcHjI=DUTCg1&1K7f=Bg2<1_$vNk0{w}FX7wy-QO`ogPt4+e zWP;wn6s`+XU`7|N9lB;t1}DW_J1^;%y_{?(>G}yLi<4NcJ?>@XWZ4|088>H3{%k@Q z%OZQAlnsBeC+YR`VRWM3|`uU}LRF|<(C$B;nP z5CvV;3@x)N+cd0dg)zEnUslcx1zA;#eaU=}?aj2p@+!vIj*2!4u8Jxvr^xnT%Cqt; zt*$bf{toZwB3>%v*%#LWHm;U-6j)kZjiswi8FXTMK`QFI;B@@3 zRwaeiJI~VUm)V!!w=lG6p*Lqt7ape&&WJA+T+R?b|Kbesaz4)BjdcBoGx#I*1e^hW zO~C16c8$}+od%p9epSHf;x2!X6RC&cw5ex#OE@k3ih|RMk$Nsp3n$T>CSE?vX{?i8 zQpu@fjLoSnmB#Lz8m7xRHM}gC>w_T@r;eM2ISm>*g+n|2rHaaFV)l;Hz}Ua_xurjC zzVz}%P8+vuaXNSzDW}Wu*TXGSoSr~BC*bsOj>74)_xhARl>l*0!Wq%@IpAlEml1PD ziPB^OXM|Zy&Um_XPbO!Kmjg3;|G%)A`QqZ4{Kj^KGY?ubGWy3~3Ow&#WbDqm=6|Wc zPDG`Wt>e68n{nSWLHofr-!@Q%Xh&2&vh|sIwvO|a3GO?#Irlc({LHdiDyQ(XHkA|T zc~lOwdIwm!J(vzxiNp|3WhoQ<*-T*;GQkgL_2Zc0oneZ^_AaWNXGa!X#D!m#TNsk5 zJZGDU+4wliAoM(zs?yI~I7<%{U`yOI%=N?1Y&df~6ou=Ho`mZgg@R&+x3_a#2@I%~u`8T>m7r6sn#qB;d2qp(WH9%#Ju1%ib?$Aw(p`#HuGSBv8#`MEZ{6oId8~TV1&!b#aOSqooT^oFSgN!h6wb^cocRy*f-^PoOVI&3f9RoK7aF9BYA@ztxHC+_}B0oEjH&oSoe z(*s>rA3Kcs`iOAS*2fDMj{0zDq52F*i_=Ghg4aiY0Q$~8`*hH9{t zH}z(;80r`B!zlIBsL|>tkWuQ#k#XutXd%=OA>-6{()RS)V9W2vFm_QtgR^_}EM%bi zS=`;Iei36S^&)gt>Q$`VGmM?o8*#FvF&ifv8tbrJ3;x`sJZXA|n{Wqb%j59oaLyYy zX>ne-Z=M^4r{8d1%rcD5m9C_5-c*ypf_USHLYz09l@BG{7~D+8jlmnWxv}aPV~kCd z-t^ttPfNd(F#W_$wv;Y3aFcK$fSdSC`b8i&5%=V9Q*d(`H$?$0AL9QH0`?!D)1@)@ zXXOYzXcd>vg` zE8KyuK_i@&(<2(usQDVZF;>wyfS>Ye>}3KRg~vE)te`G#4bhmu>KkAXtf54M_IRS9 zf&!&sfN3BNd$dHY&zh`#O`LsdnBgbFE#u(kO_Z(-adXaNtTLAg);u~(Y6h4nT~TR$ zKbyj7gqww%pSYRKLe0c4!MGVTxGp7}Utejug`4(Nn(ySM*-1Z);ih38l=H(~gst^w zZIz~DxY;z%2rgwdolS}WvY_05y>yQRH-|1M1HN-{7bG{2<|!Ln#_y+DGZ{Iz*cV<=P9;(rNplz-eosE7k6TF_6}Gtf%!2EsEAF z%!6sMPx!R9(q~tqwHiN7)LM=%SSyqU^X-V%PP9x~m(T@jok4-tI)N)LS}7>Vt?y5< zeiQMFC#`)LTeZS7xZSlCFR8#b6YY-ly({347FC<=5zrQ~@kkTxpa8>BptT8}5~Mwh zDaHhJ`Px&NV$8)*L3=I=y!IHh?ApPY#?X$U<8~w3yXZKk0K`*dwD+>|>@WxI7^ax} zC|0Ra4EM9KirZH5j@pb_+t@fF;{K^W3onufGgN&@@@6aI*Vf z8VqBidjJn()(yZzm38Of*|WOS@hn>1sd)IZ?j$^8R(C8OrmX9Qha~Hc!82)feekSX z-8py&vu+^$y@=>Wv){MTdLN1IemuKYHy+Q>)lFc}N%XAU*j9YF9k@G<+m5@>xb2J~ zEx+$%a1RsQy|@y@?Zc1Xx&63VhTD&uYq$e=ToSh*SDLszNvu9@KH+w&O4t6mU2Fwt zCw{=d?ZA)kS-<}v0RQpPq`GkX3qNk2Zr|gj~V)~gTllr2x|A;zmPa>&tDAPb>*s7 z=z6bzotM-7ff}f%hR2la8BbDFZ;`PBYEh!8A02Y5pdv!SEbO+oPI{ z?dWb}^>^dx)4B(kC5UG*iD~o+_Wm^e9Rw$x2}lmJ2-onKcHIKnK3I_ZOi=DJ%WxM@ z)z+1sz76e`F~NC-$GYpjr-FF8b-dicUDB`ex&0k5#@mCNDq00VdPZ$rn*i*@uiUwP zc+eMjfW@u{SpqkKEx{eejoI8`{HT>XOcTH0ViQ>X_?yyi3%Pha0F8^s4dYybj( zm%uE_Av{2fi(`|o16|Rzwg~Vcwzi(YV4?u=PQ-J5xJ3NskxTd^-6zY&`~Q4iPUpAg z`Q3J!giE_Vz%xbimjE9g&=B%RbH~3F;2}iUhPfmw#&An&X+S{wF@aR10=tmtc0&Qt zX~aoPtL1u)F`v!_HmPcvWL>}|Bc0#4vY=CjF{O?pe$%I8gfW^l+G@U@pRH~Hm^fJsd{>a=*m+3Wr(gJ6;MzV8>V2cRB=FH$Fld6m_mq|!U>q- zxY1{~RyuGe9!d9)awqWXa_;zaoctWeV)L+z0YW2^?srt>C2%d)mKAHu5X4GRiBS8Ti=z|s|1J_S?Cj5e<9Hq(sFu4e>_^$ zR_KlvUEdBZzTSBhWW5FWyWS|gctg(!J&9gB+CB*USLP}1GX=QGem}!3`Dqv@D5!2K z-mjp0ig}9T%p)b?cy$xm^I@hihp<20J$P?|?lz`avCJTBVX^1`^;CPIUN#tx1QwD! zV4kWR>7?g^zw1p!JoV-j z?>M918H|Sxi0C z7Q)@H#aQ`19=E_1u@$JouhMTJxx(qvFEqH@c>F$h2hUXI?iNdrY~=2;Nmv1XrO(}> z<-jxD!V~Mbd^|yq%f|zyTH#IH*2vwI#TBvZcq%)0$r~qG7un{I3vAO!HqF930Ykwi zrLBge1+o>gEVe?H%~r^=$4l?G;Ii4Kj+S<^gQVLSxh!VjvY02%WSc^=SavGQU;1q+ zm+gw7;RXB@s})|ti&?nKcxnK5B^6`;o6KOfjPn+rUeD#@JsDg+9^lnVj{-b5hr3NT z<=g_g;<-HBJv)wnca%Aa@_PgL1`mQY{8~ zz!Utq2l&x9SAr)XGCBDNgDLoL4W@p-XZ3^ifRXnTedeV+{mWo33EaQ%r)r;nou}7# zVTQ|<87dEE=!WCuRNoU7MSlbuO#RUqDd>-3a1=9`gE6$#cR)j;Z-R=h-xDu((U)WG z^k9ayCo`PASbvIW!1R^S@aQX}qUx)mLhEZ`h^udo22bA}4Vk_R8ibZ{a1Z86w=;4N zsNeykrDw!~B0XTctBRX(#jyAt3UDzVP{kFq1)lr*xb$4K9J48f_)Q~sk1g;N;TIzvQ0LiUh(vb3Z@R^W3=C3k3TAe-cDEkP%lII?>bmT+4dW(A;jcLHr{kS03Qm&L* zc$kZ`L!w*DKg6rNTHz!7rm(gAlM?h?EqGM1CH$&V+=W(k3FnSgctRV;4sGVDp5mU0 zYPKNuCQ177GbcUF8$#S_8gj27Tn(P)&sDR~x_Ytn#wA9-e^4;9|5m{a3XZA&>VK7Z zwwpYm{^G8`6l~VrbgwI;{%sm^ATfA`A(KHRhCT*W43?ol8QjNE$siv?UxRDxIR_QT zARQIYAOi){AQuJL;2MUY2AA3IIT%73WT1c=oIwFLIL+ESiUVV8Dw9`|)I&}ma-K zd=9XqdX4B4wDUl{MrCTtIR2lv=*IW6)?L07K|GE62AIdH{v~k1zc!9p63_eB0%v@I zUFMgM`EKKz>=MCSC@9AF*kyxNn5{CdVV4Tlu}cL%qs24+juzDT8w!$f9c!-w1=F~k z!528!Fn-R;m$2V&Fg(tpg*QIUE=f#7%Wj;Gb3)@B^c==H>@vhG6xfz=c$)5A$Qyiw zc$#RaSKmJlFbx@RN(G05=Q8*`nRpu0_s4*)-xs<(+YIm^2+kGaX-EZS9KfC^Kn6SU zy@6mM&#xKa0QKr|vjNK8*c#T8c~+UhTgJ;3xK;3Q`%gqXX?;07&2Of__9O zXhyrRyb%?!X@E~WlrIH5E!1l|+O~}2{{?{yyw|&DksJ)*e88Lo?tib$CfpsR68!C7 z3Y-fuUWOLQcq0{rN@Bc~-6DCAG4=`l{Sz^+MvG-!ffmO28M<=ghpc{!z{WE{*n_dF z@fHk4j6>M%m=n>08oQxoGInR}jA4SagbA20UT$b?4!<{opsAp%HdbVKC^P&tnBeL& zMKP!N0)BQFN*KE{1z_X!G@$~J3yiJ?i$&?0hk~TP1q1~wmwqG)knT6IaH{|=g5SYH z=}^JaAfDQ8XpyvEqeaqj2EjcA@Gc074U~VPUSqNa;7<^k!vKR28f*i>@&mz(xv`Zu z8sJ6s>fjpym!L&6)?Uavo&|U%E#%DrJdORJ{d&N66uvhdb7Nb#)x^`x4io^|H#>uZ zZFT__$7~X|XX*=<_e0A#|3P5?<8R`OBd;gkam)mS(k+U|eEv&d*S!f^782+uLh!bUKQ7sdp5 z6;7IrSFrZjie#(eEM(=!GE3Yd$dfR;V?2ooFk5gk9)m94cpMejcEorJ6YPDs9$}oo z@K0dvuv<5c*=?FF%LIc8A~4+48C>~UV0;z0#%}=AL4bn+E(goD4WI~JtcfhT zX5#}OFyM-fr=q1ZK8T88VuFfcQi>MRGbUu9INzK*CMeW_v`1b7eHA4)vUX=rebc=j8Hiq_8v6~LT@ z9OhHdBlM-?THP}Ke-QBh_$)(X%kFu_K|lycjX$FU4*VtH+iMf@w(4B}mjXVV7|&++ z0dHXU5pQ6E7J-u_Ox;2!PpAGE8aS>&7w>2d0y7C<9~3l46||U+ zau}o9&qhVC`r051P8SB}dg;*6VuH8PcxF`PS{Yz9R zduo|uh^Iq4^bij9(C!%M_bkT5j%y zYv&Rwn$Z&mKd_LZSIdRlEY{X$9;QDFb)1-jIWmQ`XP&{9-H%*{p^DKRY|ki#UGUAu z;b~7}+{iWou&1$Y4}e0nysfYpEu#YsVSa;PJq3#z4|Im-8SOv-4A2uevyj1g3Qopc zSnSMW?eK@92XS@9_pZ}Wp!h!^m(^^$hRLtY1c7PhmHV z#RVJDVhdEz!VaY&1cV$zn1vleLy)}yY3%zJAQfPU&4(Caj6V1j2(CRq9$Lsj)Z&8W z9mFPqgFe7}M|e*|4=sSHI5{0$ilNgGnw4k-*cU<@Yxtej8_YtQL0RZ&2C`AD$zkqV}=*a{uJ0kdo{Rqu)aw}wW0^wm82W@W$hEPb~e^5}1|5iawy*33s67B;8 znr_|PyyWjmZP^*E3H90kQb9e5={gKCOqXEHZn_#n3DYeY8kxqSqGdN_o5xJqRu5A{6kJm^rm)TEDNMd$dnUh70Ze;i$YiR93T>)}if5{Vmfutb zJ%gzZDu^lDQenzR&thuNo~<#Wm-a_m7(oXrY8O`vj**!rQ|D1 zRjXWW(T*VS@-Y}s`LNw@O6?Xy+e|I>13|6X_+Wg$V#R)vpcX0-CxGw~_lQV;X^1sZltkh4zOEM@qA6YgaL#ac;ug&>a<9w??^N6Ue zwKwtmf1_A$IoD$`QamCSlF>2UIbuFkQ=M^kBcp3hM%10(TM-W3pyEdK;kf#7p1sMS zx2lyP`eLot6C?)5NeUZ)MOl_CRN-TEAU^9j8KKE4+rC@?hySA zQc|idLL8;q5vaP=I>LsmN-tbhGKeZmFdp?aoFFQlE@};^ zzZzutH8c%I^jnkO&RSah$6b`1N3Ah@FQ2!Af!59lc+{>A&7$@W(eC2!>rs!IkX*M0 zb>X#aa7cU?wray@cv%~+0sI@#(ZbqG^K_%z)_ZswDt8@QW~$qxSA{zrcwb> zYW>ewQkrIj#?v$if~n~NJU2TG8^3u1;NPq;!W2ywz&3A^6Z3Ao2ZE;&<59rBe_`zorWRQe!aU|Hm{ruF=G}$ogl%0K!kf*%ST;O@k%sx1(+BdsPilOI%ud&s9?Tjm=*v`t=V8KIhni z>N^8I{&e=Xp$AlWLv0|Ip$H}47fPUisA=4wrf`oE>MS4|HZ+H% zHuTXXf0SaF3B)&SgO9;*3WR7l!uMMtnI#-j`ga6^_I(Ki>Z>7^usM5bh*VBV>7jAz z_oCbbTe+uZJ0B1wC1}r+Q003KfLp#-UZ}#oGlIkSS%=JkzEr9EyFxPbC&CYC0hN7F zQ%H_MyH!idPy zCZ0wWauo?@6II}yB%J+PdxBt&Q5C&RLb^c$yomlHPSBR!4h|l%?tjWHRE-ajF#n*+ z`bZ;yv)>8x4clX;M8rp^{)U{KuN=QCR9r&_w*L>uCkdaWAtxAyAwS{lM)-LVF8*xC z029Fw#eQsrBiAiu%yb~?XvX12XNL+hinjB}TTlr{HivUamLsl%Kt~LNgc{)w0v=HZ zs@{lXIGKjixima0Z0KP}SW*QWMg}qTI^ujo?m~rvAHvLyp~WG2 zhWSF}9mX)kFnXtl%@*yh6ZM`$b(j4Nqof-)9p&(DNHx;O`zKUjeO{yBEE~zpj*&|M zhfxf}jAk5h^b@FbV~Rpzj|m3@7|ponm^^~vlvPs3u7yuxECcIfpJ86(y#T-Q;Rpwf zTZ{VR{NXhp+Z-w@*6m*yO8kG!Q08o#FMJ#Q59fU`Vt{8e*3hB~y|n?FRu(B4SOV%`%C$=_E?BiCf`y zPVEfIJYh0yp9xh#XyZRYbsOIYD&x4bu${(N1|f}mfUwbc8*In%8sdA2|7qh*n1FFj z=nPwL!bJR^nj46oIu!&rQN_F_%5mQT;Y?-#fAR>}zLTF|9+T#!XTu{6GK$KfSwmyUwnkB!GH~;UQE+!{0=}+kCzOr;Xtv5&aAa;uKZ3 zKZr<2;UqFpA{h?AhB6!^!5ruJKOhMW`>3+*B0_H?p=_i?U&H=ZQ1UKgKMUz}o5lX; zvEDi&_$KzViv2Fr>TggCi>Q)vKaycN=XIF>pWyeClyGu>XW&dSoMXG^NidhFf?nr* zuCu@E8hpg~?r=O$AbAb{kbw}+DYLgi0?x94)6PsrfPMxMZYI6FGe-!7&nHS6>9aH= z{)Q-HV9U+i41}JM2FWyoD&X||K=5hXVKYr*%GUJaAmHg;;bfS89ATE}J0V%8Gs9+v zFC@{7rf@3Epd``9H$X_JV`3Z*5XS64jCb}EFofA@kQ{SJ*mD-(`&_|(3ye%j_U_0|wjd)G*twmnkqt~n975oO{HO@nQTCOQxH@>;}?uW zmZmJQ{Y-g5C?8*n2vfo# zfbD4`G?Z4AUH$3Gd?3Ay6fcE`oRSNKV+Q zhc#7qwRooLca+Jz$3BBlPx!$WJU$nMdh|4GQo!N=-sUr{%uxM!*+eDfTKf859}WKj z;d@=oeE6|x_)llTnErs9-}HwjA<`?Rv#`NT=QV`!S4@{Q#I}lOBF0f7+)kucnI;m^ z#%c&72xSQ3pr+oiWlX<70-3rI(Fd^X2b;+>fQUF0oZU1EDx7Ho3FlXS-;F~zOh-s~ zCppejP_5)VQm*@hV_zeuyk10btiz&ofP-IWiq|#9;jRt>qF&7mo&QQX#3iqgQ(vYo zf0?S;l`z;8SLiIbau0}hH4v)K)rzo%t}<2Zs)k5{qhAY$t#rL05cvk($T#RDx&9J_ za(x6;G0fxtJ`=`b&)2Pcp-f83m$H3&RsS(pas1GjzoI5x|4D?ap;#Q?T$a*6EK600 zeoH%~QdxchB3QbElUn*~2-8@x41o$^84h=@Wdb;_Wdh=DmgzuH%WQCB%N!)jTBbnf zw+w>HW9bjo#nKlxf~6`D*is%&1WOWZ6iZGZsQE4aGrxo?Vt#?#N%K>!oq3A+A8=0d z8z7+h4G`S?5^iYo8yM}D?8v>e6y*545YMytb6&yV#Fl8Sy>((8Kme9_v|}kuIK^`w zc8-_uO!?Lusa#(f!2ZhZ5?}5B!M`j+p!*ALhA$;y^nPI+Vh!RMzcP%?9(nfGhbA0h*Q%c#Y|0C*XgxV z(+zRj3~KuHPTNCGk3guJevvbPtfoi2M@=8?H0n98e?dr}|5ze)o}U~!u!@+_k`5lJ z;Xfc`kN!E+$`$?_k9Y23E(jb0Os=U))uKR&q4@Fm|MmlLDK0LpIZo$*HmSU7b-sfX)-HaT{&5*Y>K zM=whvWhOESA~!M?3ma(whl%t@+#%8vqE9dVAVMRWIiBjWOj)B$ZQ-(R(Lxiv(mf5K%{}GE{21A{+-^Db&R`Aru%Xl zy(=p)4#Ng|V>a^t4V=eXx>48Ct+|Qyw$dHSlquI>&p1 z@r>*AKHZ=@_buOl;<|HwksgpVk^Y#EzOKPg(IWjIp(1@)UzQQXn-t=MEX%@(jx3># zS5+dDSvm+;;-8vvg;O5&Pba*MN?Zi~}K zP}9wFs%C1suVe`GoZB(f^ru-*N~lP9jlObwiBy5Uw1H%is@fL@M&ylF`J`BDhR@n^c1KQpQKb4N(V&$Nv`acApCCQE;8i0vjHnHuwfDJ~zl z5%B}Jle|9%@6$V`IKAag-8WSE-q?_g{F)mc-wZ=4&pX;$?x(?-p*QZRrhMa_ypv6>A5WHmb&qMBVJFrk8Hhb^mSM=F(?jRc+z?tC>f zoHc~wzYtvHe@k%Yy}|jfq!SC5@2_m-S6NT_U_sw)C(sw)x0wXM_NuDWQ?so(2i9RIT51^(LwH;!*KZ@=3jMa>=3E~MIz*|6IR z&c0~6==PHfenl}p2cV5#xNv!(6PrwYR=6N47d)QtWdO%ZWAV|7$<zXW-{==-9?v za3314LUb67?-mC zI`+4L?XQ8&U|h<6YTH@_jbKJ%r;(fGT8+hOK0bBs>D~pD`Wh zUyA=#gKA-{3su9|5VoPQCB|>;pp{~sdb0jN!gDnHo6363Brwi}EoNNA@5?#v4Ujm- zJ*1mUn5XeQ<3^d-KIux$Ulfcf-ykrWeDLP!3@tz6F={?d!i*PmPKlH2meZM{<_dG> zkf}L$I|GnvP6Q^^oY*Fz=A^2T1MwU+2UU)o*`e#_>T$JETH`9JpceYceooL*No(@DJ7$HD$HV&9ya0l9^02IMrVnZ^)Km!LuD zaMq3udm!Ml$7!SL@XdyJnwl*Q@3TAbKKpE_%KHDvW><5Rh1WO-Hsq=~5ujFca(p@8 zq0HSDf-LtFl)C1FY=1ScCsf?L>@P3zwE)Lm0P#Sz00Px&fwmB=`7b*&IMn=;of#Ku z{!74X9lt4n^J_VXxkOn6>zIEG1Z{yfPTzsvuGF+#sFAtKk^)+e2Xyr>0=eCPtn!vj z+%%}nBQd}t+pa7e_k%#*Id1Fr(&exHoIpm;Se9&zE6RABEamqM zU_6#|uq7?&87E8!Ms5BJnwR+*PMb2n)!OT*m~Vjrn}=%*@3dm>2|;1*1l!fz1&q(! z8-m_Emhr_Q{I9?EJWnz6s0niq2uyP)Fj#Y22ncf%s^qO8FwIRNV9d1{pRA~TudJ9$ zv)!T)Oy(l|zZf?7nrmwFYpj@4AP~%ju{*&W0zqi@(dH#gh8z&crZmJ;O_#L#dlb_d z2Iifocnwla2NAw8?P7p_4Kqp>GobH0OzDz90ZQ3KNAVsQ?r#BHf{L7 zo`J)Fe@Fh`i5WGWm@v?e)8P{2%oa^AN&-n;z%P{S9iVtPe*e#JVQ zz99~6dXK1x=^w3Kf5r3&;V{!ZS_HTFpKSLyq8<8reIcG@=ekp2F`F6pHV{v|vG3LF zs{NOym@6SAPsgKL+IaUU=DMVlW{iWk;d5Kik-0TZ&GuTq!o=*VIbG8$=Dxr$^DwNh zc{&s?^8(V_5-6_brLdIDi?Q9zJecogIg#|mL%qzu0}ssmp}?9CV%^OrkVjy?!6;K^ zMvnpzT(H>S47SuFUm!nGeF{3An5sLRk*XVcCk zs`~^eFz$5zxxq=Px_LuDxgrBeb@}Y{&8Yb(81ktI2TBDfKYb?!aI}i*QWFB)Me}J0 zf$Opd3XUtbf$8nKBAH%w#WpatAma9F0VK|-1*qWUze7_VN%CrbEpeufC_|mjTYVh) zkh-YmMTVA|w>1==JoF*uDF6i^H}+9}SIppSR&yaCN6p24bMACHkH0HiIO0al31_V? zkaJdbrd;X*I|t(ZY7RJg)f~vJR*rhJML3QP{o3GVU#2zn&xt2vF%R7^D|*H`bK z^UUSv+!w3n>gCK>)8~-~PI)yCPUKMYVwaPe*B!p6yhb>eC4BN>vxS=P0Q%9_ll>Jy zW}I5^Jro0%-+?DC3>z0fW}aFAnQY$$zosx|5hcRaYQZtE@Lh0Rrs{$N5mc8zlm&Z0 z!74b73PZ9pk3)5(!s?bAzCc$hVp4%{%MOJ}$A2oE?w0{i51gQ)da!+W&P(FE2gmP; z#4Od5zC!QzPz=4+I>YO#Cr&(3J*z-b^S~i+ss~O)Q9ZE9MD^+p1HhZ`_8ta&^(Ov% zAL29iL91R`yKO{?por>;d==H>HRxN;OQ*|~Q1IQ6v;Li~amJVG#dX*F`3gnPn?WL< zt?)(q5^lc8VW1fEbl&BUt>us$+P>D*&w=th*iV|hMy)o~EM@m$PvEGhpQA(8m{EfNW z1SnB{0iqPo9_8z89}=%b`Hm6)jZ~sc0r(yJDu>V2MJgbk|#EIs9wl5SG^m8;JoQnmxLn`&^HZ?*B{$8Rp;@f{S`Hk zgb~yLgdT)UL^Tj6wy1&q!QcXmfN%mrW#5UqbWOG!vmwbfkvU ziq3Sp{LBh9mpD4(li*4-*Pv6rJ)b8-Q#0>^Mq>UG|69_*GBKyI{j|zM-W?L{rj=S> z${{qXw8CSGCTj1Eu_+mZhLh%T{Hu%jKP_X2VLJp(9FJ`+gsy^sQ-28 z@@C6~=J&Pd`*Bl+rSrAy$!LS<_p4`_v(<$~^yR^*OQnTn^5wU6$45>O<-lvX*NgwY zREP-NC^Wk-a3PsL-(EAIn$Q?OuMFNKB)a)?*Mu>zgk|zM(WQ&qEm3AV`69Q_+&-Ng z(Y(EA|I@Ta)gr|BKQ-(b(q6RpDdL|-hX*L;kFV~wIwt1-@%OH~TMLWlq-rQabm-uE*ecL@>Wc;9`QtB=q~-y>ty{O(&^hO*-M-R>b3 z_6j(?>#``MyXfbgx1mWR(f`|RtJ0r%F3R$|&btYCzPa#vZ^O=_toGNgMxy`Me}v4> zCFcD)p-lCm;`!CWzYaeV<9U^F{7I{*_p<)=y14~BUTkbwC9mk`Mf!Dfs)_MEuh6)_ z8L^K4OwP9cyjbsNml8^C7xRARHg5Mq(f`wGQ*)LP^`4~O&phXaVt)LG>-7CX<9?iF z+o~%9u8*jhKkU2uayzjO54MLNFbRwF{`=NPV+B6mkI%ZNrx@4YeWoog^-@^A`&X6v zBEJ8X``W}E;=go;z) zSm5`c{vJ&p2)N&PwrE5~0goHUrf>HY^SiNW)Hz=3;b%QM%-scvEPgLHVi=ek3&SAn~{(L6q4J9-ntsl$l<(eJJ1&lpf;` z{92;vp8_s{A3J9b6^uUc?V^`Cdx-Mo?Fu)<|AGG)lI{z^5%_q}qh6YTxc}^zdznRf zuVd!UV!na5v+wO1F3KBwPuNBKfmf%O&mlCRz)PvklX{8r{JJ8(Lh}kd^X}^hVSxmm zYIDRdNtA!&-g86y@7TTE1BGP}c;wkd&D9rpI686Ldr=---|C^zv;q%w7*J@5DED_* z{84Dif%`V4b?>H?MK`4l(n`)_&)^jehl%p{)aOgJ@$R_4qMSC5tz!#c5dtc3)9B30 z{ubrhhaF03_^@K#)#BRt7Cl_{Mp#~fb7v<%yeP_PXELnaAj%07s?8DW8aU$4OhqdP zoQ^YS@aWNK)Ec2726mYHx$bsRHlOg%exV5l)=NI*STD*d8}F490x+=5n>8bEX#zFZ zu(G2>8JFR-mk@}7k++_Y5%>@ou)6dsfhU2C(FNv;jkzk;IWR-IF-mcPx9|U4`D=_Q zpPhd@Sj;2f-jkEXg(Vqq%{;BcX;Ge8uz5;(Q3`a+E;Q4C-NpLX7Zy>#<^eDL#JU8m z$zO7zz>9#z-){F5;|Q3mhFJw10;c8b>6;?T2_*}k5#tOP`TpExfky#Dq85x4@C@kp zA!ipc-hf^;x`nukvRkzxuLT|kbpCjzgVtWh%40%>B^A)V{@He79Rk{!vz`~4bO2qX zI{i7ze-Zdy{$maI(-x1i|NN$?F*#k!9q#ypz@NJO;a}lHtN*0Hk5Hn$G!6Eu5_MVA zRE36kmYVH3O~bsRL|sS~&$X1Oi)S|Gel0Z3ODUq9uS8wZG(@3c-rft%@{v7j)9&k) zsE=)h#@I=TP6v%MIukVK=*-ZJqq980_uSB2qYIpH_8T3z-l^$Ehn9D0sB&Ct)DXlB zEYu9GI3h~5;^Y?9dKQ{tR128o(e(L8YbMWO0k;;&L$Wbp)$Wb|>@>k0IhD2n@LNG0&iw?xXmC+V5MTsuXg^Jfqg}q92ED$6*Rzr|R;y;))(JKG1&;MF# zh$G&20-{9Mu7Uq5z@&&S4pSq#5KNxvXqYh3=J`$pi*}k!9!hispM8L!(QYYDgp78D z$rA0w_5wK$`Cm*8jED159oXcg+K~XL+HqBe>Y(o-o+eEp2DJ)zg(*|`HEj68ILSpV zjBToFA^Id7IPpb|V|^PE`P3MkDW=BkL%%j`uT^7l+No-%&rSXx&!8F4%T^2HF@Z-i&IsAWE;F|?qzbsw< z_2(8i!#Txz2GJAiS*_foSWjsS5Up5Gzv}#vle@s)XJgD4yi<^HQ zA*x_~0|c^u0s>m!BV*F~61)7Y53vo^dKYOf)<3m*Y!Kr{G{brUh-E#E)NSi=ZW7w} zKjW6;oyPvga#Is;NU)C5>fKVTz^wzD223r3_RLJ@UQHZGY;KWf`>BP!OCs@5X*TG}Yqv_jaP)&`unkXodJ*fvOT!g3h`!TcF~Uhh&Q?ue}%Z zF0MK0#Jq~!hV!flpNq0gq4Teq8`|mMhW|Qgl1YriDH%n3o!F0b&W)h6ZhVSUf<}#I zdxP4-Dc7I<578uIZBd^p+Ze)8{x_WKFr4rjNw|)nDmR()n#lG?a^4d-o(Y7{Xs!LT zq8M3cM^m8gM)M?b>7uhyR!Uq5XeAC#y8gzG@!$sodG0G*9}_~_ZLnLCCZiK&d+h@)|{eZ-WjnD)~|>TTmL~+&3Xq> zN$V*@<*a*={-pC4Ntb)zyRz;_RM&ct^nCzPR_k8U-|ysK@;^yG+sMy$;PhAP4n!}l zJo(4Ek@c65kIX~V*gBn?6D9phelP)1OzT`kX?1#@imfbq{V`g*r@!;N{)i6he4z*V zM<d(Mf9)?Q7*Z{?>Y&S5ww+&G|Kk0JfGUyh@P|7C{=J zHAdq%g0Dn!9%ha|8c|-o4C7`=H^L(i1iWQ0vn194{+1=&bGMFr>$Y-_-eJtka+;er zUvWJ$BKm6$Ml{%3i1Rj(?}t%dgz`BMyRfa^*u8Ca<+!~O1-9~zE~_j1yUl3qIq+@E zY3}wu2t2dw<=(yDxhHT3$G?F8jfZc@(vI054Y(Ju19y@0m;y@=WDi(6Xya|DSju6% zmJ+~YOJTyth_pqEcF)0rv){8rJ~Dd#h0ot`gN`LVlr3vBDg}c}XAsfRo3h9cLE!^w40#SO)FyMuy563-#Sux|GFIZM{ zT&aw5j|Ki&n4Mx7OE`@ooa#c(Tbgqhe@Fh;o8y$@n5X?eLEsVS%KneKvmnxW82N!2SrXP*>P-pM zn~HH0a{}wdk*=b&@xA;`R{_NLtUOiV8~B~&4fuxTG4bv$_?$kzyWmTf``on5-Tqbs z`J9z{knA^+dPf=Zv#O+<_8dn;@~yh$H+87j)Zq7Oq_@(Xe>(1&ea+Jqo{$b6VF!!l z3GrXT_Zi3iK^vdIlW(~4%$kvWh}lxs9Mp62;4}lP564@Wd{OeLM3xrdfi-~R@*tn` zCf^T3f7T+%%CaVr{}sk~t#;~rlAp!1AGvI=PYJo(*L)|2w)4B;0;t|AZB<=WKo38 zMn9qVFz!&Ms|J6wmCsS@kZlvqP5v=v)Q{l~DO)83Lt{CvIHsM(G2PWpPlWWS*olX6 zuYo^ts}OUDJA!mudjjBY*VcW8z(ZzP#4~nLXeROX6#8|nL$-t+XY8tW>?v36I7dm1 zChx)fn8~tH!tkA9a@>vm~OJU1ROwJk3M3 z!~qY@xR*vX;p|`?KO?zi*6N5N4qS6yS*quvCwl;5Y7EZ})llUrz!czwyHTMyfaN8dZJTgT8#} zg7qa|@WTObs{dwWoA`5wogdS(eIKD6JsX8-(cZWhNcF~rV5&FQM+8k zPGG#AxYJahkEaHg4x(hbxK}syqqocK8?W)eQ%~HZ^c@~dulK-Jk9u~IJI-cM-I+Zl zvx?m5p>+EU`fy{cPGp+Ey&~s{rx6*9A$Q#o?S<{yEX@(KBz*WaKkFV5GC^exBbS=qTI{X5*be@vg>1n?KPs*pE& zmLb#eU2v14T9D%`z-oU8Mp5J_SrlrgDb|$IhAB|8$e)2_`^;VE{?xHycn~3r* z&eU+lfrzT>Cakvyw|_{y^1cYT`EYxNFXg}Qu>UEUMd(XB)YpS_ce3f?!tKoFahH*Y&xXnWiBfrqw z(dc@LD48`F!R$z>KSV5}d?q~@aPFRJV0L6Aw_zB$wO+~x3$ynu%*L}YOVDzh-@jp9 ztZu+>%N^$hgQ^8r*{T*CU9Fn9oyN>=%}1Z2jVn3?j{=HKajpHD`U9omiF*zvAiO zNUemJa8x}$b3AHt5*Ta}x7zEaTo|U8C;ke;N|*@*kfFFjIICTaXNXNl6e2{S9a!)L z9ObMgQUR0g7a>C_(f|a9@%-N(PGo-K7$14NjiAV#OCI%&{s94w3~c>&&bEy|xsPbM zVrfDPSe88Y%+iq_8tGYSi^zzj8PDyL9;Wu#52SlgrgJ}$^tgJuYk5?m9#oEE{p?knRcN6||P^^qg$sIf2XB&P;lICep%}9-r~_xXk80h*Ww4 zB+&ARQak+C}S`O|*`iy=}H@R==BKKjP2Oj7L z%>K!JN|$-!@&(MxbOs(&(+Qqbd>Eb~(*car^gH)g9pL`2R2v)p%=fO(l6T-O-F zUGB4rVSf&W&WkV`xGY2V2{;zf>;S!+3v+#nvY!eJ;n$#txgqFKUr)JjupakQHRQf1 zxj%6h=Ot4D4&t~+^KRnjZjN_9j;c2wV?Sp|$Jeng`u@nf*pP3&%hZFvIIjo9=hLir zhx9Jrzve#1&-_n%(m!Lvy`(?0^CHzW#gdWdwPq)M=fZwWOCHj9Zk{Tb1MONo$>)rG zE<*mHGQv>~o>fZ{`LBihKqZ}rlP?7Fyw*HCpEf%^($b@!k&y=@>&Ia}mLiChSW1x( zRU#j)!Ew}t$64n)(&OJ6@U}GLcqot5gyZmBB-DY%nt=QM)C2=gBa}HXg?QLlAzF4) z;K$RFC`?a})Cgrxjhz~}u7Og4&~t!jdFUngU+GC0D&lBq3vc^R6%u@Dp~<4TOv z_!1mq`Pn_u;ECgv;nVB7J z!OhXC#fpBUg=HojG`i^8g3~ zJ!EqIq~|#D1orbq;#5#Ik{*OedPMYfmg~9{$&@BqUi!Myg0?h(=SH_Uaaf&dr6)pP zXW~l?+p$RxGcC&)ZtRb)gmshuSr4$iiu7dX{{Q3AUd9sli|Y6j?F&mV`ULPlCJy)~ zJ;1hL%*VD8o|;%(hp5Kka6dJU^d4u0CrP(-W#ohwbF??`EUGuQ3rT#A8HV+XA>PV< zqq$!%Isp-kD9uCq=KH*(mVu6=>0#GB^Nirw=n=8eBP7QolU*HI0biXT;-&#Ljt7Or zv7cD-8+|^chZtN~t=hQF%0>@ZtUvfyEbd{|;bG@KU%NXzSh1u_*=`&?ns(gbqdIU1 zqZ-c>n+nl0T$mn8DIXH)nNDH^D47u{p@3zeo{yN|Lz`QyQF! z)xl>Hd8S(eJtye*Ukt(v|E)n7-Rb?)G~a`YTI^}h--7~wFbGGQe(PK&Iv z>qgAhuA^D-3zX^f)H{j$u;pSoS-H$-$%EWo@jcQ=*4Aa;E-74@AmQbZ@Pn^-6R% zq;y4hwmVafqT4cgnDbJL&^4}?^aLm*cx5ISXi>VVi;jQ*Erv^;)Z!Vz2ukD!0+wV> zXUUFW043>aE_n}vza$Bu|Cu9;MeGZb2!o{i#czZfoBR*NxoQIsK> zqRbU7!jKT=^M9Y@Yn}SHM_jinids78%eCfRe>~|VS48zD1Iqj)LJt0(vowsc@#4&_ zlri!k<{WtP;C30ScV`ZQA9IgnPC_uh%NV_^pN{8mKcj|xL({-dE0#;lCAf~$E-lxY zgK`ZgVpy*7gq0h}y|D1&T$zJl&CXmQSN13SkB4W(sxqgD=XG1Baz5*LaJ|eC+r`|0 zoy;kcxnVN5>>?~vJqPnOl9r>q=yD5Wj$0TACn}WNH@Lkb%9puzp2&)ia?^6-?tIU! z%**;2H9{V#SYN<$vp!<(!(Ys~x(Q1_&%r&%oRwqDjoZiEuRS=4!n%h!7J4ompJk3K z*IzBlSh7+d8b}dbW2hFPhM}BBjHYM~NGeIl3S-{7E02;@=kSdA=$3@W@dpcu(-oRS zJWp`Yv+b!#C7j3iL>|p0+e^m9$EuPYl1fUN;$5MMmBa!2YAI&@mm#AmLkp!Wk2)$x zNmR)bnqws%(_4u#^U9jVP*{{a(ki7mPAyI0{8Ff)RiVXEjpMHR0I`WG^wFz~4OYe_ zU1}wswpwv8G|zG$(SO-%V3cKfR9P7fGe>B!dke_(Kz zHgEC^E&A{$liWj;=v|a-dnr*5t#>BdM*o52-{`YQ29Ca@5w56ros#tyl4_&>;x?PR z`J4nAeS_O%u2RBYp+vmQZ8DePyN|v^$$Xv?_Z*Uoqc3Rv3(0?l^{%I4Tg`2@e-|ec zME@0qdXHZ~@;;}eeaZhnVt-dmE{r242N+RIW=*pYwCju=IZD;S{u zKl_P(!+Ad?93F6g+7oI#Pq>}wiMDQ{-ZP^!RucWZyEC~t`YqStJz^-)uelxR8UMe{ zb(G~Jw*L>3u5~!PqQ>(<8<)_`z9N}BCIiMF{gvzSmfN1rxj7kh^k%-FL--Cw5_)t$ z!nr@+4`RI$T>k+O6wy7ATpis-TQ9NhZ3jBnFS-%mCu;amR*8;6vbDYqOKz{S5nt@Y zV=Lz$i2Z@l1&|CLorB+V5)bnrh7`?pjAl}Pv>X4I+q&Gf@h?}Ry*Yk=YJ$O}7a#6J zJjW#Z(~MOeVRHN-#;T4{;K}`sw?L0kf1~}Vzkpv+Upb#_T;DvT+x)kkN$Jt~sDb7s z{^!LB9npCRzfi=ubojU;HWr<06;24@{>Z5NJo!VG51Ewz2zVUznB#oH7~6fu?C#Cy zzDvgLUUFP+q<^`8(w`c>AJ@T~c;SuYdi~jl&pz0c5beo*nr_@qC)c3>HToRfwD6g+ zKv{leQhyrpE(1?Yd8&|c(%An8Nmi^QWmq?dxE z2RRQ{(xKd3@_}%d@RH?U;J;B13D@V`l<^NYH$02NCWaSm=QZd)>J#Drm75*XFz@K} zT<46~v=E({{5l8mAs_f+bV2QZgTQx=+aEF0=n&#rDUQDZzqjB%+NP8j4M-=|NXO;5 z4O4E@?80{XKLI{gC7hG7xg*-jbuC0V7NO-;ypwaCqRVg|6}A7wyiz#6O6;ei)^DH^ z-H?`JGs3+A`>)Dz$$Bc_7+sTi+E9a|c;Axi+?M0$O1$k({?MCv*N^l#gxfwx5D%sj zE;A{YmXHo*ITxEnqGyp$Oeg=EN;pp9w$O=Om;QuHFRo_~^6PHIzn&aNFV3?U>8%Il z^H9Qh9P9r|crV~MmJ?oU+0O>z$9nSTRa(EJl<1Y@FDnVBS-9+js@LmCq0=nB=J znT%R~Fp{@qdll%it3dcwV3J~aT-&YxUy3fqk~MJ@S#byI6?=kY_2NvLk_JXmCiN-w zs3<%+N_tj`GO4l{4WVL8R+Il155hQQKgEfcC79e-f@d$6;E7QswNOEjsMiOfm=bjD zm*@w&D9I2=DY}YF^TeuB3{jL?h4*EcBvs})lGMsDxv&h+;*|zuSzZZPmT)b{kWjfI zNYX9O(1yNl#Cr+X3QRuMOV+E%P(?)^`B#yy^@_(}@K)mW8I=knd9acL>rt6U6;@($ zTna-|DfFo6hAfis6bZBx*4! zwic5&YhA;-)TV2`Hg4(G|F6a5PQ5-||FxOitk-A1H5oFKR2p3++MOv-w7$fxV@ z=*T(@0ZIN^&mZeqpCPtJbXYXXi*_6GsKW-__1=J?v-%7f)gKQ!X)x;l%g-C|xCHs! zur*x%jY+>!J~T;U*%I(-!jNlY(pTdm*rd{!M`|{@1Nv-8JkjOK0BS&$zarpsLx#NS zGlWy0AznGo`rnYd)_}>_4R}FbLxy4-^33zblpp#yrCjC_lTCROV>51!XwIWZn{(4g zbMns?JgT$>HzhQ~4UpgGa}G(^jmA)3Gr6@f?hIBN--o6J?71s+zCD8Uy?2h{I?FDn2Bxg7E4~PsBP~>wpcym z2ZztWN7IX!ZJPHdbM8d@ml5)axekRh<|-8Bm@81=VlL64;dJzDS7PqNP>A^g$4N|@ zrYM$GY?%=0)|&i8P2CP6!(}? z9Dix-LXRoO_A0=DjY)w48B>+(TLqr>n3{xZ9gep?);Fdp45OG9oS*!!A`G#Za&XYZ zSYbHD*kM@3s9g8TV=&%2oOf^5pQDZYjuNww4!Rk1w8{SJa6M`f-cMZNRV2WuB z$3aYU;zvuab6d`g`iv z*0BApT&Dvt5MxddKaX-=C)wUP(lzN{?a5tLJ($DOg9>5y%TSoQbGKr5=45o|uEB2H z4b&|w1obae2)pv$uP$V;otX2}k&LRSUNX{|3PNWG6p>Cm zOS=iF}CjDODN&o*6 z(HivMDmbz8rc}9lK@fEJK|}qj)c--jnUw3r_}^*|{K=4gj1s#-V|as<*x6vXvE$(B ziX907A3Gc#!`NY9ps^z$h+@Z%aVj*i;}OA#9S;E(n+gwe>|_X>*qIQBv0K29W4E!r zZ4iX9Tfuns@0;MUi`@thTkJ*%tk~aJZe#zy!J{U}uXg3FM_srbsws?K-2HZZIiuf0&#kgLH7C^2-KUo9lc2Cy~wzFvA`BD!K})aOWO#CZ(URlJ$npORf_eV82$po;{d2Cicg29(KQYw&`v(M@`{>vzC2ZAC zB3LmcIkV>C&n8MulW46Zdm<#5%yXNP-82L^rX=UlBz##V=_54Mq-Pq!iShwLAW3(H zMvH9%EBlMVbQPV7rDM=^b!cW@5_q*U~PCBV+SY^Kd zcS=LJtxD3F+i3r?reTP2+}6g~T1on#{l8pE`o=PCzB440losF|Z*n>f0Y@sy>7gkl zXVnmXx{{nlBc$c}{MByU=iH4h!EP<#!q7DXW{Y;EtD-CSjdo!cwB)>9n1$SBHY8FP z$MrUSYc20og?$iVlOKKQhxNrOyCM$K5gh0)v7xx|Z=7pKPnaj~@ClQ<{8203T z!X9tIA$84&`}?{x>$ZD25CrD`F9;s^-y(S2rtU)zy?UppeXCC>^Q!I-2wu%zDY?d_ zDL;weUP|0%AXeN)m{f7=V6w%nfr=To3I}M#t%52Ww+^av+$JDs+%~A-ak~(!jN1VY z9JdXstZZNH!-FdNFwL_M? z4Tg_Gz)Yps7^&T}L@-V)CK@ivf7(reY+48v8 zLq#2A$k6mo&mRy(t#2DKZ^H7QM34fC?Hi1E+iU1Rw#RTn*d9Ve+3v#_v_0X1y@Jte z`^bgo|LULuh&Bx5Q5gewg5?fmT9o`gh@xN+mGnW(BgOZB0dV&J7QnH$@6YVl-&J5l zxs;IGRen@5H`Xs?oLu530UV;lK1cde>|3%pPbz(%;jM`MNM-Q_ydklFQQ5l;78!dA ztTpy9C^hx~yeYB!`QK42SnNqEo9B^^5qksPl-RrQ`p9vp17{&Kd?3%h8OSqE`ZFBY zkNI|e8J6jr72$xsv?3%6?N2Lc0Nu0$xRXOJ@Zc73qYkE(JeXmF!3?Kh9RIT5|FPRN zE`vvP??xZRKsNNtmFV%qf;T#s_w&vg@jtoX`INZKaGS-xfwC9-9&W|huNv!YEWT4_ z=72UIm-B^_^~(R$L1bxzc-Q7&`um4)i^NdIeTLB8F_;%7;J<$XXtw{DMa9K`{5Hc& zU`DO+9dGCS0iXxe#RION*zl78-Kf|K!QX641SQyt0&uoc@Uz+~0MNFo@Tb`-A+g3* zp0cYP>(ziVVrvG!oUJYVYPPoguM=ff51h7X8^!+Uzq3t-f6O)&lx3R&O0-Rae^f80 z!VI*{VEx(fW7>WtOI-+mrEM8y;VSsCZR#?$7b{WxKtQ0A%aPd9`ExHt;LkS|jnp){66M2>+n1I{WeGdpGzy zZFvZ1W>K-{c-`vz~@_<9?@rMG`Y5e$~7w72;g0$s_GHS~Q z&TVrge#m-$AaGk85`b)l8Sf}Wor(CX4rPFMDE&15-jgjYrlW`KGSFYg`5J!Voe z4AA^rEk(&Y)dq4enJ&t?w{#FsFB`@Qz?jf@?<{=0?<_QBz9~eOTs4+TKiFwOF=?ey; z9`XN64459cjlj?j2&kBC4DirR6SJ8Cm`w~Qt!MkI;BSms#X#432GrKG-b(hnf*Iq> znL)l<>+hv#51HCATNp6i%#8HSFbZRSll}5}8v~Jf?66H+K$x48}CL8whg{Gjs+pz%hWC zJOg-X>Huc)4B)2e0o-&v;5m&zUN$ zn|>gmzBLThFWu?$lLX`;Y!*7CZvc^F&%>&ZJw@B&4`>jvCxGy=rx3x6y#S3M_Bs$V z_Awptk0EhoyXr8WKRT4DP($gM9>xgUFz(?Q!DE(2WkdvK)CxqrM)8)=;SYc~!?_z8 z?f%Px79noiD5@a+urRu+ zR~IP+wwj1Y*s3GqV5>7!mD*JlJp-UuFmJG>u66Z-p?1F9ulV<>emjeptY@ZzsPj(WL87F5o~V_7IK6!`g!MQeuxIsXg{MY?jy)&{bnk z(CR;?*#@1z|F?%BtnCaf{icbwhf3^v=+v>Rfe5iH7_wS|NJH#GEM)9lwmXaUr?J0j zNYaj-!G314l=Wtk;-_<*G8C3dV|W5=q}Wu5uGpa*-!OVT29Y!Lq?e;By(b+Q`fAM( zSqt{t47OWrQ`jD{&E$L79L>5rzzxiEw= z*`alzLl4zdjS%r4lR}3xv^abc8AV2nd&C1IM~<3@+XA7pp z^rQ2~2RgOQm(C_11_90N+@dGzggCasNUd}2IzOH3$?qoOD9 z{EP{-RVHxz`-B)Uj0xP8G+_*!3=^1Rk;-iNR9+#FN=BQ?WVzI?NM6Ev{0jrH{l^U8 z!o7ZeZ}SL%AKSeuG35sau)^iy?6T{Y{3HWtr`R?zu(TDLjBO_ocrR7RL-bA_NA{%c zB)z_8Nbpyn(b%pbglzj08jI}~jCR{!tp5VrHEsWB1S!fFjCj5caBf?)eWpg?Lyab! z&$7%-iJpa$Iy<%z#%87Fk%?K%pGaV5IljZtbZmR5I`82)|Mz(}y}r9RuI-xUvfw*> zHqdLln(eQo7k42U+61cTqv(|#OK);2;WwS|kmWRbYv;24HOT$2t*5ti0|S5?=?&*N z)KqE|6S%!iCy3gxwZ?NB*|^>?&c}R%L>tZR3uAb@<3`X#vo8jE1AvL36+5t0dgr-17F_b5@4IyJ1LT{Y( zzDiAE7;{Oa<}h*-&N3gx)PYga(11oQfH!Uo&+Qn?Z46_Xy*N%|i2n%qWCw#9&y%_& zJX6UyQd>fU)8BVSq!Iq$tz(>RJqRss1K)21PseGnvzy%$tldrywLhxT7l@g4+Y?+XOCkAOt5Pv-lXkkt0sTD#); zSHfi>RB8KS92j9=0u|N1l>e__d#g1#Z&&Q=IX|wCI)mQ4=_HJ4yftSk^Q))jfh{$i zCo0Y0{lznx(=&r-=S?RkpUODXROVGr;l|P_B)BQuI5#B&;$D-PKR%i1t&_QtZ_*yT zpUAxJRN8P-Wu8Fil;qr#xM6e(Hxf_f2HR;ovTYjO$iLN*i6y|A%+25*a)!94#Nyscq6C5tR)@MNl)DkSqv zx~*qY!eV{?g+avqw+zBj&bLMK??MHbw$rF&(YoG;*l09UbL3-W0^A95o;j z9rciB?r02&=WxKeqT7m0YiSwvVe5}KEn}VV1c-4&f)Rg$t8jRdA5E_wVGz5!d z2%r0L9vz8So%y{h*45FC^Jz}FHbY$0(H#QR(HFi6NssEX?qG1s3PST)#*+z_(U-7P z+ptwiltrP6FUbp=d@&jAq8`wA7E)tcK%d3}o+L4!@xb}qAU2;nY4o$$h(GZMtxwC!lbo@7$n(f>J zFlBz_bwYAjHpD9nF=go}Cf{meIGJoB|3@Ha#~ z#%UJ}hX7xonS!eYo^WH`qMQ)Oiz*|5Wl>?IN-lhYIPb#Bh$kKWy^<~Zf`BNa=@``V7 zq#XJ|0oYVE z$Hq?19run6a1uKD<;8l|>xKQYsW{$hbE`FgrF=@SLHbyv+GspdhVl|!1t9B!-ys9Sd>0C($wURrFS1`+e`6ir| zx{OCTEm;EwvY3Kk0gtwr&r|N_^GF}bP!{s^|3x&-7xP}gB|MU733tjaWrp5T-m53e zW!%*u32-@2<6l7+!3t{ZD~;HZx{^nEtm0|kt9b;*YG#0~=?KQUmKMu8GVFDX3a)3k zejRrxuM5OD*ZvOY_}b3!dCC9R+=Po^4f8D4&}k32|KD2(_MJzMq&qZ60492kPwx#s zFo?rP95IHddq2k@GWZCMg&J^2YD}G}F?Atf{zA*32e$S*`jDWy5wTm7AfzVMlA2Fj zgwb`)i1`(cb|kPiv>aMf(_~7nqXjjnCM3Ap{7-6hRjH9yB|)hq#1v|Fl~`6FqbS4v z6}D4?mWk9nE$f}>2aZT;o)OcWr>r}|Sud0tTnM6Gx@8cO3XM`)8nPWD;TOhvN=@32 z<8+AvT=LSgkd}xW8E_uXD-#%${RWG$M3!AqUpi!T{*uF?57?3ZABMY3tDc{6;*S-Gq_@}On8?goKmnu+Flj{#$JM! zUNZZS=e(>)b+?DZw`&h!e_*ERhwYwAU1z}0q^8;V)JZi4IwD)O}Nf2 z>8fkP^=r#^I}k2i2)CY4T&9GqY%viN=fu(ET4!&yN$@SVry4giI z?jijgCZ3)jh;=wc7wIv?670tb$0MBoUXDk)g16K2unm@}eLMNfKF(9Rg#X|;kCXmS zbDUR6_cz&}^mNGb7U}l^;q;Vn`G@0w0t?&zH^=vwuHcuPKQoZ+U+Ec<{4R|ae`d;? zZ1mh@p*+h)zU)Co&ySY858&+Zq`Y#+xE!AR9!U>|gPSxjH?ln)jv zxbnL!qv*LyM*5mA_sSA})!1%LDy}uD&{mV0ba?V=?W$S zui*C;JhOB;`(Ms1k!3uCaXBq|{XGqbCE8InuS9tj3i#4x2pQ-KJI_#D!f`HMfne`q zrlT#UCuNCduzdP|JXACY7VW{hEz5-BDE#?K?i(dmQLFSm*|i%K}~izhDgTP;Z~xvlmFihiCfD zr@=9QDm-xWc`>r|tS#Ufo(qZB^Lbs;JceZE5zh0OZa1IF0rQD3^LbQ|Y;PWq?3vGy z&HQIDgQR=%7;^fRXJ*d(1W(TV9k}*tA+vNA(v!A`o-4VIi|Kij z>nlAgKX@wXX|-VAcjaNEEv_Qntm5|imE1}u=|T3tf>}?i+yKYb>o9(u-WgI` z!|bQkOskXz=_>9BS;cG5R&j@hPWQ~dTD=_})HU?ztzq)SnkVoGu9*jq>1w8xuHxCV zE8hYSSMto%74)ph`7hsu?5Y(!!*rz=)>(G|Y(%oka^AzdjQnp|7KH4U@@S@IJo9zg zH>~e+o>?s6vx1wa_4Vn3b|suw(_^@Xp6xYEYFW#R;@3q2UOM09fhOy@BSq)a+)1PJ zVP@5>WAcn_PcLb}ujSEHYq?czZBzWW=1sC_bpA}bTuJ&^$=j%O$Aery?aa({ zqU1p?t9f*p-Y<`8)8&E0o6Vr3wdH}|Yp(;3*O5O-M}&M{$E2BcJTp{>6L%7=qvv#e zB{*=_^J4i8!I<|3-jXHdISSAKVeLKg1^#b2)% z2LmBK8H#><9Q%=_4T@pB6=}ioMkvVfW_VuXBcRB}htM+|z;SrP0TJ&3k8Zp>48M36 zgcRd*BK1au#=l2U8I}aI3egTCuJ_8Krc!p@>)6>!Nk`5eM|1K5ozp1#s zR-9)_I$lt5|Az|fQ!2`DVMyulalwBQPU>Ebum_5gp3c1tne3tGbPpATJ+q-e?j}L) z=CL8W8M@d_fw7w&)Zdx&@cTUw^zZb9%5oPO!>;1Ee{vU-pLUf8Vee!JY-e*QN;`Q7 z^UljqB=ql8Y_+uoz!zAqE49&>$5D|MH4yBFf8GiAK<=23J&KC}M$$k#I#NMuRXD;~ZOtx3j#|_ zfGaDpCSu5m{lHifN3i~ANbd0SG>^31YX2E#b0CY=_W8VrRI@65DaU%?V#QK3UcQ<4UXxmu6yJ!m)ljr;9F; z8?6$PS+6+PwIbnDg3pDx?iRR26N9;aE*e~-zvDq>gc=evfZ-)(1S3yKTkkxDJmCxQ zBH<$#dcs?{<`Q1RWu0&iuET^=a7`xsfsI@VhtPh)e%3#X&_cp#tV6;DFzkdg(2NpJ z@c*N5$tBQboNyh9=QQGHdNBS(7p{vp@gNY4Ik5oS`3C|h;U?+j z7RM#&=mcDq348f|8w6a!8mw!=Qs70x3Di#v2OJU=xUdt;fZ^-wQI_LLAe}^F{E2xW zz!I~8J`%pcMVasj>yU7Zrt`T9Wf)!`Z#mbLLUF+ZPDS(_IW|9e4@ zCwdbO0T@qWF!A2Ze(Zp2qJnuPmIwb!tWLO8(dbRkc}2EYhU;9MbXFwFiJysfgc=e} za4jbqSVqA0pJ>E-CYqqZCmP#2kN--H(B`St4=h~ogAQ@fjkt~*d=WOz9j9|;34WAX^Zlx29KIb(gCbr z(x%%^3pi;F;c`xEZ>y4YiT_>2dL~`h=21pTx_QQVMsm_ytsgOuZ#+Ahw|XRdv5b9z zv!ShkXL1DkOZMRRKn*@0mEPh>yTUv>z7;=p|RxRu*Qr>2C0$;#ciivoy(wf5XvNpj}sF8h8KeF3|ZA1Av&uTAzMz54RI33QWeCBKXcaGsH$Y*9ex zhVIUFNcJ!9OhroeVf%rgqvR;^H_5N#u!$r&n(dl^uacgVBiWu2DJ02}&_{KCEBSf3 zoZv$hVdo@Q0sbbdd#hx_Bf?*ssY>`Rt)2x5ixo z$xb>D^KN|`{I(V7EV(K9Rt?~Day{6U$?f^Q^BDBwOeGTay0Yv-{wd4u<*}|kD1UlD z{wDX}9SGe!K@R=G`dvXs$=&uk=_I*pBdmWPZQNp>8;K9wfCtIHK@KEu0^KD426{~1 zsbjOR+;$=ytal;oQxN5!_{`Syq$j}D7^cW(EY zI9SN3J9GA2C@R{$+t{4@y}+mY+tRHoC&uxt-^Xi(#d`cx)|`8j_N>0n^g*o4->)Zk zn=IDzTD|K*DFTo7)yq?TiD-B5=cloA1U&oXt!!E*;8niP*An{$924@)T^}Rx-ny)E zbiAjM91>Cf&}#v2zdmgSIs_gCbXq(jNPG{=HSOkn(N0{KRkb#We&g%zYF$OFd*RWe z3S|)ROejCO>qfEeg@zqSJmfCwJ)L%IlYm2X;VLr&#kdS#&)j#2^$%b8wPdPz4)q^) zYOR=8h+ojz9s>R$+0Q&2Am9`nS^mfYF)shaNI=&$SAeSHQ0d_QgOrZ7RbuYP+z zXPV%*_b1o8;3oLQ-nwP#XA^vPM^8t^@j{PW(IM)W-v!^8wV`wMSAq|8EV97&jG*5} z-D+fbD)?&kMLC|W63&wAUG z!r82^vyBkrN?+;DyVQqDq0fafc@)^I6#9_4bG6@7ltS-fTq7%{it=t$_r0COcVo|x zR7I~}IDMu@#jklNg}(HtcjZ`wQt0jZqNA(aRtnwk`Z`B?@&4|Y#l!qwD248Q%R0FF zNb&wq;Vr$QltK@4)NZ$=l~U-hrVD)Xi}LQCwTB+h_+J0^f-`^h6#f0Vxcz-$M;5x= z{Au*{GfJUbO?yVqNVUe87`w0Cvc^Q8loLVNRG-s~ynbKsWkuYohg|5-0@ z=`7ki@OzDnJ4C&M8voM9T84SIqBJ`lf3tEmsPi*m39W zd{J-jmxsq{ivD&7HeH<{>hC)8I-9`HLfc>4?u1TM3T?PkBTH!k&o!$X740b2W92yi zmIcJPm!5Mq6yB~Bn!mYo%IBg=p;?7K{+Ua_r%%{M)30J3I=bblu}qA&X~5v7tp$8- zBg!;L673t7U#Qf)j8Z79!rb*EMH%XvjMKaTGcpX}c)Rf(_ew|Lm~7fQVKawgZP z>`J`h(eeC+Iw|piQ=)o#?o}Mm&W~L<93Y9YqiwNg63SA2P%#N6>WE1 zYAKFPFILs~OG{nNQe|fG4~l)p#&;bq#4GlRuMZ?G?y1;Ee`{21i}>Dt-{q}ct|<0a z`_>-lAnG+A@BR5yI>p|wz~T|N8Y%X=HD{H}IzzFS`Ve%sMJvT_E0%8EenqiIm2bLg zL4;yAEnZb)-!{c=2%C1J^=-wT`QhMZj-yK4E8DNLr)*Q=R&45AwfhStZqcZsBYwNB z#HEy+-2LiaCC<~@|NYAuN}NmcVJBDDQsVLjXY!mY>SdcTcl}E7J|b(447s#=wSvy| zDx<^|sMP*(>2%_IwL9-Or&D5gr(USiE=q~r+T~kdO zW${kSGGB?US+z`qMuAFf?J|QKr3EOlbxRCx{;sDITPGsxpdGiB*c!V_yr`R^#3oMe zoRVBdi4D6pD!%7@#rCdRvVR`YUh>-p2DYk!VY&1v2 zE4DsWGr0= z)vZZy*C-{%`1N=J!$T#;Q0tf7e+*P&!qYOj=l4)zf-^7hIn_#u3EJu3{14GiRO$SC zK5kQDB3Jph>JzU-f3DZkEsLT=ziz(3_f9P(`pMykM^=jWe>?nJ^f;qL&))m4)8TN%clyP`z(S-9t{XQ~p_e(T5UiOZF!`mgivy4OmHvbmLbb?A%|WhpuA z)E?1Jz-YtbDP@$XPM(vyEf)1V&tCRCMYPwZ$tXv_2PLXS<<6B3mQ|t}EHdYRrYcdD z2VST!RQu0ZBhyULfA*KVS{`YnSZf?u*R95F#d1w)^p9z;V!7cpBu{}T#qxS@sYyp( zD3*8Urv!Bo?>}7)aIf%Ov3&mHz0c;(;{CS13GKyu?`r8Ad`_pBXXMzv!Kf%^mwjC_ z)}5f3%Rax-CN;fcu3)d@TKAS>E@jE)C^k?r2fwVbNys&`f5Dv7uXk3=nJb>1mA{iH zFP6>Ne7<7N-sn-U%i??1l<8w0G*(RSu1^W{4pdAhb8ji$Hb61$Uz@tK)jGwrvvGiz za!WC-sko(R$$^S#W!v)K>ZXb^^MvG;`xMi>{L6oR(MU1XYFPR5lXRji;rQ4upJF_- zw&bFqRK-}rUb*da=*=2 zOjVYboV)RbC@po|Hl--0@~eGTWbCB>XMDCHq51s1it+ZhY?dJLY--=u6rWCs>~Z5% zWTkY9;eCeHIa)PR41+g$mhLT{>j%6KanGkjywBbF)BU|l#5C{M>)h8X5jCUUdz=;T zJ2f_MKd6Xu)Y&n=olzoMJ@HI-d7*@V@eg}ktCJGpw_w`hS}96Im&^e!_EaSzu0wRl z#V94hdT`@Sf6-p_>P9a|h_dpxUmL6y?NquO+<&+DUMg)}$BE*<*b@s*{3Y781neEM zMzm+yeBhC{s5ilPK)JT!{iM0Kl4_<`BIZBndEPQmiC9p#$kUag-oi0$L$ix^d#_Gk z>r^8pqRJoB$4-t`B5L2e(yH`rC1PrX&x&=TpVc3HR)mV@i%9|AX<~f$c0KA*E=r%T z!OOMAhL?(Bh}`(~pS1!Wg^O-U{+gl~_PPDqG`X>2IP5!4%{Wk$dwo{CzO5KG&-(gG zz`?NQOUWey4u(Z5S7-eyp8HqYzA{gK#n8L+*$F%6D~28=Gac_L+G}4W`D6|8z3t2D z(ZQmAt6JC3yW|sa?~;7vgII^)6=m}l5bv{O4g05IQ8Dj7yJUDH<~L~Vi}ItzxQF;` zyggd1!?ZUWZ>|vK{6^^;7Z>nZHM)+^?*bm1?7!B(olc3^m!(3tN@u>$E2`3qay>-5 zjya9q*hN`r^~S3c#6032-(6Zv^lyFPv$9_&#Ss2?roG3+{C(4o?>Q`^ptrS<&CuL$~bnMLRk3xZVg6S9W^O)9ti%p4$2AwcASg-IhI1-Akv0AGw@!Y7SBEIUQE` zn0UYO>+-p2ca-pTvsUL=lTQiXynfVQx5WE{y$;Q3ct+HpT=|BJqJ*EkRez`|{yQ}{ z)4@`Wl<*TxR_E-K^1VDdBJ6QNQUAA|?|mQ7SHhQvOdtPsuM*xgx@`82qP^M^j_+%d zs)W}Zm+A0ZQP#QesLwUg&cvp}`@9j)b2WS@s)Wy*l+D&4;QuL0J>TC@v_I=cqes2P z^Thpiyq|Yc!pC_fp9&G}4oJ#$;<)Iq-^>D?1wDlKcs?a4rx-_@4@;t_i{}=@w{N(d z|NA(qMP{=t67wkJzpl%1(VmA_>h1&Um9Y1&T{474DPa%VE;xQJKnZ)8Cpvh4iV}9a zTBGN_iYPN&UQtEVyPdw7|Lqsf(&v+?cRR3IK#X{QYC$va2jc%frfu(0#688J*JO_`=SHjk}%X9ddc%IMa4tJV)?i0`T8#nXIbz2Fm$@Xe%^*V|7 z`($fVi}BUd`rrHg zdv&cWs)UskC+bz=xXSZC`8`n^hj?#iX?mJx|ALoFSTx5Mqm4uKXCYkj zX{CUd3){=h{xfNCOs9mVVSJ&V0Kd?`@n7gIZCoiz=sm5yy`tpvO>O>-l+cT&JjV(K zD4}OCj?j~A=LGr-J&AdQ9@P5Dr-bfiJKNp1ci1WV-GupvZp64kH)`#Pe%E4sLYJ_= zSsc%JZJsZb(20YZd8`%RNAkZhTDzhguC*)r9iaU$#?g!QdjM{seX%~F!?gFezqdD> z;~d0#{W#v998VY4ZwtH&ZNYie*5)h9YJg{`s=-0@TUHx~_`fpSSFs+Um4GLqB{leo zc}Ejo7S^+Id_{p@q2)w>AI19=&a0}12c4DBD%$*0mCy=YhpO5*6)_&py8*}7m~d(g zd)agl8QPKa`-OPbpZGLXtJhepkM><#FaFmX^cmWYc-4sGsHfqx zXs0&ETb=8b%=sm7Ua=fc6yfg8`gyhX0+rBAs2}nga142cc06v_F-aQ)&*j}l&1(uJ!wUonpNcn-P6@mv8MLat!^ zA=iOVA=d!MkPF)L1|{Si+6y_W)oZMToI<}LC$x4JC?R`5Pa(U3?;+c?_oAQ8fM3XO z-M4o8-UZ#?giEdx6eEhG5-8MsXYy`8MiY=dlp<9WtNw=5c-I6Yf*^eUg~pLQzf!zJ|=z z{ulT%mGGVfybMX@JjZZ-M-ksf6JLh&`!K?}`~ToU7s9KX^l5V=Q{x2M7 z8^Wo!2Jb;iNExnsVSZQGPZh$c2Ft3%vkIioM9w!3^cWJ({{6Tf-rz4G`H6SgK!+ju z3D>Nkli>I0H~2By4c>rt3!Vpf1+T$62d@X71g{4F2wnvE2d4r*f=BZIp)3bz^+Y>e zFz(<^;3vWDfM>z2u|C1AKo7yKFkbz+k@h@M32uP(3~s2c$4e!+KIBkv4d7>R6^^F@ z)-Sjm@H4m^;1OJg{}lzE1(#-fr8$mbSg&9k$LWG~4ff-_l7WB0C9uxHl|VniO*#Hw z_+8GkBj0zxItRA_f6?dFjAaA%Um5tQm(^L;!MX=G;J6!eK2<^A!Q}IL8AEtDIPNg~ zAM^tJH8>OKH#isJlo@y#^b+rb9$~$L?gLMPu45g8{=oVN?E$_8Z3Dc64uB4W$j5?C zvOER65BdY+3Ob5$1s&vg)~gq(#)v8hOX$b@nlbDmQs zigMWII4pLygB^Z;f82lGkNbYy@B4aR*W-F$uji}S^dH)GVoK9d-ErgIMrHdYPJLHY zQXKA-)7OksNe)J3;uj)_(fm5a8>YoHeQ3FO^q~e;<+kCotp;A33G19D>wdXbr%#8c zZz_fy{A7cDT1+TjYb`IswY9IZj!&!_=neYUNpe+%2etPo6IX5=AG z;Ch-|{}h}OmOo$_HhHOv)55ljm#vokaCcQ zy#mUxs(?iQ7M^-YUM-FyPk2UAxu{~Ss=EcLy4WAGhq>qWCZg@xa>7Yf-DklnTjeC1 z#0t*GiY)|wCj$oTify^6u~xAzC*7&;CtU{1cgeu=l&uH5f)6NW$g`**`6CrNo5fq0 z!^;sj6ae-N1p~BIg-@*AsO6p)%w#$A7UnE|@-GBZ;d4@%nHgJH+!PCV?&HC%iA|$6 zNduIP(|v$Y7Nzu++D;j#E5p&lJVllwaeL}AY#}XpEX;UgbB@(?r9a~8P5&;&;v1{X z$LiO_d44Rz8%W%YomaUvMu!1>ZJqFPX6z~R z=iI&-!rAc}fwilc_6ou(FaFkal2!hC`eA7EF-bG*e~BLw$R(agwW@&^vY6poDc>BZ zaz-MGOCcSA=dU+tcLkJ=2D)?wU`|w?O#vVOQWTm3P8pRVuRvIa5q{C#_?SbFW?Q}p zu8l63OL3pRSzz2BNlLwt*)}L+{&Bz6&0=Qn``?su1p2o~i(&ge2F-%}Xk2#JV09eP z8LdL_nu9<6KCv^1_lSs!en{!!$UTL;m#F>=XjD#`p!ByHpugUAd$n*E@^!o>)}`tp zjQO-{eP8#Iq-pJNH~f}9*raPcd9>v{0{wGAYY*mYAX#4y#PA-EN@l3pKp3SP^*=tB z<6HdAtnc#^*ryxN+7XvuI$ZkH)pe8`t1>Z+Z`Ca`97lHAzj+k2OUB=DYgq9DY z;X=xR(I!nXYtT(_ybaLoc`~0I-a^`ffb!Dp_i)G0ypLehuUh^G|u*Xa<7vmZRH=O1+K2JQ{~z>4M*=Hks|2NC_CBTa9SE z;Jm%8b2#7a5;fUvJGD7Uox3!h62|M1uSb*+ z#go_%#(cNd$9#gECVwKfZv7IMj?$9ULuu#$A!XMnZffCl$9@($>LI|^qDH#j@TI=Ul4>{O5<7E3n;G&pXL=?pIb~+_OE`NbBYkIGb!?_jZBvB#Ud9yO zc7Mg>p=IsYtnaXA0?hBH(WCcMW<;O-Mi=&Sw8u!Rf7@#rWZq-f+Fi1QPKfUEHqv$u z*?RBZ&gyq%8 zb)RMy2Kga?vuhR;P4bQ5PMS!#lPWUENgenZjaEellQs$JiO+D2`J0OB^ScpK?soyJ z_mfqg-o!aAcEoI=F108#;gp2n2B;jlfzsxPIJU;_uKg{2i$iQxKt&nsmF04Y!!_E1x`1Qr-dh`ax|;;io8kheWP8aJ z8UW*uGV-pa#iY2&2`b$V3$SjwwCQIeqrYvMQ=nMQ2JA*=oqoThZ#rzTs@3K;rE=GI zRnl5E<#`0gS1$>$`yzQyS*L$$+e=+X(yP;kM2`=P%nHTdWQt1oVgjP%Hp)oxE7^$N z13M}QcJBXxCXofJk*+?t7)pO5m4PkyF2Vhe^g6s zd4LUdS?{7yTLTewb~`lXcC)j~JFn=4F{u{mmlj}nGl@hsGs39`m=isMrt+Q{M_!iF zL%uk$_9Y-sw*S^gEWa#5F6%G;kr=bT+T8^4(dQ!2aKln$&b&zlcHJF?#(k?}tVdy6 z1ygp_&G$=4uB{RLzZGsyZ82NtKg=bWoF{(h1<&!*J3AaYM_$gQJ{9<4xc^j}DKRHx z`tA)D!cObL2zW(Zv|=lny-yXoOu5sN2Yg@idQ-psddP&J#$i8fe&`h%u%6V3OaLRT*p=QpUtK_=nx zYSYApz8~_rM88^D7rLm*DzG^= zBGBY-W?}x}^&0G2Zuz&^y1?FBl9OFujuBn)VdbigA>|h(?{`ceqvkX5^ zA?hG^o7YUiW7vu}lA!?zdfHK~)URO>pfb?^O?~2#a(&b2O#OfIIN$Or%73kDV+U(z z**iJG4hg(qhb`hThs{z(b^d%{Ev;HhFkh`Gc#oDTZcGL!qZZk5E4}PrvRr>~C$W_|am30R;o<2P1q8J*foI2AKg2B?!>UT@jnC;V zNkM2uQAmtN(=VRhgrt>Esg2aUI(c*(*j9^hbo(Hse$~361)OXr3vz~Z0EgEj)q%63 zY(Z!OJwhJ&i??;cN!2kZtex;_rcpkW+L+DD-$=xTnJ3Jd*x){MguAb9 zpahF7iGY1EyyGSK&IoaK9lD~s^h>V3Dbka~-{YtB()#D>FP`L3$$Caf^yhrzHpluY zeH0Ls*9}L`mN(y}w^5CGb`fx|@*x!r^oz^jD+xe`y zj%<+51DR_tNTn(_3Vhz09R}eR7+WgDkBb<|$@^pOjhibjQI)mA_Pu4tdmjIL#iM-b4JB$^i~U7Wzjj zaaT}roW?Uv*ZcVXg)*xi6~1K%8A&K)yY|sWb3Lz{L$w+_l$YiInu8CHO$H8G;ZI6q zG7(|BcvIg;jC{^C=Cb`QSK4c6WG4JJ!({c~+q%sz5V{HIN{6hL1q{`gp<%&3uP3j@4KueI+z>4Wdu9}fWjj5B*TPv%)mslL;K0UE$`S(e)+(RshSM{cqz zGJ>N=H&Iv>$tVE53S!9IP7>X;1D6?_U;dLEn@>AOEubA5cU2Kek5K=;ibIvy)Y7iU zNsCpvw#T>e8k4IJFU-2Gca-m!1ia&-&w~o|3AB%tLn@>0)|?U2g1miH_H(35BIEc|5GCdj=g~KwXa67Q|HDL|&9G zh2I2ESzGicF#Qp@_9z7GJvLZP^3rKB>0T2#V3E{xK^BG*L7^jHL?Z+bX57zZ2kRk;MN8TQ{r&<%^eSEIS4;f!Ul z!%&9!y8<@;pxxm}H7PB|gluBMC)}IQ^eMG_;>=b`4;NZlWacO_B0IdOcGhU4#xNSma3IR&`0LN> z3JHg6PFXcfee`o}S?T6Qy!{~yXhWCw6Tap~I9Evn)jy+Oeef+Y?*7pkb^bXta@=RQ zGCQj1u+L>$^4I|0NsnY$rI-e^U{MJY`nB4Aeij<-fv*j47hMAOB}Y*4mFKYCQeWxJBwi>$FnI z&n=RsVf4Ro%@B8M_Yq+BTK?&#ZwmB&*?sRs%19icX$U;M+tuk8RaAOxGH@3IkdhI$cXD@tZ25lsY@6uZ^pY*Jyr1i?Uk!a-`90?_v7I zykSsCY*b|lmR`l5tgOKx(Q&BE{!UKQ9Q-OylDgtdMZ;_Y>yFL*HCX}0)#-d=ZNd9? z^WFcD9fxNbB`!;2f6qAjoJL|jP>#84w_r0*-G`IX%Fcl7O_rqdno`#*(ME6G=~6{k&wE8C9>CPzu~xZrch-RH!Q zx1!74tCe9tp?jp(0tJp0LY`w@ueY)jpyX)2m}a4K-8ZC4cKS8e-7U}79{Z!y4K&;o zFO@%^pIv$AW#!xL#-@d+y^uN@`iu94#uc#iYc4OG6?uFqLP2=ac+Es|HRrDk#wGU1 zzQg@StE6{_30&eTUP=P?t+E)#sxRrGb8-aKxeu?_+>5FBDl=dTl|me#2)kgml^fJ{mvrV z>eXNHaW?o86k$1z>yFIQtgkHrJWS;UKRS(vX*jH~)s~*vOHy+FU_B|?k~D>uC5owm zC<~&$1Cv{3#RWIaJy*KpdyuFbe#tBa#@n3 zq~E0^RZBKI2Jhx~agK{9i*CWr{oz(QM$(Tmrn<1yPIzB+8Ep8;`a+CLUXgbn0%5Ui zIV%JhN1hMV|LoRpudrepp}9PJmBOV(qr1HZUeq-Z`|FR-nqL2GZTF!04VQ9`Flf!S z>)r6^7&mlyRM%q5cI2(R5qU*0nY@NF6)v0A67)GtPQJt3Ky zjh-jj(YpZ+cep-V15k#NT_TQxv`#}XSF=elZL7lM?kz;_9tK@e7cBZOME7YrGpsa; zIR(Nyk6Kl*q14C2gz214)Q$E*_D``KZe%Cc{a=1C6sjWPS!RfxD30R-74w#6VT@h( zhy3zwI9`!j3(e^Y9hNyWVHEY*T3C#OPo*4e;neb_DU2;&c9P!8TT^Oc30QbD%pApO z#fmdxK_bgU09#)b$$Ts?Tv}K8x0@3D;;|rn6M0#3LU~Fs+Tkc1RWcNeZfX(SP%c`} zdoJs!+squUJ2*O0XZY_D#VCu@5>s3!(ol>MR*sN0FC+O?MV_%uj7yzvG0?acamd{% z@oB+;;4{=aqvJDCLj+u98@O#=oV3#%?YE0vAwFbu+3$!eYhm3q!-9*U*t%jx%D)%! z0ukJ=2-TdJ0^33J)Id(u88J^n%Z7DvPsYYR{Qy_!bBd8QI|i3tfUFB(qUVChbYaQc zq09`L+IdY*L4czU(v?IrPy^vh+!=&Lf|CmfJ2303TQ;r+{pjq>l>U)qZuPAoJaI;sS$RvzlCCN1!z;U0U z7+v-GG(WD1uz{vHhl^_Yh<+*D)`)i05+ZL5m3r;!`(T|mhQIB5TSu}eIY?4i$_KeP z9OPV2l$RRKdoR2L+y`{WM|K(2+Lb~{5;+c0ITkZzm`gjAM%ZLS-qC~Hsc$Z2Ss$qwP&wzg}S%CpyS`{S5Yr^uXU27#oE&pj}VnuvGk- z<`&S8s47a7XO&xy4*D{!YrV3BACz!4QY~tHCFAVvBHs;b5cYGh^D-g*kyoZ0@J;_d z=H4Y}@LuDH$bqn2)GK7{+j3*c{_V1w!SiY0{5zQV&iL_G&#~RV>MTYAbEO{NW8u5aB=him#KxHj~y|MX^pU&Af0g2+NEyFkyN$0SY)kSnDeB8WwDbx7$ zMk;w%^Dy(AjDDT{D!*3$s11tRUVnr$9oAy%&bG7@DNVkHGQK|(KQxd$JWBfHC>hdz zX!p}9GzKgUO<0pbM0T%rrX7n=n-s;sO1*|kpNDlBW{~rsD~E(}wO;ofu%Y`n&`S8! zK~3L+%+maUkzjAI_|Cd0%7$=}uhN?>`nswUc*^N_0@qZ6=Ply4?gPbuL9PCxufQzy zqykwRe*qZsn!=9ni#+o&HHa%(Nv2S^A8XMge*KKJWEP!L|Fn(ZEjzxH zw;mSS7`jb*e*+exT6SU1zdAScdOV3+M@J>Ky_09!cKWBCnVw=ci>q`_=yrsQjgC(~-ZbPz^dac`He+>9TVSaEeFD>VM^QZY6!;%Zj$0u}?oO%E|8#GU^rV3Ic$qc=KA8qvk`#45#Y%|}3 zIQ92Y@dM>TZK09Ttkf*CL2I@}{k5HEoK&d*H!wURCuUxIjoTyH{6Qdr^_ch>hn5zR z1o8RmGWt4v`Kqx*iC)1-^>&r;ta$gk%bRUI!2w3eb($+NB4_+;RR;O|WWFmQ57HeB z%Cq3e&$Sqeu7oznfQW=tmeBGSd@LBqHHo$?rtHJ42e-G?HREF`N3rc3c}_vi73k9e z!2Ex{ZhDzkC#BY$^aU;4J@R$v@@I8((iBdK&^ zX9YojcBay7Nd<7x(Zq<3{O&M+#y}E7p7V-WA~;`c*)!|QS%ev0a;R7bea=6RvW-J| zn!7E$%(UD~`GAN2JqN5!-EikKTb^&6Y}o4ja~}5Hns=u=$@jJ9JR2i*`%Fskgk_cz zeEZ%u7FzQkH4ff0pS>Gnj$R&tLJC+%64vB+r}9&u=cgqdqatqw1GoW8K}#3wuf4;+ zVi)iD7n*~WQ$p6n&+(O*iCImO(r1dlz7W?kzu7oyZ@U*lIU z)VtST%?$d{i#T}-7(J|cQ5?)W1Nie>X$@!Pc7YvzXujWkrj%<-xf=~`fM7qPuRy~% zWsqGLgnRf$Ol@JsTV|(^qP)^j^l!h^07^h^7lka7%9Rv6lM4v?i;giO{3z=~h zM8JNM5!brr7ybGS`e&|>vgqfMY>2a?PD-jrf0!abEmBdWS+T-;s|kpc@@Wk5=QU`~ z4J1GRg)EI(pidT0KG=9KeKzxs^iJ4qi^n$TnPbX9ZtP!{rX+oQ|!#Q4HEP!TtY{)Wr=r-@JXJl{Crc%KmS&6^CL8U z{T+dcZomO7B*Mx35(W*}Dfzi>19UbzDQn5JV84&4XS4>yDr22eG&#-4g;=P-el}lm zC$@k)u^vod`nOK4TQ8`zyf?1G}-ck_y`Np{rix6=F5-CR5;oDq#M~toGB{(MF3!PARlXTMITG@uT~K23j=Ie z4w_WzsTc^QF7K@5`tZ~iky~Aj#5OkGYY(e&E6=fjVBY_?6Z*L>k7{qU2j`XtIWYXL zB>$x7QUkcx7PQnXC#ev|@yBJmcVDV|_1=7I#WKwI6@eEhb!Sb4Fn zY%66#Pv>Q*j$2gVGv3&2Xpyd+eveGWg~Zb9rF|_K^R6IC@`1nfk=a*JIAfk1+IT3A z60j(bD$pBi+=8M-X9Z(gM?dMhiZDSIB94PuoX$p3 zOM+z4=?ycB_4WK50j|gQN1o5rI%++VFMN!en3gf$g6+efVWy*Z2;Om)%&DN3T1}+( zaF<~>5uBCr+L(69Y2Yo}Hxmw0CL?UYUioM*J?jle#5@*^t%(I)p(I640tq`vra&5v zf3XDpcQtsRKiXmmt~-|;acGvC1{Dmg4wG`0PKsuwPq1TYCQS+;x@Hsu&5w3deKq}xz+5PLf`<3_N5rlLPTh{ zJu-3mohixN+rH9{pE%jY3M`1DB$g#&_wCtAYf^gsf_S6QOnci8c+wL<*(V#4%b|-% zt9DM>1y14nK6}mM#YbfNBu46=RV7Rk*KW{69g)PrDAZ5^wXM${x`8qeZKmy0Ql0^n zp0q2B&}MF?iIx7%J6y0h2a`lfuPS1kuBUQuDAHal{pxJ!kPrI_J*kz^WH}hE_HeLz z@6z`Z)0fj}R-a247oI11&8JFyX$nwN` zj~ze)2U-0EK=@}j>O*2#?wbl+5cR;xkf148wbTHUbfSU4J+R0=6Iddf76V`L%CaiWt_*t2@f!?i`)24zXQr-V zKy@!j0JLvX$CF{#L!_7VUJmu9a^rO2zt*E0C(k0Cy{Lpc$hf%J$G0~PZr2Qrr6>o^ zL`|8ZR%aTJ+Oe`Y*B(u^?V5L!b#8pu>4R^D`(xsk&fDR>1($j$)Xaz%Tk~4$S|I=i zY!eg6)ETg-GF&`TrN{cTo%IDsQmgm@-{#JVj?8GQ zyG;RZ!G=`B`d3Jq9PhS3xiFddce!}A6tOstBd4*0t-0TOy?bjBBlKB(dVdjZXs#Kk03Zc6~bLRCi zwo%5kT4lqIMiup0;kzk>#zQv@#{LEO{2w%JFau_H|LkP8$%AAj}GQURd-r5*QHHe!d;Ig|z;p zJ(%wgYOV)vXo!=k`KM~^v95rCP(zaDR2S#6CTAUp8EH)7jJqLv7-a&A>vzs3`%h2a8+{*@dC}Yl9c~BY=oUm=A|Zk*ob2tcpKmuS=v6?;xfLkVw1N&nYD` zCs%^SXaI?{@d3UNIg?9A*uKFSH|K1c6Mr_6baqXDARLJ>sy7=HZVjFnQmp=wa%4hQ z;mSECG3($cE)DMB@_>!}mjIwe+mcer9a0Sr01+t_Q2@m8^8xF*Lr(yifGfSO{d=85?%j2vGYjvdV~d}$?6ELam>p1 zImB)jB=HS^0VRX?^xp!w5sYX*vm|!3X7w-L-`gCYf1h_&s>XUekFa|Rh;O0DY;;5H zLyvNQU#2n-t&>A+{R(nEJzTKlWcwOSrd<|mX?J!xfpi8OYDk^_$J zKkaF+1m9L|mybzTlX;52drOMLS?U{U(^~bo32BN!%9g61YQSsnxoJy@P?=Tz9$B zf~2a^?+zH~2}ULwX^UR+VR-*07y{hoKHTLp+zZ89&mSf_Wbz+y?|A2kUCHrRpN0Bu zM%o_B<7}CML&)@?IQH!R`8JP2FXQSh$fNhRGt3qhqtt{6$VP41Yz$!U?_P@f#=Tv+kIK&BwqB#=O}=lmys1i-D*_AGoZP7k5!a)3ONRTOeUbG}+_9tP>-AAU}v$>L}xgR@(C z*@yMYu`ay=VJ&9M}$|{rxs$i!bA+rM5 z6;O0rw8gVeu>DM6`mIjcgHHY}Ji&Fo+2}q3oZ8My|0vyF%!|08+UwT5s>X0b^sVn& z-2sIL$6WH|zsHZ2Y$Iy*qbl%jF2i0nyvmcy$5EX$YdmpAZ)|-R?>yN|TbwOgh+dN= zGo=?L4(YQb55SMU^>fvCi%y4VF%ZUX=b~mNyk;nN?dBG=>#>N(`_V7nq1+^nC91Ts zL;?9_5Uf4Yp$EF-GwBu8+5D9NLbkh_z<+U0ayc(#YIl$y{VKT9C90gX?y($H^cap0 zDZ0O&ZqFF?O&a_Ko_Dr$R;@Ea=J9b`7myDwqy0LA|J_Ej$=ISo%8um@$<3?QTMN!f zqD<+y+fDuT9)vp*7Y}Aj$p^9Q;D)wCa9XJMe(8wQ8A+J|>2Z4;e*?GS{~e9xpiV|l z0||uvplm)Jzu%xmPWtZeCp$JK|1xa3$O@mI%;zqasxVlp?=dv!0%&isNuq$K2xNOe{|>ta!q8v$!0 zMJv4bDDqp9C02i)3}L*xgL|U?-S9-;>gL@%*&J|yI%&z3(h5`aIbUZqGyLbnap#dwZq_BJ=Dd|J#W7!B zOVZ!_{eC6mmBk#%=9Tz;&0KqpvNmNT=Z5z%Y9D(Hc{rqoX*QjUo;yH`%#;A{HQTk4 zm&c8LfOf{r8NqrHr}WTdAf;uyju&S76FdE}6^m&>T=;*rHKkML(=mozo$vzs-j%1`m@>bx?C{m# z?-7Ok&^|uxMP`1oH5>i6@(FDxaj%SU5fJ5GKR*kQY}4Fg2RGEJ2eMjWG14nkt?9Fs z;BBlk?XWF#w*))d(T1z}!~JAm0_sT;zbtX=-unH&P{Z%G1rnQ$s#BHi4n+%_wdT+W z#hLR;m7e-*Bd_RxGFLM8w^-knq#~tTMQJ_HS!eF4NL&%}*83DrQnvfG(M)#VoigcD zz-+J0G-1z1*L%u#BGxiE03z$0{r+vM8toQ(QRR>efd2D9_A6Bzs-U_M?W0vim$>;)OfbF&piQS_!^$GR2ivjAHIRsz**)xc*Qj?8 zR?PmO?y`=zZ8&2{szBSlF$)RbFZ_KzgRw=p5K|ejt1=oj{Ml|=?<|78L1)vZ>#d#_ z50HZA_s3*05@K8nZ3{OR!ik}+wv#UBe2r$^RV;gMmV??~WYb~<+0ETOxE|3_9%AtH z2#)zu49wtoZ$fQr*%Dk8)R)Zsiv*>L5kOWFpOT2Z)7`_)bWJA+eAmb3ksyI=U*qi+a}1}yGuNr zwHdMd!aL{qKANK#r#RYWvx^nnv9kr65vl*+4luDHHtEjZxp#NesZZ+TBK1~JYTAl> z`NXf%M9Wr-j;Pj&s-2;aKFLcc+qT;8){U^Mf3~{S+X2h<#nF9}Oj>OXJybShb*P%# zA1zwXm`qD@>9SaQ$lH~v1<_Pu(K`ZRb5zQor04@CCmu@*B@m-KO#yBB`vRG=y65f( z+AUP3!Q!J#l)H=bP*K}f;lrLpmj1971)?Q0h8uzJP+Y|>$QD;I1dN2Hh3|W?gVMd- zNb&;g(jyCK$Lbu(WctXrXnoZ{+T1nn)(L(ou%71S%|<@sCEF8e?ysSpSl@h7iCH_P z)xLVKZU13vhX@%-cz0^A^wk01t1ooEsS*x!mi@P3C5}()#Bash4PMTY(NwT@HkGiR z3-%}lbROr(+?{Bn*bjR*BL}x_jXJi8({#AwMSe9@jd`i8=5D8dLrX|=e-LsY;Mg^) zz)X&`HO3y&=iPj9Mo`3#j*C?r9lQLD@*xhF7{rWm*+c8XE62a$T-YQ2V1stqw5~ai zn8)Mm1C>lA+X<%Rn9iELTFkC2{m}b8U{sDCeHTlUb#-{;(RcW>Qe;a{m_u7sc1FZY zWA~^D1(eR$S0d7lnfbHBQyNnAGYKX@qMvIQVu1FP{XePXjX zJbsDM55oWO#+eYuQf42zwT$g#Q!W=F$}ea1ptb~~*bd2v8wP7N8nA`mx)-!E?jHITx&UT-IocY+AspYMP zJXUQn?Vy5qFrZGz`)SNM&c;0XV9oxR<`4&d38ju@l^)qa|KHX&k>1o$%Ms8_S~vbR z?yKBr*P=Y=1sQyBoz^_uy@~68IGuO=dxuDOU6GMK5OFj^S)yAOi__EL$h2>o%^q57 zQV6oOl1HY`#;SCW#x@->qCY&WDA0X-XDV&L=jfo4vu?l+Bmb%vk^O-h%J0}Rmi9DD zo@s|tjCnik@B4A!;n+2~Ae+dq_W=FZHgk@?Y8AcdQviOv8(ZG1+;Wdit;d`S)P*Tx z({whIY@aipWTdix+bal_x=$HEVLg%l#_eTl^dpR(*PEn|YpYPYOw!Fw;rOrH#@s8h zdZEQ*YSjAS94RITNYc{GKV_X-m?qoj^U`=zPK#;Gd^|FPyVvOLSB;kmHnN@_o$LRJ zVMmr^7ECCSxV1H@$8*k|b`x?ZS~C{>68#=Er_@3Lx6~;HWlpBlBj;c}DldH9q~AAj zG743Y$%U!-XFW>dLBaXC|FPZ8P$}WNLhyuG#@X*KlTOt~X`VZ{dcDZro}C#Vw)AhA zga1kj6>07%RJ+@}ujUll?W4bU;%r54*ynE1_03+dc>86qkT=+@P3@)jO#A9X(-!?( zo`B-S7o-96_Mh#}>@FUohjb(ak)?)saI7%32! z>r)~EWZ9a1Ax;9nIaMI|fbZE5KR0-bmTFS(9Kq#p%VD!V-h3lWUY3II7hc7jMJY)2 zYjP-?;-R`Z)Fj){{V}$Xz{Ah*te(2(B>!RPS@v;#Y}2!hwDc-eH`f=NZ;;=~pY6=K z9)hYEd&>#z3VY&?2rVgGCGwk9iAJ6ManBj|W=I#F#;`43s{Fx}G&yfbyH9@K;4~Z| zj$xR03T;Dl$Ab6K&o|y0q^0|2HX9JHXXJ3749JUYqPAr?^hS`gVLiN82%F~!UP8!0 z!!c8Rp}!Hk;Xtl+5fyaogc%`c{vsQDX_1I{j`ZpK=IAR!u%GtYIsa+VcL&XN>@Jcr zA9nQsptE~2aJKUhxe0&Z^PlQL!>o>1Aul7T-HEYv!8_+UIw;xOkPT4qgncr{cuVu8 ze0|GgSh@h}*Egd4OY_YRoGCz8)9zyxy3fwvy#2%e`KTiq{evjyKQIk}EG-bJQDSfc z9xUq6uZyL_Z?~Q7yuu|nE93#-j_aS9htY_7^cx0G}yA# zLeiyny6SplD@&{@D`i=31Y<;Q4dd^sN_!IhZeLtv0sD5$rNCdtzHvz(@v%5_3$BN! zM+?bK(x!yCeHT-0zKLV&dRu(JgsvyAvcWX`h)A2bwmr!9`Uj({DlBVH|L+secoX}8 zPnI{}Q4$45o0rxFjbDr6T8&2zR>VI#MjSCljvP})J;|{(ew=x?vGfc4&D|(h=Os0+ z0UWYOe_%Jz|1Vzny4gkpzKtyyI3QsC_^F#&AOtp0nUW~}9 zdl1!*f_|04+voKrVz$U)msJ0G!3`HR7rs~J4>)fwYpK#2P>d^EhlNITb0x}j(+dF(EMiobYOv-g7J^ft!kW8 zUk1uwQ~rmTWJO25rNgzEb~07G9rUzOopAqz(-!VjKW+X4>T z#_8l)7W?;~8U<-IJak9_p!y*hoSlnpA!@U=_*Ov0(l)aydyfBsgLz4<;QpsWsqjaAvIAE;F&1z>n4lX=iT^`Wh}rzO^nFIBL}D^VqDS>D#vxnSCkW zRGGiWcMI-+Q^bA2P)+h|3rVM#PKFwsV;kVai^@i~65oOP&vXVKhC5*AU*I;RfPr62 z{7V~|O zt(3!&R9V%%X|V@~40qY@mr1Xp*{jN{F;v*lbH@T?*)bj1=PwFO0yMuMb<6Raa~ z+$*UF%1-*Dz-Pj@KDUh)L~nrDkFU$CoA;H}*rbs{HJB$1l^}0XNx%o==TJ?BV!^@r zFp{Ad1O8KWgg zx?m0Ob_8dF_CD=!bUPxzNU6CW5Jz`RK|Zyi{Z5iePPa_xBkmgY3NMW;m{3{X`h54U z8I`E-Hqf^0*x;Le*_t-kzIJ@DyXwrlBJTDt&7dzgw^Gr&tSg#Kao@?$WcP-bb+(Js zWk+BgS7VW2DuI9DwX z31Uk%xOd&Po{FP)x|@8V^vx8Ae>6aEw?;I+x(`nyUBzAi8M4Zr|Hy79Qh#0buwM_Y>3=evD~AbLt3|@xpA=z#AbW*A=bw#h zNkBaiDn!*ZK9g1iQY~&o^gJ$CS?pL&z~6YRD=7FaFRIEjA>`jT5Pj`_v?8*&p%gN{ z%!T4SD=ha|f4M|Ws>*A3^vU@a>8<_vy)xe?<#@8#VLSb4x;(V@EZjf_T9!ICrc|iu zs|1_XD`^I@-oAaiC&4}Yzn!bAt2+P>H)m~|obrorYC68UdMxmgZPRk(f5RKn_6I+1 z)hu9_AQ6Ur8BZd=7y7-r$}Gd*jF^9w%^}GFm~1%${sJ4o=QLNdQFa0)NaQ;lq|*my zzo9tWx=vA(M*dD}iJE_BAUTDno|m=SJ`=!LaXcADu^9HfnY!+XiGSo}7H5Uw{KY+` z9L%(vmPN9icazMRP-m!onKNZ?3lo1DMe zk4V3K6c5BfX$~(*yhI7}NeAzQys`7dRmSK~s~;aEZ@PoO(8_Xv@P`B)Pb;qvgFSF- zMw5c`xA~)%bE6A2rr^?dW)O$-1mi3nlGj-a>7Y`dlaIA=-z%Q@$zt5t(YbH<(KsBW z|6l+ot^;Cw5{kRo=Vd^u3G8`%NbHRhQIot(jmBan%q_I~^tOlz&FN?-h~vD|HZGr? z2wjdWSPAPi$ADj$fYXFiUI0eBM-;?t(Dwl9CjGnkbxbF;AN%*b0q~-*Np11V{1$>Ec>7D0poH~_j}v;bY$Etw9hb>r;i-#>d7_+8>~2GssP%ckRsoI^F6 zL(OY6M4k^+Bx&)5P;UUu`wh3(HL7F|FMWqBdk&0#pint6>m7d2nOiw{|&tH>$I%3UwJa|+Z*&Zo==ht@;MA$hi*8-+G#MYmd{jE`)`(2|h`5B(3 zwJ=2X5&hs30TJ1nluy8SJJ2d*bY;OlW_sF7T&Il&SxX-5Bb9 zY(}K~5U$4iMs6sk5mO1W8Q$yQZum0Gsi$a6ZKjh_93S!i>ZJ(M!D2+fvGJL3dYFdr zHtq|v?BAOG;%b<3s)ecWs`g8M2?|8EG2dsF2D2|KS-wk$S}9aye0<(oxL zA+0YiMCVAb)R^@w@1v#O)ved?BUa=UCo5%N5CON}@)(v&&s)e2##D!h56~sEv9#Q$AMR>143umeeLgtFv1r3V{SB6Jw$62>)r%&ofs;^PKF>5O43 zZ_~g@bR4f#mYNdbU0I%JH>%eseAsPYw3A^3_58jiAC(wn^dT*B>M}m*kS>mLoI7IC z_y}3EJtYD<+rnZ4*1xnz-q_!KsG4x78}PuK{QGQAst? zw((98ubf32YBN-I>Plq$>Bjx*%35{n*3S&QSN06w-z5B<#vW@gPV$AhNWO-}ie;9aS^k%Fb}(8|h)?9+B86+sKmPBl^im4{-tg0l;GVkU1V|#j zpOFD{#)dO8DW0 zk$C!Q`AMltFhpV;3v70DxuXTU@NVUsOpd!@Gagwb-yx%o5RvF{Ea{T?tI!~JLOSukK&5%4)mp_H*(A-i+7 zL{pb=f2Yu@b>yjWDx>&1Jafs!=pDfJtFJ_H*s}Yx-%To>dawN-7$AOfWcvyzs5=T> zG7Edqi5tyrDwdr&3Le-Xn@$ors33p_VNZH>S!Z=QW#R;zbp-spC(XQaFLrXt49fW^ z)n0_qQ+b8dIUsh>GcfRI_iW#QBy9)FX-E6R<3V|TX21$dCfr-2#f1&#+sh3i;vjP4 zeO7#dH2fokz3JdLd+)(QdtLlHd&eKhO6{P|N^RUf&JgSrPxHnUZ`i)yNjGAdJHa6% zdWib7^O=GqWmT**nj#ZWx{T%ajQf3{PadpP3YxXj?qB>txsRb5x$R!|j?>xw)~OAB zPFSpzqF|?l_IGtT4tjjs>R4`R$j=#H+-M6payl=x@`4%h714}K5n?vcX%5BDoCni0 z^l0MXlPL>yQj*&ocKWQTI)_#4Sv&TB4wf^StUx((C&#ehm$*F7~D^5(Kqc16FoER&w8s^OSw zI0?AWS@50G5?gFs=vRb*7>B-OXuIW~3TlIE{a4SaZ}!2xGirYn1nifer~0_-uJ3mI zccl1pSm!I-KYuQHrUI#dhTB7b0W9YTVks+^Nsm_Gid)(C4kJC4 z=cwzJEr&^PdTv5oExAdNT9gI)SV()9j&+Ge-Zn+{u|j%aq#^a#KdWE}rZ$VS4dW;t z^=vcReZyXP!$0)*1HRvWk{b|vOpQIjL*X~8vOA05%->4;fs2*6o0%HSK)HEFj#Y3G zCMtPmre5#6$TaUb3NQ$2!^Au}Cu=a9RlZd>O9 zGnb5L!R>+VFupyVgfNAhW>ajUl)Xu&lG)otIg*quTrin68*q{|>npTgmxgtYb>(9B z_)5(*{ukzK*%m5H!4P?>fhT_SG@Zfk7K+obg;JoSMI?`&h$fE4N7Gv^;BoZ?kj|_v z6y5m%-J30jzVYZthc925+)iDKH=#)+xKSmxo-8*5y$0)mw+CBbs$2g7{qX5PHB3A3 zHYOLSMi_27hjYz1blz0!r>FM_?`aH$Qxr4zGzRuA5?ay-z*zM}ID8tTN=pf5HFg2f zyq$9BhuO;Lt3|&4zck)bq4#48Qy()&4FW?4JAlA3-(#fV$m1(hk=)C6=vx$jxbp4F zrECD&OL!!zNB{jmg?S{}VO#+HE@i=Th?%X9Ug}gpiX)nLHy-ZeEX)6wC5~N_-q?$2p z9L=k3N6wI=4ICu^=|0ris@-)@RJfiWiK+K|GCr)OMnY*xk-D|iRu;6hSH~Nmdg7jr zcFAMVq5Q+nV6X>`%Zcwps z6kBW($Fo(mYcoD^s6rS%6c6e>H0>wba8ijj+#rfdUpPP?U+4+mFFTIkoH@0*=bucb zHXcJWr8xkM7su=w36%D!W?1PmZZz0B0R{eyX`<&XMFYLzdZz)NiJAK1078>5Yo}pA434VvEM4y@!KyZxfBT$4; z28h#%0g4|3$CdJd;|y!2U2tvYnha@kVcH|~&P04dV z7?qr{C!_}U=#&8fFmF6Blcqi-o*HcN)RGrYVbS}}Y!;MLwpZKj-?In2^ck7mXu^CC zd8e%CXza8zKc2_GDN(Y%HoL7PdL}fJk;CUeQ9KOp`Sl`hAuH zMv}^0p+OQoS#Mf0&t*f{H(nPqz#_s3b2LM&2SKvuF{Ah@8Yk_#EY%2E%hTv-6-W}MJOK}sw&lv88Q=F37>z@qfzty#Otk~{0k+BRfI5ayW$`edMh=^jw86>gaI;gh$2)v7`D?fi!XG}BdyjX`JNHoMtG zm?i5$#X@pd)`2f;5@AGthMI&%E3r2Se2gkZk3+2ivVoTqlld>p-o=r{v`tXwGf*Ul$eu;1H?=;3*i_zn+37Pq(F@DWe^`qHA{29Y}Wgr6W1<2_kDYV3EsEXG~Nzr`gGW2U`@ zFcax*%E~un>EVmn8ncFMfqqK$X?D~~BtyR&O7QFhf9Ubt^W;YShHyd^cmZQ2`BM5S zAEL3$tG)r8doVFx3s6~!My*XQUT~Rpm&bV-@3~BJ4puyUOK5$2Ty^wwH=ge-xfGp27VJip1 zlmjm~yGOxbIj9RA+}x?3%0=7$%4HgqREPeaCM9h6`?}{A-K|p~mD4cjPl6}@Ybx1z zj|zSms+y6?WXo5iW}~+%X<3!*b2gRVoSw z1aAq)oXS4YESY^89FJ9{3E$#ITu@XYs48;dC9~x~(%AxxcWZ?&rV7%i=qy;tmOADG=JRaw~m%5{HJU>ufn7rpd^|OFlFIQ;#bq8>=x8 z*Awi?Mv@U;GjfPdPyZ4QwO3*s-!5k^emTbC{)B7QIfmRKyM&E!15^}MXY%vIo@`QX zfKkZ^yn#S_up1Y1n|dxKmggK_$sE&{D~>Znnn)6%S$J^0w*Yg!Kej8!KBge+`3jin z|7m8r#0Nee{ANF*gg7^Zwata~P58)9Xe&fv6;TGf%67pgxoZqS@8PDe>NDYg5XUi} zybV?x_*VwXIFPbub3=DFjlOdV%jVrmJyDdEgLS2e-7))M*}nbNI{KlPlN|Xi%SkOW z^G{U?p-I*h12Y_9!Y$IgpWEmP1)Z#D7vxfqvv?DF5IzPucVI93j-Vy`&dusv(6n|M zQC5(?bp}bcQxfXyQV1Wx#OV$mO1+Mh)5XAMNgmh10ZGL{FLBMj(M;K($>4ZK+YOqh z3Sfr|DJR?l=QB0Wk0I2{9b%xyJEFq7K_yLZA|o-C#ydZue4lX2`(!m-Ff_LPx=GtL zQ!{(R))6Wrk;->2-u=Wao(`c~{Wx$a^Osoyf}=ot_lR-j^vW17nq4?^#023uvWsve zFWGaS?t#C&rahP%2e*dkW{H({!+Dap_&Behb>f)rWWP!qtm3=>xx}fmWTunG`Jzjn z?|!A((X{h}irvFR6i?VO6kmo4xR=1XfC=urm1#p4xtkT{Cmp!6$=z_QgUjWZ7U!H; zC5Qm$cs;{)vkq~a0OfjOxchB<{*{#5?#nS>i5cxwlIuWpta2v%Twq)(gJ*$*%~d0k zI@VRgvy}{yzx-xfkz&eWstDi+cw;}3!<`gd)LJ{tVT%FsHdM$t3mMDRav8`435Q4! z#K7sgQuwVqH;mZv3~ojj3#uzZm@MEX1)Wb-z}-ov8cZe1+x0JwwRh_Jats#h0=AAO z3@hCQ3K28TrwuTqPDT;6Ol!mU-qf}z@^3;E5Ix3Iv+xG|0AvocSH)MxCdvx@LOvvcIf2uJvpPDv*~uTRU3_I zzXf)~wR-ks@`B7uxGc1x*94no9|_YW2Mu&<`ALek+Klwh6ap7#PrPe$8nS6S2jTv(g z>^*rLN>Hm+Ub%9aGxnscP|L|8;Z|-P_=yGX4*rE?lY1DmK?jT`#sTwU_Fd<*T5SCA zS*Lh)FFr2cTC|#!t+CvhQF0dF4o@a8gp+O|&na^q#pQ2q$5nL=$T`d<$ypWT@!*wu z{DW+^@XHihU1vmg+qJ)Yvzt$gA7YM84oCw}1_3S$v8*t$_!x}nemKuMB7^bhB*Hl8 z>WX%d{FXV!1aGCtOzO0B8?er7dbi&o7t!?veGe0far-@V9TU%FT-pydB6XJF?))A# znJw#785bzru_+Ud55@3tj~z4P8PnTwy)@I3sYlr5%;K8iwCCjGvNwluAwy8Oc;9$P zFiYP6VVqm#x;8t~Q{HAqkbc+rL%)Ox2!%1RR%1M6ZfxG+>N47g# z(n)(Tr^+B`^a1B)P+o7ldkH3A{Xb@YOu%2~*6-JVZmU!`%U<=Gi(4>h{ML64W>9h` zJJ=6XSjB;xI1X;B(%7n~lEeLzj#hWF$wcQeuX3Z>q^|+oMmr;&B=Obh^zNDqy&^Sr z*^)CC@bUgxWRHxr0S_1B_8I%PJEZ_s3uJzDLuftAfWQv`r}{yX2GMb4cz`S)g8Eju%vaWk&7 zPBSuphFVLciCOpD4i)oj)W@A>oW~9og9aPZ2hxx7>c%3~);rQj&Nty&$2?km%*Wid z3AzETv}Qf?0pw{8(cx&+p*Tq9D46IVKI+gb>5Y24=Qo8nbuf&zZTl_DXgeW5XI^f|$5{id zkPo>e>o;+VPIj0!bz^ehvcFL8=bD9DbPc06|7zUgP?qc#a@k7gcdGHg=p6%3#ztWT5i=BX0{FNRL81hW)>5%q%zsen+rQ1AIpg$ zFU79kj&2Amb94ka6B|)8`r#g$C&Z)8}u)ONfh|)Id&6o`A$6-a7Dw z=UODi=K#v-1_g%DoPe=NL(XPh$^6OalXHXQN1JXZ0E%BZ2ufd77>%V%*_EXiYW&Zx zD7_|In1>o5THI#t%;HK7##DLf5c8aPd-J-^y;1{A?D&<*I8M487gazynQ?vm!esCz zWL9!J&s!Cyl{sXauDqnr_cqCd=j|uAj5THs2FYV<9xHxD+(7)w+s*&%%toIKGXlp& zXX{JFc@beM&$YM0$Dhn5ma44uSl7hpQELl`KUXk{1Awk@C=Z-lyF|G4SkXz^wdg1- za4a{Ar!uvj&zD1!yUp9Z%WxbL1jUe4{qi~y%(VyJmZ z;^NuVuD-Y7)C*n7ijiF{uLKU7qZQFz$p#*_nXp8KuJ9#aUj1X}gm8koK~mUvaQ}*T zkOsxGOM2j&AdOFdnV4>fJdR0P6yoYgP&P!Jp%ivu9rRC`_@p{RdegiTH!C<4+rcN1;Q?E*koUb*qjSjLL{crVoW3fU!oYL}aj zYbKG)3zi^$po`yR-_E)<8F{3qN>DYueCUu+`CilUaejh#e0rDT*nfL>31OL%f~NfP zz;S9K$%1)C0B|l}8Fs^IKj$s^eR+}KUNEqZOA0#;d!iN&O7*&{o5`I@U= z{c!A;3$!w^9V9?C|7sJRXyY$7mx%b}t`^WvCywcUo?fNaq#e0RGx9Cw4tJ3H8zJDf zACRO5zhsZ=m0V)AEUwQh@P#xuTW>yiU|C6bDDJ^C#$gDvX@s3rbku6k2Ok1*qfsCJ zo&o-95P#Ycb2<)PQSywPN8Ry%6}>g85w`dP-?odT1#UlbYoVpViPiM<74T#~|DyD* z7;e&Qwlc{;X*=9R0do8Agu|TKb==i7xVIfLBu~<2Gk0_9v&K0Rs|-JXD8T$>V=T`2 zcT{7dc9fBkcS!+GQShG&Y}ZV|)|I?pk~Ki4GSRpc@7i3Wu`(qQDFtk45GtF$)uN@= zKmXBl2d#<|euZ>3D}z))1B3?u{kn49Gqni)HX10$1quuoi~gaB)W{2my#HG|@9!sQ zR`Vg^t%)k>-%nWvx;t23h9Pq)z?6ho&l&&R(cto(%;9oVp$GkBElLz`0wai_U^57ra>1Xsgs|07I& z##afMgPq>7)V0j*A4Z&NvHgx$KWX~o{J=Emga4rw&0m>FQDUNV!Ijqj_@$eco`-@V zjWnaVJdJC+tM%H5&lBT^DmG{J)0OCY`rpWfH)4KD^Ba_ABxVDRKtSttds?jKolBdoYBRcC9RjLDpkf`5WB7K(6G-Il zxd4&%$YU#^9svbTVt#MI><^nVpAjH_=A~P4mukZJ4FRpbEvELLMmY^X>OaIQhZw<( z)&N-yx67i$N6iA8kDd;u4vsFDhp@H$1g?W6OK^@TgY&;-I4?3NuD*!Qd$pM+WYbF&t(D-1pX0u6O7**(d-;{?nV6TWg7Me^ZEfEmxMMY1`5{Ff4$+h)X(QAS)*mI9XwJRHNyw#^IEU1&ob7l1$OUR78Laq-uLe&0 zV3t0%W7++4OMxt|s!IdBNT#TeZt5i8;jf zAA}tF6>P8f9c7?1xtOVD8Y764xhy7cYyF5EJ+rSb8C)3gk}1_< zPXIFS4rVo$=%qlHyiJ6`F!^Itk7u(T`TW@GQpC^lGb;hn!k96g<@I|#nVNZjJ1b7T z!_hG_?}2zA|4iLe6-p~b_;1@e6`Jeym?wZ4E`#Q%i!0C9{WB1`Aq`K}NfCRYnE20D zM8S@d+*im@j~@Baf@88pn>@_IwllP=Xuc4GU0H^_KxBa1S%i;}D9BFCWI0avIpE7w zja}O{Sxt@@-8}HrpT~n0$-v+)jN^~8-5DNX&n{#-f1<2&l;NH*{<5}c?CUSg^f95> zkDYq~Za5*u-4TWJu>rh8X-Z4C-nPM6&f6 zL~W65*hFr4g#D}#RT_B_|7Otvgz3*t_) zz+Zh8Vvrr|kfhcBR#D#Svixg22Q!V(L*rZg5S$#Cc=ejS@?;NKs2m`s{hBz+*)D%$ zL3VJHE8TpI?=otmNg|?A0h?_`;)+qoq5d`jg}-7Qw7;d4`T7s~B7Zl-20$5TrV6Pv z#t>tx|Jz)D`LX`o+dxu!n~;_4Wb(lm-QZ6|eu|ho1EUZr$KA5|jz4y1LXNbptq?M) z3|Rgp4=?qGJ^2p^n*AjHMZ;ZBu2l1F=h-4ZXQNAcW&BYcObnE4#$`tS z#>3d@q15imV{9Q>zooWEuAzLJND91@V<$@?Q*2MX7o;D?{E)cIR96K5Ts<1%grikn zXVJdIGe}YyI8bF@Y|I37%Zt(me7dM`Te4rz{fuhF7td#Mk!6S(z0@K}P^5B6ghH|b z+!(tiZ%6So<*ii_I$WW}z>`W2q*KDlc5lcBCFxOLgvpg!t98Q63^PA3rx;zpc-yJ| zZA--LvK35oJjdfxolf#1Uh)v&;^qVk0D zCZj9An3ivA92NOz9V*_@^Wl2&*ie+5y`_6bVHLi3(k@g$ zlDSS<2RkrZ8i;>$=g)_2{O9dCd7%K9y8hO&|Abu=+vHQPU{~rvu`=zdcx!_r?GosL z^~C&E3r(kZ(0eml(#}19vwEz}M_A1Cx%kRK4Xg+ljo(PW(mn7YAn@}nz;41dOePA` zD66j!4jTQNoQ8Ud8;SouQn9}K8oqr)=;Pn7jS)WwZIqv}HG$Fat|LD)$Pit+_-->` z?jnfUo7$_7N?>AFLmxls z5@ccqHx!;OE=e-@^i3=9E*rldfL=q&gjl+bUolT-^FK669%uHn8bRGe7lb?XLOTy_ zCm;T+5E2Kc-j_BDuf|-j)>A;aiLlFW5(goi^=crp50B`x?K1rI^;CQHbB9jrEeF`J zI!GQXWBcy?zfNjF`}F+;g}jeo8=@|qvuBisvA6P%r?7pAMZgV5) znfYSo=HLG=fbR@$1tfCaDCxd;>9~ewltctB4ej1lm_pq^Mxu+ZHAN_o{km|8G9LZh ztwQ8yji%)y3ML`DB@Y1hBO8<=^=v-CREYSFpSM_2<-&2&YZv337zlVe{gRPl^8)+j z&r$W09q5B?zwB}EyZ`26&~KPh+6ae&Rvm(|3|9l$h9$UnU_d3BA*>*9#dLFCCsnX{{g8HJ$WZ%zgylMTbu!FGJt2 z<{;kxxHYz{pR-tN$w_IW1A1ivy60uUp-YRnCa60s&e__B3Z&MyzASlDYu!;tY$kia|a-*x$g9Zl@7?}xrG zu6Ch6D6k`LR(^<}QGWm}gX&AQj{$Y(_xO|4dD zrwyy&_yd&n6W=O*#Fdu~KPtX2vw~1(CJKq_H72L2UzZDChPG3x^6Ym%$_3zu_v$q` zxewJXji6UV>8`ic>O&GKPU476l&C7!$&I_H>d})WXu+Yldy84@i_o(C$zQ?Np6{?H zf;E7Z>J|7^9B}OEAfzST*Y)Ko6E*q+iV{Pk%4t6+hn_H;hjzXfr2o}oBR#GU8WGO^ z@YjlP5AZU!9?~2Ct3B$DBxbb+n&G|KqYXn)BY5J)SQg`V`Ml=|nb-UGS zEFT=pb=7z79B7Nl>Z*=>qTk+6mG@LUs3j#maHvxf{ye2`7fktHovlZM7lJgYDs@Ik-97?@yA7T-^Jw1M(@~lyJoakRB8Q}Vh}*I- z2T^sqeXw&i+O8Crkl?ql;bh3?&|NgunN)rUE6e5k8`S{b!Srn)-1WcWkfriTz z(gfsb`5k%7DI-Y4iIpCtKkB4KV27*5Ht7-m;o6_-)BVk#m6xUAVjb$_+D!C`0?)eJ zSx*?2^6AAFL5*p%i|?~GDapgk&tD=GsLMYapbH9``E=_%KuFwIif@UADuV7{H8(-M zK6TvPlrL<^xju!2-h4SMRbKf_LT@wL`7buQno&a&jihQJt|E55EhCeP7)E!36fs@n zZ7@sugcFh-AMcIv9r-C}r4-|5^R}T?iec)wxbi3MB>4(-nT8*xRo%8M=@!~{V2hjb7lg;`8q^6tz}?I; z)VsDqa&zkeD*5I~?@YAXu=6BP))UuAEpxQCj^F%dPE~?*_itlqRneAq7g1WS<&A{0 zCpep)hiPVfdB8*6yDO6qVne?S=l~I3ZyhC0gXn+HL_Mw;EIZt-!F}Wp%qLy?6P=B@ zH{stmkS}T$eJT3hYSW+-{C3`nnq2bgS86>{;9ccb;`~GBi^MUMA1dS7n)_h zus`H{0|Gd8v#WoE%~V=%Ml|2Ox8(i);I_%y@yyCur=cEtTEm0(kLM+gbIu(Ml5J)3 z2+-->gNxhux*=gNAI02!roxChJ5zM=D2*+DF*nfI?81`P!ogQh-3v=uO*PE>mu~Pw z?td9V6~4(Mqy~u23aoP3P2+LG_p z&-mHVbD7@CU^@H=%1*(5NJPQ7RA1dNm1zNmqO(6+5F-qP#c319bxhk#8 ztC-Z#DGR$%grt)3x z@cCJoz|ba@NlpQ#Ov0B&>!@U~?LkH^Q5@tcjk3q@%==kGP) zc+iHRU;k9b3FHxCm2Ki=!8iGlG0TsePG5(atTOoWPr*NHg*5pJN1JWK{D~~*FG-ax z6phhso_^ugvck+S@WH(_N=XSRNZds{+1QB}Pp`>&# z$^Bu2kCw08CAC967JjeowvVO%_<44NcL>zOWTF~dd|KnB$8ZgBg_<3fscieyaJVm;~4<xJQ^FeUY-W}j?Hbd1zp$}Doi~54f>N)=Rfdt zw(P5_X1?_Nv-om(d$SG{{7G7C@U6C?7U2sUDc}7E7!TYXX5>i7yWVfgHC-UU8R|%y z5rA2^CIh{=QG}szRKHN)_;WRSHz0R2xGTMC=H%T!vvqu8au>dR#nzm!iuG-7DC=9Z zeevU~w?_$ep{}GsWsL;;&&6RtXlG6-QpL|-=ts_aZFwdmXw9*IG0mtudUW1`reJh< zZ><@aX7m`>bwfe_;tOaA=!=c|>Bi8SRtsL?yMH3Y$d~E_PdBd4mRgnby;!`?l=R6B zR)@>B>r)?DYIy3sT)pdTb$8UszwQ3r`vYkMGrOh_@1q|b!qaK$-y>0KFvx?4_mLSk zVBfLwuPT2bU~p|)xdi>)v*2sSmKyt|52>|QX)c$)v%3?>;(AVlxlZ#*aOb9%HV~H@ z-yp5_MiRHB?G%a__YWej*O#>0ScSOP4ep=0*yK|!da!5zZDRF>^}L4BOp=84Y$bSp z;p49y?2CG#n#HoDxUWW9{uDixE#_Q}#)p6h-5#5n%DUdUwfXOMe_F!sc9-}9-2Fgi zDqH^=aYd!m(JcMBXSDmE6cs~&x6W;)dv##GQ7X78T*DUzrljzk$+b-#8 zp9@~~=q*^|yd!_%enjs!t0%V>ud6x$$&Y>u6ay$C-Bd2^Kljgy3t=JAbIWQj-Q46 z$(k7({=yRb%w(|cf~=&+aj1_pcHu)r%7_*Is(L;4`oB|U6)`(T=w>Z6WKHB1*;a2Y(q>0NlUQD?C4W8zTFfC5SEyf;z`j0wraouFpo-W(60P@h zz<-asLu}~6Yr4awL}9;S8@7n`Y?06;TU_NOJQ%H@^71IjI1wxmCwcWlbXpNIhp3$M zx_zgQC{QzG(4~a_{zLceU`$blqYc07Y6|v&?K2N0VAb1AsoYwxJ+YW1 zA8D5Ec3fc>ni6Xk!sqF6CS3&{qlX`NN4l*C9n4hKmw75Gp=B9dB?80@L zcwC%U#*_trOsLfU-eD+#-NWw;#SB^{$|t~}8PVxQaVXvv##4fOKmGY&IF7x5kYPeH zPMht#CpOk;ws~5hk^&(z%}OBzunvW_W`bvf(g%U8r1193v|XhrTWZw4$c)1I_@V_p z{H5j~bq~^)M$w3#@pPqxnG{*id)=(LbR29aHP-Vg<-&|sQ9o#`&NPpEKk7a{_TdWs zRPbhycY~E6D_qnJE=rY*Ht;7f8%=;D<9jp>{L5i!7Ncrfz4Bi<9$r1M__QcSTM1f@i#)kt zaxTDn5Nqq*5huEW`!cvIHL)v`3-#w6yD@Ac*dZYc?`4h2fX>l^Q$R800Mb7G(GT3~ zGQ|4oY$u>#fPa6x*T_)9)bQql*%Qo%*&z$w#a0!37YCQHwZ`Q3GN-^}Ce|mLggMSrTUHsJDfROo5Jm=`hJQ?UaM?KUWFr?>A-ZIAV_!_;Pie zo6^yI6vMRr%X4`9ei@rMIe$WnRX5{iR-(zxoqn3KKNn8v_KZV+tEG^YztX@yBgotA ziGFG?#-RI*C*$2~cxT)3Iat@r)NEAGhgU#lKVd7Wee&HkU6E$fzmK39#;up}rZfq{ zWI5Y_3+QA+7i-otJ5H2lONG@@M7KF&vpkM1lw4~wGAkH&BE^h|tpl4f^tqZ1#uTtO z8&iruKE^n6EoB8GC^k7KO>=Ro4kb?}%>mwT>g)2otW=??sJ<{h`8zt4a|WlM{ct5f zUb@d#O{AE;2I!@Mv?n`<-doS!tUJ zgO_J#x>Aawn5lq2mGQZi98S+X656;Vx>*PM_)C}?(UN7Z)zyOPuOrP5 zbQWF;xzjc=RhrX70D9TePQhZ3TqVvkF%upK%b^`7ThkFJ;^m-U1G*TXa1U};S!4TF zBv&Nd+J;(7+w{Va!74xM&uWQ!hIw!rg@d?hkwzC8r;Vrn5gbF*yxebcIkia}e7x>L zYjZze+DKb}j;|bP>o8Z{JN8 z(1ADNo*PK8d@ROb=DxE%ym8TsTw#8XN$SKZV1{bQeWV=aZX2sWZ2AW3&nhcx%G&L; z3IvXoYC^O-rB5Xo-rsg0P|##^^`v&~S`=RU|y?xDfei);$${WmhP{73?ZcYsjZkCFJ7TD>HDW<%3_IL31y|SlIwA zZ~5yANZ-x?`@}IFw$2k=$ZLcH$bj(a^tR9KxzYFTBEZ}$BvPGQCDhS~llE|-6gG=h zN{N$bc zWeS4tXJdWG(@l^|=oPh-En{-r#@q6V(W|t?W-UqP7dMi6h!pD(q;ko4JM>p%t&Ot+ zhi|=)Rct|W@U<_81U{W$GpU0fv!~Xarek*&hVB?|OJo^bjN_fnA!Pt3(W&Uon{0Hz zar}zU4|}I>9cgeq-p_|-Ua+43%xfWMn&8-5@=U*9%&1vxfOv*RHFu#ox6FEGq6k*? z;AGiH#9@Lst6C=bQgt01X#Gfd(!q7KSQ+w=LIbq4*#SAJZ#IvCx_3iwesW5-rCrcI`ZS{ReSEJ*1zmvZLOoqEy2Si_ zhyI~>&nNS4uZYw-)E6&A-#y?4-%sJ~)TdLWFuo6I1^=Y1aG%h*e#c0^H&nUk;ku+- zgsUBOnOp3##3hBH)+wLljytBu7`B!W-3N{o4hc^Uvrpyh;xusFcV_m?pA^qi=dnR1 zG4dIny7!lRunjh!vk;geiUCg4yz*QMuJEn|{H*EL&1A}}uq^6sVctzcf)nB8l70HukT#dm zjylI!fwwKtz4H0x9s6OaMKN)G;lMT1c0YyKGx@YLvEp!w>XCT!0*qr?v2u)lUOuU1 zu6tK#j>GiC)ve+|+m_hUm=<3`=$*0)l&=9T%RgRz-VBuwazt0i*>*p^|z7HuaC^=UxZ3xiHKI( z@x@kW@YneCZiGDV*qx(D3NzBcK}<}ieJx|f>@Xg|**iFXE zM3r*ot7y>p{uEs#i>?D-2NKk*Y1%8+c;n~iNucAw&%dg!y!^V?-m7Y{e&`z9eR(e3 zOD$Vc<|b7p5K}?YeNXZ3d-FFm@r?dqh38y4xMLOSy4QWIznJR`&N;aM+OjVeT4mtz2l`DvJ zry%2KJ@7;3>vmiA@HotT1&JvioPQMj_faCMO>B8`qPP0pNRD&x+_)3Lg0>J}BKV}} zc{LF4G~zw0G49>G6#4L06ga62nsZLb7uB1VZ)LdTM-9tf7j72`PjEthGJ~S~= zJKcQLy(3)y04^=w)e>%hQ^72f<}-Zlyuh!-ug8I7_g^WZ!qNY6_Ty%0 zm8np0C|P|)`|l*geK>a6Wj|DJZ$jF4+G|Vw#}oNUj{)wLH#6g7)t{N3_A&Kq7ni~Q z?Rpvd)$Of%J4S1(Gma(t;~uloVQXAXpRSpOs&Ds1&=!qfi$$2VUtQ6F0|@iK(c4dB z>(vGK@3a*_(H3rK;7TG`Wo5pafeGHI%(F7FL@+3Fvvta$r+i(g1K#GHg<`zyr^S^g zTg2mx>p6p`qZ5U7^J>$vk7u;(Z^|#FiBujpg=73C~j_v9v{Oi&+6ZjBj>gD>t;8D$d0|DaM z^Z$2cEA`Sdl$RRu;qaNP>X&chy!;W!@|l}EGQd46x4Jy=S5r;qFnL7(A9gZR(-#$G zxEhdrBHH-xph8Q?1HXaCC~YerYIF(^`Qds=A6 zca9P%Oq#P`Pj|N@lGwtN9ts=rCMk`uuum5#pd^~_ZvD9ZFLFG1dynS~n;VO%hn=!= z+d63+^oD*TfBn#-;8M;1GmQr@A&)+q zur?%MSKuC0!%Pms$;NT-OL|q-1haUVM(4KlJq9@t8}IADZ-i@D0yNLU)YwVA9ju!- z!+T;8g^cBjd9p_>KfxZ^V9PQai6e(4o?OPU@gWg@`Xv0%vsRPr>C?46PAw3he>VPR zPN^2K8tJ`#eM2N;Q*a018rv~Sp$QRLk?UFu6|&ADAyC#}q5&mXSlI!vKVAyOj9Tn) znU*5J&^-*ZA44}?rpC=JR_4z8{s2S=X6U=my~p$rqY0`WnLP|oIH#OPr~+97TRpSD z2O5iWjxj5HJ)oc?%&e7WtXrkH-7X>;$VaTI9Y&WN`Borfj4^?o!VaI3wNcaAu1Jnq zKJYLZf#PVRzo%dO3n~c#tlSpGu)QalB1Cl7P-UfBsny>o*iU8HVOlhPW_l^r84E8% zd%vZFt{l`~0=2K2?Y6DWLK+VC0J;$3D3<|yu{39VlMmYk?eJ2Cc=WT#T9Y_vMdtu| z!IzSMu!H1v%$m-fb-FwCMB)DEt0?nPgTEP$e=^9UOeMW3(NH%%ferURKVEB1|4<(R z@#&?XWenvD8Rre0O<~ z{zmo1H`nuHUq8PC+_O<;fBvvU`+c&9@w=0K*VJp^zSgYYv<%tl`=OPX?*j#j#&@ph zi_`oN=kWf5;IA7u;&L{|?;t$LNpem$@8Nx?5Z^2%{tNjITF_bb(0EOg*BkH?v!A}S zr6sm(KRw#nxRLhp3w)hD7jS->lt29gV2iLF^%{S$cJ!tVrN&w60XBZ#7ygs?&GH~| z?AfWNb3b+!reKcDTTYP4f61WBddEYmcpWo;ONYccI;eLd9}eeT`JbdSkA~|1|9B<& zNT?JEGexD6RI<;Q5GrLzkv$0^ge=1>Nl2C{Rw`hRBkgv1A+TU@U`~F=qez zo!=k#uY1qA@4KA$z3}zG zm-#kCu=4Pd^~r!k9{;Tso*pC?ubO%OcC;)yOL+k)+m|wY_)xFWB@dXhy^_oHrq3fq z@`=4|^pWBwG(g{R_|~BEDVV|I&X=TN!ae&3>^#fcQz@s9u=DF?$_h%!7XXE(Ya$bV z$KQY|$s(wGbUjch>x_5~3#mSTVwhi3EA9l5iUk#dDZeVuC^r8)YgKwjwbW7|-Jmq% zCHDt0ne@5yyNpL@+fE0Z(2 z4-z~D+K({hQHOJo`tsz^xOnxNZ+x2niZP_j2feyC<*d<`C zQ`B(A`U7^pt3js20SCI;yos99_Oiza`#ZkGwHa5Q)|t@K`Zj7aW%xw?l3CJkthod? ztl``Z66&tGgaBjsT!(GJU1=*`D1g@q96PD@Gpe?)?80}z`9C;p+6msrv?Iu{G*Epl zB>y|ei=;q!6v>6FwEyt;xYr8vxICz+)@DAG2(?V#0WG_iD2Q&q6W07WI@xDA^bBS9 zKx2SbJxqHKe59ekSMf{R&#O&4hRjVn$-d(eIA*IRMD}|WLX5j)hXcfN%GUS zoFAC3J+*Vs+lKcK_}%Yq30FG$3R8F9I;566Pg@`1Q_2n^T~!xgKWU!35KotkBTb`r zMh#o%og6lL_E1cB^tL=chm_MmG5`$dI_~pL^4Jjgb|*ncoPf?3oJd1{NCO6F20{eI z(vdiuqijr}(E6Qhk00U@I$r|bdiX9V3?H}dLFiW=-1$s+I2L4Kf)2-6hb+3!kRA=_ ztWAuCkXMB>w)J=h^fuiravV!zScEN8sJIj7WvB9hqY}<_9!}b69$dW<*Ask4xwg4` zsPIoL(l(m+5f^dE4W{!2SyU2KdkLatW|ij(b!S1;@xRWfe3=2-UE{i_sct{?kX&#Z zF7`a5p^i<2KK4JlrxN>X$O&lY6)U4g;M+}(kEcZ8cT-=1A&cDt>}GY$2^%5AmHQy& zxA1J6*qyJM+tVJx1m%MBFQSxnlkNU%xN4~5_+i`jFx|;x1?%cC_`N)iD)Dp)9>+S^ z48+%MMqSAWf~5sWR>@s5!RK)f3{k4qon6*^3Qi`LJyNP@g8#KZcR8U<0)dwNLvSJ0OUJgQ>A{x3Z}{1ER=}=O zz|?#F09_&4I_QIHug$(#D{H8wOme(igoo;RKHz8t=jggN;jX}AQR$-_dd7PQ&S$wXg zal>~@WBYO&fi0Yk1QVk6siy3iOaRbZ#<#jlv!yDe zAW%9U_BsbiZ{ih=3;3pwBMz+HW{?x2HV{1sqe`|yKVETkG-)){3H5kAuAy!`<@K6v zck!rYs60Ar=cNZ}co@KRGOj=Ecd3SWSCyLSVZ3Hin0XXmIAx}o7ifg|GHxyqAGG^o zgI$z~NoPK)RHc6x+5YX}Mgafg2B~uV_xj&0Q)0jFH0y?WY*a_fGSo(_9-FfhA>2f? zh0tyb5b$Eb@lP4>w(gNOUZM6W`W*Qww47%bcWWv~`#tO0QFgrta3P%FU_3iYyUooU zmtbC~)M%Hx1OM5c?I7-oH%M@M6y=1qmotJ(M}iWykHC%vmU&jZ3Z-&yGh5z)r_C6lfQQr$#+CJ_~&c zG#+^?8+Xe-Lpy^jnuk|^3y=Lq)G0j9NgK##SoDOv*m7(;DS&N%VALQT0jfLwhdLiE zGhda3-x~9=RIJf+RGdKwtEKJeq|wsv@Q1V^zS5ke&er-)r8Ct@N7xAu+MF|P0s?kD zPLM-~g=zIU1xo|87{y=MyB#KlNeQDC&daFwtPP8}X5Dgat?6!jev(ESyTzmX#@L@z zDw~Lh&gG>hnY#nU5DUc%`y0QSDQ3m1Zqh9e@Y_O~Ab_qKB;4H}dshy1B2f8qYHGE4 zdrmyz`-CPzA>UbDo(G5kC1`(SeoV}_s75Oz(Yjt6=zQl>jM#SENA0i>sW^r2qxi7E@+gYn87O2CQVyVxx@TcY` z&JF%Mt#LX)OL+TDoiaQ40QW^qd`@6fUu^6(DxZ9Z#a6gj-I4%&998-btNm`P{f!SP z)Jd3SQm=L@;2`({-Bh2KLz0ml$I+519r&jq|CsZkq&DMT%Bmu z`enw3QD#b=hWOeflGGlUgS4EwUyo1SYLRTgp&y)bQ}unJK;{!feK&nZ{+vNRiDnoR zPUeT2r(|R9s1b{faUAaJs7cX@WZ5~^%La5_uRg#g(-aaiF5wS+m}xYb+NSBHO$}82 zpnui%D^fpGTDY-tT>51RJI@(qk!b`@`-{wzJaqNXb;!%krRNKI!<`v<5qTD;mQ3Zm zH}Hi+wO2hSSL6~PX;q_em0^eW`{PU2ky!N$dKk%T-gY$Utv|;J)&)h&&##T3=!MjWa3@(VX$$aFXTV=w$mzt+9Kd^?qmPF8iY_UwK`p8k*eUyX2#P zF8WEYw+)VT!TtZ#7>wcQLk<`gT6U-`^JRyzUNdyV?fx7{ z@fhWbRy8N$390sFLmTp!_M-Sg@L?)Jve$<5HU20Zb z<wUrt;qK!dwF9q;kEd(tMQS8P>i$l$%uJzSrC0ncH zTx|_~LjGztGbYbE8}mLdhO7@r?)R~=nTGcbjU+ARYgndOl&0itnAzX8v%9PF^Ef4} zKq*?)Gg`@$qPI~puQo}sPLgIT6>S0H>OLZy4{xB9FS&2b7shy`(#d4`2GqB!PCWO2 z!X3nWZTO<(FO;)|o~NoyT>w45sd1N@iK4;cP_ zU4@)>Vl!&w2DU1GXKX_%;0;-F2mhHVD^gZP(06c^U@WTpVck@z>&>YD@&MF^<{e zMS0^nA=-Gfk=P3w7b7qWbj%d9+x)TKI@Gj@)UqnfL>nk|xGZ40s%&CrX+v5JHZdW^ z{t)^?F~~}Th_VdI-s3)1Fn%(WL-jIf?V)$b75=*ZRBT=7Sxzz7pqmj)Xv~*-%s56- z4#i>Fs%#5+e0d6Q%zHy%L*6t!z|5IHR2G)9euBP_Tt^U?9M!&6C!6m*V(@Q%O>Zi^ z5d+Sjco>w!yE7HRc=D3}3^;B4h%tIdY)y63it~ut7@Xa5mNXl0hK#>X369l#R@wfK z=u2Rq%V@_1{SK&7yxO#ZeTrGU$q?$DLkQP{4Nyx*xJ^U(tB;{FtH|_MJlRDOh|D3x z1f%pDyBq$x5abG_f?9fQM^)y)H|YErqDcD57s1tba8>>aou$>PZAXnk7${ zoX)ZE$ti_4`pf#k_d*0DZ_ieA5VWOqTImp;3!qjq%%yU4XKKVRric&fVJNDUAS~OL z@udvc-mq*>TB4NdaS&4U@ExX3x7(zVeO?IrB8{p}KDG{SI93AP13^0Q_5J;zpq9wM0) z&zlG(2o_*ZIl^5*^i*a#lrV&L(<_7KhJ|CzjI)uN@t|IzUWU(xIKC)Cb6%7jK^RqS z9v!VPE;BR!itB$vRe9esqCIVA!1pBj?Jsw0S% zkw}~|qJkB4xV0WN&pkzNJexAt-sl3_O7`O=`wqzbC3-egKO5r8QEyUe%D5QcnqdmD zo7j-2i+2O@HK-myGhivQDd@u93I$TNxH5lu*B1C?iG7R9PY>DJIL6t~fX-m8X(6>o zIPfmI?dxFYR*AF1R5+v?PEm529?e=BY2bb5;PQyiAjUe|$xQcjhh1C*7;3BHdIq|i z%FI{kHb9+s#9QpOKor8`gm_5XD9%_ANdb3U1v1|l`HnZ(q{8p!#z2EnR@@pvWOE*A zv!%ore~gH;KqJi^_}O4q6kCl?h?-(XP+<8GbE!Puf^MryLseQ~CtGEOxqHeI3-`KijMJ7Xi#vQg z{vAcR|C{l7@$Za=OSo-n=APy>@U$|}3>U&%Yb#!1Sx5Cc&;hKzl!PRtL zZ1QQpvRplIPVym`lCtQgo{6aJFJ_XYZ%PkPqk&T9q8ZP=k&S_>5|uFLR$Fi>$@7H; z5Mi3WU7?F{W^uCUc7cl_z_BYHhCk4(YhMFl@}ir&%okQsZo6)H@_v}6vg+LW zK_vc$uUS`EovyMDS*22T!__`4S%m#GO=sIjRR4F?l}`sY-I z^K(BBf`2ZfIp}0zx}lBhTF?vYqbU>HnK7^Z9bHEhJYi<|lEpu`Psvg6?#$n@LTW*~ zkE>+s1*$72cQ-yJ%P^gk#mNp84V!M2oW&lNx-!a#3cg!%bX&pZdMnCCcmY`Pv9lZA zND|g5gC%abH15pztwO3+O`fG zry;W~53(=WnE&;4T3D_4x{HgoJiv}iliGfhCbiWm!mdjT+P5qBjancO>?NX%UC#!+W=J84+>I}Ea z4~H^aryt1^m2%?m7lFn(Vpz-b0G2z@0#lUbZCv!0D^}uhzB^BQTgN5<4!v8X7iup7 zlPVcOsH$W|obmY@k?7#m5#>&{R>kHPL;QJ`j2LuOEmql)Sm)!ZdA)eLcIt|?ygfEsqdI8`FZ`ne**I(6p&SH z3yU=Ni?k2gTFReT4@Kw?ZPfnyoLp#MtGc{Zb%?AhF=7xBC9hk_7BS}JMT`nwwdEXM z-H*EXj%8VLk<;t33H4&;$0GhKk>6fOd#hr>eXn^n)IGWF{2;QOB86z>-$?xQxdh$|(6Tb0t&;T7%fn;+&CFe9hc zq8h#LXL#uA-ps|_G{Bg6#@ES|sBL$h#>?bZ#@t*Tt_bXFqKv$Ut~0A|+h>j(50JAF znRBsNP*~@s4`5$9bWi4u*nGQAHMi;7IF)yD2UcO})2+R~M2*a;s8W8TxV|<0apd|5 zzn4hG)ooO~z#9d7v%c>EhKRZmL88WB-5mE$i4=EMH-BP~1-M3awIK?+PCs0Y;$)5R zi)ztXqS{A5()S=9rp7cqrG*R3=F`L3DdNa`M?eE>UgdS7&(;rh9}m_fL0(4 zx+xrYggL$}m9Bg8r1D$dlG%b%MRu%sDyLLN)!wsw z;voOgwQLSfclGZ!9`t&lJ?7(&a!ldzu2cVv?}L}!S%q@f(3%r~JaIC+0#K2Y3B&(M z*=cRB`ZTY;+Z#Xfi8Xj4put9B&d#|(8yr1SdxQaKJ;GbGW1| zLwQQR;T+e-Yr%Tg+!C*#i9dGo7XDakdE%JQp#0sX0VAB@rrXOvDjPU{aJ+0;nh(;g z$d)B0Q@@gsN$T%-<1;z$p}TUoyk`8VY~S&H1mW>*uN8kNA;JT^rJFP&0=rcrMgCps z;OyjBf6T4UH4;UL^Ysy5v+`(6NEr@Ma4e-8VeYTqtz8YP6E4x24j-s9Z9+))zBbx( zx8H{pSP0HIKP4Pe(E;Dzc|~5QXok6;Oo^ zpe?e4KPw4HbdbC%nhk^;p{RJaBtV8DEqGD>NCk7Lvbb-V)hytHdQY^m9pDe!NOf8^ zj?(Ah{2t<5fd0RN(9g2sRJxPAig`z$`#{hP<-We$2X*GPHJdB+XNT$M57CFm&#fuF zkoc)mWatl;xZLdX{`q-RA#?Xbq-ut&R3)O|$c~yYcuig*R-y#kv zi!niQM8?RoEnT1A+;u&^=Gv0y&?X>OU4Y&-exG3P;UCPmBYb}0A4~Zj)6nC@^H!%y z`v2(r+GEgIRJD&8>UE6#sWNx0eI&Ut3SX7sJ9m#z;$9?;Evt1M$@5s<1Y3B?%~u6f zKv!2reV$G~o0nbiRL@45Ow0-5J!QE6*2jECtFH5(B2oIJasj5fGJsub10svPlTPZhHdY%E}(fA5WPtZWFhe6ZiNbO7p*Z zx+yR95oJ}0EL@^5??MCcn^zm}Th++`A@$68^QEuraV;zcPJ>v~zmtvApYZ9hdh8w} z-#Zq?b@vh{+j@npsV>a9{-z_ka{x{3ym38}1f$*=5qe1|bQ2j@#lE;5Uazb@1R+A1 zn(rB=6$af>a{6+ydq&1*%@DH-Ju)sFw#8xCfc9j%Aa9ihY+ z+*oVOux{-sGAQP}@h;}Q>xlV(@g+u?zp4(g1IKL|q6)okO+{6O`Sygs`ySao;QOl4 zdp3mVXT}Q;lY&|+&hJm)pU+PkP0lvGXB*AB>~)^}z4G(!baK^4*000FW22Vy^`hfs z&rO-peqL#F(7(!ne9vL^Pf_@qFs7pkMEyE%@!hY8wK@v@Ic(FBxFQ*VASf-(q za`_sBDrZRV2r<(uQD_=AJgG4lC{2t$nlTkocRjtYJ{46(YLsHzj3Wn`udMs&7w1Rj zyA?8TWfqmFD2j%NeN1Mi4((230@E~MtSj4aw`C1Xmk=w{B_lL)_XRlU1MGzf)^rYW zZT;X%NCsQCJ=I667oG-IAt^vl`(57IJVB-ArMiK88v3OP)}C&gy19XpM2XSffii7l zJKes9VMEq@ikWet{RMDomc#A(c!o=*j`#a{ZwsjREaKj}rMo}Ty8Z#4Bt|_Dv}J!~ z{p@u52w(^j@|J@2fZoC8`pN=&TVvp(@w?w>cG@7CANc5ck`PUv*wi)1jz zQSEA=^E^O6@L`VJ+}>_>?QFDoD#~#TWBgT@L=+xH5;RujDtxM+;&C%NMdM2!-;3+| zfq`Zz#f?i`%8MX}lAEiSE2S3Z{ihiju2YHIME`WoRm0Hs8p0f3iDc+-1F|Du#N?GKTR{ti&<3**kiOifodnpHP(_RQm%fHB z&VXD4v}kHZcPe0f$#XJgH-(F4M2U1WGTRvR$~_Df6cKWF{rSETx7qk9 zKh*3gYGE=0{DB2pKeOJdM}UnZ+xNHS2-QFX-vo!e;mzocXNKpC6S^tn|B!q0L1y45 zO?U?TbaErOCAjz3yxSJ{(E3Z%3_b$2WS&=S-^!LAKhNq^FP#C)#Sv=j{o8aL5RBxdsw;sGbd5gX3daO7>=w43gRE;UDd6MSU-nD5N7 z_VTR{FnoJ{*&rZ09+d4!7;qOi6DpWGA5YBYOg2O{Og;(^+Mrt^w9Bu4IR7o zptQ=>SjS>2Y8LTeUBz)N#@-Fdl$@6k38Gx1(2fRN-2s)*LEmI;+Er?NHsiO(bl^VL zp=ip(7Zk1DP=bm(&@3n)@l_Y~n>{sdjN#vc?cQSk*x>ie_-#hB&pEPM91s*A96ukS z;El>7vXYn)j`{V!wrEl~nF8)p5TARHEP$JBJiD$$-xMMLu24zpq4d8Xc2XR5u1({+ ztGO{D>gyV->b$d=d?$x>U@2RJ%Hn%`SyCabppKUzZ=mSn)OLI=pCc6TU^bd`0HvG( z)weT!7^caWdZp<;fLR>pChwq`L9H!G(x_2~4QM=G34oE;VBJl9)QkEU`2Xsri8fCC z#O$R*>8LU=h-uKwNFUsg(mATKq#T-{&*Gn7ug5GNw)`A;f;~%r6gTO3A|`RClo^C; zu~59u?+ppQ%(36vBt&MuP*@M4Qc9xoI%C*t>a83d;;j2f8mbxuQs&{{!Q=HLqL4T= zrHfNfn_VGiVP8vxBu^=GzfCyv5L=tCJ-hK}0H!pC$rxJ1Is10iah6!%)TOKLz;qNJ z1VUVjO#z_rx}e4_#>(pX45;VWP`2=VUfFY=+|DZvDbnoD<29FxryrGqk8-2l;OmA4@2Jl}cf7Nz5ie<@ zrsE<{e0IdX7*}13;~(9mJy zj_u*qU#x1Z$lHv?7m8E~*5Zt|-|20tp^X93_#WG0!#4Zf(!B%POY)9>(x@P0U4`PU zK0BX*vf;YEKXCu0@CMR`IBvn=3bjtjt8(vID<-oq3DwS&y{or61fCRym0n;(d_kdg zLDgtB)kt2Ww!JgBAa_dMZ|wHCY7Hju_s^Pnd2v{vFeL8|TW>?EZc$5x`zU23jK0u$ zZmGW0pCAeiL=<4 zn{PQMv<_%p*#>Z>0>U7MLI!;wdQZTQ!7ghH!Y^-2!c{)XjF#|3gu1qjQjI;NjW@e; zq&8GE_ezvMBKi&HBHqTi*o#Dn6?WWp$rf2kW!$9wOBOMJ=<cZ0_k^9zVQ}BQy1hs|=nQ5-p7)RSvcF&kwZOdoY7do07w}ZEt68A{ z#m&*dYEUHZ8y{^a5k$>3<|o^Y`)P{preNV0kD`$xb>XIhCU37wP8~k|dOLCF?8tf| zkV88qV0ZO4_wvn?tOZ|*c0f@x3O&-#{*Cy-lMfFwG2|}PG*%Q`QcP}0AWHIM1Qo=T zc8=9Nn$*S#HC`ksZcnU3{G2yyzgI*~E+tg`M{=SQ=Fqh>xQ?U&6wR1YF*rqJ_8i{Tdg3ryO_ljY!HA5OzBZ>2?V)tZVmPra)rg3 zm@^kM#F6o^PinhYc5>_<7gyVf&zSz>WI=09gK==1;v5h~2`h-aqs4M@;ol;59cS2G z(hFL;H&a)Bj@D|EqK4ul6M!g1juQV_KLkQfatxr&%N%Lky#C5)cfIi_XY*<#55#X0 zn}AOpp4|D4gz*mmY~VEa0}ZqZf!d#K3>g7@E9&a2X8euKLDGc&a?rl5mX#=9J3?NT z<(D8cndNXpp%}C&+2YmV-LvX@*){yDxOeb6vH;Lt;#T#UaNfosfR9}o{EE+-e1cuo zT2Ot@l5RM*Q&ucNt76{9mtLX&xUyBa2FOs6db6bryJ!r*QoSz_pCJ+KO}8q&@v0Vn zw!a8|Zp4;%WHal4?{|IR%+rXJe%n1B<-0u7!ChdX*6-M6_TEqVWw|rPpB2M4KI`sR zQM!(PJg^x~?DT!M{5V&;sqrsOM+qo|e4O22`5od|3wrfy&~ta?bK7rJ;qA$MnncLs zR6olVjqR5sh?6P?z|V{(x$^+-Wf488h?+-Xu=2wqKQV_rk6Ass_NqR$0(;Fd!q1t$ z=j3xS9FMt2Q!HUxiXFmV9@?-f5!1HJMcGxV&Se!=I1ei+Ocx+e1wUzNB1R4lQp%h% zP*;`NMZSlq#aa@5qt7|!)a$!;T_W4Z^dV}o+oz3WEt8&s=tp<$<#z$7M`at!!{`l4ttiY<&EY_w z$Drxxd(O0QqOsH6|KyE#~J4@0$kfw5$A@Is<+dH1cd6Tn86k*W&Rz;6`zNqOU{?ww8JuT6-BRE-8$0?t+FzS~l_T})M#KJvejHzG^G_Yr zEyEj9eSEZXFBS4v(~$d)R~ffizrLg)?_I<_73`QNy;0^b#(EOvi?nYMPYM`~iIg2q zkA>?^<^GtbFEa>=81*Or!F-x_i}zEHi~gRGB4}*RWK~p$5$P)$BSB}0W@W%#^U(yN z^x)N~#=?}n1usJtm(Sl%^*nkY!{e2l=D&+FEO(k9$NOcm#%*Dr-@&+*M+*{ZZ305+ zH^jW}O?vprY!ANM9&MG|GMZOS7;2-Xr(aWXrcdmO(CV|r5WklDg9SIc0NCKkV$}t_ z^t>SZ3oMQ#eT_mYpG~<5Ie=;q^er%a++F<#G4r^K{R3O__AI{Sy-3Na_Ufwwh!-t2 z1$)Nv^7TFP$}5&$<(fg#08OjKe&b4k>qBb;FB)!mmH9W-2kbKM_uT-tAZ#M1t47+<$d%Vi@fa zdA+8-Pjg^hcQYpxv6l22g$@YF1FxCtjAZgq8h=AIq;~s1?@kO0%m<#u1`%;9UVRmA!xPTuLTcb0Ho0Jmj zv4!?C<5azt<|w_(b76Y8gdk7d@Im=rz-^R|+0|my83y~%$XlK`?KfyGKouk1RP+2O z)%n;$%gnPM8sVZ1|IV#u@kE^(URD}}zENo*zv*p}%EHd#XWQeR2sfPi2MkpE$m_UB zax+rp$qwzS(Tb$X{Q*5axApqbv)zFl*#x3_#Zr!|KCqZ=T%U~}=r%^{#s^-R@AHjy zZmVo(ZrK?V_AmRKn6JDzXGt*bn0G zyJ1U7r`$}>P2YbRwpF~euCBIwtWsvj3B+)0zmC_4ht>R43G>+rk<8)eKTHtv1WVk| z!zlI>F+WZ)Il?p@McN^;+vb!U?X!T`(*n#N*qn^}yDczPpVJRQY^m4`aX+AeZu>PK zub~|Ew)9rb(79t{xzW`>raNO*pS?|hM$h5`k8r0b*Kd9lJiqsijGmAW6|e*QH*81GRTmKQqeKnpmAc35;X2b{S?(*Jm8NHlCY)I19(2+r3)}wB>ag|n) zq2+35jxO}UU0wp#BJ`=f#e~38-k^Bui0rm@oNv=>*4d#{;*U||T8t6jOM9z5jZ!Sv z;nR24o>aUK*Zttbu9r7((`zs60P{+KWMTolA^1jlkDEh??))5+mM68)rY-g9cY|a< z-r*MN`Pp{+JCNt*uFL=A=X&K?=VQd0r>|@r(6ZG>`3d{JzE0hViSCQ3fmYrL$6Z-F zIB9*0^973dwd7e61-tIaqeiRlgv7$po9?sz9bNLQu9z?46{PAf%tYmPt+7k59}@7aAp{Ivh}369XFiu&#;!2rD~D zE4RAV>(GX%%=Jv9Sl{D1+?%xj%gGNwT7yO!?V@Ch^AE%A^*|NvMbYq%du;|qu}slK zXHu=@dBM`s(@`M8*n=1tKGrm^ zMw1!2R#x``*;|YGcRRsgC z{UL2^^40zM&qNr?OESCVLC0w@l|?t;d=cVP4#M`V%E%USyo)>OsMXZ4vwu8YfSPS3^aWZz&h7Tu zs6PNBY6!A^qM3u>Ny=oB?CXgZ1P|=>)Q55H>dy^gd+?s_>Idb_>Dj9i4A7IDZBm^+fyy#2BIV7jfM)BPW&}KZw^c!ZXJ9cTD+` z+)Q6VRu9g9PolY*2E5%1w(_VqeMvO<7=GweyG3hx(r{Rm;<8Z2)5%v~1z%CmG5$aw zqD{@wrq_wDKClAG2e-TO1fGsUOAdmInVIjy5n5YfzW?rSlw+TP{K-OXkOvu%oG^e} zTQ;_QlCRkXC)Rc^Q?4*1dMDdheHWq-nmYSgp*xDpq4CV`{;}v@bKIJ9+rK5hTk(B< z_~j$Mb4RFic}w!%6(gaS1?H9|$`TZHak9ao8SJrkEwn`Ia8gBm-V2CV-C`4{_o^No z9?uS0s^L3Vx}`EeUAx=Gha14@2WX%qfq4w>p!PT%+R60Gkf`WtFA!?~lBfNbJDii$ zoR<@uhxSFyemRDMLxVSVl{Wu;#9Bl=je5y?vg(W+Ps=kT`kNf<%W&rXOT!Oi7Ln7| z~>X>-L>pTF%u$?P zy+6b~&OeduE)^{@!cw^sA#0aqUwcc(eSj*zD!azB7Jr?}R+W@1{Ux@3Xm!iGpIF<8 zXi0}T0eyb)I=!tO5lOx@5lIvrwC=OwbI2{>QPztj+G#0-hCr~;S6pkah z0cg7OB|@z+LS@;;;?jzcS!Aa~TRL>^=d_~MQ$8>yTrQ*)G^ik8CDTQ%@E5lRGA^Fy zR2!T8z|+43Z+@X7KMJlpx7ngKc?KIk;BP=bEL)2q?e=dq2S-%n#77SLL0HrG$I95l zPC^^N{V3oo{QUm;J|UV8;MerJlWKgQFYpy{LC?G64`Rb@T5;pa>xOpj-%vt%sN2!J zF)Cr!>ItXTq!zDwlGex--iF2Sn%0kZh)=oi;}4Md*Sp!?cNY>VevWeh>L%mR3@;Rf z!m|G`P6gTe`7bGM|E<1Dktv4O_p;u3(nd=~1vcz+h;%7#Qc>G3?k!~f8c+r$+2rl` z)iI<%W341YV1#RxbO!x;@6(81Zs-1~d*d1FS$3Tm5Dp8I3HK#FkfYZBp-+)?2jxg{ z8z6mt73LM5jiN8;a%n=v_+JaGt%t1$=$Cewoe=!j;_uCQ@Pg){tzLtX9MEYY$kuhL z1+lQT%S15(mm)#;9E{h%7$a0Z-!1rt6;~l9$vNYDCvC)K0Q5Q)c9I<05V`bR5kH zKWjy)B|2xK9^iM?7^o5+u_6q$6&c{}Q~E07D2S1~)vg2S=+hy|@kmHEG0zF5+uz6e zB3QHgQ;35@L!JV42fg9nP^>WD0U=h|2m(8Fi-`ZhV|q$%vTXxrdaUMprA8=lSG(=c zTfa3}dXAlZl~_kec`03D9w$zd;axotf>YFObOv#gw|?7hc;Z~;hKlqwkxU^!>PLE= zO0>U9w1SEjPl=>O?8jED{N)jU_VVPo+@RLQAS2x~ITdcasIqRKMn@>`2AUVf%n>J0 z(Hl*T;syiQp1g1UR&3t%CRI5EZYR#&ZLMoUXH*XpjW;Hc&jCGi>4u|y#fsef{1w&t zg}!b#gi{7Pg8ftyi!Rwr=3#I|IpABp06V#sUQ-Ebr$DEz8nt_zPe z;j+7@Iut^g2-mXj@mEC_**dE=$ZG($UL!kE`1S5x9QT|UZvnXy#9|UttysOREQ;)s z4E3So$|zh;u#xT23Jv31OD(R}i@#dbVT7$QuQ_n6_xo-`2kE2FTci1}_%qn{O#$9) z=rMc^pO!>#g1i_-T|@1JZxPWJGi;R&Tb_Xqbr1B!r-TvMS{3-3x$~=zcWj zKjua7^@Y38*g9pf@HDYMX@;u@UI`p38%}CQ4PbIR|#;<(G-63lRF9Q=i)RcK2ARB=NY(tBrw=O1yZU@Q04&Ne0E=!%gq&W8pxtb8 z1B>p&(Qm#d(g|bj{T2%GBNht8th~3_Z+UM~-}3ZzZJ@%OVGH?bg2k=)HJGAt<9o~j z9)TaA`_Fkuygz9cA)D@SH&J6W=`F5&qQUYbj;w&*QPapiY2TNewZyXxRx_Sp1gAfJFaa6&|JGr!q zzWb2-P@ggG*+KcfocjH4uQdou%hEqo^4xCOzuohN_r2jHWA?*NPI+BmJ%BRrL~&9v zVgZ*!YzVWbYM;u?9KJ#dUyG&11cXAY`8zEF!L-bPWTHs3I7eNG z+2B*0&TeIuL1{%-*xS)NJk?cW+%=Tj#IcdiC&8TXEfRFYnLl|rqk607y_Mo$_(~sV zLU3nCoC-uGr|mq1J{qjRs$HI zzIux9#M=V06!8AxrTCT6F{%OJ0rWPvdMRRycH4Wb@7D&uCwMXFd_O-(uzyj5QGmj~ zCDK*q+fb=i{1$E`v2Ml?Zh36q`bq zc%`kptr0RVM#9Bn#C$)*39Q7VA#*k&xuH{{dkIS!Uv2Qh187<5Rwf2RgQ6Li0;-?2 z<~6q}uEH81NpCFPQ(waWYVN1?zC#FrRms!z?)>on@@K&NeIIHZ`aW>tF@n5OjLW`P z$|6fC5h2Nff$Fo`b82AKxf7uo_uo_L-4#lyfz4uWw=*L*cDiH5>96xuMlEI=0pOE! z&gp${;3KGk&L>IaH;foXW7)d{O_n}_DlMl$A?GCKq`<1v5<}(v4sLo#v%b@!pdKT5 z&xc^MzC#Uz<@4NQV4ZDPNMNf*NZ{^j$R2!(9r9mm@ikp2q1n-7{07h+(TrJIMt;|j zzgcg&GtsPXI)Zu&5r+u?E?iQ2bDq+kPEFjA+CdpUH1K|N@NAv%U~7#zAB->sqc{O-VoEjR;Hpn z38KWXf3|}`Uxc>&lpG8J7Mi;aW^1UT^Ow3sVE)DqR()~1Mtu+X{c_ARV8!Y3`^!M) zL$LVXWC!X{S`qxo|1NcN`P7+pFI9&Dk;pJ_!MzB@rI7u-IuP;-tpSkb<~^4&?1+JG zj&9343{d9~|AB!!csi#;Wtn-5vC1@8$z6(S91`hAU45esZrn#+qQga>N^O6gcI-0% zRkwA`ySC|t0RB1x=1_pYCJwAsrdf5?QrTbT8DN>z8O(`W_GpKrzSRz!$+g(r&@6{X zj9cJFhokKBI-$kE`J&Xk5s?A$%eUDN|AW13d}X6rIw%qp1(0mxMLQg%STFziQI;)b z?C?azX}4u6_Yd!r!{LCtA?^gqip#Rb=Ycmex#r^EQ}i1OQ)GK3DVeM1Ez_9K8xN8V z=*QcFc{dzlnYs}U@O_-FIg1{6ssraN$?*W}PUFGtu@K<}H~R6-7}`hLs);;r$Yc(D zr16CBw-fVKgUBC_xhqzmTqi9K!5~u-MCSo;NkF2Qi_KFxmjsQ0E;EQpw%8S?#$cd| z6QCj{H=%6AM1Fe2WUx=g#m-TYy7_MMlU`=+Mzr>&shI7xIPQa~n82%_^Z*D8d&WZe$u6+Fr2@b*m zz9BB#<%h{ITA_Fk7t(l|45oYJFAWwAh*>T*6y-QrlttIMG+y9lr3I@zEQ?@-(T?s; zgyd&Cs+<5H2~Z0;MHRZtHH!1aen9NESAF$8@@tghez9Q^XSJU<>H@bFr<5<#?@|t# z^n_?Po?V)HPxHQCKUi~emvD-08sfZQPrHyGHIzPx(KwG(Gi=07$Ies1hZ|D|P@aZ9 zy}LzPTnwqAuLsqFskqpljC2zjk0w>*^q6U6X{3t4y!62@Vi_s4Ho}n6r)s18@?n`- z9k~#N@z0SRDdVf&Z#3_hp$-IA0=64MG8akgS0P@kiOPTI-iG(_H4nt|AgAKFS28L5 zbDI%?Mv5DRw!JZd$D>%0JifB>Ix3vi&tL`f9m|aCAEz+mwJSs_Q&aNewDs(b!M{p# z0M_E|LF%+uK+SqR}WiK!CH-U{bfYDQI?hG z8e_R+S!fFkY+SV6l~5Md`DkP_K9Ed{u_Xy%ZTlT;x2HL$_e!JD){7O5vSo zTH78`B$J4iY$QuqUE!9Z8;TvI*v~`c*80Y_i=DCe%X&0_2KxQIwDaJ#T)?#u&2=kH zu1Op-Z}a7{O2)3wN_a0PzgP20!zm6FSC;1)8}yhkO1@0a4fxEwCJJM}W3TuW2{xl- zghKaI)W*55$eE1*g6&Fx8S4A!Y~AX^c=BL8!I?9Cl>RQnfDp4PdI>1Hg~L2pGHOk2 z%a8fF^)tFTMRf2P(bC6nKkY@@mtgl!#qIx5be=&?d|en9QIS6a3Mx{gBE5t35)lLh zrHBehRir6`^qxqOUZvMi1*JqlIwT^!caW9<0YVRuKuCXiXLjb!?0(n}d+*tE&wbAG z(+!l{MCHJB+L7OO-Dm!tyWUmD2z@%U;%-O(Xj0fqk6MaSxz>>`gG`*9gt}WZ`WDKc zz?e}xjq#90HnYWX@JFq7ml36k1^^j9JM3Sfdcrq%Pf`6B z;5%L$^aS%YI2jS=p@&&osSk+{3F=_o>BGU!4k8gzzP}YuEpdo`z_vOk{&bxjc-I!{ zr?|5Q77bJ+c3P{4nptnb{dDqc5R3%54tB}}OT6hKCA6bqTT^vv@bF_7JFfLIYWQ|M zIG6MX*tpN zi;JZa-Bgo4D88KLQe6T#`6UIjwcC9PIGDmYE-l1)?>!0Fn`bzB$(lIF>%$P}caZ7* z7BMx;v6s1r4*)a*v|CfrEr16ZPWHvZ<0vt z8E{kX6Q&SB(crNDs37^1)9%EWd;i(5dplQpSigeIu}zdjo8+d~{t!*~ z^AnRu|ApHDAsy94aEUSpjqef&?8G8h@IQ%9nv?9v^hryZ8n=Pq*F!JN{g|dVwk6(- zv))T=(C#Qk#O^k2PMj+5{pjgCO>1KDhfMZ{Ck}^u-&b!d)R^pDJ*cpq4Ju?Y!VHkV zRYU(Z%>uTs;AucjaR6EFR(VP`c$%6n!=n@N1InmWlw&ef}l29}GATTp=QTAwL)> zhrG(%ibOdmUnoZ8!SAuq`e68LK)i}U8?O#1v5><16zKn8Cmfd&zZhjoi<$uP>cfMC zDHWZ=M%s3?XMl$+q%?YwG5R0SkfVZV1cQ%Mp!=p=P<|n$5IjNe6B3w|O)E!E&?BoS z+NKVC`$(gW5Id64usihc*)Jfd1IHCvfLb&z zwvcRoYIl{O8bOpzBOPnmYDq@Q@Bw-aY-T2g#iD7(vF)!yx zGgut&(7Q&V3%Q1nYD(&}`J>iX0y9gxKWcb))bLS94BvB-Oepo=rQRWS;qr-@dr=c- zpiGSvA5Qk9y9N0XDsMyBP}>6uno$Ed%Xe9rgqAP<3b#o=i8nVnzh7sq#>&LQtEhtN z^t^(m1%jqf!6~DpP7-&ZI99T@S6j3r!UaR52g}+xWW2A7) zrLBjR^#q%4EIj$u#*KAvd%z#zOF&i?hRGQ&mN0j^Jo7V4rF&0 zDp~yF_I#cCSDW~QeW(lZd>yo+P3%fF9;-BZx8&M%n-VRR8sn$Xaji|pVpgjoKQi!H z2-nWZiHkqd7ESsU$b+INApp7^bz92m$7((o_RM)Uq#VV_KL&74_UEZWpRuIQn+BYP@`_VG0ypb`=4h#(OW$hbml+ZvW?0{o?HASQi=YX zCVi&xk}RnPVjLfXa*j76=+p3x^-6JS-&%)(dWMIdIF_}xsxs!SjZ!4ZOD5jZKC7>G zs|&w;^3)&r3Sz}e`2I9)F=mM)FB&7ag<>Yns?)jmGWUAfn`FA6rm_rHy0S(Jo4(qn z#Lw~Tz5}HU4?UT5=j#cXo|wA*y|G!HtTpxhPbJREYoeS^0QEXOX|V6=2Z+oiGAm^ozCQ7xmr} zm`mdpsk6(%Pa#i9ChtV0%Y^kOt3B+)ogHP|+beGSnIO5lwn`DF$m6a^lbR^GB-!9F z3vf-6U7qqq3}*Y>Iv|5L78gcIjE`JC2R5cV0D3*apTrSDwfh6+lkPl}agX@iUKy6A zb&XgbYxdwTsf||klJ`{-i4mB)JM6i3n*oTb}S9bN?;s%`$bz1G1Ja_{Kl1W*6m<6aJ?g-1vZ>CtQ>k~#!59Ne4Aloe(5 zrIjay4u+|a3UmhH&28f`?{^G@X$HoMRZ2Q0?XKaGejPEL&R6!(S_!9d)$$#T8B|S>|nTd zx>R}%cJK6688NlB@*zzp6pi^5R)Ve(brw3G`$L`~yF>g)cQB}}+(S?dEZc|GGK)69 z)2+0q*SBA(3GufNnJRTCuw%gHss2aT*Mw@DAo?CGx|P7|(uwuyB&S>xh=c@gMg^XJ zw5-r>_QTyCVW&#TfrXQtj;cN;l;?Gq>)3cPAe<&pE*Rg5q=la5j~u&7zH*pm zZluQ~{?~yED{7!)Sn*(kO0WrzGDI5CJOCT{7^hv*VTXPQaM$5f4z!qr`MN`b-Gi+J zO%OE>%=R{@12&u3Jr5C~pe)v<5vBKvSjSWH5iAEL#J2lSm4!O5(Q9(rp2e}8g#U^Q zIqzmgYPJ7MAbN&yYhLAt8+PHA9DX*b9GfdvF1n2`I>6Ey_)w4W@rHaB?rdC0=Z znTsNR&d(I!E0@?X+r)$k5F8H2HLlw;;TxKak&V&?h{2FA)x%=0_T)MV#bbNRr(>V| zS)U?fi25OOp50RlAuUF~qCmYi?MaTOYVD{kzO68>v`;Y;{-cD5u@NXucEuti^@40xgT=fW+&j(NQ zE=9T~xbNb1hR0fw2LL2;%FhD{;()Qb*d{sgNfr3lp)T$HW7*7a@;c{{AUGzQCipCy z>$6Yl6f{ggifrWylaj7~@HbCR=y$`zUWStNgj)vr6-R%2(#ZA;rgodj8L~M=9dinqP@8=_QU*}U z^;gQp<@W@}&MyJ-Mm(HWLSBUQo@Y73S&UW%nlz^?8%`<+zsd4d3iG0&5ehWxy^y&b z$;)?70w4Ze1|sbvfV#ZNZ=VH?dkYee43H9&%zKtsFieCEoVQEu8yWre8)9FRC)%@% z-PMQ{ggv*TbX{t9s@A;$-%~0e-$}rBfI;HoN^_@2n=n>X4@6sfYTrzkHd4?%LNJlO2M z)-s1-c5xK7S9TUG=|rvz3$PlpwdiY~3q1H(E#wA8t10}__|O&5EtYEzt&brjjraqf zA_qfS_A89$P|8%B+5H2t%e3CcxZ%oq-&hZ%+u(-Vf!Dt5`n?y2(H_Hw2c!iheYIMT z#O9{(ldp>jAls)y{?6P;@Gr{sc0~!LE6R(Bc#V_&?vhXOtWC9&K4QBCP1nJS^@)M( z2>1FUS9L;5&RKJ;uO0L5t+|JEkk?pB?yDuJc`V-HL|`tI$)H)P6C=GH7ZVpJs>OPH zjdFHrshFk)Ig!FPJ_2s81?dv47U0U~8+1r2Jr*(&B0Mw(=?VF3kw(g{V$U9E?(3Cd zYPy3NdEhqsp3hD2r1K!j*Z%hIttxDNHm!D3jsYn*gAT0iL26E*rKL2Y0v20_6~{^d z(var5FQmszYpW26La@rYDeeWVGUoC+^5OwXqCX-)%6YUoVobuj7_bPE9&JRWc=hAO z1vD&zt#p7PoOr3ssYGZYqWT#P=)s7ec)g;^&3JST8$EmE87w7#@8DjId0>Z%0Qqoc z*x-%FkV?CICAQ7Pms}f4C`j19L38cKADkp)Sk<$PO_H9MA_X@a6ity$zd!-pF!l;} zd-A*O+%jMz)nu$uPGezIjploxYwpp{vMID?(f78GF%5qvInK_+;p++a653_+V;lPf zk0ME^W-B(4e^^&JEjti4a9w_;5Wk7BMvBI4(ZRa{7mnRTap1pLsnZGC0{*(E{VL>Z z6e;qt6n?7UKyfxjcY@W}hUMHQ@;cTkO5q)VbQiD7dKl6avV=kO;rUNZsHa{uC!h!J zk0&~d9q!MI8 z3DUc_OdeCp9LRBfM~?T(PI$^SX8X!&x2x$q99K3g-2V3sR^POy0(UWpyh(p+PT9er z^@{w>xu+=qh~IJRfpjgS*d`j{+d-#h&w1ldMtlpGXiXHt)7GfxBy9{1%c%3ojf>r- zgiCO~vk|V5(jh%!)Q<;+y^xgcW77XRdyu+gMG zt*|{WilLYJcxTevX)IAcxkO-dx4T)B+N%T>(=0G|H?|oT6INW@tDS6o8FsF_2la{7 zxZ9dG{zt26)_A8jmrGRw304>AdF0D)H9hsmNXt6N(i(s=P-u`Piy@2Nj-n%Ucv4Pz_S zH%geG_`MjyiQLw4(^{;bPV|7!3pINFCYvT* z-@=B!Au`_n3vep*&tsu6y4}pHxb{b5w7c8G?F*07#nnsnN2p+rl?NK)KOu!$-q!%q zlSy@-SM(l!A?op7K&|Hb-@r?2;3S$a+Nlj|7hf)A$lg+ScDkUP)&IYkjIM|Nufe)mca$IN?n$G;$%#Zww{<{aNub>Y1>sY#a2KFr^Qqj8b_nB8 zi1^K=DAtMx57Ny4G(+g(_M5pG5xtBtvWs6P>@Y>4zj%o1-omHHPZ~p(Di)3C>mXkl z8SKTHVWZe|RSdp;zKlU&Zkc}x3RRRdhwOYRQwJd<{}MD0Tme`e`$MBe5yBp<6VFG45ydIn`@*!ujK z)m^&W#)x^(lnhNUYpKLY{?@y7%cdU22DiApG@cf+y=>{3%CI#R(JZp~I5sLgHiw+v z?@?DqZeeWPd*~QE2B*{CujLY41B9oyCflp;WAlzb+O6J{g}8JqRJnpp7;~~$O?T#H zp%ycJdDY^H$9u9I5MHa&OCv4brF&l4ecxs=9HZ$TvpnO$kxRy5jXU^W+cXqAVn~O^ zpNPxmWrat^+6Nz@kJ3%w!_20b6XP<`HPz3t-$$WVI9puX{DCYWv85ffLDePQnf9})iAMtd7Q}~8oBfwz ziU9SD4oDJPdxz`3GGLwj^>Kbw!N-bAwgC#@p>}xs%5FgUDFvp_2$O*hmS;|4POdz$ z?&wHgfkz4sy*5c9z1Yk%3Cv&%{{H5D?$s7pgAvtG-l2dy1MuU}a`W6gZDc2=R{wC6 zn-yLrS#t>kFWB5aOVvNr#B{RH4Pi;PiX93sW;;mz<rAD@e{M6&?f~$L=Z$xvEpYujf6zbG`!Y71ZW{xMIBPD z{w>~nu3P3h7zjKNPkJ@D3A=MEtK$2M#z!NC`;W)!F1s(Co}E}H%2kn#(O+LEnDwz$ zs!57EcrDGfs}2zIaz8$_eDg?T7vyYsva_l`zsBjbMERyCVkx^E9~8F^`v!as%T=KQ z`^tyV>`^e+?R4G2Cxc#eG@j-({a!!GX|>8r`nm4ZO>Ay@U1ESqC|_J!9f&=@fh;TP z5E8h*pF=2pF*`Kjn11Q1!_eO7YjS10>CahGi;JJAL)@n7=WTO?GS`Ac4Elt(C~f57 zukK@w`n0<3dJUKC9rrTVSe`g9xKa9}B)CwJRkMWmxjM&tvm`vC=H%Ok`NwfA?x?{> zJF!5!JYbvpcUg7>_DUvrCfYr) zx&(GxW5&dU1&zv#_{DmVYak#c_q;m% zgqID}=zk0X(QQK~`enBZqSdCW*Iq+keGq7lfuk5?-R6@=yA=D$`ilL^ zAwT-xPT1!-sRw8nO=<6z+_D6OgAObvnj$a#vn5}-%`HJkt>=Th`2Fq68L^XoZj`ac z%0^>v&ZIMn5*luQo5L*3S3!;A$QTzmGAfMbbIC-ALBLgNK=ACGjmu?-BY~jKa)TV5 z^D5}|q6MS>ter)Al1G@(3|ev&XmJr&xEI3ek4wAIp*^0+;0exF&v8F`rEfgjDrJaM zJe04))Htz8gGN+bT!^W$yP$obqXw?rnk$%d5(!l-HgpnKF=lL^4Kmo)3e{if zF$J-*>IZ3z2R%y7)3*z5t*oR<6ke)9@@`ZdS~FU;N`ujF8 zlE}?tt^tOd3;e>5Ka_g4ea?F)^U}Z9NEl5}p3^*-6Ux9xXOKQfKF|0_)e`u%-iUmq zFlT&`Da0!1sPg`&Dtw{6C-{KL>+u_Zu~3V_vVdhXlRWrEx1cmyjS@zvHMbWXy4K#I zG1B%};uiW=-!y1LMRZh4Mt3ls$tBjK|hmU*s>ww;APCBwQ3l{9!`w! z$_J!*Ps{$R10?%~KV{MA$HDg(dDvrCQp;B9S{`xTZ>BIj)(iKGqYvXRHrgp~EDk_XJqW5LG=^;M@L1sN_=OHFa9TS zwy;>)%$6*-xIMhgA(CjD8x9gxyxG@8K5+~-FH=&u;fUoB^^@Ji zlKL&(OrquBO=yvl%0qutZc*8qb6wlw5Rw0;ZhjC$O}k``(g%6hY2}CIYZd0O(<%_d zE#2`SJuTFLBBhJ1-+4B`CLU)-0SouH>3dc?(0T-ftlLBZhQoKSOv&>%$fLNfSZNZ< zn^AKrSR&6Z$|%A1Hu0g(eVxrrwipGPtxj=8*&3~D@!8%PSoiS&tu3V@<`o%yzZOMf zim8lvEyMnXiVSdlfWT>c#z%ak8S!_TSsl?hVnk^`J+cy;^+R^+#BRO!%53}-D7|+N zK)!=M{I&ev&my`j!eb0{V=u^=Z0f~C6!FWm`6d3=yC#sQ`*>7?2Cw#kJjuM)d*t7f z!ie>IuemmvGLw}#F3&!T?vIGb;%8^GNgOsWKOg-P;|n2O%#3ez10U${Zu>8DDF)n^ z>)g@{)6U_)!B#^BCx5}x6jQR5u;jP=t5IqcCso$mbaT%3`XWc4}pUKsw zXt(ghx&r%NpH;NegV(&^c#>lrm1~YZ{Y$60*&p*NRlECV+;)PpW+HSRk!11L7r%q$ z3FkM0y+rA-H&X$0*yQAES@bH4b56&^YvIT+b~&x#OD=z0hsEp!*z)OEWsqNt?rjD* zi9X24pHD9I*$k&DGtDZp6AW1ok=t|x&)aJRwyi#kx-UPRMkkY5%h7_VMuzTHW7}~7 zD)e^&qmTL%OhZA+Vw%*vnJ)~ZZ}hBGxgYW6Sr?&4^%8-RD5FlDa4)VtNTQDlM?HLG zTnKF)&f0bpZE4@px<-!B{)JU!8w!2;CMTHn8B4&`X9)q99qD*4V!vQQS;nQLljnvU z6puuHv8_w}Qo)J;YMnqb*T$La+MWA6*FviA8inq6V*Vs1WB;&328(Cx7Mj_K*>^|^ z{3<)LN@M#MPf_S3Ud*jS-Y&GaGhK19OEpim30>9GV~BK<-B@t@cudWq6C9oIyT|c7 zfbpfJFJm*|(H^Pd{rn=M^&6YLHgshCA~in3{~cPjTIsV-=D!oSrY0k(=vQu{22b!>DX^ec-PARALqF*`?)VBaBR1ft@+iWMt!fNz-Oo9?~31tg7JC6 zsS~CP{JMSu1EM&UWqZR0ZP`%)e5XfAM1h&4gvNrwreD2xiCeV;6`$);;8jX98h|wF zi=e1kVxq7G;&w z#Mxt1b&%nVN6){F+n zpPZo_PtwMbwi#r0p6?Mt%h-s7=*5b&jmg9Vxn zZ4|vCa{=7*5pQ%-g2`iBpxW;cS1lK@gM69N5;me}L%~t6wgAo{y>E^QcK%%Z_87J% ziH+Ef82&8}5H2!O03VB4ySEr@wd79j)pIGst4#qwPSwG$t*{@#*);)anI0+zCP(G<9fa||IhJWRN zh%$ZX|3Y^&=%0tPF0IlN@u_=1S!8nbx!-{Wqf5{OT7dp$fd4w0BbS=dsI&Wb6gD~f zsrb8**xaIErOIIyTj1}4g0erd0yy&{ThiKB);{>F1J7<-Ms?2bPBrQ;7}YmswZ$~_ z6O)$m*gee>naB$v+M7PDpZcWEOSp}tLs%T604`XkZ#ALvy)`%T_ZHEdvBO;bepxqb z5y$OM{)$Imt&-r%<=xIMeWj`#_i<`qmHQiFt26@t;!-Tq`0-fC&O#mjoKo3PISsqm z>mTDbCMCQ(Mr&UKJlTAOZuGUU8OAyld<*zCq#~QxeBzK_Wgk43@#OZ?wk3~dp9;2C znv<*D@BXm@Bfr#TP))?a&qe%`SF85HiG%ryU&V?Rc~fdxQp!ilA!1LyvhJeYa}lk@ zY^{=l=fLGU{Vh=_QA4CxtVqoClgpA{D_iT5`~3HmNg7*u5PY6LZM@|N2%jg2E7<01 zY=w=xyqOyPNbPS&ak1{tXrA$)kl>=T%A(Yt0x=^%1IGMAzYR%04Y48<_;<+~Rbxh8 z_{mI8oM*_hxpiRvU&w@rFVOt{u~OY+WrO`Uk)kelZS+5JGM9qKlc*9C{jC+?09Z68 zeLOm*05kJf-+64SZGai%^W0YBC7~w5SJ^nwQ6r$nK+%lTNmSrBX>&QL{wZ9&_jeqh z7;X!;HQXoh>byvj0NRIHS~2eL;R!wL7P@_q+>Gahq6lB%*M53FDab}m)>g>P0Ot)o zDymyk;P;c>Sw1{Qxac`1zB%8N=zd6j@!jz;CNSzi&{E*Ig3^*kDDQVMulAjYS`;n1 zM+L|3Wt_~kf8+lovg&jaPblAKC%zoA{1uq@`_;9Uv?DQAt_3l}GYc7w60c!FftN@4 zGt=X0wl~zE<$Gf95gXLOx~;JOA~DQ??pKG9P&X%y=QmWYR2k$>c}27BScdFptrkbw zFxRk*0-rNVgd857cug9umV#q_GkyH4#N`zrc_*9H z?va~e&93Z|j#ZlaLw17n zi|=d;z1r4NEnu{HuuFdHTw9{={4H;4mv`|;1o`PvA!#>HzkiH7H-nmP&Pd1sKWR%} z)$d1!kj9`#j~D}HZ~;ATq5A#Uo>W~QNLhrMbx3RQ{@SFkQkL@@3xRcu7PX$fx#Ux< zJcM^BEt#WeYFFZu$XLTinAf}e$~Go`TUn`|;M8*Va`jh_3wStf*3p*AFf;qVvpV|y zLnExM4mJXKBSSXQX)@cfN_9cND_v!9hh4%CWSRQ$-rQN^QJ|Y2>!`tH(8d&Ewv01zjqo2Y@VpWa5oMGk$Z}!^2mLOIrsNl zD2P}#+p$^P7}Rq=-FK)>9OF0kUOz0 zg)PT({XloZHf{W&gkffzNU&bz&9Qu=&v%!v^`(g2@8g8LI+%RDFf8)l?C0NUjrQSa zx-g?`xmnS+dFL5cEg>dk-S=#tm83(ULGAOQVr@v>DcrNBsNXD+Z>EOIrZ!pz+_KR= zybnbW9MRW{6kYD}1uop3Qx|l!u+qeRk4AUo*CO66Bbz<{7=>V}cGppqq4G zjZ1=>-B8AFO^ZKiERsb=29+bz2)D@PhnxKGjAFN@c9#K=&)^g>veoauQbED`bG=F;Sj+x8eSa=>X4-m;Blflq-Q-;m(=U*kYA1|t z$hu`uFHUl>Q^ZWgmRmd?!zYEsQ?D156{PsfAfpkYW>LGw=s8$&F15 z7M>eAQ}E|X*E^F|(9H=e#%q`?+@tpkzOB9mGW|T_*EM&Uw4njP% zv;0?^x;#YeO;Z56O%e&4+$dMbx83;u5+lA49nYem+7YcF`1wcJZPsY6Kcjy# zrHkenH~L(2f?r^NB8e4XCg99xA^6#!?P5JF==mQHxCC+D08eQX`H3i=#l|v>*m1^* zN4SvL6De7~Pl`v*e4VwPF>cJ?NK;l>{s@udWWl4a-%}$re!y9!0*$w_R32CwL8^4P zt>2e;z+k8~7Jv&@0lpk)AQnsl z-@pTmO&ksW2>*BWesnBn%yTzSW7%*^;;znC>wli8 zn~a1)-4ysEr$MUaVSBJ%}$j_M?W<73NqP8YDJ@?T&AVP5% zieNN+g0bV`s08sH>g8*aLXUTOeqi1U>BW|aO>2CkjicTr%s@xvtl64{bG|&YAVlY!(4!G*8C!7Sp zc`aP85*oe@VxSIl#rTgk(8K8SH>-6(5?1lvF^Ef|X?^W?G{YO{yR}~zd@exctx!e;*e(;4q#b!gQ5Izq7PpZ`G ztLUH+;dWJdutH+0C;xgMlhdDbyLM(Z$Uz;5^`r<{2s!8}Ub=}r1_AawYz*yqtXDSJ zdNmcKpqb|IXQ1FO%aG0?rhh?wkfJ33YgFLd0+n8^EU6@wwPv+vsIv=FbJAeGm5mji z-6p7Y`w!WFsI~x5SYG*$6035@`__#|Wcqf~j5UA5m5s}|KCVfIqjrr8sv-p#hP0#& zEFIwW;R#0_XedDW3c*H_j`+7#^4nH@1e&RT;G1SYt%vMS*HK?_^^i`D|EZDo5wftU z_~}^xj-^RhAb&I=nWQvwQi$% zIql<%JC1YgXR}J^$T{Z1AqX93kkSeba@)YMl3oLxn4QNMO620k=T!(hg8utdo*)Nf zIz*(dm&av6zWsbN?&PpJH@Tr_4OJL6nz?uSuY`3Nnm!N<7z;Yb*5}QA5cyNpg3*o8 z416{{MS8bcZk7FOSOY>3DUhfg3j;k=cprt`jnU~`W_c1h^6Q70YwuEMvJu6#?BM$5 zT(MWz3Vq->;>`d(G~5`I?qA*XX4vRcl!-mtx@qps7ZBgeAV^xr3My^$^d%2%SfSz* zV(w2!65RIi1)DHANz$LvcR7t#&Lm0uJkUR|eZD|4X_-=-B2=XHl+0P*N0r;JzXj+( zKAJ-fsv~p*&B*%&XZkfzqhwr)a(bddtCSm z>~0Gs{qFFT$hXM58<|&#F^y&S0sqBwzT0X^`Xq(9sM*{vrxIhaesqyt7z&*evKhlu zSo_BmKNSI{>@;SaIyA7@0hcc_{e@#eTe%P+rn>-l;6-|1HC+f&xDpMxGfo5#UBE(o zC=3Yy(RLwb_m{(Q6mI%r2{U z%J)UeH{L|^n>p*nPp`>;x$k`GowKSw=8xRN>ksKi^B-%yoOx^-_7Z|0GkbAsmtxPs zcBq@-?S`ceNTttefqn03(GKIoF}>x|FP!8sf?P2P1^v;sFIi{tU>gBT*6RwRTN%CW z?t;GXm7B+kLC;%0)FTu4&1k&zX>QVO2&JZZ4{~(t&|cs{UIn(1qrQHfk+XL%o^Yc+ zb)M1x*7n#Q&Ln*y`)FG(+nO7;^u)3Jk6fb6;%@)d#ZQ;!ROVb5wEVXl8d-{(fqkNEN$hBoG& zA&UwgiozMn?H1`H=I-$no?CE(RTdsMsz%cm$NL+sd&;$7@@lZmFSH0<@iD)iO>a)C z#~bKk!N&Z^@1gtJd# z#xl$C6z01&(0a#6sNmp{?en!LmGqCDXv;oVE|Wx8PziZHxX;)1=h>;BY%Uv&){*sG zW8s^Ekg>=7gJXhN*2tUE@)0gr9$meK=C*-<@PZuoH>ccH;XVbbu&u&!3S1#W$<6he zN6K3X`LfAuALhwU;uTw{U_I>1MislUO_kOS+mDgQpFV~Ao6p#Rt4alpr5sPV`kG!T z&wljb-L~_&N^)r6+_t~<_1Hz8{;1*Gpwu+FAC=Nw6>s8Jy@16jyw3mzP*tRdnxd07 z_{H6`htNh&84TBfLl3)$WG`>bc=9i7W-tbmPKRZ=j_TvJH7rMq$Ww$sN0}j!=%$TJ z`mEZ@jXXU~3>z1X-NXmFfA2klHx+qSS6JV&`fVX<0=oQ$J-9?(TVU2bB^=d%|Hf`@ zmiEUh;JwVRS;vd^l-rwnKqfi~E_vtuiHjSyXQ|H+?n*TgGs5M6Su2FT0;J)G>O0)4 z9|vh+E2iDHXEzsbz)FLm{iPW*{FQk28T{o9)3bDU#T>?uE`O^_aBu38HBz4lN*SGi zi%&K9J0jqp)vj`TSXl@cBbtow$L%Xh6w61~EJr79YO`__C$T0p)QQxZdk_58w- zTAA&m4o45}?T<%nq_^|8`-;lwc1#WIzge<>le7OO$IoM%5&57z@ByavUriZv0+T@+ zg8?@WG-KI=$FlVvM7*Pd8v2m${V`uG@vkRe1G}at{2IxHGm5z6DY1cke1drddULP_ ze`~cb(2ieiZd{5&EgxTy>=7Tk2N(C6kgjjnLq*OGW_)$FuxxmsKEXLvt#Xf6rE&xZ zJG_1qote&On*^+{>-Bj5gi?Q866l;~@tmK+9!shFuPm_qE~RR-*rs728rPt&+tQ$t z;BT?~fZ_|-SlnS;pqHgMEnnQ|dc(U|d;3ub5GMW6;CE_OehS|#xQN$bUzf0!k~qs? zQd0$8QFEv89Mw}Ju*uI2(%88Z`{*~LilQ?|v~3Vqq;mN z$ztobreAQiEitI6?^%6fIrC{IAyVga9`XyKU@L5^KI^_1w)e|0m}ZCA*TI&s%&T84 zIFQP!mKm8+NE?gUl_qujx@tKW*hB=^S@$=2@$5a|1N^eQJ-DZ7p)#)=7tqeu zS#Xc^ECY6l^sy~(uTB2F-@x9j?0nC-Ou1dl5tm)Z&vwumW*p2%Un59_Iy@`2U3ocO9Up^xSSqHG!cudly?jOv zq5J+cbF27t$ga#UCuW*ZrdD+Z!dhO`8Ey+?t+`X_`-crAhXs*LTAkJ@Il#&6C0gms@ViYRr8|$iKBg+zoJKb520!T@V6K_{uE)KDOZof-iX8hzm$pX) z5$Y`~{ERM1R{2i7)+4%GJ^BRgz4e*v6dBa#Hw;(5c=Sx5-ETZYhYLK5nz`op-k#Qk z6ohN*DlJy#3mIR8Jm1dopipq?=f$0R^s(_*B4_wj1QFlServ|;+0KqgUJyyj011!@hb1kZBqU8?d_XSkFP7U5gH=48nZA>qK`mECb9Yy!wv46a^{UG{G-h^>m;T|(V zmGR8efN|@O)FGTM|LjypVd_9-Erb11A@)b)FL}4-obRh-OYUAB^ZSOR#tCbm#laI-6%8f%`luT>z{h9k|#EQ|}4po?aM^_pz_zKf8Ap^J5#+C-hhZ~Qzk7+BDw8^Ay)P83>kewH{ z^alj)A)GhsCFJH{^pI~R>wVPVng_dQ)Fmebkf3^-I|~o^MiR`Cy6L1(5_vJ$6QIM{ zm#cS+HAeeGg_QPBc$sDQeV>op&9@pfBxc5n6@ptn3w{{FqFEkw>rUU^Fqyu+_3u@B z%)^s1Y+^-8rgxm>^kp=A%Iu9Qs2Fq%Ot-#a)In%t2OfkJ79d{)Mo;@|Jdic1bbp}| z^D$%6k?p>GJ6i{}R;89SOOl0eJ_YO77Z5U<*A_U#pmWIb-QK@0C)_ssGju9YN| zZRvUL?mVR>iZ5s160#`; zgYKoe{KXk$|D&%+51ZQ!ciZ#?`}D~=JGGmhvD!ugHZYYxn7LA-g-z12!!}Ec-o~B5 zHsZDIlo&nwzLE;w(ePqJC3v*TzHY!)1W|LE@g%l_X|%7n22~npIDL}g4Z7*lpiO#y zx}4s1H1k8h)gEb;)a1PstFjg>wiAtwCAZNp=oX(U84VJC3?Mr~sZE$L^6rS9Cv zf6$tT2;5L|%@t>8%%x_m6x(=n%6x8Q^F4{EuuG-6d<&-c^HtBP6P#l2?`vRlJlhimI7L1KpemFbANt2fg6#b5s9c+%_tKv1@q*)t`D@tA!d z1$R#tGbAG2k{5$X7Cuhe?Ci>pwi=UbgGfW+UJjOQ>zfd~l#%f7?C0#C+9`jSujCs2 z?!qa|*x6 zF<-Yd2b(ab_x-O6;gBzn#@kYhz4s#M=L#Ur3-n*EiI{$*?ji_Z7CC!t^W zZNc{AIDA33Jm>=*I+OM^`sfQ7h0+!Z?qUi-uI*{BawF}=?YQAJaL5fJTA2`MP6rd z=JX0i4e%FfY#Ef^E(HPeK#N1<-iU&S`2B-`bp9V7ab+1kK34@Mig;zp;ORPl6Adg8KZGoSlE%D14_c(1% z;@+LjIoeaYM5-+p_dIRRQ#qO5Y%y^LoEQ z+o$(Pw5@#b9wXKFfBq2G#^6@vma4CSxcQg<>VLa5*VFfqt>djjYyUk1tZ*~h#uPVo zZM1Py%ccvzsr8xJbS4$kl{WbVq`J&VMG0vxvBFJqS$!fOT!e{yaM2?2!NsGf4;j0@ z`lu3oz0r8=dk>BEKD=?)1sFg^w9g$h{;|IQ^9-;YaqX;=`ZOjQ>AA^uN2|Xvps!lB z%a_E?|B?ZnnB_>?-5$d44u&zy{9~0sGDv=1U@jgr+Ag5$1`#-^+b*Ph^KqNqb{=lW%i0%BpzYcq+>RAZpk?Po zGLt9awuWdjZX=2&r{IVRrte_hJe~uv8kYgVxSb*jo{Y=D$+(>$nncU+NvddGPo#FR z{r~e9djxk|buxS9#6&AwHGW&;@HYm>O}}!)>Fm6J$zU%gID_XPf~!by!9yHD0y>Wr zyvI31P(}GZ;kk(53o=YlgNzl_;s_Mfp`Zx9qbd}9qIy5zxw7CBn&*Odc#a@=g;t#4 z1*$^9b3B(4JjU}z!CgG35EP*~E+|6dKyaJzIg2;U1euhN?u5$W2|PEGL+Y<65%xGA*O+J(t)t>-pC%6X<3({~t;Lb1SjDfKVOg^Z_p9W;$I`lM7wRYbOqPBi)mkE39av!7vP*7i~9qj)%>~} z)}QgXKPrc7mf?CB`}+?9Z16u8;5BPf+BsS<(fZ5lwHj^yCcyK}#03t8|JIARJ`<$k z!J}X!s&v6BoNEQkNWhlk94v?P@gP$$2aO`ZJQBPmvU*7HW%Z`w@02yu10$KflW7BHBW>s;PR0$Jwf}cl z3)}r~8E92BGIZ3hT*i&DeYoW3^uIB1UV&z1NB6pay)Lw>q8lnN>EyT!PX?_@=mh!> z-Bh`TjIzo{&0}>2HHuXx{eGHmzU0tJ@&!6^K948CRyoK(t1EaT!Ri&=oT(=GkxrUF zQhl=D2|sQWjz}&5jVx{?o{(@OaYu^_zzqRz1nvxR0js6!NNyyaC~>23=Z+iOPHIbV z<8VF5jl&&mE^rva@tdVPP;xjfNIE5PW4lN<47f4m^(H+hCsMRJqz$cpm)1HoGUk5yvQM+?`IK*q)O=;1i!?^|JW9~K-u zy`b@563mkc4xxk#j^o+BAcN-0W2C}l>1%KqBZxx638E-pB&AQKxqK$6Qt2H@n1g5I zI#Ukk;d)fCh*ahZG!g}C$yP`}qwsIv>&P}pL2F&Ea<>y+>A1WS&~0(SKD-+u*pGKX zWc}dQ@_WZG8Mg-akhyr=!QocnStA#Rb1fIkpD~PO+zK=fxn(pGm-1&-O#s8Cb3GTe zN4i(aML&{m*>TJ9Y>|t>y>D&>zg6eWxRq%A%j=IrNWa=f@}01FTohS#<|?6lJdQv z@7E}hMlbO)iP0;ZDvaKtaccAd1>EQ}8l6TpxI8qfMVrB>j?(MU$duv5C3DilQEm%q zj?H*@#%;z86K*qJYT&l;bN)$y7p0r{+!oR}TX-Yy7tjw6i@9wiP^oz6#BImJATF(? z)TrZj;Ifn3;Uc|M!EN`F?k#hvc$mU%L!*%J`UipN^gkAeqUVeJvMWzJwuzssEpbp{J3q`PykZU3g@=b+?Pr`fCu@Uzrj5ZL%WxvbdR?;M? zB$(-h$1W16L!?0tQ+ruB)fp9#hLXXXgvT8cNV?W&^qBCM!H0Nl(C7h9oksVmpLg*( zzR@GX_bCbPbDTnrDoOBVn(+nUBm4aw_4@;9)-NRJpQ%69R4*CBM(<_$(B?9#$0^?E z4{BgzWyH@|70Vf`AzzF&u>Z!INEc%boZ5}sBc8^c(C9YqiW=Ei2bb-}`iP&g0S-80 z14AFC_<+t>jEc31Psvz61s1h;F9^-vz<{Zm1CH*QJ4E1~IR+>-dFPVKj)e#q$5jea*GI?DQC zNBwjmetQv}dZWA;ONj3x+;}zaNqD(a`!d)MXL#cQRDK}gIhg1>92bGcWAJd$cs!b# z#*=Y88c#!cHJ(j;8&CC(MtPR!m%#v%mqC<|HjIsj5q`t?_KKPDNaAw{;W?G+n@(^E z(QhfyFPiwhoa$dec&{QlBoQ6f%OLT66Y3e`JtPoq=r3aB*%j%KAvBaMM(htL_9+`X$CwU7XzKtY41rR-lP(Nhjd60~5#0TlM zc#yAtBp0&Z`{Oef<6fw*jr&r&K15g9c^ME!T8c4T~%L1%&%1dT}V%EqxF z(bbshrIRXSAwhGZgE7g0OwY*lUnlBEYvQ{a&R51N#J?8wdkf+_=_8{?n$PNKo~cGU z8oeQlT{cgZ)BIUV^OtPiyMlZ&xivp)^lQs6X!1A5&^qK=y+!*(X}aU!#t=n`op#c7iIcU|OPl z8MUGLRR+}wk2XY)4%BW(ly`Z3-N^7Yqy7mAPdOw!I+8umhQ8G(e=C$TBQ>%gG?2eW zn$(|;MDH$SXLQAJZ`6+L5m`Mlyj2O`mi)INGg3l)4I7c)hBuJzh6Q*YWOxbbZkUVu zz%U2vH_Sr$Gdza+%WyyT$B-U?%i$)Zi(wqfonZv(W5XG!XAS9@nc*<(x1k@kI{@i! z*c(@RhGOiGVIRViL%JAx;PVQ@?#M4Wbf@|~=(`7fTM$0<-q}ze`E96;@@d!w^^KuA zK_!%bLuHgRLp79p+3$kyv?Wtd$1}CG+x-pYN>EL^+VALCrjoX7%4v(HoVHrZP!9-7 zsay#i@7$*?nFqAneV4XiWXCOc=r~1o>~ag~Be;(J6kMfzm+@JKAQ$;0$fb7Zd6D2L z%8}qXj$?Uy50O8Dd^!#y7aoF3^nHW2hGgx_@uFS*Yt-MXl)r$szHZRgk?c5$7H)#K zL|55ylL_2K)DorrqhTflH*py?~d3X zLqqyj#b>i}IcP!hqE7PHfnZl0UxpoVd>N8HFleOY%c=fnNC!a) z$@v{Rg}F^zi#Ms9jGxy@4sOs^;4P8^nS998DSt7^YccUz_Pb18FVWWI6_QiAoS}Xf zl;JZn!CS)Xzxi87#v*#0CBzI2@1oAS%xKx#LD`a72B6-fAxr+Ow5{*#CgLDcV2LwG$B|$G$-@GwC!F9s zs((H~*%mlG-<0d8S{j!Mh_|6SK}VYBJh47Q4(TVKx2B@LGn`L)AqwT%FqX>grTOeA z?ywr>(KwgQzgJO@HA9+@^Ko1l-luu>F^+q~QksV=P>u~>k-n;;-)jiZUu3^2$?P8F zi;*4KM=m(Njl^XC^rqhjk{vgg@()J4*=RV~CF7}HTHhFjlN~mn>`B@m;?nRrhkT$G;*BdV1#en$+w7#z9k^7y@+OBV+0tiMTnawF;kI7J z{PKFtr1wg=t^buS`#l*ilXBbm>)T#XPptGhJ+}p~lgrb$&>`X$yw)yHm%+{WEQi}f zJJOqCaYJ%bJL%0ZZetAY6mP_5DclBp2EnaY#vSc-1e5T28<#*k%kg-yX^cf+y4xd4A>v$h$s{wwO-oxS68?y2ETu0vj7^2HEyrnIN%kkPi7ejQ2!TU+va-v5x9sNZ2KzWM} z#iOF=ToZ&Msi{J zJc$dVe$1f5@#!?ar&mdzBXKimBYiqLcH*YtGYf7S$;{oxp@_#G}Dr z>URho#Rb#h`eb}w!jT6t`5E#=lArPTOo|&f6OR(d;B!1~IGqd)<>>?R=!eg5xqc*P zz6AT?vsJDyK9k}4kiP0o2LL{#uQ>kFc`4&We15>kdl~8pHc0x+i|a|_+!GyEaqe_v z>3m%3$cl5s=SQ49K1bs0@HsPQi_f7r8(TcFvcTs?oRH+p6rT-oCj4aw7$=7Ob)>G0 zGoW#I^K5SS|Q&=OR4>Q8ZTXlKG7xrPxQ>|1JYge4&_$#nyz(K(mlj-zTbnH=s7(eD5YmgPw6?*W4gOu zLf5n&q8y7J&})+WsJ}#a@wuYt7Cm1pq-St>c*j9>0iXGba;oqm>PdPgc$A(~9meOc zqJx+58rT7x4@CRu+0#CHj<$#HQSL&y741Md6>S@fx00kMm+-xnp2sKC4dgBKjBPVd z&;Crbk)GXepj%GsDy7fCMeFGKUm`sRl--_MOSh&HP+mm|ucUfLersx-tRA`{okTaI zW$E&K9T1;&x!8~OME6bfSVMN(YBOD<+lsCpMO*24+g7v-L@DU2Q?w1AwTe;);dMJ1 z9a4$zsrT^r?fA@9luFODQi#6E7m;2v`Xr-gK+!h3IGl#hfJJF^%`c6fRi@K*znyrw zN3`>eRBwrPqFxg1q-%(>e6o6W&~?Ba^t^66Jzm*Pbdlpp^phS;c7bm^sTOUc`>@+= z@!8&Hx(~YvuOP_jnMlvx)>41t@x)qw?J$KpIKT1ov_{sNy>E=4^ohml7Rk4SnB zC;NQ~K8F^~p=X102(LNxm}WLTD-5IOb7Ax(A&jnT&Z1XXb7-8;!pl{nIrRHHy3joz zPwYkW@p-l=oSq5JO~9MSlTZvYBts93Xnwl&5c^@w9mm=>vW~9S-u2?k_}JX&j`GUP`e< zJ(aQ^$3ZH(F%WI1M@~Bkk3FOh_Te*l(Lv(NVSF|(I!1apgYY@Q&x@dEPEtR!a6T2C zrst^HM89)5uZzyn>$~c?t)?N`wyoUcXs?)Xge8a?~Gj+gXAH%KmTp`9(d(}=JB z9`N(o1kmq9&r;H#&q!}QN4Ex|avIMSbU(dU`ErtnN_1c;dgX%SSq5K{{8v&xD{0)y@TlbVLJ`bk^nCp->Am;u@cHm3wEsla zM7J+78#r_)Pd4x|nB`4ec>&vg57DzP91*C$NX@$WC^q zn@6trxRCR}XV9D%LDmoLqF~tU%EOsfG(~KB)fAUU7Q(&&*Zrw)Sk?)9^O@IXK}-E z{^CZEeJ#6$D}B%dbO~^l+9&eMyQ66xGa5bna%0d9i+ueMhVmm{hs?uk{_=H8_#M3H zvj82+a*IaejjhEcX!pzDB6N?#Eh4*l5v>yusHe3?h`;KM3z1?mef_5rT1A1mZvKcqZ zOpiYL z@!ttHIX&`|b-4GxB$zfctq|Usye^QLKF)oZ>ndQTcX8*`GdjEu4i7(Xiv{3Cz1e7cN+`=Z-US7Z0a&X%WpLR?vywxeD z!V(CL7LM4)f8+ReKzLiU(8YG2cD5e1o{1fJOYt}pJEDdcJKzqN*k1MB*1-`_&h_Vn znU27iEepdI<;v>+2L}C*{RfzsPuQGObb^U}`}eE3xZ!UM8Z<7kadh?Of5{*LGqLBl zkS{S4D?A!8F(C=p$0L4|ZY1H_lrF%nU=vf^Vm1-tRAUZF9D&&GKQL7Df6UNz<*m0KI>y8kCocZ9VA9_hn$o?c z?$L)||0P3LGLvU`reN{{_w-Gk5n~?V*_BB#p0$`^1L575=8$vr%q zFu8+g5hmC1?8+n`&k9T~QT^xfti|Lko~@Xi#Iq)oqj+XuvJcO!Ow#cz!ekrX2{VbM z_LtzrCfn1$+p4gZ%4P>UJw z9cdHbUe1hD#wz&)<}u@Sr$ZO64r9jK&95pKFlM~(ma|T96f-_XmkW>6Wy=h@oP2^V z>76=wt#8OcNVn==J5?aBR~+5h?#~<`a8%Rfs+P`7ynOesNi#v<;-WMLMgyZ(t(`w+ z(^L3HpMl~yT!e~aadS}|ON?1@=w`?JRZ!mH(vl4AsYW%h6vA^Oj1i3#v~_4 ztCf3||J}q;@tpeV)arlD5MePn$$m!8xl71Nb`iz9$wQ4R+=H54xSPV8(5*CK7HTwM zE;;$WM&DGgBpX+;l2dp}C^?0zNXcn*mMJ-nrwx)L@$sg|tC-{{zpFHkNsi+#faD}< zAjxUegpzDrB~iWqe_+VbyK!G`Z)TD+SEF<4ul|i8{^y1cd0+o;-v)O8f>Jz~BY3S@ zxCc!G;V$xaet^P~oWLnWc$OHIL-Ap#yd)cs10|<%St`lK<7LSi+%A@!JuBU=mctxe zUP{j3HZGO_2Lh}8j|n`$=ecjNkclsU|DN@A@Za9ic+~0*SDBLb?+Dz^oe90-T)qWr zGGVX%3my&uf^xs#&ocpn_l{fjVG~Gp?}$GQ9pRgO9~0FVpk$1o%TCBQXnOv~WFY(q zlRIX`FcQYpf9c%@MoQq7_w&BN_k>rL0|&r&X!&5S3CcxHxx21oFD8szHgD2N1twhU zs(XA34+Ha}VQ#8 zT$j4o;{h-@wcq;%Zvc;dpKn~A2k`jZJC^GKo~#w`n+Ek<*gfFMBxt8-%&f)(kpGoM zAN6ZtO!#Ha&Y;OKlAFHvX}u|mS+vW)(CMi^v(WPBv0g)gSs3I#XxNv*EdE-R@_QkC z4}0)_j%XmW7=9s2csz+&jLOSfmICD_X?`~=063*!$GF8|%wootF|l_5hTrTangjVG ziubzu0bJ@a_*69fzDBdOWF3@0Xti?j~Jd9bc{%-beKJTX8#InBy{Qhud@FiD!W?7s2rFSWmZ|IwJ(GR|xR?nL_Dv(*V znEO8BS~|1p)?>?>{$b2&xYdPDo8Wuw>$U!OGnm!nm)&|!ivsv%uj6M;W;N;e9h1*c zZenLa``CfZYP?%YL$)Hb3S3l^0ra*SC)CNYg#07R6-R%E^8WqWwVJNLthjx_S7rh1 z?%S=Wc`>sx%Ue}xpTw+mo_u_9xSUzF8~r}q1@QWQKyl2~JZAY}yv^lNj9I=`-Keh& z{V3~|@_k$&vwVEA$ChK|%<}F%;{_!HndOaj$_aC!Twy?;)&rq`=US|cr~sJzYvp1$ z$back>rHA<{z`qn`Hc$9@@k96Q=@hQY(H^a3n+K<(U=tnpuO9>YtHUUhkAcr8&wPS zzo_Zvc>&sgyhQm@n+#@IK3zHg0?_;O)wTV%0<5nZ+1YJ8vr_3^bKVQ^Z~Ji8udFZ3 zO5bB;M8`a4WyKW7s_$f0?nCa_eSzP5ISUU20lg%{->BVz{Jq^{LS6#w>pimTZlIIL z){hlDy;~>sD{6q>l~OGS-`143WBE({&sQzr`|p9ehm)XRKPyKX2o;*sYsJc!N}-=0 z!*usK0KPTaf2yZI{<_6m;_gB}>*|-cD~5j62UQ+^&EubCIRH!sc|VjN3OXJIzIL)X zuwxZKlMI*Nk9mG=STSWgd^`8B9MT^8PlJ z%*uGdUZZ8gY?>5n%$Ilym=)OIbB1(5&sfnB`Y|2{F9kB<2>t3h48yZ49R zCy$&I@DR#PWtk;CKrRxpz6;L7@7d9_RiYWQx}elALSoOXt{h9sgmG?ly^o-C2GHwz zJew2_zu)LIxQ`Izx4`0s$6%=ceBkBIy&yfat?{D$K+ml&20U{H{8t=U?4=9%OrtO+ zVZ4ddo>|SK@F&a3c?7+;vD!|~9k$?F$Z9=5u|WD-3a=7@Pu#7Rlk+@?aZP1;o5D%R!!?i(guCPz>j}YURL^4yBau(xATCh2hb+Xyav9}cLSZdtVc<5) z8RTmr1WioKVMsU2fdu9kx zzQWH`?^h}>3+EyW-%>+{&JPNd*GQIX6V=m%^;;-XxEl&nW6^@bozU;Ha4zz&E~@x0 z%7X5hTC}DxD(%q0nuQkPVU- z!Br7`E6GBZ(M1N!uwLOq3~M5%JKYNx-X!{8p+JGxP~L@4DEy5K-b48iUMIR;#{0a& zD=7cMlZ4L>?7uJ`@AC?yiB2*YLv)TpItU{PE=75gr!OVGM-u)^iT~tXNJ!yqgma0X zvuPy}PT#YL-*i7&7>f6Gg@II00JS%m;_D5de)c0n*`LDu45R*z#_=r-BDzkd{K3Qz zx>qfnNrv+*`aO)~eGbuSI*updG~&YyivK4|pN0BV7*6sWNpc)V^{piNUrBh$=(UC~ z4~G2~qQiFTM>5fC8`ZOue&2)d9ff)Cpe%gUC#tW30%pqe!yg(SKS|yjs6B!fiWD}f6@^!7i{nckJ6V%r zFSo|=W6_478tEHVtY4-_<>S4H==O)cW%`HSNeC%SmmL2}!n2(C{+#F_8_(sGUWxOj zu$<`pl;r0Dh0Q9)y-m5kD5Q1@X*@indLIzI=zWD;ugD<1FA_c^IhWz_kjBkTl7~E! z|7?=~6C}Sf`Pqi=WQ3bYFUZD)3?|ZoHJbEOB=J?If8wb9HPnxFgx`8nWcs9M(1plXaNv&P>Al9EHg$ zB70NjM6Dj_WKI3D79c*>#@K&rGn7y3Fw}$A>nM!YY06iC`oOxBJlX1#lWqqJOVuCw zVlx4KZ`n-6Fiu8dk1IL3E@!QVe05JVPOEN9y`9=LS}Et*Jsb{O$TPSsYz${0{&aT>~+GR z-3(^m1={h4dNi%DUDej3v&SScyC+BoyIVZ{Dwtg%hTpWiL1D1&q5iNdL;Bf$?`?vLgvtxhxW{&2TvbO<{-(-)ELf~!vLNx z@0ddX($8UZxRkyQfry{O6l~vNArH%$!xH3+!*T)Ey9Vj%uqzCI-^4fhRo{zJb z<08JFj5#jg>zM-WP`)X=JSH>85UM{I>FPL%FAw-nj6ysoque@9rhGv}rwQp;PY}wF z<2aOS$FaUh*AYCOpg+S2*u`zK3x z_)?7JK9L-MK)N`5p!%w?yu*8ja{q>Ye~faBM}m&VawG+vyMpAOxryqmL>jt*V~d!igU zxD(zzhhclZNN!Uqz{}>ZXE1UZX9e;{vB*kA30c| zesQpjm+C(Ua~uy2MyMAZ42aJfq<4N`|LosmzwDorJ}xBvdztjudE}%0Ih1SrY|?i} zv3~pArK3+j&}8;$r2kS-e(aNx&-PnMPjBb>1HbRgkm?=#G#uad+fa_}H}muWd{$F? z%P9X6!gC4X6-D|vmgWN)jG=nsk-qj@Xg*1!dFUdK?*Zr^%Dw$9g2f*&--FXQ50y}T zkCE>7Z)tw3A^qLJx4(|r%f<`oJ%^U0uhod&GCkgfm?Y(wg9GXlhaMzvc1ULj8=Q9?tOe5f z$-#=of$ZCu?uCP}jQz4Nq51qQ(LICm%jD}Y&KLHn#IH?=r~L++Uz1P|+pk5vWWNgOW*PJUvUuMTB6CD&#FWFV1y=k`s?P0qGxIVWF#dVwAShT0@ zhEN#$zPP@$6XX7torJe{ikO{0ZwDS{b|SQA?Rw%m#jY3HyLP>)oG-2m?0hlosGWq` z;mBU{L;KclEQWQpTTl775T41nuC_}@d){s*?oZhrKzr7%2-gpG4>3%x-9y|TmfLF= zDBoEOK4W*1`jLTlv)y6bkFz_3`vrD~G5oCE5qytsmx1dzyBxwp*4}5d|LqmXPSqg& zr%(JaBK>7f`c7uIb|*dNLVR&WyUgBo7}|l(I3L;fApY8;9=5l_`M}m<7*3L{H)zTG0??|hQ4xwyWtn@;=~ zh3h1FxLI#pm)Z5i{Rg|A=oiAy6@v`fwa5JlyOw8C&K)ggwtu$9M8?57;{&d9Y)fme zwZGk-+1_nfU-EhS>aSoNvmKA)%C;Bw%hnD1Ve3HaAVUhRWU(HmIz)f_zG?4j5kG^t8;T-It>x0Mf0Y3d5;k8wS0a}Uo^Y>JV8HqR*>ayd`8 z7x0biXF04yxwd&n5mlrfUm@Q&T2KD5Dabwrcq+K&?(YHX!Y18Y15Uy3HMoyqLw5vi zc<0||o0`{=J8)mXCJDm^+eG7f(IyP{8*Ii?5UNoWQitJs%EleXt&It-OS@3SmR4Ag z^$%R{T7TvH*OOV(T{r97w5~pl>tgHUxPG-hfbwd+pTbWc!SQQ-2KPU#FXOsZzV5zR znWoe?k69P>y0UGNJ+po}bL*TnmzZ_Un=`%QiuPIhxO)R;{pjS- z{$+qiQBs46jX$%#Uej@xE7YG~rk@=E?VrmsYO;cUWTM`%P9wZF(|*BPq=)rV+!wW; zP2sYq(SAV){XV8o)-9hTW_p_|-(f5_BV;XM=m{nHip~|xrnAOH}t`P+QXHod_P}<)aMf)&= zX*A4R&G@5lMWd=Hi1fqLG2GwMC_M5K#( zJi#c`x8_Swp3N7dU13gsW6Z};K7Ztkc_*9)%zh$&%pM`$W;alNHk*dy-Yf+5i`itPhuJv9(`+o##VmmG4?%rp zHW2qe%?1!YWM`Ricz$K(OnBH6{?&Mf>keNw{4!uyG%{)-9%$$*b zW)3*c%q*xs=7hfv(MyT)DPX;(e^B3={>1uB>#;wkU$LC&OUhSBFdXYOT}I_%k*=n3 z^tvPt`D?lg>0`PE>1djO`qeZZ<-~L)%7Bpu6E0>F#|t z-J#!){9P81f7d*^a+^VZE@l2&50O961LO~L zFZp-fP5v+U(G}ifXYE5{_{C|=^OJiNai~I;1(YcAyPx2?(K>i@VA|K@* z_ho*kODUhsuk}Up+jO4%ey*hYWPY4xksrzF zKdD9vc%EXdWYa;pSBfn*a zqsTATaPrqRnEYbN{7c&7{UAegYS)nb`E?>cX4T}6?Irm+l=&U3ApdSJ$S<1Af8KNQ zBPR2kc#lG3$o$;hCBJzxzi~1@adiJjkWPNl){!5!)s()R{L;z%l*ytag_FNK**D!= zko!>^Mt%_czHP`qn+26OqkfoDJ4WPxQkVR$X(FEuN-h_AcFSW1 zCP!yijfi6U-@FUiB!JhB&aSw$lj--lT-beCIn%eXnf<1Xfax1N)>|Q}VESG8-vPGa ze`iczX@uT-vvj6cJ>Zt{8G!GHO%aq;FufoC(QUk;KGTD#!~0%j`tJRTqWU&5{h2Ni zrr*+;{>qNK1&RtxKcU5LqYOi)zj=}NmcD^Zf4llC#g34Ez`O9werP|t6q#Nh|GuLR!SABt znGGGwnVx5ko$ffs^z3>M*;Dm`>2*piiUGRnDF)oD`F4rvZk%11k;0hn)S&e`;pt4* z&NBR#rUKJ7>eaCz7GS5yuZJB0wsO^L+{&2FZ;hb7-Se1E^`sHXrvjPItNbTddqy#x za-H1y^AwoQvon`U;{{Bogwvc-3;Aw6zEolj@XX4RAWz75+&?=t63QJ+IU4#L;P%yO zYX(5MO_5)BZ37rtt2t)dC8iT`X2{{!kU#ug!-~$3Z@z)B*H@@#;lW9#Dx~>sNhlS@cUB|U^f`0()7^ZaEM!S!0M=0M?n>l|3`l>Vuy>g&j%WqBn&O|X?RnAATkpI24f3LUjtx&XSX^W_4 zx}R&`@#>#+pktp&r|tlL;kV0oXu|h|nYYZo!nf|@c*&P?rv1yePSst&wBJv$(^P@) z4^!(ps>AoIXI2MU6w|)`GyLXC#4uvG|T+G~6?e)q^@ z+G}TZeC!4J1YXQ0Q9pu&@VAbo#kQ~xq3cls=|@#guB<5B0~`Q$gH0Dq2r`P&QRUw>A1 zS~k$#Y|GoQFyKe`$&O13fRC;>>vT^7zj_{R+07pKG1$y8ZW-`<#;@GDp8o+S{8U?= z3F%{Rgy-CW?}?oaXJtdZE1X7j9tppv1S(yc1N`3|p_b4H_3w#mh*5&{)Z~UR)A39< ztZ>LdXJ~JNVc!X70FEqIx*$}9_6jc*bI`t@%@n^OFmC&teOY@J>esVQes)06EEjJM z#};cse=FK;S}_;;^;}(T=`?_M@0mPl3F$>eW8d1t_r1hhTEBq~WdnrXi=cdYu3s_m zL+9zzTRMk<&bQxY+;rHmJ=Zj*+P=7?{tG%v4`Edh;Zm%F+ zbo`cX52)WxBe@dhEgj?K(^jqnD7f4-qyXwQjM}$+EtE4?j8=<+-+QS1dQ}ePMK@lx zaD(q4@zuWX6q?~A&!D~+ApewOem9mtyEA4*Yw~!`9#z-I2+||AdtNC|Z|3)kIt2gkE;=os}9igqM?>*YABB2C#g3OPyiko9R^hR4p0wv(6tKe_I$2x~gwVMxFuK z1@)sY7w_++0^g%Y`CGjLIxo7RwmvVK>2CLkeJTQeoi{2x@~DF8{_>Cd-6@*sX=%T# zyB)>!OyhH>_qxdRW-m^DuL!?yKz*)P^q}g-v*vk5zs1emIVWNMXxC!5wie6>TJ=*5 zZuMgNmO8PIT7&*yKQH0r4w!#-#plj@4CyCcNgDJ3UNskOoebp)cCGI=5WerbA03ej z^IPd{&n!>){bj7i&vr0heA-y`aBCnl(7);L5zd%_`!|zkJr$XOU$4Gn1In4fVB46P z-Qo9fzl#>HQeXx_Q|r{{035%;sdnE|W-u{N>BNZf%wV!oaWU8f28)xFawat~gDsbv z#*8s!2Ic&Cg?YHDN0!wJ$oF-b$wLlcTq3HjDvc)=2(e_K?|s>cD|J3r;W z^8C`b#@m4txUXm3lASfX{+g9v8Hi03NTFF1SAj z>Z{C~vF;c2`{}Hd@9&`e)faU&uG!8(y_vg1HdIMhH4c@4ymNP>Y zR(fZ7F*EFV$HDX+*ttE7d#qgqcC4H3me^ddTSba@*NuSRN4^*n;}38`S-&~cAw777 za-koj&zz@x8SE#+**othiNPM7_gDWX1z@L!KVRE-J)}pZjadovoMGguyBmGs_mvmc z4)~J63^&hxKieMc+#R+#$3f2+9`4>_!vwHvckgOte;n-NjXzR;J_Eese;#Qe1Uy%( z%=!)Uh~X;h%;!&`o^^Gz8b3ijTW^fi-U9V!3-gu@h3~Ul`>0v9XNDK5a}NB1_Al2R z*qjIU^UWtq_s<0Ui;b=g?FseYYwS0p9kh4Uudd(q8m9 zWDTqRURP zYQuNk{xK^I1~z|Fx{+%A@^*LOyYbm#x8u;RV&~aPX1$nETPNi!U^f|coA!QAEUcIG zeS0L1hIWm{_M4vr?V2cg-Lp!9@7MY7_dxq5?^eBP59zS(9cc^cgEwYA-^{~jElsmv zy)-<<>-rN|Ck6a^Jh2zlJDPtF1Nnm{<$wAD=^?9Z&h3Tu(~R)o{I>w-=r3=70@{tZ z;4#i0`oHS*m%iP{Gov*xFKBgC0N8zJz8aKUF(~QOSZIHRSozX3=+DY6$7hy6{VO*2 z3;zJ=k(aNH&WGO@mVEJ>3iU0aey+?L+;27npnSy?kd;5R`lC@}`{)e1BVAxz`Th_pWbR*M>1; z#s0yUVSY4L<=<(+cZY+geFng~TYueY?~CJ^aRB?Se+JgsL6!3+UxoE`X!e+RRahs7 zep)*)0@mfBMkDo-4iOS~LRe4(B4t3Ovh1o&yAcy9pw{^h&3>k)uoZDzMT z4fxeAtK7E|%KdJ+yp3TVGtvBO*vWfQ%%n5OPn-bYlRl~{fy~6L(52z-KxX1O&f7IO zotgAKPuphU?z5c9)ZLweTNwnAs;uu+i__zGx1pPU9T#GnV2Mc zyMBdwI>#xFT&u}U+AMw__89VaSv7HVJ7}*%*9G^pp`Lar*G5)CdfN#-Hh^7h(k5@O zBacVBA1U9&eE&LSR#fot${pJw06SaQoLvw76S&UUvIFv)%(e6fJKDrD&*dlR858Rt zHfPlooAC}BlmFQ#iJ8pg`3~*QKha^jKku_4bKYc6-e<$B#jG0Wx4`mGtv{r%?XA0K zAOLbejlc9`o!^0-m!Q6l3aiT1;d_gFObXF26jA znQ7zn1E~|znVHJ^c~eu$nOXa`ou8S6F|&?VHCatb%uMUytY4=znVC-8;49Yl0BbW# zItT!cJ07-YAi!Jglno)D>GZWjfL~^o_Xj+whWhN&g_SJEL&UP^}Kz(wvRi& zkBGn7*Nt1&jt4w{ZdkcE63YE~_g%ODKxVG+Vx!5~a%SFw?@uu^S1rBJEi{jrYb<{p z+~W%~Z$D&9Vyq!E?_xUaIIMfjyEsXKF*^ib0FZk_VsMVRA_InV8({FJDK_E+sd~mL%v&UGRvwJnfXgo zLEFcHOsINbaQ}(vOz08QPBl$|2|260FVo@o(TjE#8kI9)$Qtp!6Aa)ayZy>MbpP{p zmw*Y!3<>XOOK zXLiRmx8v)X&n$7#s7ih26Si;HpCgw6I@x~y3h7~;Ebf^?`I!b0s;T#w&$Pjg0Um9c zPiUU)XR8wCGvz)QfE}1m$QP&l%TRCd+_$|>R5PDRx7U4)Im>(|e$Mrq^$p-mjawP; z`-GBxA)fI21jF#{Ou~GED)e5cq%fcHpYOIG1MQA8%Gl%Q&U{9x8cM#eXFel_eqEXZ z?F@U7y|5ba9~QMC|Kl-$tq$G`f5Ci)*v4i|h580BQVY5TzYiYyyv6ZB@Vn}!p}|o9 z;LV18?w$s?yeZ}*lpox^>QM0x=HvgzeouxHz@2%Do2mdFSnPY%ZfPQJ~ z7X|^;5XLN0hjhQ{P6b_mNaZeaoQ>07Rp)OH5*@tO9yumboXIl85F z0@N>AT6U%y+U-5HF!l}5%O}@m{!*Z4Z=;4mYck>cO{w2GK7YgwuMEIjqL{s41*D71 zgu1cAn2+})q3-m}0DC3p_5r$k$Ey5lYsP$ft=RSF(LUzGb}Ti!3-$E8@B6h!OMs?l z%WngpJYK{e&+ZFw(wl(`fZlG;Q|2@Pe_ek(*?J%Fa%(fFFa+>&J+SW6D3BB9?L!t7 zLHph7{q|iS%X}QN%BSziWj=P%k6y(?`!=kzaW486Ge(nwCV=7GBFwmCy7?dO@M(ztv0z3>%gN)Wg zy#|I&ro5aO=%-qKZ_Rx4qG#R^!?(`4v<)NjnU8jw$;puY0GkdL=K=rqybD)_K!0@$ zpDQOo|8=*{>9G#_tMf`U^(^#DXTrKq2Ecc1mnSI}%a~8sqg}z>QAYJ))&!&4I&&tA0Lp`DW7UH9BSAm{Nqnb?CRsw9RJ+~g(QMfy&d%ii7 zG|f%hFnc9HeNpIU9=5Prk?qAKjju9xfA0(MN(}d;8ep1eYGeeH{CaTIJwlsFeydrn zEbY%Ef2MZaIprs$w_I^evn@cw+V}bQAYW$Dm?lX7(ec3974UogR;DnxfJthvnO@4V zWs>THO!138lT`HGS+Eik~gji%Wj4;$?L~z6Z`cgVtNt!DVE$tf25N8=!aEu zAN^EHO4>?&2uU8JKUv9B^!F&KSS|J0BdL5P_4Olp-9hTlQt}#oFiBpae{M+y`frt# z-5`kmFeT5fN&UY{o}p7SNh$hYl{`g%lai-||6}yaDS3o`swE}pe_Qeh{Q*lJU6cAV zl|05c0+J^fPeES(8SlFYJM2`iGH^wmFS06QlTOBc_ev(&fc2a zCpwgQBHqu@->{?(Y{U4)0SII;45-7Qke&Z$gBc#5m zB=^ualjJUWg1L+SJ0-<)rG8o^1%%H<^fxUzkN$uqXVC|i-l;rG}#&3|ELI32E zZ1i_5$w7b0l5^;HR&t*Bdjb9VN-m&}C&>l$gDlD2A`Oi$xrl*?JPXNXUViPEBp;pmN%DzaS2WO3%vJK#Q-J=$B?aimRdNOWZA-48UsFlJL}{pa z$+bkOUt7s_j1wU#+(RTP2s#PqyR|`uUYy+K7D4Cx`;=0 z{$V92i65DKzq>QZ3BEk^FN4OzarC7oIY#nzl;q?njlZMlw^?!+F{_}!0w z&L#WN@3v(BMU-<{`T_LUE7{AB&udJw$5ZNTQL>X9_3Xq*?2?`P&_mL0^xG@h^A_cL z-$<$dX35@E9FKcw-0tFisX>3!(YKi-jqpv=minQU>_8`tlI<7|Lb46xl}J*E-di!g zi)1Ut1(9ssL%(O@xZaBXd?hKrar|#rlKNI_t`Gg`%JXkQA8L}#=qFjSj__GSd|gZW zU@hs(1maKPE7WUA7>7o(miifw@qr|(+oGqb)fm4(vKoEDN#fC$og^N8-bq%YKXyqR z`e&D{M4xbynBPe681x4%Sx(=}F|LthIr?;yEH_7bMq@k}$#U{k6@&31Br9W3&f`eW z#`3=52E*?`I6hV^{=c@fjN~Gk=qIZ;lJH%Oey1f%s!$G>pie!?5{!={|2>lE8u?c0 zCteasa=Qfm4oeo39*sb^w~~eEhgh=UqSWoJWIm18aP&(q2}eKtayXC1=Uj{*B?$|b z#%Ynvz&J;eX{48@pkHgr6!fz%2`!WQ0+dWczx|Tw=sZ*shVfA(vq(?R8II#-P6_gJ z4#tg<%;Q^;BMIg8G04M|B9yZ!`;l)`(9gRZ z&&i}eCt-XO$s`&tlhLoXBxJPIN1?pFsU(L}KTG4_G}kZdH^D$lsh@huD8hdzjbne3 z-vQ{?T+*NCzcG{e@pzqN5{~9YFXEpA>0MiQlm{Eq=hhfMMPiA5=_QudDA(r1Z<9)? zUw4UsJg(`|{MZeBL`pjMLwlfo3EBZ|58?Q3jqw~L>gcyzLVn>Tis&a_+(^C^|6qIx z@o$U=BmRwXEyTZYJd1y#zkcy|@-bP5<5FCMdQye_^=F8_*gyoig*_hJ$6D6J?1_HK#m*RSM(l|G-oaxfa;=Lh_#77T4;}myAq$eU_1zMC-N2A4n6sa zHBkP=>JQM#uXybiUTn*0^{IKp#F|Sxsk^^ z7>@HdHx%WZ8$|KX1`&S;lYjle6i;jr+P$3r0F28Zi@V@Q_4(ntP#%AbQQR{R9Cw^Y zTlB;4j?S$)7mBOkgz>1j?zo=gY;pW@HcA+`LLRRI*Fl^S)!z~A1Fi$b$?Jgj1lOM8 z!)a1H!gdtLuPxd+@;DkA6c<9hgyL?rLprIT9l@Dh!>5Qo){mEV>mx^J*j;!oS)_Oc%ctyt|#@Mk$&oh@w>QQG|qbQ{YwK#aY4L^ z9zAJXx}qJAnkdfBFN)Xolj2Y{;JQUrNAZci4w1(BkjwR3il_7v?K9B}T!+fz7s=uzJ?1d} z(*s-|itbW;tYV7WSA_Hw-Jx-N8|_`uP29H-UB~%KbPeZoQ32`?Q9klZbP;`Ai!P4D z_*NGw4qGnab)MqyokcrYbOz(GicVAfr7XhtB(66^hjCnq_MjdU?V@;R^0;gm96*#x zapY1+FKnjxPl=Jz@h6YlwemBL{}uc=I1G^V%5tTMtW}^#d(v(C!0rclfqFRMe`_LlRR$OPw9LknvXusMGH{>iWX2j zzj+h~D~#fBO~-vm(KOtr6HTRfVj&b4Z?XaQZz8VqM1jww>j%+T!gn;BGc^L| zU(pC$hl_?$T*rPC=S;L8@nE>l5;>#&CvqY=aiDmKb~4Bz9@Z3B%!=?b!|@_A#&xWy z1FpYBZTbBhRVGqEJ>&fw<=6Wst~0%V;C`HU1MY8le@FY+yB_!byz7v^-rr|R=Rfay zT;F(q$MvRn1Nu_;{;45dZ+QR0IE~(oB>#%IP7<{seydP?G&OY1EozN+lc){a$s$dP zv(|y)cXgupeqC?j{Gp5cnIe6P<0qhajm9*enGpX>F)pgejO5zf8ppjg>OGMs#Z~mi zeG`#{@an6KaVz~O{+l0-tNs)>azIz99Vr?}^P)e+OY^6AU4tne*bo|jLvcMV8bR!B9)o&WH0~P4@ub)Rq7W)S9rtOP#{tR1e2fDuT0rA%A@0wL zA}HS7V!qrtCR#<~c0c;c7ag&$D4hV~@Qg*m`3`{B1;Opl`#=v~BKlvUaZs=s?SMjx zLw9rZF7I(r{toJA(S7P~3F(O^G~dhYiq{lB?=8i(dq?`=Jzwr6*cW8Ce8xDgqHpb_ zF#|;PxPKyQAUXJj^Q7nx&2NenS62n`<5VfGSu2Xaq(*VN)F^JV?7P*$-0Y(;Z>#*Q zeBurBP79p(MNL0?WL<#q*yJ7@Qww^bsdVrBT9{`PV!wtCdDoN}Q(Jr_z!gc2Ji2$adz0n27 zAJSg@b;EJ`kq0XtQn;u`DI`o)m& zGC@0yGbg*tg5vX9QoL|kd^RhJk85p<{j?!F+NMI7*B|h-bINaB)fVRUm)-Ms^ar~d z_eHrrIDc_|RNp|HueiZve-EX2y2EIFGnDcVruE+-+|T9)qug_Ya6ab-@Z+v0&x#Gh??WT^(Fhk56>~U0TgFUR*yfe7yW5{Gib`> zjqPFmG`OL>XF15(@H^9O`T@Qpe&~p%0luT~yonn_@tem{e6m1X*K>jT5uGo9ofKGc zIDFC@#*JU3u-5?WyPzjqwemndCp@cISOj+ABn)50O`&*gvN&o}SE5}!73}~nl&tqtvTQwjLGzVxqcb$~}oK;G^@K&Nz^r?_-lAEu)n#HHgpgWHMw zP+aYQ8KmLI4DP(`jzG?rOOQrSpcH&bi=?@v)LFJ8MID3iSc&1EE>0` zD8Bb8w79n##-T?;Ql99O7c^R`^DUI ze!K+(Bz&IJ{!5t`j@NRce7EZR0rH=9_ZjEsT z#cgnZL9EH=KhDJMX@9OG?H_jDf%}aD+W#}AeL-uq?wb%jo>%@+@KP~Q#_L|sUHhcXH*6J z?mi>t@L<5>uZ6*(K0sea_<0i_#CV<|?u~YdxHs;fi+zyqVjtWe6!)Q+JHFH}KU{Z< z`%jaO5Ai^X1vH5EiHG7olz4bcseFh7Fn*$VB+99H6yZIZVgboxAW@JrS?r+@lABP% zb2^?siNnzD7SF=-1@SD}@0^YLS3DQTfq33(bFaU`xE#8DIjX*r&&iC1G>V{ts;k%0E7cpa|4#p`JwcN4BR#9J`l zr8pJOy~Sxb{=~a*pGJIwVlAD;^|tsN>J{+?lDCT_e}#BnD}IZ5Mf?%t$cpQ5zf}B_ zUv4OQN+B&yBjF-k0dmeGpxYH!aaaeo72b-$?X%xv>IB=T!Q1 zer7=Q7tpz$5$?N6OmX~3tZ+ZF`J9T*<1Fc1*@F6E-U-hcg&5CXVoB$WR&)+&i|bX1 z9nsr?=-i#>hXIrH!1aNo2b~-CpnEhuK1%I9i4(5-B+fXVBrdpLA#tXAMb1S39(b-L zaisemj{JK05kR7sBi&1p{ccNgXiMkmHaKqNc$?ArtO?yiGNk(lf?&KCVnFAJ`gE^B zYG+RX`V*h^h<-Zst&QtPi5AYslCHz?{z(_&Qzz6Xa=y2x^J-1HztqMXxU&;4>iz3>zJE&hRag}5I1Ca#k~T&Id_Nk7TY`OuCLf5Uqs z;;$6D?Gvw`elhWTj9V;zgX2v68ufzsHJy*WLi?Z@Hc9s*#IJd|h57e2#ftl|#_!-N z(7V;w?f2Xp3+;rt%+IU_yq-B-z6*M<;nCY(4*Yp#d5L`iz$WWyfonjn6!xi2=mz7m zMaAbjE^MxO$m%FOphJF}m&FOv+p#Gmx{corP+!1@MXe7X} zqS1EY0KY~(`vTD5Q_-mHAQy(Mf1Ts+br^X?sO*AqY#im3?*`>eBAxORfF7nrwx7#E zp3IIaC4Bn@<9Cnerda5gQZ0hES&$)bFHT-KhtRcW2Y=1s`X^_qp4abP3j%!D zxKxWAXC~oBHksZ8xt4SkO&tyN?X!Q>z@hN_0Ih~0?$GanZKFzkp`Aem;i*%AE>f?+$brk(_+-77w@mI)4<}AHH*JjtkT`{9uXwFqk(2h9oST2>6ZNFg9l@ z=z(#Et{UjUchCddFS59tF#lVN)!X;q>;8Sq9<47^^KV->K4?V~i z^6+fMFwhHA+;;sr1>4g;*$bj^=vl36<KAV3N37kbwLrWE}N$e>OkoOJq)_r8akB#PI&p3m;ZThQY`fBL!ri4)ggs}iO8TNh;^xSl=ci$Q+F8t>NVpQy8addTv%JxlFRtCcfKhD7V|*zx`eQ{?(-+i=6?_gY*0TbqKx> zxei&p59o9>D|`MT7^f%N#B0q5KAcqSxJw!4*Q~8pEB%4~r;LUyZVmeV^gYAg!=e4` zb46nkfqywxqN(Zd``P?a1FE6@bH{s$+5nx;TMmCy4*k4nAeu4)Wa6ZgCr61KMdbMMc3iqyRO_2U_`LFXKK;PH5Y(Mvh_TRoacsB>+_5F2G=u41` zs?_Sv5l~;%pE*4mfUh51RDR5Yaq=O5-A4@=S06_;4B7|s@-a)L;RXEu@qkrKImqKj zyRS=E0lpuNCM8%y`ybu4=c)jIKRT)WxCZq9c%}BecO#R0x~*5%8Tj~lh~$9@=!LK2 zo$}iPA8K^0R{Vl;wR=H-fc~nxZ`h|N(4&4v)seFxS6{!CIBI~Le92leYZ%Dm7n6kO zr$E;)j-Xc||Ch|0H4TveTb=ZNzod5glN4XTul9qMIzYKPr+t%qf&Tl^ zAz>L`?@u?!fPSC{e})US_d$Puoo^Vl2-SS&|5RY3T4= zsRG7jL+{1>W0q&kQ zwj_o5w20T9J8?L`+a{St-pogJw$+LemzhtiinI+=elj2RfOxH~CCsPwp&0H%7v`fe zGHt{1V*uAq3mnhG@=0sPv}8V-J)2Bw>zPldNx-jg=F_d~uXEkoG9P`5jyo?xd4unx z{Pse9f^g7l@NKwyY|c~2Z*(K1?z%ejFgmgNnk#1=>fMZs{oe&345|0;Eaqt zGXc6B5rs}rVm>_zB@dKVLOUPE<{anWLwF2x5LPw6dob?5WERKw%g%H2TWCjLkSbgh z#C&wGS;aa)KXe|4)NO+D+S@LjjstpVwP+Z`)2-c^*kieXZ#$okJC)urpSH)2x`$K) zJ-w?AuYh(nY?JdQLwg#l)h0v(-P`2*?dRWfv{f1YdL8ty&C^XCp3eq&vFcEb(tq%y z%ge_hgMeSJy0%_D7+{@ry!o_Ve6u#}8}M~$NPPnET_tkYAO5|M(!}uX_du>1Z}#=t z2Ku1U2J8i}cmF)RbZP?V-#_O^4O9hr`@?d5d42hFnNkw}j^L+S;i~>1pFiB9N|Qlf ze76;awgLI8oo15h2YTe&#k1w-K|a5B^lv{9^k?-mjavsmFMks63oZkB{ebU@B=4`S z`w$5AR+VlVHXQWA`?XDGZ^7Pp-^T9%KVCm3Ts4RRe7?MV+iNiBp_=wei6dbisk2}A zu?0Uqa?VyC!ilw>C*pPwNf=UtLP za^|&BJ6s#aLC>ATUt2B%c-`oCb|w7&Ytq{8rGQ`7x(_3OuJ)JICVYW*?9~R0eg|~2 z3z@alZa$22|Cf)gfvz@(zect@&3r7{fLs8+=24n1U7-JFZcK49(93jz)8$a8*EHa4 z`C%9bW-aIRh=cs*Z^3?qehJ@iQSStFw;UsRSPJP@_oGTb!ZI`Wveplx9$%}kMvciZ&TSixRo{hn>~=j@UNWQkos?axtAdq4Pn(UN$<9E3 ztH=^Z{@szVzOUCi(6eSj|Mo3_k0z5|med114Ew75h=B42x>bkg0R44ct2=iD{_9$R z+`;d9n_#?sYkn_fxTWf_OK$UfDjB~mRNZV$0WV7(&tyHIpOvKc-6zlwHcF`$uHyh- zR{Oph@Ui=F)Z;hEqy4p_QENaBy04$KCJDZKG=^`#WC`-H?Q2vn$ftAQ*t7G1Z!Qz& zIH>_Y-3+wn4FS3KC@}2p6bgLxecP)o=#Rfz?CjkY@crv+yjB_L$DV?HA*Xht={M>MBPqz};6C^82A_#J4wtQ_d-+Y&AhP5~JnF;bdymwaHNx+X04y%F+VVnkJg>UZ-?T%W}J2nvbI{N3qdxwC} zW6gq$BS1dJ>9qgw9PkUw>Du})&?`ZU$FyjG`DtQ+S`aVqlUeq{e30Le#Ed;0(09tX z2LGSim`~`+R3X?8J~Q?vEW6CV&m4MwlMnEBYW1v08yNR9Cd7!9LB3`r#%udPe`oa2 zo~H`>Ce$`z*Vc0F%cGvH1Aa`HrEw<;)3Fg%a;fB3) zq23_tf(Oq*j>q5Dp3A?N9ABn3aTeem^h_;iC-iSZ2RB=O`~+RKaq|cH3K9=lv>NnW z(Ci-V7K40FxWE+70w05QpKKje(EQFc`1P`+T#%cP0mI*@0ewSil5>}UT!#A8zUAM6 zhF%p-nF8Z@M)oj=2QVMbaoHEr9`K!eImmJErGC{foxoyU8UZOinJF!+avg zrV8)!-x-bp=b-%JQ6=`P0H4Kf1{>S~-=*5?K1>1mUaD97uFq5E6Qz6m;9QWysH{-~ z+<;C|?-ZVW1bK>D4dWd68`Wc3q91%O&B^t>GNZYChyfz+gNSl(bN9{W#w8AiC86R{yp-$QsPvQv&GM1kDCI% zi~kzc{|3nM;)M$aZv%b5q{8o@C*T(u6`?xoX>+;gRoU}xfbPrJESZ%8au!n=uRQ?h zzrr@RA5WK6w=#BT0)JO`H4o$Iy!zdsD>ab5y1UVDJ!mIx!;^kE3mi?0xg!15~SS{~rgat_*Fw)<2Yqzn2*l-PZqG1n@;C z7M#-VsPYd1sulk`Ky?%R_g@jf&6x1krfNw;ITMzaSCtKlV!{u3RWCF0n6S1|u~h{F z7|~H>B>Y}`@yWg0=}cG`-=?KFi3#hUXJ_?<@9!goM?<0fuhws8&w+fuwM&8*C@|sA z@K@_bsW4`jl7a~o1037GK42H{Yn6HIt@mSNP0bU8lan$%s% z;%X-TW?QbhULW9=XFF_jnYeEJ(qX&C0=(kUdj1S1uD7aPZhjA7RGM|v4uAz3!3O*W z;TO9-T9CiNIiULsDF1Wnhabu#nfP}?*`S0nCjN8fVv52Yfc`0M`GbRBw;y!e&;|09 zSgXG}#>77+&5cehfO>`-ZP`>J!{;9&lz03e3&1-iHoXV3ILvr2v$D?aQCZLC!A&Z|ABz2|L+k{nxnI_7k*1&pe>(7|3xBQQ zPlGzph2qt>$F~1}2{qs4zkAcd!O{6|QRvy`#`vCYA^$h@X+`vz^Z!I3KDFzAr}nfL z{M&zyZt(yARdCxh$!Yda!tCa9>|O5**O@qI?6+fcYyZ|!;T`X_568#qedH&0K}I2RQT@!CZ$q4pv+n!dyq4>i$}XG1ovrz|2W! znCpxQHtnv(G1vJ)IzN+(nQK(5KcdB2%=O@ufolp5FxRYIf$TfflXt|+aKR7eT7PoF z;n5+?t<%eV&sGBF=B(v=Wq25KV_OF}OwC|!eKh+dT!imF?^oPbNMde-GP!SK&oH;q znyS&^kUzM4icdrybDQ3=_h@&hXa0fhnUZ(RZBg{&**?k4ZHd7E$HeQ*E$+ag1m!~J zmJqT1#-{l1yklsM+L+t2-!A+)={pTgnl2IhA7#SP6% zTFmX-u7#ytApeD7_6zbKGq-C$+UKeQUbjEB&r>gFZg(dC@lj7_ZY5=N&+XM@Ze^=; z6gvu;Th+GFkJO>wkB5(4`3dDeYd`3pT+ZCvypiU2Z+Go=;E55;y;Faq+ou*VcfCB9 zzM6T=-E8x+V9)o=-GeP!zwrli9}wBua%KZ_AKLNDOeZKGI;&T8Oc-oAA?cL~hYST6? z=3Y6hvoKMCc_>WW{On>L^H6P-X&0TuJh~k;n0$By^XQRg=FR}Rw?201QV8>4eeJ^+ zodI}k@h-Ik%!7OWqtvgQd58|)=r~TmJo;!@?3>t)c?_SwQ%|vhd5m0^q^<+y$IY{8 z`%cI_f<$Jn(do=%L&qBBT>y6pFW&nrgLxcK-2chr3-dVI#pqrU)N?Gy&$)3zPjI6h7e4wSQ@c7^;ml-I}bN}gRY9FJ!giRz?| z&~H@?zvHP){ZQb;Dn&Do>djI-Jw9Oj9`7;CkH=fAM-IPWcqxx>81~2GYo0VbkH<$o zTvi2?qx82(SC7{izQ^MwhWGKPh@^D>0mxyxc3Q=QWj= zLkth)@ro}8a`uSuxQ=x3$VEDNoa4WHGmjh$OXP7zQyQMiBb)HdMt*zbV0a>r3w%B6 zn8#^8?A%x8ahU(!$vpNZN#(~Q9mB49?Bw%9`W_5B=&=vOe|hX8JXZ7N-!YG6C|4d! zk?$T$in0C(48!FSK1>>R%wrDGe=gB^KGhq})1wbS4BsjLeLj_6fZ@(O7GQWRdHO;O z@8uCq^j(hO)jU=b9pZ|yU-1~G%OerPae1ug=?>#>Bg&!2W(?owkxVcZ$C1YlluM7D zyc|0K9WX4W#~z~79vnX&yD?0p$1dvM9zHChBG3!v+2as~CG$8z^`5}+P#&2WR?g!T zjypNuWbib#pNZqlBa8nAx}GBWkmWl?{XT``+~YLyF9*k)#|7elUObMAd<=KzaSg-L z$zcJ}xq#&H8c&ZOAaB%uK89)Y$fJChqNHIvo6GZfX#phpEFeA?@%cdxi}`jzuinKl zZXORXES<+=;(w_+Pir%=dwu+>IzTJ_Fyy zImNFoKtFG<^fC;F@;B^nFX;#UFUZVMss;Y!@bf(2cl?#k?-1a}wqG`y8o=*uqZN+E z15BBBYD)m5Z`I{$-UHlXQ~V|`nR#sLa;B*r;I)3ynsi&B_nJoOyzQ}em{IXTki&#F z%3YoVe-a)%7?1+}OpF_}ts|6AI2|zkDYUcJpr$3?uQf3iyTf2SCAGWJzV9j+pA{*R z9?+k-$nBXGAYaR-85QXR9+B~n&T2yWspl1r?Etz?O5Xfz`xKaO>&oKCKs`fsZ!aFT zfO+&c4_#si<3jv%?!{HmzUQwMw+unvTqXz1m2}Vj=UeU35OAC-lSSUU26G z7&(5{=#Mz*0CRsobf>OZfw{jq^6q+tJ#&BgaZzIA z8RlNGZh!S-uyY?5Ag=23X(d&D@`)RMejYd#5BSG5!MBTlZf+I%5az-o5&x zR1M1CsokDAg|~-X?dOluWbW7Qcdv8>JM7A($X{ci{flm8YaT(n=eG^$?vcdYvolML zs-7_Sv|Y<4xk0{dZF3ZYq5S5z1ME74F!#h2YxaBtJl5{nvn*>Nb6?X|YPYzrZW>@W z9O{psJ@@>kIOd+P`tx=NKL3ExCGP-_#BMfiEcoABEHL{C{a<^gey#}YytS)i#^r;Z zws!F763;-W@2~w|+JL>c+TccqH_(rj$9u&VK)n(3ew401$lL>s5U-(YZQ5BwdH+xD zS#5zH1Ak07G!p1E=wkPZ-ax;h!~Te8fW7Fu6!3!jC4xcQMnJvZclUp3RAla+%I^vl zpdW5;)vKOBzn$IIq{l$}_S;kXsDOQGwB`IX6R1b$!mI(ifj*s{1@`&@eC$x0X}b=7 zZ|}7KQ#aneT{7Y5Pq0(l7qOZcyHEn6e>n7ZJKR{t&rp+jzm+8#`b_)S7(-9W?Rsvnk|3vq;VsPxmDbJl>GtLEzh2~XHS83&%>c9yW zEsMdrMM2^4Em*JQ&wkJ^yO_D1P58s5!#XJYNT$tYSl?u=JRGnG)>D}$2iWz1^;JeK zS3d;WIoAG1snsf27wvlB*9*S)_1%6_Spn8f*UUVDUv6t{b6TW*VQ#CkLnAN1x+wNs zXk-Ui53SV9w6%cs)bir`u)o?fw`jk}A0wgurT&o($M|(x|1*uf07mRn$gqI^&F$jS z_b}Ao$5d-WA6UlY=$eCS$r;n5lW zWae7=?sNLZ2Il%=L2&0Zd*=GA+G5YIK<4^rQ%%d+3z+Ne-8OA@!g~1DqaRN#V10W# zuCrNc26MeR^mX8p$IP{$SLjk_`{wm+cH`!<2T(qc^~R97=k=i6rq;^c z0-*kldCP)^LB0)FUyrQ-yw(l7So|G+PnvS%4@E59R_48xh=LayoOJ zwo3iOX7~;^?meai@R{J)b{HGaTt_D7D7=8*M+|cDTU^du{pWwQ{|)sH@T#As3;6nN z^fK%Lc=_I$UgZPr_nG!!zzfD)d;d6gIsH0(CuCZW)B@;#KIEy8xpMv+=9WM?X8(D+ zH?-?<2JnIYIG5)r9))%tQ->Vs=L)drgo6Q!%++?uhVa(wn5)fy1(a(u>sWpR@UP8);my)xccpYXfH3Coz{At9(!B zr^{Qz*MaG-%;k0a4YM;=F_$u<`dQ0En9Eb8L0dmVxd++%tKZLJE=9fu!6A_U#+8bC zE%?2l`r^abDa_@P@q~kU0_Jl5*N?|jq5Z7&ZHEtr`i^ugesvhy+i%$Ym1PEVNk7?p z+#Chwl2%unGq4qNNiBTfH)tVq+33uD&4hf*hg5t&1;2;ty&muTg}F@XnbPO-JLWQG zftTKZGt6bgtGVZ|^ZQ8iKRWe>d;@P5zkCk;>_1`F5QRYI(r3T2);CBOYbzYB5HgpZ z2JWXrG?|NAi2eLm3z&=3$&cOdKzfe{!5uq{0663J!eLOZd*{(l9RV-tZD@e{pAJeL=?bt_z)ZvT%(;5okJ8ZaF9H6)ln)Po!1t$a!e+ zM`-uUy6%+;eVFryt_Bl&0)FqtEHLBieUs-~;2OZ3UnfTXP=@v^*XuM*hx`@At6K`+ z0bCs1sV0m$m)~!Hp&rVWS6ieXhyIkuCAIDu!knKM8WleSJWI>xUYHB{OQ#R8cZU2= z@2XQ) zfYs<1>1VZ^1~&zoNaF`y7y$RXZ&9#=v*{gddO1W&xb9KFkQ(U2~&;&P1S3QXlpA zVK6SYh`U!#gK>8#p+0Oq&?gh-{g%-0vwFv_+5mnR3?H3Y0sXizw56LNz}%-gzrFx| z`GEn`8Q^iH{^A2Wkc)!+VajD7ch~dIG|mG#DCXyJsPBPIXrvhE`JjjWf|k(!1NZt_ zg@R`IXnT!{4%AaQ>Z8L1=-$LHxa z%Io-XyT`X64e0hGphop0(CN3vgZ{Sw{z?n)pa63G%e~aJ4Ej;u5HLLk%2fq=>9q!Z z^7_8}iJ#DZC6n&&JD2k7SHSOKpVvXruKzKv-uV`G1A5)l(@Gi!bh&G<8Z`mZZ`U2m z?+0>!Zr>``6ySf(jJ0+u(BCt{0ZtmR<+(ZE0soUVkw2zFzfXkUUfdVxawK`##7ltB zA&b!^CBU}>#{)mtfLtHwz}3uxdiFYByr&L$?e6V+-5Thd{wC9MA$)He*FMh+`jfmj zbm?{|zZvHh=k?pQHtvLWk{aS+DA1N-n==+ClA>hIM+UYBfZpL+%9 z6S1iHT_*4;LcCM^0MH|1)#yjCzHXM=bt~>v03M5uY(KG0_#fYt9uXY*-5BT{VVv() zIk5R#UVcbY>+v8@i-L3-U$OuAru2or%3ZqyJr}lZJG=?{HGg!Hx;nHoH{1R65y&^) z8te(EZ_1Bet0%&^58m7TWhBsN(zgAd2Z9_-_ha@VD33!)o-I=^#)J}Hk<#OLkd+iw4tUQmA9%~^waeV_KNRB#pY?JmLo?d!sQy9)h3(QbJ4 zPQdG(hJC~=`2A~tsh!~byT)MRpK_Qd1rz2(g1w_!-F8R;*c0mBI=>Es9ij4SSzxlJ zJfHLTF*T|T`0&ZrrSBJL_wCCyX}nxj7W!T(2R^;{Sg`*Jd_Or?{AMkbd-D8PzAB8D z=jw}+z|M1ixuQnR@QnQ2O)CjPi;?)%mzO#JEm&2PSpiK}NM z=LIV;@fTmQV2>UXe_d4C?G^u>z30TQjZn`1xpJQds3)&v?AM0?V@xvFeS~^A)nn6= zApQBKVT#X~_+5TTUF9t%E>AglyPpQYKv5`5XW|MwqaaHj_U_qK2Y6Hz1bf5!T>N@} zyw>F2O#J55&fa}r0UTQUerFt%%Ng}U7vPKTnIkVjy=Ci+{;Y)hUevVK>U4yOpS9Gu z)#f}Cm+HU!ZUgzAIy`#a8Ss5PHdp7k0H9sf;l*K0{4mEX*ykM+-@ll#=Z-SK9wiQ^ zGXUmyOpAlxA1=7P@9i``pL5)+ApjqE^)q(`xTSa8{t*E0__yzr$HXOBsTNbqnfQ^w zsL_2Q)ZfZr-F4{46BgfX{SRn=kI9LpfM4moU=|JSJX2IQ-oCXN&*z!p+jkT~zq#iv zIvoIbacA#*p#Q56n}*&Q4gFqz)LjSY^Rd(RvYF8Sr?-Z^)#ozt=gEgx90I()Z+YHA z&y$INthb6013!QB*JuGYJuR`@rNJbMo0rV|G=!cjjbM_N=ic^8wr3Jm)%&)$9y3WR zOAmYX5GGN77T>j{7L&BD`5O8B8Ix#O-MjkZ3&3esD@RUak~SNop3U3{uq0kf^>H(7 z`>49J7u4HH&2hx#^Gwp&s4vsYVv;Tg=k(yyJ4EgaZctzn&3L`C&~heeHz#|+nRfsW zzV)8J2H@Ii!vpD1&xEe(yT(KNOG4^jMKOt*#3a*G8SuSnlDWW|NmOpm=>c*rQQEIp z)&lTTtd7^}7YE;+m&~#fK>v#7^ysDuux-e9@89%XE0u{G#|9sK4)XLP%y0kAR!sb} zy2%Vc7$aizd^3lW&dzXe63ab%u$5%?dKg0)BqXw(&R&`K!FL=hpxqD&ms! zhQjYfm{c_ql> z6)Ja$f7S+ac!7V82kB?|=b?bt8UFb?)OW@NVHW>v6XZXWe;x<&eu94%2Xb_be|`w# zGlPFF3ghe~{~QwVJ;}TOfc~H2pRLydKYsZ|@+K8wt^! zGskurU(W(2{)=}z(20q?_-DhQkN=vBbnsY%^58xQ`R_Ip<;RtOX8DZVe?ogM{4-|I z+b(?npm z-#-656~>Pn<(H+q@#6yc;XV@O$DJQHp8tU_-ybON#`A$MPx2-!??QBNT95gi_~)w` z&Ha+PH2`_+!Q%~b(u04-4&&L0e@;A++$4bB?aueNAGu3_{y8)uUJl2QZw^cG+uj}P zvE|3hIwrQ}>7dKRRy=<|KBVq-p9AEdy;{KUy!^KLkMzwb9~L~F9+R6@dnOk0@(KMn z=iOXrGO;NykMO%O?~cNsi4D8pw*fCFFz@K|`Cwkr=iPfi`}#C)b!t&Qb&QY?+K$Li zExvy+zjwWd^y}IK^K~h}aoJf03D1uFGhG<(9iHJhZ8r?t*WjOH_a?WlKtHv8IKI`0 zE~=zwTJr9MfDbCWP;Qk;KPWpR9?I${2U7PMbxhoX^n?=cHUP$@BJzi8;_0W%xIfpV z`i%R{(`gpKMei-Nt>Jejc{oxC@O06b!7%`>YTtDU1h}DRlU)|$8jId~$7Mi0p^skM z76P27P+EKhpyg7NJN*C->gyE^`I`cdeaYPOAK#Szr@|!T6SV)^bV=CG^Njmh`K~@1 z>ihA1)r61J0P@d9${E*idS9?bF~Ea0Jr)7{p`8#Nl+3taPmTU`83FK@P`fe=%C{~Z z0D6aOxZ1j_(-45BDnI@00h-u&>{_KhG#pnwmILK}@4ESIG~nB~%l7j-uuBy6Y(F2_ z3w#Y|GFO9fp;kR>)f$9XJGtk#N}9z2K}t@*Vr?~pzm7yl-O;B^j0%U`>z6h zq52_hLnX+K>Vk-tyJ0?4?Qe2Yo&SDc-6aO(xRuhP3yvnu-)h||jb6ccQ&(FutJPhA zo7E;jzs2g?b!Q9?-{b-v!NlZZsO^Xasz2G|jPo2I-B9Jh!Nu z0GzYEEQOb|J2B!xz^C8$8x7tvfQp@m)+qpAQ+EBD$n*K-949qi{$@OSwXC68ZvL$L zd^1i1(&w(40Cp7j^I|~Ca*)HHt1ODIYC%0}Yl__FLiz)zD;9C^`$8z@U!G+2yaV#~`P188H$k30rDO(df^r{3y-pPYzu!kaSaccW z_FcC}uZn>l?_xEbe?$7~c9*hxf_zu}JXjn9~73NH6=+EsZPg35jVBC#O!(X?8->>h`E1R>Jao4u)3%QfWxPl8YTn+TU zpr59TD~!VeWw56KpR1uywi@(cT>d$YTRgumbN8;90X_2WANAntz1X8@%t7FLu119F zM&Qo{`{A$4fSzZos}6090vPa?l>)vwT_Rd(fIOZVII90W&_mh19fv;!{+<5SWSS0i zIDJL0EC%HF)So8PzVLhI?V`~c(BI<;LB>3tj^3<&Zvl85<)0x#zN34UlKKK3htKW$ zGY;@PtQ)>v8Tx%NuxRud;M)QJ@)@Q;p9A(v>kdKx4up*w@EY1bFekTfI?!u>_pG*= zQ2)NFmyfy&;QNG9(lqGLp@&GH!~6X^^n&!mV(mF>Ae4Iu>obt!1DjGU7|8ztr><)G zz{mYV*L|=7Ip4Q8JeBY7K1cudi=e%IYDYbKf*#%Hn;rfL#@qhIF=~>*M+5k^`?Xq-V=LaBb?njGK$jg6jw5?Oy*nQ6`qLlik@g+sbMJP){gSN9HGA{0`-htWC8{UIo9;h~av2kbmFv7I*hDE^EZ70qNI44(vi|zd?Ja!eftj z(rAXKFART`KONxln_n5wC0psL!FbU3XM%p6-vIJ=rqt<5JD|^5@ur~{p#NvznPmO| zeR6J?Q~rIByK^7hY}NoC=Y4bi)IrWJs7+d{z{~CGuC2ELeR7SK%yxote9`V~g&6p8 z`P`@h20-_M&gIh=-h%P+N~p5}=v+{2l9>hg6%2E;c?vK;e%J4ZkT2hT)W9(??(>tf z=XV1AnLp*KU=-kSd3Jm^p0Afj!nzgsarwa6ig7SrFUKV;>jm<3*=pLjJupvQs)^T% z13WMHnt4MEcwVkg+n@__bVXyxqFGSSRm-TSuK>@2u^D?Bpj@HBv~kOzo@?(tH|3uK zXslOu9Lg8yj4xigv3VR{DeUW|26CO>pp-Ni^!%kd&rNSYZZ9qJZ?6ITxwJYV`Xi55 zSM9kgp?{YjT*_Jua+E(^sM7`daYg*LXBCe}swng$&?n!wuh%yFW;&e@=<5{>^Yb~; zrePhSp0oW%4TyyP=3IIC$Pnm~!#|^g{O3YS>}G&Gon0!_9S!xIbr6N7K|5zV6vn-P z{^gw77ZMC~IHU7ic?*p9GfLsxJ464@4T+J2^W|rzTG+uj%2A2$dJuj;!{I!VeOd2W z7L2p(l~0n-fE;G0K5r2Kl( zx1_EA3iV{nJ?gO*tsS z&`7Am&nE|#yzS);{Xd{`)D6}J+@YVzd8=T)IC9PQa|htVabe*qUT#l3mfT+m{Lb2t zwqZNStnKI;Lm(-+l(1U%gW4152@kE1Sys{>%%=1d%$y$AYpwneq@aw70>uDAHN#@13SL^?6BRlIEp(=XH7tfT2_zs`1xi5) zQa8jw35ryyN@awy6>%2~n;I0AK|nwTq%6uNqLlv931YP~(?8mekMHEYd+*uredqV` z9ngoKH&{;MPZ2-aA#1H2C-5B8y6%~Z`?XPfdWMmQwYA=NGmxh@!>amyz^~5r@SYmT zxt$Xbe<&Bv#iDVRGtQ}o+;Ni+v977mbaoc}+TzDPI)>|(*1^tr$ZJ*RSJKGa*2ojr zB^QZfTflI-Bi3~;-x)g}dD?x*`?dtnm0lyW>s5$*Z8uPQ53`iK^x?^;xJl)fhX!(8sviw#*;T?*=_m(h`aK zP>o++$CqE99&!8Y4B!=8C$SIk?iA_z5;p2abQwE7P=~)SDzD2f zCY0kYhwl(iYSr6qcbws`Rcl?oS#3e6HTQMh=fh8~jQ!phP-nY&xN28o{m0R*MnjPA z;Ser)NB*9qU&DJj?D91J`FTotZae3E4fc9=dptlsQtLk=N|!~TiuanIU9YtF{+Ljl zv%X1!rGxCDJ!CK1(`tiB7<;My@7f2I2AdfFTeT)YF94E7m!B5lW(j))9}cHyAD_G*+Q_eH0$vqPznmNiKZv%nHcEi6 zH|Mt+rWg`xi(3a7gg#rjmje#Me^E2^&WFN(Q8~#OtC1hkW*%*|-7isd4R3eg`DnI& z^Y=Z3iW%zF`2up{6nPh)Gk>2F@;yP_p=cHEC-fxMY=&Lp%+md?z`==Ly)zFXu89K$ zmogF8uNr!17QD&3wBp{P>U2sj2E1KM;|eaS3)ET)2VPw3JY33%jxj z_K(D>d;LY&pB|@qO^p1?Xv^XnV*G29^rlU)_o!;>xdzyCO#PHCAM_i~pwI4N{J58; zN5u(3ot$erw^9DSv5u!};7q98fWX4 z{hTM&Z~hUu@H@}UGvZFrG-+ZA^eL#OZ@OdO6eiod_#z()Wtug?@K<5MT$2*St*|%e zQ8Z{#8kfvKK79Z8XJ_|eeTll649^4VOmwf#Q{;7NzJ9Y7_Tl*jHCavYL)o(I?Xgz~ zb#-4&Rt(ljm&8%ip_lYuW%IM(*NQElmuf*?g^a~bf?kyiWX$#u&~T!33;ZgtjD-;7 zVUYs6x3C^2pmS&9s{7@}P@mPU+UdO7{IKB8E^;R`PV$B2G{0fj=)D&?A9N)2Z1K4@?~M?8j?bdLz1@V?xAUkmW`cjoZFWAcwHzg; ztr3u$_pDSyN@&f7;FJK&pY~9i$SH-sqeRKHlhCS~enUd=Wqe?BxeE3xk4eQAaqvq; z>P5R^(AdrDbB5qA=hX8jan3&v9A_;=-t^z#={)!oq58TmD6{0>+e8`X1|v^?2n&g^ zy)yB=+w0AhDuO?%x$>n3y#LqW_ga%9!_xYHxBmUkJ&wxkUok*K(ap(FbciY|Izy)_ z#?=4Q^(kNTf|0717e7MLI;(oYC?zVb!*v63NE!TrWspT2bpktu+Ruq=WpdfxqXECt z>Zu&+>QvX_|oGgT-bG4Ubtl@XO-f8L9aoQO#qU+|tL2;~P@3q_&+ zJnm#e=A>x(Fej8Ne8pc&%;f`iL3|!Jh$AvE_u+`bg6%w3u3c(vVD1|fBoIzqi1?eh z!ll-BYzzGSm)NO%;I{U+rq^qW_0|eFB7aWMMEo5&A`Tr2cl}n5jENa4iWyV9`TS5H zq2fv{$e$M|ob;k#QjcHo)xeN5Cz2l~dNn0PkpkaWCaZBmeL2DjJ$?fI>5_3_HwXZS Ca57{7 diff --git a/inst/moduleDev/moduleStackMap.R b/inst/moduleDev/moduleStackMap.R deleted file mode 100644 index 72396a0..0000000 --- a/inst/moduleDev/moduleStackMap.R +++ /dev/null @@ -1,10 +0,0 @@ - -setSimulationPath(path = "D:/test_case/", 1) -mydata <- readAntares(areas = "all", links = "all", timeStep = "hourly") -ml <- mapLayout(readLayout()) - -library(antaresViz) -library(manipulateWidget) - -stackMap(mydata, ml) - diff --git a/inst/test_scripts/compare_test.R b/inst/test_scripts/compare_test.R deleted file mode 100644 index 16f5761..0000000 --- a/inst/test_scripts/compare_test.R +++ /dev/null @@ -1,92 +0,0 @@ -require(antaresRead) -require(antaresViz) - -# classic study -setSimulationPath("C:\\Users\\Datastorm\\Desktop\\test_case_init", 1) -mydata <- readAntares(areas = "all", links = "all", timeStep = "daily", - select = "nostat", mcYears = "all") -# un h5 -setSimulationPath("C:\\Users\\Datastorm\\Desktop\\antares\\20170315-1140eco-test.h5", 1) - -opts_h5 <- simOptions() - -#------------ -# prodstak -#------------ - -c("mcYear", "main", "unit", "areas", "legend", "stack", "stepPlot", "drawPoints") - -prodStack(x = mydata, - compare = c("mcYear", "main", "unit", "areas", "legend", "stack", "stepPlot", "drawPoints")) - -prodStack(x = mydata, compare = c("mcYear")) - -prodStack(x = list(mydata), compare = c("mcYear")) - -prodStack(x = list(mydata, mydata), compare = c("stack")) - -prodStack(x = list(mydata, mydata), compare = list(main = NULL, areas = NULL)) - -prodStack(x = opts_h5, compare = "main") - -prodStack(x = list(opts_h5), compare = "main") - -prodStack(x = list(opts_h5, opts_h5), compare = "main") - -#------------ -# exchangesStack -#------------ - -c("mcYear", "main", "unit", "area", - "legend", "stepPlot", "drawPoints") - -exchangesStack(x = mydata, - compare = c("mcYear", "main", "unit", "area", - "legend", "stepPlot", "drawPoints")) - -exchangesStack(x = list(mydata, mydata), compare = "mcYear") - -exchangesStack(x = opts_h5, compare = "mcYear") - -exchangesStack(x = list(opts_h5, opts_h5), compare = "mcYear") - -#------------ -# tsPlot -#------------ - -c("mcYear", "main", "variable", "type", "confInt", "elements", "aggregate", - "legend", "highlight", "stepPlot", "drawPoints", "secondAxis") - -tsPlot(x = mydata, - compare = c("mcYear", "main", "variable", "type", "confInt", "elements", "aggregate", - "legend", "highlight", "stepPlot", "drawPoints", "secondAxis")) - -tsPlot(x = list(mydata, mydata), - compare = c("mcYear")) - -tsPlot(x = opts_h5, compare = "mcYear") - -tsPlot(x = list(opts_h5, opts_h5), compare = "mcYear") - -#------------ -# plotMap -#------------ - -# layout <- readLayout() -# ml <- mapLayout(layout = layout) -load("ml.rda") - -c("mcYear", "type", "colAreaVar", "sizeAreaVars", "areaChartType", "showLabels", - "popupAreaVars", "labelAreaVar","colLinkVar", "sizeLinkVar", "popupLinkVars") - -plotMap(x = mydata, mapLayout = ml, - compare =c("mcYear", "type", "colAreaVar", "sizeAreaVars", "areaChartType", "showLabels", - "popupAreaVars", "labelAreaVar","colLinkVar", "sizeLinkVar", "popupLinkVars")) - - -plotMap(x = list(mydata, mydata), mapLayout = ml, - compare =c("mcYear")) - -plotMap(x = list(opts_h5, opts_h5, opts_h5), mapLayout = ml, - compare =c("mcYear", "type", "colAreaVar", "sizeAreaVars", "areaChartType", "showLabels", - "popupAreaVars", "labelAreaVar","colLinkVar", "sizeLinkVar", "popupLinkVars")) diff --git a/man/addShadows.Rd b/man/addShadows.Rd index 227686b..fa07cad 100644 --- a/man/addShadows.Rd +++ b/man/addShadows.Rd @@ -1,29 +1,29 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/map_plugins.R -\name{addShadows} -\alias{addShadows} -\title{Add a shadow to map layers} -\usage{ -addShadows(map) -} -\arguments{ -\item{map}{A leaflet map object.} -} -\value{ -The modified map object -} -\description{ -This function adds a shadow to every svg element added to a leaflet map. It -can greatly improve the lisibility of the map. -} -\examples{ -require(leaflet) -require(leaflet.minicharts) - -leaflet() \%>\% - addTiles() \%>\% - addFlows(0, 0, 1, 0, col= gray(0.9)) \%>\% - addCircleMarkers(c(0, 1), c(0, 0), color = "white", fillOpacity = 1, stroke = FALSE) \%>\% - addShadows() - -} +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/map_plugins.R +\name{addShadows} +\alias{addShadows} +\title{Add a shadow to map layers} +\usage{ +addShadows(map) +} +\arguments{ +\item{map}{A leaflet map object.} +} +\value{ +The modified map object +} +\description{ +This function adds a shadow to every svg element added to a leaflet map. It +can greatly improve the lisibility of the map. +} +\examples{ +require(leaflet) +require(leaflet.minicharts) + +leaflet() \%>\% + addTiles() \%>\% + addFlows(0, 0, 1, 0, col= gray(0.9)) \%>\% + addCircleMarkers(c(0, 1), c(0, 0), color = "white", fillOpacity = 1, stroke = FALSE) \%>\% + addShadows() + +} diff --git a/man/exchangesStack.Rd b/man/exchangesStack.Rd index ad632ea..d0664e3 100644 --- a/man/exchangesStack.Rd +++ b/man/exchangesStack.Rd @@ -1,134 +1,95 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/stack_exchanges.R -\name{exchangesStack} -\alias{exchangesStack} -\title{Plot the exchanges of an area} -\usage{ -exchangesStack(x, area = NULL, mcYear = "average", dateRange = NULL, - colors = NULL, main = NULL, ylab = NULL, unit = c("MWh", "GWh", - "TWh"), compare = NULL, compareOpts = list(), - interactive = getInteractivity(), legend = TRUE, - legendId = sample(1000000000, 1), groupId = legendId, - legendItemsPerRow = 5, width = NULL, height = NULL, - xyCompare = c("union", "intersect"), h5requestFiltering = list(), - stepPlot = FALSE, drawPoints = FALSE, timeSteph5 = "hourly", - mcYearh5 = NULL, tablesh5 = c("areas", "links"), ...) -} -\arguments{ -\item{x}{Object of class \code{antaresData} created with function -\code{\link[antaresRead]{readAntares}}. It is required to contain link data. -If it also contains area data with column `ROW BAL.`, then exchanges with -the rest of the world are also displayed on the chart.} - -\item{area}{Name of a single area. The flows from/to this area will be drawn by the -function.} - -\item{mcYear}{If \code{x}, contains multiple Monte-Carlo scenarios, this parameter -determine which scenario is displayed. Must be an integer representing the -index of the scenario or the word "average". In this case data are -averaged.} - -\item{dateRange}{A vector of two dates. Only data points between these two dates are -displayed. If NULL, then all data is displayed.} - -\item{colors}{Vector of colors with same length as parameter \code{variables}. If -\code{variables} is an alias, then this argument should be \code{NULL} in -order to use default colors.} - -\item{main}{Title of the graph.} - -\item{ylab}{Title of the Y-axis.} - -\item{unit}{Unit used in the graph. Possible values are "MWh", "GWh" or "TWh".} - -\item{compare}{An optional character vector containing names of parameters. When it is set, -two charts are outputed with their own input controls. Alternatively, it can -be a named list with names corresponding to parameter names and values being -list with the initial values of the given parameter for each chart. See details - if you are drawing a map.} - -\item{compareOpts}{List of options that indicates the number of charts to create and their -position. Check out the documentation of -\code{\link[manipulateWidget]{compareOptions}} to see available options.} - -\item{interactive}{LogicalValue. If \code{TRUE}, then a shiny gadget is launched that lets -the user interactively choose the areas or districts to display.} - -\item{legend}{Logical value indicating if a legend should be drawn. This argument is -usefull when one wants to create a shared legend with -\code{\link{prodStackLegend}}} - -\item{legendId}{Id of the legend linked to the graph. This argument is -usefull when one wants to create a shared legend with -\code{\link{prodStackLegend}}} - -\item{groupId}{Parameter that can be used to synchronize the horizontal -zoom of multiple charts. All charts that need to be synchronized must -have the same group.} - -\item{legendItemsPerRow}{Number of elements to put in each row of the legend.} - -\item{width}{Width of the graph expressed in pixels or in percentage of -the parent element. For instance "500px" and "100\%" are valid values.} - -\item{height}{Height of the graph expressed in pixels or in percentage of -the parent element. For instance "500px" and "100\%" are valid values.} - -\item{xyCompare}{Use when you compare studies, can be "union" or "intersect". If union, all -of mcYears in one of studies will be selectable. If intersect, only mcYears in all -studies will be selectable.} - -\item{h5requestFiltering}{Contains arguments used by default for h5 request, -typically h5requestFiltering = list(select = "NUCLEAR")} - -\item{stepPlot}{\code{boolean}, step style for curves.} - -\item{drawPoints}{\code{boolean}, add points on graph} - -\item{timeSteph5}{\code{character} timeStep to read in h5 file. Only for Non interactive mode.} - -\item{mcYearh5}{\code{numeric} mcYear to read for h5. Only for Non interactive mode.} - -\item{tablesh5}{\code{character} tables for h5 ("areas" "links", "clusters" or "disticts"). Only for Non interactive mode.} - -\item{...}{Other arguments for \code{\link{manipulateWidget}}} -} -\value{ -A htmlwidget of class \code{dygraph}. It can be modified with functions from -package \code{dygraphs}. -} -\description{ -This function draws a stack representing the evolution of the exchanges of -an area with its neighbours. Positive values denotes exports and negative -values imports. -} -\details{ -Compare argument can take following values : -\itemize{ - \item "mcYear" - \item "main" - \item "unit" - \item "area" - \item "legend" - \item "stepPlot" - \item "drawPoints" - } -} -\examples{ -\dontrun{ -mydata <- readAntares(links = "all", timeStep = "daily") -exchangesStack(mydata) - -# Also display exchanges with the rest of the world -mydata <- readAntares(areas = "all", links = "all", timeStep = "daily") -exchangesStack(mydata) - -# Use compare : -exchangesStack(mydata, compare = "mcYear") -exchangesStack(mydata, compare = "area") -exchangesStack(mydata, compare = "unit") -exchangesStack(mydata, compare = "legend") - -} - -} +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/stack_exchanges.R +\name{exchangesStack} +\alias{exchangesStack} +\title{Plot the exchanges of an area} +\usage{ +exchangesStack(x, y = NULL, area = NULL, mcYear = "average", + dateRange = NULL, colors = NULL, main = NULL, ylab = NULL, + unit = c("MWh", "GWh", "TWh"), compare = NULL, compareOpts = list(), + interactive = getInteractivity(), legend = TRUE, + legendId = sample(1e+09, 1), groupId = legendId, legendItemsPerRow = 5, + width = NULL, height = NULL) +} +\arguments{ +\item{x}{Object of class \code{antaresData} created with function +\code{\link[antaresRead]{readAntares}}. It is required to contain link data. +If it also contains area data with column `ROW BAL.`, then exchanges with +the rest of the world are also displayed on the chart.} + +\item{y}{Optional object of class \code{antaresData}. If it is specified, then two +charts are generated.} + +\item{area}{Name of a single area. The flows from/to this area will be drawn by the +function.} + +\item{mcYear}{If \code{x}, contains multiple Monte-Carlo scenarios, this parameter +determine which scenario is displayed. Must be an integer representing the +index of the scenario or the word "average". In this case data are +averaged.} + +\item{dateRange}{A vector of two dates. Only data points between these two dates are +displayed. If NULL, then all data is displayed.} + +\item{colors}{Vector of colors with same length as parameter \code{variables}. If +\code{variables} is an alias, then this argument should be \code{NULL} in +order to use default colors.} + +\item{main}{Title of the graph.} + +\item{ylab}{Title of the Y-axis.} + +\item{unit}{Unit used in the graph. Possible values are "MWh", "GWh" or "TWh".} + +\item{compare}{An optional character vector containing names of parameters. When it is set, +two charts are outputed with their own input controls. Alternatively, it can +be a named list with names corresponding to parameter names and values being +list with the initial values of the given parameter for each chart.} + +\item{compareOpts}{List of options that indicates the number of charts to create and their +position. Check out the documentation of +\code{\link[manipulateWidget]{compareOptions}} to see available options.} + +\item{interactive}{LogicalValue. If \code{TRUE}, then a shiny gadget is launched that lets +the user interactively choose the areas or districts to display.} + +\item{legend}{Logical value indicating if a legend should be drawn. This argument is +usefull when one wants to create a shared legend with +\code{\link{prodStackLegend}}} + +\item{legendId}{Id of the legend linked to the graph. This argument is +usefull when one wants to create a shared legend with +\code{\link{prodStackLegend}}} + +\item{groupId}{Parameter that can be used to synchronize the horizontal +zoom of multiple charts. All charts that need to be synchronized must +have the same group.} + +\item{legendItemsPerRow}{Number of elements to put in each row of the legend.} + +\item{width}{Width of the graph expressed in pixels or in percentage of +the parent element. For instance "500px" and "100\%" are valid values.} + +\item{height}{Height of the graph expressed in pixels or in percentage of +the parent element. For instance "500px" and "100\%" are valid values.} +} +\value{ +A htmlwidget of class \code{dygraph}. It can be modified with functions from +package \code{dygraphs}. +} +\description{ +This function draws a stack representing the evolution of the exchanges of +an area with its neighbours. Positive values denotes exports and negative +values imports. +} +\examples{ +\dontrun{ +mydata <- readAntares(links = "all", timeStep = "daily") +exchangeStack(mydata) + +# Also display exchanges with the rest of the world +mydata <- readAntares(areas = "all", links = "all", timeStep = "daily") +exchangesStack(mydata) +} + +} diff --git a/man/limitSizeGraph.Rd b/man/limitSizeGraph.Rd deleted file mode 100644 index e910573..0000000 --- a/man/limitSizeGraph.Rd +++ /dev/null @@ -1,20 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/limitSizeGraph.R -\name{limitSizeGraph} -\alias{limitSizeGraph} -\title{Use to change limit size of graph (in Mb)} -\usage{ -limitSizeGraph(size) -} -\arguments{ -\item{size}{\code{numeric} widget size autorized in modules (default 200)} -} -\description{ -Use to change limit size of graph (in Mb) -} -\examples{ -\dontrun{ -limitSizeGraph(500) -} - -} diff --git a/man/mapLayout.Rd b/man/mapLayout.Rd index 5e8bff6..2729da2 100644 --- a/man/mapLayout.Rd +++ b/man/mapLayout.Rd @@ -1,48 +1,38 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/map_layout.R -\name{mapLayout} -\alias{mapLayout} -\title{Place areas of a study on a map} -\usage{ -mapLayout(layout, what = c("areas", "districts"), map = getSpMaps(), - map_builder = TRUE) -} -\arguments{ -\item{layout}{object returned by function \code{\link[antaresRead]{readLayout}}} - -\item{what}{Either "areas" or "districts". Indicates what type of object to place -on the map.} - -\item{map}{An optional \code{\link[sp]{SpatialPolygons}} or -\code{\link[sp]{SpatialPolygonsDataFrame}} object. See \code{\link[spMaps]{getSpMaps}}} - -\item{map_builder}{\code{logical} Add inputs for build custom map ? Defaut to TRUE.} -} -\value{ -An object of class \code{mapLayout}. -} -\description{ -This function launches an interactive application that let the user place -areas of a study on a map. the GPS coordinates of the areas are then returned -and can be used in functions. This function should be used only once per -study. The result should then be saved in an external file and be reused. -} -\examples{ -\dontrun{ -# Read the coordinates of the areas in the Antares interface, then convert it -# in a map layout. -layout <- readLayout() -ml <- mapLayout(layout) - -# visualize mapLayout -plotMapLayout(ml) - -# Save the result for future use -save(ml, file = "ml.rda") - -} - -} -\seealso{ -\code{\link{plotMapLayout}} -} +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/map_layout.R +\name{mapLayout} +\alias{mapLayout} +\title{Place areas of a study on a map} +\usage{ +mapLayout(layout, what = c("areas", "districts"), map = NULL) +} +\arguments{ +\item{layout}{object returned by function \code{\link[antaresRead]{readLayout}}} + +\item{what}{Either "areas" or "districts". Indicates what type of object to place +on the map.} + +\item{map}{An optional \code{\link[sp]{SpatialPolygons}} or +\code{\link[sp]{SpatialPolygonsDataFrame}} object.} +} +\value{ +An object of class \code{mapLayout}. +} +\description{ +This function launches an interactive application that let the user place +areas of a study on a map. the GPS coordinates of the areas are then returned +and can be used in functions. This function should be used only once per +study. The result should then be saved in an external file and be reused. +} +\examples{ +\dontrun{ +# Read the coordinates of the areas in the Antares interface, then convert it +# in a map layout. +layout <- readLayout() +ml <- mapLayout(layout) + +# Save the result for future use +save(ml, file = "ml.rda") +} + +} diff --git a/man/modRpart.Rd b/man/modRpart.Rd deleted file mode 100644 index efd6325..0000000 --- a/man/modRpart.Rd +++ /dev/null @@ -1,23 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/mod_rpart.R -\name{modRpart} -\alias{modRpart} -\title{Make rpart from antares data} -\usage{ -modRpart(data) -} -\arguments{ -\item{data}{an antaresData after use of \code{\link[antaresProcessing]{mergeAllAntaresData}}} -} -\description{ -Make rpart from antares data -} -\examples{ -\dontrun{ -setSimulationPath("Mystud", 1) -mydata <- readAntares(areas = "all", select = "OIL") -mydata <- mergeAllAntaresData(mydata) -modRpart(mydata) -} - -} diff --git a/man/modXY.Rd b/man/modXY.Rd deleted file mode 100644 index ac4606b..0000000 --- a/man/modXY.Rd +++ /dev/null @@ -1,27 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/mod_XY.R -\name{modXY} -\alias{modXY} -\title{Make X-Y bockey plot, interactive version} -\usage{ -modXY(x, xyCompare = c("union", "intersect")) -} -\arguments{ -\item{x}{optsH5 or list of optsH5} - -\item{xyCompare}{Use when you compare studies, can be "union" or "intersect". If union, all -of mcYears in one of studies will be selectable. If intersect, only mcYears in all -studies will be selectable.} -} -\description{ -Make X-Y bockey plot, interactive version -} -\examples{ -\dontrun{ -opts <- setSimulationPath("h5File") -modXY(opts) -modXY(list(opts, opts)) - -} - -} diff --git a/man/placeGeoPoints-shiny.Rd b/man/placeGeoPoints-shiny.Rd deleted file mode 100644 index 366c010..0000000 --- a/man/placeGeoPoints-shiny.Rd +++ /dev/null @@ -1,30 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/leafletDragPoints.R -\name{placeGeoPoints-shiny} -\alias{placeGeoPoints-shiny} -\alias{leafletDragPointsOutput} -\alias{renderLeafletDragPoints} -\title{Shiny bindings for placeGeoPoints} -\usage{ -leafletDragPointsOutput(outputId, width = "100\%", height = "400px") - -renderLeafletDragPoints(expr, env = parent.frame(), quoted = FALSE) -} -\arguments{ -\item{outputId}{output variable to read from} - -\item{width, height}{Must be a valid CSS unit (like \code{'100\%'}, -\code{'400px'}, \code{'auto'}) or a number, which will be coerced to a -string and have \code{'px'} appended.} - -\item{expr}{An expression that generates a placeGeoPoints} - -\item{env}{The environment in which to evaluate \code{expr}.} - -\item{quoted}{Is \code{expr} a quoted expression (with \code{quote()})? This -is useful if you want to save an expression in a variable.} -} -\description{ -Output and render functions for using placeGeoPoints within Shiny -applications and interactive Rmd documents. -} diff --git a/man/plot.mapLayout.Rd b/man/plot.mapLayout.Rd index c148ec3..024c802 100644 --- a/man/plot.mapLayout.Rd +++ b/man/plot.mapLayout.Rd @@ -1,118 +1,118 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/map_layout.R -\name{plot.mapLayout} -\alias{plot.mapLayout} -\title{Plot method for map layout} -\usage{ -\method{plot}{mapLayout}(x, colAreas = x$coords$color, dataAreas = 1, - opacityArea = 1, areaMaxSize = 30, areaMaxHeight = 50, - areaChartType = c("auto", "bar", "pie", "polar-area", "polar-radius"), - labelArea = NULL, labelMinSize = 8, labelMaxSize = 8, - colLinks = "#CCCCCC", sizeLinks = 3, opacityLinks = 1, dirLinks = 0, - links = TRUE, areas = TRUE, tilesURL = defaultTilesURL(), - preprocess = function(map) { map }, width = NULL, height = NULL, - ...) -} -\arguments{ -\item{x}{Object created with function \code{\link{mapLayout}}} - -\item{colAreas}{Vector of colors for areas. By default, the colors used in the Antares -software are used.} - -\item{dataAreas}{A numeric vector or a numeric matrix that is passed to function -\code{link[addMinicharts]}. A single vector will produce circles with -different radius. A matrix will produce bar charts or pie charts or -polar charts, depending on the value of \code{areaChartType}} - -\item{opacityArea}{Opacity of areas. It has to be a numeric vector with values -between 0 and 1.} - -\item{areaMaxSize}{Maximal width in pixels of the symbols that represent -areas on the map.} - -\item{areaMaxHeight}{Maximal height of bars. Used only if a barchart representation is used.} - -\item{areaChartType}{Type of chart to use to represent areas.} - -\item{labelArea}{Character vector containing labels to display inside areas.} - -\item{labelMinSize}{minimal height of labels.} - -\item{labelMaxSize}{maximal height of labels.} - -\item{colLinks}{Vector of colors for links.} - -\item{sizeLinks}{Line width of the links, in pixels.} - -\item{opacityLinks}{Opacity of the links. It has to be a numeric vector with values -between 0 and 1.} - -\item{dirLinks}{Single value or vector indicating the direction of the link. Possible values -are 0, -1 and 1. If it equals 0, then links are repsented by a simple line. -If it is equal to 1 or -1 it is represented by a line with an arrow pointing -respectively the destination and the origin of the link.} - -\item{links}{Should links be drawn on the map ?} - -\item{areas}{Should areas be drawn on the map ?} - -\item{tilesURL}{URL template used to get map tiles. The followign site -provides some URLs; -\url{https://leaflet-extras.github.io/leaflet-providers/preview/}} - -\item{preprocess}{A function that takes as argument a map and that returns a -modified version of this map. This parameter can be used to add extra -information on a map.} - -\item{width}{Width of the graph expressed in pixels or in percentage of -the parent element. For instance "500px" and "100\%" are valid values.} - -\item{height}{Height of the graph expressed in pixels or in percentage of -the parent element. For instance "500px" and "100\%" are valid values.} - -\item{...}{Currently unused.} -} -\value{ -The function generates an \code{htmlwidget} of class \code{leaflet}. It can - be stored in a variable and modified with package - \code{\link[leaflet]{leaflet}} -} -\description{ -This method can be used to visualize the network of an antares study. -It generates an interactive map with a visual representaiton of a -map layout created with function \code{\link{mapLayout}}. -} -\examples{ -\dontrun{ -# Read the coordinates of the areas in the Antares interface, then convert it -# in a map layout. -layout <- readLayout() -ml <- mapLayout(layout) - -# Save the result for future use -save(ml, file = "ml.rda") - -# Plot the network on an interactive map -plot(ml) - -# change style -plot(ml, colAreas = gray(0.5), colLinks = "orange") - -# Use polar area charts to represent multiple values for each area. -nareas <- nrow(ml$coords) -fakeData <- matrix(runif(nareas * 3), ncol = 3) -plot(ml, sizeAreas = fakeData) - -# Store the result in a variable to change it with functions from leaflet -# package -library(leaflet) - -center <- c(mean(ml$coords$x), mean(ml$coords$y)) - -p <- plot(ml) -p \%>\% - addCircleMarker(center[1], center[2], color = "red", - popup = "I'm the center !") -} - -} +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/map_layout.R +\name{plot.mapLayout} +\alias{plot.mapLayout} +\title{Plot method for map layout} +\usage{ +\method{plot}{mapLayout}(x, colAreas = x$coords$color, dataAreas = 1, + opacityArea = 1, areaMaxSize = 30, areaMaxHeight = 50, + areaChartType = c("auto", "bar", "pie", "polar-area", "polar-radius"), + labelArea = NULL, labelMinSize = 8, labelMaxSize = 8, + colLinks = "#CCCCCC", sizeLinks = 3, opacityLinks = 1, dirLinks = 0, + links = TRUE, areas = TRUE, tilesURL = defaultTilesURL(), + preprocess = function(map) { map }, width = NULL, height = NULL, + ...) +} +\arguments{ +\item{x}{Object created with function \code{\link{mapLayout}}} + +\item{colAreas}{Vector of colors for areas. By default, the colors used in the Antares +software are used.} + +\item{dataAreas}{A numeric vector or a numeric matrix that is passed to function +\code{link[addMinicharts]}. A single vector will produce circles with +different radius. A matrix will produce bar charts or pie charts or +polar charts, depending on the value of \code{areaChartType}} + +\item{opacityArea}{Opacity of areas. It has to be a numeric vector with values +between 0 and 1.} + +\item{areaMaxSize}{Maximal width in pixels of the symbols that represent +areas on the map.} + +\item{areaMaxHeight}{Maximal height of bars. Used only if a barchart representation is used.} + +\item{areaChartType}{Type of chart to use to represent areas.} + +\item{labelArea}{Character vector containing labels to display inside areas.} + +\item{labelMinSize}{minimal height of labels.} + +\item{labelMaxSize}{maximal height of labels.} + +\item{colLinks}{Vector of colors for links.} + +\item{sizeLinks}{Line width of the links, in pixels.} + +\item{opacityLinks}{Opacity of the links. It has to be a numeric vector with values +between 0 and 1.} + +\item{dirLinks}{Single value or vector indicating the direction of the link. Possible values +are 0, -1 and 1. If it equals 0, then links are repsented by a simple line. +If it is equal to 1 or -1 it is represented by a line with an arrow pointing +respectively the destination and the origin of the link.} + +\item{links}{Should links be drawn on the map ?} + +\item{areas}{Should areas be drawn on the map ?} + +\item{tilesURL}{URL template used to get map tiles. The followign site +provides some URLs; +\url{https://leaflet-extras.github.io/leaflet-providers/preview/}} + +\item{preprocess}{A function that takes as argument a map and that returns a +modified version of this map. This parameter can be used to add extra +information on a map.} + +\item{width}{Width of the graph expressed in pixels or in percentage of +the parent element. For instance "500px" and "100\%" are valid values.} + +\item{height}{Height of the graph expressed in pixels or in percentage of +the parent element. For instance "500px" and "100\%" are valid values.} + +\item{...}{Currently unused.} +} +\value{ +The function generates an \code{htmlwidget} of class \code{leaflet}. It can + be stored in a variable and modified with package + \code{\link[leaflet]{leaflet}} +} +\description{ +This method can be used to visualize the network of an antares study. +It generates an interactive map with a visual representaiton of a +map layout created with function \code{\link{mapLayout}}. +} +\examples{ +\dontrun{ +# Read the coordinates of the areas in the Antares interface, then convert it +# in a map layout. +layout <- readLayout() +ml <- mapLayout(layout) + +# Save the result for future use +save(ml, file = "ml.rda") + +# Plot the network on an interactive map +plot(ml) + +# change style +plot(ml, colAreas = gray(0.5), colLinks = "orange") + +# Use polar area charts to represent multiple values for each area. +nareas <- nrow(ml$coords) +fakeData <- matrix(runif(nareas * 3), ncol = 3) +plot(ml, sizeAreas = fakeData) + +# Store the result in a variable to change it with functions from leaflet +# package +library(leaflet) + +center <- c(mean(ml$coords$x), mean(ml$coords$y)) + +p <- plot(ml) +p \%>\% + addCircleMarker(center[1], center[2], color = "red", + popup = "I'm the center !") +} + +} diff --git a/man/plotMap.Rd b/man/plotMap.Rd index 8e1c564..079816e 100644 --- a/man/plotMap.Rd +++ b/man/plotMap.Rd @@ -1,192 +1,135 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/map.R -\name{plotMap} -\alias{plotMap} -\title{Display results of a simulation on a map} -\usage{ -plotMap(x, mapLayout, colAreaVar = "none", sizeAreaVars = c(), - areaChartType = c("bar", "pie", "polar-area", "polar-radius"), - uniqueScale = FALSE, showLabels = FALSE, popupAreaVars = c(), - labelAreaVar = "none", colLinkVar = "none", sizeLinkVar = "none", - popupLinkVars = c(), type = c("detail", "avg"), timeId = NULL, - mcYear = "average", main = "", compare = NULL, compareOpts = list(), - interactive = getInteractivity(), options = plotMapOptions(), - width = NULL, height = NULL, dateRange = NULL, xyCompare = c("union", - "intersect"), h5requestFiltering = list(), timeSteph5 = "hourly", - mcYearh5 = NULL, tablesh5 = c("areas", "links"), sizeMiniPlot = FALSE, - ...) -} -\arguments{ -\item{x}{Object of class \code{antaresDataList} created with -\code{\link[antaresRead]{readAntares}} and containing areas and links data. - It can be a list of \code{antaresData} objects. - In this case, one chart is created for each object.} - -\item{mapLayout}{Object created with function \code{\link{mapLayout}}} - -\item{colAreaVar}{Name of a variable present in \code{x$areas}. The values of this variable -are represented by the color of the areas on the map. If \code{"none"}, then -the default color is used for all areas.} - -\item{sizeAreaVars}{Vector of variables present in \code{x$areas} to associate with the size of -areas on the map. If this parameter has length equal to 0, all areas have the -same size. If it has length equal to one, then the radius of the areas change -depending on the values of the variable choosen. If it has length greater than -1 then areas are represented by a polar area chart where the size of each section -depends on the values of each variable.} - -\item{areaChartType}{If parameter \code{sizeAreaVars} contains multiple variables, this parameter -determines the type of representation. Possible values are \code{"bar"} for -bar charts, \code{"pie"} for pie charts, \code{"polar-area"} and -\code{"polar-radius"} for polar area charts where the values are represented -respectively by the area or the radius of the slices.} - -\item{uniqueScale}{If the map contains polar or bar charts, should the different variables -represented use the same scale or should each variable have its own scale ? -This parameter should be TRUE only if the variables have the same unit and -are comparable : for instance production variables.} - -\item{showLabels}{Used only when \code{sizeAreaVars} contains multiple variables. If it is -\code{TRUE}, then values of each variable are displayed.} - -\item{popupAreaVars}{Vector of variables to display when user clicks on an area.} - -\item{labelAreaVar}{Variable to display inside the areas. This parameter is used only if -parameter \code{sizeAreaVars} contains zero or one variable.} - -\item{colLinkVar}{Name of a variable present in \code{x$links}. The values of this variable -are represented by the color of the links on the map. If \code{"none"}, then -the default color is used for all links} - -\item{sizeLinkVar}{Name of a variable present in \code{x$links}. Its values are represented by -the line width of the links on the map.} - -\item{popupLinkVars}{Vector of variables to display when user clicks on a link.} - -\item{type}{If \code{type="avg"}, the data is averaged by area/and or link and -represented on the map. If it is equal to \code{"detail"}, only one time -step at a time. In interactive mode, an input control permits to choose the -time step shown.} - -\item{timeId}{A single time id present in the data. Only used if \code{type="detail"}} - -\item{mcYear}{If \code{x}, contains multiple Monte-Carlo scenarios, this parameter -determine which scenario is displayed. Must be an integer representing the -index of the scenario or the word "average". In this case data are -averaged.} - -\item{main}{Title of the map.} - -\item{compare}{An optional character vector containing names of parameters. When it is set, -two charts are outputed with their own input controls. Alternatively, it can -be a named list with names corresponding to parameter names and values being -list with the initial values of the given parameter for each chart. See details - if you are drawing a map.} - -\item{compareOpts}{List of options that indicates the number of charts to create and their -position. Check out the documentation of -\code{\link[manipulateWidget]{compareOptions}} to see available options.} - -\item{interactive}{LogicalValue. If \code{TRUE}, then a shiny gadget is launched that lets -the user interactively choose the areas or districts to display.} - -\item{options}{List of parameters that override some default visual settings. See the -help of \code{\link{plotMapOptions}}.} - -\item{width}{Width of the graph expressed in pixels or in percentage of -the parent element. For instance "500px" and "100\%" are valid values.} - -\item{height}{Height of the graph expressed in pixels or in percentage of -the parent element. For instance "500px" and "100\%" are valid values.} - -\item{dateRange}{A vector of two dates. Only data points between these two dates are -displayed. If NULL, then all data is displayed.} - -\item{xyCompare}{Use when you compare studies, can be "union" or "intersect". If union, all -of mcYears in one of studies will be selectable. If intersect, only mcYears in all -studies will be selectable.} - -\item{h5requestFiltering}{Contains arguments used by default for h5 request, -typically h5requestFiltering = list(select = "NUCLEAR")} - -\item{timeSteph5}{\code{character} timeStep to read in h5 file. Only for Non interactive mode.} - -\item{mcYearh5}{\code{numeric} mcYear to read for h5. Only for Non interactive mode.} - -\item{tablesh5}{\code{character} tables for h5 ("areas" "links", "clusters" or "disticts"). Only for Non interactive mode.} - -\item{sizeMiniPlot}{\code{boolean} variable size for miniplot} - -\item{...}{Other arguments for \code{\link{manipulateWidget}}} -} -\value{ -An htmlwidget of class "leaflet". It can be modified with package -\code{leaflet}. By default the function starts a shiny gadget that lets the -user play with most of the parameters of the function. The function returns -a leaflet map when the user clicks on the button \code{"done"}. -} -\description{ -This function generates an interactive map that let the user visually explore -the results of an Antares simulation. By default the function starts a Shiny -gadget that let the user which variables to represent. -} -\details{ -compare argument can take following values : -\itemize{ - \item "mcYear" - \item "type" - \item "colAreaVar" - \item "sizeAreaVars" - \item "areaChartType" - \item "showLabels" - \item "popupAreaVars" - \item "labelAreaVar" - \item "colLinkVar" - \item "sizeLinkVar" - \item "popupLinkVars" - } -} -\examples{ -\dontrun{ -mydata <- readAntares(areas = "all", links = "all", timeStep = "daily", - select = "nostat") - -# Place areas on a map. Ths has to be done once for a given study. Then the -# object returned by "mapLayout" may be saved and reloaded with -# functions save and load - -layout <- readLayout() -ml <- mapLayout(layout = layout) -save("ml", file = "ml.rda") - -plotMap(x = mydata, mapLayout = ml) - -# Specify the variables to use to control the color or size of elements. -plotMap(mydata, mapLayout = ml, - sizeAreaVars = c("WIND", "SOLAR", "H. ROR"), - sizeLinkVar = "FLOW LIN.") - -# Change default graphical properties -plotMap(x = mydata, mapLayout = ml, options = list(colArea="red", colLink = "orange")) -plotMap(x = list(mydata, mydata), mapLayout = ml) - -# Use h5 for dynamic request / exploration in a study -# Set path of simulaiton -setSimulationPath(path = path1) - -# Convert your study in h5 format -writeAntaresH5(path = mynewpath) - -# Redefine sim path with h5 file -opts <- setSimulationPath(path = mynewpath) -plotMap(x = opts, mapLayout = ml) - -# Compare elements in a single study -plotMap(x = opts, mapLayout = ml, .compare = "mcYear") - -# Compare 2 studies -plotMap(x = list(opts, opts2), mapLayout = ml) - -} - -} +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/map.R +\name{plotMap} +\alias{plotMap} +\title{Display results of a simulation on a map} +\usage{ +plotMap(x, y = NULL, mapLayout, colAreaVar = "none", sizeAreaVars = c(), + areaChartType = c("bar", "pie", "polar-area", "polar-radius"), + uniqueScale = FALSE, showLabels = FALSE, popupAreaVars = c(), + labelAreaVar = "none", colLinkVar = "none", sizeLinkVar = "none", + popupLinkVars = c(), type = c("detail", "avg"), timeId = NULL, + mcYear = "average", main = "", compare = NULL, compareOpts = list(), + interactive = getInteractivity(), options = plotMapOptions(), + width = NULL, height = NULL) +} +\arguments{ +\item{x}{Object of class \code{antaresDataList} created with +\code{\link[antaresRead]{readAntares}} and containing areas and links data} + +\item{y}{Optional object of class \code{antaresData}. If it is specified, then two +charts are generated.} + +\item{mapLayout}{Object created with function \code{\link{mapLayout}}} + +\item{colAreaVar}{Name of a variable present in \code{x$areas}. The values of this variable +are represented by the color of the areas on the map. If \code{"none"}, then +the default color is used for all areas.} + +\item{sizeAreaVars}{Vector of variables present in \code{x$areas} to associate with the size of +areas on the map. If this parameter has length equal to 0, all areas have the +same size. If it has length equal to one, then the radius of the areas change +depending on the values of the variable choosen. If it has length greater than +1 then areas are represented by a polar area chart where the size of each section +depends on the values of each variable.} + +\item{areaChartType}{If parameter \code{sizeAreaVars} contains multiple variables, this parameter +determines the type of representation. Possible values are \code{"bar"} for +bar charts, \code{"pie"} for pie charts, \code{"polar-area"} and +\code{"polar-radius"} for polar area charts where the values are represented +respectively by the area or the radius of the slices.} + +\item{uniqueScale}{If the map contains polar or bar charts, should the different variables +represented use the same scale or should each variable have its own scale ? +This parameter should be TRUE only if the variables have the same unit and +are comparable : for instance production variables.} + +\item{showLabels}{Used only when \code{sizeAreaVars} contains multiple variables. If it is +\code{TRUE}, then values of each variable are displayed.} + +\item{popupAreaVars}{Vector of variables to display when user clicks on an area.} + +\item{labelAreaVar}{Variable to display inside the areas. This parameter is used only if +parameter \code{sizeAreaVars} contains zero or one variable.} + +\item{colLinkVar}{Name of a variable present in \code{x$links}. The values of this variable +are represented by the color of the links on the map. If \code{"none"}, then +the default color is used for all links} + +\item{sizeLinkVar}{Name of a variable present in \code{x$links}. Its values are represented by +the line width of the links on the map.} + +\item{popupLinkVars}{Vector of variables to display when user clicks on a link.} + +\item{type}{If \code{type="avg"}, the data is averaged by area/and or link and +represented on the map. If it is equal to \code{"detail"}, only one time +step at a time. In interactive mode, an input control permits to choose the +time step shown.} + +\item{timeId}{A single time id present in the data. Only used if \code{type="detail"}} + +\item{mcYear}{If \code{x}, contains multiple Monte-Carlo scenarios, this parameter +determine which scenario is displayed. Must be an integer representing the +index of the scenario or the word "average". In this case data are +averaged.} + +\item{main}{Title of the map.} + +\item{compare}{An optional character vector containing names of parameters. When it is set, +two charts are outputed with their own input controls. Alternatively, it can +be a named list with names corresponding to parameter names and values being +list with the initial values of the given parameter for each chart.} + +\item{compareOpts}{List of options that indicates the number of charts to create and their +position. Check out the documentation of +\code{\link[manipulateWidget]{compareOptions}} to see available options.} + +\item{interactive}{LogicalValue. If \code{TRUE}, then a shiny gadget is launched that lets +the user interactively choose the areas or districts to display.} + +\item{options}{List of parameters that override some default visual settings. See the +help of \code{\link{plotMapOptions}}.} + +\item{width}{Width of the graph expressed in pixels or in percentage of +the parent element. For instance "500px" and "100\%" are valid values.} + +\item{height}{Height of the graph expressed in pixels or in percentage of +the parent element. For instance "500px" and "100\%" are valid values.} +} +\value{ +An htmlwidget of class "leaflet". It can be modified with package +\code{leaflet}. By default the function starts a shiny gadget that lets the +user play with most of the parameters of the function. The function returns +a leaflet map when the user clicks on the button \code{"done"}. +} +\description{ +This function generates an interactive map that let the user visually explore +the results of an Antares simulation. By default the function starts a Shiny +gadget that let the user which variables to represent. +} +\examples{ +\dontrun{ +mydata <- readAntares(areas = "all", links = "all", timeStep = "daily", + select = "nostat") + +# Place areas on a map. Ths has to be done once for a given study. Then the +# object returned by "mapLayout" may be saved and reloaded with +# functions save and load + +layout <- readLayout() +ml <- mapLayout(layout) +save("ml", file = "ml.rda") + +plotMap(mydata, ml) + +# Specify the variables to use to control the color or size of elements. +plotMap(mydata, ml, + sizeAreaVars = c("WIND", "SOLAR", "H. ROR"), + sizeLinkVar = "FLOW LIN.") + +# Change default graphical properties +plotMap(mydata, ml, options = list(colArea="red", colLink = "orange")) + +} + +} diff --git a/man/plotMapLayout.Rd b/man/plotMapLayout.Rd deleted file mode 100644 index 44faf3e..0000000 --- a/man/plotMapLayout.Rd +++ /dev/null @@ -1,31 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/map_layout.R -\name{plotMapLayout} -\alias{plotMapLayout} -\title{Visualize mapLayout output.} -\usage{ -plotMapLayout(mapLayout) -} -\arguments{ -\item{mapLayout}{object returned by function \code{\link{mapLayout}}} -} -\description{ -Visualize mapLayout output. -} -\examples{ - -\dontrun{ -# Read the coordinates of the areas in the Antares interface, then convert it -# in a map layout. -layout <- readLayout() -ml <- mapLayout(layout) - -# visualize mapLayout -plotMapLayout(ml) - -} - -} -\seealso{ -\code{\link{mapLayout}} -} diff --git a/man/plotMapOptions.Rd b/man/plotMapOptions.Rd index 1397525..3bf5a0e 100644 --- a/man/plotMapOptions.Rd +++ b/man/plotMapOptions.Rd @@ -1,102 +1,102 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/map_options.R -\name{plotMapOptions} -\alias{plotMapOptions} -\alias{defaultTilesURL} -\alias{colorScaleOptions} -\title{Graphical options for plotMap} -\usage{ -plotMapOptions(areaDefaultCol = "#DDDDE5", areaDefaultSize = 30, - areaMaxSize = 50, areaMaxHeight = 50, areaChartColors = NULL, - areaColorScaleOpts = colorScaleOptions(), labelMinSize = 8, - labelMaxSize = 24, linkDefaultCol = "#BEBECE", linkDefaultSize = 3, - linkMaxSize = 15, linkColorScaleOpts = colorScaleOptions(), - legend = c("choose", "visible", "hidden"), tilesURL = defaultTilesURL(), - preprocess = function(map) { map }) - -defaultTilesURL() - -colorScaleOptions(breaks = 5, domain = NULL, negCol = "#FF0000", - zeroCol = "#FAFAFA", posCol = "#0000FF", naCol = "#EEEEEE", - zeroTol = NULL, colors = NULL, levels = NULL) -} -\arguments{ -\item{areaDefaultCol}{default color of areas.} - -\item{areaDefaultSize}{default size of areas.} - -\item{areaMaxSize}{maximal size of an area when it represents the value of some variable.} - -\item{areaMaxHeight}{Maximal height of bars. Used only if a barchart representation is used.} - -\item{areaChartColors}{Vector of colors to use in polar area charts and bar charts} - -\item{areaColorScaleOpts}{List of options used to construct a continuous color scale. This list should -be generated with function \code{colorScaleOptions}.} - -\item{labelMinSize}{minimal height of labels.} - -\item{labelMaxSize}{maximal height of labels.} - -\item{linkDefaultCol}{Default color of links.} - -\item{linkDefaultSize}{Default line width of links.} - -\item{linkMaxSize}{Maximal line width of a link when it represents the value of some variable.} - -\item{linkColorScaleOpts}{List of options used to construct a continuous color scale. This list should -be generated with function \code{colorScaleOptions}.} - -\item{legend}{Should the legend be displayed or not ? Default is to mask the legend but -add a button to display it. Other values are "visible" to make the legend -always visible and "hidden" to mask it.} - -\item{tilesURL}{URL template used to get map tiles. The followign site -provides some URLs; -\url{https://leaflet-extras.github.io/leaflet-providers/preview/}} - -\item{preprocess}{A function that takes as argument a map and that returns a -modified version of this map. This parameter can be used to add extra -information on a map.} - -\item{breaks}{Either a single number indicating the approximate number of colors to use, or -a vector of values at which values to change color. -In the first case, the function tries to cut the data nicely, so the real -number of colors used may vary.} - -\item{domain}{Range of the data, ie. the range of possible values. If \code{NULL}, the -the range of the data is used} - -\item{negCol}{color of the extreme negative value.} - -\item{zeroCol}{color of the 0 value.} - -\item{posCol}{Color of the extreme positive value.} - -\item{naCol}{Color for missing values} - -\item{zeroTol}{All values in the interval \code{\[-zeroTol, +zeroTol\]} are mapped to the -\code{zeroCol} color. If \code{NULL}, the function tries to pick a nice -value that is approximately equal to 1\% of the maximal value.} - -\item{colors}{Vector of colors. If it is set and if user manually sets break points, then -these colors are used instead of the colors defined by parameters negCol, -zeroCol and posCol.} - -\item{levels}{Vector of the distinct values a variable can take. Only used when the -variable to represent is a categorical variable.} -} -\value{ -A list with the values of the different graphical parameters. -} -\description{ -These functions get and set options that control some graphical aspects -of maps created with \code{\link{plotMap}}. -} -\examples{ -\dontrun{ -params <- plotMapOptions(areaDefaultCol = "red", linkDefaultCol = "orange") -plotMap(mydata, mylayout, options = params) -} - -} +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/map_options.R +\name{plotMapOptions} +\alias{plotMapOptions} +\alias{defaultTilesURL} +\alias{colorScaleOptions} +\title{Graphical options for plotMap} +\usage{ +plotMapOptions(areaDefaultCol = "#DDDDE5", areaDefaultSize = 30, + areaMaxSize = 50, areaMaxHeight = 50, areaChartColors = NULL, + areaColorScaleOpts = colorScaleOptions(), labelMinSize = 8, + labelMaxSize = 24, linkDefaultCol = "#BEBECE", linkDefaultSize = 3, + linkMaxSize = 15, linkColorScaleOpts = colorScaleOptions(), + legend = c("choose", "visible", "hidden"), tilesURL = defaultTilesURL(), + preprocess = function(map) { map }) + +defaultTilesURL() + +colorScaleOptions(breaks = 5, domain = NULL, negCol = "#FF0000", + zeroCol = "#FAFAFA", posCol = "#0000FF", naCol = "#EEEEEE", + zeroTol = NULL, colors = NULL, levels = NULL) +} +\arguments{ +\item{areaDefaultCol}{default color of areas.} + +\item{areaDefaultSize}{default size of areas.} + +\item{areaMaxSize}{maximal size of an area when it represents the value of some variable.} + +\item{areaMaxHeight}{Maximal height of bars. Used only if a barchart representation is used.} + +\item{areaChartColors}{Vector of colors to use in polar area charts and bar charts} + +\item{areaColorScaleOpts}{List of options used to construct a continuous color scale. This list should +be generated with function \code{colorScaleOptions}.} + +\item{labelMinSize}{minimal height of labels.} + +\item{labelMaxSize}{maximal height of labels.} + +\item{linkDefaultCol}{Default color of links.} + +\item{linkDefaultSize}{Default line width of links.} + +\item{linkMaxSize}{Maximal line width of a link when it represents the value of some variable.} + +\item{linkColorScaleOpts}{List of options used to construct a continuous color scale. This list should +be generated with function \code{colorScaleOptions}.} + +\item{legend}{Should the legend be displayed or not ? Default is to mask the legend but +add a button to display it. Other values are "visible" to make the legend +always visible and "hidden" to mask it.} + +\item{tilesURL}{URL template used to get map tiles. The followign site +provides some URLs; +\url{https://leaflet-extras.github.io/leaflet-providers/preview/}} + +\item{preprocess}{A function that takes as argument a map and that returns a +modified version of this map. This parameter can be used to add extra +information on a map.} + +\item{breaks}{Either a single number indicating the approximate number of colors to use, or +a vector of values at which values to change color. +In the first case, the function tries to cut the data nicely, so the real +number of colors used may vary.} + +\item{domain}{Range of the data, ie. the range of possible values. If \code{NULL}, the +the range of the data is used} + +\item{negCol}{color of the extreme negative value.} + +\item{zeroCol}{color of the 0 value.} + +\item{posCol}{Color of the extreme positive value.} + +\item{naCol}{Color for missing values} + +\item{zeroTol}{All values in the interval \code{\[-zeroTol, +zeroTol\]} are mapped to the +\code{zeroCol} color. If \code{NULL}, the function tries to pick a nice +value that is approximately equal to 1\% of the maximal value.} + +\item{colors}{Vector of colors. If it is set and if user manually sets break points, then +these colors are used instead of the colors defined by parameters negCol, +zeroCol and posCol.} + +\item{levels}{Vector of the distinct values a variable can take. Only used when the +variable to represent is a categorical variable.} +} +\value{ +A list with the values of the different graphical parameters. +} +\description{ +These functions get and set options that control some graphical aspects +of maps created with \code{\link{plotMap}}. +} +\examples{ +\dontrun{ +params <- plotMapOptions(areaDefaultCol = "red", linkDefaultCol = "orange") +plotMap(mydata, mylayout, options = params) +} + +} diff --git a/man/plotThermalGroupCapacities.Rd b/man/plotThermalGroupCapacities.Rd deleted file mode 100644 index 787eba0..0000000 --- a/man/plotThermalGroupCapacities.Rd +++ /dev/null @@ -1,26 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/plot_thermal_group_capacities.R -\name{plotThermalGroupCapacities} -\alias{plotThermalGroupCapacities} -\title{Plot for Thermal Group Capacities} -\usage{ -plotThermalGroupCapacities(data, area = "all", - main = "Thermal group capacities") -} -\arguments{ -\item{data}{data.table of Thermal Group capacities} - -\item{area}{areas to select, default all} - -\item{main}{title} -} -\description{ -Plot for Thermal Group Capacities -} -\examples{ -\dontrun{ -opts <- setSimulationPath(getwd()) -plotThermalGroupCapacities( thermalGroupCapacities(opts)) -} - -} diff --git a/man/plotXY.Rd b/man/plotXY.Rd deleted file mode 100644 index dd8c297..0000000 --- a/man/plotXY.Rd +++ /dev/null @@ -1,45 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/plot_XY.R -\name{plotXY} -\alias{plotXY} -\title{Plot density between X et Y with rbokeh} -\usage{ -plotXY(data, x, y, precision = 30, sizeOnCount = FALSE, outLine = TRUE, - transform = NULL) -} -\arguments{ -\item{data}{\code{data.frame} can be antaresData object} - -\item{x}{\code{character}, x variable} - -\item{y}{\code{character}, y variable} - -\item{precision}{\code{numeric} precision for plot} - -\item{sizeOnCount}{\code{boolean}, should addapt size of object based on count} - -\item{outLine}{\code{boolean}, add outline on your shape} - -\item{transform}{\code{funciton}, transform function apply on count (by cells), can be log} -} -\description{ -This function take somes arguments from rbokeh and make plot. -} -\examples{ -\dontrun{ - -setSimulationPath("myStudy") -myData <- readAntares() - -plotXY(myData, "NODU", "LOAD", precision = 50, - sizeOnCount = FALSE) - -myData <- readAntares(areas = "all", links = "all") -myData <- mergeAllAntaresData(myData) -plotXY(myData, "OP. COST_max_b", "OP. COST_max_c", precision = 50, - sizeOnCount = FALSE) - - -} - -} diff --git a/man/prodStack.Rd b/man/prodStack.Rd index f6c3df7..20e73fb 100644 --- a/man/prodStack.Rd +++ b/man/prodStack.Rd @@ -1,224 +1,155 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/stack_aliases.R, R/stack_prod.R -\name{prodStackAliases} -\alias{prodStackAliases} -\alias{setProdStackAlias} -\alias{prodStack} -\title{Visualize the production stack of an area} -\usage{ -prodStackAliases() - -setProdStackAlias(name, variables, colors, lines = NULL, lineColors = NULL, - description = NULL) - -prodStack(x, stack = "eco2mix", areas = NULL, mcYear = "average", - dateRange = NULL, main = "Production stack", unit = c("MWh", "GWh", - "TWh"), compare = NULL, compareOpts = list(), - interactive = getInteractivity(), legend = TRUE, - legendId = sample(1000000000, 1), groupId = legendId, - legendItemsPerRow = 5, width = NULL, height = NULL, - xyCompare = c("union", "intersect"), h5requestFiltering = list(), - stepPlot = FALSE, drawPoints = FALSE, timeSteph5 = "hourly", - mcYearh5 = NULL, tablesh5 = c("areas", "links"), ...) -} -\arguments{ -\item{name}{name of the stack to create or update} - -\item{variables}{A named list of expressions created with \code{\link[base]{alist}}. The -name of each element is the name of the variable to draw in the stacked -graph. The element itself is an expression explaining how to compute the -variable (see examples).} - -\item{colors}{Vector of colors with same length as parameter \code{variables}. If -\code{variables} is an alias, then this argument should be \code{NULL} in -order to use default colors.} - -\item{lines}{A named list of expressions created with \code{\link[base]{alist}} -indicating how to compute the curves to display on top of the stacked graph. -It should be \code{NULL} if there is no curve to trace or if parameter -\code{variables} is an alias.} - -\item{lineColors}{Vector of colors with same length as parameter \code{lines}. This argument -should be \code{NULL} if there is no curve to trace or if parameter -\code{variables} is an alias.} - -\item{description}{Description of the stack. It is displayed by function -\code{prodStackAliases}.} - -\item{x}{An object of class \code{antaresData} created with function -\code{\link[antaresRead]{readAntares}} containing data for areas and or -districts. it can be a list of \code{antaresData} objects. -In this case, one chart is created for each object. -Can also contains opts who refer to a h5 file or list of opts.} - -\item{stack}{Name of the stack to use. One can visualize available stacks with -\code{prodStackAliases}} - -\item{areas}{Vector of area or district names. The data of these areas or districts is -aggregated by the function to construct the production stack.} - -\item{mcYear}{If \code{x}, contains multiple Monte-Carlo scenarios, this parameter -determine which scenario is displayed. Must be an integer representing the -index of the scenario or the word "average". In this case data are -averaged.} - -\item{dateRange}{A vector of two dates. Only data points between these two dates are -displayed. If NULL, then all data is displayed.} - -\item{main}{Title of the graph.} - -\item{unit}{Unit used in the graph. Possible values are "MWh", "GWh" or "TWh".} - -\item{compare}{An optional character vector containing names of parameters. When it is set, -two charts are outputed with their own input controls. Alternatively, it can -be a named list with names corresponding to parameter names and values being -list with the initial values of the given parameter for each chart. See details - if you are drawing a map.} - -\item{compareOpts}{List of options that indicates the number of charts to create and their -position. Check out the documentation of -\code{\link[manipulateWidget]{compareOptions}} to see available options.} - -\item{interactive}{LogicalValue. If \code{TRUE}, then a shiny gadget is launched that lets -the user interactively choose the areas or districts to display.} - -\item{legend}{Logical value indicating if a legend should be drawn. This argument is -usefull when one wants to create a shared legend with -\code{\link{prodStackLegend}}} - -\item{legendId}{Id of the legend linked to the graph. This argument is -usefull when one wants to create a shared legend with -\code{\link{prodStackLegend}}} - -\item{groupId}{Parameter that can be used to synchronize the horizontal -zoom of multiple charts. All charts that need to be synchronized must -have the same group.} - -\item{legendItemsPerRow}{Number of elements to put in each row of the legend.} - -\item{width}{Width of the graph expressed in pixels or in percentage of -the parent element. For instance "500px" and "100\%" are valid values.} - -\item{height}{Height of the graph expressed in pixels or in percentage of -the parent element. For instance "500px" and "100\%" are valid values.} - -\item{xyCompare}{Use when you compare studies, can be "union" or "intersect". If union, all -of mcYears in one of studies will be selectable. If intersect, only mcYears in all -studies will be selectable.} - -\item{h5requestFiltering}{Contains arguments used by default for h5 request, -typically h5requestFiltering = list(select = "NUCLEAR")} - -\item{stepPlot}{\code{boolean}, step style for curves.} - -\item{drawPoints}{\code{boolean}, add points on graph} - -\item{timeSteph5}{\code{character} timeStep to read in h5 file. Only for Non interactive mode.} - -\item{mcYearh5}{\code{numeric} mcYear to read for h5. Only for Non interactive mode.} - -\item{tablesh5}{\code{character} tables for h5 ("areas" "links", "clusters" or "disticts"). Only for Non interactive mode.} - -\item{...}{Other arguments for \code{\link{manipulateWidget}}} -} -\value{ -\code{prodStack} returns an interactive html graphic. If argument -\code{interactive} is \code{TRUE}, then a shiny gadget is started and the -function returns an interactive html graphic when the user clicks on button -"Done". - -\code{prodStackAliases} displays the list of available aliases. - -\code{setProdStackAlias} creates or updates a stack alias. -} -\description{ -\code{prodStack} draws the production stack for a set of areas or districts. -User can see available stacks with \code{prodStackAliases} and create new ones -with \code{setProdStackAlias}. -} -\details{ -compare argument can take following values : -\itemize{ - \item "mcYear" - \item "main" - \item "unit" - \item "areas" - \item "legend" - \item "stack" - \item "stepPlot" - \item "drawPoints" - } -} -\examples{ -\dontrun{ -mydata <- readAntares(areas = "all", timeStep = "daily") - -# Start a shiny gadget that permits to choose areas to display. -prodStack(x = mydata, unit = "GWh") - -# Use in a non-interactive way -prodStack(x = mydata, unit = "GWh", areas = "fr", interactive = FALSE) - -# Define a custom stack -setProdStackAlias( - name = "Wind and solar", - variables = alist(wind = WIND, solar = SOLAR), - colors = c("green", "orange") -) - -prodStack(x = mydata, unit = "GWh", stack = "Wind and solar") - -# In a custom stack it is possible to use computed values -setProdStackAlias( - name = "Renewable", - variables = alist( - renewable = WIND + SOLAR + `H. ROR` + `H. STOR` + `MISC. NDG`, - thermal = NUCLEAR + LIGNITE + COAL + GAS + OIL + `MIX. FUEL` + `MISC. DTG` - ), - colors = c("green", gray(0.3)), - lines = alist(goalRenewable = LOAD * 0.23), - lineColors = "#42EB09" -) - -prodStack(x = mydata, unit = "GWh", stack = "renewable") - -# Use compare -prodStack(x = mydata, compare = "areas") -prodStack(x = mydata, unit = "GWh", compare = "mcYear") -prodStack(x = mydata, unit = "GWh", compare = "main") -prodStack(x = mydata, unit = "GWh", compare = "unit") -prodStack(x = mydata, unit = "GWh", compare = "areas") -prodStack(x = mydata, unit = "GWh", compare = "legend") -prodStack(x = mydata, unit = "GWh", compare = "stack") -prodStack(x = mydata, unit = "GWh", compare = c("mcYear", "areas")) - - -# Compare studies -prodStack(list(mydata, mydata)) - - -# Use h5 opts -# Set path of simulaiton -setSimulationPath(path = path1) - -# Convert your study in h5 format -writeAntaresH5(path = mynewpath) - -# Redefine sim path with h5 file -opts <- setSimulationPath(path = mynewpath) -prodStack(x = opts) - -# Compare elements in a single study -prodStack(x = opts, .compare = "mcYear") - -# Compare 2 studies -prodStack(x = list(opts, opts2)) - - - -} - -} -\seealso{ -\code{\link{prodStackLegend}} -} +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/stack_aliases.R, R/stack_prod.R +\name{prodStackAliases} +\alias{prodStackAliases} +\alias{setProdStackAlias} +\alias{prodStack} +\title{Visualize the production stack of an area} +\usage{ +prodStackAliases() + +setProdStackAlias(name, variables, colors, lines = NULL, lineColors = NULL, + description = NULL) + +prodStack(x, y = NULL, stack = "eco2mix", areas = NULL, + mcYear = "average", dateRange = NULL, main = "Production stack", + unit = c("MWh", "GWh", "TWh"), compare = NULL, compareOpts = list(), + interactive = getInteractivity(), legend = TRUE, + legendId = sample(1e+09, 1), groupId = legendId, legendItemsPerRow = 5, + width = NULL, height = NULL) +} +\arguments{ +\item{name}{name of the stack to create or update} + +\item{variables}{A named list of expressions created with \code{\link[base]{alist}}. The +name of each element is the name of the variable to draw in the stacked +graph. The element itself is an expression explaining how to compute the +variable (see examples).} + +\item{colors}{Vector of colors with same length as parameter \code{variables}. If +\code{variables} is an alias, then this argument should be \code{NULL} in +order to use default colors.} + +\item{lines}{A named list of expressions created with \code{\link[base]{alist}} +indicating how to compute the curves to display on top of the stacked graph. +It should be \code{NULL} if there is no curve to trace or if parameter +\code{variables} is an alias.} + +\item{lineColors}{Vector of colors with same length as parameter \code{lines}. This argument +should be \code{NULL} if there is no curve to trace or if parameter +\code{variables} is an alias.} + +\item{description}{Description of the stack. It is displayed by function +\code{prodStackAliases}.} + +\item{x}{An object of class \code{antaresData} created with function +\code{\link[antaresRead]{readAntares}} containing data for areas and or +districts.} + +\item{y}{Optional object of class \code{antaresData}. If it is specified, then two +charts are generated.} + +\item{stack}{Name of the stack to use. One can visualize available stacks with +\code{prodStackAliases}} + +\item{areas}{Vector of area or district names. The data of these areas or districts is +aggregated by the function to construct the production stack.} + +\item{mcYear}{If \code{x}, contains multiple Monte-Carlo scenarios, this parameter +determine which scenario is displayed. Must be an integer representing the +index of the scenario or the word "average". In this case data are +averaged.} + +\item{dateRange}{A vector of two dates. Only data points between these two dates are +displayed. If NULL, then all data is displayed.} + +\item{main}{Title of the graph.} + +\item{unit}{Unit used in the graph. Possible values are "MWh", "GWh" or "TWh".} + +\item{compare}{An optional character vector containing names of parameters. When it is set, +two charts are outputed with their own input controls. Alternatively, it can +be a named list with names corresponding to parameter names and values being +list with the initial values of the given parameter for each chart.} + +\item{compareOpts}{List of options that indicates the number of charts to create and their +position. Check out the documentation of +\code{\link[manipulateWidget]{compareOptions}} to see available options.} + +\item{interactive}{LogicalValue. If \code{TRUE}, then a shiny gadget is launched that lets +the user interactively choose the areas or districts to display.} + +\item{legend}{Logical value indicating if a legend should be drawn. This argument is +usefull when one wants to create a shared legend with +\code{\link{prodStackLegend}}} + +\item{legendId}{Id of the legend linked to the graph. This argument is +usefull when one wants to create a shared legend with +\code{\link{prodStackLegend}}} + +\item{groupId}{Parameter that can be used to synchronize the horizontal +zoom of multiple charts. All charts that need to be synchronized must +have the same group.} + +\item{legendItemsPerRow}{Number of elements to put in each row of the legend.} + +\item{width}{Width of the graph expressed in pixels or in percentage of +the parent element. For instance "500px" and "100\%" are valid values.} + +\item{height}{Height of the graph expressed in pixels or in percentage of +the parent element. For instance "500px" and "100\%" are valid values.} +} +\value{ +\code{prodStackAliases} returns an interactive html graphic. If argument +\code{interactive} is \code{TRUE}, then a shiny gadget is started and the +function returns an interactive html graphic when the user clicks on button +"Done". + +\code{prodStackAliases} displays the list of available aliases. + +\code{setProdStackAlias} creates or updates a stack alias. +} +\description{ +\code{prodStack} draws the production stack for a set of areas or districts. +User can see available stacks with \code{prodStackAliases} and create new ones +with \code{setProdStackAlias}. +} +\examples{ +\dontrun{ +mydata <- readAntares(areas = "all", timeStep = "daily") + +# Start a shiny gadget that permits to choose areas to display. +prodStack(mydata, unit = "GWh") + +# Use in a non-interactive way +prodStack(mydata, unit = "GWh", areas = "fr", interactive = FALSE) + +# Define a custom stack +setProdStackAlias( + name = "Wind and solar", + variables = alist(wind = WIND, solar = SOLAR), + colors = c("green", "orange") +) + +prodStack(mydata, unit = "GWh", stack = "Wind and solar") + +# In a custom stack it is possible to use computed values +setProdStackAlias( + name = "Renewable", + variables = alist( + renewable = WIND + SOLAR + `H. ROR` + `H. STOR` + `MISC. NDG`, + thermal = NUCLEAR + LIGNITE + COAL + GAS + OIL + `MIX. FUEL` + `MISC. DTG` + ), + colors = c("green", gray(0.3)), + lines = alist(goalRenewable = LOAD * 0.23), + lineColors = "#42EB09" +) + +prodStack(mydata, unit = "GWh", stack = "renewable") + +} + +} +\seealso{ +\code{\link{prodStackLegend}} +} diff --git a/man/runAppAntaresViz.Rd b/man/runAppAntaresViz.Rd deleted file mode 100644 index 239c2fe..0000000 --- a/man/runAppAntaresViz.Rd +++ /dev/null @@ -1,14 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/runApp.R -\name{runAppAntaresViz} -\alias{runAppAntaresViz} -\title{Run app antaresViz} -\usage{ -runAppAntaresViz() -} -\value{ -an App Shiny. -} -\description{ -\code{runAppAntaresViz} run antaresViz App. -} diff --git a/man/stackMap.Rd b/man/stackMap.Rd deleted file mode 100644 index 4a26f65..0000000 --- a/man/stackMap.Rd +++ /dev/null @@ -1,27 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/stack_map.R -\name{stackMap} -\alias{stackMap} -\title{plot stack and map} -\usage{ -stackMap(x, mapLayout) -} -\arguments{ -\item{x}{\code{antaresDataList} antaresDataList contian areas ans links.} - -\item{mapLayout}{Object created with function \code{\link{mapLayout}}} -} -\description{ -plot stack and map -} -\examples{ -\dontrun{ -mydata <- readAntares(areas = "all", links = "all") - -layout <- readLayout() -ml <- mapLayout(layout = layout) - -stackMap(x = mydata, mapLayout = ml) -} - -} diff --git a/man/tsLegend.Rd b/man/tsLegend.Rd index 17f797f..9ec8a3e 100644 --- a/man/tsLegend.Rd +++ b/man/tsLegend.Rd @@ -1,65 +1,65 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/stack_prod.R, R/tsLegend.R -\name{prodStackLegend} -\alias{prodStackLegend} -\alias{tsLegend} -\title{Plot an interactive legend for time series plots} -\usage{ -prodStackLegend(stack = "eco2mix", legendItemsPerRow = 5, legendId = "") - -tsLegend(labels, colors, types = "line", legendItemsPerRow = 5, - legendId = "") -} -\arguments{ -\item{stack}{Name of the stack to use. One can visualize available stacks with -\code{prodStackAliases}} - -\item{legendItemsPerRow}{Number of elements to put in each row of the legend.} - -\item{legendId}{Id of the legend linked to the graph. This argument is -usefull when one wants to create a shared legend with -\code{\link{prodStackLegend}}} - -\item{labels}{vector containing the names of the times series} - -\item{colors}{vector of colors. It must have the same length as parameter -\code{labels}.} - -\item{types}{"line" or "area" or a vector with same length as \code{labels} -containing these two values.} -} -\description{ -These functions create a nice looking legend that displays values when the user -hovers a time series produced with plot this package. By -default, the different functions already output a legend. This function -is mostly useful to share a unique legend between two or more time series plots. -} -\details{ -Thes functions can be used to create a legend shared by multiple plots -in a Shiny application or an interactive document created with Rmarkdown. -For instance, let assume one wants to display four productions stacks in a 2x2 -layout and have a unique legend below them in a Rmarkdown document. To do so, -one can use the following chunck code: - -\preformatted{ -```{R, echo = FALSE} -library(manipulateWidget) - -combineWidgets( - prodStack(mydata, areas = "fr", - main = "Production stack in France", unit = "GWh", - legend = FALSE, legendId = 1, height = "100\%", width = "100\%"), - prodStack(mydata, areas = "de", - main = "Production stack in Germany", unit = "GWh", - legend = FALSE, legendId = 1, height = "100\%", width = "100\%"), - prodStack(mydata, areas = "es", - main = "Production stack in Spain", unit = "GWh", - legend = FALSE, legendId = 1, height = "100\%", width = "100\%"), - prodStack(mydata, areas = "be", - main = "Production stack in Belgium", unit = "GWh", - legend = FALSE, legendId = 1, height = "100\%", width = "100\%"), - footer = prodStackLegend(legendId = 1) -) -``` -} -} +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/stack_prod.R, R/tsLegend.R +\name{prodStackLegend} +\alias{prodStackLegend} +\alias{tsLegend} +\title{Plot an interactive legend for time series plots} +\usage{ +prodStackLegend(stack = "eco2mix", legendItemsPerRow = 5, legendId = "") + +tsLegend(labels, colors, types = "line", legendItemsPerRow = 5, + legendId = "") +} +\arguments{ +\item{stack}{Name of the stack to use. One can visualize available stacks with +\code{prodStackAliases}} + +\item{legendItemsPerRow}{Number of elements to put in each row of the legend.} + +\item{legendId}{Id of the legend linked to the graph. This argument is +usefull when one wants to create a shared legend with +\code{\link{prodStackLegend}}} + +\item{labels}{vector containing the names of the times series} + +\item{colors}{vector of colors. It must have the same length as parameter +\code{labels}.} + +\item{types}{"line" or "area" or a vector with same length as \code{labels} +containing these two values.} +} +\description{ +These functions create a nice looking legend that displays values when the user +hovers a time series produced with plot this package. By +default, the different functions already output a legend. This function +is mostly useful to share a unique legend between two or more time series plots. +} +\details{ +Thes functions can be used to create a legend shared by multiple plots +in a Shiny application or an interactive document created with Rmarkdown. +For instance, let assume one wants to display four productions stacks in a 2x2 +layout and have a unique legend below them in a Rmarkdown document. To do so, +one can use the following chunck code: + +\preformatted{ +```{R, echo = FALSE} +library(manipulateWidget) + +combineWidgets( + prodStack(mydata, areas = "fr", + main = "Production stack in France", unit = "GWh", + legend = FALSE, legendId = 1, height = "100\%", width = "100\%"), + prodStack(mydata, areas = "de", + main = "Production stack in Germany", unit = "GWh", + legend = FALSE, legendId = 1, height = "100\%", width = "100\%"), + prodStack(mydata, areas = "es", + main = "Production stack in Spain", unit = "GWh", + legend = FALSE, legendId = 1, height = "100\%", width = "100\%"), + prodStack(mydata, areas = "be", + main = "Production stack in Belgium", unit = "GWh", + legend = FALSE, legendId = 1, height = "100\%", width = "100\%"), + footer = prodStackLegend(legendId = 1) +) +``` +} +} diff --git a/man/tsPlot.Rd b/man/tsPlot.Rd index e3cfdb9..e0925cb 100644 --- a/man/tsPlot.Rd +++ b/man/tsPlot.Rd @@ -1,277 +1,176 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/plot.R -\name{tsPlot} -\alias{tsPlot} -\alias{plot.antaresData} -\alias{plot.simOptions} -\alias{plot.list} -\title{plot time series contained in an antaresData object} -\usage{ -tsPlot(x, table = NULL, variable = NULL, elements = NULL, - variable2Axe = NULL, mcYear = "average", type = c("ts", "barplot", - "monotone", "density", "cdf", "heatmap"), dateRange = NULL, confInt = 0, - minValue = NULL, maxValue = NULL, aggregate = c("none", "mean", "sum", - "mean by areas", "sum by areas"), compare = NULL, compareOpts = list(), - interactive = getInteractivity(), colors = NULL, main = NULL, - ylab = NULL, legend = TRUE, legendItemsPerRow = 5, - colorScaleOpts = colorScaleOptions(20), width = NULL, height = NULL, - xyCompare = c("union", "intersect"), h5requestFiltering = list(), - highlight = FALSE, stepPlot = FALSE, drawPoints = FALSE, - secondAxis = FALSE, timeSteph5 = "hourly", mcYearh5 = NULL, - tablesh5 = c("areas", "links"), ...) - -\method{plot}{antaresData}(x, table = NULL, variable = NULL, - elements = NULL, variable2Axe = NULL, mcYear = "average", - type = c("ts", "barplot", "monotone", "density", "cdf", "heatmap"), - dateRange = NULL, confInt = 0, minValue = NULL, maxValue = NULL, - aggregate = c("none", "mean", "sum", "mean by areas", "sum by areas"), - compare = NULL, compareOpts = list(), interactive = getInteractivity(), - colors = NULL, main = NULL, ylab = NULL, legend = TRUE, - legendItemsPerRow = 5, colorScaleOpts = colorScaleOptions(20), - width = NULL, height = NULL, xyCompare = c("union", "intersect"), - h5requestFiltering = list(), highlight = FALSE, stepPlot = FALSE, - drawPoints = FALSE, secondAxis = FALSE, timeSteph5 = "hourly", - mcYearh5 = NULL, tablesh5 = c("areas", "links"), ...) - -\method{plot}{simOptions}(x, table = NULL, variable = NULL, - elements = NULL, variable2Axe = NULL, mcYear = "average", - type = c("ts", "barplot", "monotone", "density", "cdf", "heatmap"), - dateRange = NULL, confInt = 0, minValue = NULL, maxValue = NULL, - aggregate = c("none", "mean", "sum", "mean by areas", "sum by areas"), - compare = NULL, compareOpts = list(), interactive = getInteractivity(), - colors = NULL, main = NULL, ylab = NULL, legend = TRUE, - legendItemsPerRow = 5, colorScaleOpts = colorScaleOptions(20), - width = NULL, height = NULL, xyCompare = c("union", "intersect"), - h5requestFiltering = list(), highlight = FALSE, stepPlot = FALSE, - drawPoints = FALSE, secondAxis = FALSE, timeSteph5 = "hourly", - mcYearh5 = NULL, tablesh5 = c("areas", "links"), ...) - -\method{plot}{list}(x, table = NULL, variable = NULL, elements = NULL, - variable2Axe = NULL, mcYear = "average", type = c("ts", "barplot", - "monotone", "density", "cdf", "heatmap"), dateRange = NULL, confInt = 0, - minValue = NULL, maxValue = NULL, aggregate = c("none", "mean", "sum", - "mean by areas", "sum by areas"), compare = NULL, compareOpts = list(), - interactive = getInteractivity(), colors = NULL, main = NULL, - ylab = NULL, legend = TRUE, legendItemsPerRow = 5, - colorScaleOpts = colorScaleOptions(20), width = NULL, height = NULL, - xyCompare = c("union", "intersect"), h5requestFiltering = list(), - highlight = FALSE, stepPlot = FALSE, drawPoints = FALSE, - secondAxis = FALSE, timeSteph5 = "hourly", mcYearh5 = NULL, - tablesh5 = c("areas", "links"), ...) -} -\arguments{ -\item{x}{Object of class \code{antaresData}. Alternatively, it can be a list of -\code{antaresData} objects. In this case, one chart is created for each -object. Can also be opts object from h5 file or list of opts object from h5 file.} - -\item{table}{Name of the table to display when \code{x} is an \code{antaresDataList} -object.} - -\item{variable}{Name of the variable to plot. If this argument is missing, then the -function starts a shiny gadget that let the user choose the variable to -represent. When the user clicks on the "Done" button", the graphic is -returned by the function.} - -\item{elements}{Vector of "element" names indicating for which elements of 'x' should the -variable be plotted. For instance if the input data contains areas, then -this parameter should be a vector of area names. If data contains clusters -data, this parameter has to be the concatenation of the area name and the -cluster name, separated by \code{" > "}. This is to prevent confusion -when two clusters from different areas have the same name.} - -\item{variable2Axe}{\code{character}, variables on second axis.} - -\item{mcYear}{If \code{x}, contains multiple Monte-Carlo scenarios, this parameter -determine which scenario is displayed. Must be an integer representing the -index of the scenario or the word "average". In this case data are -averaged.} - -\item{type}{Type of plot to draw. "ts" creates a time series plot, "barplot" creates -a barplot with one bar per element representing the average value of the -variable for this element. "monotone" draws the monotone curve of the -variable for each element.} - -\item{dateRange}{A vector of two dates. Only data points between these two dates are -displayed. If NULL, then all data is displayed.} - -\item{confInt}{Number between 0 and 1 indicating the size of the confidence interval to -display. If it equals to 0, then confidence interval is not computed nor -displayed. Used only when multiple Monte Carlo scenarios are present in -the input data.} - -\item{minValue}{Only used if parameter \code{type} is "density" or "cdf". If this parameter -is set, all values that are less than \code{minValue} are removed from the -graphic. This is useful to deal with variables containing a few extreme -values (generally cost and price variables). If \code{minValue} is unset, -all values are displayed.} - -\item{maxValue}{Only used if parameter \code{type} is "density" or "cdf". If this parameter -is set, all values not in [-minValue, maxValue] are removed from the graphic. -This is useful to deal with variables containing a few extreme values -(generally cost and price variables). If \code{maxValue} is 0 or unset, all -values are displayed.} - -\item{aggregate}{When multiple elements are selected, should the data be aggregated. If -"none", each element is represented separetly. If "mean" values are -averaged and if "sum" they are added. You can also compute mean ans sum by areas.} - -\item{compare}{An optional character vector containing names of parameters. When it is set, -two charts are outputed with their own input controls. Alternatively, it can -be a named list with names corresponding to parameter names and values being -list with the initial values of the given parameter for each chart. See details - if you are drawing a map.} - -\item{compareOpts}{List of options that indicates the number of charts to create and their -position. Check out the documentation of -\code{\link[manipulateWidget]{compareOptions}} to see available options.} - -\item{interactive}{LogicalValue. If \code{TRUE}, then a shiny gadget is launched that lets -the user interactively choose the areas or districts to display.} - -\item{colors}{Vector of colors} - -\item{main}{Title of the graph.} - -\item{ylab}{Label of the Y axis.} - -\item{legend}{Logical value indicating if a legend should be drawn. This argument is -usefull when one wants to create a shared legend with -\code{\link{prodStackLegend}}} - -\item{legendItemsPerRow}{Number of elements to put in each row of the legend.} - -\item{colorScaleOpts}{A list of parameters that control the creation of color scales. It is used -only for heatmaps. See \code{\link{colorScaleOptions}}() for available -parameters.} - -\item{width}{Width of the graph expressed in pixels or in percentage of -the parent element. For instance "500px" and "100\%" are valid values.} - -\item{height}{Height of the graph expressed in pixels or in percentage of -the parent element. For instance "500px" and "100\%" are valid values.} - -\item{xyCompare}{Use when you compare studies, can be "union" or "intersect". If union, all -of mcYears in one of studies will be selectable. If intersect, only mcYears in all -studies will be selectable.} - -\item{h5requestFiltering}{Contains arguments used by default for h5 request, -typically h5requestFiltering = list(select = "NUCLEAR")} - -\item{highlight}{highlight curve when mouse over} - -\item{stepPlot}{\code{boolean}, step style for curves.} - -\item{drawPoints}{\code{boolean}, add points on graph} - -\item{secondAxis}{add second axis to graph} - -\item{timeSteph5}{\code{character} timeStep to read in h5 file. Only for Non interactive mode.} - -\item{mcYearh5}{\code{numeric} mcYear to read for h5. Only for Non interactive mode.} - -\item{tablesh5}{\code{character} tables for h5 ("areas" "links", "clusters" or "disticts"). Only for Non interactive mode.} - -\item{...}{Other arguments for \code{\link{manipulateWidget}}} -} -\value{ -The function returns an object of class "htmlwidget". It is generated by -package \code{highcharter} if time step is annual or by \code{dygraphs} for -any other time step.It can be directly displayed in the viewer or be stored -in a variable for later use. -} -\description{ -This function generates an interactive plot of an antares time series. -} -\details{ -If the input data contains several Monte-Carlo scenarios, the function will -display the evolution of the average value. Moreover it will represent a -95% confidence interval. - -If the input data has a annual time step, the function creates a barplot -instead of a line chart. - -compare argument can take following values : -\itemize{ - \item "mcYear" - \item "main" - \item "variable" - \item "type" - \item "confInt" - \item "elements" - \item "aggregate" - \item "legend" - \item "highlight" - \item "stepPlot" - \item "drawPoints" - \item "secondAxis" - } -} -\examples{ -\dontrun{ -setSimulationPath(path = path1) -mydata <- readAntares(areas = "all", timeStep = "hourly") -plot(x = mydata) - -# Plot only a few areas -plot(x = mydata[area \%in\% c("area1", "area2", "area3")]) - -# If data contains detailed results, then the function adds a confidence -# interval -dataDetailed <- readAntares(areas = "all", timeStep = "hourly", mcYears = 1:2) -plot(x = dataDetailed) - -# If the time step is annual, the function creates a barplot instead of a -# linechart -dataAnnual <- readAntares(areas = "all", timeStep = "annual") -plot(x = dataAnnual) - -# Compare two simulaitons -# Compare the results of two simulations -setSimulationPath(path1) -mydata1 <- readAntares(areas = "all", timeStep = "daily") -setSimulationPath(path2) -mydata2 <- readAntares(areas = "all", timeStep = "daily") - -plot(x = list(mydata1, mydata2)) - -# When you compare studies, you have 2 ways to defind inputs, union or intersect. -# for example, if you chose union and you have mcYears 1 and 2 in the first study -# and mcYears 2 and 3 in the second, mcYear input will be worth c(1, 2, 3) -# In same initial condition (study 1 -> 1,2 ans study 2 -> 2, 3) if you choose intersect, -# mcYear input will be wort 2. -# You must specify union or intersect with xyCompare argument (default union). -plot(x = list(mydata1[area \%in\% c("a", "b")], - mydata1[area \%in\% c("b", "c")]), xyCompare = "union") -plot(x = list(mydata1[area \%in\% c("a", "b")], - mydata1[area \%in\% c("b", "c")]), xyCompare = "intersect") - -# Compare data in a single simulation -# Compare two periods for the same simulation -plot(x = mydata1, compare = "dateRange") - -# Compare two Monte-Carlo scenarios -detailedData <- readAntares(areas = "all", mcYears = "all") -plot(x = detailedData, .compare = "mcYear") - -# Use h5 for dynamic request / exploration in a study -# Set path of simulaiton -setSimulationPath(path = path1) - -# Convert your study in h5 format -writeAntaresH5(path = mynewpath) - -# Redefine sim path with h5 file -opts <- setSimulationPath(path = mynewpath) -plot(x = opts) - -# Compare elements in a single study -plot(x = opts, .compare = "mcYear") -# Compare 2 studies -plot(x = list(opts, opts2)) - -} - - - - -} +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/plot.R +\name{tsPlot} +\alias{tsPlot} +\alias{plot.antaresData} +\title{plot time series contained in an antaresData object} +\usage{ +tsPlot(x, y = NULL, table = NULL, variable = NULL, elements = NULL, + mcYear = "average", type = c("ts", "barplot", "monotone", "density", + "cdf", "heatmap"), dateRange = NULL, confInt = 0, minValue = NULL, + maxValue = NULL, aggregate = c("none", "mean", "sum"), compare = NULL, + compareOpts = list(), interactive = getInteractivity(), colors = NULL, + main = NULL, ylab = NULL, legend = TRUE, legendItemsPerRow = 5, + colorScaleOpts = colorScaleOptions(20), width = NULL, height = NULL, + ...) + +\method{plot}{antaresData}(x, y = NULL, table = NULL, variable = NULL, + elements = NULL, mcYear = "average", type = c("ts", "barplot", + "monotone", "density", "cdf", "heatmap"), dateRange = NULL, confInt = 0, + minValue = NULL, maxValue = NULL, aggregate = c("none", "mean", "sum"), + compare = NULL, compareOpts = list(), interactive = getInteractivity(), + colors = NULL, main = NULL, ylab = NULL, legend = TRUE, + legendItemsPerRow = 5, colorScaleOpts = colorScaleOptions(20), + width = NULL, height = NULL, ...) +} +\arguments{ +\item{x}{Object of class \code{antaresData}. Alternatively, it can be a list of +\code{antaresData} objects. In this case, one chart is created for each +object.} + +\item{y}{Optional object of class \code{antaresData}. If it is specified, then two +charts are generated.} + +\item{table}{Name of the table to display when \code{x} is an \code{antaresDataList} +object.} + +\item{variable}{Name of the variable to plot. If this argument is missing, then the +function starts a shiny gadget that let the user choose the variable to +represent. When the user clicks on the "Done" button", the graphic is +returned by the function.} + +\item{elements}{Vector of "element" names indicating for which elements of 'x' should the +variable be plotted. For instance if the input data contains areas, then +this parameter should be a vector of area names. If data contains clusters +data, this parameter has to be the concatenation of the area name and the +cluster name, separated by \code{" > "}. This is to prevent confusion +when two clusters from different areas have the same name.} + +\item{mcYear}{If \code{x}, contains multiple Monte-Carlo scenarios, this parameter +determine which scenario is displayed. Must be an integer representing the +index of the scenario or the word "average". In this case data are +averaged.} + +\item{type}{Type of plot to draw. "ts" creates a time series plot, "barplot" creates +a barplot with one bar per element representing the average value of the +variable for this element. "monotone" draws the monotone curve of the +variable for each element.} + +\item{dateRange}{A vector of two dates. Only data points between these two dates are +displayed. If NULL, then all data is displayed.} + +\item{confInt}{Number between 0 and 1 indicating the size of the confidence interval to +display. If it equals to 0, then confidence interval is not computed nor +displayed. Used only when multiple Monte Carlo scenarios are present in +the input data.} + +\item{minValue}{Only used if parameter \code{type} is "density" or "cdf". If this parameter +is set, all values that are less than \code{minValue} are removed from the +graphic. This is useful to deal with variables containing a few extreme +values (generally cost and price variables). If \code{minValue} is unset, +all values are displayed.} + +\item{maxValue}{Only used if parameter \code{type} is "density" or "cdf". If this parameter +is set, all values not in [-minValue, maxValue] are removed from the graphic. +This is useful to deal with variables containing a few extreme values +(generally cost and price variables). If \code{maxValue} is 0 or unset, all +values are displayed.} + +\item{aggregate}{When multiple elements are selected, should the data be aggregated. If +"none", each element is represented separetly. If "mean" values are +averaged and if "sum" they are added.} + +\item{compare}{An optional character vector containing names of parameters. When it is set, +two charts are outputed with their own input controls. Alternatively, it can +be a named list with names corresponding to parameter names and values being +list with the initial values of the given parameter for each chart.} + +\item{compareOpts}{List of options that indicates the number of charts to create and their +position. Check out the documentation of +\code{\link[manipulateWidget]{compareOptions}} to see available options.} + +\item{interactive}{LogicalValue. If \code{TRUE}, then a shiny gadget is launched that lets +the user interactively choose the areas or districts to display.} + +\item{colors}{Vector of colors} + +\item{main}{Title of the graph.} + +\item{ylab}{Label of the Y axis.} + +\item{legend}{Logical value indicating if a legend should be drawn. This argument is +usefull when one wants to create a shared legend with +\code{\link{prodStackLegend}}} + +\item{legendItemsPerRow}{Number of elements to put in each row of the legend.} + +\item{colorScaleOpts}{A list of parameters that control the creation of color scales. It is used +only for heatmaps. See \code{\link{colorScaleOptions}}() for available +parameters.} + +\item{width}{Width of the graph expressed in pixels or in percentage of +the parent element. For instance "500px" and "100\%" are valid values.} + +\item{height}{Height of the graph expressed in pixels or in percentage of +the parent element. For instance "500px" and "100\%" are valid values.} + +\item{...}{currently unused} +} +\value{ +The function returns an object of class "htmlwidget". It is generated by +package \code{highcharter} if time step is annual or by \code{dygraphs} for +any other time step.It can be directly displayed in the viewer or be stored +in a variable for later use. +} +\description{ +This function generates an interactive plot of an antares time series. +} +\details{ +If the input data contains several Monte-Carlo scenarios, the function will +display the evolution of the average value. Moreover it will represent a +95% confidence interval. + +If the input data has a annual time step, the function creates a barplot +instead of a line chart. +} +\examples{ +\dontrun{ +setSimulationPath() +mydata <- readAntares("all", timeStep = "monthly") +plot(mydata) +plot(mydata, "LOAD") + +# Plot only a few areas +plot(mydata[area \%in\% c("area1", "area2", "area3")]) + +# If data contains detailed results, then the function adds a confidence +# interval +dataDetailed <- readAntares("all", timeStep = "monthly", synthesis = FALSE) +plot(dataDetailed) + +# If the time step is annual, the function creates a barplot instead of a +# linechart +dataAnnual <- readAntares("all", timeStep = "Annual") +plot(dataAnnual) + +# Compare the results of two simulations +setSimulationPath(path1) +mydata1 <- readAntares("all", timeStep = "daily") +setSimulationPath(path2) +mydata2 <- readAntares("all", timeStep = "daily") + +plot(mydata1, mydata2) + +# Compare two periods for the same simulation +plot(mydata1, compare = "dateRange") + +# Compare two Monte-Carlo scenarios +detailedData <- readAntares("all", mcYears = "all") +plot(detailedData[mcYear == 1], detailedData[mcYear == 2]) + +# To do the same thing, with antaresDataList objects, one can use 'subset' +detailedData <- readAntares(areas = "all" links = "all", mcYears = "all") +plot(subset(detailedData, mcYears = 1), subset(detailedData, mcYears = 2)) +} + +} diff --git a/tests/testthat/helper-init.R b/tests/testthat/helper-init.R index ba421b4..5b53d97 100644 --- a/tests/testthat/helper-init.R +++ b/tests/testthat/helper-init.R @@ -3,10 +3,7 @@ # Copy the test study in a temporary folder path <- tempdir() - -sourcedir <- system.file("inst/testdata", package = "antaresRead") -if(sourcedir == ""){sourcedir <- system.file("testdata", package = "antaresRead")} - +sourcedir <- system.file("testdata", package = "antaresRead") # Hack: For some unknown reason, this script is executed at some point of # the R CMD CHECK before package is correctly installed and tests actually run. diff --git a/tests/testthat/test-exchangesStack.R b/tests/testthat/test-exchangesStack.R deleted file mode 100644 index 528c2fb..0000000 --- a/tests/testthat/test-exchangesStack.R +++ /dev/null @@ -1,18 +0,0 @@ -context("exchangesStack") - -describe("no interactivy", { - - mydata <- readAntares(links = "all", timeStep = "daily", showProgress = FALSE) - - # default parameters - default_params <- exchangesStack(mydata, interactive = FALSE) - expect_is(default_params, "htmlwidget") - - # TO DO : passer les arguments - # passer plusieurs data - # .compare - - # suivant les cas : - # - tester les retours d'erreurs - -}) \ No newline at end of file diff --git a/tests/testthat/test-getTSData.R b/tests/testthat/test-getTSData.R deleted file mode 100644 index ae70160..0000000 --- a/tests/testthat/test-getTSData.R +++ /dev/null @@ -1,56 +0,0 @@ -context(".getTSData") - -describe(".getTSData", { - # Helper function that checks the structure of object returned by .getTSData - # is ok - check_obj <- function(x, aggregated = FALSE) { - expect_is(x, "data.table") - expect_true(all(c("element", "timeId", "time", "value") %in% names(x))) - } - - mydata <- readAntares(timeStep = "daily", mcYears = "all", showProgress = FALSE) - tpl <- mydata[, .(mcYear, element = area, timeId, time, value = 0)] - - it ("returns a table with element, timeId, time and value columns", { - dt <- .getTSData(mydata, tpl, "LOAD", "all") - check_obj(dt) - }) - - it ("can filter data by element, date, mcYear", { - # element - myarea <- getAreas()[1] - dt <- .getTSData(mydata, tpl, "LOAD", elements = myarea) - check_obj(dt) - expect_true(all(dt$element == myarea)) - expect_equal(dt$value, mydata[area == myarea, LOAD]) - - # date - dateRange <- c(min(dt$time), min(dt$time)) - dt <- .getTSData(mydata, tpl, "LOAD", "all", dateRange = dateRange) - check_obj(dt) - expect_true(all(dt$time == dateRange[1])) - expect_equal(dt$value, mydata[time == dateRange[1], LOAD]) - - # mcYear - dt <- .getTSData(mydata, tpl, "LOAD", "all", mcYear = 1) - check_obj(dt) - expect_true(all(dt$mcYear == 1)) - expect_equal(dt$value, mydata[mcYear == 1, LOAD]) - }) - - it ("can aggregate data", { - # sum - dt <- .getTSData(mydata, tpl, "LOAD", "all", aggregate = "sum") - check_obj(dt) - expect_true(all(dt$element == "LOAD")) - expectValue <- mydata[, .(LOAD = sum(LOAD)), by = .(mcYear, timeId)] - expect_equal(dt$value, expectValue$LOAD) - - # mean - dt <- .getTSData(mydata, tpl, "LOAD", "all", aggregate = "mean") - check_obj(dt) - expect_true(all(dt$element == "LOAD")) - expectValue <- mydata[, .(LOAD = mean(LOAD)), by = .(mcYear, timeId)] - expect_equal(dt$value, expectValue$LOAD) - }) -}) \ No newline at end of file diff --git a/tests/testthat/test-get_data_for_comp.R b/tests/testthat/test-get_data_for_comp.R index c97bc00..ebba455 100644 --- a/tests/testthat/test-get_data_for_comp.R +++ b/tests/testthat/test-get_data_for_comp.R @@ -1,4 +1,5 @@ context(".getDataForComp") + # Helper function check_structure <- function(x, y = NULL, compare = NULL, compareOpts = NULL) { res <- .getDataForComp(x, y, compare, compareOpts) diff --git a/tests/testthat/test-map.R b/tests/testthat/test-map.R deleted file mode 100644 index 56861a9..0000000 --- a/tests/testthat/test-map.R +++ /dev/null @@ -1,34 +0,0 @@ -context("plotMap") - - -describe("plotMap, no interactive", { - - dta <- readAntares(areas = "all", links = "all", showProgress = FALSE) - testClass <- function(obj){ - class(obj)[1] == 'combineWidgets' - } - load(system.file("mapLayout/ml.rda", package = "antaresViz")) - - listArgs <- list(noarg = list(x = dta, interactive = FALSE, mapLayout = ml), - colorLinks = list(x = dta, interactive = FALSE, mapLayout = ml, colLinkVar = "FLOW LIN."), - colorAll = list(x = dta, interactive = FALSE, mapLayout = ml, colLinkVar = "FLOW LIN.", - colAreaVar = "OP. COST") - ) - - lapply(listArgs, function(X){ - test_that (names(listArgs), { - re1 <- do.call(plotMap, X) - expect_true(testClass(re1)) - }) - }) - -}) - -describe("plotMap, no interactive return error", { - - dta <- readAntares(areas = "all", links = "all", showProgress = FALSE) - load(system.file("mapLayout/ml.rda", package = "antaresViz")) - - expect_error(plotMap(dta, ml , interactive = FALSE, compare = "areas")) - -}) \ No newline at end of file diff --git a/tests/testthat/test-prodStack.R b/tests/testthat/test-prodStack.R deleted file mode 100644 index 1775580..0000000 --- a/tests/testthat/test-prodStack.R +++ /dev/null @@ -1,27 +0,0 @@ -describe("prodStack, no interactive", { - - dta <- readAntares(areas = "all", links = "all", showProgress = FALSE) - testClass <- function(obj){ - class(obj)[1] == 'combineWidgets' - } - listArgs <- list(noarg = list(x = dta, interactive = FALSE, areas = "a"), - areas2 = list(x = dta, interactive = FALSE, areas = c("a", "b")) - ) - - - lapply(listArgs, function(X){ - test_that (names(listArgs), { - re1 <- do.call(prodStack, X) - expect_true(testClass(re1)) - }) - }) - -}) - - -describe("prodStack, no interactive return error", { - - dta <- readAntares(areas = "all", links = "all", showProgress = FALSE) - expect_error(prodStack(dta, interactive = FALSE, compare = "areas")) - -}) \ No newline at end of file diff --git a/tests/testthat/test-stackExchanges.R b/tests/testthat/test-stackExchanges.R deleted file mode 100644 index 96f4066..0000000 --- a/tests/testthat/test-stackExchanges.R +++ /dev/null @@ -1,31 +0,0 @@ -context("stackExchanges") - - -describe("stackExchanges, no interactive", { - dta <- readAntares(areas = "all", links = "all", showProgress = FALSE) - testClass <- function(obj){ - class(obj)[1] == 'combineWidgets' - } - listArgs <- list(noarg = list(x = dta, interactive = FALSE, areas = "a"), - allAreas = list(x = dta, interactive = FALSE, areas = "all"), - main = list(x = dta, interactive = FALSE, areas = "all", main = "Title"), - ylab = list(x = dta, interactive = FALSE, areas = "all", main = "Title", ylab = "Subt") - ) - - - lapply(listArgs, function(X){ - test_that (names(listArgs), { - re1 <- do.call(exchangesStack, X) - expect_true(testClass(re1)) - }) - }) - -}) - -describe("stackExchanges, no interactive return error", { - - dta <- readAntares(areas = "all", links = "all", showProgress = FALSE) - - expect_error(exchangesStack(dta, interactive = FALSE, compare = "areas")) - -}) \ No newline at end of file diff --git a/tests/testthat/test-ts_plot.R b/tests/testthat/test-ts_plot.R deleted file mode 100644 index 6e7aa7a..0000000 --- a/tests/testthat/test-ts_plot.R +++ /dev/null @@ -1,95 +0,0 @@ -context("tsPlot") - -describe(".getTSData", { - # Helper function that checks the structure of object returned by .getTSData - # is ok - check_obj <- function(x, aggregated = FALSE) { - expect_is(x, "data.table") - expect_true(all(c("element", "timeId", "time", "value") %in% names(x))) - } - - mydata <- readAntares(timeStep = "daily", mcYears = "all", showProgress = FALSE) - tpl <- mydata[, .(mcYear, element = area, timeId, time, value = 0)] - - it ("returns a table with element, timeId, time and value columns", { - dt <- .getTSData(mydata, tpl, "LOAD", "all") - check_obj(dt) - }) - - it ("can filter data by element, date, mcYear", { - # element - myarea <- getAreas()[1] - dt <- .getTSData(mydata, tpl, "LOAD", elements = myarea) - check_obj(dt) - expect_true(all(dt$element == myarea)) - expect_equal(dt$value, mydata[area == myarea, LOAD]) - - # date - dateRange <- c(min(dt$time), min(dt$time)) - dt <- .getTSData(mydata, tpl, "LOAD", "all", dateRange = dateRange) - check_obj(dt) - expect_true(all(dt$time == dateRange[1])) - expect_equal(dt$value, mydata[time == dateRange[1], LOAD]) - - # mcYear - dt <- .getTSData(mydata, tpl, "LOAD", "all", mcYear = 1) - check_obj(dt) - expect_true(all(dt$mcYear == 1)) - expect_equal(dt$value, mydata[mcYear == 1, LOAD]) - }) - - it ("can aggregate data", { - # sum - dt <- .getTSData(mydata, tpl, "LOAD", "all", aggregate = "sum") - check_obj(dt) - expect_true(all(dt$element == "LOAD")) - expectValue <- mydata[, .(LOAD = sum(LOAD)), by = .(mcYear, timeId)] - expect_equal(dt$value, expectValue$LOAD) - - # mean - dt <- .getTSData(mydata, tpl, "LOAD", "all", aggregate = "mean") - check_obj(dt) - expect_true(all(dt$element == "LOAD")) - expectValue <- mydata[, .(LOAD = mean(LOAD)), by = .(mcYear, timeId)] - expect_equal(dt$value, expectValue$LOAD) - }) -}) - - -describe("tsPlot, no interactive", { - dta <- readAntares(areas = "all", links = "all", showProgress = FALSE) - testClass <- function(obj){ - class(obj)[1] == 'combineWidgets' - } - listArgs <- list(noarg = list(x = dta, interactive = FALSE), - elem = list(x = dta, interactive = FALSE, elements = "a"), - elemS = list(x = dta, interactive = FALSE, elements = c("a", "b")), - linkS = list(x = dta, table = "links", interactive = FALSE, elements = c("a - a_offshore")), - linkSVarSel = list(x = dta, table = "links", interactive = FALSE, - elements = c("a - a_offshore"), - variable = "FLOW LIN._std"), - bar = list(x = dta, interactive = FALSE, elements = "all", type = "barplot"), - monotone = list(x = dta, interactive = FALSE, elements = "all", type = "monotone"), - density = list(x = dta, interactive = FALSE, elements = "all", type = "density"), - cdf = list(x = dta, interactive = FALSE, elements = "all", type = "cdf"), - heatmap = list(x = dta, interactive = FALSE, elements = "all", type = "heatmap") - ) - - lapply(listArgs, function(X){ - test_that (names(listArgs), { - re1 <- do.call(tsPlot, X) - expect_true(testClass(re1)) - }) - }) - -}) - - - -describe("tsPlot, no interactive return error", { - - dta <- readAntares(areas = "all", links = "all", showProgress = FALSE) - - expect_error(tsPlot(dta, interactive = FALSE, compare = "areas")) - -}) \ No newline at end of file diff --git a/vignettes/antaresViz.Rmd b/vignettes/antaresViz.Rmd deleted file mode 100644 index 04f7f2d..0000000 --- a/vignettes/antaresViz.Rmd +++ /dev/null @@ -1,195 +0,0 @@ ---- -title: "Quick presentation of antaresViz" -author: "RTE" -date: "`r Sys.Date()`" -output: html_vignette -vignette: > - %\VignetteIndexEntry{Vignette Title} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} ---- - - - -![](antareslogo.png) - -This package works along with RTE's adequacy software ANTARES : https://antares.rte-france.com/ - -`antaresViz` is a package which proposes relevant graphs and maps to vizualize the results of an ANTARES study, with numerous settings and possible customizations. - - - -## Where everything starts - - -```{r loadPackage, message = FALSE, warning=FALSE} -library(antaresViz) -``` - - -The data from an ANTARES study can be imported and easily manipulated using the [antaresRead](https://github.com/rte-antares-rpackage/antaresRead) package. - -The examples presented below have been build on a fictionnal study whose output have been loaded with antaresRead. They contains different types of elements : - - * outputs with an annual and an hourly time step, - * synthetic outputs (averaged on several Monte-Carlo years) and detailled outputs (given year by year), - * outputs for areas, links, clusters and districts. - - -```{r loadData, message = FALSE} -load("data_for_antaresViz_vignette_extralight.Rdata") -``` - -The aim of this vignette is to give a quick overview of the possibilities offered by the package antaresViz. The data with which the following graphs have been plotted are fictionnal. - -## The simple power of the `plot` function - -The `plot()` function, used with an antaresDataList object (i.e. an object returned by the `antaresRead::readAntares()` function) offers different possible vizualisations. - -Moreover, this function is __really easy to use__. It opens a shiny interface which let the user decide : - -* Which type of __element__ he wants to study : areas, links or disctricts. -* Which __variable__ he wants to analyze. -* With which type of __graph__ : barplot, time series, probability density function, heatmap, etc. -* For which area(s), link(s), or district(s). -* And during which __time period__. - - -```r -plot(data_hourly_synthesis) -``` - -![](plot_resized.gif) - - -Note that all the interface manipulation can also be set directly in the arguments of the `plot` function. Some examples of the multiple graphs that can be returned by this function are given below. - -###### Barplot of Loss of Load Duration (LOLD) for several districts of the study - -```{r barplot, eval = FALSE} -plot(data_annual_synthesis, table = "districts" ,variable = "LOLD", type = "barplot", elements = c("00_a", "00_b", "00_c", "00_d", "00_e", "00_f", "00_g", "00_h", "00_i"), interactive = FALSE, width = "100%", height = 400) -``` - - -###### Time series of the load in an area with average value and 95% confidence interval. - -```{r ts, eval=FALSE} -plot(data_hourly_allmc, table = "areas" ,variable = "LOAD", type = "ts", elements = "23_b", confInt = 0.95, dateRange = c("2018-01-08", "2018-01-14"), width = "100%", height = 400, interactive = FALSE) -``` - - -###### Probability density function of the wind power generation in two areas -```{r density, eval=FALSE} -plot(data_hourly_synthesis, table = "areas" ,variable = "WIND", type = "density", elements = c("01_a", "02_a"), interactive = FALSE, width = "100%", height = 400) -``` - - -###### Heatmap of the congestion probability of one interconnection - -```{r heatmap, eval=FALSE} -plot(data_hourly_synthesis_1year, table = "links", variable = "CONG. PROB +", type = "heatmap", elements = "25_c - 26_d", interactive = FALSE, width = "100%", height = 400, main = "Congestion probability") -``` - - -Note that the `plot()` function also contains a `compare` argument which allows comparisons between : - -* different variables -* different areas/links/district -* different studies - - -## When the production meets the demand - -The `prodStack` function builds a graph which contains the time series of demand in one area (or the sum of the demand of a set of areas) along with the generation of this area (or set of areas), divided between the different fuel types (e.g. nuclear, gas, wind, etc). - - -```r -prodStack(data_hourly_synthesis) -``` - -Once again, this function is easy to use and opens a shiny interface which let the user manipulate the selected areas and time range. Some settings can also be passed to the function through its (optionnal) arguments. - -```{r prodStack, eval = FALSE} -prodStack(data_hourly_synthesis, stack = "eco2mix", areas = "37_h", dateRange = c("2018-01-08", "2018-01-21"), main = "Production stack", unit = "GWh", interactive = FALSE, width = "100%", height = 500) -``` - -The graphical template used by default is the one of the RTE's application [eco2mix](http://www.rte-france.com/fr/eco2mix/eco2mix-mix-energetique). This template can though be redefined completely by the user with the function `setProdStackAlias()`. - -The `exchangesStack()` function proposes similar graphs with a superposition of all the imports and exports of an area. - -```{r exchangeStack, eval = FALSE} -exchangesStack(data_hourly_synthesis, area = "37_h", dateRange = c("2018-01-08", "2018-01-21"), main = "Import/Export of area 37_h", unit = "GWh", interactive = FALSE, width = "100%", height = 500) -``` - -## Everything looks better on a map - -Last but not least, `antaresViz` proposes several function to vizualise the results of a study on a map. - -To do so, the first function to use is `mapLayout()`. This function launches an interactive application that let the user place areas of the ANTARES study on a map. - - -```r -antares_layout <- antaresRead::readLayout(opts = antaresRead::setSimulationPath(study_path)) -map_layout <- mapLayout(layout = antares_layout) -``` - -![](maplyout_resized.gif) - -(Once again : the study presented here is fictionnal !) - - -The function `plotMap()` then generates an interactive map that let the user visually explore the results of an Antares simulation. By default the function starts a Shiny gadget that let the user choose : - - * Which __variable__ to represent - * With which __type of vizualisation__ - - areas : color, size, popup, label - - links : color, width of the link, popup - * For which __time step__ or __date range__ - - -```r -plotMap(data_hourly_synthesis, map_layout) -``` - -Some examples of results returned by the `plotMap()` function are depicted below. - - - -###### C02 emissions - -This first map depicts the annual CO2 emissions of all the areas of the ANTARES study. - - -```{r plotmap_co2, eval = FALSE} -plotMap(data_annual_filtered, map_layout, showLabels = TRUE, sizeAreaVar = "CO2 EMIS.", interactive = FALSE, labelAreaVar = "CO2 EMIS.", colAreaVar = "CO2 EMIS.", type = "avg", options = plotMapOptions(areaDefaultSize = 30, labelMaxSize = 8, labelMinSize = 14, areaColorScaleOpts = colorScaleOptions(zeroCol = "white", posCol = "red2")), width = "100%", height = 600) -``` - - -###### Average balance and flows in the system - -This map illustrates the annual balance (MWh exported if positive - or imported if negative - during an hour) of each area and the annual flows of each link. - -```{r plotmap_flows, eval = FALSE} -plotMap(data_annual_synthesis, map_layout, showLabels = TRUE, colAreaVar = "BALANCE", interactive = FALSE, labelAreaVar = "BALANCE", sizeLinkVar = "FLOW LIN.", type = "avg", options = plotMapOptions(areaDefaultSize = 30, labelMaxSize = 10, labelMinSize = 8, areaColorScaleOpts = colorScaleOptions(negCol = "tomato3", zeroCol = "white", posCol = "blue3")), width = "100%", height = 600) -``` - - -###### Energy mixes - -The proportion of each energy type in the annual production of each area is illustrated on this next map. The actual generated energies (in MWh) can be known by clicking on the pie charts. - -```{r plotmap_mix, eval = FALSE} -data_annual_synthesis$areas <- data_annual_synthesis$areas[, `:=`(THERMAL = NUCLEAR + LIGNITE + COAL + GAS + OIL + `MIX. FUEL` + `MISC. DTG`, HYDRO =`H. ROR` + `H. STOR`)] - -plotMap(data_annual_synthesis, map_layout, interactive = FALSE, sizeAreaVars = c("HYDRO", "SOLAR", "WIND", "THERMAL"), popupAreaVars = c("HYDRO", "SOLAR", "WIND", "THERMAL"),areaChartType = "pie", type = "avg", options = plotMapOptions(areaDefaultSize = 25), width = "100%", height = 600) -``` - - - -## Let's get started - -The `antaresViz` package is available on the CRAN and can be installed with : -```r -install.packages("antaresViz") -``` - diff --git a/vignettes/antareslogo.png b/vignettes/antareslogo.png deleted file mode 100644 index c434774cce2666ab059071630fba26eb79b23ca0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19979 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 z 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³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 diff --git a/vignettes/maplyout_resized.gif b/vignettes/maplyout_resized.gif deleted file mode 100644 index 5fe4738ffaf525491ec13d84cbf7958e5ab67b5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 855530 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