From 17970577c81820bbc704428b0d923498bfd307ab Mon Sep 17 00:00:00 2001
From: Gowtham Rao
Date: Fri, 22 Jul 2022 20:57:31 -0400
Subject: [PATCH] Unreleased version
Unreleased version
---
DESCRIPTION | 3 +-
NAMESPACE | 2 +
R/FindOrphanConcepts.R | 2 +-
R/GetConceptRecordCount.R | 331 ++++++++++++++++++
...ountOfSourceCodesMappedToStandardConcept.R | 170 +++++++++
R/Private.R | 165 +++++++++
docs/pkgdown.yml | 2 +-
docs/reference/getConceptRecordCount.html | 128 +++++++
...tOfSourceCodesMappedToStandardConcept.html | 123 +++++++
docs/reference/getDomainInformation.html | 86 +++++
docs/reference/index.html | 12 +
docs/sitemap.xml | 9 +
extras/ConceptSetDiagnostics.pdf | Bin 174722 -> 184953 bytes
extras/tests/TestEunomia.R | 229 ------------
inst/csv/domains.csv | 10 +
man/getConceptRecordCount.Rd | 47 +++
...untOfSourceCodesMappedToStandardConcept.Rd | 44 +++
man/getDomainInformation.Rd | 17 +
tests/testthat/test-conceptPrevalence.R | 36 ++
tests/testthat/test-queryConceptTable.R | 47 ++-
tests/testthat/test-supportingFunctions.R | 42 +++
21 files changed, 1270 insertions(+), 235 deletions(-)
create mode 100644 R/GetConceptRecordCount.R
create mode 100644 R/GetCountOfSourceCodesMappedToStandardConcept.R
create mode 100644 docs/reference/getConceptRecordCount.html
create mode 100644 docs/reference/getCountOfSourceCodesMappedToStandardConcept.html
create mode 100644 docs/reference/getDomainInformation.html
delete mode 100644 extras/tests/TestEunomia.R
create mode 100644 inst/csv/domains.csv
create mode 100644 man/getConceptRecordCount.Rd
create mode 100644 man/getCountOfSourceCodesMappedToStandardConcept.Rd
create mode 100644 man/getDomainInformation.Rd
diff --git a/DESCRIPTION b/DESCRIPTION
index f3e5f67..55475b2 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -20,7 +20,8 @@ Imports:
SqlRender,
stringr,
stringdist,
- tidyr
+ tidyr,
+ tidyselect
Suggests:
readr,
remotes,
diff --git a/NAMESPACE b/NAMESPACE
index 9cffce1..b0614e4 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -9,8 +9,10 @@ export(getConceptAncestor)
export(getConceptDescendant)
export(getConceptIdDetails)
export(getConceptPrevalenceCounts)
+export(getConceptRecordCount)
export(getConceptRelationship)
export(getConceptSynonym)
+export(getCountOfSourceCodesMappedToStandardConcept)
export(getDomain)
export(getDrugIngredients)
export(getExcludedConceptsInConceptSetExpression)
diff --git a/R/FindOrphanConcepts.R b/R/FindOrphanConcepts.R
index 8542cb1..ef4e65b 100644
--- a/R/FindOrphanConcepts.R
+++ b/R/FindOrphanConcepts.R
@@ -61,7 +61,7 @@ findOrphanConcepts <- function(connectionDetails = NULL,
orphan_concept_table = paste0(tempTableName, "oo")
)
DatabaseConnector::executeSql(connection, sql)
-
+
sql <- "SELECT * FROM @orphan_concept_table;"
orphanConcepts <-
DatabaseConnector::renderTranslateQuerySql(
diff --git a/R/GetConceptRecordCount.R b/R/GetConceptRecordCount.R
new file mode 100644
index 0000000..1d27c95
--- /dev/null
+++ b/R/GetConceptRecordCount.R
@@ -0,0 +1,331 @@
+# Copyright 2022 Observational Health Data Sciences and Informatics
+#
+# This file is part of ConceptSetDiagnostics
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#' Given conceptId(s) get the record count.
+#'
+#' @description
+#' Given conceptId(s) get the record count.
+#'
+#' @template Connection
+#'
+#' @template ConceptIds
+#'
+#' @template CdmDatabaseSchema
+#'
+#' @template VocabularyDatabaseSchema
+#'
+#' @template TempEmulationSchema
+#'
+#' @param minCellCount The minimum cell count for fields containing person/subject count.
+#'
+#' @return
+#' Returns a tibble data frame.
+#'
+#' @export
+# function: getConceptRecordCount ----
+getConceptRecordCount <- function(conceptIds,
+ connection = NULL,
+ connectionDetails = NULL,
+ cdmDatabaseSchema,
+ vocabularyDatabaseSchema = cdmDatabaseSchema,
+ tempEmulationSchema = getOption("sqlRenderTempEmulationSchema"),
+ minCellCount = 0) {
+ if (is.null(connection)) {
+ connection <- DatabaseConnector::connect(connectionDetails)
+ on.exit(DatabaseConnector::disconnect(connection))
+ }
+
+ tempTableName <- loadTempConceptTable(
+ conceptIds = conceptIds,
+ connection = connection,
+ tempEmulationSchema = tempEmulationSchema
+ )
+
+ domains <-
+ getDomainInformation(packageName = "ConceptSetDiagnostics")
+ domains <- domains$wide %>%
+ dplyr::filter(.data$isEraTable == FALSE)
+ # filtering out ERA tables because they are supposed to be derived tables, and counting them is double counting
+
+ sqlDdlDrop <-
+ "DROP TABLE IF EXISTS @concept_count_temp;"
+ sqlDdlCreate <- "
+ CREATE TABLE @concept_count_temp (
+ concept_id INT,
+ event_year INT,
+ event_month INT,
+ concept_is_standard VARCHAR(1),
+ concept_count BIGINT,
+ subject_count BIGINT
+ );"
+ DatabaseConnector::renderTranslateExecuteSql(
+ connection = connection,
+ sql = sqlDdlDrop,
+ tempEmulationSchema = tempEmulationSchema,
+ concept_count_temp = paste0(tempTableName, "cc"),
+ progressBar = FALSE,
+ reportOverallTime = FALSE
+ )
+ DatabaseConnector::renderTranslateExecuteSql(
+ connection = connection,
+ sql = sqlDdlCreate,
+ tempEmulationSchema = tempEmulationSchema,
+ concept_count_temp = paste0(tempTableName, "cc"),
+ progressBar = FALSE,
+ reportOverallTime = FALSE
+ )
+ # REASON for many SQL --DISTINCT subject_count cannot be computed from aggregation query of calendar month level data
+ sql1 <- "INSERT INTO @concept_count_temp
+ SELECT @domain_concept_id concept_id,
+ YEAR(@domain_start_date) event_year,
+ MONTH(@domain_start_date) event_month,
+ 'Y' concept_is_standard,
+ COUNT_BIG(*) concept_count,
+ COUNT_BIG(DISTINCT person_id) subject_count
+ FROM @cdm_database_schema.@domain_table dt
+ WHERE @domain_concept_id IN (
+ SELECT DISTINCT concept_id
+ FROM @concept_id_universe
+ )
+ AND YEAR(@domain_start_date) > 0
+ AND @domain_concept_id > 0
+ GROUP BY @domain_concept_id,
+ YEAR(@domain_start_date),
+ MONTH(@domain_start_date);"
+ sql2 <- " INSERT INTO @concept_count_temp
+ SELECT @domain_concept_id concept_id,
+ YEAR(@domain_start_date) event_year,
+ 0 AS event_month,
+ 'Y' concept_is_standard,
+ COUNT_BIG(*) concept_count,
+ COUNT_BIG(DISTINCT person_id) subject_count
+ FROM @cdm_database_schema.@domain_table
+ WHERE @domain_concept_id IN (
+ SELECT DISTINCT concept_id
+ FROM @concept_id_universe
+ )
+ AND YEAR(@domain_start_date) > 0
+ AND @domain_concept_id > 0
+ GROUP BY @domain_concept_id,
+ YEAR(@domain_start_date);"
+ sql3 <- "INSERT INTO @concept_count_temp
+ SELECT @domain_concept_id concept_id,
+ 0 as event_year,
+ 0 as event_month,
+ 'Y' concept_is_standard,
+ COUNT_BIG(*) concept_count,
+ COUNT_BIG(DISTINCT person_id) subject_count
+ FROM @cdm_database_schema.@domain_table dt
+ WHERE @domain_concept_id IN (
+ SELECT DISTINCT concept_id
+ FROM @concept_id_universe
+ )
+ AND YEAR(@domain_start_date) > 0
+ AND @domain_concept_id > 0
+ GROUP BY @domain_concept_id;"
+
+
+ sql4 <- "INSERT INTO @concept_count_temp
+ SELECT @domain_concept_id concept_id,
+ YEAR(@domain_start_date) event_year,
+ MONTH(@domain_start_date) event_month,
+ 'N' concept_is_standard,
+ COUNT_BIG(*) concept_count,
+ COUNT_BIG(DISTINCT person_id) subject_count
+ FROM @cdm_database_schema.@domain_table dt
+ LEFT JOIN (
+ SELECT concept_id
+ FROM @vocabulary_database_schema.CONCEPT
+ WHERE standard_concept = 'S'
+ ) std
+ ON @domain_concept_id = std.concept_id
+ WHERE @domain_concept_id IN (
+ SELECT DISTINCT concept_id
+ FROM @concept_id_universe
+ )
+ AND YEAR(@domain_start_date) > 0
+ AND @domain_concept_id > 0
+ AND std.concept_id IS NULL
+ GROUP BY @domain_concept_id,
+ YEAR(@domain_start_date),
+ MONTH(@domain_start_date);"
+ sql5 <- " INSERT INTO @concept_count_temp
+ SELECT @domain_concept_id concept_id,
+ YEAR(@domain_start_date) event_year,
+ 0 AS event_month,
+ 'N' concept_is_standard,
+ COUNT_BIG(*) concept_count,
+ COUNT_BIG(DISTINCT person_id) subject_count
+ FROM @cdm_database_schema.@domain_table dt
+ LEFT JOIN (
+ SELECT concept_id
+ FROM @vocabulary_database_schema.CONCEPT
+ WHERE standard_concept = 'S'
+ ) std ON @domain_concept_id = std.concept_id
+ WHERE @domain_concept_id IN (
+ SELECT DISTINCT concept_id
+ FROM @concept_id_universe
+ )
+ AND YEAR(@domain_start_date) > 0
+ AND @domain_concept_id > 0
+ AND std.concept_id IS NULL
+ GROUP BY @domain_concept_id,
+ YEAR(@domain_start_date);"
+ sql6 <- " INSERT INTO @concept_count_temp
+ SELECT @domain_concept_id concept_id,
+ 0 AS event_year,
+ 0 AS event_month,
+ 'N' concept_is_standard,
+ COUNT_BIG(*) concept_count,
+ COUNT_BIG(DISTINCT person_id) subject_count
+ FROM @cdm_database_schema.@domain_table dt
+ LEFT JOIN (
+ SELECT concept_id
+ FROM @vocabulary_database_schema.CONCEPT
+ WHERE standard_concept = 'S'
+ ) std ON @domain_concept_id = std.concept_id
+ WHERE @domain_concept_id IN (
+ SELECT DISTINCT concept_id
+ FROM @concept_id_universe
+ )
+ AND YEAR(@domain_start_date) > 0
+ AND @domain_concept_id > 0
+ AND std.concept_id IS NULL
+ GROUP BY @domain_concept_id;"
+
+ for (i in (1:nrow(domains))) {
+ rowData <- domains[i, ]
+
+ DatabaseConnector::renderTranslateExecuteSql(
+ connection = connection,
+ sql = sql1,
+ tempEmulationSchema = tempEmulationSchema,
+ domain_table = rowData$domainTable,
+ domain_concept_id = rowData$domainConceptId,
+ cdm_database_schema = cdmDatabaseSchema,
+ domain_start_date = rowData$domainStartDate,
+ concept_count_temp = paste0(tempTableName, "cc"),
+ concept_id_universe = tempTableName,
+ progressBar = FALSE,
+ reportOverallTime = FALSE
+ )
+
+ DatabaseConnector::renderTranslateExecuteSql(
+ connection = connection,
+ sql = sql2,
+ tempEmulationSchema = tempEmulationSchema,
+ domain_table = rowData$domainTable,
+ domain_concept_id = rowData$domainConceptId,
+ cdm_database_schema = cdmDatabaseSchema,
+ domain_start_date = rowData$domainStartDate,
+ concept_count_temp = paste0(tempTableName, "cc"),
+ concept_id_universe = tempTableName,
+ progressBar = FALSE,
+ reportOverallTime = FALSE
+ )
+
+ DatabaseConnector::renderTranslateExecuteSql(
+ connection = connection,
+ sql = sql3,
+ tempEmulationSchema = tempEmulationSchema,
+ domain_table = rowData$domainTable,
+ domain_concept_id = rowData$domainConceptId,
+ cdm_database_schema = cdmDatabaseSchema,
+ domain_start_date = rowData$domainStartDate,
+ concept_count_temp = paste0(tempTableName, "cc"),
+ concept_id_universe = tempTableName,
+ progressBar = FALSE,
+ reportOverallTime = FALSE
+ )
+ }
+
+ for (i in (1:nrow(domains))) {
+ rowData <- domains[i, ]
+ if (nchar(rowData$domainSourceConceptId) > 4) {
+ DatabaseConnector::renderTranslateExecuteSql(
+ connection = connection,
+ sql = sql4,
+ tempEmulationSchema = tempEmulationSchema,
+ domain_table = rowData$domainTable,
+ domain_concept_id = rowData$domainSourceConceptId,
+ cdm_database_schema = cdmDatabaseSchema,
+ domain_start_date = rowData$domainStartDate,
+ concept_count_temp = paste0(tempTableName, "cc"),
+ concept_id_universe = tempTableName,
+ vocabulary_database_schema = vocabularyDatabaseSchema,
+ progressBar = FALSE,
+ reportOverallTime = FALSE
+ )
+
+ DatabaseConnector::renderTranslateExecuteSql(
+ connection = connection,
+ sql = sql5,
+ tempEmulationSchema = tempEmulationSchema,
+ domain_table = rowData$domainTable,
+ domain_concept_id = rowData$domainSourceConceptId,
+ cdm_database_schema = cdmDatabaseSchema,
+ domain_start_date = rowData$domainStartDate,
+ concept_count_temp = paste0(tempTableName, "cc"),
+ concept_id_universe = tempTableName,
+ vocabulary_database_schema = vocabularyDatabaseSchema,
+ progressBar = FALSE,
+ reportOverallTime = FALSE
+ )
+
+ DatabaseConnector::renderTranslateExecuteSql(
+ connection = connection,
+ sql = sql6,
+ tempEmulationSchema = tempEmulationSchema,
+ domain_table = rowData$domainTable,
+ domain_concept_id = rowData$domainSourceConceptId,
+ cdm_database_schema = cdmDatabaseSchema,
+ domain_start_date = rowData$domainStartDate,
+ concept_count_temp = paste0(tempTableName, "cc"),
+ concept_id_universe = tempTableName,
+ vocabulary_database_schema = vocabularyDatabaseSchema,
+ progressBar = FALSE,
+ reportOverallTime = FALSE
+ )
+ }
+ }
+ retrieveSql <- "SELECT concept_id, event_year, event_month,
+ sum(concept_count) concept_count,
+ max(subject_count) subject_count
+ FROM @concept_count_temp c
+ GROUP BY concept_id, event_year, event_month
+ ORDER By concept_id, event_year, event_month;"
+ data <- renderTranslateQuerySql(
+ connection = connection,
+ sql = retrieveSql,
+ concept_count_temp = paste0(tempTableName, "cc"),
+ snakeCaseToCamelCase = TRUE
+ ) %>%
+ dplyr::tibble() %>%
+ dplyr::filter(.data$subjectCount > minCellCount)
+
+ # i was thinking of keeping counts at the table level - but the file size became too big
+ # so i decided to not include them
+ DatabaseConnector::renderTranslateExecuteSql(
+ connection = connection,
+ sql = sqlDdlDrop,
+ tempEmulationSchema = tempEmulationSchema,
+ concept_count_temp = paste0(tempTableName, "cc"),
+ progressBar = FALSE,
+ reportOverallTime = FALSE
+ )
+ return(data)
+}
diff --git a/R/GetCountOfSourceCodesMappedToStandardConcept.R b/R/GetCountOfSourceCodesMappedToStandardConcept.R
new file mode 100644
index 0000000..6a267cc
--- /dev/null
+++ b/R/GetCountOfSourceCodesMappedToStandardConcept.R
@@ -0,0 +1,170 @@
+# Copyright 2022 Observational Health Data Sciences and Informatics
+#
+# This file is part of ConceptSetDiagnostics
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#' Given conceptId(s) get the counts of occurrence with mapping.
+#'
+#' @description
+#' Given conceptId(s) get the counts of occurrence with mapping.
+#'
+#' @template Connection
+#'
+#' @template ConceptIds
+#'
+#' @template CdmDatabaseSchema
+#'
+#' @template TempEmulationSchema
+#'
+#' @param minCellCount The minimum cell count for fields containing person/subject count.
+#'
+#' @return
+#' Returns a tibble data frame.
+#'
+#' @export
+# function: getCountOfSourceCodesMappedToStandardConcept ----
+getCountOfSourceCodesMappedToStandardConcept <- function(conceptIds,
+ connection = NULL,
+ connectionDetails = NULL,
+ cdmDatabaseSchema,
+ tempEmulationSchema = getOption("sqlRenderTempEmulationSchema"),
+ minCellCount = 0) {
+ if (is.null(connection)) {
+ connection <- DatabaseConnector::connect(connectionDetails)
+ on.exit(DatabaseConnector::disconnect(connection))
+ }
+
+ tempTableName <- loadTempConceptTable(
+ conceptIds = conceptIds,
+ connection = connection,
+ tempEmulationSchema = tempEmulationSchema
+ )
+
+ domains <-
+ getDomainInformation(packageName = "ConceptSetDiagnostics")
+ domains <- domains$wide %>%
+ dplyr::filter(nchar(.data$domainSourceConceptId) > 1)
+
+ sqlConceptMapping <-
+ " DROP TABLE IF EXISTS @concept_mapping_table;
+ CREATE TABLE @concept_mapping_table (concept_id INT,
+ source_concept_id INT,
+ domain_table VARCHAR(20),
+ concept_count BIGINT,
+ subject_count BIGINT);"
+ DatabaseConnector::renderTranslateExecuteSql(
+ connection = connection,
+ sql = sqlConceptMapping,
+ tempEmulationSchema = tempEmulationSchema,
+ concept_mapping_table = paste0(tempTableName, "cc"),
+ progressBar = FALSE,
+ reportOverallTime = FALSE
+ )
+
+ sqlMapping <- "
+ INSERT INTO @concept_mapping_table
+ SELECT @domain_concept_id concept_id,
+ @domain_source_concept_id source_concept_id,
+ '@domainTableShort' domain_table,
+ COUNT(*) AS concept_count,
+ COUNT(DISTINCT person_id) AS subject_count
+ FROM @cdm_database_schema.@domain_table
+ WHERE
+ @domain_source_concept_id IS NOT NULL
+ AND @domain_source_concept_id > 0
+ AND @domain_concept_id IN
+ (SELECT concept_id FROM @concept_id_table)
+ GROUP BY @domain_concept_id,
+ @domain_source_concept_id
+ ORDER BY @domain_concept_id,
+ @domain_source_concept_id;"
+
+ conceptMapping <- list()
+ for (i in (1:nrow(domains))) {
+ rowData <- domains[i, ]
+
+ DatabaseConnector::renderTranslateExecuteSql(
+ connection = connection,
+ sql = sqlMapping,
+ tempEmulationSchema = tempEmulationSchema,
+ domain_table = rowData$domainTable,
+ domain_concept_id = rowData$domainConceptId,
+ domain_source_concept_id = rowData$domainSourceConceptId,
+ cdm_database_schema = cdmDatabaseSchema,
+ concept_id_table = tempTableName,
+ concept_mapping_table = paste0(tempTableName, "cc"),
+ domainTableShort = rowData$domainTableShort,
+ reportOverallTime = FALSE,
+ progressBar = FALSE
+ )
+ }
+ sql <- "SELECT DISTINCT *
+ FROM @concept_mapping_table
+ ORDER BY domain_table,
+ concept_id,
+ source_concept_id,
+ concept_count,
+ subject_count;"
+ conceptMapping <-
+ DatabaseConnector::renderTranslateQuerySql(
+ connection = connection,
+ sql = sql,
+ concept_mapping_table = paste0(tempTableName, "cc"),
+ snakeCaseToCamelCase = TRUE,
+ tempEmulationSchema = tempEmulationSchema
+ )
+ conceptMapping <- conceptMapping %>%
+ dplyr::arrange(
+ .data$domainTable,
+ .data$conceptId,
+ .data$sourceConceptId,
+ .data$conceptCount,
+ .data$subjectCount
+ ) %>%
+ dplyr::tibble()
+
+ if (nrow(conceptMapping) > 0) {
+ conceptMapping <- dplyr::bind_rows(
+ conceptMapping,
+ conceptMapping %>%
+ dplyr::group_by(
+ .data$conceptId,
+ .data$sourceConceptId
+ ) %>%
+ dplyr::summarise(
+ conceptCount = sum(.data$conceptCount),
+ subjectCount = max(.data$subjectCount),
+ .groups = "keep"
+ ) %>%
+ dplyr::mutate(domainTable = "All")
+ ) %>%
+ dplyr::distinct()
+ }
+
+ conceptMapping <- conceptMapping %>%
+ dplyr::filter(.data$subjectCount > minCellCount)
+
+ sqlDdlDrop <-
+ "DROP TABLE IF EXISTS @concept_mapping_table;"
+ DatabaseConnector::renderTranslateExecuteSql(
+ connection = connection,
+ sql = sqlDdlDrop,
+ concept_mapping_table = paste0(tempTableName, "cc"),
+ tempEmulationSchema = tempEmulationSchema,
+ progressBar = FALSE,
+ reportOverallTime = FALSE
+ )
+ return(conceptMapping)
+}
diff --git a/R/Private.R b/R/Private.R
index ca8f5d7..dd437ce 100644
--- a/R/Private.R
+++ b/R/Private.R
@@ -118,3 +118,168 @@ dropTempConceptTable <-
concept_id_table = tempTableName
)
}
+
+
+#' Get domain information
+#'
+#' @param packageName e.g. 'CohortDiagnostics'
+#'
+#' @return
+#' A list with two tibble data frame objects with domain information represented in wide and long format respectively.
+getDomainInformation <- function(packageName = NULL) {
+ domains <-
+ readr::read_csv(system.file(file.path("csv", "domains.csv"),
+ package = "ConceptSetDiagnostics"
+ ),
+ col_types = readr::cols()
+ )
+
+ domains <- domains %>%
+ .replaceNaInDataFrameWithEmptyString() %>%
+ dplyr::mutate(domainTableShort = stringr::str_sub(
+ string = toupper(.data$domain),
+ start = 1,
+ end = 2
+ )) %>%
+ dplyr::mutate(
+ domainTableShort = dplyr::case_when(
+ stringr::str_detect(string = tolower(.data$domain), pattern = "era") ~ paste0(.data$domainTableShort, "E"),
+ TRUE ~ .data$domainTableShort
+ )
+ )
+
+ domains$domainConceptIdShort <-
+ stringr::str_replace_all(
+ string = sapply(
+ stringr::str_extract_all(
+ string = camelCaseToTitleCase(snakeCaseToCamelCase(domains$domainConceptId)),
+ pattern = "[A-Z]"
+ ),
+ paste,
+ collapse = " "
+ ),
+ pattern = " ",
+ replacement = ""
+ )
+ domains$domainSourceConceptIdShort <-
+ stringr::str_replace_all(
+ string = sapply(
+ stringr::str_extract_all(
+ string = camelCaseToTitleCase(snakeCaseToCamelCase(domains$domainSourceConceptId)),
+ pattern = "[A-Z]"
+ ),
+ paste,
+ collapse = " "
+ ),
+ pattern = " ",
+ replacement = ""
+ )
+ domains <- domains %>%
+ dplyr::mutate(isEraTable = stringr::str_detect(
+ string = .data$domainTable,
+ pattern = "era"
+ ))
+ data <- list()
+ data$wide <- domains
+ data$long <- dplyr::bind_rows(
+ data$wide %>%
+ dplyr::select(
+ .data$domainTableShort,
+ .data$domainTable,
+ .data$domainConceptIdShort,
+ .data$domainConceptId
+ ) %>%
+ dplyr::rename(
+ domainFieldShort = .data$domainConceptIdShort,
+ domainField = .data$domainConceptId
+ ),
+ data$wide %>%
+ dplyr::select(
+ .data$domainTableShort,
+ .data$domainSourceConceptIdShort,
+ .data$domainTable,
+ .data$domainSourceConceptId
+ ) %>%
+ dplyr::rename(
+ domainFieldShort = .data$domainSourceConceptIdShort,
+ domainField = .data$domainSourceConceptId
+ )
+ ) %>%
+ dplyr::distinct() %>%
+ dplyr::filter(.data$domainFieldShort != "") %>%
+ dplyr::mutate(eraTable = stringr::str_detect(
+ string = .data$domainTable,
+ pattern = "era"
+ )) %>%
+ dplyr::mutate(isSourceField = stringr::str_detect(
+ string = .data$domainField,
+ pattern = "source"
+ ))
+ return(data)
+}
+
+.replaceNaInDataFrameWithEmptyString <- function(data) {
+ # https://github.com/r-lib/tidyselect/issues/201
+ data %>%
+ dplyr::collect() %>%
+ dplyr::mutate(dplyr::across(
+ tidyselect:::where(is.character),
+ ~ tidyr::replace_na(.x, as.character(""))
+ )) %>%
+ dplyr::mutate(dplyr::across(
+ tidyselect:::where(is.logical),
+ ~ tidyr::replace_na(.x, as.character(""))
+ )) %>%
+ dplyr::mutate(dplyr::across(
+ tidyselect:::where(is.numeric),
+ ~ tidyr::replace_na(.x, as.numeric(""))
+ ))
+}
+
+
+# private function - not exported
+camelCaseToTitleCase <- function(string) {
+ string <- gsub("([A-Z])", " \\1", string)
+ string <- gsub("([a-z])([0-9])", "\\1 \\2", string)
+ substr(string, 1, 1) <- toupper(substr(string, 1, 1))
+ return(string)
+}
+
+# private function - not exported
+snakeCaseToCamelCase <- function(string) {
+ string <- tolower(string)
+ for (letter in letters) {
+ string <-
+ gsub(paste("_", letter, sep = ""), toupper(letter), string)
+ }
+ string <- gsub("_([0-9])", "\\1", string)
+ return(string)
+}
+
+# private function - not exported
+camelCaseToSnakeCase <- function(string) {
+ string <- gsub("([A-Z])", "_\\1", string)
+ string <- tolower(string)
+ string <- gsub("([a-z])([0-9])", "\\1_\\2", string)
+ return(string)
+}
+
+# private function - not exported
+titleCaseToCamelCase <- function(string) {
+ string <- stringr::str_replace_all(
+ string = string,
+ pattern = " ",
+ replacement = ""
+ )
+ substr(string, 1, 1) <- tolower(substr(string, 1, 1))
+ return(string)
+}
+
+# private function - not exported
+quoteLiterals <- function(x) {
+ if (is.null(x)) {
+ return("")
+ } else {
+ return(paste0("'", paste(x, collapse = "', '"), "'"))
+ }
+}
diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml
index 96731be..eac562e 100644
--- a/docs/pkgdown.yml
+++ b/docs/pkgdown.yml
@@ -2,5 +2,5 @@ pandoc: 2.17.1.1
pkgdown: 2.0.6
pkgdown_sha: ~
articles: {}
-last_built: 2022-07-22T02:24Z
+last_built: 2022-07-22T22:11Z
diff --git a/docs/reference/getConceptRecordCount.html b/docs/reference/getConceptRecordCount.html
new file mode 100644
index 0000000..795baa7
--- /dev/null
+++ b/docs/reference/getConceptRecordCount.html
@@ -0,0 +1,128 @@
+
+Given conceptId(s) get the record count. — getConceptRecordCount • ConceptSetDiagnostics
+
+
+
+
+
+
+
+
+
Given conceptId(s) get the record count.
+
+
+
+
getConceptRecordCount (
+ conceptIds ,
+ connection = NULL ,
+ connectionDetails = NULL ,
+ cdmDatabaseSchema ,
+ vocabularyDatabaseSchema = cdmDatabaseSchema ,
+ tempEmulationSchema = getOption ( "sqlRenderTempEmulationSchema" ) ,
+ minCellCount = 0
+)
+
+
+
+
Arguments
+
conceptIds
+An array of Concept ids.
+
+
+connection
+An object of type connection
as created using the
+connect
function in the
+DatabaseConnector package. Can be left NULL if connectionDetails
+is provided, in which case a new connection will be opened at the start
+of the function, and closed when the function finishes.
+
+
+connectionDetails
+An object of type connectionDetails
as created using the
+createConnectionDetails
function in the
+DatabaseConnector package. Can be left NULL if connection
is
+provided.
+
+
+cdmDatabaseSchema
+Schema name where your patient-level data in OMOP CDM format resides.
+Note that for SQL Server, this should include both the database and
+schema name, for example 'cdm_data.dbo'.
+
+
+vocabularyDatabaseSchema
+The schema name of containing the vocabulary tables.
+
+
+tempEmulationSchema
+Some database platforms like Oracle and Impala do not truly support temp tables. To emulate temp
+tables, provide a schema with write privileges where temp tables can be created.
+
+
+minCellCount
+The minimum cell count for fields containing person/subject count.
+
+
+
+
Value
+
+
+
Returns a tibble data frame.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/reference/getCountOfSourceCodesMappedToStandardConcept.html b/docs/reference/getCountOfSourceCodesMappedToStandardConcept.html
new file mode 100644
index 0000000..d803cc5
--- /dev/null
+++ b/docs/reference/getCountOfSourceCodesMappedToStandardConcept.html
@@ -0,0 +1,123 @@
+
+Given conceptId(s) get the counts of occurrence with mapping. — getCountOfSourceCodesMappedToStandardConcept • ConceptSetDiagnostics
+
+
+
+
+
+
+
+
+
Given conceptId(s) get the counts of occurrence with mapping.
+
+
+
+
getCountOfSourceCodesMappedToStandardConcept (
+ conceptIds ,
+ connection = NULL ,
+ connectionDetails = NULL ,
+ cdmDatabaseSchema ,
+ tempEmulationSchema = getOption ( "sqlRenderTempEmulationSchema" ) ,
+ minCellCount = 0
+)
+
+
+
+
Arguments
+
conceptIds
+An array of Concept ids.
+
+
+connection
+An object of type connection
as created using the
+connect
function in the
+DatabaseConnector package. Can be left NULL if connectionDetails
+is provided, in which case a new connection will be opened at the start
+of the function, and closed when the function finishes.
+
+
+connectionDetails
+An object of type connectionDetails
as created using the
+createConnectionDetails
function in the
+DatabaseConnector package. Can be left NULL if connection
is
+provided.
+
+
+cdmDatabaseSchema
+Schema name where your patient-level data in OMOP CDM format resides.
+Note that for SQL Server, this should include both the database and
+schema name, for example 'cdm_data.dbo'.
+
+
+tempEmulationSchema
+Some database platforms like Oracle and Impala do not truly support temp tables. To emulate temp
+tables, provide a schema with write privileges where temp tables can be created.
+
+
+minCellCount
+The minimum cell count for fields containing person/subject count.
+
+
+
+
Value
+
+
+
Returns a tibble data frame.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/reference/getDomainInformation.html b/docs/reference/getDomainInformation.html
new file mode 100644
index 0000000..f4fe5e4
--- /dev/null
+++ b/docs/reference/getDomainInformation.html
@@ -0,0 +1,86 @@
+
+Get domain information — getDomainInformation • ConceptSetDiagnostics
+
+
+
+
+
+
+
+
+
Get domain information
+
+
+
+
getDomainInformation ( packageName = NULL )
+
+
+
+
Arguments
+
packageName
+e.g. 'CohortDiagnostics'
+
+
+
+
Value
+
+
+
A list with two tibble data frame objects with domain information represented in wide and long format respectively.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/reference/index.html b/docs/reference/index.html
index 626d0bb..33371e5 100644
--- a/docs/reference/index.html
+++ b/docs/reference/index.html
@@ -77,6 +77,10 @@
get concept id count
+
+ getConceptRecordCount()
+
+ Given conceptId(s) get the record count.
getConceptRelationship()
@@ -85,10 +89,18 @@
+ getCountOfSourceCodesMappedToStandardConcept()
+
+ Given conceptId(s) get the counts of occurrence with mapping.
getDomain()
Get all the domain id(s) in the vocabulary schema.
+
+ getDomainInformation()
+
+ Get domain information
getDrugIngredients()
diff --git a/docs/sitemap.xml b/docs/sitemap.xml
index 4a3b03a..fe2b9c7 100644
--- a/docs/sitemap.xml
+++ b/docs/sitemap.xml
@@ -48,6 +48,9 @@
/reference/getConceptPrevalenceCountsForConceptIds.html
+
+ /reference/getConceptRecordCount.html
+
/reference/getConceptRelationship.html
@@ -66,12 +69,18 @@
/reference/getConceptSynonym.html
+
+ /reference/getCountOfSourceCodesMappedToStandardConcept.html
+
/reference/getDeepConceptRelationship.html
/reference/getDomain.html
+
+ /reference/getDomainInformation.html
+
/reference/getDrugIngredients.html
diff --git a/extras/ConceptSetDiagnostics.pdf b/extras/ConceptSetDiagnostics.pdf
index c48dc7f721d24f2abbefe43d42f5febe3a24eed2..3c2d262f2a0f1b98056da2c5ae26f983b8a8395b 100644
GIT binary patch
delta 112490
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 bA&C?sSavmgdYp(4OmvoH%tbmAp
zs!VK}3RL}S$GvEK#-DF2oL;b8mTW3+(pGytb-U)yJCoMZrrr83pLC2eT%Q_>RiVqV
zvn&?WcDh+Al@w1>Wh=EjqDjS`HY|A|HhDs4Wj>yp`t4~st{4N=lzqWN-Yx~d7Y-&+*0=0Ho9^z_TtsUU*A5G?Rt!SYjL|!
zinje>(?lo8JpkvQjHwDS^QI_kVZ}BkGjz-u<$QiqH&df{+seTCEQES=I)ZQn(n99+
zvu|HS?7gVUU}D^RD;eS0Kr8ZypKd%C$n9FVZ-+Bev9Z8XpUXXMjcRyF+ib0U;MBC$
zUvr1@Gykw462shU4e4fp+E5ZL|E92kiE=pmWXl>6RAO$8P!3
zu-RAsZHay>M@-uF%X|p#Np$(x*i8O;i64)~lim08Lqj8!25GxIeVBT-SBhUowLW#X
zdWST4u<2fd&!bD)@Ut(&{%y-go$0f8++AxU&0&jZ`F(0ve0&DwueRU%DW#$=QdBPL
zp3ego=8MU!MTu*A2`j?gxjt}cV55a{-}YKH^H_uiageD)6(_n>9>gr;3y6;FQ;cZ0E7qtss~8!oDGfO}=?gUuwv74pHI{+=VoX+Ej}WETO(xytAS)U9`<{aAj+JGu`L
zu>!&A7ESH&6^hI*dd8=7fz)`cP{;R{EAAF{2Qm
zY#`D?3qR`1H>(=ZNap5jRl*L>kDu*SPwDkqX?^mONovcDvT)-?oEIgEkDz8TcRw(P
zkfR9rrM#cHWqz?ug7GWzQEU0Q&8V8e5~7oSpx=VV`gRc|GkIw?)x)U*AG5nbqE}Sa
zC@xpYYRp}~qu-O32O(Ou8nGGw?z5^h9dz~u!SY0UIy0vCrf2J{vkly-
zC38N1q4A3brO1fa;Mbf%Y-niwAgX!eEMQlf@mLM*kR|Sdm&Jd_Tz0#KouQj6!0pMR
z4nD&J`}v)>oNj}$E0=cLSZ4O!*Gw;2S-i{hZEgx{lvs8!e!g;AfESPIa9Ywu(M6TJ
z%4x^;uUBu|nv~WzeIEPhG4$1YP4-Rz_g5l_$>hvz
z|1K;Ts-}PU9zo(wd&a|Q)_4)}jMghMe~%J?K@4ZYS=VDca0GsjiNmAurU9&<-yn-sHS-St)_m*_TZQ!Qy%yg%JJKh
zCt<=x?9qt-I7}#MFqD`MW5i<2($o*WZ+;#
z7IcXi0kZgG&+B&s0t~={y1Rq{7`;M^|F=q9#FQiHSkHkCpmHOUMnXVK6m+@%t%Q#$
zh{0ej6a);^M{@r^EQMjdlrIV9d@dVM8$t7bTeuSVF<50lMgMv9P|ai3(vZ7I
zBmSEQ#0oKIn=gL|tgP`&%xWpyMWoC#o2_sjXaP5MYZ5#wYb;}|EpMS$Xw(b1!vd`jy%CC>6(+{T`m|K|04i>U%#uqlX
z&vH;J(zDmraQE%8(2<5aytZ@b8vYe@mL6KqG9E<4UaF@Tn@p7CN+Z@2!_yY0`rsD)
zZOc5zbTku}=~$BZ3|gEEJ1?iK6t$EoZp#zO?>qFoPHl0&XVNP7)rzjQ7x{<-7ICeW
zS@L|fi%^@r(sJ|`{ly%rCptRKbO!h{8n*KJF`5wjf}zwIbihzSIQv?1T&HqwgEeP0
ztGq(qfBpcq-x&|e{Db8f(6$jBM{>oXVJzeu;hF()LM2l}DJ
zGcrGW`|LBav{Qb%#lLnk4VyLZVq2w|bRm9)`@s4kO}>Q7jlSh*3FZ-kD#q5XEt1|1
z{twC|as{WtJ`f$y+8OTS*=-~eXUJ}IMiBA(@vYg#88*rai`-dhc<#tRO9f|~FpuDU
zO-9(w+5MEa+j_#0@;Ta4+fhQ^jzL8`
z;V@qz))c1za
zqO$a*Y}{@8BX9EXJQLeN?P041=-+2C`;7@&e#!UT={2q8vxrIHsWOSx7o*0zZz)0$
zSi}+aM1m(0`B`qbShqgOEa@&b*FD9v-|S1lc4gdd{y^~luUNLReaERCbC^r9LZn?bDt-s^$*nMzPTE#BF_g-q8f@mdR#58`Rmh?Vn$%6p>@onx4HeDAd;%
zD=z6wwD@VFF!H^pIjbj=`57m{rkCxvI1d}aGPQRfdg@lITtA^~Ows~}NobO${5{GP
zpwK(quz*%d-Ye!7d>7zsou+14WBj5_IwsFYD)_(Nex5g+T{2WqQ~seqc4f;X@JUjp
z%M;eik4LN+vu*|b>@lVUutnn6mOOlN#FZ`(xXKFza&FX^$4FSE*^E3mNR?-lh%N|8
z_u!Ab!ds}Fw%Gj@z|{1nxU}67H^4aijb8dme#VWr$tKZuFFE#sG&R{?+(Bz(epj{L
zpu+cpoW4)juu>CckQy)c2(PAh-|yo$7i<&|TRYsFDPfsm)}1O|hGLhc%T(k~8Qzmp
z2!EuG&&^xp+kUefn8@OQ2uSrpCOx=u$!ALRd)=+8sf$i;bx1mpl`aal{%53Yr7zw@0Qppa
z%fsXV$*cywViv@!7$$6`PNLb@UHeRmJ^{|xS$BvFuLO-mBvQ3pzbaevK)U6{+aA}&
zA}wn&*^i&4zq{rOQwb9!8g62&KZSa3s~v6xhNg_amqaoWwyzpr$rEQ8s$aHcj46C8
z)djI5xqIg0EzFPghp`{aC^+j}9E1`xhM0}_u}z}>gTKKKz>o8kU_@m^osUW8$jSYi
zS0^p~f2hkNO$J6Cz$7f_2?9@Ua^RdgW;B=qN6ERKQIHZ1
zri;O#;~yo72Gi1DU;_+NDuFb|S_#D8;vB!JM0&ta>o^)A^H0x98f;=Bl)EG+pGpUb)9!K>gpmztsfZ;xa3-bz&f(H`6P0j?r
zXtX}9Mjm2dm%iD4ZS3>$fet64(KGqy$ANT&Phj+1-n__848z
zzi1#q%c^CHe)V#)7U_GISBdlKlY=&cMdpjucfMRF)62ykAXc$>M$`ey&Ou7du?t)l
zS+*a7@hy~f8@O#!PvOnkza+_^Zzsw42|M+=#}>Z=%4a*c)9;pCpDx|ycP87HnTG#e
zto|nleDy&>TA^+z^A_y$Yih?1G{&0PafHjU0-aEKiVyYq1Ko`5)MsV7mpnJ#<0lo#
zY3D2qE^pXjUkGT3Z!W5|^+n3=@mdU6TW4LMai$&%eN)fU?YcNzEl%4cvDDJpC9(f#
zRj&F+BeRyvI5Pjur=Ax2OlXxhXKYnhSKYLe+&vGpiOJZMym`dyQr~VKxnaiTdps`N
zp6tr2&sL!|&I-Pd@>IXf;7;xCDWYgrVnMlw|1@PFh)~{R+$$umIq&^eVILK5W97slGa-BW
zo!@)-)BrZfh^4!$I}&|=7?G3H?_|{LQ9*fs-yXdyW8Y+08NT*4pfK!BbxPRAmRv1!
z1!;2BZ6*t=R#bghwEx#oCD*ZMpN0Xi2j2R(?sMe`tY^-L!oD?PCLTHjOd#&vA|Rt}
zbi*RbU-hg$fp0rse62us51gi-L!RH{>a&b7p#yAi*k)XSamT~?whoyIvKwD7KW&jd
z<$6gn$umW^^uhNG*KTaoxN%2Vl%n1){tWq$IdOHbQ#sy9I)nI&EbLW2jy40m
zzz_rZ=?cc}b8JPa`}wzx+z+qcXzI5epP72&p+ACoEmW8U3zC!
zCqCY(qCPBbvHX+7=5&yaefGpoW*;)}xeQ%+=!<>qgMiMwVVQ#`UpTQ~(Q3GHc131q
z``+Gp`7b{jha0^k^_IB%&^D|`DX*96e9WMD!>NkDsTY|e_3|6-b~64deT-*=OCNb~
zJaC!cWtrnLV3TkhL}b6N0Td?SKs@R|&2>{CJ?S{OZF55d_>z8HulLvtz$hN86&ajb
z5d}Ch8Gfr3R=@&xJ;MmBMX~^#52*=pA#lJ~iwTg7Vg)1-
z>j;pR5ts+>`}yckM~ndfO*VXRrvG=I;D2zM#PAU?fEI*oBc+eLrl}KP5;7Tvr>A}>
z;JhZG`vTs4|M8lXUX>k&v(WTER-H@}Jc6`Eo{EFOOpiFba27|b=
zmZpkFV;yOC@1}}4IgDK1T@tZWe6Daae0Q?TWOi*Ow*nE(pOmxh8H_34d(vzxg8c~#9n|{OJPnpSv?MlvPFV0o#fak%TkDX{X(mWaQPZgGLWkRWW@zszZg0pXHMXXxQ
zKPhrv_o@z-G`Gxfw7c!nCeC3BYGPK<7J>3x#soZioQD$CP;F*c_-uOB|G8awH;nLe>Ps$CNT_x5v{%L_1GBczN^|96qF>41zmp=S?94{m`>f|zEU%TO
zZvr-OAy!!X0`0CyT$tCQppQ{9rs|Ener5MO;*J_c)VEm?B7vfPfLiXEMWQs8d_nsR
zd@#*&gf>p6#`1z?-5l^)-XMu)P)@inxA94k=EdoTtIJ{dc^;2jI{dqgnD8+j;|FS3
zg{vWl2QmBUoDtSF=Q$BcTGjs6wzg-Cm#8mfhku&|JklVqW?5E-KOoBCkUKp+w!O3G
zrwu-j-eZZ{SkY|QekeD0Hce9)8+lNh)bakiV0z=0Ik`O7&%LDk`jO{i*C&)B$U0ZM
zL(UlUZSfCJFw8`sBD#7hRlrsBQ`aM#@`LL+H*J@EF2D6%c{ws=5ZS`RMi?h`ra^pN
zKe#=u*0L;wa4WIRBr&eZM~;X7;L$iehX;=$cL)zPUDw<-=EQd^T_V?ix=~|G_WC=t
zrtg{YQ}JB5eoD|5u2+G_9uRIJ$z#e}%W>x*!U2Ei_7{?E>odC@rsoyHDB4z$g7yVP
zVQ1#d$eH8?7!pqNge}iVpGERMi)lfT$4sDH1Xu-~;{4uGI=|#L&<0WSKVFV~S}+BQ
z76}Cf?-G1?$COU=Ypi5-ls6EHl_Eb^I#|>+mlju=@^YcP>fMdfHYzj7y=T5fk{1kk`0nNzV2Zd^gZBYa=JNO$FN#YucRg;fouyIrK$
zk&$r<-;vz$n?iRO=wc_74vOBW488?3zuRq2nw;hTEz)PoepB=CeGPwTP8VWgH|N&&
z@;9#xJ9_tt%TnJ4gCA#HewpCrLO=tN5A^O_ldC-IlaiA?oh!!UTc&7zSXQ(9^iX
zZN1;eTC`&o5OA|CXnv7(a!G5aNkWi2R~las^%+l}+#K7?vyb57Nr0rtCPw`3)6}GN
z+PjK*ZmFe<=>@m8XU>2AuBebnBCPwl>o81!#yCpB+u*!+LlA*9=kS1Q8&cbMD}kDS
zSUI8pavY0=+?l%=>zcs8k?qfq-f3lWM$%ufdMxYU*vCz+beHK2wmWPm^KxrpocrfB
zGMhF_D&JRv>Y4nfuDWfIXSf~WB^7h`|K}tT?h5C6fFhsn2_F;e2>WqTaU!6&(?pUS
z{|aLwK;$DXVTk~7rK=2h;O~?Uh(;h`LZCrN1?rDqhQNT~J`@<2gaKEw8Gu=DWo8fu
ziIkT40sX0wX$E@OKT`2v
z@0BGCBp`?vbo)TWMlJ&wM*P1Wum2(ECI(RFF@xtQaYvy87{Hob(58gEJJM$EdLqozEkIh<3Y=G>?I?w=JHp6hJ9Cm+(Yu=fgQ
zld;0`Uw^Zn*c9)O8*Y~0=l&x4@*uD{y*j#ZkKCtVn+%QRJ@-`LBW;hdJdyAXl0>0?
zQ5EueN>6VJlLC_hFHYG79-}HuPUD0!p(6
z=j`>KDX@Kh6BwOfv4?nq_f?;h!anU)m58ys{w5LcG)HsTuZ_89;*Kg;bKCXLrOa>f
zyS&QEyb1G_z@`XU2-g1eJjG_-F743@)%z6_LA9N(e`(*>Xh`&1T~Di6)=$2ybc1C)
zq`<_(`)A4I9VLgoPYv><*f##;(7oSM=@Ed{M;~++*+&!5)l=WRmGFWd?~dzeZr#<_
z+Jfqb*+$LE=&8~X90^=
zO4oQR%oU_QNmIXFQH9^8`T2CpckYLH#4Ogq^;-7zX8mQ26G+onlCF84h->2f5zO~b
z)p^a_`k~J2;&<8ArIw;lEIeIZcb1wXXx^sIbjj>tUtueQ$c|pK#FParim){GtKd30
z%Jr#SWBD0sEc>%T>$5zi_e?_cqsmIZy&NC4m6gI$UUs!{=gG#IDaIQMXM2tE3o@i@QlIJTN>ha-|>GX`u4x|$*^;E8OgXb2;b-~
zQ?$DiS2;TZuq!#x^(%DN>?PR!yv3g(vn@(U!5_RN+lDnyuRo91<%-vHz5AK=wiqL9
zGJ-CUC^B9&K`lJN@0CC0py`W#KZ!+Y;+cFIp+|;BwCC-X>ici}pz3>AAK`Q*8tU0p
z)yzu$^hdJB=Lw+znR9R@
z9$bhFjf6!kb`X(m98f}j>&d{wK2zT|4);?$8mr{=&Cp7sdk$LT!}mQ2y6sQLOJW)C
zR!s;qoL@6RtlD{VG-kbE`CskRe?v>(js};c~qjx$tpDvz~*fYTu^?;ab}Uw_Q7a;nw~{<
zwPC=k-qfEYYi=cq=IkDQFUN0hdzJL)O{|Xiw}-~P);=vpgdpD{ms5ReTO4+Ma$MWR
z4yt^|cj25a<5=;E{`%#Y!x3DUR=<~)ZR|BNay@uX%(}~c!)A-^zX*JQ_K7n-h;Y07
z1PfyM;1D!;kmxU*9tw^V;m0^V`C?-xBzOb_JWBINVk5yc6)gQ5(@|QA2$ydHE~BV`
zk`h|L1I*d*mk1GIK%ou?1~d48@)9QEqY?tpFToI_rE$_9;B8<4rb+}!(BK&mX$%q|
zEyWO{kYKb938xB0t6`daWybB?zDx0A0zO(
zltuRMxS)R@c0JOCe}VFU7ml4R+%Z@{zMdMeE+fN-!Emx4NGzkqDkl??N-y)u0lMeJ
zYK!jsZKr&SP_BDt$3y?%-R{ohm3MX@wOSHCJXCkD{kc_ZIc^m?-h6+*DWml&i?i)b
zxO!&2c?h8+qxzr@tGb_NtJ*^NwifcRDfsZG4JVbfsIy3%a-56B=E2GZwN~+vkSR3L
z+Le&E=8MXuf!B2`YO(Pt$YSN#Su;I~%e)2_9(b*T7dAeq|JCsLu?Qlsr7wzO)
z)Z40(YCop^IuV+&-Ys_8`dMZ{VQbp5Ft4ctm1m22
zD54Wn{p-%oW<>XRx!s<;ZW#a5p;F7rp-|T!xt$Ue%EDJ-I)$*l3#zlMgpgRHoJp$m
zsKTa$@imfx?#}bA5l$iwV^Z~__qq>0-g~a#6Q|tB5!IVb^{#Bt{5l1dNk)SeOX^12
zBf_=IkCQ(a%&cp3a$?r^lI^d(x}7hg#h)`OoLRn`D^u_}-f?YEj%7-WUrZZ$WlFN*w
zOk7eRV?FcLY*(~p8^%Geqh@NG@JhPcCE6U=RSk;=&!pH
zX}gv+W7C(ZJ3l&Is4#2pcBz(abXR9r3jV!ST7`WvTU|zgFP&hN+g^3Wrr!!c-
zutbmdTF1LPs~meprKkjBT${Bn-Zd);pEJMp(C9Fq?D4xcMzdF90uvos$;v1Jja{2g
z!8~nx!3l3|zQc<~OdKlAb`KxPS)Qd>g82x)hD@MDA>DCUG$Z^8h|Cyj{e_ZlM0*aVZ
z-gUiGr-9W&y!_M%2_X`vWXiSVyoEHjVV+oLk(-8oTKG^#VNX)1;8hyvmLpz%Vk@DY
z7P;9vmz4UaEkQjpH`YfPP9J0KX&zqJ#
zv#PrHcQLeK!6O|a4C0~J2zrejAC7zn-sQD?dwS-w{naxyRuu}*lP_3i7q!1!Qz~3+
z%C#sd_E`+7jOA9deG_!IJ2k6iGAQJ}l|?Dr-8xKc>-gxfi{5He8Iw1c1oU+{m#%V<
zh4?s;1pk4j@$l()~f!>Z3e
z_TP}TZ>l37B*gQ8NDkbjP#7&@CA!2kLOw40QMNU&RD#(^k%emw9)CO>+0hNh96lQSnf`lraAgyqu48}6>j
zjoPi8=9Ng=
z$AD>`HBx2}mJS2q$bYFj94s9Q0&hWBIw<{*anujnN$Eh9fIIp38{m#az|*NI@j%e&
zqhpoVeTEh!KmLNkm3jscKhfhO24t7e;e(YuKH|W3{clhO2pVJon%a(Vgt$9!I6}ae
zg%Q+a;Dk=PJ78m*uNY9$`G@uxEXV=~|L6AK2th!-4%h#22}HjByQ^cgAS2LG_y2-d
z|1X{k0Rnma9S79Ol##^ml+jhE_gX+v>Gzb+rwo#w-z-l`H96daRPd;2r%DceA0NRJ
zx4T?f?$h{iY~t})Pha_F-w?r0NwjL)N2|@WE)l`9FILyilU+XT(N@#;&g0!LNWUQ@
zJJyS7V3IG<`Q4k>YnwCPTrGvds|M=VX)k%mbTi>nMw1bk)2HwVeyaNQ0o?XslK
z)hor&K-M^@Z=0*K#>(DZJB)d~VhFJcs;G?nm>-6e;FATKg
zpJGchi|oJ4bz65+ah`X*XSl~=t$^MCezA9$W_QhrKczJBZ2IX@q^Em
zXzv{uqPww0#Xntt3T)<;eC}~D>*!Qp3l?>#JT<+zrH6Fjb(irU8GW#%EuI;#dfvv~
z-6`qvO&OZUr*;*Ljfm@f5Sfk!HmL#Ggx$bAyX(Y$L5t>bM8AH!GgHSy}j?Yl}~HmVKoKfF8(OELnTw;G5fXzF(}Lx
zn4rBJp8j>34fB0vjOkptua~V(%saOCAo^q8px7>Wq0{EQ;K2ivH-(t8T(?j3hn`CU
z7w+z%CClbC&K4VP^Y30_y!KL#gT&lMjE(&^9n?U{aRXiaL!_aEiSQ;IdNVvi|S;kEP>sPH0?PVix+
z6?Q09HRQPQ#KGl#w8*th-YX1l!EZYjpeyyyyV?Dn3FZzbM>V?|q
zQV3nV{pP7AQ{JG7ckNALvl73TCYZQ}U{R7>Hhu%`s=G|;>@f{dSz
zr}E1|MWU?vzVI2vla^Ki5k$`xsp|+7Xr+vzX143q#kY5)bhPJo9s#u=1DK!VmVI)sm(;b@4#@I
z*EScYm|n0Dd~%^xpy*(+%-PEvU6oQGB=lOX1}}e@^tB4}$`>|Rpz@Rb%lUZ}dwne{
zeqN-E_hWUbzmSPsRB|bUDZ0f=8Id$}FxR?={!<#qT4>8(s>;s=0d_r+Ko65IwN3So;EGGvv!LE!lFHeRLOj{_fM{Wp~Lr
zS~$gN@tUA4RJDAs|7@dD!Pw@fM1Vi%>IcdKb@iAv*gziMqc`C@F|Px%NeIp)wI@++
zHt5+-4Bz=?5+ARjW!%r5PEPIaSPFZ8N%Wi;Rsi8OvH(@)7vQ}tMFvp!JfxO&=ClnP
zOx?O)@=;7QF@I=BtW&;Cflr%BmFBUZG)ZFoOE2RqbjtWIVi{{8B#VofY_NJ#LA3FN;hB=Gd}
zQM?R1)`a^HNOs^7OBzg|n}Nps2giWIpup42AdUeB1b0vY)X<|70L&;bXodm5#qgIl
zLg8?F@FO4tp#rFfK$i+kH!&iPjt`vFC}6{Sh!`-?d#q8wBB*_cz|R#(V{qXyhNJIC
z{Nn}?>?aPwE1;ly`jIkeO!qve5(?M<=iV!zM
z@GOuR7)}FEQvJK%e`L6DooNV6a)hK|2huyzofYc5MY21_h};VO!jXS
z1o1Hn0qB9|Rl%KLR*&W47UQ;{j@6`nbdL}foUZWN-pvmOc?d;Jrv~64
z59jzFB$b#-v)@=3*0J*E3Cz6>LLTC7C`{`;G8D2gP5UDHN$r}Abea_kM
ze&6?bp0@~Q&J+~?S&xVC=v6$n7U#JLf5V|^TeV3cN3pFNg3!6JP0}3%&MD%dS_L2;
zhydbYb{DfeIN6oce31hoCwGsA0FwW110z3xpy@~1A_i}C1oiiHp_`w#;aYCD`Yxw2
z2HKHib+n#~PR2WRHs~z7pGmg`I@`Y@Xv=17Gk2!D4LNf*JokHYGzL#04?VOhu=HdT
zrcLSjFfFR>am!SE&!7I~@nPcd#%>WWGfMLY6@N()gp4lYsY%EOy&(!d{)JHk&&iZl
z;uux;xB1Y#OVgB99bxf$vxfSN{9Zkxh?ZI}<4<}6eIe(?C-H1Aly}`~?!~jT5m+Go
zEVD|aXiVi{!}IpyF+Kbt*~2f_!^D~Ds142&@$Fw&!g#1%(>&UKY30k1X8!V!BDPI%
zV3ku(QVhcBbHdZ-fhBA=A-cAqFId%ejR^94aXsypof9K2(o9Hg*ZSMM)|58-AyVQU
zl&!AQ;YJVPBJAK5Sy0K_v{-N9|DY6eGb3y09ftX!jQmdSkSo?4J>T)u_7c9W;xwl;
zqWT86w|6hsJL}Tn&|}p()po}`;C`e@d#8#2?)G>qVs$+Ft3<2US`PC)4kBqDE}M)u
z*LcE|B6tQ1JA4L>@w>ul!a=&yWwP(sr>uQIdihn)?SymYFE`$6U8wtus1iM5pe+cqItyQz=_9|2(qZCCzbih$+^aE^HY>m28I8GXvsqHv&U10r9)9VIj!7cL@p%HRFjNrc8iP>KSMtvKlCw_y?$0g!cM
z+yVpg+WX6>Y+8sK-~!@OL(xh;fa3eRD?r)>Iy$F57bfuG;`h`6V9%5s{%?l}2$G;-
z6g>T>;5pzPoiPS!0CV!+4i9=C#d#qh4g^#&K;p-5;*{@qb_@;-9nJ&lBy&w{z-a=#
z{Ivx#K#r6fB0z)lezyhJDJTwn&H-{#w9EOYxjQ=+j1)f{e%9jeCBX%Ozxu!y0$@O>
z7&^0rTF|JYCZXd*$d?mrFb8g
zAbq@JBE=a`#;3BD7ycW^9(CSJpU4ZCFo_J4$+8buuaSN1ND*KRhF)mth-8m8luN(A
z;OAvfexPU*^9mKVv{m5r>HeC3`bmH%^(CxP5^@TUYeiwIMb+J<(gkKO5$l+uahq67
zoU9oSBA_-`Bx_$xJ5?`~hTr8Av&>zYnGjdNdlswBsYV0kW-5sJaflJ_a!I0$r1+Tn
zl?bPaeowv#bJSs~N~xo4fYX(mhEN@w2YW8MQ3{48iAG%o!p!wH#!~dA^~Ea%U-xE$
zEWBF`szWAaSk29>R*fmjl@L#vFTP9nWvEwkW2kqZCpCcc_aF*YbQB_Q`2<9e*SK&$
z65N6It;$#=4Zpjv)ZyP*Uo|Tua{uK^7xzcp@~-3*MOKbAMb_*pUPRYt_Yy1|1G98>
z=qy?Ja^lTB9uW1zw6+DcvxZI#^DH4mVtqBD+9&+e->a%}iNTatR)&~xuwN_c)cR~~
zT2iFjFp{HUK|PYK@7(vn(W)?=c=D>kZR{A5*+}TTfIwCWXZ2Rt81tTd<|>|wj#Jo%
zb&azcz2%AmN`NY?N=L6eD~a%)P4JP8%z+GhCX=L9_!KS6aTk=R@PZh!X_zr-dU%GgPYQETU+>#FIp4$B9R)aK3w484%fuD**{xqJDpA?O
z_BEDL&CaI>F0V1Jxn+9v+fs!`1jB82i~Q*?dOqVlHyzwWM{4duINk}M`S1CZn_yT57lm|
ze0t@%q|2i}uzjTVQkJ0m%6q?Nf)&x+++a7JvG4`=0^R1t>-iE_W!{b)wem8{G$0W0
zp`e|EI~RY1X8S9xzMBNV;+HbZ*L6y6RZd6w8rhVmFh`j*5eeOIi_&zv_n|f5Q<(mo
z_B#zmH=$?M+qc9n1QsIJl#{OUK6Ce#cowqd-whSe>OSY^6^VN-ArF5VD>?oc!yh~xt)~07|JsvS
zWS4av#`Em*#v?Wi!j!qCriZ!#I1H_!+n8O>_M16cyuTYO+S;RV+9_OYI;$t
zPu&c8(plreLDRegoiUH=G_TH1uxsSPv*73)sAAQXmf=>LY~*lNf8n!_Jd&`Jx+(a{
zgz9-%Vu6EE!Gr^0I>M;uGo)@z3zqb(E8v80!rH1_eF;x*npSB@P5mv40aLW-L1h8L
zOfcVis^rU~U_7;$@8q+xwraW^YI3Q(Zvu-r<#|8bQp$xIG7v)Y2f=#h*f8+x
z?LLTMx5d+u+1BT;;g>mO2xrn2iR54%B+v3O;AMdJK+(2Kg1F7Pj&_Q9tf6h*G$D5e
zXrfqjby=TA6i?q_GRdn=7r^d&?C}(H7J=CQc(Pac=*Vvy{L|FZI8ZSo`?`{6Mw4Ja
zPW!;?-0-9$iQNI+IkiS?WA+OACVo9u_nPAVR8k(MQklRs>o@){{gR1)Y9+LeXVa_q
zCu4dH5k9)c{CfMT*a%(-gBx+pFgblxwxqKvRLDwb`J3_~4wd>Aa(0&-i3g@lf{#>`
zXSAz-*he5&0qmo|f9>O$ARh}*k~;O({?xz#CIZl~se%8&4+s9yZ+iwzD8D!WF`UK_
z#s1=FQvtL#5ZLTA{F~LcHy*v2skIe(Fa*H(o=rgpJwc=0T84U0g?!V
zYq%>etD*&@|++ETuA+n1ewo2;V@pzR~rIaQowFVhS91int^%|tM+4Gvv_ccr!7t6fwDAkyD(8OC{98J`x98RuCx)h7a-(4cixf0rq
zyg@Q{-^0qjwoq5Pl$;?E>tY%QbcL~J{Vp_pGh+Wjs+8l+)kGersQ#<4h_|q~V=|Tg
za#c^n&>JIBlz8b=p=HNsO={~glBSkD3}HGPkjRi31{&z@rs}sabB=7XqlRJ4o3?tX
zLE7P*Yai(@U0dxjRKOg~68RF35VMX)h&pJq4d-l2U00dviME%zMCu*+txU&JdU@bB
zbGZE%KZ^GQwA(4lgG<$2m~plok!%UFKRO~lAZCAg^vTm@-hlcFSg`ruMYNw9);UF&IXI^azWaXc6
zxPIRLZj;ZTOt9T8Hl{OtzH7_SdHaL;H|FaF9S=nUY9`C;xp25jTPuf|E@x8J$_xp}
zhsHg6e9W5}Vz~Qdj@fW|pT}uDT3v%bJeGH+8GJ
z+e^xtMvg>HX?~WN$^`su0WDm?TFcrlo+kX{Y8
zQcdGGE^)0Wf8dI@ZoqwXp(-Kpq2Sib8$oaJW1LG2_A
zwjmyW%au*5XrsM>5?)kR!0RT)cfz(FW4M%N)Ck8vI?zmVDNPLy84aAm1+Nv6GmYH2id}o2LwHA`D}Ue-%kg2uY$JmlZ~PI&YX2Sv
zqKpIknqJgx`fh?q@l>s`^lW7kmrM6_!Vq?kkfJ!G=Dp-oYm^6tLVfDSWVcM=@S2c<
zZJMAe$cpcIbMIAWbtmdNtQ%sk1A^8Gj8iTvZa5|`xTNs8+kES(
zzFzBIr{)A`2Jfq1)f*-)&?Pt_w2L=7P4+mJ0!IvuJpnKY*#S22mEhOc(|94uM;DXs)Ji>$
zrNlqghZH*9fn-?tYdaSRZHoL)0Y>qE`)Q#2^Dy9+!jU*%Sx>z`fShlpzy>mw;(&;J
zcaRNmxWERkvkm_ZS)Q`k{$W&0A5or%0nt&k-^cQQ6X*aeEl}tIke4xk;RTETU@!m8
z*78ELwJNLK)r6RSv9(rrr@e#DbLnJTy;!qT#t51`UwVL!UFxG_mxmIm6B8cO53e%3
z3KB8C8GU_jFNhL5!L_f-27e{0;qh8X_m$Knr3$UWuQhX#xD?&}pmefClp7!SqLJSS
zInv7{!)s?$=QBrd&RwD-=N%FNoS%cRd92)rm4>t4<1eJOP2z$Zp6hS4<3`-S)F(~l
zDn>*shltN;;4JOho6dCDS9co!q{em)+cBJV^WFq44S!t?)sAW@B_-k58UO5&W)5S{
zCu8pvoB)n;hbqLX48uJH%Y_K_kOq@9i5lwoxJ@mKS}qNrYdp_d&2ccydatgwD$d=t
zt8H!Vq-!~4o^8az@RCoNXADo(odEN!>{&nV&;BnFW+oS=EZJk%uJ>o1MPOn5ZBBr5
z<`JDtmdu=6w@9(IDWY1Zkuh%l=BQi?DdI&g&hnE2k(pvk?Y``O(AvHJS+6+RhW6)z
za$%8GmSrJd4=@$hu7Bg|p$%Cj+%fHs@hm
zBpxP-@8t=^Rj+H^me947yaRQoM}j;Ncsn^!7$hW2*!Aah7kq3Y!MRpx
zvk#vUYZuR=u50mjmlfipFwjv~f@nA1u`kKmlCeQ!6Lz$*O49A-E@|kfYj-RA8&8SZ
z=3|lf7{+qtT=O0I_%1A7b*{T&VkA*-kFl@&zYa2F2r^KLy6qUM91*LZo?EY!$dYjB
z;pe_(;+@;MLz?Hbyl>YS^OU2klM*Emmubvt;T6HpztDu_Z4LKbcs=dh$+
zx~}*|=egwan|nnWbfc#9`v%&zb~lZ*{T))via*cUKZRT?ue2B7ztC3j(j&*hVX^%>
zd@AQngCM8A*;A9CkJd(ugjzOVz4Z)J-fLH>3gzTiq|qJ58L*MJ=|?*2REv)ery^D<
z+n;CxO0*c!<)&GE@!PCT1uY=R+m}yj#U2NOybHSdosabAYRbsHEE@E4qr4%HDlk)t
zd`xLD*v3R+-wfK@0%99s32cDIkSo(JzKS9If{VE^Udo3k%Lr=Z7s37wTO>1i{s8R?
zvo@2IYhdG5nZ2!;oA}8gRV;-{h~cQDZa(H=LVx1@lx^|76}zxPX1lj+DEY7z;jS2|
zdzqU##FdN~o35F}9g+L>zIm(`4{v4(=$&7CfwMUZwR14_7=_@!GFixfB6agBUGdzj
zTgc}f&&8j9%cmEbyWf0qeb9yewUEzkSFvkvQzb_^JZ~~ml&Cxx+v=b29>-HhZLdoh
z`EAq!(!N4Q+V|vr#Prbke8Xm@%m!)q$pHKAl83{$3sY()4SPb;-|%KOnYr!!RsIJ9
zhz{EUFv%Ig>mU9g2ppnC5n+O8elIYNf1^oG@+8&hih35RSHW*QwBU2XK{t
zJA@*_XzKB4fD`$A@l3Y^fJ!I;I$jVcfBd$FFaT5siMSYfa`?aFnczIpcF}3$EOQ6G
zq7!)mTYr58iM(?Fqaui8wI!#3os!=Ev_{|nkjTRp1gLi)3_>!^hWXDen}DdC{Pk4G
zLm2DUYM)N!}b7;7Y%jYyHN0{c~2h=qQCD1-{eD&;Fk*U6sWpn$~<5iANuE
zOM3Mw2fAwX5ZKD}w$m~cvoSPeyiV10S=XiH$~{N<(TSEcnp9mW0WVrS=c5y;e+<{t
zfQ%!5kG_G}OY>ZFDd%LhZ1YkDbQSb&QSSMvA>0mMz4w+ao;(*mFvB_O7FWqc_GDCZ
zV{y$z&Gog&youg7ZnQ0BbMXihWT)P_6!*ANbFMh$lE%YV
zPfjofSOkv74*fnbJ(wypdO%}P9CDl$QX#H5m-*z=)Sa?{`#IFd?YB*y=!xGcR-E}3
zZdF-<*!10;zw=%_h_e@4C#^H}YC?Rah@lJ}bERZ0tN|B8zc=2JTMbwKp~oE$l-Qos
z%k5&>qA^W!Zo9)c>XR=#F-=OH^Wzh{YqdXDlm+Moj=t}`#SuvCB0bf8!Y%c#d*7ug
z9sIJJL@&3BbA{wXiJAi41@_&kuDKVtmRcPVA9CM)(Y#70`?AY&tre5($8{HKDthTW
zsQ@A~;+i$WuAVma@8){acDFZ%@7ouPBIT!=xc6_-SgmVR2uBjIPWA
zPbBU2j}=lIys&%R0^AsojmRak?mFOv9OItzXg5_T)nLotm7!VO`bl<;taGM{9gED<
zMfJK_;NwvI&=_d!d;a$8697WK(9G?su@1+cZi8Q%$!}v}Y8JIm^xc$vEbk0?pC9Tg
znr>twr%(HE{{2saPXc41vXqVuJ$?K_bBLqvv6hz&wMfl3g!QpjNg|0sD?%kCK7RMh
z{R^iXUn|H=R~GF#itZs4Zso=K*L;r7B$%4El-%2ARKefH%?*1P|FJ@MQkknMDUaZ@
z<`4U=jgKV@H{Bb{NTaW)vAO8#jb=@*>(I}xc@rAUh}H~F=0B$2qW2cpvHAg;vlP2xIz
zJ5h79veuc~0mczNH&PWVLnPa+iG-Al!h(r8$iUksqS{+?|`fzm$w
z6gDA?#NR|u%E}Z%qM%yE-+??KAlxqs@>fvgRnWjC>r~g08tCQnivrod-yI17_yv&g
zM>{bnbp{CDX;Cu}KLdL3=t-L#1`3<~BX0zT1mqil)+G&+bN@7#b+!dZ1c)cW!BON(
zte9t;u+KIj<-Y+^(!cUyXDtX|pxS^autjJTMWP9W4(+}CIv555j6zVP+7a^~8-+o(
z4M-u$f1^M~Y!V>X-2M+ztK3*HC>je$js*o~1&wBpRmVrb-^=wpPT-6Wm$pJyj%3?=
zk=LNAac<^2J8!#k!0k_th?pPq8EY}Hn9vBS_;q)S2{Xe-jD1FYW%oTKd=6s6p31Rh
z$BUWV1CaL6cxn}zvOu4K+MOY@f`zW+YqO}xv>2|RVkt!d%@nL}3YIH*+oqo}Prbo!
zjm<}Ar4WL*Z(Pf+i7plP6JeZugc~u!Zk!5}gHW12e)J}weTsof_FgH+s~x-Q1yfZy
zdz!$s``$SS3IBr}2vw>IaA3Y`PNy~(9Z`^ptK>wmMYLvlu3sOznpl$RuWD@9aF=vl
zGeQnBe=q_oVfDM+a_eWj`bmj4d2yUOg}Vi1K*^Wugg)*|MzS8owsZIT-&j1Ta`E5|
zJUWNhwtAe)dm%AdT!W_VnAvOh$KHIq*aCq}^~rS+p`PV|Sn0bmCY{Q?R>kX&6FaRp
zevEp3LZs*jje3sgT?}M>cIC$e#fUqyF#APD^lDkeRtWBPRHFf_+qo+3@iEzOJ8Y>f
zK>TtYe2*_F+Bn>axs(!f8+k>_>TVwu{L~&zj=3!k_evvdEcjJvTjvED3LOL=
zlDP@*9Jj)PSx1XjUjn0Wm0eM;W3Sp*OO_G}#mWvj^YMM@Xpjq`oRm%)?#(Jl6Q{vs
zH{3}4q9|eTU91#I7Lxk-1L9WR`_6}W7?qC)6=$d&G*V8M^u1N>i1LkW@=_%AO7yZk
z9AOBU*Pw++-LkU2ix%~0@68cwtGLASE;r;>)(*cTFvWI@%>t>D+pR_2)3gM8?7)KG-n7WVGc
ziT0)lsj_&e6!#*Fg!r9TzsvgG9dYcu^9%#T&sYZ{TPd?izS}aT=te~wN)J@8JMJjk
z*T&VRiZBf1a^b5QSX{_bLEYAb>?Ty@(yn@AJ|Jyg-T8S>o`i)#{CVvyv%>oqpM5dW
zSwJ`(UrZeTIh$bfvR&(gO?+@~*SJS`UFH1bv(%NsuFFmHG;YTd4NNh#mcfl`FKaZm
zHJ#}tJY+r0s&DIEO*dwnXzlXU;c%Ed6nVL}qhW1bRw;s+afwFI3xavS^p@P0eppH=
zt8(1Cl@>@E4e{zmi@r@
zL(Iz8SdpNY!+PJz?Y1<0*E+LKFjP()cP5|v`6q@{?0=SGk(`mbq1
z%bTB?BpHh7VtnZ{nP=NJ|w3_uatqB^Pdax)5w?*67h|l9!RVIKX!{F
z3640{tipN8D4?Kvgz;6*1KQkqNx;3zWYk8vu-2d|{BA|YZAYg`}
z4H2^I=u|Ec-7#7&5NIs{a@D3ZIkI(=6!UB&!RbbkvsfAm7Xo2K?*KSI9&wOT0@%WT
z;{ric5&Y`EMg_D#52BC2{0tqi{BP4w|FbGKH);tFLWCA@#zgBX{YMQc;BNnWn6B~H
zi|-+9tdWFftXz`oFVEDF#;;3A|A79XhQ#M^1Uqnp*1y`k&2!0Z27B1j8mbn#h@($)
ztws9N&D>#?anHpJYFV=hS48PR3?|t*nU0UX1$A8ySBdW%B}Nw2OOBc#3h74?)kb>U
z>$HHX8T3&udZ5c~;+kf5rC3jzj&B2>)o2y_&$pX%ZS#sp>|GY5k(LjDD$=6!7!x22Y1?D@MqU8^Ge%L@3N&H5sE*T4p6u|=w-8pXzU0H1N{SjRZD&==kds?)7
zTU!**#7h>*dqK`T;xAdGd_gKgAdAFwyQvz6mPG>0B+(eOEYg=bylIJ}h4^DSt2kqf
zas+%nBA>mY3yYVIE1h?Fu`<#=G1%Zbl29(pXL+7Ln;$y>2+w_7Iqxi8T0_g^wU4Lf1_qp$h
zd{OS15dyJ3U;_;u^$6qY^WJ0#{cpDZh!vE}d!ffSXhu_uluBXS+LL{vT0w
zQ$QX`iM4(5oRug><=_Wqy^e$0U-C!~^vOd)bm%F8JknjA?(aH?nCXQw$0$FZ%aYIE
z_P*Rmi`&un8qbF@iBjDibx)zE)RRedpW=Kwi1#UK^b_sCmxpT-S2GF^1S%g}{@fI<
zx^5WyN@4V25l%x@sb7Q}5J*}ao?QK8>nlB35<4!fe04^+YlmwyWcRZ^1^?qLL0pS>
zZCST$caF|q^3oaK2}BgbLT_XR-(Fy9QepOt#dnNxswgzzlhz!>pR!K7M^Z=rI!Y4(
z`}o5*UOT&kqc713d8shtZb5rqA6wGpn
zH^+G9w?hxEz=!fQ+?$7B&-;+=23O$P4GV@he*ifEde7h}8
z_)Kls_}LwJ8O{Q%Z%ivS)Vbn~z~z3QyFsh`(TZ0N3tzsOpBi6BY&S5b?N2S7G}fFL
zZ8#r$zpgnT9gCKQ5bfQUZ2jAGqSWyq41bj?q=Er~T3`tNVLH!h&VnG+zuh_*6g71o
zLWN8}IF(VN6a|I9(1pr=n@cpLQ0O<6m=2YQ1JOV$-UC=6aJc?9m+0zz!Y~vm0qE+C
ze{~VXjSJcWY$2#Gpn^P7Ih9=k^~}!vuhTTvpJqcCt>%FCzsO<#u5AlL@1r0P0<19L
zZ=G5oR2n{n_SAtoJq`y3ejf&cWY-Vb0cHdAMEGmVujWud4Ewt|H;9}8G{}FA*}uy@
zoc=O7Awcbe3WmR}qA}s0ebEVlkpPv;{%aWj|I{e{R{(ez_;~<;hll~4CvJp+Ix+{;
z3_CEm<{Mlf&kiA5ihFCtWPH{6V&aJJ*s6S6xh54BM5^NZ#(+-~hK-p6=2+}hZ-)rCtb
zeVtiKVY2)UU(^kK=XrnABR|9u$!1V4E;+^JZ_!kwq060^eTGOtKmZt)Fp7
zvlHls^_dC|-a@IJ^{Kk<3J_azIBvOglW1cC(dfAZ8q%&U7HQdc@%5y|hEd9hFqiWR
ziPkaj?g{~><`U_{Dk^)I(JN)pR9Qyuczm8hn4=EBDi%N5s~B~R)k6T)I2l9pYU5d+
zN%=b&Bp)8p9u3zz#VrbJO(des4e(-b8!$=Dalg&mt9GZjNYRzJsFGZ-XHsA%Wkc_)
zoty`KgZZRZ+o)cwUfXl{ec^I9J_UO+9;R1$nZeKUBz9?>tZ#>bmW619A&n*9nlhjK
zBH@!zdxm8hEmF30W&}{Juqv4IyKEf)rDrs#I>iU;2?-I=trI+V-UboJgIiaT&)Ah{
zRA9^B@9KxVe~YIGvtbOki@xVrxhF1qjqB%VL#2Kb@kOoTXz1sS%cha!6z*d@IZ9Ke
za}=_;S$A=n+ns%RD=~1j$zG+HMh_^mn3dYqORhk#9FagKI+fAUNGaY|36eE#@qof+TpO_DX8elY=Tc-Z{NRpKb^
zjIxR#MOEu>PIFRU3vn)EZn{xmrb~9U-nkruM=bfdgHA!vlGKgUmh=In+}f)>&ji(TGHPI)vteb9FB_J5=t9_AmdMQP
zGvp$)bV8I37hj6bX^GmW>zQQQ`kZiXU1?2YcaOxM5|y1CKSy7%T<9H4(<&uO?C-?V
zZcBNHZKz2RAbI|{iDD(TVE3(?7rhDL{Lrm&e_q`(Y=-9<^$4{p!6n`3N#^dY^)JKq
zMqD9v^jk0Hj@ph&HZ(?IDA~%6pKhf|Y4ZoEH)q$@@5Qy|s_}n6`Ve9(_rUpzSoMol
zM`;qyn_*wi^_u^*tKhCN(^mUZJ_Q?7MJ9aV{0bwiozYn~jSYHiuU&lUZF-lri-?y`!ti;@#JWo|wRC2qS>e8`+#1o!
ztwhm$tdxPx!VYwz+9oL>>Bkk*S`P=ObRAqSkuMbnaPWo(^qr)zJ_$W{anrl!L#Q`@
z|H+0PciLC(SEDMq9s@6;Dt#*l;nbRmXwq@tTz&rq3V@F|tFDeVd}zx7YG|T8MM~H&
zoA!5!br^6JK@^kpKjsc4i4CEJn4rE9LJZJmj2grY0XqKgbPovHouV5+l`K>o(V6|C
z76wH*1^+0M1r#ViwC)s3h`LC8W)P``KuKGGN&m}%6aqRLVrL96GC0~Z`_tILKrt9@
zlou)FG*^Va5FHyd9ZN_|6ctSmVMmt&0$cD;x15=lBr*ss0v$#?D+%;ZUsD8#AOV{2
ze{9exm+c=vd`d$2*TKNVqiybgkNy|79)>w0+m$=3Mm*c2L4f<$!g^L9R
z`7pGiQ;&iABXrqKkh6lnZ+fVHJ^KoykDWI%Q|Ve}y_SGIQMtyrL)BxR&ieO_8*z%G
z*?b#VwG?lw5UN`&m+yBDn3oaJAv#4{CLW!vgXVg28
zd!JhGd}6*LH20b966`!QDNnbqn0ZknbUEJ{%wQ`UdM^>qE@RH)+Z&B*f$|21mm$U3wE*wWKDJ?3$e#v%BB)qiYzpOzjlAo2P@5`D=kk-d;OlmUeKM{r@=D7+
z=;LRtg8c7zFT!a^p+us@ZE~))nX@K?{3j2VW;5QKnS7n{v9f(y5D=9hM0tPEb`j*U
zkMvn*HQq88`?y=877gwSYLLZ$uUKtdC6h)-kaxitZk7F@Yd=2FvT&E0G*Y&VC&u*4
zyIhBH^=o|92hN(+8y^cPk5@g1oYLN`VL*2y2qbRHKK8aHjpLeCnUUmq`du=KQ*i<9d0uOw&<2tuyZLKgOPT%(6IaM(
zL~gkcZoU|zbal5mTHwXYsMf1h
zDnEx4&)rQD9`nS5RHk<5Bjh$v(})@DUvuy-fYw%#`7o5V$tSHx_4bVJ%a&XWkJfl9
zu2kX9`NFuE;iyut2QMPlUPw$36_bD^g7&^;)VI?i$2rQ~6W;fu)h;V47*q{a~Bu
zl114?IB}GZ>?CXYPp=WuvI)qV*7iY(n~o>bk0G)j>JDY$4!PZ-EaKznlDhzvIKD_H6yJN{xEmVu;`CS}8e2V0W
z0hNo!K<3Rob_Km&bNt<|nd`>qf}kKU*f?fPmGYRhO5-NDV+X=l1LhxjQ7kGe#$j}TB8==$3y`^!lE
z&BsMGQbF+kaMOU<`L~+}z}~=a(f`M8vA}+n9Rr$6?Bu8|iZjbZB?3rOLZIl^Z*L7v
zP6m@55Lrh>Q2sJZA^>23u0H=evI$B;1FS7
zcZTw!ft(83o^ClO3QC3p4JLBb1=>G0W5IyG3CX1d{rubVq5A=qAc6A;vVhX$q^Cj4
zKMeu80ry#h|G}XByTBRxEGP+p=@kR^`OF|S(Lrd@AjH#M=YVYk(1|5-EEpKu|F=5e
z|IQy1MHfIL#}X7dvnPpqXBdb@gWYP_HLh%qWm0qE(cDo@9S*rUY3Cg|^~xUoe1b?9
zP?SrUp)<+EIbIHjC|vmM9VTYVp5Y3+pNp-`QBhrz@x7g;-E&UWhCTNv!md8)+2XyR
zMAk>Oy~;fN;*Im0zFPC;e38VlQCsT+UylKovEG2gGOQ4UX^qYC#@xUclbf+~d8EYO
zG5I}$EQ2ml$2T%LMa4VM#Ds{eFxKAk_FyX84k(OX(|+CesjL1x(dU{D-W^AM)bv32#{Ub3yY|~o`8Jub^V{m+0
zR;OrHHa>?*hv=n9`V^Gv@nE;*eq3G}pXk^Dv174>^rQ1R4+fKQK9jf-8J@Q=@m%vF
zvhF5EwcQu3Yx%O#+xU~i+G*Oc;?kFaXN&FO2knJC(IGXChbu3XZJMDXS55DckPWX85>tCoyT`E
z+6P^|o$2AD0lcQXY+mf%+OxD@wQ%Vf3@^6`eNi-R!x*1xGdStIbz2@k`9aWg&X;yo
zFC~@w2H#KKXS$TlfSG3M<-+nd9NczcvXF4
zXg!dz>XEs9Yk8evLt^@;*|?bAenk}-4N}D?Pm*<-b#q=Hmg_v=xPaMGR{SalCu{oo
zag5cRMUqt`=Slr>5JoWSV~~-S>BoK9?#|9@xvllsEcgher!jaBW{JJ}r@9Trp%-0{Ko{M?*uIL6nKzik34
zP95{lINg71C&Er^C-SnvPAeGxiExAcDxL`YRXh>ZM-TZGu>!Y;q@6kmA9{
z0ne+|+}5{k%)9Q6V_e95E%m`vXKJQbT-QtES@r78WXUtb&f#iR)N@^z!)*)@59kB9
zA!FY+J9{nDk^whO{9ZL@g$tUqhD-KcM7svPhN
zFQOgtEFvk#?~bw`#>zN5qBtS?p?hHBV(|ecfr8D()a1`M`jxUIKKT?ST8*gv(5g0z
zCdH9xdod*QSbp>`%E0}oQ?7ocEm(q`K~TAYHZ+iYpKM&k
z{vl5>TMDJRQMVGSOSI}2H8WXj<%Rp%dfH1C9gsQKPTetDD2^!G5TZMmE=bu3i%0>p
zo}I|h3}Ub!c3@VDy&05N1
zjcn)EAO8*b5@4%neH$LP=ZmJ33TL>54dc|l@%ofZb
zCtBsQ@$k^}SZ-%B-1_Ot4G#a9bL0MYfwwG0-{d^s-d{9(?(2LV`e7g~s*f~5Yx}!Y8(?t17J}5XYLq6)K1bJ%5_E5fb!!kk}s$>1V
zZ70NJ$ijH!-A2co7gP*0UoV*;wyQCNbgeU0I=wI6ljFF}9y_S+om!#mWLg~ut4e=k
zR92B0`s~Mns9J;J;#c$iElq62byiJdNw*g49$%{;wsb$fxc=74(
zJg=G(e47s2OK}hiMl$q|u{~oO&x>)+Ph$_nd
zB7_hr#Vv!v!-GiRig2;W$N=O4YQhr2fNbIuNA~~@fSn!y{>DW~U4ST{o;yRxQP&6{
za8&07$W>5{4`o3C(LveZgMIfhe((E%54no!%!Cl4ZjnG_QIViB6WQ-y_{+Bt`+cIg
zprkR-?E!Uort@bY;S9WI0vQ~c~Q&}Tv^0&vObVfw2%C}t##
zZ04ay1rni~o?Yb{83dOajer&fU_T*HzzGggJ}^+>T~Jg6^^p+5gR-Z_JR1UZQ%a!2
z4PbtMw-f`|X#l>yNQcb4M1tZ}!=yO7a9K(S4iyZ|I|8>{2o$P^gLDvD0766rokF5V
z6%a#6QHQ#iOW0dL$F~sVEcrxkHdc@F+m_DPd5^9mq2Q-%XSS
zaJv8+1qk{wqF#}M`vb6o;3;H;!r;K&6J|k^n?XX31u6=fg8>o-@IxrTNKzxwXQM@d
zJ_3r;A%Uo&z|f=b6M&qH|8=QAW`rMzEH(4+V!_}5qzRsHa69pU{2@O8vHTuxVW6{k
z+KS;k4E?C1)NL_ok^Y=uAq>u#5=aySec->(7{pA06WGl2yS1MkCM}AW3L?h<##>Mb
z6mmgFUd331z->Z*0wH^TVPRw-ANnLjPTvVi01Z8Bdv*(jz>^2~(x6XNE*1KkME|-b
z9BS|=0q7{`@7MhU^~it#7Z9Q1qen?lLr8%*eDkClN(Nj%h}8lS5&+Nqt1X(VCI)I=
zg0>$(Thx6gOhWX@s(><{{DOcU{`*D?fe}V?ynnX@y@Gp|L=C~CLKnpZGZ7Sy4i<}o
z#}3p#0}58?misgi5>%HnCJ|C=9UJ{fGef~05(FCiXq+k#oM(ZeZ!jpb4yfqhWdpo2
zVR}>?EjTLK<=1nHzH{Iz!PP;*{Q1|JqtQXYvjy#uB~TJjc^q|(1ftFe0})!VG6PSX
zI9NEMW7A?_jfj46gwdhpv(_kXS8z(;4l<*~P{aY;9|{Ih6bS7Li2(Etcz2*+5Cs8l
z7kxU{=piInB7(59F<+yF;8LOAV8F2#5(TZ%7XjX2G11eLCl&rR8~&cFM35F)>dc@d
zJ$M(zz>*QYB1QiWI5F^YLIEicNd2RK=ltoBC|`H*aG~c`^mIiH^1l3HXo=@v?*kO%
zf<*+;?RhA`>jb9%KSBs#Zac+g;V_VbisjH83e;PA2n{%OF%STt;{ER$_0)QR+S`9F
zWzT}jVD-v_)KbTT8>4U1*&^5euF3C<68a1N`#N8b&|$nLPCFa
zAOaPx5oCjmK(IuhA~m%vkh|!=ME}|*R)fz0F@bQ2{3A?qwtxoX4yc(I1kS#p$50f!
zcM|VmgWnb6X`SS>qO0yjKTHw*n~vQ
zcw65+r`P@br|UP4=40qW#ymExJ<@A?;pfjsmeYkqL>7}?>mP253<`@+p=P;#+sSd>
z&e3|wY6)U#d+q!axG}8+##Eo7_zWlKpuCoT)5-e_u?pl%GYH)Bs@bEOhGeV{AHMpl
zOnmq{sX0lDdrj~zPH8EY;j4Q_@cYx$McuqoCqk8;Gv_%2qk9O0^f5#{6mcY37{Zc^
z)9bN1x+fy3zinI$97|r9j88$%PNpU@Wjff|62;-v1qONYdaA{;?QC_GX!12u%#!@#FEogW-{LoFu~A2nLvnPt3sRu
zi8hL15Sm)7<2t*?8(%O^I{R9?TiXaSMZMk2=dCUGyZR76Ua~8z=ql4^l9TuNMqPB$
zc;{4H93-k0>&n}WK^|8|-h^w1T^@9MpC_U2z&C~$gFN%AY*}y?603tS^KExWcQ>Z_
z@yhp^4M4JYTKiIZfWH)7OHxp`d0pc3bf?DM7Rw(RU`7YuD13@m(V>cEf`oTi>O
z$hYIZ%+3dh%oFa1dyjIWV_xvhn6;*gj~_(^cFBg}WFCiqv%@%{Rr@&nwILj1S=K-k
zl@c<#dqmuI!jglaIm{URj@p>E{e$w~-`-!OVNjrS6Q5y%Di>OE(lD(mNB(?{c+Fr!i6@VOj
zo2b&=3;`EHo#Bl-ad~n6(02Ajm!+x^U$5=`w+3!fdf`IEogjvb@-A}Z)^W%(c+=pA
zPSV{z|Cq)O!yu=?&g$6AMwf&Q_U7ip>E6K}`L-lcITe*A1S7;*FpMKs!
zd~0B+m;F5LyhgwnD5@_vAiHL1yZ3Su(Yw`HGfnS;a~EUuxLAyLGAkrW;GSmi#+{~z9d##L9wB~C{*jt`q3C+{_YAXdz5N)Mj^&@
z7am2`ESMoRlj3g{gy2{4$n3qfn0bP@h*9AD+?aNWrd^?*cwK3|>drB~{k(E6dm@p}
z7zr1o^fGg1Mtty#a?HL*(Bk<|+AdZaq<1b}8s0`;yh15v|2elQ@P{!EiR>-=6Um1M
zmp{soO~kvJb`tb6>(dJ8UiNt^E@X6Rl-4kmg8?)0#bcDmW9;%~p{q8>ts@z&orrPC
zwuY*QchBt?MkRIKa13ySQ#jcfP&*6HMe>Pwd`n1@3{x;K+htuCDqZ7Q(DMkOYFx&C
zO*N&RPs(3R(vUCPKI?vMvNz8)fUr?%;(pNF;9yKN=ks?rdG4;;v$f6z@hUmtgoly0
znI}JS^iLqcE5D)XE+KN=fjydbMA#P5r24L2`;!Z=s6HuA7S{t#R%X9`MK|GK&GI?!
z;O2r%?UIZP+GhimX)M-$L3U~bBJbLGS_xGNO_fGYGM(p5FPazO+6z*@XtLb2vddAH
zC#zrEnHPUngXa~HhI8qT{DVxD65pFeiPqV%w-!2{Jp1WUJ->c^Y>tn|&4&snKOow5o7
zZLwX9Ebm=K6pt@dL^7@OP4I3GZ6Ze0Wsg=JpETSG3iHUlvSmxVtDNnuRepgb%2=7f
znl|PC17kp(zv;^JiG5d#t>CY~QgQjb*>92MyUO21*n{Z2Zw^S2LlsfI7m`Gj*97T(
z%E_EIV-Vt;H$iK)2|kJDrwS4N^rsX$lF~kRVNx?>`^q2MWYFZ30i$Uq;X^4nD3^HC
zf11R~#|19>?1nTCZY|$hF~0>JKzFdsOG1dWLr8?`>R$BdG^QNi
z8AZ|0X3Ht;pXUZK?{2p6E}?XEpIdxttq<e>gAuo@U*WnIfE*rQFzf3sJf>DpG4&-}#N@}8@B1edsvHf=!z-N$D!
z_1Uhk`kaQloyZNFY>0GZy3~*<&2*O8Hdo{(XxRxg!#9S>!))pde*BzB*?4&x+rt}F
z!)cmRqC7VRGa&bc32waD5W*YsqxbD7?Z6v~;%f<%z8<(+{*XhNxYLW+<DK2{fj6;NRX;=KL(Z2Wa?Fvm79O309q`Ao%!O
zf&cLl>k*Sjh5YvuUDD|kM7kwT5!xKW3B1LY@2eT9AS_CULHu55fpnC55BbQy}Fvm6IIE?0W|)iz+xdDx`p*mEHBxoomG83ajXFe@Cs>Vaq0Y
z+9*6VTB1(*fb+LDup`s+hPg+;{ud<6dHf2hm>(jSp?-_ZnOrm6(Fq?C^L~o*7#blN
z5pc2>?tC-QY{z-%_u#hE&Iz22Lzwr4%FX48wwwRqSF&Atjg8NYPTvfBBBXa!96!oA
z$jq?H9f_^juk6~ULQr`ce;pE`N)P^OlUaSu$P9B~pfG!vA^)XoIsdH!PZucQ=}0W$
zgf?m^x`q+$S9{mG)7)pp>GZ2Q(lyY(Zx){_m#k+;g;mJO>uhU)F9Lt6ap>p}IjpTM
z8qvi5(ydPlD`(l8I(iWs5h^Ov90LH;P5>()upR@DR6hZ}=_Cs5)N
zzPvx*O>K+0z=VKb(>TgOZkZG?dpm1(lj6f7f=QS(h%Y9y6)O+Sm#!a)u;6!MFDo1E
zJR!A9=HLvaQ0Ojm44tCyC`uvqVNO4CTEv0Rtk=>*rEpd4>v
z=|B9;YWoHMf2N(X|AAo>YWW3$V>}v%f9?_{o~X3r?7M`-R1SzRf}_df9M&LjJ_ApG
zDaB~;V|fni$%*}j1*uc4XjA?zGYxgZTkU|w61tSFbmXzLApK)}6Qz%#
zuYryG4HIZqu;fz104$zOVKA>xQoW=AgQPt@KeEETe{wPO>c)EW?dx5UQ7WqS9g&up
zm^3dA7g}fpk!tRk*_ReipfsxkeuNy;v=J2Ua&pTly(d?`gm@xvJOtRaic?iDJxcok
zuaDdj9;$!$hPX<6_TKtN*;8^stNJ{_f$NfTS^P_@XF^AE_|FNCEp@bZ0GA(TUWGW{
zjAN*4f8z;e3j%P>#N!msTN(cnD$kAGKi*WUES`&O_
zEk<-CaU^D6sdLdLxJWrGotg^qKQY8<<9_MP)M#JMhb&HCqq}f~WwS}hZh(s>A;Jzq
z0q{)G4g%f#$E~kaJua-u##i*LIL=>Tn==ceh1}M@pnE
ze-O)oB9;wXwW8<+or@`biFem6?NJx9x?2PJf=ZxMxXI{TVn#+s6?d5kdM_}@^yr1=
zrwpA%yWPu@q_bgG#K6dF2FjK+l~eDH25cvZ_xI#Lec@WMxe1c8i2WSr%H7p&sfSBF
z=rD(>B>DSuRMl
z+PTM$I+e8j1BBmB;_!e3ZY`JrpXgEZdqe$b;{tQf?&3Yrcf8b}m
zxFuKpN!R0p;P1+^zZaqjmEpqR${G>mPs>?{&S|N_q2p-<@KR-@QF`KQ3iK1~G1KBi
zZ&iFMabf2o67|gqy@PG$O&dK7PqwW3^Ke%`E3#ZtXeT(Zs7TO%KX=?U=laYfMxf$w
zfNBd6dTdk=r`l%wVx(Sip`9b!e?9hO4)n-HE9i^d8}
zraW4UCq&1sy63@B6-2C*3gXMWOfK3K7TNOog=8->7TyJ(3K=%20V0are+9kgkEWpk
z2cGlCx%d)aRXnLFj&(uk{lIMA;ZeOi>veaw2kN=0^bTsOLgC}}Cuo-Ns_INiwgAwb
ze_BY-?_fTYf|fST!7pWL?dtH7nHa?PPa&cNjjta1FJf)Q^ATeqwe6=T@WzOs@8l0-
z7wdkLuS8#OP{3LJvYW8Ke;O@d#J{ZGp^W=Zz(x@zN8p^pR>Q6wdoax(hWW(=I#n>|
zd;~|TIXHi#<qtt?!;)7Y
zcB`T0`Mp&S&AypaovtI%AEPX=EqC$@=|`YF?l$wfyh}?>T!^|oxKtirDfbg}=c^wR
z_=j723Ki=yfPj>VQFj}bOe|-4OjINAr*;sMmDS_^D0Q2ObKq_77(kvMM;KF=mC67(Ona4kBYk5U8&-XKK_d#wp&9WB
zk%W`Q&$0T-YarT2M{apm%i5fCi1}M+%nGIJN9d#F*b+LXf1vxEVSO`Ae16B)*)`-y
z+q)>sHOoEJpE8LQ~AEP9iMAtzfZ+f?PSraj>bZksb$~k>cJSu5Vd)LkQ
zr{E!rrmr@1Bm{gv;ua`(h_hCIsDE~}dW%p|?MfWvCk~|0(te|=;t%)yE%{NUM|Oh_
z2i7tlfY^&Pe-pYG00x_ozy=D;mC^b9@`T~W@d`gRpu0n#=y<(PxqdWL_pQ?^;Dtuz
z;45Nw0VJy(aSi)VG{D)Cc+0$mg!(?+@VfG_7xU=z4uR8IBCp~Z0zTgyx%-&(l5|Ux
zDyhI*r+%a7SQ0rqVWif$5ViAEn3AG~#9LgxJK7!Me>NlR-Pw{8&EAn|sAcpA%v&rDhT9nxejJK;imexMN|?8C*YtLa&%*S3Yp_hGF6jjU~V5e}l+8Vg8RmG>I5
zu(U-avRMTg6V4C6lul?TNwIIfab0_C7go}CaDY+ONse3V~q+_%@>I`BNA(xt-
zs)j+he>u}WxyMC9KF~&t*xE%+!#3hePg_gh#ZC7`5NE@--1<0XyJ8y${1(_IsKjGc
zkx#Z=TAnIyAy-kD8%rJew{AZI135V|$ql=Td@={nItPe;sV6tlrTP^iZ~+sU$Vg6L
z&qQQPgYjQiq(3eb;5!`mji;769@qZP8WXa8e~Yf|c8gpS0Ix3&J<;G90k7f37VP~tim@`7WLOo+hq`yO$8s4vU{#nJktEAdQid_@~Vn$GZfjx@Nfm&
ze
zYP0iB#sTkqNiWEB%^{4&Mlw(Zd+Lqq&~^7E#kY`g&Vud8#~M#G``JBfO)ZlX_k#l`
z?zn8Nop)V-s=T#Q0}Cwc`Lqm2?u5fEe`S_aVfom`?ndfyodOr6g{H#C6&L%@^~;_m
z#7KMRJ&HLe#svb
zWukRlzu=3P>?P0844q{uRy@uUf6{}`7H23wDnFw~)Ma^Q2FD>j{EvcSD48?vd)4*A
z8LPl;A<~gSLZsX8Vua@-Lz^E3o<4burJ6gsU_X9CB-TDufMwSdExR;tK>(-q+oYdK
zx-66}aPst!R{a>TYNUTVjy!VzrMVQ^wTF^XSgwc5!r~mD?_VjQ{2AtJr4O@Woy-6$xJ<{U>kaeSsDJ6y&g`
zHk$~jjbDx29psIar|WR*kD3{u6_IoZkAN*ns?j6hZU!4WWJOE1*uu1}bww-86D-6O
zv20{xpJZ%O%s3(yhHspwf9@BE{a>#*zxaquSm|kxpC_KKL9&D7%$K|boOtX$3#~UWg84(Dc~qW-jp#WGm>VC4F!J{2e}EeJrwBo}dYWC_
z2pkda@{9+Ve(fZI5P+68#&rFUiAW9@^oGk`vBcaZ>ny9|;Kt9#{ZFBctzIEKpo?4u
zL0TjIRRR9JJ#!KXr&MNw4;6Q|OdjE54zbL(bizAP6Wut6bl8jEZ^V8%bPXnr&FB^+
zzcLUxgpb_DzbE<3iPiY?{r9CH72sE3wmiS5(Scelw^_Lu
z>uDWtun`8yPR%AS=a)3;JWR5j7OP6I8>Pz#o+WMpD)gPYf1nJ79mb^rjT3jRItn3U
zrX#nFYJE7n@93VXe0aKE(iKxcxOQ~SYs-$u$gouzUJG(2OG>TaK0$sB-&c`O)1&br
z^YB#o<$F|*T9a*y?Di+Oj>%!Iz!>KSC)i-AAl%n#Sul>m+nE5j
z{pnFWheH(PefOcOXM&sJaqB{BLbml`}N`VkTVpZ6-$HPwf5I2}ste@VgQx_M0lfV;OJs#~$YlS8n5
z_YYpeMUT;9Vw9K9(9HC>v8v&n&IfnP9<-Qr!!zM;XMs*i@5}pfTfIQB2Je%~98-mH
z;n$Vi^OXd<@W=6Juf-Lw=0Of<1f*1EjL10)OKBf7=j{27pZtWhKG`}b%TY?~BBkde
zOSZpef1pbLS%AoF7#nhzC~*(OR?TxaxQ;`=NydDpqydF&0evy>mhcNnE6R!l_DB4E
zrFlqUcn%%+F0ax)S-RxDEct^Ssl)1t@aBVe?*&yV}p=!VhXk;npZsLbN}KBl;1bJ
z3;Iq)9)qG!jPbpx(D#!vP=oapAxvNxAvixHiWGFgaivg;4g>C%inJ!tC-t>pfMUF%G>R^Wd3TZyb^~Lpa-UKSfFI#c+BRhf6V=2hW8Mqnp>a`
ze=fJGP@~e_vez;y^Tl+1jSGC-y!{4lwioH(Ar{uxIYI($d8*1Lcw^meXso9sx*BGv
z%DCbcD4b;!L?#Yg#pq@9cRXkBE4%=+BTQ4Iqj|;y3xU<9oFjYsvAuI8RgM4~lYN0w
z5}4bD=_IH7W6yiC23->Cbr)@Q*nt5efAOL`Kd{XWUQ{q8mR69ZPlF(THrq}(9ziN5
zqA5GCOGK$AxSo7I{<-36PS8GW3`t-{Kuo!vj9e8@3QL}ilcj00?ZJ*;&7pwQPcXfguq2<)?KqTY{)tpiCeDs@LbO%D&f;*ct#hh{Hj!f
z8_F+AoL-YAPG{bf>72k=*Xd1#&QnBn1{)Pr@xS=DabB)e+_d=Gb2PQiq$F@%QIH5?_CT94j(_EHz71RJ)ijBWZFrj)mH|>AUadyyc!wb~O!CCfI=lDQF<>*NO_9K#z9^j(e|tsCB<}Xf
z)&hc8vTpdj%sabCy)e5;s2eIYsJRuOATu*s!ueofrjquSPpAuLv@c+^inzETI+l;P
zXcN3aK{@ovy}Qz&IIaEr(1&nUX!^jkao{QnU3{00()0DgYNcntW0R;hli9##s8P5i
zHDJSZwuv&m%uv-i8(pHHf9TfyK`B#+XCWq8lkJPS8N-}c$+!KKxb1zlYWrw}y9)D`
zsAp+pkrZSUZ)>Ctw*DmMt=m*Gc%r~$DbzdJyW{O(%+HOF?NHEA@&k)HWMBkK3Q8oj
zRYLfxk6;$5Qqn_R`!y5=oxR4KD;nGv$ae@0Yu=YJWJce&RtiBaf2a%H4)aI&usLaR
zzk2so!e&ip`Sa?3nQ-sfMPkFSgU&g5zAPiIi`62@BQJD#!SKlyyy$S-
z8_|1u8#Q4FH0Ow160v;TWwH<$<#0U6XbrY=fJ~O5=e|DOU8MT>cs}BGet3z==
zUD{mDJZ8w*v*BNIWx$kI+;K$`B`~w-gP3pF;`Od#|b`7qK%u>QEJ`?JF@~
z?T9kICekzbG11`fY#y4Y*q&(uQQ!-;IOg0)i-zZMe;?2s17dt`uB4kf2Ya>eH4bOi^;dW;O!J_kCxEsaRjLLmJxyqk9S>+QJrmuE$o-Scv(E
z4=dvqbnE*QHl9|z3lR1JG<2^J@icT|*OH2pWHt$2;oiqFlM0)yJ23@I-#hu{0**`^G(fg#h=MLp?A!d
zS~6jpeRlA9V~j(H2zl8EmR^s1lFyf`B4$JIe_Kd^WY`L&{+ZGsvc+My=N@y=e)`ui
zf80QZ&Q9g(rigku6}Xnc5BP$34VkTP%xeo0I(Z=reqj#_o70Zzc)jjw9Im!8e!G?j$4!48yM3fC#cY9$cIMO1kR_vS
zjx;ukppW6a`XK-KS_Z>d;zO4<{=5lR-a;G
z&Wnje?vFj=QW9#2nfH1(QnJUy;KU~yl-HlInggVVxu(nijirp+Y&$P1pl
zD50U4zCel(h;0Xs8*#efaDxB|e`(Y9=+f_KL3m(MTqxS$@n}+7^YfSfjk_H!qd;P?
zVT9b%7LkW(HJmC}&)|Y@xaLJF8Y0q#UMz=Gc@#===03fOo8WIOo0u>V%?!a~}P0G+x
zE6|FN5S8Q%4&N?q6>vSU1#?ORmh_PStxFWV(#gmLQaGRGD|gc(r=}?%_FL+wZ^bBJ
z3*WLNML&CTCWH)Is6_xff0I#63!j>O0$t=#+-0`WIqi=sU%P84S}z3mh4hb;6c;Y;
zZ%Zzt+Wo55~0*Z+;m^Z{_wIVyT8%X5BDE#*wpV4`$Y~s{QmZf1W84Dm_(G7_|(u
z?i{G?)m@r^SDcZ0B&3r$^5fSbIrMn%&VtktziRhpQ)O?(Ntf*<^28Qevij6XvI4u^L29AF0ijMm+KAbBeMT`yS?XYUfh4>hxjCFjD34U^chOPE-V@|25
zGRki|PTbm%v#iDVf4BS4>an}%*VS|Wp@b~z-FQWN>y?hrw4FL=0@o$+aqQ5CYjj`q
zE<+aCsVJhM1n1C?`#zxIX(VXS7M^jtWQ6&Eyp5z=lGMqz?L#T+a1HkPDvC%_Q&!}e
z99DIe`2wKZ!DrhSuIRu;&UH|DpTAsC4Odg3e@K*T=wkNTx22_g2@a_p
zeUMJ_bCg2ue-jbREK?g!{)DtZ0lw_t?Qa@*JCzQ6*uXOKn(ie4?GKnAVl}J8-FYtb
z4J>f^q32n@!X(5@uAHmJvLaE#?}|WRD9UGZBSd}mx1YYvpK2qn+Z!Rq
zCxnB;=NqG_e?$#fm_6aol7-=91dcX0#t2(|B2<;qlE(=tK>W=mnW!@L3LY&&!Fjl<
ztSeV^Rn5?z#UN7$6K5%M+&%Zx%@NMb&}+$}{u#6_s*kX(s2#HB!CyWzl0qC=OjekR
zGAQ|C1ryVmPqjuznMrlbN#PvNhoFyd#!e0nY~X^>+*c)dxM2u8;>2z|1cS~Q=HTTPPIJJ%3qFj
zh9uY(h+!5hNXy+@UAmp}t0uhCYC6-!Or3n!rEu^vy83~3HQrzYB;VCLHG#)XOyA%5tYfX|{4
z+-{eKv;r-OqFY;K!471gxNo_mdHBGKU+Ywy!@tlQ3+d<78
zp*bsCEsY&c0UaN;%eadSEeIYvjd)TyndiU>f2-7MR#RB5kb&vhEK4(|RqSPAZjWoE
za_{$c2F#nU@3v8*I2}{wEqf54!!W!fN9J~sSDG)~>bshN2|Fhn0%yi>t+&*y91oC6
zvO_WhC#l`w>-gE)XMBnX1D0q#ur}|ZrE21gU&Oks%3od;#UWw@TBwun%WXGfR@#JW
ze^K!tb(UX5qNt)_D-m^NDxh)wv1wt|3&ftIjU!=N=4DrT9h>FNE89COJWi&}@#pj^
zgN8Nv`_GHx2DzKQ@C5UVja;OE(}`OS8MsBKq)4!;S{?&j!*ww+@Xcka!{9*Pal_DD
z84r{I80v$K9q_dk?+1Jtf6SjQIHUw}f89Rm(71^Cc&`qRH`{Lzd7J$)Xm3vgi1Utxp!s)sHzYCWXU&ZtHR1G5Qw4{t{5~u
z4uRtuM%fcSMoNwA(t~|SD@6P|Q%8;m^vetuVjicYQ%C{!OuRQs4YPZFq&uP_HqKI`8wReXc`z~cTV}drDZUO@F7!i2?x3CeBiGkrRc6nLF_}@8#`TwiCiVM-XC=EJaWiu)G-xoeKnJt=?j(ezo@lLSv7k8x
zOMD!&Xf2s=0=I4B639@JYY`aQVM;t%CCKMNWoNLEA|ENb-fN@{Pe@k5f89x>Yoe~A
z%9APF5_XdhgA44RXcmeK%3xkRz3*Z{Lc66Gvq)X77aE_&$`;yE2`LDC(2LE2TFbBF
zNei3NfgH|fFS!iOq9EUd!>b*4(0L!CQw)?P?q>HWLjZ)+0Q!%OJv;tXDO@EKFN_jP
zE;@)!V_-H4)azgi!YfbmxgPm
zEC-={Nh9$XDEX@HPGkCtG<#}iz#IfC46jGc<)*ohsrT(Qof@k!)P}uo<3`rId8lyXTTuWCm2Mk&)4qGM(1%^*T<>*Se-X7npZYr8txM9pv
z<_%a~FR4ydbH33je{}R`fCx!b@L6$R4VGOZ>?fCQ^l^(LoZ@l^!!7vSzv9h76}=pb
z2KO`8c5SvPe?u&TKTI0L#Iq6u7g;>bRGA%7T#zMa_~5SpGXYHeBt}q0FY{9JyQV4z
zjzK19u2dfK!&J#B>OeG2N#t@H$MRdapO@L`!3%~#N4`@YrC7KkgbhVNHcziZ5exS8
z8&}B8oB7xl^`T0KFCl39z6$iVoO&f5=C133^MrBPe{TJIR=4B43KCB;9TXtLyVNsR
z|6x?A$6*QaBqm7pOm76Y@JtbK>Tt331I9~>1&yZ{IiTDhlWvJ9uJ_J^$rQ;@e!#{v
ze@C8C_|D*M@7|PQ
zpm@L~f7f+D6IO7moE*CbPUZ+$o|7ZNQgj7S7mg_Q7)svcf
z4E`sLh%WSDmr;LLxgH3$kdn1gE{hEKLm%Z=6i<
zUQ&MRv%VpmAuNI&n;sGyI;EmcD7W_HkRPtKMwJ>&I~Y9=5_5Ut=um5qU>l#mCyBuB
zFL*>vxrrb^1#9#wltNsGp(n!f!+wZX;D62#eIO9(-H7;%os7Xr%1Jan95)5FYA-br
ze~7H}gM?b?#R>x6K{|f-}~Qzr6^x959{-5(yhf1FMB`(u3T(G^4DE|-P^KgyLJ{pM|x_7&Yp
zzQPIvUz?ta>Q4t8i8eS4ASOxwEI-{U>WBixGA^W~KS+TxThc60gf?2=Za-S;Etq&rQx~a%BqdIWE$)umJD?}C#
zUGF?cy49h!0o=_yrI5K7He_5`<6+1EiU-P?{Wv4PTJ;zne^0epnI(#cGa53~?nTf%
zEa->k=#|!Gr(3wN(7Os?n~dbuf2Yp&dm^a*EDt7Vu1e+0GCF*%*F$sp0lvHf1%cHG
z<*Z?TlTZ**dvDY^~{MIg`4|^GTNkVujm(TO7|mgG>_5ukj6V~c!HV!#b_yd{~lg^`&&4F~X33NTDf0`^*>Gt0#
zIhzn`OQ!hTh8*Df>hxwhF@&{0n+q59*Nk4JvDDD?&BlUCt(VBR&tImh*`Y9+QU;$Y
z&>!=xDzp#}b@1JZRXC5{`W}Uml6C|#q++9Ry}Mg;hI!-@GjNDeX;CM{k!E{ZNqxPd
zsT$j@6xz|^llF+P%Dxxte{@x%kAp>-^V*%#WTX7l>+K&6yHr9lnyus}Bq8^Ia|!54
zV%)b`hiV!+lL9LizYrvU;enrRmwTR%O8E^W%E@tvSJsxZTCT&}65NQf^wPmfBiC6Q
zptm3uFhZGNVEhExB|~*Bld;IQ9_|sXdh_i9_qSQ{Et7{7>_D!fe_^UoZUF6ED56M^
z>F`+|{D%hA5~w+x0uBgyzb6jz(H<~`Zt#6JY&Bz#PprF@u$b{4qtPfOx(U0SV6?jEowN!YjxCa
zgy*5~A}d@v&PLd;RI`Q4zQKu*v{rqM@A+B9?+fg(#gHEe9tgO5)?*-)8#PA8D3SKk
ziWKe8E5}o+e