From 4c4ad3e1908aa7e18a1f8dd222e562871280be7b Mon Sep 17 00:00:00 2001 From: Elie Arnaud Date: Wed, 16 Oct 2019 10:18:13 +0200 Subject: [PATCH] First commit --- .RData | Bin 0 -> 2595 bytes .Rbuildignore | 7 + .Rhistory | 141 +++++ .gitignore | 2 + DESCRIPTION | 27 + MetaShARK.Rproj | 17 + NAMESPACE | 13 + R/app_server.R | 14 + R/app_ui.R | 75 +++ R/golem_utils_server.R | 32 ++ R/golem_utils_ui.R | 213 ++++++++ R/headerScript.R | 29 + R/modules/about/.Rhistory | 512 ++++++++++++++++++ R/modules/about/about.R | 47 ++ R/modules/about/about.bib | 262 +++++++++ R/modules/about/about_functions.R | 47 ++ R/modules/about/actors.bib | 33 ++ R/modules/about/ecology.bib | 86 +++ R/modules/about/informatics.bib | 55 ++ R/modules/documentation/documentation.R | 101 ++++ .../documentation/documentation_functions.R | 253 +++++++++ R/modules/documentation/documentation_style.R | 3 + R/modules/fill/EMLAL/EMLAL.R | 93 ++++ R/modules/fill/EMLAL/EMLAL_catvars.R | 14 + R/modules/fill/EMLAL/EMLAL_createDP.R | 205 +++++++ R/modules/fill/EMLAL/EMLAL_customUnits.R | 14 + R/modules/fill/EMLAL/EMLAL_functions.R | 299 ++++++++++ R/modules/fill/EMLAL/EMLAL_selectDP.R | 312 +++++++++++ R/modules/fill/EMLAL/EMLAL_templateDP.R | 409 ++++++++++++++ R/modules/fill/EMLAL/sampleDP.R | 46 ++ R/modules/fill/fill.R | 34 ++ R/modules/fill/fill_functions.R | 1 + R/modules/fill/input_templates.R | 25 + R/modules/welcome/welcome.R | 40 ++ R/runMetashark.R | 24 + README.Rmd | 54 ++ data/backboneGuideline.rda | Bin 0 -> 5559 bytes data/docGuideline.rda | Bin 0 -> 10720 bytes data/systemGuideline.rda | Bin 0 -> 164280 bytes inst/app/www/favicon.ico | Bin 0 -> 3774 bytes man/runMetashark.Rd | 18 + tests/testthat.R | 4 + tests/testthat/test-golem-recommended.R | 40 ++ vignettes/.gitignore | 2 + vignettes/MetaShARK.Rmd | 19 + 45 files changed, 3622 insertions(+) create mode 100644 .RData create mode 100644 .Rbuildignore create mode 100644 .Rhistory create mode 100644 .gitignore create mode 100644 DESCRIPTION create mode 100644 MetaShARK.Rproj create mode 100644 NAMESPACE create mode 100644 R/app_server.R create mode 100644 R/app_ui.R create mode 100644 R/golem_utils_server.R create mode 100644 R/golem_utils_ui.R create mode 100644 R/headerScript.R create mode 100644 R/modules/about/.Rhistory create mode 100644 R/modules/about/about.R create mode 100644 R/modules/about/about.bib create mode 100644 R/modules/about/about_functions.R create mode 100644 R/modules/about/actors.bib create mode 100644 R/modules/about/ecology.bib create mode 100644 R/modules/about/informatics.bib create mode 100644 R/modules/documentation/documentation.R create mode 100644 R/modules/documentation/documentation_functions.R create mode 100644 R/modules/documentation/documentation_style.R create mode 100644 R/modules/fill/EMLAL/EMLAL.R create mode 100644 R/modules/fill/EMLAL/EMLAL_catvars.R create mode 100644 R/modules/fill/EMLAL/EMLAL_createDP.R create mode 100644 R/modules/fill/EMLAL/EMLAL_customUnits.R create mode 100644 R/modules/fill/EMLAL/EMLAL_functions.R create mode 100644 R/modules/fill/EMLAL/EMLAL_selectDP.R create mode 100644 R/modules/fill/EMLAL/EMLAL_templateDP.R create mode 100644 R/modules/fill/EMLAL/sampleDP.R create mode 100644 R/modules/fill/fill.R create mode 100644 R/modules/fill/fill_functions.R create mode 100644 R/modules/fill/input_templates.R create mode 100644 R/modules/welcome/welcome.R create mode 100644 R/runMetashark.R create mode 100644 README.Rmd create mode 100644 data/backboneGuideline.rda create mode 100644 data/docGuideline.rda create mode 100644 data/systemGuideline.rda create mode 100644 inst/app/www/favicon.ico create mode 100644 man/runMetashark.Rd create mode 100644 tests/testthat.R create mode 100644 tests/testthat/test-golem-recommended.R create mode 100644 vignettes/.gitignore create mode 100644 vignettes/MetaShARK.Rmd diff --git a/.RData b/.RData new file mode 100644 index 0000000000000000000000000000000000000000..b06104e90bdb8d9fb7076f0266467a9020bd0749 GIT binary patch literal 2595 zcmV+;3f%P{iwFP!000000|5*Q^Yv0hSThP(3IG5A0{{aC00098000001yxi=EjR!G z1Ofm60096500{s901PftVQyq^Z7y?VWn=&V01W^D0&)NVD5C%X0&umd0?`mm-d@u- z*GI!2{@mYeLM^L0M+#a{WdqEG3TTpeok<7VsCF9ZjDGeN}JZrogfgwa-pzW_wL;)pO@s*cIF#$jOm!EtCoo? z1s@C4tkm-9DaD1FbHYebj9Zz>1K?i@dSM;=?5?_RT~|;-DXhxH8ohk)0$MQLbQ9D~ z>Nw$nX4#FgV8+?HjE`Ux(S*>`dbM#$bMoe=BFj@|E083YGEpq@XWq3za>wfg1YBy& zDXk4iD2jDqc!O%MC+K@Iyvgb_VfKj>@BhW~A~gP^2cDD%+ZU$0oNT9=zJ0?+;~Ly%Ez{fiX!tq> zrkQ4yEr#YxLQj7297F-f7ImKm?6Q${l#2*H0#L#g>Jf5)OrC*1V22nkCmh@jy=|uq zIZB-TqC+gsR;aQ`?1^%|UbgG^6~C6Y9P|u9lV!MMDB|ZTHv4#!#sJl0jsbk{!_NG_ zLHAvFUCdMRcwGUc8+yS>GPAMcuvoL8u6eHj+vW}kaBr51!=P@gCYqEtN= zK}Ahx#X<&OPuoE}5nx+e$>E!#7B2D{7}rYw&n(-DB0ck$gW5&lr;`Nxr?_mvrdg8R zx<;5uxDRP?Cj>{%ay4#KC33dy#!FSinGi!nVbQpX@m|K`4oBJ33EVGR5iOkg3JPNR zj01V}MQBxt+(}#B8+P-y`+slC*R;3e-zBp1k)k~k*t@mV48UwN^}#;Zn2z1@U$<$g z@Qg0lyd6O~96CK@jC0W$PZ$Ycjydg50fx?=6sI(vdM6M*hy9f27vEl!jBJ$HY`LrkW6 zzuimb-1=S-rZeBgt=Q=JE%{dqb!NVaFt5A=-z1=tgVl-JVv^l-SnHRXBQRZOopG#a z(0(%mTIXOih5S0%7R@}&t17?1GNXbW(};;EOX)2Lo|YbpoF5wtm() z6I&Om9^kdC8DUX-Kd!->)K|yobgWmtDZLdV1zNeP+Y>efWjNp9<=L2>6UIZ2M ze1rlRX|+_J*7CU9Y0H(~29Qs%kx^L|dfxUMsmCRa4_r$a_^n_}>x%IhpM&sJV(1@$ z`^m!F)bi+c)BkRt)Z#gPl@s zUApZMfAcJ;%$Oo4jk)QU;wGm;25(TI$>fr=Kb6y2ds0O_>Z^2Jned6VbusdDRX$ej zXr~htNW7P;%8mGETk3{cd}EzlqDWb@o2idvJ60u};otZ8GL&BC1ck8iUxHGl6&s~r zMWBgu;UU#p^logeQWqu+=WGXo&3$Lx<{DRel+)Xa$3)HB z1$F%&PqLWM+l$rk-B4<7Nf8|vU!L1Amxq-iG8|h8jBW2T{7Njk$wLZ6x`ee;4NK4%?j-@B!Vr@$t&6u~MsYmWSwR<~IjyNrKFOC8n(pE^AQb8~zX zN*JI`jXB$X`=&D-@$Xn=-(=NK_Z8Qv?9xE%PAff-$8c_dWU*$Rp1#@A#3$wC4m`S) zat&m*{c7&fPvb6*f5-%3dnxdFwAOTbtzRx_s1z_boCO(1F#`UySeti+(;!s>u%YI_ zo$f9%jh7F04D4+jRQ)9V=bCG;NKnYEX&zMzvj=5-x13SU^X=x$vndO{I-D2QiL3`2Su7E@0Jb@Ly08S5hGQ0RG=pyLb!= F003E(=v4p! literal 0 HcmV?d00001 diff --git a/.Rbuildignore b/.Rbuildignore new file mode 100644 index 0000000..13e1f2d --- /dev/null +++ b/.Rbuildignore @@ -0,0 +1,7 @@ +^.*\.Rproj$ +^\.Rproj\.user$ +^data-raw$ +dev_history.R +^dev$ +$run_dev.* +^README\.Rmd$ diff --git a/.Rhistory b/.Rhistory new file mode 100644 index 0000000..544702f --- /dev/null +++ b/.Rhistory @@ -0,0 +1,141 @@ +golem::fill_desc( +pkg_name = "MetaShARK", # The Name of the package containing the App +pkg_title = "metashark", # The Title of the package containing the App +pkg_description = "MetaShARK is a Shiny application allowing its +user to fill metadata for a given ecological +dataset of his owns. The data description relies +on Ecological Metadata Language (EML).", # The Description of the package containing the App +author_first_name = "Elie", # Your First Name +author_last_name = "ARNAUD", # Your Last Name +author_email = "earnaud@outlook.com", # Your Email +repo_url = "https://github.com/earnaud/MetaShARK.git" # The (optional) URL of the GitHub Repo +) +getwd() +golem::set_golem_options() +usethis::use_readme_rmd( open = FALSE ) +{usethis} +usethis +## 1.3 - Add a data-raw folder +## +## If you have data in your package +usethis::use_data_raw( name = "resources", open = FALSE ) # Change "my_dataset" +usethis::use_data_rax +usethis::use_data_raw +golem::use_recommended_tests +normalizePath +interactive() +golem::use_recommended_tests() +golem::use_recommended_deps() +# Add helper functions +golem::use_utils_ui() +golem::use_utils_server() +# You're now set! +# go to dev/02_dev.R +rstudioapi::navigateToFile( "dev/02_dev.R" ) +## 2.1 Add modules +## +golem::add_module( name = "modules/my_first_module" ) # Name of the module +## 3.1 Vignette +usethis::use_vignette("MetaShARK") +# You're now set! +# go to dev/03_deploy.R +rstudioapi::navigateToFile("dev/03_deploy.R") +# You're now set! +# go to dev/03_deploy.R +rstudioapi::navigateToFile("dev/03_deploy.R") +install.packages("rhub") +devtools::test() +#' Run the Shiny Application +#' +#' @export +#' @importFrom shiny shinyApp +#' @importFrom golem with_golem_options +run_app <- function(...) { +with_golem_options( +app = shinyApp(ui = app_ui, server = app_server), +golem_opts = list(...) +) +} +run_app() +test_check("MetaShARK") +library(testthat) +library(MetaShARK) +test_check("MetaShARK") +run_app() +MetaShARK::runMetashark +source('~/Softwares/MetaShARK/R/run_app.R') +library(MetaShARK) +#' Run the Shiny Application +#' +#' @export +#' @importFrom shiny shinyApp +#' @importFrom golem with_golem_options +runMetashark <- function(...) { +with_golem_options( +app = shinyApp(ui = app_ui, server = app_server), +golem_opts = list(...) +) +} +library(MetaShARK) +library(MetaShARK) +MetaShARK::run_app() +getwd() +build(,) +build +build() +document_and_reload() +runMetashark() +document_and_reload() +document_and_reload() +runMetashark() +runMetashark() +document_and_reload() +runMetashark() +document_and_reload() +runMetashark() +?golem_add_external_resources +?golem::golem_add_external_resources +golem::golem_add_external_resources +library(golem) +golem::golem_add_external_resources +getwd() +document_and_reload +document_and_reload() +runMetashark() +document_and_reload() +runMetashark() +document_and_reload() +runMetashark() +document_and_reload() +runMetashark() +?runMetashark +document_and_reload() +?runMetashark +document_and_reload() +library(golem) +document_and_reload() +runMetashark() +document_and_reload() +data() +??build +getwd() +document_and_reload +load_all() +??load_all +devtools::load_all() +devtools::load_all() +test <- readRDS("resources/backboneGuideline.RData") +getwd() +backboneGuideline <- test +usethis::use_data(backboneGuideline) +docGuideline <- readRDS("resources/docGuideline.RData"); usethis::use_data(docGuideline) +systemGuideline <- readRDS("resources/systemGuideline.RData"); usethis::use_data(systemGuideline) +rm(list = ls()) +devtools::load_all() +runMetashark() +devtools::load_all() +runMetashark() +devtools::load_all() +runMetashark() +devtools::load_all() +runMetashark() diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8e3a7fd --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +inst/doc +.Rproj.user diff --git a/DESCRIPTION b/DESCRIPTION new file mode 100644 index 0000000..c5571db --- /dev/null +++ b/DESCRIPTION @@ -0,0 +1,27 @@ +Package: MetaShARK +Title: metashark +Version: 0.0.0.9000 +Authors@R: person('Elie', 'ARNAUD', email = 'earnaud@outlook.com', role = c('cre', 'aut')) +Description: MetaShARK is a Shiny application allowing its + user to fill metadata for a given ecological + dataset of his owns. The data description relies + on Ecological Metadata Language (EML). +License: What license is it under? +Encoding: UTF-8 +LazyData: true +Imports: + shiny, + golem, + processx, + attempt, + DT, + glue, + htmltools +RoxygenNote: 6.1.1 +URL: https://github.com/earnaud/MetaShARK.git +BugReports: https://github.com/earnaud/MetaShARK.git/issues +Suggests: + testthat, + knitr, + rmarkdown +VignetteBuilder: knitr diff --git a/MetaShARK.Rproj b/MetaShARK.Rproj new file mode 100644 index 0000000..21a4da0 --- /dev/null +++ b/MetaShARK.Rproj @@ -0,0 +1,17 @@ +Version: 1.0 + +RestoreWorkspace: Default +SaveWorkspace: Default +AlwaysSaveHistory: Default + +EnableCodeIndexing: Yes +UseSpacesForTab: Yes +NumSpacesForTab: 2 +Encoding: UTF-8 + +RnwWeave: Sweave +LaTeX: pdfLaTeX + +BuildType: Package +PackageUseDevtools: Yes +PackageInstallArgs: --no-multiarch --with-keep.source diff --git a/NAMESPACE b/NAMESPACE new file mode 100644 index 0000000..0283cb0 --- /dev/null +++ b/NAMESPACE @@ -0,0 +1,13 @@ +# Generated by roxygen2: do not edit by hand + +import(shiny) +import(shinydashboard) +import(shinyjs) +importFrom(glue,glue) +importFrom(golem,with_golem_options) +importFrom(htmltools,HTML) +importFrom(htmltools,tagAppendAttributes) +importFrom(htmltools,tagList) +importFrom(htmltools,tags) +importFrom(shiny,column) +importFrom(shiny,shinyApp) diff --git a/R/app_server.R b/R/app_server.R new file mode 100644 index 0000000..11fb05e --- /dev/null +++ b/R/app_server.R @@ -0,0 +1,14 @@ +#' @import shiny +.app_server <- function(input, output,session) { + ## DEV: do things by clicking a button + observeEvent(input$check,{ + browser() + }) + + ## modules called ---- + # welcome + + # fill + # doc + # about +} diff --git a/R/app_ui.R b/R/app_ui.R new file mode 100644 index 0000000..486e4a7 --- /dev/null +++ b/R/app_ui.R @@ -0,0 +1,75 @@ +#' @import shiny shinyjs shinydashboard +.app_ui <- function() { + global <- .globalScript() + print(global$a) + + # prepare variable + menuWidth = "250px" + + # action + tagList( + # Leave this function for adding external resources + .golem_add_external_resources(), + # List the first level UI elements here + dashboardPage( + title = "MetaShARK", + dashboardHeader( + title = span(imageOutput("metashark-logo", inline = TRUE), "MetaShARK"), + titleWidth = menuWidth + ), + ## Menus ---- + dashboardSidebar( + useShinyjs(), + sidebarMenu( + menuItem("Welcome", tabName = "welcome", + icon = icon("home")), + menuItem("Fill in EML", tabName = "fill", + icon = icon("file-import")), + menuItem("EML Documentation", tabName = "documentation", + icon = icon("glasses")), + menuItem("About MetaShARK", tabName = "about", + icon = icon("beer")) + ,actionButton("check","Dev Check") + ), + width = menuWidth + ), # end sidebar + ## Content ---- + dashboardBody( + tabItems( + tabItem(tabName = "welcome", + # welcomeUI(IM.welcome[1], IM = IM.welcome)), + fluidPage(1)), + tabItem(tabName = "fill", + # fillUI(IM.fill[1], IM = IM.fill)), + fluidPage(2)), + tabItem(tabName = "documentation", + # docUI(IM.doc[1], IM = IM.doc)), + fluidPage(3)), + tabItem(tabName = "about", + # aboutUI(IM.about[1], IM = IM.about)) + fluidPage(4)) + ) + ) # end body + + ) # end dashboard + + ) # end taglist + +} + +#' @import shiny +.golem_add_external_resources <- function(){ + + addResourcePath( + 'www', system.file('app/www', package = 'MetaShARK') + ) + + tags$head( + golem::activate_js(), + golem::favicon() + # Add here all the external resources + # If you have a custom.css in the inst/app/www + # Or for example, you can add shinyalert::useShinyalert() here + #tags$link(rel="stylesheet", type="text/css", href="www/custom.css") + ) +} diff --git a/R/golem_utils_server.R b/R/golem_utils_server.R new file mode 100644 index 0000000..8a96018 --- /dev/null +++ b/R/golem_utils_server.R @@ -0,0 +1,32 @@ +# Inverted versions of in, is.null and is.na +`%not_in%` <- Negate(`%in%`) + +not_null <- Negate(is.null) + +not_na <- Negate(is.na) + +# Removes the null from a vector +drop_nulls <- function(x){ + x[!sapply(x, is.null)] +} + +# If x is null, return y, otherwise return x +"%||%" <- function(x, y){ + if (is.null(x)) { + y + } else { + x + } +} +# If x is NA, return y, otherwise return x +"%|NA|%" <- function(x, y){ + if (is.na(x)) { + y + } else { + x + } +} + +# typing reactiveValues is too long +rv <- shiny::reactiveValues +rvtl <- shiny::reactiveValuesToList \ No newline at end of file diff --git a/R/golem_utils_ui.R b/R/golem_utils_ui.R new file mode 100644 index 0000000..1d626d0 --- /dev/null +++ b/R/golem_utils_ui.R @@ -0,0 +1,213 @@ +# Turn an R list into an HTML list +# +# @param list An R list +# @param class a class for the list +# @return an HTML list +# @examples +# list_to_li(c("a","b")) +# +#' @importFrom htmltools tags tagAppendAttributes tagList +list_to_li <- function(list, class = NULL){ + if (is.null(class)){ + tagList(lapply(list, tags$li)) + } else { + res <- lapply(list, tags$li) + res <- lapply(res, function(x) tagAppendAttributes(x, class = class)) + tagList(res) + } + +} + +#' @importFrom htmltools tags tagAppendAttributes tagList +list_to_p <- function(list, class = NULL){ + if (is.null(class)){ + tagList(lapply(list, tags$p)) + } else { + res <- lapply(list, tags$p) + res <- lapply(res, function(x) tagAppendAttributes(x, class = class)) + tagList(res) + } + +} + +#' @importFrom glue glue +#' @importFrom htmltools tags tagAppendAttributes tagList +named_to_li <- function(list, class = NULL){ + if(is.null(class)){ + res <- mapply( + function(x, y){ + tags$li(HTML(glue("{y}: {x}"))) + }, + list, names(list), SIMPLIFY = FALSE) + #res <- lapply(res, HTML) + tagList(res) + } else { + res <- mapply( + function(x, y){ + tags$li(HTML(glue("{y}: {x}"))) + }, + list, names(list), SIMPLIFY = FALSE) + res <- lapply(res, function(x) tagAppendAttributes(x, class = class)) + tagList(res) + } +} + +# Remove a tag attribute +# +# @param tag the tag +# @param ... the attributes to remove +# +# @return a new tag +# @export +# +# @examples +# a <- shiny::tags$p(src = "plop", "pouet") +# tagRemoveAttributes(a, "src") +tagRemoveAttributes <- function(tag, ...) { + attrs <- as.character(list(...)) + for (i in seq_along(attrs)) { + tag$attribs[[ attrs[i] ]] <- NULL + } + tag +} + +# Hide or display a tag +# @param tag the tag +# @return a tag +# @examples +# ## Hide +# a <- shiny::tags$p(src = "plop", "pouet") +# undisplay(a) +# b <- shiny::actionButton("go_filter", "go") +# undisplay(b) + +#' @importFrom htmltools tagList +undisplay <- function(tag) { + # if not already hidden + if (!is.null(tag$attribs$style) && !grepl("display:\\s+none", tag$attribs$style)) { + tag$attribs$style <- paste("display: none;", tag$attribs$style) + } else { + tag$attribs$style <- "display: none;" + } + tag +} + +#' @importFrom htmltools tagList +display <- function(tag) { + if (!is.null(tag$attribs$style) && grepl("display:\\s+none", tag$attribs$style)) { + tag$attribs$style <- gsub("(\\s)*display:(\\s)*none(\\s)*(;)*(\\s)*", "", tag$attribs$style) + } + tag +} + +# Hide an elements by calling jquery hide on it +#' @importFrom htmltools tags +jq_hide <- function(id) { + tags$script(sprintf("$('#%s').hide()", id)) +} + +# Add a red star at the end of the text +# +# Adds a red star at the end of the text +# (for example for indicating mandatory fields). +# +# @param text the HTLM text to put before the red star +# +# @return an html element +# +# @examples +# with_red_star("Enter your name here") +# +#' @importFrom htmltools tags HTML +with_red_star <- function(text) { + htmltools::tags$span( + HTML( + paste0( + text, + htmltools::tags$span( + style = "color:red", "*" + ) + ) + ) + ) +} + + + +# Repeat tags$br +# +# @param times the number of br to return +# +# @return the number of br specified in times +# @export +# +# @examples +# rep_br(5) +# +#' @importFrom htmltools HTML +rep_br <- function(times = 1) { + HTML(rep("
", times = times)) +} + +# Create an url +# +# @param url the URL +# @param text the text to display +# +# @return an a tag +# @export +# +# @examples +# enurl("https://www.thinkr.fr", "ThinkR") +enurl <- function(url, text){ + tags$a(href = url, text) +} + + +# Columns wrappers +# +# These are convenient wrappers around +# `column(12, ...)`, `column(6, ...)`, `column(4, ...)`... +# +# @export +# @rdname columns +#' @importFrom shiny column +col_12 <- function(...){ + column(12, ...) +} + +#' @importFrom shiny column +col_10 <- function(...){ + column(10, ...) +} + +#' @importFrom shiny column +col_8 <- function(...){ + column(8, ...) +} + +#' @importFrom shiny column +col_6 <- function(...){ + column(6, ...) +} + +#' @importFrom shiny column +col_4 <- function(...){ + column(4, ...) +} + +#' @importFrom shiny column +col_3 <- function(...){ + column(3, ...) +} + +#' @importFrom shiny column +col_2 <- function(...){ + column(2, ...) +} + +#' @importFrom shiny column +col_1 <- function(...){ + column(1, ...) +} + diff --git a/R/headerScript.R b/R/headerScript.R new file mode 100644 index 0000000..6de052a --- /dev/null +++ b/R/headerScript.R @@ -0,0 +1,29 @@ +#' @import shiny +.headerScript <- function(){ + # minor functions + rm(list = ls()) + options(shiny.reactlog=TRUE) +} + +.globalScript <- function(){ + ### Global variables ---- + DP.PATH <- paste0(getwd(),"/dataPackagesOutput/emlAssemblyLine/") + THRESHOLD = list( + dp_data_files = 500000 + ) + HOME = fs::path_home() + + # Date time format strings + DATE.FORMAT <- combn(rep(c('YYYY','MM','DD'),3),3) + DATE.FORMAT <- unique(as.list(as.data.frame(DATE.FORMAT[,!apply(DATE.FORMAT, 2, function(y) any(duplicated(y)))], stringsAsFactors = FALSE))) + DATE.FORMAT <- sapply(c('-','/',':'), function(sep) + sapply(DATE.FORMAT, paste, collapse = sep) + ) + HOUR.FORMAT <- c(NA, gsub("YYYY","hh", gsub("MM","mm", gsub("DD","ss", DATE.FORMAT)))) + DATE.FORMAT <- as.vector(rbind(DATE.FORMAT, gsub('Y{4}','YY',DATE.FORMAT))) + DATE.FORMAT <- DATE.FORMAT[order(DATE.FORMAT, decreasing = TRUE)] + UNIT.LIST <- c("custom", get_unitList()$units$name) + + ## Dir creation ---- + dir.create(DP.PATH, recursive = TRUE, showWarnings = FALSE) +} \ No newline at end of file diff --git a/R/modules/about/.Rhistory b/R/modules/about/.Rhistory new file mode 100644 index 0000000..5a75679 --- /dev/null +++ b/R/modules/about/.Rhistory @@ -0,0 +1,512 @@ +textOutput(ns("out")) +) +server <- function(input, output, session) { +session$onSessionEnded(stopApp) +ns <- session$ns +roots = c(Home = HOME, getVolumes()()) +shinyDirChoose(input, "dir", roots = roots) +output$out <- renderText({ +parseDirPath(roots, input$dir) +}) +} +shinyApp(ui, server) +library(shiny) +modui <- function(id){ +ns <- NS(id) +shinyDirButton(ns("dir"),"Dir","Rid"), +textOutput(ns("out")) +} +modserver <- function(input, output, session){ +ns <- session$ns +roots = c(Sys.getenv("HOME"), getVolumes()()) +shinyDirChoose(input, "dir", roots = roots) +output$out <- renderText({ +parseDirPath(roots, input$dir) +}) +} +ui <- fluidPage( +modui("id") +) +server <- function(input, output, session) { +session$onSessionEnded(stopApp) +callModule(modserver, "id") +} +shinyApp(ui, server) +library(shiny) +modui <- function(id){ +ns <- NS(id) +shinyDirButton(ns("dir"),"Dir","Rid"), +textOutput(ns("out")) +} +modserver <- function(input, output, session){ +ns <- session$ns +roots = c(fs::path_home(), getVolumes(()) +shinyDirChoose(input, "dir", roots = roots) +output$out <- renderText({ +parseDirPath(roots, input$dir) +}) +} +ui <- fluidPage( +modui("id") +) +server <- function(input, output, session) { +session$onSessionEnded(stopApp) +callModule(modserver, "id") +} +shinyApp(ui, server) +library(shiny) +modui <- function(id){ +ns <- NS(id) +div( +shinyDirButton(ns("dir"),"Dir","Rid"), +textOutput(ns("out")) +) +} +modserver <- function(input, output, session){ +ns <- session$ns +roots = c(fs::path_home(), getVolumes()) +shinyDirChoose(input, "dir", roots = roots) +output$out <- renderText({ +parseDirPath(roots, input$dir) +}) +} +ui <- fluidPage( +modui("id") +) +server <- function(input, output, session) { +session$onSessionEnded(stopApp) +callModule(modserver, "id") +} +shinyApp(ui, server) +library(shiny) +modui <- function(id){ +ns <- NS(id) +div( +shinyDirButton(ns("dir"),"Dir","Rid"), +textOutput(ns("out")) +) +} +modserver <- function(input, output, session){ +ns <- session$ns +roots = c(home = fs::path_home(), base = getVolumes()) +shinyDirChoose(input, "dir", roots = roots) +output$out <- renderText({ +parseDirPath(roots, input$dir) +}) +} +ui <- fluidPage( +modui("id") +) +server <- function(input, output, session) { +session$onSessionEnded(stopApp) +callModule(modserver, "id") +} +shinyApp(ui, server) +runApp('Softwares/Gits/MetaShARK/shinyApp/main.R') +runApp('Softwares/Gits/MetaShARK/shinyApp/main.R') +runApp('Softwares/Gits/MetaShARK/shinyApp/main.R') +runApp('Softwares/Gits/MetaShARK/shinyApp/main.R') +runApp('Softwares/Gits/MetaShARK/shinyApp/main.R') +runApp('Softwares/Gits/MetaShARK/shinyApp/main.R') +runApp('Softwares/Gits/MetaShARK/shinyApp/main.R') +runApp('Softwares/Gits/MetaShARK/shinyApp/main.R') +runApp('Softwares/Gits/MetaShARK/shinyApp/main.R') +session_info() +rm(list = ls()) +library(shiny); runApp('Softwares/Gits/MetaShARK/shinyApp/main.R') +install.packages("golem") +remotes::install_github("Thinkr-open/golem") +vignette("golem") +library(shiny); runApp('Softwares/Gits/MetaShARK/shinyApp/main.R') +view(docGuideline) +View(docGuideline) +installed.packages() +names(installed.packages()) +rownames(installed.packages()) +install.packages("ecography") +install.packages("landscapemetrics") +runApp('Softwares/Gits/MetaShARK/shinyApp/main.R') +path +sep +names(tree) +if(is.list(path)) +path <- unlist(path) +# Processing +path <- unlist(strsplit(path,sep)) +path = path[!path == "Root"] +while(length(path) != 0){ +tree <- tree[[ path[1] ]] +path = path[-1] +} +names(tree) +names(tree) +View(systemGuideline) +runApp('Softwares/Gits/MetaShARK/shinyApp/main.R') +names(content) +runApp('Softwares/Gits/MetaShARK/shinyApp/main.R') +runApp('Softwares/Gits/MetaShARK/shinyApp/main.R') +runApp('Softwares/Gits/MetaShARK/shinyApp/main.R') +names(out) +out +content +out2 <- unlist(content[grepl("_annotation", attr(content, "names"))]) +out2 +cat(out2) +outsave <- out +out <- out2 +# preprocess 'ulink' tags that require their URL attributes (R-Attributes needed) +{ +ulinks.ind = which(grepl("ulink", attr(out, "names"))) # ulinks are always structured the same way +# browser() +out[ ulinks.ind[1:length(ulinks.ind) %% 3 == 1] ] <- paste(out[ ulinks.ind[1:length(ulinks.ind) %% 3 == 1] ], # raw text +out[ ulinks.ind[1:length(ulinks.ind) %% 3 == 2] ], # URL +sep = "[RECOGNIZED]") +} +out +out <- out[!grepl("R-Attributes", attr(out, "names"))] +out <- sapply(out, gsub, pattern = " +", replacement = " ") +out +out2 <- unlist(content[grepl("_annotation", attr(content, "names"))]) +out <- out2 +# preprocess 'ulink' tags that require their URL attributes (R-Attributes needed) +{ +ulinks.ind = which(grepl("ulink", attr(out, "names"))) # ulinks are always structured the same way +# browser() +out[ ulinks.ind[1:length(ulinks.ind) %% 3 == 1] ] <- paste(out[ ulinks.ind[1:length(ulinks.ind) %% 3 == 1] ], # raw text +out[ ulinks.ind[1:length(ulinks.ind) %% 3 == 2] ], # URL +sep = "[RECOGNIZED]") +} +names(out) +out <- out[!grepl("R-Attributes", attr(out, "names"))] +names(out) +out[5] +systemGuideline[["12_eml-physical"]][["1_schema"]][["9_complexType:PhysicalDistributionType"]][["1_annotation"]][["1_appinfo"]][["3_description"]][["1_section"]][["2_para"]][["2_ulink"]] +systemGuideline[["2_eml-attribute"]][["1_schema"]][["11_complexType:AttributeType"]][["2_choice"]][["1_sequence"]][["1_element:attributeName"]][["1_annotation"]][["1_appinfo"]][["3_description"]][[1]] +out <- unlist(content[grepl("_annotation", attr(content, "names"))]) +our[[5]] +out[[5]] +names(out) +out <- out[!grepl("R-Attributes", attr(out, "names"))] +names(out) +out[5] +out <- out[!grepl("R-Attributes", attr(out, "names"))] +out <- unlist(content[grepl("_annotation", attr(content, "names"))]) +names(out)[1:10] +out[[8-11]] +out[[8:11]] +out[8:11] +cat(out[8:11]) +cat(out[8:11], sep = "\n") +names(out)[8:11] +names(out)[8:12] +names(out)[8:13] +names(out)[8:12] +cat(out[8:12]) +cat(out[8:12], "\n") +cat(out[8:12], sep="\n") +names(out)[8:12] +runApp('Softwares/Gits/MetaShARK/shinyApp/main.R') +out +names(out) +names(out) +names(out) +out["citetitle"] +systemGuideline[["12_eml-physical"]][["1_schema"]][["9_complexType:PhysicalDistributionType"]][["1_annotation"]][["1_appinfo"]][["3_description"]][["1_section"]][["2_para"]][["2_ulink"]] +systemGuideline[["12_eml-physical"]][["1_schema"]][["9_complexType:PhysicalDistributionType"]][["1_annotation"]][["1_appinfo"]][["3_description"]][["1_section"]][["2_para"]]["2_ulink"] +out +out["citetitle"] +attr(out[grepl("[RECOGNIZED]", out)], "names") +out[grepl("[RECOGNIZED]", out)] +typeof(out) +out[which(grepl("[RECOGNIZED]", out))] +grepl("RECOGNIZED", out) +out[grepl("RECOGNIZED", out)] +attr(out[grepl("RECOGNIZED", out)], "names") +nsIndex +nsIndex$res +nsIndex["res"] +sub("https://eml.ecoinformatics.org/", "", res) +sub("https://eml.ecoinformatics.org/", "", nsIndex["res"]) +sub("https://eml.ecoinformatics.org/", "", nsIndex) +runApp('Softwares/Gits/MetaShARK/shinyApp/main.R') +runApp('Softwares/Gits/MetaShARK/shinyApp/main.R') +names(out) +names(out) +attr(out[grepl("[RECOGNIZED]", out)], "names") +out[grepl("[RECOGNIZED]", out)] +grepl("[RECOGNIZED]", out) +!grepl("[RECOGNIZED]", out) +out[!grepl("[RECOGNIZED]", out)] +attr(out[grepl("RECOGNIZED",out)], "names") +attr(out[grepl("[RECOGNIZED]",out)], "names") +attr(out[grepl("RECOGNIZED",out)], "names") <- "ulink" +names(out) +attr(out[grepl("RECOGNIZED",out)], "names") +names(out[grepl("RECOGNIZED",out)]) <- "ulink" +names(out) +names(out[grepl("RECOGNIZED",out)]) +names(out[grepl("RECOGNIZED",out)]) <- "ulink" +names(out[grepl("RECOGNIZED",out)]) +assign(names(out[grepl("RECOGNIZED",out)]),"ulink") +names(out[grepl("RECOGNIZED",out)]) +c("a","a") +c("a","a") <- "a" +a = c(1,1) +a[a == 1] +a[a == 1] <- 1 +a[a == 1] <- 2 +a +attr(out[grepl("[RECOGNIZED]", out)], "names") <- "ulink" +out +names(out) +class(out) +typeof(out) +is.vector(out) +names(out[grepl("RECOGNIZED",out)]) <- "ulink" +out +out["unlink"] +out["citetitle"] +names(out["citetitle"]) <- "ulink" +names(out) +ind <- which(out[grepl("RECOGNIZED",out)]) +ind <- which(grepl("RECOGNIZED",out)) +out[ind] +names(out[ind]) <- "ulink" +names(out) +runApp('Softwares/Gits/MetaShARK/shinyApp/main.R') +names(ou) +names(out) +ind +names(out)[ind] +names(out)[ind] <- "ulink" +names(out)[ind] +vec[targeted] +work <- unlist(strsplit(vec[targeted], +split = "\\[RECOGNIZED]")) +work[1] <- gsub("\n", "", work[1]) +work +# check for the type of ulink +ulink.type <- ifelse(grepl("^http:",work[1]), "external", "internal") +ulink.type +vec[targeted] <- switch(ulink.type, +external = HTML(as.character( +a(work[1], +href = work[2])) +), +internal = { +eml.module.ns <- sub("(.*):.*", "\\1", work[1]) +eml.module.name <- sub(".*/([a-zA-Z])", "\\1", nsIndex[eml.module.ns]) +HTML(as.character( +b( +sub(eml.module.ns, eml.module.name, work[1]) +)) +) +} +) +vec[targeted] <- switch(ulink.type, +external = HTML(as.character( +a(work[1], +href = work[2])) +), +internal = { +eml.module.ns <- sub("(.*):.*", "\\1", work[1]) +eml.module.name <- sub(".*/([a-zA-Z])", "\\1", nsIndex[eml.module.ns]) +HTML(as.character( +tags$b( +sub(eml.module.ns, eml.module.name, work[1]) +)) +) +} +) +vec[targeted] +vec[targeted] <- switch(ulink.type, +external = HTML(as.character( +a(work[1], +href = work[2])) +), +internal = { +eml.module.ns <- sub("(.*):.*", "\\1", work[1]) +eml.module.name <- sub("^.*/([a-zA-Z]).*$", "\\1", nsIndex[eml.module.ns]) +HTML(as.character( +tags$b( +sub(eml.module.ns, eml.module.name, work[1]) +)) +) +} +) +vec[targeted] +vec[targeted] <- switch(ulink.type, +external = HTML(as.character( +a(work[1], +href = work[2])) +), +internal = { +eml.module.ns <- sub("(.*):.*", "\\1", work[1]) +eml.module.name <- sub("^.*/([a-zA-Z])+.*$", "\\1", nsIndex[eml.module.ns]) +HTML(as.character( +tags$b( +sub(eml.module.ns, eml.module.name, work[1]) +)) +) +} +) +vec[targeted] +vec[targeted] <- switch(ulink.type, +external = HTML(as.character( +a(work[1], +href = work[2])) +), +internal = { +eml.module.ns <- sub("(.*):.*", "\\1", work[1]) +eml.module.name <- sub("^.*/([a-zA-Z])+-.*$", "\\1", nsIndex[eml.module.ns]) +HTML(as.character( +tags$b( +sub(eml.module.ns, eml.module.name, work[1]) +)) +) +} +) +vec[targeted] +vec[targeted] <- switch(ulink.type, +external = HTML(as.character( +a(work[1], +href = work[2])) +), +internal = { +eml.module.ns <- sub("(.*):.*", "\\1", work[1]) +eml.module.name <- sub("^.*/([a-zA-Z])+\\-.*$", "\\1", nsIndex[eml.module.ns]) +HTML(as.character( +tags$b( +sub(eml.module.ns, eml.module.name, work[1]) +)) +) +} +) +vec[targeted] +vec[targeted] <- switch(ulink.type, +external = HTML(as.character( +a(work[1], +href = work[2])) +), +internal = { +eml.module.ns <- sub("(.*):.*", "\\1", work[1]) +eml.module.name <- sub("^.*/([a-zA-Z]+)-.*$", "\\1", nsIndex[eml.module.ns]) +HTML(as.character( +tags$b( +sub(eml.module.ns, eml.module.name, work[1]) +)) +) +} +) +vec[targeted] +runApp('Softwares/Gits/MetaShARK/shinyApp/main.R') +## install.packages(c("shiny", "bibtex", "bib2df", "DT")) +library(shiny) +library(bib2df) +library(DT) +library(dplyr) +# Define UI for application that draws a histogram +ui <- fluidPage( +# Application title +titlePanel("BibTeX"), +# Sidebar with a slider input for number of bins +sidebarLayout( +sidebarPanel( +shiny::fileInput("fileUpload", "File", accept = ".bib") +), +# Show a plot of the generated distribution +mainPanel( +DT::dataTableOutput("bibTable") +) +) +) +# Define server logic required to draw a histogram +server <- function(input, output) { +get_path <- reactive({ +if (is.null(input$fileUpload)) { +path <- system.file("extdata", "biblio.bib", package = "bib2df") +} else { +path <- input$fileUpload$datapath +} +path +}) +get_bib <- reactive({ +## insert your get bib logic here +#bibtex::read.bib() +df <- bib2df(get_path()) %>% dplyr::select(BIBTEXKEY, AUTHOR, TITLE, YEAR, JOURNAL, everything()) +df$AUTHOR <- unlist(lapply(df$AUTHOR, paste, collapse = " ")) +df <- df %>% arrange(AUTHOR) +return(df) +}) +output$bibTable <- DT::renderDataTable({ +bib <- get_bib() +bib +}, caption = get_path()) +} +# Run the application +shinyApp(ui = ui, server = server) +install.packages("bib2df") +## install.packages(c("shiny", "bibtex", "bib2df", "DT")) +library(shiny) +library(bib2df) +library(DT) +library(dplyr) +# Define UI for application that draws a histogram +ui <- fluidPage( +# Application title +titlePanel("BibTeX"), +# Sidebar with a slider input for number of bins +sidebarLayout( +sidebarPanel( +shiny::fileInput("fileUpload", "File", accept = ".bib") +), +# Show a plot of the generated distribution +mainPanel( +DT::dataTableOutput("bibTable") +) +) +) +# Define server logic required to draw a histogram +server <- function(input, output) { +get_path <- reactive({ +if (is.null(input$fileUpload)) { +path <- system.file("extdata", "biblio.bib", package = "bib2df") +} else { +path <- input$fileUpload$datapath +} +path +}) +get_bib <- reactive({ +## insert your get bib logic here +#bibtex::read.bib() +df <- bib2df(get_path()) %>% dplyr::select(BIBTEXKEY, AUTHOR, TITLE, YEAR, JOURNAL, everything()) +df$AUTHOR <- unlist(lapply(df$AUTHOR, paste, collapse = " ")) +df <- df %>% arrange(AUTHOR) +return(df) +}) +output$bibTable <- DT::renderDataTable({ +bib <- get_bib() +bib +}, caption = get_path()) +} +# Run the application +shinyApp(ui = ui, server = server) +library("citr") +md_cite("Michener1997", bib_file = "Documents/Travail/Stage/Rapport/rapport.bib") +md_cite("Michener 1997", bib_file = "Documents/Travail/Stage/Rapport/rapport.bib") +md_cite("Michener97", bib_file = "Documents/Travail/Stage/Rapport/rapport.bib") +md_cite("michener1997", bib_file = "Documents/Travail/Stage/Rapport/rapport.bib") +md_cite("michener97", bib_file = "Documents/Travail/Stage/Rapport/rapport.bib") +md_cite("michener 1997", bib_file = "Documents/Travail/Stage/Rapport/rapport.bib") +md_cite("Michener1997", bib_file = "Softwares/Gits/MetaShARK/shinyApp/modules/about/about.bib") +md_cite("michener1997", bib_file = "Softwares/Gits/MetaShARK/shinyApp/modules/about/about.bib") +md_cite("devtools", bib_file = "Softwares/Gits/MetaShARK/shinyApp/modules/about/about.bib") +md_cite(Michener1997, bib_file = "Softwares/Gits/MetaShARK/shinyApp/modules/about/about.bib") +md_cite("Michener1997", bib_file = "Softwares/Gits/MetaShARK/shinyApp/modules/about/about.bib") +setwd("Softwares/Gits/MetaShARK/shinyApp/modules/about/") +md_cite("Michener1997", bib_file = "about.bib") +install.packages("RefManageR") +install.packages("RefManageR") +library(RefManageR) +ReadBib("about.bib") +bib <- ReadBib("about.bib") diff --git a/R/modules/about/about.R b/R/modules/about/about.R new file mode 100644 index 0000000..c139ecc --- /dev/null +++ b/R/modules/about/about.R @@ -0,0 +1,47 @@ +# about.R + +### UI ### +aboutUI <- function(id, IM){ + ns <- NS(id) + + fluidPage( + h1("About MetaShARK dev team"), + HTML("MetaShARK is developped within the french Museum National + d'Histoire Naturelle / UMS Patrimoine Naturel / Pole + National de Biodiversité. Its development team is currently + composed of Elie Arnaud + (lead developer) and Yvan Le Bras (team director)."), + h1("Thanks"), + HTML("MetaShARK could not be built without the help of those people:
+
    +
  • Colin Smith (EDI, US)
  • who collaborates with us since March 2019, and currently provides us the EML Assembly Line tool. +
"), + h1("References"), + h2("LTER and EML Actors"), + p("The following people and parties have worked upstream of + MetaShARK dev team to provide the fundamentals united in + the present tool."), + uiOutput(ns("actors")), + h2("Computer material"), + p("The following references will lead the user to the source + of tools and methods reused in MetaShARK."), + uiOutput(ns("informatics")), + h2("Literature"), + p("MetaShARK is based on the following papers and articles + concerning mainly ecological metadata."), + uiOutput(ns("ecology")) + ) +} + + + +### SERVER ### +about <- function(input, output, session, IM, bibliography){ + ns <- session$ns + + # use function + output$actors <- renderBibliography(bibliography$actors) + output$informatics <- renderBibliography(bibliography$informatics) + output$ecology <- renderBibliography(bibliography$ecology) + +} \ No newline at end of file diff --git a/R/modules/about/about.bib b/R/modules/about/about.bib new file mode 100644 index 0000000..5127e14 --- /dev/null +++ b/R/modules/about/about.bib @@ -0,0 +1,262 @@ + + +@misc{oracle_2017, + title={Using Top-Level Containers}, + url={https://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html}, + journal={Oracle © Help Center}, + publisher={Oracle © }, + year={2017} +} + + @misc{wikipedia2019, + author = "Wikipédia", + title = "Espace de noms --- Wikipédia{,} l'encyclopédie libre", + year = "2019", + url = "http://fr.wikipedia.org/w/index.php?title=Espace_de_noms&oldid=160940154", + note = "[En ligne; Page disponible le 15-juillet-2019]" + } + +@misc{ibm-4v, + author = {IBM}, + year = {2013}, + title = {four-vs-big-data}, + url = {http://www.ibmbigdatahub.com/infographic/four-vs-big-data} +} + +@misc{biodifairse, + title = {The BiodiFAIRse GO FAIR Implementation Network}, + url = {https://www.go-fair.org/wp-content/uploads/2019/02/Manifesto-for-IN-biodiFAIRse-1.pdf}, + year = {2019}, + month = Feb, + author = {Y. Le Bras and A.S. Archambeau and E.Chemin and J.C. Desconnet and P. Grandcolas and M. Guiraud and F. Huynh ans M. Pignal and J.D. Vigne and R. Vigne-Lebbe}, + institution = {GO FAIR} +} + +@inproceedings{akbaraly2012, + title = {Comment publier des métadonnées}, + year = {2012}, + month = oct, + author = {Michael Akbaraly}, + url = {http://www.gbif.fr/sites/default/files/documents/formation/03_-_2011-09-28_how_to_publish_dataset_metadata.pdf}, + insititution = {GBIF} +} + +@Manual{rstudio, + title = {RStudio: Integrated Development Environment for R}, + author = {{RStudio Team}}, + organization = {RStudio, Inc.}, + address = {Boston, MA}, + year = {2018}, + url = {http://www.rstudio.com/}, + } + +@manual{blankman03, + year = {2007}, + author = {David Blankman, Jeanine McGann}, + institution = {LTER Network Office Albuqerque, NM}, + title = {Ecological Metadata Language: Practical Application for Scientists} +} + +@misc{knb-eml-doc, + institution = {Knowledge Network for Biocomplexity}, + title = {Ecological Metadata Language (EML) Documentation}, + url = {https://knb.ecoinformatics.org/external//emlparser/docs/eml-2.1.1/index.html} +} + +@misc{knb-eml-spec, + institution = {Knowledge Network for Biocomplexity}, + title = {Ecological Metadata Language (EML) Specification}, + url = {https://knb.ecoinformatics.org/software/dist/} +} + +@TechReport{Maloney:12:WXS, + author = "Murray Maloney and Henry Thompson and Noah Mendelsohn and David Beech and Sandy Gao and Michael Sperberg-McQueen", + title = "{W3C} XML Schema Definition Language ({XSD}) {1.1} Part 1: Structures", + month = apr, + note = "http://www.w3.org/TR/2012/REC-xmlschema11-1-20120405/", + year = "2012", + bibsource = "https://w2.syronex.com/jmr/w3c-biblio", + type = "{W3C} Recommendation", + institution = "W3C", +} + +@misc{za-cnrs, + title={Les Zones Ateliers}, + url={http://www.za-inee.org/ateliers}, + publisher={CNRS} +} + +@Manual{shiny, + title = {shiny: Web Application Framework for R}, + author = {Winston Chang and Joe Cheng and JJ Allaire and Yihui Xie and Jonathan McPherson}, + year = {2019}, + note = {R package version 1.3.2}, + url = {https://CRAN.R-project.org/package=shiny}, + } + +@misc{anderson04, + author = {T. Anderson}, + title = {Introducing XML}, + year = {2004}, + url = {http://www.itwriting.com/xmlintro.php} +} + +@misc{w3c98, + author = {W3C}, + title = {W3C XML Specification DTD (“XMLspec”)}, + year = {1998}, + url = {http://www.w3.org/XML/1998/06/xmlspec-report-19980910.htm} +} + +@misc{w3c00, + author = {W3C}, + title = {XML Schema}, + year = {2000}, + url = {https://www.w3.org/XML/Schemav} +} + +@misc{tutovalidate, + title = {XSD validation}, + journal = {Tutorials Point}, + url = {https://www.tutorialspoint.com/xsd/xsd_validation} +} + +@misc{javavalidate, + title = {Package javax.xml.validation}, + journal = {javax.xml.validation (Java Platform SE 7 )}, + url = {https://docs.oracle.com/javase/7/docs/api/javax/xml/validation/package-summary.html}, + year = {2018}, + month = Oct +} + +@misc{rvalidate, + title = {Validate an XML document relative to an XML schema}, + author = {Duncan T. Lang, CRAN team}, + journal = {MIT}, + url = {http://web.mit.edu/~r/current/arch/i386_linux26/lib/R/library/XML/html/xmlSchemaValidate.html}, + year = {2019}, + month = Jun +} + +@misc{git:metashark, + title = {earnaud/MetaShARK}, + doi = {10.5281/zenodo.3355324}, + url = {https://github.com/earnaud/MetaShARK}, + journal = {Github}, + author = {Elie Arnaud, Yvan Le Bras}, + year = {2019}, + month = Apr +} + +@article{shiny-module, + title = {The Shiny Module Design Pattern}, + author = {William Doane}, + journal = {R-bloggers}, + year = {2019}, + month = Jan, + url = {https://www.r-bloggers.com/the-shiny-module-design-pattern/} +} + +@Manual{shinydashboard, + title = {shinydashboard: Create Dashboards with 'Shiny'}, + author = {Winston Chang and Barbara {Borges Ribeiro}}, + year = {2018}, + note = {R package version 0.7.1}, + url = {https://CRAN.R-project.org/package=shinydashboard}, + } + +@Manual{shinytree, + title = {shinyTree: jsTree Bindings for Shiny}, + author = {{Trestle Technology, LLC} and Jeff Allen}, + year = {2019}, + note = {R package version 0.2.7}, + url = {https://CRAN.R-project.org/package=shinyTree}, + } + +@Manual{shinyjs, + title = {shinyjs: Easily Improve the User Experience of Your Shiny Apps in Seconds}, + author = {Dean Attali}, + year = {2018}, + note = {R package version 1.0}, + url = {https://CRAN.R-project.org/package=shinyjs}, + } + +@Manual{tcltk2, + title = {SciViews-R: A GUI API for R}, + author = {Philippe Grosjean}, + organization = {UMONS}, + address = {MONS, Belgium}, + year = {2019}, + url = {http://www.sciviews.org/SciViews-R}, + } + +@Manual{EML, + title = {EML: Read and Write Ecological Metadata Language Files}, + author = {Carl Boettiger and Matthew B. Jones}, + year = {2019}, + note = {R package version 2.0.0}, + url = {https://CRAN.R-project.org/package=EML}, + } + +@Manual{EMLassemblyline, + title = {EMLassemblyline: A workflow for creating EML}, + author = {Colin Smith}, + year = {2019}, + note = {R package version 2.6.1}, + url = {https://github.com/EDIorg/EMLassemblyline}, + } + +@Manual{devtools, + title = {devtools: Tools to Make Developing R Packages Easier}, + author = {Hadley Wickham and Jim Hester and Winston Chang}, + year = {2019}, + note = {R package version 2.1.0}, + url = {https://CRAN.R-project.org/package=devtools}, + } + +@Manual{datatree, + title = {data.tree: General Purpose Hierarchical Data Structure}, + author = {Christoph Glur}, + year = {2018}, + note = {R package version 0.7.8}, + url = {https://CRAN.R-project.org/package=data.tree}, + } + +@Manual{XML, + title = {XML: Tools for Parsing and Generating XML Within R and S-Plus}, + author = {Duncan Temple Lang and the CRAN Team}, + year = {2019}, + note = {R package version 3.98-1.20}, + url = {https://CRAN.R-project.org/package=XML}, + } + +@Manual{xml2, + title = {xml2: Parse XML}, + author = {Hadley Wickham and James Hester and Jeroen Ooms}, + year = {2018}, + note = {R package version 1.2.0}, + url = {https://CRAN.R-project.org/package=xml2}, + } + +@misc{shiny-layout, + title={Application layout guide}, + url={https://shiny.rstudio.com/articles/layout-guide.html}, + journal={Shiny}, + publisher={RStudio} +} + +@misc{docbook, + title = {DocBook V5.2b05 XML DTD}, + author = {Larry Rowland, Richard Hamilton, Nancy Harrison, Jirka Kosek, Robert Stayton, Norman Walsh, Patricia Gee, Scott Hudson}, + url = {https://docbook.org/xml/5.2b05/}, + publisher = {OASIS} +} + +@article{berry08, + title = {De Pong à World of Warcraft : construction et circulation de la culture (vidéo) ludique}, + author = {Vincent Berry}, + year = {2008}, + journal = {Autrement. Collection mutations}, + volume = {245}, + page = {22--42} +} diff --git a/R/modules/about/about_functions.R b/R/modules/about/about_functions.R new file mode 100644 index 0000000..3daa27a --- /dev/null +++ b/R/modules/about/about_functions.R @@ -0,0 +1,47 @@ +# about_functions.R + +renderBibliography <- function(bib){ + NoCite(bib, "*") + renderUI( + withProgress(message = "Loading bibtex ...", value = 0, { + HTML( + paste( + capture.output( + invisible( + sapply(bib, + function(b){ + incProgress(1/length(bib)) + PrintBibliography(b, + .opts = list(style = "html") + ) + } + ) + ) + ), + collapse = "") + ) + }) + ) +} + +# Dev: use it to get lbiraries and version +libsToTerminal <- function(){ + ins <- installed.packages()[loaded_packages()$package,1:3] + ins <- ins[ins[,"LibPath"] != ins["base","LibPath"],c(1,3)] + cat(paste0(ins[,"Package"], " v", ins[,"Version"],"\n")) +} + +# data.table v1.12.2 +# RefManageR v1.2.12 +# devtools v2.1.0 +# usethis v1.5.1 +# EMLassemblyline v2.6.1 +# EML v2.0.0 +# tippy v0.1.0 +# tcltk2 v1.2-11 +# shinyjs v1.0 +# shinyFiles v0.7.3 +# shinydashboard v0.7.1 +# shinyTree v0.2.7 +# shiny v1.3.2 +# + R-base v3.6.0 \ No newline at end of file diff --git a/R/modules/about/actors.bib b/R/modules/about/actors.bib new file mode 100644 index 0000000..2be4f41 --- /dev/null +++ b/R/modules/about/actors.bib @@ -0,0 +1,33 @@ +@misc{gofair, + author = {GOFAIR}, + url = {https://www.go-fair.org/} +} + +@booklet{gbif2001, + doi = {10.15468/doc.ajz7-qt28}, + url = {https://www.gbif.org/document/80661}, + author = {{Global Biodiversity Information Facility}}, + title = {GBIF Memorandum of Understanding}, + publisher = {Global Biodiversity Information Facility}, + year = {2010} +} + +@misc{arctic, + institution = {ACADIS}, + title = {Arctic Data Center}, + url = {https://arcticdata.io/} +} + +@misc{knb-data, + institution = {NSF}, + title = {Knowledge Network for Biocomplexity: Data}, + url = {https://knb.ecoinformatics.org/data} +} + +@misc{edi, + title = {About us}, + url = {https://environmentaldatainitiative.org/edi/}, + journal = {Environmental Data Initiative}, + year = {2017}, + publisher = {EDI} +} diff --git a/R/modules/about/ecology.bib b/R/modules/about/ecology.bib new file mode 100644 index 0000000..d16b594 --- /dev/null +++ b/R/modules/about/ecology.bib @@ -0,0 +1,86 @@ +@article{Michener1997, + doi = {10.1890/1051-0761(1997)007[0330:nmftes]2.0.co;2}, + url = {https://doi.org/10.1890/1051-0761(1997)007[0330:nmftes]2.0.co;2}, + year = {1997}, + month = feb, + publisher = {Wiley}, + volume = {7}, + number = {1}, + pages = {330--342}, + author = {William K. Michener and James W. Brunt and John J. Helly and Thomas B. Kirchner and Susan G. Stafford}, + title = {{NONGEOSPATIAL} {METADATA} {FOR} {THE} {ECOLOGICAL} {SCIENCES}}, + journal = {Ecological Applications} +} + +@article{Vanderbilt2010, + doi = {10.1016/j.ecoinf.2010.02.002}, + url = {https://doi.org/10.1016/j.ecoinf.2010.02.002}, + year = {2010}, + month = may, + publisher = {Elsevier {BV}}, + volume = {5}, + number = {3}, + pages = {187--193}, + author = {Kristin L. Vanderbilt and David Blankman and Xuebing Guo and Honglin He and Chau-Chin Lin and Sheng-Shan Lu and Akiko Ogawa and {\'{E}}amonn {\'{O}} Tuama and Herbert Schentz and Wen Su}, + title = {A multilingual metadata catalog for the {ILTER}: Issues and approaches}, + journal = {Ecological Informatics} +} + +@article{Kissling2017, + doi = {10.1111/brv.12359}, + url = {https://doi.org/10.1111/brv.12359}, + year = {2017}, + month = aug, + publisher = {Wiley}, + volume = {93}, + number = {1}, + pages = {600--625}, + author = {W. Daniel Kissling and Jorge A. Ahumada and Anne Bowser and Miguel Fernandez and N{\'{e}}stor Fern{\'{a}}ndez and Enrique Alonso Garc{\'{\i}}a and Robert P. Guralnick and Nick J. B. Isaac and Steve Kelling and Wouter Los and Louise McRae and Jean-Baptiste Mihoub and Matthias Obst and Monica Santamaria and Andrew K. Skidmore and Kristen J. Williams and Donat Agosti and Daniel Amariles and Christos Arvanitidis and Lucy Bastin and Francesca De Leo and Willi Egloff and Jane Elith and Donald Hobern and David Martin and Henrique M. Pereira and Graziano Pesole and Johannes Peterseil and Hannu Saarenmaa and Dmitry Schigel and Dirk S. Schmeller and Nicola Segata and Eren Turak and Paul F. Uhlir and Brian Wee and Alex R. Hardisty}, + title = {Building essential biodiversity variables ({EBVs}) of species distribution and abundance at a global scale}, + journal = {Biological Reviews} +} + +@booklet{EMLBestPracticesV3, + year = {2017}, + author = {EDI}, + editor = {Environmental Data Initiative}, + title = {Best Practices for Dataset Metadata in Ecological Metadata Language (EML Best Practices V3)}, + url = {https://environmentaldatainitiative.files.wordpress.com/2017/11/emlbestpractices-v3.pdf} +} + +@article{EML_2019, + title={Ecological Metadata Language version 2.2.0}, + url={https://eml.ecoinformatics.org}, + DOI={10.5063/f11834t2}, + publisher={KNB Data Repository}, + journal = {Github}, + journaltitle = {Github}, + author={Jones, Matthew and O’Brien, Margaret and Mecum, Bryce and Boettiger, Carl and Schildhauer, Mark and Maier, Mitchell and Whiteaker, Timothy and Earl, Stevan and Chong, Steven}, + year={2019} +} + +@misc{ecoscope, + title = {Ecoscope}, + institution = {fondation biodiversité}, + url = {http://ecoscope.fondationbiodiversite.fr/fr/} +} + +@misc{git:edi-emlal, + title = {EDIorg/EMLassemblyline}, + url = {https://github.com/EDIorg/EMLassemblyline}, + journal = {Github}, + publisher = {EDI}, + author = {Smith, Colin and Gries, Corinna and Sevilla, Mark and O'Brien, Margaret and Costa, Duane and Vanderbilt, Kristin and Grossman Clarke, Susanne}, + year = {2017}, + month = Dec +} + +@inproceedings{Porter1997, + author = {Porter J.H., Henshaw D.L., Stafford S.G.}, + year = {1997}, + title = {Research Metadata in Long-TermEcological Research (LTER)}, + booktitle = {Second IEEE Metadata Conference}, + organization = {IEEE Computer Society Mass Storage Systems}, + address = {NOAA Auditorium, NOAA ComplexSilver Spring Metro Center1301 East-West HighwaySilver Spring, Maryland}, + month = sep +} diff --git a/R/modules/about/informatics.bib b/R/modules/about/informatics.bib new file mode 100644 index 0000000..e348dbb --- /dev/null +++ b/R/modules/about/informatics.bib @@ -0,0 +1,55 @@ +@article{Wilkinson2016, + doi = {10.1038/sdata.2016.18}, + url = {https://doi.org/10.1038/sdata.2016.18}, + year = {2016}, + month = mar, + publisher = {Springer Science and Business Media {LLC}}, + volume = {3}, + number = {1}, + author = {Mark D. Wilkinson and Michel Dumontier and IJsbrand Jan Aalbersberg and Gabrielle Appleton and Myles Axton and Arie Baak and Niklas Blomberg and Jan-Willem Boiten and Luiz Bonino da Silva Santos and Philip E. Bourne and Jildau Bouwman and Anthony J. Brookes and Tim Clark and Merc{\`{e}} Crosas and Ingrid Dillo and Olivier Dumon and Scott Edmunds and Chris T. Evelo and Richard Finkers and Alejandra Gonzalez-Beltran and Alasdair J.G. Gray and Paul Groth and Carole Goble and Jeffrey S. Grethe and Jaap Heringa and Peter A.C 't Hoen and Rob Hooft and Tobias Kuhn and Ruben Kok and Joost Kok and Scott J. Lusher and Maryann E. Martone and Albert Mons and Abel L. Packer and Bengt Persson and Philippe Rocca-Serra and Marco Roos and Rene van Schaik and Susanna-Assunta Sansone and Erik Schultes and Thierry Sengstag and Ted Slater and George Strawn and Morris A. Swertz and Mark Thompson and Johan van der Lei and Erik van Mulligen and Jan Velterop and Andra Waagmeester and Peter Wittenburg and Katherine Wolstencroft and Jun Zhao and Barend Mons}, + title = {The {FAIR} Guiding Principles for scientific data management and stewardship}, + journal = {Scientific Data} +} + +@article{Ochoa2009, + doi = {10.1007/s00799-009-0054-4}, + url = {https://doi.org/10.1007/s00799-009-0054-4}, + year = {2009}, + month = aug, + publisher = {Springer Science and Business Media {LLC}}, + volume = {10}, + number = {2-3}, + pages = {67--91}, + author = {Xavier Ochoa and Erik Duval}, + title = {Automatic evaluation of metadata quality in digital repositories}, + journal = {International Journal on Digital Libraries} +} + +@article{Jones2001, + doi = {10.1109/4236.957896}, + url = {https://doi.org/10.1109/4236.957896}, + year = {2001}, + publisher = {Institute of Electrical and Electronics Engineers ({IEEE})}, + volume = {5}, + number = {5}, + pages = {59--68}, + author = {M.B. Jones and C. Berkley and J. Bojilova and M. Schildhauer}, + title = {Managing scientific metadata}, + journal = {{IEEE} Internet Computing} +} + +@inproceedings{Berkley, + author={C. {Berkley} and M. {Jones} and J. {Bojilova} and D. {Higgins}}, + booktitle={Proceedings Thirteenth International Conference on Scientific and Statistical Database Management. SSDBM 2001}, + title={Metacat: a schema-independent XML database system}, + year={2001}, + volume={}, + number={}, + pages={171-179}, + keywords={ecology;relational databases;hypermedia markup languages;data handling;meta data;scientific information systems;biology computing;multimedia databases;Metacat;schema-independent XML database system;ecological sciences;scientific data management;research protocols;data-handling techniques;heterogeneous data;Knowledge Network for Biocomplexity;structured metadata;Extensible Markup Language;data storage system;relational DBMS back-end;XML document storage;XML;Database systems;Relational databases;Data storage systems;Protocols;Spatial databases;Data handling;Microorganisms;Network synthesis;Environmental factors}, + doi={10.1109/SSDM.2001.938549}, + ISSN={}, + month={July} +} + + diff --git a/R/modules/documentation/documentation.R b/R/modules/documentation/documentation.R new file mode 100644 index 0000000..d865f50 --- /dev/null +++ b/R/modules/documentation/documentation.R @@ -0,0 +1,101 @@ +### documentation.R + +### UI ### +docUI <- function(id, IM){ + ns <- NS(id) + + # var initialization + moduleNames <- sub("^[0-9]+_(.*)$","\\1",names(docGuideline)) + # avoid 404 + moduleNames <- moduleNames[moduleNames != "eml-unit Type Definitions"] + + # UI output + tagList( + fluidRow( + box(width = 12, + title = "Check original documentation", + "This documentation is brought to you from XSD files downloaded from + this git. You can visit the original documentation by + chosing a module name and clicking the 'GO' button below:", + column(6, + selectInput(ns("select-module"), NULL, + moduleNames, selected = moduleNames[25], + multiple =FALSE) + ), + column(6, + actionButton(ns("visit-module"), "Go !", + icon = icon("external-link-alt")) + ) + ) + ), + fluidRow( + # search sidebar + column(5, + box(shinyTree(outputId = ns(IM[2]), # render tree + search = TRUE, + theme = "proton"), + width = 12 + ) + , style = sidebarStyle + ), + # display main panel + column(7, + div(box(uiOutput( ns(IM[4]) ), # XPath + uiOutput( ns(IM[3]) ), # Documentation + width = 12 + ) + , style = mainpanelStyle + ) + ) + ) + ) +} + +### SERVER ### +documentation <- function(input, output, session, IM, tree = docGuideline, ns.index = nsIndex){ + + observeEvent(input$`visit-module`, { + url <- paste0("https://nceas.github.io/eml/schema/", + input$`select-module`, + "_xsd.html") + url <- sub(" +","",url) + browseURL(url) + }) + + # render tree + output[[IM[2]]] <- renderTree(tree) + + # output selected node + output[[IM[3]]] <- renderText({ + jstree <- input[[IM[2]]] + if (is.null(jstree)){ + "None" + } else{ + node <- get_selected(tree = jstree) + if(length(node) == 0) + return("(Select a node first)") + docPath <- gsub("^/","", + paste( + paste(attr(node[[1]], "ancestry"), collapse="/"), + unlist(node), + sep="/") + ) + output[[IM[4]]] <- renderText(as.character(h3(docPath))) + + # fetch the systemGuideLine path in the userGuideLine list + systemPath <- followPath(tree, docPath) + + if(!is.character(systemPath)) + systemPath <- commonPath(systemPath,unlist(node)) + # return(userPath) + + # fetch the eml-xsd content in the systemGuideLine list + systemContent <- followPath(systemGuideline, systemPath) + out <- extractContent(systemContent, nsIndex = ns.index) + return(out) + } + }) + +} + + diff --git a/R/modules/documentation/documentation_functions.R b/R/modules/documentation/documentation_functions.R new file mode 100644 index 0000000..71c4237 --- /dev/null +++ b/R/modules/documentation/documentation_functions.R @@ -0,0 +1,253 @@ +# documentation_functions.R + +# extracts the targetted EML content from a list +extractContent <- function(content, nsIndex){ + # modules annotation is stored in 'eml-module/schema' + if(any(grepl("schema", attr(content,"names")))) + content <- content[[which(grepl("schema",attr(content,"names")))]] + + # Extract metadata content from Attributes + att <- content$`R-Attributes` + att.out <- c() + if(any(grepl("TYPE", names(att)))){ + att.type <- nsIndex[sapply(names(nsIndex), grepl, att[["TYPE"]])] + if(length(att.type) == 0) att.type <- "this module" + att.out <- c( att.out, + paste(as.character(tags$b("Cf.")), + gsub("^.*:","",att["TYPE"]), + "in", + gsub(".*org/([a-zA-Z ]+)-2.1.1$","eml-\\1",att.type)) ) + } + if(any(grepl("REF", names(att)))){ + att.ref <- paste0(tags$b("See also: "), + content[["R-Attributes"]][["REF"]], + "\n") + att.out <- c( att.out, + att.ref) + } + + if(length(att) == 0) browser() + att <- att.out + + # Documentation content + if(any(grepl("_annotation", attr(content,"names")))){ + + ## content + + # Extract metadata content from main body + out <- unlist(content[grepl("_annotation", attr(content, "names"))]) + # preprocess 'ulink' tags that require their URL attributes (R-Attributes needed) + { + ulinks.ind = which(grepl("ulink", attr(out, "names"))) # ulinks are always structured the same way + # browser() + out[ ulinks.ind[1:length(ulinks.ind) %% 3 == 1] ] <- paste(out[ ulinks.ind[1:length(ulinks.ind) %% 3 == 1] ], # raw text + out[ ulinks.ind[1:length(ulinks.ind) %% 3 == 2] ], # URL + sep = "[RECOGNIZED]") + } + + out <- out[!grepl("R-Attributes", attr(out, "names"))] + out <- sapply(out, gsub, pattern = " +", replacement = " ") + + ## titles + attr(out, "names") <- gsub("\\.[0-9]+_$","", attr(out, "names")) + attr(out, "names") <- gsub("^.*_","", attr(out, "names")) + attr(out, "names") <- gsub("([a-z])([A-Z])","\\1 \\2", attr(out, "names")) + ind <- which(grepl("RECOGNIZED",out)) + names(out)[ind] <- "ulink" + + # browser() + + #- reorganizing + out <- nt.titles(out, list(remove = "emphasis", + remove = "citetitle", + replace = "module Name", + moveback = "documentation", + tocode = "literal Layout", + use = "title", + use = "para", + addurl = "ulink")) + + out <- sapply(seq_along(out), + function(o){ + if(attr(out,"names")[o] %in% c("recommended Usage", + "tooltip", + "stand Alone")) + return(paste(tags$b(attr(out, "names")[o]), + ":", out[o], + "\n", + sep = " ")) + else + return(paste(h2(attr(out, "names")[o]), + out[o], + sep = "\n")) + }) + out <- paste(c(att, out), collapse = "
") + return(paste0(out, sep = "
")) + } + else if(length(att) == 0) { + return("No content found") + } + else { + return(paste(att, collapse = "
")) + } +} + +# Apply @action on elements from @vec named after @targets +nt.titles <- function(vec, action_target){ + sapply(action_target, + function(target){ + + # parse args + action = attr(action_target, "names")[match(target, action_target)] + + # validity check + possibleActions <- c("remove","replace","moveback", + "tocode", "use", "addurl") + if(!any(sapply(possibleActions, grepl, action))) + stop("Action not recognized, must be one of those:\n", + paste(possibleActions,sep=" ")) + + #--- process - The commands are executed one by one as the rest of + # the list is processed automatically + targeted <- which(attr(vec,"names") %in% target) + if(length(targeted) > 0){ + + # remove unwanted + if(action == "remove"){ + for(i in targeted){ + j = i-1 + while(j %in% targeted) j <- j-1 + vec[j] <- paste(vec[j], tags$cite(vec[i]), vec[i+1], sep = " ") + } + vec <- vec[-c(targeted, targeted+1)] + } + + # replace names + if(action == "replace"){ + attr(vec, "names")[targeted] <- vec[targeted] + vec[targeted] <- "" + } + + # move back the section + if(action == "moveback"){ + vec <- c(vec[-targeted], vec[targeted]) + } + + # change literalLayout to code tag + if(action == "tocode"){ + attr(vec,"names")[targeted] <- "" + for(t in targeted) + vec[t] <- as.character(pre(code(vec[t]))) + } + + # use the section name as HTML tag + if(action == "use"){ + attr(vec,"names")[targeted] <- "" + + if(target == "title") + vec[targeted] <- HTML(as.character( + gsub("\n","",tags$h4(vec[targeted])) + )) + + if(target == "p") + vec[targeted] <- sapply(vec[targeted], p) + } + + # add an external link through ulink + if(action == "addurl"){ + # browser() + work <- unlist(strsplit(vec[targeted], + split = "\\[RECOGNIZED]")) + work[1] <- gsub("\n", "", work[1]) + + # check for the type of ulink + ulink.type <- ifelse(grepl("^http:",work[1]), "external", "internal") + vec[targeted] <- switch(ulink.type, + external = HTML(as.character( + a(work[1], + href = work[2])) + ), + internal = { + eml.module.ns <- sub("(.*):.*", "\\1", work[1]) + eml.module.name <- sub("^.*/([a-zA-Z]+)-.*$", "\\1", nsIndex[eml.module.ns]) + HTML(as.character( + tags$b( + sub(eml.module.ns, eml.module.name, work[1]) + )) + ) + } + ) + # empirical: ulink never occurs as first element, neither as last + vec[targeted-1] <- paste(vec[(targeted-1):(targeted+1)], + collapse = " ") + vec <- vec[-c(targeted, targeted+1)] + } + } + #--- end of process + + # commit changes to vec + vec <<- vec + }) + # end of nt.titles + return(vec) + +} + +# Extract the path made common from every leaf path +# Used to get a non-leaf node's path +commonPath <- function(li,name){ + paths <- unlist(li) + paths <- sapply(paths, strsplit, split = "/") + minLength <- min(sapply(paths, length)) + minInd <- min(sapply(paths, function(path){ + length(which(path[1:minLength] == paths[[1]][1:minLength])) + })) + common <- paste(paths[[1]][1:minInd], collapse = "/") + common <- gsub(paste0("(", + gsub("(.*_| )", + "", + name), + ").*"), + "\\1", + common) + return(common) +} + +# --- List handling + +# Takes a hierarchy list (tree), a path written in a vector pasted +# with sep = sep, and returns the targetted node +# @param tree: explored hierarchy list thanks to @path +# @param path: vector of characters matching some of @tree names and +# separated with @sep +# @param sep: separators between @path elements (aka @tree names) +followPath <- function(tree, path, sep = "/"){ + # Validity checks + if(is.null(tree) || is.null(path)) + stop("'tree' and 'path' args must be specified") + if(length(path) > 1) + stop("path shall be a vector of characters") + if(sep == "") + stop("path can't be parsed with @sep") + + if(is.list(path)) + path <- unlist(path) + + # Processing + path <- unlist(strsplit(path,sep)) + path = path[!path == "Root"] + + while(length(path) != 0){ + tree <- tree[[ path[1] ]] + path = path[-1] + } + + return(tree) +} + + +# check if one of the children of the input list is a list +has_child <- function(li){ + if(!is.list(li)) return(FALSE) + return(any(sapply(li, is.list))) +} diff --git a/R/modules/documentation/documentation_style.R b/R/modules/documentation/documentation_style.R new file mode 100644 index 0000000..56dfcf6 --- /dev/null +++ b/R/modules/documentation/documentation_style.R @@ -0,0 +1,3 @@ +# documentation_style.R +# Style sheet for NavTree module + diff --git a/R/modules/fill/EMLAL/EMLAL.R b/R/modules/fill/EMLAL/EMLAL.R new file mode 100644 index 0000000..df5f4ff --- /dev/null +++ b/R/modules/fill/EMLAL/EMLAL.R @@ -0,0 +1,93 @@ +# EMLAL.R + +# Derived Id Modules from IM.EMLAL by pasting the step number (https://ediorg.github.io/EMLassemblyline/articles/overview.html) + +### UI ### +EMLALUI <- function(id, IM){ + ns <- NS(id) + + steps = list(`Organize data package` = 1, + `Create metadata templates` = 2, + `Edit metadata templates` = 3, + `Make EML` = 4) + step = steps[[1]] + + fluidPage( + style="padding-top:2.5%;", + box(width = 4, + title = "Authorship", + HTML( + "

The `EML Assembly Line` package used in this module + and its children is the intellectual property of the + Environment Data Initiative (EDI). You can find further + details on their + git repository. +

" + ), + div( + imageOutput("edi-logo", # from main.R + width = "100px", height = "100px" + ), + style = "display: block; + margin-left: auto; + margin-right: auto; + width: 100px;" + ) + ), # end authorship + box(width = 8, + title = "How to use", + HTML( + "

EMLassemblyline is a metadata builder for scientists + and data managers who need to easily create high quality + EML metadata for data publication. It emphasizes + auto-extraction of metadata, appends value added content, + and accepts user supplied inputs through template files + thereby minimizing user effort while maximizing the potential + of future data discovery and reuse. EMLassemblyline requires + no familiarity with EML, is great for managing 10-100s of + data packages, accepts all data formats, and supports complex + and fully reproducible science workflows. Furthermore, it + incorporates EML best practices, + is based on a simple file organization scheme, and is not tied to a specific data repository.

+ (preface by Colin Smith, EDI)" + ) + ), # end how-to-use + box( + title = "EML Assembly Line", + width = 12, + uiOutput(ns("currentUI")) + ) # end variable UI + ) # end fluidPage + +} + +### SERVER ### +EMLAL <- function(input, output, session, IM, globalRV){ + ns <- session$ns + + # variable initialization + steps = paste0(c("select","create","template","customUnits", + "catvars", "edit","make","publish"), "-tab") + + # Output + output$currentUI <- renderUI({ + switch(globalRV$navigate, + `1` = selectDPUI(id = IM.EMLAL[2+globalRV$navigate], + IM = IM.EMLAL, + title = steps[globalRV$navigate]), + `2` = createDPUI(id = IM.EMLAL[2+globalRV$navigate], + IM = IM.EMLAL, + title = steps[globalRV$navigate]), + `3` = templateDPUI(id = IM.EMLAL[2+globalRV$navigate], + IM = IM.EMLAL, + title = steps[globalRV$navigate]), + `4` = customUnitsUI(id = IM.EMLAL[2+globalRV$navigate], + IM = IM.EMLAL, + title = steps[globalRV$navigate]), + `5` = catvarsUI(id = IM.EMLAL[2+globalRV$navigate], + IM = IM.EMLAL, + title = steps[globalRV$navigate]) + ) + }) + +} \ No newline at end of file diff --git a/R/modules/fill/EMLAL/EMLAL_catvars.R b/R/modules/fill/EMLAL/EMLAL_catvars.R new file mode 100644 index 0000000..482768d --- /dev/null +++ b/R/modules/fill/EMLAL/EMLAL_catvars.R @@ -0,0 +1,14 @@ +# EMLAL_templateDP.R + +## 3. Create DP template +catvarsUI <- function(id, title, IM){ + ns <- NS(id) + + return( + h1("Categorical Variables") + ) +} + +catvars <- function(input, output, session, IM, savevar, globalRV){ + +} \ No newline at end of file diff --git a/R/modules/fill/EMLAL/EMLAL_createDP.R b/R/modules/fill/EMLAL/EMLAL_createDP.R new file mode 100644 index 0000000..3e007cf --- /dev/null +++ b/R/modules/fill/EMLAL/EMLAL_createDP.R @@ -0,0 +1,205 @@ +# EMLAL_create.R + +## 2. CREATE DATA PACKAGE +createDPUI <- function(id, title, IM){ + ns <- NS(id) + + return( + fluidPage( + column(10, + h4("Data files"), + HTML("When selecting your files, you can't select + folders. You can delete file(s) from your + selection by ticking their box and clicking + the 'Remove' button.
"), + div( + shinyFilesButton(ns("add_data_files"), + "Load files", + "Select data file(s) from your dataset", + multiple = TRUE, + icon = icon("plus-circle")), + style = "display: inline-block; vertical-align: top;" + ), + actionButton(ns("remove_data_files"),"Remove", + icon = icon("minus-circle"), + style = redButtonStyle), + uiOutput(ns("data_files")) + ), # end of column 1 + column(2, + h4("Navigation"), + quitButton(id, style = rightButtonStyle), + saveButton(id, style = rightButtonStyle), + nextTabButton(id, style = rightButtonStyle), + textOutput(ns("warning_data_size")), + textOutput(ns("overwrite")), + style = "text-align: center; padding: 0;" + ) # end of column 2 + ) # end fluidPage + ) # end return +} + +createDP <- function(input, output, session, IM, savevar, globalRV){ + # ns <- session$ns + + # Variable initialization ---- + rv <- reactiveValues( + # to save + data_files = data.frame() + # local only + ) + volumes <- c(Home = HOME, getVolumes()()) + updateFileListTrigger <- makeReactiveTrigger() + + # On arrival on screen + observeEvent(globalRV$previous, { + # dev: might evolve in `switch` if needed furtherly + rv$data_files <- if(globalRV$previous == "create") # from create button in selectDP + data.frame() + else + savevar$emlal$createDP$dp_data_files + + updateFileListTrigger$trigger() + }) + + # Navigation buttons ---- + callModule(onQuit, IM.EMLAL[4], + # additional arguments + globalRV, savevar, + savevar$emlal$selectDP$dp_path, + savevar$emlal$selectDP$dp_name) + callModule(onSave, IM.EMLAL[4], + # additional arguments + savevar, + savevar$emlal$selectDP$dp_path, + savevar$emlal$selectDP$dp_name) + callModule(nextTab, IM.EMLAL[4], + globalRV, "create") + + # Data file upload ---- + # Add data files + shinyFileChoose(input, "add_data_files", + roots = volumes, + # defaultRoot = HOME, + session = session) + + observeEvent(input$add_data_files,{ + # validity checks + req(input$add_data_files) + + # actions + loadedFiles <- as.data.frame( + parseFilePaths(volumes, input$add_data_files) + ) + + if(identical(rv$data_files, data.frame())) + rv$data_files <- loadedFiles + else{ + for(filename in loadedFiles$name){ + if(!grepl("\\.",filename)) + message(filename," is a folder.") + else + rv$data_files <- unique(rbind(rv$data_files, + loadedFiles[loadedFiles$name == filename,]) + ) + } + } + + # variable modifications + savevar$emlal$createDP$dp_data_files <- rv$data_files + }) + + # Remove data files + observeEvent(input$remove_data_files, { + + # validity check + req(input$select_data_files) + + # actions + rv$data_files <- rv$data_files[ + rv$data_files$name != input$select_data_files + ,] + }) + + # Display data files + output$data_files <- renderUI({ + + updateFileListTrigger$depend() + + # actions + if(!identical(rv$data_files, data.frame()) && + !is.null(rv$data_files)){ + enable("nextTab") + checkboxGroupInput(ns("select_data_files"), + "Select files to delete (all files here will be kept otherwise)", + choices = rv$data_files$name) + } + else{ + disable("nextTab") + return(NULL) + } + }) + + # Warnings ---- + # data size + output$warning_data_size <- renderText({ + if(sum(rv$data_files$size) > THRESHOLD$dp_data_files) + paste("WARNING:", sum(rv$data_files$size), + "bytes are about to be duplicated for data package assembly") + else + "" + }) + + # overwrite files + output$warning_overwrite <- renderText({ + if(identical(dir(paste0(path,"/",dp,"/data_objects/")), + character(0)) + ) + paste("WARNING:", "Selected files will overwrite + already loaded ones.") + else + "" + }) + + # Process files ---- + # Template table + observeEvent(input$nextTab, { + # variable initialization + dp <- savevar$emlal$selectDP$dp_name + path <- savevar$emlal$selectDP$dp_path + + # actions + # -- copy files to _emldp//data_objects + browser() + sapply(rv$data_files$datapath, + file.copy, + to = paste0(path,"/",dp,"/data_objects/"), + overwrite = TRUE) + # -- modify paths in save variable + tmp <- savevar$emlal$createDP$dp_data_files + tmp$datapath <- sapply(rv$data_files$name, + function(dpname){ + force(dpname) + paste0(path,"/",dp,"/data_objects/",dpname) + }) + tmp$metadatapath <- sapply(rv$data_files$name, + function(dpname){ + force(dpname) + paste0(path,"/",dp,"/metadata_templates/", + sub("(.*)\\.[a-zA-Z0-9]*$", + "attributes_\\1.txt", + dpname) + ) + }) + savevar$emlal$createDP$dp_data_files <- tmp + + # EMLAL templating function + template_table_attributes( + path = paste0(path,"/",dp,"/metadata_templates"), + data.path = paste0(path,"/",dp,"/data_objects"), + data.table = rv$data_files$name, + ) + }, priority = 1) + + # Output ---- + return(savevar) +} diff --git a/R/modules/fill/EMLAL/EMLAL_customUnits.R b/R/modules/fill/EMLAL/EMLAL_customUnits.R new file mode 100644 index 0000000..53da0c7 --- /dev/null +++ b/R/modules/fill/EMLAL/EMLAL_customUnits.R @@ -0,0 +1,14 @@ +# EMLAL_templateDP.R + +## 3. Create DP template +customUnitsUI <- function(id, title, IM){ + ns <- NS(id) + + return( + h1("Custom Units") + ) +} + +catvars <- function(input, output, session, IM, savevar, globalRV){ + +} \ No newline at end of file diff --git a/R/modules/fill/EMLAL/EMLAL_functions.R b/R/modules/fill/EMLAL/EMLAL_functions.R new file mode 100644 index 0000000..73e5e2a --- /dev/null +++ b/R/modules/fill/EMLAL/EMLAL_functions.R @@ -0,0 +1,299 @@ +# EMLAL.R + +## UIs for input ---- + +# quit dp edition +quitButton <- function(id, style){ + ns <- NS(id) + + actionButton(ns("quit"), "Quit", + icon = icon("sign-out-alt"), style = style) +} + +# save dp snapshot +saveButton <- function(id, style){ + ns <- NS(id) + + actionButton(ns("save"), "Save", + icon = icon("save",class="regular"), style = style) +} + +# next Tab +nextTabButton <- function(id, style){ + ns <- NS(id) + + actionButton(ns("nextTab"),"Next", + icon = icon("arrow-right"), + style = style) +} + +# previous Tab +prevTabButton <- function(id, style){ + ns <- NS(id) + + actionButton(ns("prevTab"),"Previous", + icon = icon("arrow-left"), + style = style) +} + +# custom units inputs of EAL templates +customUnitsUI <- function(input_id, customUnitsTable){ + ns <- NS(input_id) + tagList( + column(1), + column(11, + lapply(c("id","unitType","parentSI","multiplierToSI","description"), + function(field){ + id <- ns(paste0("custom_",field)) + cat("Enter:",id,"\n") + switch(field, + id = textInput(id, + span("Type an ID for your custom unit", style = redButtonStyle), + placeholder = "e.g. gramsPerSquaredMeterPerCentimeter "), + unitType = textInput(id, + span("Type the scientific dimension using this unit in your dataset", style = redButtonStyle), + placeholder = "e.g. mass, areal mass density per length"), + parentSI = selectInput(id, + span("Select the parent SI from which your unit is derivated",style = redButtonStyle), + unique(get_unitList()$units$parentSI)), + multiplierToSI = numericInput(id, + span("Type the appropriate numeric to multiply a value by to perform conversion to SI",style = redButtonStyle), + value = 1), + description = textAreaInput(id, + "Describe your custom unit") + ) + }), # end of lapply + ) + ) # end of taglist +} + +## Associated server functions ---- + +# on quit button +onQuit <- function(input, output, session, + globalRV, toSave, path, filename){ + + # modal dialog for quitting data description + quitModal <- modalDialog( + title = "You are leaving data description", + "Are you sure to leave? Some of your metadata have maybe not been saved.", + footer = tagList( + modalButton("Cancel"), + actionButton("save_quit_button","Save & Quit"), + actionButton("quit_button","Quit",icon("times-circle"), + style = redButtonStyle) + ) + ) + + # show modal on 'quit' button clicked + observeEvent(input$quit,{ + showModal(quitModal) + }) + + # calls saveRDS method and quits + observeEvent(input$save_quit_button,{ + removeModal() + saveReactive(toSave, path, filename) + globalRV$navigate <- 1 + }) + + # quits simply + observeEvent(input$quit_button,{ + removeModal() + globalRV$navigate <- 1 + }) +} + +# on save button +# toSave is a structured list of reactiveValues (aka savevar in various modules) +onSave <- function(input, output, session, + toSave, path, filename){ + observeEvent(input$save,{ + saveReactive(toSave, path, filename) + }) +} + +# set the path and save the savevar +saveReactive <- function(toSave, path, filename){ + location <- paste0(path,"/",filename,".rds") + message("Saving current metadata as:",location,"\n",sep=" ") + if(file.exists(location)) file.remove(location) + saveRDS(toSave, location) +} + +# set the globalRV navigation .. +# .. one step after +nextTab <- function(input,output,session, + globalRV, previous){ + observeEvent(input$nextTab,{ + globalRV$navigate <- globalRV$navigate+1 + globalRV$previous <- previous + }, priority = -1 + ) + +} +# .. one step before +prevTab <- function(input,output,session, + globalRV, previous){ + observeEvent(input$prevTab,{ + globalRV$navigate <- globalRV$navigate-1 + globalRV$previous <- previous + }) +} + +# Initialize savevar variable ---- +# EMLAL module specific function +# @param sublist: either NULL, "emlal", "metafin" to precise which sublist +# to initialize +initReactive <- function(sublist = NULL, savevar = NULL){ + if(!is.null(sublist) && is.null(savevar)) + stop("Attempt to initialize savevar's sublist without savevar.") + if(!(is.null(sublist) || sublist %in% c("emlal","metafin"))) + stop("Attempt to initialize savevar with inconsistent arguments") + + # re-creates a whole savevar + if(is.null(sublist)) + savevar <- reactiveValues() + + # emlal reactivelist management + if(is.null(sublist) || sublist == "emlal") + savevar$emlal <- reactiveValues( + step = 0, + selectDP = reactiveValues( + dp_name = NULL, + dp_path = NULL + ), + createDP = reactiveValues( + dp_data_files = NULL + ), + templateDP = reactiveValues() + ) + + # metafin reactivelist management + if(is.null(sublist) || sublist == "metafin") + savevar$metafin <- reactiveValues() + + # differential returns + return(if(is.null(sublist)) + savevar + else + switch(sublist, + emlal = savevar$emlal, + metafin = savevar$metafin) + ) +} + +# Files management ---- +# choose directory function +chooseDirectory = function(caption = 'Select data directory', default = "~/") { + if (exists('utils::choose.dir')) { + choose.dir(caption = caption) + } else { + tk_choose.dir(default = default, caption = caption) + } +} + +# create DP directory +createDPFolder <- function(DP.location, DP.name, data.location){ + if(dir.exists(paste0(DP.location, DP.name))){ + unlink(paste0(DP.location,DP.name),recursive = TRUE) + showModal(modalDialog( + title = "Information: directory deleted", + span(paste0(DP.location, DP.name), "has been deleted and replaced by a new empty data package."), + footer = mmodalButton("Close"), + easyClose = TRUE + )) + } + + template_directories( + path = DP.location, + dir.name = DP.name + ) +} + +# EAL Templates ---- + +# very local function +saveInput <- function(RV){ + # save attributes + RV$attributesTable[ + RV$current_attribute, + ] <- printReactiveValues(RV$attributes)[ + names(RV$attributesTable) + ] + + # (re)set local save reactive value with NULL values + sapply(colnames(RV$attributesTable), function(nn){ + RV$attributes[[nn]] <- NULL + }) + # sapply(colnames(rv$customUnitsTable), function(nn){ + # rv$customUnits[[nn]] <- NULL + # }) + + return(RV) +} + +# build a unique id from file, attribute and colname - attribute_tables +buildInputID <- function(filename, attribute, colname){ + paste(filename, attribute, colname, sep = "_") +} + +# customUnits server +customUnits <- function(input, output, session, + savevar){ + ns <- session$ns + if(is.null(savevar$emlal$templateDP$customUnitsTable)) + savevar$emlal$templateDP$customUnitsTable <- fread(paste(savevar$emlal$selectDP$dp_path, + savevar$emlal$selectDP$dp_name, + "metadata_templates", + "custom_units.txt", + sep = "/") + ) + # end of fread + customUnitsTable <- savevar$emlal$templateDP$customUnitsTable + # Custome Units Reactive Values + curv <- reactiveValues() + + lapply(colnames(customUnitsTable), + function(field){ + id <- ns(paste0("custom_",field)) + cat("Observe:",id,"\n") + curv[[id]] <- reactive({ input[[id]] }) + }) + + # output + cat("Output:",names(curv),"\n") + + return(curv) +} + + +# Needed vars +# - columns from table +# * site +# * lat +# * long +# * taxa +# - taxa authority (taxonomyCleanr::view_taxa_authorities()) +# - taxa name type in "scientific","common","both" +# ! All taxa authorities do not support all name type + + + +# Misc ---- + +# R to JS boolean +r2js.boolean <- function(condition){ + if(is.character(condition)) condition = as.logical(condition) + return(tolower(as.character(condition))) +} + +printReactiveValues <- function(values){ + sapply(names(values), + function(nn) + if(is.reactive(values[[nn]])) + values[[nn]]() + else + values[[nn]] + ) +} diff --git a/R/modules/fill/EMLAL/EMLAL_selectDP.R b/R/modules/fill/EMLAL/EMLAL_selectDP.R new file mode 100644 index 0000000..3b08264 --- /dev/null +++ b/R/modules/fill/EMLAL/EMLAL_selectDP.R @@ -0,0 +1,312 @@ +# EMLAL_functions.R + +### UI ### +selectDPUI <- function(id, title, width=12, IM){ + ns <- NS(id) + + # UI output + return( + fluidPage( + title = "Organize data packages", + # Data package location + with_tippy( + fluidRow( + column(4, + # actionButton(ns("dp_location"), "Choose directory") + shinyDirButton(ns("dp_location"),"Choose directory", + "DP save location", icon = icon("folder-open") + ) + ), + column(8, + textOutput(ns("dp_location")), + style = "text-align: right;" + ), + style=paste(inputStyle, "text-overflow: ellipsis;") + ), + "This is the location where your data packages will be + saved. A folder will be created, respectively named + after your input." + ), + fluidRow( + # Use existing DP + column(ceiling(width/2), + h4("Edit existing data package", + style="text-align:center"), + uiOutput(ns("dp_list")), + actionButton(ns("dp_load"), "Load"), + actionButton(ns("dp_delete"),"Delete", + style = redButtonStyle) + ), + # Create DP + column(floor(width/2), + h4("Create new data package", + style="text-align:center"), + + # Data package title + textInput(ns("dp_name"), "Data package name", + placeholder = paste0(Sys.Date(),"_project")), + textOutput(ns("warning_dp_name")), + with_tippy( + div(id = "license-help", + selectInput(ns("license"), + "Select an Intellectual Rights License:", + c("CCBY","CC0"), + multiple = FALSE) + ), + HTML("License:
+ CC0: public domain.
+ CC-BY-4.0: open source with authorship.
+ For more details, visit Creative Commons.") + ), + # DP creation + actionButton(ns("dp_create"),"Create") + ) # end column2 + + ) # end fluidRow + + ) # end fluidPage + + ) # end return + +} + +selectDP <- function(input, output, session, IM, DP.path, savevar, globalRV){ + + # variable initialization ---- + ns <- session$ns + parent_ns = NS(IM.EMLAL[1]) + + # local values - to save will communicate with other modules + rv <- reactiveValues( + # to save + # Default DP location + dp_location = DP.path, + dp_name = NULL, + # local only + dp_list = NULL, + dp_license = NULL, + warning_dp_name = NULL + ) + volumes <- c(Home = HOME, base = getVolumes()()) + + # DP location ---- + + # chose DP location + shinyDirChoose(input, ns("dp_location"), + roots = volumes, + # defaultRoot = HOME, + session = session) + + # update reactive value + observeEvent(input$dp_location, { + # validity checks + req(input$dp_location) + + # variable initialization + save <- rv$dp_location + + # actions + # rv$dp_location <- input$dp_location + rv$dp_location <- parseDirPath(volumes, input$dp_location) + if(is.na(rv$dp_location)) + rv$dp_location <- save + }) + + # Render selected DP location + output$dp_location <- renderText({ + rv$dp_location + }) + + # DP load ---- + # fetch list of DP at selected location + observeEvent(rv$dp_location, { + dpList <- list.files(rv$dp_location, pattern = "_emldp$") + if(length(dpList) != 0) rv$dp_list <- sub("_emldp","",dpList) + else rv$dp_list <- NULL + }) + + # Render list of DP at selected location + output$dp_list <- renderUI({ + if(!is.null(rv$dp_list)) + radioButtons(ns("dp_list"), + NULL, + choiceNames = c("None selected",rv$dp_list), + choiceValues = c("", rv$dp_list) + ) + else{ + disable("dp_load") + disable("dp_delete") + "No EML data package was found at this location." + } + + }) + + # toggle Load and Delete buttons + observeEvent(input$dp_list, { + if(input$dp_list != ""){ + enable("dp_load") + enable("dp_delete") + } + else{ + disable("dp_load") + disable("dp_delete") + } + }) + + # DP create ---- + + # name inout + observeEvent(input$dp_name, { + + # check for name validity + rv$warning_dp_name <- c( + # check for long enough name + if(nchar(input$dp_name) < 3) + "Please type a name with at least 3 characters." + else + NULL, + # check for valid characters name + if(!grepl("^[[:alnum:]_-]+$",input$dp_name) + && nzchar(input$dp_name)) + "Only authorized characters are alphanumeric, '_' (underscore) and '-' (hyphen)." + else + NULL, + # check for double name + if(!is.null(rv$dp_list) + && input$dp_name %in% rv$dp_list + && input$dp_name != "") + paste0(input$dp_name, " exists already at this location !") + else + NULL + ) + + }) + + output$dp_list <- renderUI({ + if(!is.null(rv$dp_list)) + radioButtons(ns("dp_list"), + NULL, + choiceNames = c("None selected",rv$dp_list), + choiceValues = c("", rv$dp_list) + ) + else{ + disable("dp_load") + disable("dp_delete") + "No EML data package was found at this location." + } + }) + + # warings for input name - toggle Create button + output$warning_dp_name <- renderText({ + if(is.null(rv$warning_dp_name)){ + rv$dp_name <- input$dp_name + enable("dp_create") + return(NULL) + } + else{ + disable("dp_create") + return(paste(rv$warning_dp_name, collapse = "\n")) + } + }) + + # license choice + rv$dp_license <- reactive({ input$license }) + + # DP management - on clicks---- + + # Create DP + observeEvent(input$dp_create, { + req(input$dp_name) + + # variable operation - legibility purpose + dp <- rv$dp_name + path <- paste0(rv$dp_location,dp,"_emldp") + license <- rv$dp_license() + + # save in empty dedicated variable + savevar$emlal <- initReactive("emlal", savevar) + savevar$emlal$selectDP$dp_name <- dp + savevar$emlal$selectDP$dp_path <- path + + # verbose + message("Creating:",path,"\n", sep = "") + + # actions + rv$dp_list <- c(rv$dp_list,dp) + + globalRV$navigate <- globalRV$navigate+1 + globalRV$previous <- "create" + + dir.create(path) + saveReactive(savevar, path, dp) # initial "commit" + template_directories( + path, + dp + ) + template_core_metadata( + path, + license + ) + }) + + # Load DP + observeEvent(input$dp_load, { + req(input$dp_list) + + # variable operation - legibility purpose + dp <- input$dp_list + path <- paste0(rv$dp_location,dp,"_emldp") + + # verbose + message("Loading:",path,"\n", sep = "") # to replace by loading DP + + # actions + savevar$emlal <- initReactive("emlal", savevar) + savevar$emlal <- readRDS(paste0(path,"/",dp,".rds"))$emlal + globalRV$navigate <- ifelse(savevar$emlal$step > 1, # resume where max reached + savevar$emlal$step, + globalRV$navigate+1) + globalRV$previous <- "load" + }) + + # Delete DP + observeEvent(input$dp_delete, { + req(input$dp_list) + + # variable operation - legibility purpose + dp <- input$dp_list + + # actions + showModal( + modalDialog( + title = "Delete data package?", + paste("Are you sure to delete", dp, "?"), + footer = tagList( + modalButton("No"), + actionButton( + ns("delete_confirm"),"Yes", + style = redButtonStyle + ) + ) # end footer + ) # end modalDialog + ) # end showModal + }) + + # If deletion is confirmed + observeEvent(input$delete_confirm,{ + # variable operation - legibility purpose + dp <- input$dp_list + path <- paste0(rv$dp_location,dp,"_emldp") + + # verbose + message("Deleting:",path,"\n", sep = "") # to replace by deleting DP + + # actions + unlink(path, recursive = TRUE) + rv$dp_list <- rv$dp_list[rv$dp_list != dp] + removeModal() + }) + + # Output ---- + return(savevar) +} \ No newline at end of file diff --git a/R/modules/fill/EMLAL/EMLAL_templateDP.R b/R/modules/fill/EMLAL/EMLAL_templateDP.R new file mode 100644 index 0000000..52610fe --- /dev/null +++ b/R/modules/fill/EMLAL/EMLAL_templateDP.R @@ -0,0 +1,409 @@ +# EMLAL_templateDP.R + +## 3. Create DP template +templateDPUI <- function(id, title, IM){ + ns <- NS(id) + + return( + fluidPage( + # Inputs ---- + column(10, + h4("Data table attributes"), + HTML("Even if EML Assembly Line automatically infers most + of your data's metadata, some steps need you to check + out. Please check the following attribute, and fill + in at least the mandatory + elements."), + fluidRow( + tagList( + actionButton(ns("file_prev"), + "", + icon("chevron-left"), + width = "12%"), + uiOutput(ns("current_file"), + inline = TRUE), + actionButton(ns("file_next"), + "", + icon("chevron-right"), + width = "12%") + ), + style = "padding: 5px;" + ), + fluidRow( + tagList( + actionButton(ns("attribute_prev"), + "", + icon("chevron-left"), + width = "12%"), + uiOutput(ns("current_attribute"), + inline = TRUE), + actionButton(ns("attribute_next"), + "", + icon("chevron-right"), + width = "12%") + ), + style = "padding: 5px;" + ), + uiOutput(ns("edit_template")) + ), + + # Navigation buttons ---- + column(2, + h4("Navigation"), + quitButton(id, style = rightButtonStyle), + saveButton(id, style = rightButtonStyle), + shinyjs::disabled(nextTabButton(id, style = rightButtonStyle)), + prevTabButton(id, style = rightButtonStyle), + style = "text-align: center; padding: 0;" + ,actionButton(ns("check2"),"Dev Check") + ,actionButton(ns("check3"),"Fill") + ) # end column 2 + ) # end fluidPage + ) # end return + +} + +templateDP <- function(input, output, session, IM, savevar, globalRV){ + ns <- session$ns + + observeEvent(input$check2,{ + browser() + }) + observeEvent(input$check3,{ + req(rv$current_file) + sapply(names(rv$attributesTable), function(nn){ + rv$attributesTable[,nn] <- rep("a", + dim(rv$attributesTable)[1]) + }) + savevar$emlal$templateDP[[rv$current_file]] <- rv$attributesTable + }) + # variable initialization ---- + + # main local reactiveValues + rv <- reactiveValues( + # local save + attributes = reactiveValues(), + # utility + ui = character(), + completed = FALSE + ) + + observe({ + req(savevar$emlal$createDP$dp_data_files) + rv$files_names <- savevar$emlal$createDP$dp_data_files$name + }) + observeEvent(rv$files_names, { + req(rv$files_names) + rv$current_file <- rv$files_names[1] + }) + + # on file change + observeEvent(rv$current_file, { + req(rv$current_file) # already req savevar$..$dp_data_files + req(savevar$emlal$createDP$dp_data_files$metadatapath) + toRead <- savevar$emlal$createDP$dp_data_files + toRead <- toRead$metadatapath[ + match(rv$current_file, toRead$name) + ] + # load attributes_table.txt + rv$attributesTable <- fread(toRead, data.table = FALSE, + stringsAsFactors = FALSE, + na.strings = NULL) + rv$attributesTable[is.na(rv$attributesTable)] <- "" + # get current attribute + rv$current_attribute <- 0 # trick: trigger rv$current_attribute -dependant observers + rv$current_attribute <- 1 + }) + observeEvent(rv$current_attribute, { + req(rv$attributesTable) + tmpAttributes <- rv$attributesTable[rv$current_attribute,] + rv$ui <- names(tmpAttributes) + rv$ui <- rv$ui[rv$ui != "attributeName"] + # units case + if(tmpAttributes["unit"] == "") + rv$ui <- rv$ui[!grepl("unit", rv$ui)] + # date case + if(tmpAttributes[rv$ui[grepl("date", rv$ui)] ] == "") + rv$ui <- rv$ui[!grepl("date", rv$ui)] + }) + + # Navigation buttons ---- + # ** files + observeEvent(input$file_prev,{ + req(rv$attributes + # , rv$customUnits + ) + cur_ind <- match(rv$current_file, rv$files_names) + if(cur_ind > 1){ + # save metadata + rv <- saveInput(rv) + # change file + rv$current_file <- rv$files_names[cur_ind - 1] + } + }) + observeEvent(input$file_next,{ + req(rv$attributes + # , rv$customUnits + ) + cur_ind <- match(rv$current_file, rv$files_names) + if(cur_ind < length(rv$files_names) ){ + # save metadata + rv <- saveInput(rv) + # change file + rv$current_file <- rv$files_names[cur_ind + 1] + } + }) + # ** attribute + observeEvent(input$attribute_prev,{ + req(rv$attributes + # , rv$customUnits + ) + if(rv$current_attribute > 1){ + # save metadata + rv <- saveInput(rv) + # change attribute + rv$current_attribute <- rv$current_attribute - 1 + } + }) + observeEvent(input$attribute_next,{ + req(rv$attributes + # , rv$customUnits + ) + if(rv$current_attribute < length(rv$attributesTable$attributeName)){ + # save metadata + rv <- saveInput(rv) + # change attribute + rv$current_attribute <- rv$current_attribute + 1 + } + }) + + # outputs + { + output$current_file <- renderUI(div(rv$current_file, + style = paste0("display: inline-block; + font-size:20pt; + text-align:center; + width:70%; + background: linear-gradient(90deg, #3c8dbc ", + round(100*match(rv$current_file, rv$files_names)/length(rv$files_names)), + "%, white ", + round(100*match(rv$current_file, rv$files_names)/length(rv$files_names)), + "%);") + ) + ) + output$current_attribute <- renderUI(div(rv$attributesTable[rv$current_attribute,"attributeName"], + style = paste0("display: inline-block; + font-size:15pt; + text-align:center; + width:70%; + background: linear-gradient(90deg, #3c8dbc ", + round(100*rv$current_attribute/dim(rv$attributesTable)[1]), + "%, white ", + round(100*rv$current_attribute/dim(rv$attributesTable)[1]), + "%);" + ) + + ) + ) + } + + callModule(onQuit, IM.EMLAL[5], + # additional arguments + globalRV, savevar, + savevar$emlal$selectDP$dp_path, + savevar$emlal$selectDP$dp_name) + callModule(onSave, IM.EMLAL[5], + # additional arguments + savevar, + savevar$emlal$selectDP$dp_path, + savevar$emlal$selectDP$dp_name) + callModule(nextTab, IM.EMLAL[5], + globalRV, "template") + callModule(prevTab, IM.EMLAL[5], + globalRV, "template") + + # Procedurals / ---- + # / UI ---- + output$edit_template <- renderUI({ + req(rv$ui) + + # actions + tagList( + # write each attribute's characteristic + lapply(rv$ui, function(colname) { + # prepare var + saved_value <- rv$attributesTable[rv$current_attribute, colname] + if(grepl("date", colname)) saved_value <- gsub("^(.*) .*$","\\1", saved_value) + + # UI + switch(colname, + attributeDefinition = textAreaInput(ns(colname), value = saved_value, + "Describe the attribute concisely"), + class = HTML(paste("Detected class:", as.vector(saved_value) ) ), + unit = selectInput(ns(colname), + span("Existing unit", style=redButtonStyle), + unique(c(saved_value, UNIT.LIST)), + selected = saved_value + ), + dateTimeFormatString = tagList(selectInput(ns( paste0(colname,"_date") ), + span("Existing date format", + style=redButtonStyle), + unique(c(saved_value, DATE.FORMAT)), + selected = saved_value), + selectInput(ns( paste0(colname,"_hour") ), + "Existing hour format", + HOUR.FORMAT ) + ), + missingValueCode = textInput(ns(colname), + "Code for missing value", + value = saved_value), + missingValueCodeExplanation = textAreaInput(ns(colname), + "Explain Missing Values", + value = saved_value) + ) # end of switch + }) # end of lapply colname + ) # end of tagList + }) # end of UI + + + # / Servers / ---- + observe({ + req( any(rv$ui %in% names(input)) ) + + # / attributes ---- + sapply(names(rv$attributesTable), function(rvName) { + # prepare variable + # two different names: ids from input can be suffixed + inputNames <- names(input)[ + which(grepl(rvName, names(input))) + ] + # 'unit' exception: + if(rvName == "unit") + inputNames <- inputNames[inputNames != "unitType"] + + # check corresponding input + if(length(inputNames) != 0){ + if( + rvName %in% rv$ui + ){ + # show UI + sapply(inputNames, shinyjs::show) + + # Input UI yet exists: create eventReactive + rv$attributes[[rvName]] <- eventReactive({ + if(rvName == "dateTimeFormatString"){ + if(is.na(input[[paste0(rvName,"_hour")]]) + || input[[paste0(rvName,"_hour")]] == "NA") + { + input[[paste0(rvName,"_date")]] + } + else + { + input[[paste0(rvName,"_date")]] + input[[paste0(rvName,"_hour")]] + } + } + else{ + input[[rvName]] + } + },{ + # get input value + enter <- if(rvName == "dateTimeFormatString"){ + if(is.na(input[[paste0(rvName,"_hour")]]) + || input[[paste0(rvName,"_hour")]] == "NA") + input[[paste0(rvName,"_date")]] + else + paste(input[[paste0(rvName,"_date")]], + input[[paste0(rvName,"_hour")]], + sep = " " # make sure + ) + } + else if(rvName == "unit" + && input[[rvName]] == "custom") + input[["id"]] # link to custom inputs + else + input[[rvName]] + + # check obtained value + if(is.list(enter)) + enter <- unlist(enter) + if(!isTruthy(enter)){ + message("Input [",rvName,"] is invalid: unchanged") + enter <- ifelse(isTruthy(unlist(rv$attributesTable[rv$current_attribute,rvName])), + unlist(rv$attributesTable[rv$current_attribute,rvName]), + "" + ) + } # end if + enter + }) # end of eventReactive + } + else{ + # hide UI + sapply(inputNames, shinyjs::hide) + + # set reactiveValue to NULL + rv$attributes[[rvName]] <- rv$attributesTable[rv$current_attribute, rvName] + } + } # end if inputNames == character(0) + else{ + rv$attributes[[rvName]] <- rv$attributesTable[rv$current_attribute, rvName] + } + }) # end sapply + + }) + + # Saves ---- + cpltTrigger <- makeReactiveTrigger() + + # regular saves in savevar - triggered in saveInput() + observeEvent({ + input + },{ + req(rv$current_file) + savevar$emlal$templateDP[[rv$current_file]] <- rv$attributesTable + cpltTrigger$trigger() + }) + + # check for completeness + observe({ + cpltTrigger$depend() + req(!is.null(rv$completed)) + rv$completed <- ( + isTruthy(rv$attributesTable$attributeName) + && all(sapply(rv$attributesTable$attributeName, isTruthy)) + && all(sapply(rv$attributesTable$class, isTruthy)) + && !any(grepl("!Add.*here!",rv$attributesTable$unit)) + && !any(grepl("!Add.*here!",rv$attributesTable$dateTimeFormatString)) + ) + if(rv$completed){ + shinyjs::enable(ns("nextTab")) + } + else{ + shinyjs::disable(ns("nextTab")) + } + }) + + # Process data ---- + observeEvent(input[[ns("nextTab")]], { + req(rv$completed) + # for each attribute data frame + nextStep = 1 # default = catvars + sapply(rv$files_names, function(fn){ + # write filled tables + cur_ind <- match(fn, rv$files_names) + path <- savevar$emlal$createDP$dp_data_files$metadatapath[cur_ind] + table <- savevar$emlal$templateDP[[fn]] + fwrite(table, path) + + # check for direction: customUnits or catvars + if(nextStep > 0 && + "custom" %in% savevar$emlal$templateDP[[fn]][,"unit"]) + nextStep = 0 + }) + globalRV$navigate <- globalRV$navigate+nextStep + }, + priority = 1) + + # Output ---- + return(savevar) +} \ No newline at end of file diff --git a/R/modules/fill/EMLAL/sampleDP.R b/R/modules/fill/EMLAL/sampleDP.R new file mode 100644 index 0000000..f279ae7 --- /dev/null +++ b/R/modules/fill/EMLAL/sampleDP.R @@ -0,0 +1,46 @@ +# sample.R + +## 3. Create DP template +sampleDPUI <- function(id, title, IM){ + ns <- NS(id) + + column(2, + h4("Navigation"), + quitButton(ns(id), style = rightButtonStyle), + saveButton(ns(id), style = rightButtonStyle), + actionButton(ns("nextTab"),"Next", + icon = icon("arrow-right"), + style = rightButtonStyle), + actionButton(ns("prevTab"),"Previous", + icon = icon("arrow-left"), + style = rightButtonStyle), + style = "text-align: center; padding: 0;" + ) +} + +sampleDP <- function(input, output, session, IM, savevar, globalRV){ + ns <- session$ns + + # Navigation buttons ---- + callModule(onQuit, IM.EMLAL[5], + # additional arguments + globalRV, savevar, + savevar$emlal$selectDP$dp_path, + savevar$emlal$selectDP$dp_name) + callModule(onSave, IM.EMLAL[5], + # additional arguments + savevar$emlal, + savevar$emlal$selectDP$dp_path, + savevar$emlal$selectDP$dp_name) + observeEvent(input$nextTab, { + globalRV$navigate <- globalRV$navigate+1 + globalRV$previous <- "template" + }) + observeEvent(input$prevTab, { + globalRV$navigate <- globalRV$navigate-1 + globalRV$previous <- "template" + }) + + # Output ---- + return(savevar) +} \ No newline at end of file diff --git a/R/modules/fill/fill.R b/R/modules/fill/fill.R new file mode 100644 index 0000000..09b22fa --- /dev/null +++ b/R/modules/fill/fill.R @@ -0,0 +1,34 @@ +# fill.R + +### UI ### +fillUI <- function(id, IM){ + ns <- NS(id) + + # h1("Under construction.") + tabsetPanel(id = ns("tabs"), + tabPanel(IM.EMLAL[2], EMLALUI(IM.EMLAL[1], IM.EMLAL)), + tabPanel("MetaFIN", h1("Under Construction")) + ) + +} + + + +### SERVER ### +fill <- function(input, output, session, IM, globalRV){ + + # variable initialization ---- + # save variable + savevar <- initReactive() + + observeEvent(globalRV$navigate,{ + savevar$emlal$step <- max( + globalRV$navigate, + savevar$emlal$step + ) + if(savevar$emlal$step > globalRV$navigateMAX) + savevar$emlal$step <- globalRV$navigateMAX + }) + + return(savevar) +} \ No newline at end of file diff --git a/R/modules/fill/fill_functions.R b/R/modules/fill/fill_functions.R new file mode 100644 index 0000000..772a0c4 --- /dev/null +++ b/R/modules/fill/fill_functions.R @@ -0,0 +1 @@ +# fill_functions.R diff --git a/R/modules/fill/input_templates.R b/R/modules/fill/input_templates.R new file mode 100644 index 0000000..f6bd9c8 --- /dev/null +++ b/R/modules/fill/input_templates.R @@ -0,0 +1,25 @@ +# UI for input and its verbose +# Usage: +# inputRow(,, ) +inputRow <- function(id, input_fun, input_args){ + if(!is.list(input_args)) input_args <- as.list(input_args) + ns <- NS(id) + + fluidRow( + column(4, + do.call(input_fun, + c(inputId=ns("input"),input_args))), + column(8, + tags$b("Currently input:"), + uiOutput(ns("out"))), + style="border: 1px solid lightgrey; margin: 5px; padding: 5px; width: 100%;" + ) +} + +# Usage: +# callModule(inputRowServer, , ) +inputRowServer <- function(input, output, session, + output_fun, output_args){ + if(!is.list(output_args)) output_args <- as.list(output_args) + output$out <- do.call(output_fun, output_args) +} \ No newline at end of file diff --git a/R/modules/welcome/welcome.R b/R/modules/welcome/welcome.R new file mode 100644 index 0000000..942d8fc --- /dev/null +++ b/R/modules/welcome/welcome.R @@ -0,0 +1,40 @@ +# fill.R + +### UI ### +welcomeUI <- function(id, IM){ + ns <- NS(id) + + fluidPage( + headerPanel("Welcome in MetaShARK"), + mainPanel( + HTML(" +
+

MetaShARK (Metadata Shiny Automated Resources and Knowledge) is a tool designed for ecology + data description tasks. The tool relies on ecology metadata standards, but currently its main standard is the Ecological + Metadata Language. Its vocation is to allow any ecologist to fill in metadata for its dataset to permit the understanding, resusability + and reproducibility of his work. But as metadata is becoming more and more complex, this tool is trying to get as user-friendly as + possible.

+
+ +
+

Ecological Metadata Language

+

The Ecological Metadata Language has been developped since 1997 from the + work of Michener et al.. Since then, it has been developped by the NCEAS (National Center for Ecological Analysis and Synthesis) + and is mainly accessible through the KNB (Knowledge Network for Biodiversity) and its git. + However, MetaShARK offers a documentation section dedicated to EML.

+
+ ") + ) + ) + +} + +### SERVER ### +welcome <- function(input, output, session, IM){ + ns <- session$ns + + output$icon <- renderImage({ list(src = "resources/pictures/MetaShARK_icon2.png", + contentType = "image/png", + width = "240px", + height = "120px") }, deleteFile = FALSE) +} \ No newline at end of file diff --git a/R/runMetashark.R b/R/runMetashark.R new file mode 100644 index 0000000..de3d3c8 --- /dev/null +++ b/R/runMetashark.R @@ -0,0 +1,24 @@ +#' Run MetaShARK +#' +#' Main function for launching the MetaShARK application. +#' MetaShARK (METAdata SHiny Automated Resource & Knowledge) is a web app +#' which is designed to help its user as much as possible for filling ecological +#' metadata. It uses the EML standard (cf. NCEAS work) to allow a full and +#' precise description of input datasets. +#' +#' @example +#' runMetashark() +#' +#' @author Elie Arnaud +#' +#' @export +#' @importFrom shiny shinyApp +#' @importFrom golem with_golem_options +runMetashark <- function(...) { + + with_golem_options( + app = shinyApp(ui = .app_ui, server = .app_server, + onStart = .headerScript), + golem_opts = list(...) + ) +} diff --git a/README.Rmd b/README.Rmd new file mode 100644 index 0000000..60df1a6 --- /dev/null +++ b/README.Rmd @@ -0,0 +1,54 @@ +--- +output: github_document +--- + + + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>", + fig.path = "man/figures/README-", + out.width = "100%" +) +``` + +# MetaShARK + + + + +The goal of MetaShARK is to ... + +## Installation + +You can install the released version of MetaShARK from [CRAN](https://CRAN.R-project.org) with: + +``` r +install.packages("MetaShARK") +``` + +## Example + +This is a basic example which shows you how to solve a common problem: + +```{r example} +library(MetaShARK) +## basic example code +``` + +What is special about using `README.Rmd` instead of just `README.md`? You can include R chunks like so: + +```{r cars} +summary(cars) +``` + +You'll still need to render `README.Rmd` regularly, to keep `README.md` up-to-date. + +You can also embed plots, for example: + +```{r pressure, echo = FALSE} +plot(pressure) +``` + +In that case, don't forget to commit and push the resulting figure files, so they display on GitHub! diff --git a/data/backboneGuideline.rda b/data/backboneGuideline.rda new file mode 100644 index 0000000000000000000000000000000000000000..a013a22ca8e6c8bc76111496a2540666cb2f6630 GIT binary patch literal 5559 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

iDlGLS1&D9*~IWh$Q&r!tHhq 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 Y7c_ypwdQ2Pm;Ji0!Jqb_Pc z^%WE_V=hfx`uW>WX_CVI*3^-;(PE8k@#niIK`+R_Ys+8#=M4{}$IpuAr0+#9{A|6B zKwxbjbFYH^@tW7b0pU|#_C+sOFOin}_+k&bb&L86o+~IIlmRG@k$oWL=!GAb^K$$I z9r=}Ze35RDZrH?`Iu{u^b3EaCU-%tZ$LRhk#2nAli+(6`<+#*!Y z3`5iG+ry}Vi#R2GIiyeg>1k4I@aSX+LDDnR?aJ3#B zqRWn3Q)h6tLS0YC>4Z*0pGy!oKSexG(A`-p8vn9+|NGJP>@gqvj<966qZGTv zpy$%>4x}pucg~P9-jK&&YK;!rX|r$;NCKyMBo^`kk8ugBVCf2wYtU8YkA%PuF(s#< z`a`!KR3}Z_RX4%RuO&!i#mP^lTqY>_n$yo9nd$sz!?8oKfOb9|r9X=U41D_1x0GsYHzy+2KrPNzre0bY7_n{fe+QBr=t!%KWA?) zUnlp^*_f`J4}W5_Sdo1^Oi(Q2&6ef3-SotWYjt&H<#azv<7`Jv3U13l7op4==k=;5 zG_->v<;|77MG7vIn40w`K`U~~enGN2@^r=fgYs%Hq5kxc8PXXtr{r>ryB198We-af z9m#J}$XP}eD3Y_4TGu*!Ewj*5W=$)R`wDzE6AcD4j?}6TENpg;PgJJyX){qK@p?r> z3as6=$YLAMvb1)foFJBewrvCEG}j}9DnQx%q;p9OW%o^A!KMK$1YIeg`^xPA%LM@_ zsULvB9yZH-&7rj7`m7Br5_G>lF)=9AKNuR8Zfoffd)J6VUAM4@Rpsa_l(CpADa)=p zV{f}n9Xetz(m$^_IJ2U9mm=;?fpO!G{cvfRTALq3sL;>B%wcv9ZUSA?qYC@EB#ZF)o7W3@Yor>4nRqsm&G zK5z>X5n39w2W$CQ>Wfc5QsT+Dk)M~})rLRt##uSU^ck+vRRZv*g|%meT`mdlufuBI zK6JC>ZIyBJJYXUgE=yFc!=2jrW9srGp-v0FzCI+PS&6sW{}Kx<87Zse?pt1?g*%>|DcRVeHIEGj?gYM zSNo(AnXas6Jum>P;h$81J|(vgsWkt5qg%JSlbcO*5QY{rF_koSx2hV}S0f9pEu=}_ zsHd)Im(_o_V8uDEwaBf^sbc-AIl>gT|NG|}K^qsw<9vY}8nrvN&yuy>a>pif6&qf! zmNN~!9nKz54eT745gA~eWV#Y%&&CuBeJc1Uoik0l%dljo;K%Vu@^_lop9ZY>x)aGw z$MOosdN>6|h`4XEIdt!YPh~lK$CbI^Set}>o;SSeiQMArLb|F8nf8^~o>5SaJdZXg zzE8u6pVVJL{7d=E$R>fMtBS_a0M{zHT3M|13e-D>S+|(EJomaq1ceiqd7Yc^L%*{b zF_AlaE$DezGF;yCk;|AlD{JV>W?N&Eo-*0e`~rCo*TsmGK9`xiRBCd4hXSY-FO@*I zwROKiVM!qcrvs-om!YNM-9#SkG3~A>RUR-VPLFHaAlgZ{`i*wKB_ltWd6=h=>}hWZ zhbT47C@R58H|%j(T6b-FTCYl(g(_u%-bV*2t*G*}?VxBf`|2|757RFTqOVXUSn@M> zv9g6cyE*q(dH>XF=u4aXKJ(PgZ7J``nl^fpXuB9Q&$5T^QT?3{OI0;S%E~F~dD+QH zZ#jiN^zaZA*hUKq(gazq*xK66A#H6%@MuY!f(&>^-z*hG9&o`V5Q}j1L$x6h<2ijl zDU_H(v9nbi!Agy|+HNC!kTPd)EWr~OSlNvX*eKrb2L9$2evXVmjV2lv<0xvOk{ptJ zeq$Y&M;Uxjx52VQ7Mg=cHi){wI(s(jmH zLCt^}{}p4z<>u=4nK!E5XTB})m!$Vby5Qi%5g0k-gV5nGcl1G`u)4syg8(yz!B3^B z@a<-VQDaj%LZoT?2#jdl09M*GJNKNA*b}VF{hb~rWl0ZzZ&b@-Jl)U5o;Yi?(HPon z(KIPZ*dzl`Z8&tupNnxEw2nGPt?p{$e+vTKxHY3=+9)znKT(eA(O`!al>m%;9K{^P z2F&dnD$`!F_6;oXztLxq$Wgk&Imi-9ToFmXQKJ*n}Md*X4H zevJbj^^neSFc^qt$iGc?`*zmDMWa#j#MzdX9l+gNOVni{fSS;{WdbL~^!)kkjLTpi zlvQ4L!}fR2J6+&Tz}K)8j_2=hc^}Z@+oOI|{vBHGMz8{z@-VJI3C(txLVy`v0hM1$ z_gSoL$YiBSksffzZmdDGKkUg{P{AP&)(^$s6c4w9v{`A9>1ea1z6#T`RK8a-1D zF~zf=!dzs!ZK5$~_vctA{N@Ekh>NhOn<(Zo{=*Ch`wKz}duRdX?hwObD#2nGm+^-8 z<86~^73W9GhikIt=i`_u6~E&6?OO?s9gU?Jv!(ReV7Tkdbsi?7esiGS%*eP%_R-Do z8-F;AeV_Kqz7!wYp`&zhy+&RAf*JFmXqE;>4mq;_>RKW#WZt;dxdnlQ`?=JeY(O)> zz#4}K7*PNqfc3w2E$|;cP+O$x_K2|~$4KwsS1WXp$7rFkk&A?RM*kB};r|1YMb^bO zDb+>e9r~Hm-BV8o?e-H>4F4botJ^UF@uLPnQM~#8hckaqpw9+19Qi;xb@_08MYl3A z6*JMWInIJ_&Jj;NPswHZ|Eag4qRT?I{apwDMb-WfNQ$Ylm&O%c(po%rj*kPH?-)E# z1=>?{r3f57;hS@)dN;8jQ@&D~UjLu4`&*)X?`{rwnZwr>$Upej9l_Cl$aCuhsm(tH z?VGdp2R#2L75U%6A)?ccI(CtA_Hf#A=RKnJtT7R)inj)V1WJ1EEcyX08SOWp_is5D zmYTlA_`j8}Ck6ma`2Rxn|4=XjvWOT3OBS*$2N6_`rk_()X3tXFgL~EBYZwV25HC=` zNt?@l&jyk|%TBc0Ev-|LnNN;1-e>1Owc5W6^1rVAM+=)Ja=-xH1=kQJ3ZMq5vqaN7 zzh8(=opmX#Xm!3$I2G$+&s&=VDR^8f1H)v%6$+B6--4`2_pDJybO!8C6eZXIh?gpE z2arc=`1mC@F0X}qFKNGJH;<((EK$W$CUk(;5E~btwEHfqSXw#U_~N)jn)Fdbh?pO3u26t zyWXf7#V83tV+RDPEwG88Y$}#xP*%&)8^rvKeQM4Ce{0L$0ZVqu(lE+Wy$YkIU^#^Z z(Y==UWZP0_;cF*PbYXezCl$bik=q{$djjyK5LGLH~!0BTy3)xM7RTD|10Y9AvNev1olN6Ii@WW zq*l72bh`s9l9iRM8>D3)&uza(NSUvIo5mV8D#-O%#@t;%ktarplu_m-HdUt7kEMN7 zu^{gjqF4d{A`Vx?`+HWJt?4Y>(Fm2^f1y7mj?fZQpW{U9CVl2E@v;~<+JyRja$6@9 z!GSNwTTH}Hui!)4E!iVg^y10a^YnNG{HzrUW(z(votuxRm-N19Nyu}%$jxd?JxYr( zN{b~$w-~GDEl0tqPWXEtun9B+XK!yl;0W`BV4D3=n>Ik+LBt3AKJ{fEO;6a7$4MO? zgTZ|nI2#vg31=XwbN@HRQkGrdoSApF+K|hF5V;tyXJVUR=4BxFH-5a#<~F6 zny4N06hpVs`*{irPvuHu5^4rX0iH&FZ#=VP1kjBD1cz$37Efo5;+&QPla4ku!W#XCru?BO^)0AbO4X(cZRXu@Way-Vx0CefsD1npoYz%hMw(^Za|`+ z>EMxA578sTau`)ix4Ee|gYkyvlP4bipGfgam2ka+OYX2)|HRSMl+GF$Xl@=D_?%(i+?bvYfdErQ z3t2Niz6fsd{7k8)1OCLLfw=a^!Ln7jDR*F#zNq|z=+-6Sced2Ti0ZSi~| zcp94ffEOsW?T;k>Eq^M|R=MKrVA9B~!hdgZNJki;`GcT6%9a2OBEDm4`nCWB)y7*p z={$S9IF#dq3OL!QsISDJVtW&Gb~<1+8~6|W0BEA>Nt->)%Ru~s9<6OQ3kv}?e$jMx zE*b;;IMF-jw~#T%@$5cyV=Fa%hvx+_*i(`UOu8MICL^GEbM!aX1w~QyCL7*^RymWc zleRF2l1s9WByOn4wM#UH_GQ^gd3gG)JM1+d7QsqueuEL@7h@(3G=@tmTRW;ADNpgO zPlu>L|Gh~m&&fZa{X-YA%W~0nE_Q@Hg|?xQGJ#UR#&$MzK~WI-x=aPc-7 ze8V3lhVXdXdW;IavrG!^as<{`FJ!zH&B6X!346`_i;@z>!{y}m8*~N)Y?4gOTh$X` zUA0(!?}52Y7C@AVPk`k@jJ?pKVjaHSy;*fmpPtV{R9$p5c1(NhCq?>@+Gv$@-GTnn zmN}24B0;!Bwx-xpkx`GGA=-{^UVKC(V?a!F)U#Un^<~u*tLgy=l_c2{bpC!4#t(fY+P!K+XL@K+IyBsrcq3UE>}Kag53Z z{l?$X=bqtzs;?zQ|L%Hl)S$C)pWhaH=;Obka*2cgP`@IPQG>SihDf{lfPya|K!5$4 zx3tH)BZbk}z;7t6a}3gyttZ&n7Et&&_cG0HjJf(Zq8j$btqDs{@_0WNdm-rGjBV}y z&gVdu+5jp)+f%D-sD6vh3N%CtKROe?T``Mfj+B z2crp_H^$~dlV1H?1X{fxEX!11yFOjQQ#1pep3Xtf>2x>O97JPf&uo0%mQhKj`GJVD zk5PkJypxS-Cbv`ws-nJ}|L!4~1at;Gm5p*=+Hl4wKLHrRL5R#?g4v^g)-HRxRKmec zs~A!)#uer0v+3axE}p)n?KU=HBaW>18S?2f!MsoTXTUkEhhOM~e@6d(c0})kLQDIg zV9jCMWBjH}P?LkD*LmUBN>dCq+>;AA!5Tg>-#TJv0jL2Ovd_@rxiDY5EDd|)F+QdKg=U(<~AdJde?1`rrxiqh0>5`gimvyD+zX$Gxm7|PuP6Lae4}Sy21*1{K z{)M=KMd&2BY2pZac&`5V@2Yb9I~86#Iy%qE+eRBhW>V7*S%skA7L&wnk>SyLL{wf0 zjO%hUnd8#mi2#NL&AZHJCxv4D1XThC@Oa1tuR1EPFe-)10LIm+Xhqd&%b%raWoG5w zWoZYFb!?q)Ky5aXV5X6J^1Yq9nMipa6mWGi56oDU<@Jf+@k^`p!rq(4sBRS+#(BtRUdgy2WpVb=PmWv<2|I*|98*6_b zV5MfBeUy3ArHKod)ik32nmX?VgKY|BHaoy7IuvkY$go&&V{Y)N0l6=;y1l~JwTP}K z%Q;8SYpXmanIJ~{U7D;`c>WYnDcXNZRIeFfC%NO|BJF>?5#ZTc4@X=4!2ZaY`OR-^K2DJpx#{HW)KUvyjcFqa} zzF~4SbC|3p;}5FD^^Z9DjWOWzfPxJG4S<1Ly2Re+%&vuFbeps`VXicQ$fZZaX%Pdq zOn=~`t5;JW=q8SY3B?t05_ZB#~77$Y}v>djj6__iO?98uIehK?)^_6+S63Vvw(%|oo~Qk zfWaK-e`6XsWM`xA;O)@ZveI17UL(xzQP&&=MgE+H(fSx5n#G(UO%8%#KKg^RBkRDj z5dR^NjKk3wm+C)6|2f4OJlpnGy=(S^70HvUz{%z{)v69wuQ*qS!)`Jke^Tw3Shc|}D* z08of9Rd(ffGX|3b`ojm6=j-0$`J>t^R%GxJJXJ2*OlL zYiGbkO6?cTMCo#;3QbtyM<4{@Xz5ewlQ*}p0PG`=CQJ7Jpb!wG8^AY!A;%#}lpR%e z_xaZ82J9BjcR*dwUp`8lOs!qw?;>}Bi=tEnI7b2=ja_9`=|_8eJ6tM3fkD?mff4b; z|DppD?OXAKBKFV$N7Jhq34tbX{_K)5MkS|QG(P}lu|BA*%?% zJ4)vWkMoS%wa7S48eD0n-xJH;2$+Qxxb3> zH%PR-l&7*+ike>rJZcxmDj9i7tfQ_pW)G+eKu;K4*7~)cg!op3M|nWZF8m0Y{N^zO z^ukVFb^`_Y#$O^6S4II>MyXwNQG?!nZfE|j#83dF#{tv2xi>F005gCiCKe1Gpd>Mr zKJ+g1El;2s#eNqhs{b`UA86M94i2SuUZ5{{z^6BD$WwIC4-L&I^eQ0KPv zqp2Dmvrh2e#Yf{8I5hW4vt9|qUuRKD!}Mbavr@)Re6!NFpAwX zYR)75a07X0qa%d(k>h)gFnDu^Yv7A4Cp9$jMFJYrxU=tyA3pgcNXw zw~oY!@!vhN;<@{dSX6x(zjE+yO+-xQ+E@F`608PlTM*X(&b7oZ)vs^xDO~++RZfOn z7~bmrB}~(Fw6$vkJjHJSko|et9Z)x9186uyz(!pli3PV6QsFz$JTLikZ<6+4($r%z zARH(lpC^{m7z+V-B=JD?TfV*l)GC`wA}~GD4L(&=T;oOp!ey$>Pf!?09-z0{53~dv z9YA|x>||cGK^dR{1{MTqcB^!)(vaH$$H;MaTflYtt#!`ox9I!1qAq`VMYdWx0;=TQ zYUnZKL8G50?eXz6Y-teV!{P0`=U;ii%(4rpU+t(q%YwWbwy3;H3JSF);j1IhXMaTL82HXNs7?~2gtUm)A8*^$M;A~uFfQw4-GRIsfv9A_^#W^SKauk2n@EN4Eh5||rCcNr<^v8fEy8DCA%H3( z2BTR~X+Q^6vYxFnTT~)o^a06=Y!cGuw_Elom$?(_MbeMvoBK1C!9Y$f8b17Biyp{B zl@5=dEr9+4bHK&J4@wou$$7T!Hvd-AMe?Y}f&)`34aPWeAN6 zMkgJSrGD(bfGGqL{T{bzw|`HYoNHdhSi6b$ITkGUhLiFFtdM|7hs#l{e`FwX*^aB5 zZ%uW0;_FCVlq#W7rA44zX@J@w2DOh&%Pl=&-{X#HQDWj-uA6G;jPmap^Nw0Zs=g(i zgOHo1aXn&l6C3QF6=-fG#PLJfe?l!o!~X`gm;HzsZ8^`1|KpwGHwEca`B40jFnUDB zv~ZE_n&e;c2TyrdE0w*5sQsuk@v-N0GYfWerlXIZc)f1}bNbuO9A@7e-KDKwEEe7t zMO?a4CoGgq+$ z%hd6EiM@icq@U=<9#-enKJNyRheP9tuj2_BBjNC`WBR3P4J~x)g)98N^HVQaj9!G* z2nu%A?@1$|v#0DnXq6}Ra8sX+Acn?l`b4i zTx2;gphmSSq1k_WzDEBbM|o3{%%1}}g%UTXi_dS?iKI zMBpYeWE77U}Kcu56+=RcXrq^Qkkk`xXO;zhO3+0%V|8Z^$Dq>FTi48^-7MQyINtHx;``xw4S zi#Au55{umNbr$DR9@osbX*hK_Eh{B$xl7=GDARd$k7fO|ijUnR=fRs@IPfoR>L|E; z7CA&Dh5P6*Yk3SQa)6sHvU}d z`SD=eQg=vDl4e!zXwCikvFxA<+i3I3iHy>h!HgZ!c?ZP}M64W(Yu}Y?H#w&^&GJP# zdDL9DEG;BW`Y8k+I1MbmcVS<9SvU}tO-*e+@4e~&nqeXRt=;DN+rapy9kL4sEy$F%-IQnCI|Xuj6t>vy@~8}l8Wo;xj_iHz6$Xj#vm z&OYkZ4L#w4ILlTavMEr3Iypg2q&$1ADJTWrAxnCvIAyKJ(aOl&S-SHF8pL5|q z7?w7rH(LLa*lk0;kT`z3{X*h|;pYqGzgnD~ovp|1i_(RS?2FVrfFQPq*?Ner6=et) zWjvk8u+M)IaH6~(m~=W6ihL1r)_;z7YMhywNt2oR_U8VRqQLTt+ufZl8XK#cK8&hm zl(ng!^x(=Uc6fj#0&i% zh|}`zugC`hDR{T50^){mgqXi+Pnb(F`lsKkY9&24}zk=Nj!dYgr0M ziy=oa7mH-rRW6!et|-mbS(I4i6-I2epw%z5#KF!US-;vCR(#?myC1mp?hy$j9ZLVT z5#Y2R@bt8;u43*1v2J0ioAl_`-Z+}U;q9~UgK}QX<$E{Ev2GnH@g}|>4HkPhB zd!SK4&;#s`^!Zyh&hj0Qf6Gn~FWqhG>_z>yJ$ZXfyY*{{)O>lXg9yVk>>+WKKs zT_^`ZY;E)UNd3O{b-BYQBkr1?xg&q2+?(}P$CfnPK|a9y%l}^U#OP_j+m6-0Ud;aR zXSjC~I6rx2Rv&LSzqLml>x=#3b{oNqPlqq!%gbw|-yN4+^SK2BHQ1)r}gDPe9 zOPBo2uNBV+h$9=({n4y4lSt`%ye^N14D?qmTHZF@t=k_O2dOc%7_8Ay@@{f;DV#W+ zy3u=HF7Xa#c(L3^^?P-9t*QM-s2{I1+y7#K{|ub)fAPl6^Y}$-*Ws4E@nGQQT8dQP zgh7xO&N+a7LK1s|=TDmK83> z>`!kv$vJ^>aZ$+zTFT1Wk1HLXj@jM!UZ1K~w$$e0(lv_aa%dO6FUT%1U9KFN?)oJD zUFn-Q)kI%qlE-_c^K|rekbWOQSit&>t%Z|oHI}kr3L~kt9fa*+r)sim=v4uB{nefD z#P%kUAGDi(^)3VS=elAhE#>w`6LTg~0ae%5l6o9epjSm?s;}ebCMUe6Hzck)NKy#i z3Jvz=3|q=&r+Jk-m?Sb|1&lIxVal3om31oh zicHLgE_0lO#!z$STgFftQ>t^feEjlVuV{tH&`DiYY+z+UPc3=Yna?^8*k*<~C@1l- zxT!}z#k0{LSr+KsGCek90{{T`R8Yp3MLTuqr7-m8bG z7SVnzv5&Fh6Mc47s_$C%|APKFh8~8$vz2krRB&1&yy1(2w{CKL0&Ch0eLBhf0DLiV z4Q%;ZaFdy=Y<@F!D zw2dxZ9iNK^>-e4z$$S(3vaOLYF(KP~%dlmh&wGH@vg0A2R{k`ftwN-vX64rI@%aMm z-NlQ4>HBM7@Z(Tm;FSTOxiJIxFM`fz@~AG$y34N-B3?5xv;DckeE;ib=NVwu&=96V zupDVAxf^ir-+>UL|AA2QD7xrPDmhpQ7!-FABE7!;IRy5RIV+xMWaN4V{mUWoR>7IF zMyqJTJso;xjvzv2{>j;ymyWt$q3|E;^b@w`wiiFsxo}`mDph*g?F@ANff@piM7_x< zbB2`yeJR4^1;<~9R^bwT`)D4=uebapQb<&pDi(yw0x zsJ;RP73~!1{el^%8MUo?i8M-)B1(I|ff&A3oT+H!-sh(4zLI9Ew$}6NKM_8I=ov^4 zE#d_2b)MPEL2LU&1X4L~1>v|2X>UvwsSyn5q0JFp1RKve!1Z2eP6U=MrA3~<$b)7L zd6vZLI{WlSOvkNrrHmR)#5xQzJ^HM7bLckzeq`m!?9CiF)yuxYmRCd0mCTha&+b;% zrFq>fO&4jeho)3its#v7iQiWNtvWD3j zUny`j8h4OWcN8yY6fRq@C3up$dso+TEGcF@Q^ZE`t_}q>TDL2?s|5H86riseb8{sFiZVVW(?>v@cZmlP*sl|F==qz;hb&0q4ay(NAhjnDF|OoIDew5_zI7 zRA4(-TOm?b%P2~i#{C9ZS=C)nw{8jcI+@b=DVvtV*Sfo^s#@T?+(fTHAZ8-qb9P2% zP*6l6fIeC0Ff`}y64x+FdR0Kq_OhJiK9-pWW=pRs5(bi6m zWbczp5>J%7As10Hct=7*ubjil>gea3olZa0(aEExw|j+X!bbv!cF>Z!)DtWO23y4( z3TJzjW~~e(Jkq;8zT|kc%y=S>j3zeT@Jp;ij3<41{0AU4S<6~ibUVFl`Na^nOj?6z zQ?&0WRoq5H&V&!IYnh9k+iY#V*046x&c{*=`iZ+H3z794hZ1=1dWC7@v5rRDwXj)_ zti?z=;5lob`}L3?a<6IP13#b+j3Tx?vStU4;2CPb<6aQv$xaO6ij{?`0J@s#(7s7o z?6$H-6PX})JHeaXf?#+Qo-kIm3^vduVhzG{jQsPE`M-|7h*f`ztAOx9JWbcN^Oi;)B+>Erx*QH@Qf6J+tH+Fdq|CX8qwr0^s{e#pZ-5B`dE8#0M`F&!D& zFRtm!njBf1V`wS_tkeMZ(AFwx&`xY=&nT_fXLdrXWkaC9Y0@pnqp2i}X2M|8Llo?6 z+o(OR>4`ilTCvlaonRL(aK1kywR8mU_)v}#ihvF3a!2${tu&G&HfqalD!QAI`ofY! z-ph8L2AdmkU>C!vNe(dFqo!%J7Jfj5_8ZsqnVNMm9#cd6mq8NZHhd>U$Z9>?zSm2k z$V(d{$G6J%JeodbMs)ANGlv4^4KuSBo6~!+5YDD($FP;1#M8bZ5^=kL4Nsl{SmWTH zL)@V!!nRS;%F`e+b|c&C@kB=2_5q!xM7Bpu#L7x@e|c5Kkx5$IE(Ct04yhv67|rrx zE)77|4=UKCN`mFMB|5okvW862G@E)N*^eyw#n7g(9+tE$7C~NAgH?9gmYqq(m;cm( z^?w;b0s8McYX2`2{GZ)6py>WTBm93s#e-%3|ANhb;DO!JlOx5QWYe^N8h3R}fqh9e z_7#tLG$nI4e$~Gn@N4(Q@T>eQ4*Sc!o3QVFD-1-t^@O^O@N4%hkjwMEJ}2MZ*@LfU zsuztq=A|41^92d*5?W}!B%|sa_|$IxT1G~eurHrZ@D;FtSi+IS?d$!y4mpph!U)~* zaqPUSbG0O740wtegZO)@ij`9~Jb$L968tcLnAz@?^#xz0U037BsX>ZF1uWURzLacD z&vk@KlNyWZfg1EPWdCZr7C1Lcu&H5X{OAs?#Y&DpTvI?wRiIj+YreYMu4+&CUdDpYykw~rq~Hm4 zzodRbZ(Zm9lrX<!F#+4=)>xbjEcN>1KU)x8Qm)0b=SEe*?y}j#AzA5VSg+7%Y?@{PM z(<}+hle1ezpmNo#dC|9G2^Ih1+sok;lwKoeE3!efYWBP|W4-kAJH10k)4I|%|B62C z!lNwiO!82$8r7>Rux^(H$kJB#6A10tyL0SRK;)aay8D8R{sV<7z9`~oy7aoV?}5U0 z=TL`got0k!>hyekfyj-HBop#x-pR-0J%Zt_ttY#tm0ZXt8!ivFMr{kLAl`TzLncOT z_Y@8q2M$rgu+f_@tusUl4Kw=qLI^;;SF9sCl?4D3Q5L}(CeJq@AkPH2KaAv2Dn*34 zm2a-`M+*{#QOYwBg$R)L0@otcm|pkF3-Z1Gbc3{m0N)~vNZ|0qDsNKS>lTuuVwpc?n2Z1DmQPd~?wskXwm? zA2+d$D%N)|Bx|=Qln)lQiPW#oxFe$3@@iRcZmRM7$xqt^cbTyD`uZ$YCc|&9cmk$!QI{6OL2!HgS$Hgin}{>kmBy{?(Xic#l5&gu>zHEdd_*@-*@l-_pTW- zJ0v^FTFK5#R0zcXuHtrge7O29p|R31yuV9P_&3l1T|F zq%AI_mJ^Z;47XHR)@ihmt+uGIqHD;?;J@!?aofRCOz5$1&~kFhNTHK|$4bl|(!OiX z6pt06Wj3V-R>_yGcNqJG_O?Q5iLI%jswxl~c^+s1O&2c78KOW0nr2uK6faC-b0@M_ zJe-I~Da9Lf!@=o3tp=o3XV6@VanPAfWMlxKCW7(`?gcXQrFmurgL7< z^1BF@;>&{YotoawyQMO@C|36PgdWd@;YPN{Yo9C@-z>N(b(TE6E}Vcq*&xRx|!>~GRg zw6ba#iLU|V!L>hERy`*j%Es4~@q`-WQbl~bBU2pDUEI_tepNH5hq-ooG-WM$W-B9i z-a*qbh1aW9b3+}?fD??XhW^N=*dxy%>Mt6Vkftqj#klZb_{je@@WK~M8^I>BUl z21#ltkoBV&9>#mdK!a@Gf=iZYt3$K3o7VLM#1lmgD2TpyTYo$I=bV(8UaMS*oYUyt z&ZXCTLa*$1n(Q+0b=pOY(@JW-XV11Riw-$u)n(Zqs3x*>*|y1(GGNs> zh&nQSK|H+3eQ6nd7lvv_k`lJSB9Y{**A=I9CNfoU@8I4AYgX4joKN@_3Wf&39+N!-R4cov41+)el1B|D`~BB$2H?8R}G}`rc+h8<(LS}VtwLhzq+p)Dg8j>hV&&EF+Ji4*v)lf59FToll z{CbE*clV0$Fg9^?J;gs4^0g#8`!`DM0m1jMDo!NdRH?R%zVTX)5_#lGf^Vla#7NE| zyBRB{ppc|*Vbe~UHERdi=C0Y6(3~E%2OO0>4*N9m@~1m-c1Z{3>)+#K%3>yEp!|9; z-wXxB{Ixz64!0%>DCJ+Ml0qF*r?kdO&*m}SO60KmAH~y8Bf7GnI>hJm+xQugU^eBg z(z)tq)#X}dqM~dXk&(lM!+aOIK1lPw=uL?o3QUaYm0b`p`|iOKWv0FU`t#wQm%h`9 zA20o}5Ob1f=XA_{qF{yeTA8hOer586UU@o4`hZNAMCy-3*A9PYPPD*eDHRBlOb*)8 z%q2$6C}#LV$h3zv)?V8$H%))Rv{gvX%Q7SrDlai{w40KYWEqTc&<9NG|AFF(!ya**+PpT>=FfJ&cba^h=%lks zEqlj$A7ljc8vOxY-mALcg*dyCD>EXCq>BI9L@sr*MBdd_ou$~^e4)wKx+kY#i>QZJ z;dwSmvcn>p*Vm2d)rQXxi`GG_0uFGRlghKNuiywb?0N< zx9v{)X2qAo#8Y@ZQ|jHyn;5$7h&J)eOo+*auKiPbG`o(1Zu$>q=~C{9&QAok3<)$! zp$d`FZ4+hra3Xny)IwrQwdC52TykDhE!>eXb>?v^9T{`$Vk6d~6A^2+t zB5^G~Ii7yRIa&KuGC2Ug)|56S{pfR=>w{wOS(_wnjHteI_V0arx zP)dfTT8XCSisn|T_!H`IqTX7A2^0-Na@UiLS?A&kHcI9YdqELVH4(SMN~&q59(Sl# zDa&|Q28X4NnTU?dckzi14^MTE;@IAz1joiyLXPoD+|Xl`DMi;Eov9k`Mye|3YGN9$ zdX4?W*f4CZtQt;_a=k_j8)jW>3j#*G3BsU3F*_+Fi7Y8~6;t|k3yPSQKAQAoU53dO zq_$95Lz9dIbAr%NY9ZwrO?3_vcJmqwS+^nL%8GE~X^Qkl8?MzUAA_HF$ZiJg>7Q`F z4DP1kO{ANf1#4j<(y`lf^DsuXE2^tQb5l$vA!EQ~xE%;KI@}lQCilSC5=N=vV~;5a zHLkYZD)ppX-TzQ_+Ho=-^yOVu5Brh}7lQ_koCNoB+hZLuUV2g$Q-`=Y>rXCUDKdQF zhH%J5!I_wd=v6TbykPf8-FrBiOx--#R!8Jb-d`wR6MogRropI#tu{qS1E|P~nyE6y^o`>w4xmC)l8ve}gb=cHE z^ptYk%{WQ7TPP|rYVgRK;TcT}K3z&le$OyjF7$(#mlfkoPeO0WxsiCiZ&Dq#^m~3a z$v4V_#%Bp1Qrm?!zT@J(d?%hQR zA^~Y+yBb21j|EQy8?sY7UOB5hFde_}g6F#ZemU|^Ugug`b|uKAW%ja7!IO4Ux^)|+ z3S%y8@E5rpl}$ys^9Zs$Ek)G~d>8C*#tZyNq`q}L9kzD&D@&hqUBEPjm3d8CMAZUT zljU2ctJh|663=Ea2jm#rv^e5g1qPgJo4SYGKGrbi^6A^B`!^BaL4Ur1m$jqLrSc-`rU3)v45C&DQPPW!r?C$ufzcp=0@}h5i6?<+k(ZPOH72o_!cF=N@ApeY|*M zUxrTP5-*!yy#v@L5kBJGwbeSX- z6rc-?HZh}+5qGRkzxoKQ=WiO80)mN~cZQ@{Q}D3PzfdKPGR<8T9=6L@~Y5~Q7^bDCwhXEcQzq=%?_ z{|2eLe=k^~-W6`zPlp+88!=Mrm!7u&c$O*#)ARZE+nB4deCsBC1 z_Raq?X3r>31&Y9;kx8HefdMqAi^5znD@uQ095VL_FU=BZBFciY^|pvLXN-xI#@Vfz zF)BChZ~|!(CFyXYMYlQitgLAQx!M!;X&Nw)*@F)7@o{Y;OCl2i9hN+5%_|(mG>JOk z;&|MkQG75eGL88xd6MjqC4hsdIZfodM-MWP_8Xlc~VnoB-6spmOtu3N#_L5rQdxRQ~l9gSnHK0zV+?Eu#dyt$$O+vdi?5PGxdR^=pw?IbV}>k`ev*p7Cf9F zrhzr%g@DEgAJyvOMqN}B3%9g5s}vFr-5O$=R1$m7_L@iYFm!MUoV)bqs9N5Wc7S)4 z8$LZxAEjS4-VStWu~{zPM|bqQvN{yj+%$+f2`i$7b;~(z3P_)xNQk|3aldjnTDd-( zT@wgV`>3c9b&XVEhEw+++T7s!@GV#e_~9R@x&JG8`?Jx-v%Ka8PzetdN1%YExRvP3 z!)wwY_jjy6&8GzdU=94$3-X|$eaT|4V+NU5d~D+VA7`FBanXwrWt|_DeZLlr(W(#l z+qY;+%BQz^8dln1%>xS`F6x}eIO{|T^ex3#`ZZlWUan5&IdhIZn~P3_6dLkA@o-w$ zZE{+Q7!+@E*ht#z3K0zD1AbgWolcP5^g4!p-KDwf6^!o(D9nO^4}fPcsB2F%>zm5q zB}rMC7$Vkuz~#Q0XGi{XP|tHFPoo>p%<3YH(DH%dGs+V4dJ5u>?{K%#461F&tchKD zp2A}jM~OGGWwi>^>6dUfQnUydBuqw8HBq6-O|s4)nU|$5a)+KNn_5&9o5<#qx&-6td|4?f*Fpr>@RA}{K+@7Or|KE8I%36H zb7pRm@?vh;d0w$SW2rTVu(D02uZnd%eWf^EDb9?du=->i7vs4wJp}pUFUZ_qm=8EG zBme+Vg%ahU*pvCeT z=qcD`m?E7Km;gFBSc9!9AY`OU*ud*H$@a)C4AP1Mcsb@05F3Vps55N8C_D@sHjFk3 zo2DdN{{RkK|1hor`vAZd8wP~pqc%wu`YBYehk>UbmYIIcL3;%59Pw3%Tr$=u8g zaqP6M&OTS7cm8&huBX!t8wWPRbpJRMou-TOFu0=pQ^2*2q(lXD@9RIPH1UFKi8c>iu7xR>3PebxrDv(d11c748M+j&&Gd&qN@VBI$_X10sLL)>#IUQr|@WZ~{K95`E_$Es` z0Qfq`&%GCYp3eP{;YQB7%J+1U2VeC~n4I!nMA_1qbgU?N{pQ)h)60v*+uH|Cc+PeG zXm{fT>=S&7mNR<`5DEhmS&>n1J>}$kgm!vmdVH787rrU+Bbz-~yLVlmzM`orvg4AlxK6Qx6Wf^0A~yXA9NK+`@!%e z0KYu|S`Yt`8@lSLP!EY4-^&hZ&bDBj_QX?Nx(DQ>Kx`g8>6WMG57!+L=&umA+)M6TAC4zGW7@tw_It9LK0WU7TH=feug!3PdCD+(|GMHRUUDFF27*hR`7 zZdPDYQeo1ZY)>)+w}YlK<#<66QS^-S?;eOd6slZh;Rv}B{b;dw0#Fgk*xQ+&Ibq&q zUWi-XUjPD(qDYYAQ)+>r8?MFN_)H2YCnX~562|%DTgXGnD5nA)q+Wmp2JTR(i=qKb z1h~qah}@vu+yHK>(27tI`4F6^GF0g1(>)TwNO+SnlR_w~oD-*rg@xlx_3rPa`A&tb zxpmT(Y15atLb2Dm!NK`2&&U6-cJH({qD7%{(ovc0MJ?4004;!4+P2MM-v$|Zc=*^y4l1T;mzR|EUgU( zbc%`$SQU9M8_KC3mz}?tDw1{)U}wglF}|KDib|2`9*J0(OalmGcZ#5Z0pno8m59F6 zVtJi^@Ofu*e_l^YC14`;kt#oIhT>yREONRjEfPb)$mGOU$d#(JGFT8u7#VIHFDWz5 zXpg79vx0ZabvAAA48jIqlJBB&9k*Ppi7bsD`Pg&SolxXnbj}Zt88VtR-Z`yB<-{V9{CAqRyM^~4K zk*bVhAA$m-+JZJ%oMh}m1~Z!*ke7VnACrO5Rntg8h}~XFO!YDOlBP@y80{hfd!$}! zO_q<$=B7^7FXd^phu->ohfDnJtF4oPXU>{NMG*~+;mOAm36I2{9sI$K75?fi3LSOu z2}8l?uw7+zo4$Q|a*Au0o^853vbeJ@bRt7iZB&J`9+f^*2;*n=turyzEMDqE21@Bg zIG}6(CV2kVO&7ErgS@;nB>k)rhKKe9$vHulZ!Q}jZ{Ubnk#iL_xnd1v5+;spaSn5tz$GJ#+mWQ`vpfSHG>iCs-Gi?$Xrk>Oqnwl`9+yjsb#Nn-BTjMf^q~&MYz)TUlON zpAP_PO_;rFZ{xruK%zr%nK# zeBwN;rp}iHn|Sj?eY@0UKqG^urq*H0^)zI=z^Q%K;<<%$X!qXh+GZG*ao|ZUbQpn+ zMN~01sei{&H`@+Fy&h_j!tQ!LT@b;5;C62#5Ri$DYY~hg?i6l-8-E4{;b3wJYXG6g z?_kuvsOVwZP{5Q(ip2vpaSp@5g|(?OCwxzMD0~AN@3M-Sku*#`J{v6!{`vyFg-TZ4Kc_`l23t~s!H7YM52z$prk0_8D5ICHc4GK~m*sgv z7hzWKPRp)SxJ3mS{!5N8MWj)*LRllF;3a(Br4lC5~2iBa% z?p^M6#_jRw!k#SgrZnm{s}*jevsS7;xW=&lEKndg#ON4i92xU(cFEGM{DVlLM zq_7Vh!MGYwYDfNo00?|}0?ZHZj%8JpI)SVt?p$iZrG_9G5^XjE2_?7PuQAO1AtVGD=-9m#DgnJ2VTZkv$Iq52K%%JBy0$S{4CK8vs1h*6dm!V**fa-tr-C|SvLR;-!q_JaSXsfn(l#AX&WOb@ z%Rnwei<(C#;Bt(G4LV8`EZdm9U3)=%e{ZcrZTMbbb|T1lc*$tmN$5aUJoc}5+ zGmI|=R0GA{)VsZ89Y(e1I0!2l zMDYcNfKmgqKtnA*8Ngn{O{=aqQXJE0YBAB0z)?JbZKIYc)f_0NSGbYbVv*WnZfc#y zr17pK)kbZJE5__=iDG?&RB7gLv8}8or+ISnj6(57AO}NbS!H1|k_ITxq+2@i6@ zXcH+0n*s2Jhid0qy>W+D@JsG))3Q|QVOh)VKp0h zTAS8IZGKmMQzltvhCwbhYi^>6a*C9485L2C-yy^p=rUy-7=UtPn)IPTjx-Y*>Ba8l z2C|nz_xHt_mvp=BeQ9d-ALpC$zr+}@;7;?Y4@mLn2Hw63#PZrl>37dMSR!A4xg1$w58EWB3~?r$Gig~=;L zh+J0VPy#}6bn`^ytztAb6)aM>(vW9%TA3?@JQ$WjY6-G`TDPemtK9d8=zugrqKzls zv8!gNO<9zt>LqGW7GffS6e{i6qgP5_d!5Xzt>x*WDXJdwVK9qTwGyD>i2z6- zBFsu_O$Jc7q^_d>KTHS1e#i`2+}N)RdsHAE=nPr%{AO zL#ZTp@ZG&vNXXdFOTpmBNep2#Q00Y?21w*805>v<{{tuz^tCaYoz4^#pBAtYmb;$i4Zcw8(-nEfA$#9V zF@zN9S*4^TAu+f-jXms-Bqw-;nudjfi$nyiYN%h=bRME~da$4zMSgkDguozEhA=P% zD=tY7q%l!_{2iN`1@{c(l6G| zG`90nhle^V^;4>gOpUxqZv!fSJL<>Rb5K&r zP&veHGNON?Q@AU1Dc+gaBB9IqWU^$ZfR~C^tuqn!5P7GfS+5#WMHr}tVxZlu+h&j7 z&A@8z%s4v%EES3UhLMGc3&-giFJycio4b}T?SmW{eoi*8K2t#D=`HDO3`LBBfW2iJ zGar8g9>4Zi{ZtGEGzHg42J2e=vZ*XB)u&&NFDIJ29>5F`|iO?KB;1?gm) zh~0@EZBgP~jtoi|64ap@VVO}bxZR!nBQcCY#7=D@b8pP1cRXkHDCdY8i+o7IhKy>52wk7EKJ`^Yx@$ zRdo6eiLwfLtoJG zdT)ruMa?f@^`4yr_a32OGZhwav(kX2J--+u;-c0pa`AMN%Q}(Jb$LfX3svju)php~ ztKZjegQ+4j%+RTbj*GZ_qcg{6(fPDcRpr!!xm+RM9RW#7l*3FgB-~8n;9`)o4CP=?zW-?Fppu~}7 zH{tG!pDbZQNvkN^#t%F~L;D2YIfFD{%U2gozoczzvVIR+Ve45%mi4s{)UtdRzdmNi z=6;mH!aH7>L9HHs(1w@ep3X^JzgBCZY53(^&T{G*5o;?h6A@cX2F*A$VuMRat712^oq=-Fm@rg7j2?IgA^Xz;)iv7dU&$yo=@;#|U z8MI=JTOD(_crhkN=NkvI{WCiyP%vACC8vtn8Uk&%cSM72&b^|e20hjdF%6IkoFWR< z)5U$53cn?!Bu`h0x9~W1NVFlBYE!=JBCGQ;c0CB}Gv1ii-qcZ9`O%^$Q)h%$C52|9 zYt}4jPQn(+9_o9ZlH`(MP|{MVuYqD;ogjJ7WD*$~*nlO~%Y^fBKs?&ePgB|Mpd+2k zwIKK#9MY@a0q?eYx&1so-Qq?e;xr>YC#@s{a-`gQrU@mRedejl*i)HD;JwPj%r%RmI52E=?O9vUEi8n&gnCsQdgU9vn^YnxS$ zsiX9W{jqb7b;S>c^7SBif|ViShH9)=+%Hc;;tJu!`q}g9U|Kp6J7op^#r6R=d69{& zdN8q)8h1h0LACs26-kC`A)MzsCF$#<6tCVnZd2G9T{6nswx*dld+O>g9X!h zGdLbb5lvi(I};P0!qWc_?-vm{)@F%Umepy*rX*nN7k<=9eq`=Iw|Q(2ZW1=xFVQlH zWY1;asB=k%2Gk#XF;3sS0CPSSh8Wmb7>1q=NG`JRwP}-P>(F)DKCyC!$fy3Sy8F|m zHfXqsf}n0ot8S^?L(k83WVEoL-h4{yFwD+rY~246vkV47rJP zKA4+kd!j~8MXaW#JQye5#rZ=zjF^Dyh_*{a?FGZ9tyu0hl=guBDP#BKQ>%I}f5>me*ejQ?% zfIqMU)s!1fR9zTi6?;%ALy2dM2b+#FiCII3b?~iHKFM%-giC@x7b&n6EfH3R0)*0? z4LGsR{fh5=xiE3@O&9oJqL;7+O2A<;kk;aWmtWXBwzMH32^58Lrg6k!jjZa2FPU-n z{Z478!F(kkiXin-tqQg1Nj!l?Q(JDV&8bogDNud$IJXPQ&2hV}BjEy$8fz*&Wvs5C zkIi2o+3dGwMmRwu%r6)O7wlc}z;ZXuIDxV?yQ;an?4J*BUjX9#Br-H#&Ic*E^{4x9 zog`l+&71f$-6msM<@+CqKM^4Pk{_w8DQUH_PHHBgdn+qswzMFr0Qz<1?sc{P9Hnfn5Dk6e4nX_>$B1Lm?o6!{eqI@@VR>P)C-?9jaQsW2vjujIf~|uxV7YHd=V{hSZ+8G z$I{d|qmXe0pd!xyfoAaemjN#6>+9yh?v7a;z*^$Fhv~_X2TMH`ZUSRBr~UlnO_Iv@+O)! zs|rw2G}2P(XfEf_>$OI{?M0YE(H~rUeMEPwy+c0hda2Hd2d!y|I%kEEhN}T1a7gb# zg1`wsR9CDzo57U^dgkJqF2vS*H#FRB9&gd^%dD=ksS8f#Z(`*1@1CICzyC8Q z_|Jztw{7;3Y-w`(LSjr%WDEgCqk)56=9C_LRdy}iq9$!LQ8Ya64A(k0(*jZZDj{kX z-EfeZ=`aSOB4v8ItSk+-MhabG@nThrW^3xgs93%+RJ}fu${`w6ML!9Er{G{NZ>}lH zyULF$bbw?TVnd*T_UnZY0HdGMF}P_<*HTS1Z!2a`+nl^z5IpHwd?3!qEC!ODH zRY=)p_QKdRyoh~g(F(}gX{)hl$92LE)W|-;ZQ`()$m*=4Q;38V{FknF0J3Z~)s1Yo z)@UFE6)pIDidGG0qLDaqjCoLN zhF_={cm0^xNA0i;MwbLU8On>2r>BBFrd3cQfy=326a9E9COiM^d=S zLkqSRmI0x3%m`dBGk$-K*8Unq0>}SiK*szVYn#QA4a5Kh9>a^QrN^-e!)JJ&KKPJ- zlf+T|`>qxlX6kDIe>Nho9G&Rp)qVCG6R@|K9bE<&HxDbE3RWQE{-ba!yMPog4m|YG)y6i6P;b< z(tlkL?XCmZNO(3K|0ilfc1lIzM-ljp-`8Iy`hvm~-~YSZSm-bca>f|!I|P;2sfG*t zFlI(TK1qO~0E69AmmxTGR1fwI zKC^#%41XeQI)&8he)^;oB3BWio`0O_1i@dL3ir2>tp> z?vvV&qAuXXC}_lHw*3F6wLbjE0JbdqwxxfY>sTLnFX}JDq!ur7ib3I1>hVf)o0D5t z_ajcQ_IKdp)TLtn`DC#6LT*cU@W>BT8-Zrks)c4!J%;56)co@{Dk@ccu)?~j*u-@H z+!9zE9m$k>!v@?ztJ}YfIkL+0v$}6204*Ky#)e3BM@F3V{bs5W7X%zxjn2ymPta|JK7N8 zRI?B@<}a_;NNZKL1n>}xEx%w}3Dg%wfVB0|49aA_rN@>`&_|nps`_ugKAR&h0rM%*TKt)1-yO;$vN56=GOwJ#B#8e;T1 z>;B)E@DK5G(q*_t3p3etO1Y9#la&LFD}E%k5r9ZL1+GTZW?8Gc5YqE#D&J@^^94&Z zvZiGWEfCO9?FBm<@Gty~c0Zb&`Ug}m4lNt4+UBUP`iq)&tlZcB&k%eTJ%n({Kil~~ zLom(_4`Dh(=t*{eGhG?YN~FVFtO^+p(!Kx4lqnVGyV5K=_yy*U!43BK6YB)@L zw+?Jsi4JY*+ZlJ=5KmmAQm)Sqx}`?a#Q77K!+rKe+F3GQ#;iafFxj7~EbGakd-yV230^L^Z8v;k9a?cUJb7|S)UX5K81(1h*AK&s zc6@^+=SQ-I*s~W%i64{-(qY6^%b@XX!~$V=gQN6KZOAWB$4tA0&oQ2>4&#(AVNa%6 zesVjhUTOT%a`uE}w|VCCNxJ;GV_9~0-$gby|0}QV=jSH!nwP$={j+;P!|Xrr<&R%J zSnS640PYnwKU?6p+xqo(jPkxvy$UxVJT1(~ppPS9eP9T$yN`R4_Ie&u`@?ol?u16m zcbShsKAz8}!BPN5UcOP?Pm2zy5(v6atCg>Y`bmB=@`HW9VdBqG`5SukoXK@uYcGNH zSG|k#VgUFetfgZ|X8U<$G+iKRgC0ib!<`5ML4)Wd6>kAn$Jn_FZ%Al?AmL{z#^*3S zYBxU6jY~`4z#dfP!tu{)Mv*_Od5O0VAEMMHaWqvvO#Kx3{O)J8QJ2I0H9I4_Czm_G zm#%kgxaVl}?1n_cS{?#2E^33(TK}VOY50Nfv#GblBLO`FeGgjWyaw?0_Z4bBH{55p zIwt7E?nj21pL=gg1hX36>QF0g%QP`K<|3f{@ z`+B0ACmfU>L;c|MNZ$k+@+KJ8gYN^6j#w%1p12fIDhL>2Z$o2W+w&%EjlL=iUFGle ztKoOeU@h;ks=^=i)%@n`8Dydg}vLjjGC>I%GA08!_WcxxckBqE_ULp?tA{m(?1+fJ`n!6J0- z`1!j}cf7&s+JgtL)nNk04K6Zx z=?j^1Frj{*zI||W2zpIM0T3BLQ|$$1wS8{?^ZBiB>mc-xZOnj~WBDh%Hw@dyALMiE z8h};hTe%~y<;8lbcxB6zSO1?zXgE2&&owMOD!hQ%KRST7vx(0!Z@pzy6vC=*LLaoK zUa<~K{F=Cn6fh3wx%y23AzHu%i<&6#L33-HNAYt(A-eAoxh;<7OXgR&CJfhup_Sf`+4N%9K?|BzeUyYBr`c6|&R@HT!EnA9&Iw|b>=I>+h|!}?C?Ru9cQ zu#|ALRPjL4#n)6rx5TyJb9sEd=?#JEgJn5w(!N+<`QDOE;BMYbLEM~_sNY|Z%^FEl z#+p@%O7}3~##iA5-X+Xk9oqEMo+1-|$q7{$p;2-Wq_<%dz?A^&Z+>vC`qfvqNp9w6 z0|?w94Osgxz50z5|FWQVU&3So#E4n2R4;&`GHos3`vv2-U=t^Fkel$R%=R=i z^UvKJW)mT!3K^VYjXZYi`Rl|yc1t~3Ja&*slSvc!5P4j{Vu9N14m#c~HsV5v0|L-LK5pA5NmybyXp98Ij(@;-ywG({!`SS1ZQVwCxZZWx1(JCgFK4Q zUoGeGS3lIB=cp&U&J6ufFq=~;zsi8ND*ky~l&&Bo-q_Ut{ym!WUp6KnCD6Id>ad*v z2ABN4D+R`nn=ztQg9MtUiLo!nDH6esk8DG>U}gqzi}v=1gSN%te)JWR$_BX$%BJd$N$EPYiO;R zS^rHbh6#bZLLn4bP*4z0c6Xh#v@H-f?2bww?~0g`XIB0Q-R=+;ssRx>#%rWr$XpU8NorG=(@=IZ_0~2&@amua$sO!AlUd{B0%|Pq_PP$ zQNE!+e0U;neu%kGG!v@73Fk#lW5K6%{k4z2^~i+o7M~{u{hWw|M&WOVO$$!`3MS}> zGDZCu6U_eiMBP)3O*w;j(hW?#_AOKnoOkqf_K#|M-hx11tgYD-gQa*(A z8(g^5{V!+2kKrob@K^B|zu~{`!hU%DqyDx!8qElJOY*Tvp!~HVvhlVWzGCfbf7}0= zIC&f`3T6YvL*EVIX;TCKTOU+rKz|*f9y*gXc?{0chlBQ?MQa}-Cnn9vL^dz57Y@^e zB)#D$oc|b_$N>V=U!{`K?{@{f(}4Hj{G%xST3&JlfbLIb4v{}5L=Q=O@8amsF7E%3 zU;nwe{)6PF?}g9%azy{Tw{G=UckK2DXpxUuCo&&+=Dr2wHHf_s2_C(reV%?J6`5=M z{`Mk5P5vVwZ};)Fn}6uf?iKR$qeq{{n*Zh2k_T&7$R6XKc*JHY=Se&CIk*UQ)MFOAKKG z41$XhSY(Pd5;?@#>Y<=f(5oe~Ux2V5_}&6%+F172(RWA^NO6CW2V;(W4F8PU`RPq; zVQ!&QZ`oGXnyD0#Df#EkwVJwK0Q|GlSLn5xvJedQ7&6;gSWrAj!t(jU`OkE+vdXA{ zZS=c%_lSksv8^Aky&n@{p@f6^-kSpx!lHS&dNM!-Ojt*N8~lXNkip<@WD;KB^jU0w zz4}<s{%#Lz`^Qz;_?4X)ZEf;ci1A~XULhynx> zb)ID<<28>NVz*xeHgCOCL&nu&jtmmh95HRs%?j@5v}iQ!h>W%;C{ir~X;>{3N!B#m zSv3?%;!zbzMM*I%ND?gIi77Hr^2U(~%s@a!TDwp#R(-GLh)9Hh-h_pGxdQ`3;Bq?o2Qct%SK0+j(9er$d$1<{6xPFFS}Rum^PL_@S^ zDyEe+OMt&#f&N*hV`35@P{V+Xqv0r9*E<>NH8pXJ2Q&>A;UMZqP0dIY0;b?3c8H~w z!8tM}+b4nsomwPTs#vD#kR)o3Pn>j0O*BQ`v#C3-C0Nj$Fd%*H7VoMEzHkfx6@?2A z+<1j1feDiCn8$mZvkI*;O)=ue!-84Y_b68`mf^XyoSYmX!HhOIQkL)T(Y}jOnQF-u zYnrHzmJST?su8O2+}p@vXZt*ht|F)p@msTuzI0WhRnYte4w)`)^EA4?RmhJJ^0BC) zP2c5p7h9%@$be9C>h;C;4q`GUeVoE_aTD?Jb-6%s0wbf`)v}R71t$mp6rSSkwki!w z<@GJ8K|+B}#wdF~j!9;7sztBEd2prdUu+Ui#&_GRUESCWRL*E}N2?6> zdppLHq5EXGl8jiga;offG5FS6gk7>0yffP>?y{7BSxVdcB?`G8H4p~&5*RIs8iozty zAl2&CEc1InT<*mKwZ2)wAdiE>wsF^1v~-B@p0~nEH)qxe zNSV8x{%5iLU_Luh8V#udQ??y@Wn>{M@ND05+mVEy-xH#*-1_PmJKnQW;YJrND0i~tDE{FCpss2qOfT3k{nu&@M?5YOBbLE+<)=639Vr^Ofyog`aKsYouVXsd|QNDQ6I2&3!lr>ohQ z7H7v?_c?r`?E+qIEr;uK2s^r6RaLz1?iOE{*VVbaXI;H*Aw$FBYFpe5hJ%pqacaro zB8iIK#SF(F0~VhSq&krRO(#|Z+nfp6K=8Pz?IO9T9aq$dfV>#7n2wvYF1TxkC*(bb zJkIDqou}KKX5-uS_7m~CVyzZp#!Vc^uoLmBK403r$9RUhDp~tQ>8XN}y3s#oJ*1Dn z9i!zh4jK=B8=Ok#A}gXOL_ru1rDkLM9qB#1kpK3R%sqj-X2SJ-rOPNy>CP;RLTTpL zUtg^vdQa03K%t-x3O4yhS)~w3?DmjQ+#t+wHA)p3NuZLv{f3H4LyqNU(3dyY zrnphL&`8xM?)I!7k(m8_{P7jW0`JAb6@8@zClvcd^h1I`r_b&xKASAM%9&J_qX^r| z``boMHv;h*8d%LAv0){!w`u3>2cSd71H}-H%a>e7e6dV|_2ooei4HHQ0qDM;JQUK>)ugHkYf^^1}C>l{uIu?=A-Bog^O3n ztJ97i$97OYxFeGd91Ng>Ask5vFWLpDl@x~}P$J@-Q5<#}OG+R1bjfZa!17Zz_y&Fy zca7S`=>Lp2#?JF6GQK{$jPD}n$EGM=!82GL1E5WPndA10Z8tB?3@k$mJ-M==bp|6a zG`7J4s-l5aQArX;Kc@%XJor1#yqrB#oCaEG_bl&Yh0FpG+*gCpg^)$N5dKd9wIoX0 zB@4rtspBI1K5)^;sQ7jGp5ahLR76!oL>V~<=VA1nPU!4O?4%y&R8%Ac6FNeI2GBZS zvL>jlLBuwpt%o;ilVFBQ?#o+2TQv-Ve@Oo!*ph9~z?wn{Sp^@4I`>gO6p>1xNFhA% zR02Tr?-NN+M(hc;`3>!ZjuuQ^Bb~3ev$DA}S<_EP@#drXmVO z0x|-m0|hdv0Suy0P^eIYLMlnzByM-r>~p=(Ck=*pu$otb*yB^8sFou7?w9Wd*%CjY_f?_ncV8tNQ!_3%$wSgv zF@qpNB#NH=8X&3HtxE%(N&%X{H;T?;V1 zgY8*VpPS2Lwfv zRgo6bl!Rh2h{P5$Vu&%IF;O5Dw15BsB_IFhV+Fl1LA^7o^=L65KX}#3>Ng-O_MDF%uv=p#tV8 zDUyYKN?RKN_x$~M0NoEE=r&uypHW~j+P#%vDFle1p>0#l>lG<18qP*NeB*(_dZ7-o z^oLQY4|F}~DIl#t>L_v!l*Jop` zQ|;%oOEw1ZYJhMsiMfIu=4#ceCp;)RonlppJgkUQW;ww!hb$dAX-~p^jlJIz0C<&9 zh!8d7pT@xXEzpRpW-GBl0?UY}dA*A@?)R32VDSa*3=pG=0T#b$A%o{(*#irkx}W*J`sN3 zj!{h%0VlDOX6}oV!o_{ZPVklxBb z%$)83>l7C>8YDY{N2+w~-I&Bh16nW>3=!8njK@f8#kTX`Na49IcR zabaCCB4Y~BV51Ny7zn_%gbg6n%Mi5)si7K0pptRM25$U@IA^Pi4#OKe?%nk~obBBA zP=}n3(!53?-1E#(J}YLBo*xo=nA7G(zNbjC1G#{rjd$=oVD0G3;p2+(!Qh=21bWNW zx6V8lDMR3zG;NLS95azHPS`Ufcs@M@=mR_`i8~VRuX(Ys|Sw2s?>fq+C^`0xNEM~GkuV|<+U8~8J^J8BfCL5v6FrWd4$N$jo|5td)-pq+rbQt+=@ix-dj_~F5w&2V zgSHK9>>*rI=MdzR?)@n1+@EC0$33zqwzoZ2==zC@*yo6lp^=Y53UOEmS+Wp`6h%cE zO7r|0_bc|FJ8RwM+s(@DW z>iz2b`#)VIfnLxEi+b@0EobL~#0atpkT*Pl-);==VEIVx2m}u=ubBCk4x%uLDl`!a ze04tbELorij@MiQjht9e1VJRxA23k3TZuDbaN=lV9a!aKhE|rLsf2VUgf%+%c}R^CBBQ0OT!;if5GQcI=w~f- z?4NO(CD}m1paujPya($TkwgKk=M>sC#D+L+o-7DVx&o%7$66he)J( z{t!=WMPiAqAHM`-egD`nKokohkah=O0$ktRcbtby+gBniAy6qr1PVA1rTcHM+@6s4 zhpeI$0yPjMLQxRitO_C&6beJ8FV;O2eIBZP-+T8oaGgk{bi#6y>j#xDF;x|KvF8$x zC|5YTr)_6zWUl9oIuDn>FA^M85@GKNl>eZdr2nx=# zb$+%{0Bt0`5|9^=5j>W#B8O`88xnM2zqUO{`v;uw_ktd`p0DDel|>{T@2BGopt1xc zim^1^QWFGJkYH3;3IpcXwrl~*3sgU(L)Hi6^06V04cb0{9T8}f#<6j@q_(28rCP#D zfe88T3*teeoD6R$9?@n7q@$Ps$Q4k9AweIO`z|WHz2Sh4c`&MBnoc*PT-Q|NZfy)* z^wZATKDv?wqo_~}4z)B9L)z{5BuFk<=<6 z$2y?%_&`tszhZm4IXO8z70Z$ycz|aJWPM3au)bpUCG#i@zLN(Z8iPS`DBTg&1;QD2 z)CuiDx54+QH)W_zf<4Hfe#BG>_0mySE~qyho$*>jU}Zb8*9$5afCfakH&2R#=B{b? z3*tFzem?f)ERMPj_-C{NIygEX3(o3p))tXh^M0D*>~^dLd14)KeECPm5dG)Glq&q# zJMS`!rg^WF=ZZYngOin86%PMu2$(>agE;3@j-@Ihe4O zfjC1fC!(lXV5liajAzAUy6d<`%Gm__i(_cD71d>``vBOQ8#c69ixyJRv9el?u{5%q zBx^?4n?$xTB}r6hG?G-B5{*#AStAy{KWEwPnt;T3QIxQ2Q9%Rn6|P1kfy)3LwlX7U zZCYB`aOC5`!bE{0W1(T&5qllmN4#E`G}APYlu=VK3`$7R5pZwV?>JLP0EbM41P421 z!nV|ru_07n6eVbh@P8K;NZs$DFN|~?@pHw*4_x*Ty+ufxCzXf0F-*&+67O z?C43mv*2FMc=P$>g$npY^;y)xkc342U457dgnvdiuJJSRuX5!By>fsvvz z1<7Wn_~g&Ioy9baPw3?`LiyR#oHz1m^$&7->)!bOJrOp+)hMpRoY}~ir=;#Yw?F#UBucQN86Y$sqdx=N};G4Q`7icziQ@rONg#R+_70hm*gIcRP3xkldt!qK5)~!`QH5r=2xLaTp4GyXV1u4PH~t+uahltgQGTKIW`gluz*BY zS1_VvTdcDY6g4PQp$>S!QM@3EWC%zngEotOVR%TY2wVvVZ@E_E3i2l#V^_H^avKK$ z+B6T{{m-9zoJJa>poAo4mZGdYG5cUQu1L-kG_Hju3u{EFfsBy^Ll`NBV5SsfWDFn^ zJ_kLwxv}O#Ub1Y?Y1Mtc?>RXwf^;qMtl183-f808!I7(nG@B9FDw(Nh4MLzo!U&Ed zV@If+Da25KxWz$0ghHRW)4etucA494$~WI@gduLTYHbh1WPl)^(+(pCP=$w9&}n)O zlO1dv2iPEFhoiKQ1j~MP35hmwFDMvZh@e^}q2c7A(~R5Ql>Tnjtv@%*b53JWc#1r_ zv(>R<4kACjIVWJj3S$ybSl@C=OQIAuh{7s#yGQOrnG*nURe(b%I<)}kxL&&yVbubN zp|cEob}eHB3k916nsfrdAdsxZ2qVvMEcaK zLt%(f2==rFvy6rh7~4k1hk6%4Ys*^D;}9Pp1(i@h*bWKD+B6MT#96Zr&5veEDPMK~ z`N#mB;g56Q0>T0;RcQkU&2 zavG?ppMx+dwV4<}sC5~JB!DO$l(1BwC4yi;RNy?p=Y;VsdDw%&X>?je8`T%7K;VYp zn*ee!pBFzv!RhbU;#VB!T!>C_7yS!n6teWnTn?#kxpQ53o<+_W=}0y)ZSg9R(=upo ze;qMSjWzJot7FmbyvXEe@XB@vt8B@<^ySN+m+JE6R;lVC>D;o}IIdBKBYSXK4O&qy z|8z^mVA6^z{R}V>A{0=RC+466V4^@e)9>l`)h!h$QYuoMqs?G=h5(jG41j|M4^i9I zgx|?aULv~^-MXx6wJnua71QAIj{y#Iv5Nzo{c%Z1p+l*tGQy&aZ9qXV1q*0xPg>kk zr%$wx7=Eu+6ySuU34^yy8q6_N5Znj=6bK-04SSl+81QJg*7OmnJQ!_{6Z=A3-d1E| z%%Eu28X0$G>ty#EEzOyjWw{Qok2b($CWkf#w$Me*k61U)Q>M;fmWnd3O%&APL4rlTrA+%HL0M0&%^ zA-F!=e|!c2bb;nd5IJF-$GH>O@Aj|^8aks(Z*P&e$mmOZm%CQ)7b?zZLjl9kaXj() zik|@c;vv!kg%nB$riip+3Awt7LI#c`+yG>mC>n&MH45y}h!~1#2OD9b&NT6(c_eFm z2L||u?cok$;~WWK(IfPm+CDqvwBZc}d`U}e^?ZGJD5?d9Cdj~m!Zj?5G9$v$Ns<#E z6l0QQ*+^T^CHy^`x&xtvh+qf-0na%opgLVd3ku+`QrsARIgTkzKwTgTNGObgDvy}n z(j4AypK6P)4iZml-8K$*2Yvz0peh(RZaDckNCkp;gEJD6$L%y^=_LdQWsEP!e|gG%*j+>%O(ZM0NDsc2Bype!QLY7G!iPHWVr1%siA@uKItSeRJS1q zsWSsc(}8vX!3g?dtXu-H2%$j)k+}5iPCn;zkGtTQx(EWMq1KxchhlaliV%SO019%D z0Z!t4VFp28fQTjjN=k*IB!X4b@8SZYU%%o#ltb>1$nlQH@}mA9z~BUyFX=o+u@QKL z#S?0VLL-m}`iF=^Z-8u?6rv$8+@PLVg1(sTiU!d2BtS~u_lxAGqCKw-=o|)ywH1Vb zMiK@cf{^>(w)2Pp5dOa^3VkQey2H8vbtVb%-lgaZMCmj?75^D{L|jOm{4_Z=S9PFv zfi0e`p+F#)147Z z2u*-Gjt~zoUDvpp9;1d^c+-e6L^Fa24%ccxtBFRkI7gK@0*u6U&f$=gL<8%fO1(vean#BBDQ_ z1bR09rXNb0C?S|+UxbU?K|)OJdgJk69=7}1yMxV)U=j-eP(bY%*+5h~igKkwN1}S6 zY18m_3ud9kkE}neZ+D>Qrb>-KYI?=FJuvPHaVlqS+mAh5MC&y{HjiIet4^#WNbzb? zW<8K23=c8^K-v$)hm=7fgc3po5>go#-}-~`C}@7r7B>T|K3M$Sb>@Zy=O@x9(hC*~ ziv%pWghkHudSVd9ypqv>sRQ<2BX_ZL;CG-g3W!gZz2yU-NGVE;!cYwi^fLxx1prbG z@#qQCewW3^Omg}&EqTsAlVE4I=$m}^HHT+VshYd1D2D^w2;}VnKnv@6a!;p@wJEF= zJ5Wg!RUIIpf<%By8FkzT7OaDnISmvDKv9xsyqYIBC#c#SLMQ>UEFfe0;Pk-V2Vk5@ z-Qx>~51xZKb48I3JtYPpqx>V`ZC~&%bS$BD56d_xE#5%Zn6PL zQ!iVcb#PX~qEd+=q8!0&aY;ykma{xGVG{t;4+A(9lyOcjtxz*f1l2ULE#0lheqD90 zN^HjfL?Hyx3KSqWof8#PL?l+oiRXcWkI2@q8H#)`PhG(Q=K{L6-gdt`gGfjUvo@5h zQ8BO?10n0e{9~}#BlOOlx@TEH6)KeA)uitbc0l6bNSsFppD^{ z7WIpva;`%o9G4`r<#HBflKJ(UkR%{str?>!puQYfDVdh$FcgY<#pu0gDEPh+Zso?lIJ!uVn0i|pJL zuWJymPO5u^U0QrkaW*SyYK{s&>;}7 zm<^Sh#DakUgwZAm)9%VjXo!{tQfNc52t zVImj~PFpt)(5=M!V^=6P#WNB>hD%7Myj`2#A|Zi@ZcIx~4H-$~snEwYeGCvxfEBG0 zU_fJ-5rI0)^=EOS?H(s}&mAT+1Wt>;VUaK^7SgIZBBB5S01_3N`3cDYoHk0z$-0iJ zgp(vif>XMpE=RdeABxK?>>5YAw&bwf7~?A?l4of&)6_DN5hKv|9v3)(Tsz3AF=0R* zU6NvGTEv0rU)-9l0@Un)6(|h_0|*16AX$y*M??xFECugt4%q$udjz%;21er=Ewc=v zXuqN=cAXi%O@`B2U^;a>4%e72(cLIv6Um4Md`dCpR;FqxN>SyKk7(6oUC^2W(9JdF zI#vpcgH)=gBBT%rOFa3iE5MEM&8*zg7hq6Q2t9Rk+{AhKM0besBh@?EkQ@p7xj-~M zIblg(5nM)UQ3UfqVntD!a>i0c1uVAOT=)l4*Grq5zAb9g%x`CO^gEM?5hisuQBiH>SNWgnx1)1KaAwH0vL7C0J{G-PGgv}9W)3mW&3FU)870BH6)PH@CL z3*SV$6cqrUXnsKZP|@;LzKSQy^VKv&RZ&z#kl=!kw5s_Bf#OYJ%s&qKGp@C<<;^(F zvn$VRP6uJfLusR33d_sb1Asf=&BO4pEGZ4-k=k-XNWj+^5L$%orN+at_ADM^9&)RI zv&_2%U=a{Rt%ok7l`=M#AnpvNNHnxSif$KyRZ6`GsKq2eYGY|AyJZDro}E6A&Wfm2 zuX-P#dVq9DYC{$TP;lV#NTNKo-PjF>34;Kz2LOS_y3=}6OF5m8$XAkL-z-N`V%~)0 z=j_X`NkuMch~_jX8kl?Ig1+Jor%=ToOq#Snf)@wy4o!4gMyoRetRF9h6VQX`mgqM_XoNFbdi(-RPT zu;lpbiX3q;974Q74aZ^~;PKPL&J^94MC*!nFGn%q^Wjw`%!}Ul3tbkJO;MqO6d4*C zL7W!_H5_Bi8&D+{6@dv53<4n9Ldg6K_L*EaK)}JtNg3P0eYuO*QFNr#^eQSc#qU$W z831Vo5QGAFZp2WFt;6=g1jxR^1M&I+K!9L_g``N(3rEC=62Vv8_Y=qkW-j7mu<^{& zE(;I{U6c-zd%3F%!qKTZhfQj!+~o9!gGO#Hj#!2{V3shL?Lo$oDI>PowXU2D0_Cwa zn-C#I*CYfJ;Gs|%8e&mE4#f_nu0aUZS_4djFhg+|GN@95AlQP^sKF8@ItyCOM3K-t zhR1bfg%lWE=p2>nIcRr*b=k^}#1Kpn6~IM6C{RZ&skzeQ2*{%%0g;W6wcPYBT$Wkt z$u>rgcXu8AvJ%L>85u6y3Q$0KJJdQPD4u=8)Df5KMj&9W__G}Hy#yM}qKH`+;vkTl zkwH38-PA(#r#4g@6>P6_5#y>z5K919 zu!itMg;S?hb`(i8G!;!Gy$$7LHHc-MONi6daX64Unq;U!&k(dP1L=+r749{%*!K`~ zG|}J+2n$Y3%LWGm>vCqzOn_5oA&tr6U?XI{7878CyY2HNeaVK3hJnF2Uy2FhnxZG7 zAoY+A5VRD2R!3 z=odDPiBnK_mQ1Z0LxK~Re1iUEs5E=bZj4oclkF0D9oQatvc_V25ITW8i%Bsv9%o)&+RvCYY)lbV1e{#YsGt`7lh^D5Quykqqoh zZHOks`H+RQz~0o5LcdFwZ^YLYzWu%xr$`{4z=A;pt#|67IpHD*hNsX#1Yk;gNF&0) z254A8C}1GLfk6U&@FY=F)twVXAvF>j3PPayz`9+7r&-Ht8%Z^j1jxd`TBys6a5muj z;M7HMVNR}gxi2}KnGu>4r6>=51Yr>S))W{}5F!}*VTQpjTf0>P0RV&~-`r3(p_2Kk z7MH=P2!zy&sd}NEyw6d6_}n*xnLaKq#j8NEGA8+T%XUhz7xl)CUq?84B)@L_qNz zo-j5H7;#xztrYh{@bXQ~Tiw=@*2n@hAPSiv0$2~Wsod6p!JATgY&={V7x$uj;D`)F z_6R=~V298af|Nlotb9r+pmE+f3Fk$HUv+*0i{HV~g4VM{ z))-Q0t5#RGC`cv{Ab+Dn_JoQH^r6)WPK~61xhSsdq#lR0-hFJEX}Me|8W&pf5=%Sz z@;>Atk|%U8L;^abQav=GdW7c_+2pwhPD&b;MF^lLW&#gDdQ3n`7Y+;yX zdtq7L-o^8<(-vBWOadlCZ00Pqnv4wfmJCaVC{;CMz3_T{S&yJMJ4E!;j#gSXc7o|M8dzeBVAOee{m+^^zZD oY5?MRoqHc+PNf78E;t2Hr2!cf5FtSn&;N_LBAh5l1m@p+fOfso;s5{u literal 0 HcmV?d00001 diff --git a/inst/app/www/favicon.ico b/inst/app/www/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4c0982c026551c9cf45043e2a9ce56f58ef9a817 GIT binary patch literal 3774 zcmbVPdr(y872nKcrvJ2QC*wGsRAiTzSg?>?a93a#c7X+#W!dKiG!!9-K;-=tQB24B zjCRt*m|)Ua)YO>z3>9P*6txqRm>Lrwkkqj?lGd6A&{ie}em&`PU%m*_j3tXjwR`&S-$5?iV3ruH0Kv-77nWteuL2Tvk3J369Jwf8iNx?pg_C@Un11n zg#g12#6@X_9j2)Bj>JXbQ(;Rwo-<6^9}w@0DREHU3ECgZgw41bagC{=eChg;Ch9`4U4EoO_qa5%z9u#X7=ovt; z`!ht^Phg(w27=swC(e5^-g^ji-$Crs_mG?SD})Pw7Waa(zJkC06{w>#usA;M4q-2| z8nv^Sm10PDnzWsX20Q!>yPAHz4!<7_se`}5#7Tb%M zn>j-9agBz=dW8|b%JXkAW)Bf@?XD)%4?%iGYhaT^i~KE-_d#j&&Z z;rMwT!tHn-+jHF@t|3oyEDo2ifZMqPb3MZ%HrFOl7(l3-&PTXEu49>F=erZ=`4V9c zsu{%=MDl{H+febo>l&^3Zu#!j6ZX5v^=!kj%3`>aV@GJ9v%VbF*^T&#K;bA`C*4w203P-icl^A%BMKR?@F5UF1erR9CmhT~INE~0s9B~H|p zGvC+D*HK@I_UdAkJ60e(PL=*fq-t`vW$tr*X*y^i?nt8lup3P;M8p{KEe za<0OuRn>Sd+l}zVRW{O}SP5 zFCTGsjPdf!!`o1WSMqZ(KdK5!C-=f2l(tVOr@zv<_L0o@e+d4L&!LVg#IcGMV%(BH z=OAJd)^T5cqkNw2wS2xl4#`%UPc@W5tI3AH{Wby|x3DCC6;g6`BeV1{QkT2{WyTEz zIB&xhFW?NFkK`wx8C%9Tdi)#sdYWpH^kghlj(*Ht`~l{~?t;Jh43w#7@I>tEP}y%G z$kmSmQv%haW`=wf)8^ORSc_*8^$1RA_4Nk#2j5|FaIetc7~K|Z6dYo`<#|c6FTYB@ zFMOVq-}HQZm(H%K!+Jr0()uy=*n@FCCCNdlJ!r|x#_83yQ|88;%*Qq3+I<_J6k~T| zC5r5&2uVGKS;?32gL;bls+0Qq@6p%MhQ9VTeDM0K_|)5h58r6T<^6Bq>d}KZy?z}&errG8Yk3Km_O;^Nw$11u z-*Fs~&le--N8b+jURs`ucB-LQ&dGdRHsIoGE%@loeYke?FnVZx{p}-^?_R?GEqaf) zp=Z;2TyHxja&Zi7Bj;mGzW+N5bNPLApWcD?Omkd!jmL_;D+_Uw&PK}LySk2Y+&~z= zME5V&im{)2ZWG?$^)kBFHR1gBt>W4K@%e2yw|$EkpSP*rcgB<#W9@mS5H)Tq1aq91 zxNQ86PccNzvYB+tvdsEBP1z3W70Q)s!uN$_F!+U@=akpt+hpcqU&bJ;9fbLPIfo?Eo+K*LjoNT) z!ost~HuG@n%H?9L(iu<1$9tU597-e{XEtbZ={xeBwb{j+3+yu$mZY0%mUB{VXPe^G<+&E)_2wl`94IeA*Qy$Eyj4+xXP3IL z%wp^#n@XzDcmAH2_?c7AYu0O2RQJ_+X{Lu8as+J3%|w2hX_R!$v=<=x@hta~>t`a% zed(L^QL4YvnHY0``u32`qz$kd7k;Pz$8fWG0H@;zp!ngysN#DA!-_`+ZYmTN>lBI~ W%_N?g*f7>j!engbU@no9xc>v_w5JCE literal 0 HcmV?d00001 diff --git a/man/runMetashark.Rd b/man/runMetashark.Rd new file mode 100644 index 0000000..236e059 --- /dev/null +++ b/man/runMetashark.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/runMetashark.R +\name{runMetashark} +\alias{runMetashark} +\title{Run MetaShARK} +\usage{ +runMetashark(...) +} +\description{ +Main function for launching the MetaShARK application. +MetaShARK (METAdata SHiny Automated Resource & Knowledge) is a web app +which is designed to help its user as much as possible for filling ecological +metadata. It uses the EML standard (cf. NCEAS work) to allow a full and +precise description of input datasets. +} +\author{ +Elie Arnaud +} diff --git a/tests/testthat.R b/tests/testthat.R new file mode 100644 index 0000000..a927017 --- /dev/null +++ b/tests/testthat.R @@ -0,0 +1,4 @@ +library(testthat) +library(MetaShARK) + +test_check("MetaShARK") diff --git a/tests/testthat/test-golem-recommended.R b/tests/testthat/test-golem-recommended.R new file mode 100644 index 0000000..fdf3e10 --- /dev/null +++ b/tests/testthat/test-golem-recommended.R @@ -0,0 +1,40 @@ +context("golem tests") + +library(golem) + +test_that("app ui", { + ui <- app_ui() + expect_shinytaglist(ui) +}) + +test_that("app server", { + server <- app_server + expect_is(server, "function") +}) + +# Configure this test to fit your need +test_that( + "app launches",{ + skip_on_cran() + skip_on_travis() + skip_on_appveyor() + x <- processx::process$new( + "R", + c( + "-e", + "setwd('../../'); pkgload::load_all();run_app()" + ) + ) + Sys.sleep(5) + expect_true(x$is_alive()) + x$kill() + } +) + + + + + + + + diff --git a/vignettes/.gitignore b/vignettes/.gitignore new file mode 100644 index 0000000..097b241 --- /dev/null +++ b/vignettes/.gitignore @@ -0,0 +1,2 @@ +*.html +*.R diff --git a/vignettes/MetaShARK.Rmd b/vignettes/MetaShARK.Rmd new file mode 100644 index 0000000..dbabff3 --- /dev/null +++ b/vignettes/MetaShARK.Rmd @@ -0,0 +1,19 @@ +--- +title: "MetaShARK" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{MetaShARK} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + +```{r setup} +library(MetaShARK) +```