From 5632d043caf31f650de24be6a645d814edae3cde Mon Sep 17 00:00:00 2001
From: serkor1 <77464572+serkor1@users.noreply.github.com>
Date: Fri, 3 Oct 2025 22:25:52 +0200
Subject: [PATCH 01/26] :hammer: New utility functions
* input_name(): strip namespace calls and deparse symbol
* rebuild_formula(): drop exclude (default idx) and reformulate
* add_idx(): attach idx labels from .plotting_environment or row seq
* to_title(): replace underscores and convert to title case
* has_arg(): detect provided args, including via ..., in parent call
---
R/utils.R | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 71 insertions(+)
diff --git a/R/utils.R b/R/utils.R
index 9bf1da01b..008f0b7ee 100644
--- a/R/utils.R
+++ b/R/utils.R
@@ -181,3 +181,74 @@ reclass <- function(x, ...) {
is.formula <- function(x) {
inherits(x, "formula")
}
+
+## extract input name
+input_name <- function(x) {
+ if (is.call(x) && as.character(x[[1L]]) %in% c("::", ":::")) {
+ x <- x[[3L]]
+ }
+ deparse(x)
+}
+
+rebuild_formula <- function(
+ x,
+ exclude = "idx"
+) {
+ ## this function removes
+ ## idx and rebuilds the passed
+ ## series as formulas
+ idx <- grepl(
+ pattern = exclude,
+ x = x,
+ ignore.case = TRUE
+ )
+
+ stats::reformulate(
+ x[!idx]
+ )
+}
+
+add_idx <- function(x) {
+ ## store idx
+ idx <- .plotting_environment$idx$label
+
+ if (!is.null(idx)) {
+ idx[
+ attributes(x)$subset %||% 1:nrow(x)
+ ]
+ } else {
+ 1:nrow(x)
+ }
+}
+
+to_title <- function(
+ x
+) {
+ ## remove underscores
+ ## if preset
+ x <- gsub(pattern = "_", replacement = " ", x = x)
+ gsub("\\b(.)", "\\U\\1", tolower(x), perl = TRUE)
+}
+
+
+has_arg <- function(name) {
+ ## shamelessly stolen from
+ ## {methods}
+ aname <- as.character(substitute(name))
+ fnames <- names(
+ formals(
+ sys.function(sys.parent())
+ )
+ )
+
+ if (is.na(match(aname, fnames))) {
+ if (is.na(match("...", fnames))) {
+ FALSE
+ } else {
+ dotsCall <- eval(quote(substitute(list(...))), sys.parent())
+ !is.na(match(aname, names(dotsCall)))
+ }
+ } else {
+ eval(substitute(!missing(name)), sys.frame(sys.parent()))
+ }
+}
From f5140d5d788d2b38ecd826b20187566597fe10a7 Mon Sep 17 00:00:00 2001
From: serkor1 <77464572+serkor1@users.noreply.github.com>
Date: Fri, 3 Oct 2025 22:35:53 +0200
Subject: [PATCH 02/26] :hammer: Flexible main charts
The chart function have been updated with the following changes:
* idx: An optional argument which replaces the x-axis labels. It is possible
to, for example, replace the 1:nrow(x) with dates.
* title: An optional custom title for the chart. Pretty selfexplanatory.
---
R/chart.R | 32 ++++++++++++++++++++++++++++----
man/chart.Rd | 4 +++-
2 files changed, 31 insertions(+), 5 deletions(-)
diff --git a/R/chart.R b/R/chart.R
index 9199a2632..5fde0c052 100644
--- a/R/chart.R
+++ b/R/chart.R
@@ -23,6 +23,7 @@
#'
#' @param x An OHLC object to be charted.
#' @param type A [character] of [length] 1. Either `candlestick` or `ohlc`.
+#' @param idx A [vector] with the same [length] of `x`. If passed it will replace the x-axis labels. See `vignette("charting")` for more details.
#' @param ... Parameters passed into [plotly::plot_ly]
#'
#' @example man/examples/charting.R
@@ -31,6 +32,8 @@
chart <- function(
x,
type = "candlestick",
+ idx = NULL,
+ title,
...
) {
## clear env if called
@@ -54,6 +57,7 @@ chart.default <- function(
x,
type = "candlestick",
idx = NULL,
+ title,
...
) {
## default chart function
@@ -71,6 +75,15 @@ chart.default <- function(
## 3. chart: The user-facing TA chart.
## This is empty and is constructed on the fly
## via plotly::subplot.
+
+ ## extract title
+ if (missing(title)) {
+ chart_title <- input_name(
+ substitute(x)
+ )
+ } else {
+ chart_title <- title
+ }
.color_values <- .chart_theme()
.plotting_environment$sub <- .plotting_environment$chart <- list()
@@ -83,6 +96,10 @@ chart.default <- function(
x <- as.data.frame(x)
x$idx <- if (is.null(idx)) 1:nrow(x) else idx
.plotting_environment$x <- data_frame <- x
+ .plotting_environment$idx <- list(
+ label = x$idx,
+ index = seq_along(x$idx)
+ )
## generate price chart
## based on type. can be either
@@ -137,10 +154,17 @@ chart.default <- function(
.plotting_environment$main <- .chart_layout(
x = price_chart,
title_text = sprintf(
- "Ticker: %s
Period: %s",
- deparse(substitute(x)),
- "Period Value"
- )
+ fmt = "Ticker: %s
Period: %s ",
+ chart_title,
+ paste(
+ .plotting_environment$idx$label[1],
+ "-",
+ .plotting_environment$idx$label[length(
+ .plotting_environment$idx$label
+ )]
+ )
+ ),
+ idx = idx
)
.plotting_environment$main
diff --git a/man/chart.Rd b/man/chart.Rd
index 461c5672e..3d59251f2 100644
--- a/man/chart.Rd
+++ b/man/chart.Rd
@@ -4,13 +4,15 @@
\alias{chart}
\title{Chart}
\usage{
-chart(x, type = "candlestick", ...)
+chart(x, type = "candlestick", idx = NULL, title, ...)
}
\arguments{
\item{x}{An OHLC object to be charted.}
\item{type}{A \link{character} of \link{length} 1. Either \code{candlestick} or \code{ohlc}.}
+\item{idx}{A \link{vector} with the same \link{length} of \code{x}. If passed it will replace the x-axis labels. See \code{vignette("charting")} for more details.}
+
\item{...}{Parameters passed into \link[plotly:plot_ly]{plotly::plot_ly}}
}
\description{
From 1ca708b6ab128a7573322ce416b42528f80bbf47 Mon Sep 17 00:00:00 2001
From: serkor1 <77464572+serkor1@users.noreply.github.com>
Date: Fri, 3 Oct 2025 22:38:18 +0200
Subject: [PATCH 03/26] :hammer: Updated series function
* If the series is being subset, then the returned value
will have a non-null attribute called 'subset' which can
be passed downstream to align multiple series.
NOTE: It might have been a better idea to always pass
a subsetting vector, rep(TRUE, nrow(x)) if no subsetting have been done
---
R/series.R | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/R/series.R b/R/series.R
index 7e241db0b..97705dfe1 100644
--- a/R/series.R
+++ b/R/series.R
@@ -40,13 +40,19 @@ series.plotly <- function(
dotsQ$data <- quote(.plotting_environment$x)
}
- as.data.frame(
+ out <- as.data.frame(
do.call(
series.formula,
c(list(x = formula, default = default), dotsQ),
quote = FALSE
)
)
+
+ ## set subset attribute
+ ## for the
+ attr(out, "subset") <- eval(dotsQ$subset)
+
+ out
}
#' @export
@@ -96,6 +102,10 @@ series.formula <- function(
)
}
+ ## set subset attribute
+ ## for the
+ attr(out, "subset") <- eval(dotsQ$subset)
+
as.data.frame(
out
)
From 5613593c3aa81f7debee7c098c5ef92074e87172 Mon Sep 17 00:00:00 2001
From: serkor1 <77464572+serkor1@users.noreply.github.com>
Date: Fri, 3 Oct 2025 22:57:30 +0200
Subject: [PATCH 04/26] :hammer: Charting Tools
* indicator(): The function is inherits the label
and idx from the main chart-function.
It will (also) now give an informative error
message if the data is not provided.
It will (also) add title to the singular indicator
charts.
* .chart_layout(): The function now support the idx, label and title
for the chart-function. All axis-titles are removed.
---
R/chart_elements.R | 14 ++++++++++++--
R/chart_indicator.R | 44 +++++++++++++++++++++++++++++++++++++++++---
2 files changed, 53 insertions(+), 5 deletions(-)
diff --git a/R/chart_elements.R b/R/chart_elements.R
index 83b8ce6a7..8b7518709 100644
--- a/R/chart_elements.R
+++ b/R/chart_elements.R
@@ -1,4 +1,9 @@
-.chart_layout <- function(x, title_text, ...) {
+.chart_layout <- function(
+ x,
+ title_text,
+ idx = NULL,
+ ...
+) {
## extract chart theme
## from R/chart_options.R
chart_theme <- .chart_theme()
@@ -18,9 +23,11 @@
color = chart_theme$font_color
),
yaxis = list(
+ title = '',
gridcolor = chart_theme$grid_color
),
xaxis = list(
+ title = '',
gridcolor = chart_theme$grid_color,
rangeslider = list(
visible = getOption(
@@ -31,7 +38,10 @@
"talib.chart.slider.size",
default = 0.05
)
- )
+ ),
+ tickvals = seq_along(idx),
+ tickmode = "auto",
+ ticktext = idx
),
## legend start
diff --git a/R/chart_indicator.R b/R/chart_indicator.R
index b978af695..be5c9a69b 100644
--- a/R/chart_indicator.R
+++ b/R/chart_indicator.R
@@ -19,6 +19,21 @@
#'
#' @author Serkan Korkmaz
indicator <- function(FUN, ...) {
+ ## resolve function name of no
+ ## title have been passed
+ title <- input_name(
+ substitute(
+ FUN
+ )
+ )
+
+ ## clean up title
+ if (any(grepl(x = title, pattern = "_"))) {
+ title <- to_title(
+ title
+ )
+ }
+
## plotting environment
## does exist
chart_called <- TRUE
@@ -39,6 +54,24 @@ indicator <- function(FUN, ...) {
## object to trigger .plotly
## method downstream
plt <- plotly::plot_ly()
+
+ if (has_arg(idx)) {
+ idx <- eval.parent(
+ match.call()[["idx"]]
+ )
+ } else {
+ idx <- NULL
+ }
+
+ .plotting_environment$idx$label <- idx
+
+ if (has_arg(data)) {
+ data <- eval.parent(
+ match.call()[["data"]]
+ )
+ } else {
+ stop("'data'-argument has to be provided.")
+ }
}
## construct {plotly}-object
@@ -79,13 +112,18 @@ indicator <- function(FUN, ...) {
)
.plotting_environment$chart <- fig
- return(fig)
+ return(
+ fig
+ )
}
## reconstruct charting
## as if called from chart()
- .chart_layout(
+ outcome <- .chart_layout(
x = outcome,
- title_text = "title_text"
+ title_text = title,
+ idx = if (is.null(idx)) 1:nrow(data) else idx
)
+
+ outcome
}
From 8a9d26b64aebe9c627d0a24a573b9d5789bb632b Mon Sep 17 00:00:00 2001
From: serkor1 <77464572+serkor1@users.noreply.github.com>
Date: Sat, 4 Oct 2025 11:20:16 +0200
Subject: [PATCH 05/26] :books: Updated README
* Added a description of the interface and the differences
from the core library
* Simplified the basic usage section so it is indeed basic.
* Updated installation instructions.
---
README.Rmd | 142 ++++++++++--------
README.md | 177 ++++++++++++++---------
man/figures/README-charting-1.png | Bin 180325 -> 94711 bytes
man/figures/README-unnamed-chunk-3-1.png | Bin 0 -> 74566 bytes
4 files changed, 185 insertions(+), 134 deletions(-)
create mode 100644 man/figures/README-unnamed-chunk-3-1.png
diff --git a/README.Rmd b/README.Rmd
index 290bbabe9..c1a03a76e 100644
--- a/README.Rmd
+++ b/README.Rmd
@@ -6,19 +6,20 @@ output: github_document
```{r setup, include = FALSE}
# set options
-Sys.setenv(OPENSSL_CONF="/dev/null")
+Sys.setenv(OPENSSL_CONF = "/dev/null")
knitr::opts_chunk$set(
- collapse = FALSE,
- comment = "#>",
- fig.path = "man/figures/README-",
- message = FALSE,
- warning = FALSE,
- echo = FALSE
+ collapse = TRUE,
+ comment = "#>",
+ fig.path = "man/figures/README-",
+ fig.dpi = 120,
+ message = FALSE,
+ warning = FALSE,
+ echo = FALSE
)
```
-# {talib}: R bindings for [TA-Lib](https://github.com/TA-Lib/ta-lib)
+# {talib}: A Technical Analysis and Candlestick Pattern Library in R
[](https://github.com/serkor1/ta-lib-R/actions/workflows/R-CMD-check.yaml)
@@ -27,85 +28,100 @@ knitr::opts_chunk$set(
[](https://r-pkg.org/pkg/talib)
-[{talib}]() provides high-performance R bindings to the [TA-Lib](https://github.com/TA-Lib/ta-lib) C-library for Technical Analysis indicators, Candlestick patterns and interactive charting via [{plotly}]().
+[{talib}](https://serkor1.github.io/ta-lib-R/) is an `R`-package for Technical Analysis and algorithmic Candlestick pattern recognition built on the `C` library [TA-Lib](https://github.com/TA-Lib/ta-lib). [{talib}](https://serkor1.github.io/ta-lib-R/) extends [{TTR}](https://github.com/joshuaulrich/TTR) by adding Candlestick pattern recognition to the pool of available indicators, and interactive charts via [{plotly}](https://github.com/plotly/plotly.R).
-## Installation
+[TA-Lib](https://github.com/TA-Lib/ta-lib) supports 200+ indicators for Technical Analysis and Candlestick Patterns, all of which are available in [{talib}](https://serkor1.github.io/ta-lib-R/).
-### Stable version
-```{r devel_install, echo = TRUE, eval = FALSE}
-pak::pak("talib")
-```
+## Types of Indicators and Interface
-### Development version
+In the core C library functions are named as `TA_INDICATOR()` and `TA_CDLPATTERN()` for indicators and patterns respectively. In the `Python`-wrapper the functions are named `INDICATOR()` and `CDLPATTERN()`---but this `R` package follows the [tidyverse styleguide](https://style.tidyverse.org/) and therefore the naming is inconsistent with the core library and the Python wrapper. See below for an example of the mapping:
-The development version can be installed by recursive cloning the repository and using the available build tools as follows:
+
-```shell
-git clone --recursive https://github.com/serkor1/ta-lib-R.git
-cd ta-lib-R
-make build
+| Function Group | TA-Lib (core) | {talib} |
+|:----------------------|:---------------------|:---------------------------|
+| Overlap Studies |`TA_BBANDS()` | `bollinger_bands()` |
+| Momentum Indicators |`TA_CCI()` | `commodity_channel_index()`|
+| Volume Indicators |`TA_OBV()` | `on_balance_volume()` |
+| Volatility Indicators | `TA_ATR()` | `average_true_range()` |
+| Price Transform | `TA_AVGPRICE()` | `average_price()` |
+| Cycle Indicators | `TA_HT_SINE()` | `ht_sine_wave()` |
+| Pattern Recognition | `TA_CDLHANGINGMAN()` | `hanging_man()` |
+
+
+
+However, each function in [{talib}](https://serkor1.github.io/ta-lib-R/) is aliased so its consistent with the remaining ecosystem. See below:
+
+```{r, echo = TRUE}
+all.equal(
+ target = talib::bollinger_bands(talib::BTC),
+ current = talib::BBANDS(talib::BTC)
+)
```
-Use `make` to see package-level build-tools.
+The aliases are exported but are not a part of the documentation, but they behave exactly the same as the main functions as demonstrated above.
## Basic Usage
+Below are an example on how to use [{talib}](https://serkor1.github.io/ta-lib-R/) to calculate an indicator and charting it.
+
### Indicators
-This is a basic example which shows you how to solve a common problem:
-```{r indicator, echo = TRUE}
+```{r, echo = TRUE}
## calculate bollinger
## bands
tail(
- talib::bollinger_bands(
- talib::BTC
- )
+ talib::bollinger_bands(
+ talib::BTC
+ )
)
```
### Charting
-```{r charting, fig.align = 'center', fig.dpi = 180, echo = TRUE}
-library(talib)
-
-## calculate bollinger
-## bands
-x <- talib::BTC
+```{r charting, fig.align='center', echo=TRUE}
{
- ## chart Bitcoin
- ## with candlesticks
- talib::chart(
- x = x
- )
-
- ## add bollinger bands
- ## to the chart
- talib::indicator(
- FUN = talib::SMA,
- cols = ~ close + open
- )
-
- ## add bollinger bands
- ## to the chart
- talib::indicator(
- FUN = talib::bollinger_bands
- )
-
- ## add RSI indicator
- ## to the chart
- talib::indicator(
- FUN = talib::relative_strength_index
- )
-
- ## add harami indicators
- ## to the chart
- talib::indicator(
- FUN = talib::harami
- )
+ ## main chart
+ talib::chart(
+ talib::BTC,
+ ## optional idx-argument
+ ## for adding dates to chart
+ idx = rownames(talib::BTC)
+ )
+
+ ## add bollinger bands
+ ## to chart
+ talib::indicator(
+ talib::bollinger_bands
+ )
}
+
```
+## Installation
+
+[TA-Lib](https://github.com/TA-Lib/ta-lib) is vendored in [{talib}](https://serkor1.github.io/ta-lib-R/) via `CMake`, so it is not necessary to have [TA-Lib](https://github.com/TA-Lib/ta-lib) pre-installed.[^1]
+
+### Stable version
+```{r devel_install, echo = TRUE, eval = FALSE}
+pak::pak("talib")
+```
+
+### Development version
+
+The development version can be installed by recursive cloning the repository and using the available build tools as follows:
+
+```shell
+git clone --recursive https://github.com/serkor1/ta-lib-R.git
+cd ta-lib-R
+make build
+```
+
+Use `make` to see package-level build-tools.
+
## Code of Conduct
-Please note that [{talib}]() is released with a [Contributor Code of Conduct](https://contributor-covenant.org/version/2/1/CODE_OF_CONDUCT.html). By contributing to this project, you agree to abide by its terms.
\ No newline at end of file
+Please note that [{talib}](https://serkor1.github.io/ta-lib-R/) is released with a [Contributor Code of Conduct](https://contributor-covenant.org/version/2/1/CODE_OF_CONDUCT.html). By contributing to this project, you agree to abide by its terms.
+
+[^1]: Some systems (Windows in particular) may require you to explicitly install and link `CMake` for [{talib}](https://serkor1.github.io/ta-lib-R/) to build properly.
\ No newline at end of file
diff --git a/README.md b/README.md
index 94a8e0fbc..c9dc647c1 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
-# {talib}: R bindings for [TA-Lib](https://github.com/TA-Lib/ta-lib)
+# {talib}: A Technical Analysis and Candlestick Pattern Library in R
@@ -14,103 +14,138 @@ status](https://www.r-pkg.org/badges/version/talib)](https://CRAN.R-project.org/
downloads](https://cranlogs.r-pkg.org/badges/last-month/talib?color=blue)](https://r-pkg.org/pkg/talib)
-[{talib}]() provides high-performance R bindings to the
-[TA-Lib](https://github.com/TA-Lib/ta-lib) C-library for Technical
-Analysis indicators, Candlestick patterns and interactive charting via
-[{plotly}]().
-
-## Installation
-
-### Stable version
+[{talib}](https://serkor1.github.io/ta-lib-R/) is an `R`-package for
+Technical Analysis and algorithmic Candlestick pattern recognition built
+on the `C` library [TA-Lib](https://github.com/TA-Lib/ta-lib).
+[{talib}](https://serkor1.github.io/ta-lib-R/) extends
+[{TTR}](https://github.com/joshuaulrich/TTR) by adding Candlestick
+pattern recognition to the pool of available indicators, and interactive
+charts via [{plotly}](https://github.com/plotly/plotly.R).
+
+[TA-Lib](https://github.com/TA-Lib/ta-lib) supports 200+ indicators for
+Technical Analysis and Candlestick Patterns, all of which are available
+in [{talib}](https://serkor1.github.io/ta-lib-R/).
+
+## Types of Indicators and Interface
+
+In the core C library functions are named as `TA_INDICATOR()` and
+`TA_CDLPATTERN()` for indicators and patterns respectively. In the
+`Python`-wrapper the functions are named `INDICATOR()` and
+`CDLPATTERN()`—but this `R` package follows the [tidyverse
+styleguide](https://style.tidyverse.org/) and therefore the naming is
+inconsistent with the core library and the Python wrapper. See below for
+an example of the mapping:
+
+
+
+| Function Group | TA-Lib (core) | {talib} |
+|:----------------------|:---------------------|:----------------------------|
+| Overlap Studies | `TA_BBANDS()` | `bollinger_bands()` |
+| Momentum Indicators | `TA_CCI()` | `commodity_channel_index()` |
+| Volume Indicators | `TA_OBV()` | `on_balance_volume()` |
+| Volatility Indicators | `TA_ATR()` | `average_true_range()` |
+| Price Transform | `TA_AVGPRICE()` | `average_price()` |
+| Cycle Indicators | `TA_HT_SINE()` | `ht_sine_wave()` |
+| Pattern Recognition | `TA_CDLHANGINGMAN()` | `hanging_man()` |
+
+
+
+However, each function in [{talib}](https://serkor1.github.io/ta-lib-R/)
+is aliased so its consistent with the remaining ecosystem. See below:
``` r
-pak::pak("talib")
-```
-
-### Development version
-
-The development version can be installed by recursive cloning the
-repository and using the available build tools as follows:
-
-``` shell
-git clone --recursive https://github.com/serkor1/ta-lib-R.git
-cd ta-lib-R
-make build
+all.equal(
+ target = talib::bollinger_bands(talib::BTC),
+ current = talib::BBANDS(talib::BTC)
+)
+#> [1] TRUE
```
-Use `make` to see package-level build-tools.
+The aliases are exported but are not a part of the documentation, but
+they behave exactly the same as the main functions as demonstrated
+above.
## Basic Usage
-### Indicators
+Below are an example on how to use
+[{talib}](https://serkor1.github.io/ta-lib-R/) to calculate an indicator
+and charting it.
-This is a basic example which shows you how to solve a common problem:
+### Indicators
``` r
## calculate bollinger
## bands
tail(
- talib::bollinger_bands(
- talib::BTC
- )
+ talib::bollinger_bands(
+ talib::BTC
+ )
)
+#> upper middle lower
+#> 361 106812.14 99260.81 91709.48
+#> 362 104471.11 98218.27 91965.44
+#> 363 100874.66 97021.36 93168.05
+#> 364 99891.29 96519.09 93146.89
+#> 365 99875.94 96136.93 92397.91
+#> 366 99720.50 95622.57 91524.65
```
- #> upper middle lower
- #> 361 106812.14 99260.81 91709.48
- #> 362 104471.11 98218.27 91965.44
- #> 363 100874.66 97021.36 93168.05
- #> 364 99891.29 96519.09 93146.89
- #> 365 99875.94 96136.93 92397.91
- #> 366 99720.50 95622.57 91524.65
-
### Charting
``` r
-library(talib)
-
-## calculate bollinger
-## bands
-x <- talib::BTC
{
- ## chart Bitcoin
- ## with candlesticks
- talib::chart(
- x = x
- )
-
- ## add bollinger bands
- ## to the chart
- talib::indicator(
- FUN = talib::SMA,
- cols = ~ close + open
- )
-
- ## add bollinger bands
- ## to the chart
- talib::indicator(
- FUN = talib::bollinger_bands
- )
-
- ## add RSI indicator
- ## to the chart
- talib::indicator(
- FUN = talib::relative_strength_index
- )
-
- ## add harami indicators
- ## to the chart
- talib::indicator(
- FUN = talib::harami
- )
+ ## main chart
+ talib::chart(
+ talib::BTC,
+ ## optional idx-argument
+ ## for adding dates to chart
+ idx = rownames(talib::BTC)
+ )
+
+ ## add bollinger bands
+ ## to chart
+ talib::indicator(
+ talib::bollinger_bands
+ )
}
```
+## Installation
+
+[TA-Lib](https://github.com/TA-Lib/ta-lib) is vendored in
+[{talib}](https://serkor1.github.io/ta-lib-R/) via `CMake`, so it is not
+necessary to have [TA-Lib](https://github.com/TA-Lib/ta-lib)
+pre-installed.[^1]
+
+### Stable version
+
+``` r
+pak::pak("talib")
+```
+
+### Development version
+
+The development version can be installed by recursive cloning the
+repository and using the available build tools as follows:
+
+``` shell
+git clone --recursive https://github.com/serkor1/ta-lib-R.git
+cd ta-lib-R
+make build
+```
+
+Use `make` to see package-level build-tools.
+
## Code of Conduct
-Please note that [{talib}]() is released with a [Contributor Code of
+Please note that [{talib}](https://serkor1.github.io/ta-lib-R/) is
+released with a [Contributor Code of
Conduct](https://contributor-covenant.org/version/2/1/CODE_OF_CONDUCT.html).
By contributing to this project, you agree to abide by its terms.
+
+[^1]: Some systems (Windows in particular) may require you to explicitly
+ install and link `CMake` for
+ [{talib}](https://serkor1.github.io/ta-lib-R/) to build properly.
diff --git a/man/figures/README-charting-1.png b/man/figures/README-charting-1.png
index 92dee688face8403b3b995f659e4978954caa3b8..95bb9fc35f8c97e475d73cbec074cf5d8bde4e04 100644
GIT binary patch
literal 94711
zcmb@ubyU>f8wNOpfKn>bDIzGHLk}uSNGUziE#2KBAT21Jektja9J+g?yGxp(hMd_C
z#&7rR**|vA+0Qu~I0JLJ_q}gC&-1Xx!Ir(vfpowk3z|5Wb@mc{`C=tD+z
zhU@*Owlm+m;HfYeNrk;0(iv%DM1N|n2YfOzdgNldH=CBYm!|G2XYrPUtM|<@8MgTI
zRxGtA`-4-#n6I%7@E{3c_CquauDCC69v>?r8j;rg!LjhDh{GY=
zeZ!>nn5`16rVt%ZV$e_5HO5>;ugd##U)`TPyMGUOpzV7NxSB8@6{rdNY|u6_g(9~A
zhU?dvW9kKw82UB(+6CchMgc}$?4x|fJ#)-s289*ags$inO>Ym;C(v(wQBmFSlElWcOz4dUmxY=r^H%kFEOI1ghQW
zmUbGc*eNajspG!|*Lb?*o)CMRId<$P;AFz62{}hOYEhTHZ{BJw^j8R^X51_ESf5*i
zT89Vf+2`UhONtuL+-&|-g{t&rnZa@Wid%QL3?>%G}W74v)q0cPo*
zA>&nQ{9pk-G5+q#0u9qxb93ul%M+@-xrTv=?dzkexv{yn;s)G=6pD>7C5aS1Ho#sf
zgVMydf6vKocz^;0AaO%WBncxrK%0B1TC)w_j*6*zS8EGPE-;Ln}_!OcYm4luy#TK1|08q?&4UBtH3uW23vj(LSN~MuUF&
zAe!7xL?`8H-Ob+geI9$?^4_l2kE){9qvpaPWua6>mwj;=*2L9Ji3Vwr*rW}}dLi7s
z_V0uyKCPsCs}e+lt)^e>
z7kgLqYMgsHl|Z}lBgd{buO+yJc_7<$eQTx)a1ob%(T@Y_GIru58O|<6EgMHzr8aHr
zCb%*nfBn0D-B^7aafWKr`k#|<$0Nm*o!@a1Z0gZH$)X<;PRiUY#
zr{t#kr?jh+u%_gZt9dLq=(A!r;E(dJS_4rLQDl8UEPXu*CxQj!v(kft2AX$Ie-00K
z1}SLOdLd|*aN{0vzWQE9>3505dHvPP>CWfhkw_O1H||oe7Wmi{;TBGeI=eKy*bgHg
z<`4&(CF-IPidBKZywP_
z#jCOkZ_t@3dbh>Ok%v~i1-aVHF^CEKk8B!ySve`Dp8s%l8lE2#-fnOb>6p;-=`5n2
z=(R9{sPUz1u~+SYdrwqxWg1|otZ22(L5CT=0R;|M
z(;Cmf_B0Fu;7wT*CugMH;?L;iZ7Z;(
zo5P1AGbPfATk$GVH+D0q-IP?un5BcqYz48fd@s&x;kMeDa{UxiHUu>hH^OSmy#1D7wm|`so?BZR8%R#VX=UgYK3FWkFIdg#u5Ow4fI-~&Xq?t+rYy|S
zO!0$Bnduyk7#&xc=2v_(CHoD3{z$r#c=1c3q2XaEaQvEwFa4&IhhlO`Bf^oOZ4rp~
z2ab)@K@mV^8Ll+t@bUGt0?RRpwIr&rP|#C%>=T#zjF2U1O&_S8cdt3f%ZJ;ecAj>2
zNtI1m?MypnxV=6~^A4V@*uPu$>p|0HlrI+G|E1PloYU&gi!PorOv|&4?x|rL@CSm&
z0{mdaGMg>0-3EBU$1z3xl6Yu#xU4CF!WIyQHh$Z<64-mf)`Whvlulg;9O0?Lt7lC#Jxu5!dw?FW%^O0W0LYOuA*Or#Ew#fZcrB(!qWzouP9!Tv
z{PHZknw9yM^PnE?aAAq{`1^&$&|$i)z)7pB<^FMp*;?-~T2Ww|BV;z(`+DQN4GvGA
zy=#uMZkV(JGe&a*p1-w4MFcsbQBjFr=3o70mX=$VcM$x(VrHt|S$aw@5=rk72NWg{
zw*pD^jDnF0{uHi5HS)NSCBE-o*eirv{f{42Bo^;iiEYt$`hMUE@RRj1-?!)8jRhmkt*rzSAeV8HST@jUBB>4-l%BdJ}`Zir1fq}LR^KH
z^tMs8==TC*(*3tODgg`hpbXB@(n3&=T@6p%Iel+tX}LMOBZ?1)y^j?o9Y0_y?7GfG
zEoj@eLHwYrQI#@&W?)d~^1X$5$C?948qLNwmjoAT8F6SSu{J%%=Hy(`vd_hy2y;2%
zjps~bJI$=C3j!`xMUS2_THbE&xZ0#djSNV{EbwbjtW^hL8X{bvFq7-Krvh2U&{gPr
ziET4I-of6!FJG>%keDnaePcMV0x-eI&&ik8I^qqYNQcArc#!t?zR_IJ07XzsQss6}
zvOCV+EKc*r(a`k#bCKB98QVs7SW~KwrO;XbTTroXt!n**L;tb0lbd^i^?d||Mv1oJ
zb?5Jb6zO|KYo3nRV;tR>PyZw%2lPuSs2CsX!tB2t;Fn?Gqg7c+Qlyt0|Sy
zv0yh;_JmxOj*5yFL1eLZUGvlk3y?=f1^IaeNHOkA$@*Mw>&3i&jPH&}Rn+x7A{R>K
z1fr$Jy&>Jz7fp@YvPI)sxrma((-WN;?Oow@KsDkUsLOX02u}A-%ULIz)^K(}4i*`@
zM@@vyEiLYB0w{~d%)u*V%yJwvP=7OOzg~eezGLHvT<{`-fY|@H
zQ#Y|3^OyD25Uwe~RCUqOpD(|E%X1S~X1rBp0`)rSV5z@Y*8&1++l$tF(BxuvW4jL$2D0NrA-kvDt%xfZM_W7P}wlL!Lp+%pER2auiOqYr(+1$#4
znJ&tH=_>K@$)l}$dyYpQzV=d2??v&5@V?aX{!}((09XK_u4aF+
zI4urg!Qu^ZBgiqana83aIvu$@)7PK4j+yEx;?-=oYfKxoWpSHRcEBAQ2%kZtD
zk7IpJuh~M2S;E=1P>5Uj_O-XXqI{{riYZl65|CN+p-d{WLBV_Q3!Vm=Y8zcPnx9(^
z_9wj^z|eoxCh2vwW@fce
zOCHtLH@+)6RpZX4M~}7|*Da(^mJ#Y_p>HI9pjfr{Yim7FV}9}4b%8TylwGZJ<)qxa
z@AQSAWracdAmdTSBo;N>x6f50n@*T_@vsv^Uz%PM79R(_1hC;#c)zP($JK=%+PuZG
zO%h2-SJ(9Zy1+ZWW?Im<+3BcLz=qQ<=V$xblP(E#jWL?c(zg?+I=1MX`b<0azEwRG
z0{ygL#|vkl_^XcZ!8|B{%}u`$$SGfY*P|85!9RslIjvkgdHft;bB|}zgh%@}otEu{
zHmrCHiVE0pxEH)mZe>1_1Wj74?T^VS;Y#W5?>y_~6UT}h?4JX@AFMFnzo;yjt#c08
z6R?~rFS@Zr+I6tcC`OEV64QPAjM8d0G2!PbDtvR6R&+0Kjk@tVx`593HBz6M`LNBvO9YFQq!Oaj~%Tfa>UYV{wdlzZ)A;
zv+{MbL+EjUEVj20xF1#>g)c5Sk9H@zFzjmYc>V`0ChEFx1aFkAaM(vvK*_#NU-PMS
zF4-w-EIeDt#&_(@)h>JgRX>Aj1`8LqdG+XKhq1YoSteA})CN{gAKyqmn(=V0aM$7j
zGBf~mZ5fU-hN2Cmf`Z>$S(vuva1<`o)KcKldLmtcSj4bV0C%K0tdT-U45)y`b=bVm48%~{MWS4Tj_jKxbVY7c8;2ojww~P!e~R6GetCF
zWHZZkW8OsU`weVi55&xpKIq7$FE>L!OiI$~F&;kFX_R5Sx3RdC`FPvsV(8Lpe@@{t
zpHobiYsxC9deyyOuvGqVv*euI2^W=c-lB<$|wJdQM=a5AAmSw4wp97)VU)e1E*(XsWsZ1
zRaP^y(i;{4AC5j?0`j~5`vadcc{xkb1{m@l9(IW0D-YxE*=%HM_`U!q
zuPN=L4O$=od~(?pZ_bb81lcUqwd9fLMZ-7DVy8S8xfKSAuGSY&mOUHVJCvsU)l~rP
zeLI*c+yf{QbXsUke+JJ}dPbmXGp7Q~%kfyJR`c{E8)7M({;KxFn1Izx2^aXrV}fTz9tp$E_f05LF#
zkS>M6A*_wI6gZX>wuZZPglE?n_j|CtL$Y5XdUK{w7(^tq}>JvnuWLoruuLz&4Kx@u<{aEil*{QSc*(_Ihw
z5n~5Knq-5_x||?@Cx%Bw4PIv3JS|2dhk$K`yfmD$KEuMOQ%8Q5XR7fjDltAEEVikK
z&;!y|&v^w)&&JV?gwx05iOZg~^0O-+U9WRO&J>A(kdh{bFN3A~ixsnV?h#gCt#VYr
zDVjtsi
z+VJ_S^s-St0ImYez-qcYRh72|C>}r(ipus4GB{`jC=g%;@^qi>g9GmyC54^Lg!MkB
zyLTS^-PVP&_1t`4dpmY+({(67jNi~(=mQs_z0HN4kg79hwLRB?fJ2r6aH^^?QEq+&
z1`Zyp2Dr=8B7pz71xT3_Ww?38YV^~mr$yb?e}%~_yegId0&}$?Em6~$_*r3tb%QL9
zdq~0~h$>tc9_BC_{HGG_KBEQmdE~l3yS%eWqFw8RQ8Lk2Ja<{^aE=KA@Qx%LBF(KC
z0f1$oE@h46xzDhgiIH!k+gQctvpWk$PuAZ2i3BhSLw1ZT>fp5L#z_GDlr$~kFhzsh
zpSyLZX_C%kUD#z`_!)ef5E~OiN?MA0Kn(a9iOYhfwk5k|ClTR`D>f&mqICf5Tv<^lXTRFx(k3QGzxDdGPAHy)C)cnNoB?Hu^cZpb1+N+;Nl52_{)Hau;UhXt#%|J
zEN*Q{s;Zq+P|~qOeLDfBkym27cyaO~o$StM0Ko?n(XWj}McxbfD4RP1NIo|?x>&o>
z&m;*D5xGTp`*_pTKxxUpfrCW$GF5@#(QJg>^fgtKSbHv@+pFI
zugIPrdjPWb0ZI?I!WSLSQ^z9o9YF74iXY&0^Y!DH@uZ}u1~j4ALWz~;7Bc|XD9!Wp
z9G$iO&ykSl6HRCePLnDM8Y?
zgmtrvxq@T(fs}sL4FpccK_B-6pKp-ED>>{B&x=ox_d?{$U9Oo=X}wI<8zPIxXuQ^e
z<giYl?_EhO#l`H+}o1^$TI*{pHNrZT^&X7gm*L%-3l1fd?q9Y
z_2Rmp*3PeBVPSz$<9NwjZL7oOv!4CcBghK^uU_zy6-nisGJSkuwywaNNC0wnK9LWP
zGJr1J!ph8S8&!(Z$lDGYVEEGWz-;@q__lJFV;-P{C(2*=qduC>!OPi!>X1h~;M)|u
zja8`CbQ?C;k{z~D8q2c|T7W8%qG(n|m=1?WY-;1Z0LI|4oQ5Q$w*t@aft@C_5Ud@K=mZZ%&Q(AXDv
z%^zg2=uo@vrJJW}(E{IUxp*^)tOmp_h}*s^>E=QkK$yN46|J0^(R04D0R)}GnbO<2
zBOTYCuEMB}uD&|GJOq1Xf7$SgIKNwzs}IsLdBvRlj8;?QeL(82*gE$@Elc_Im7kq%uT+3fCA#KI4D5iq
z%&9A+MUX&u`lT9Gezvv+5dM&lEE`P*i4_=@9^++>N(Mn3@qJ_@OkXbvOx!=BV#iX-
zer!LU(ON#C#P^QF2P!5PI5`5Kx11hrfpus*Z-5*$2EY#h%|A)d4iCG){UjotT+jEQ
zYk^Ogr}0cu98g&tfZrVHi{ROGdg!*`djM5;F2>P6nAd@zf7}()0s1W46Bh>_1;6&7
zU2G-SUy-N-t@0`PDP(flC_>x8Q?6b&zcpnqRyb`9fILbOL2tw}jn>fVU$1K3U!~h9
zwVkn$+(xZvpn3Nz6EoHT87DkyV9CMIDIPDN)s?iR-3QC?LJtM0qNr$&zZ_CsStxDJkhN8!xqcy@MRGRC=Vh
z7TT2am;em!INiH(1n7h@6C0McWoA0PW;_dKwV$mUV7CSM4{pSfD{6wViD=nedrz^7
z)7%>IG-30dje>=#F$D(AfxZ%Sp{5OU+sZ{m^7%;t!cQJ{4`)W2}rJa4H%=
zt+>ixZn1TZfTRH^#6GJ4W#_n?|FMU?aT@5IWc#3
z0m9;-2iF4&V?)D2<7+pu-hK4Sg6Wtw(7Gys1>cmdmy8e=nf^5gP4%Tj#*s@eU@v7e
zyB!l@J*E|ojql@*2-cF4LdBHPbYLEE=X#MSH$f)FM?j8DNTK1{zDPNJEw-%;2|I`M
zo$pN6#@AhVKu{y}X17Q|D=V3Sr@3ErDT1DRdt+UD$IFd3**7#LoEdilF=xz6c~Ptl
zs52(sJjB=q!T>W%L7i?x(Gf2mW+Y5$slJ9Z9n(LG6G?kKQ?TeJxrqR9Nc?MAs^3O4
zEw?=>oM}GdY8dpFly+M?Nq6`)wGlTvp1qkZg-ZnKlPhWLkt-n^)UN|HOTcYp++soy
zZ+BcoOB&A|b=}ShtM+I43L*x_=4c>?n9{m#Ci9+7PQ|8hlw``;7JkNOQm(sr%SHK^
zi|Y|SfXoMkOYqFD=}A)Mk1E#(zQTHisDAQET(oRX3?SkFh2P!mCy-JBG_y13`{^0O
zCyBep02c-%ac^i-Y5Wm^+}jWoE%2)VP5PF;mDNXM#+G8B2D&u>rkpId#+}H88?ZXh
zZ8{wSUh~{Y#SsdB*8|7Y-`Kn6ul@n3qZ&8;PK0YMeudRUv97^U6)g}eO9;2AT2J~Z
z?J74SxZz2~RDViSI?#t;{-W#h`dZ(akgNVm#5lCSSoX!
ztn(%ZI*2=`%!XwYfV!mTpfyo)VgMxr4)(3Mv27P*Y4icp0Rq)c2WmNy
zCu~f@^RVx+1mBG$J6Y=~QBsfKYhIk6n@JHXtFQ8lfgjXdZXn#kI&W
zF4)Qw2>?kriL{j6WzNQR(E%1Vg&}uSdGJ?Fqe%bF0tC1905Oi?cFoe1;Jmwh&PPBr
zYq+>)o$uvCBz`1jQ=ME^_7-yeiz3H7uF!X{UzXJx=vCIwv$}|XzU|QIdzp)N9lWnL
z!kd>@WCqC39VTA^DH0H8=E}{I=+rIh$yGKHF16Y<+Ixnb^&OoBDcgMpR(s-ahQvQG
zD&^-I5Px8oUqL&Kob?f0bBN9Hqm+p_%18itIE}l%3JX52d1a;ZLH`iB`-W>1<2^3)55wP^
zi4GP&ee816kMC+Lb6sFgOi3)~6`yTZ?DmCRAeo8lWX-
z=jmud)GeZ!-$MrX5)qSTp8*KG;G-f`W3>+Yo~>O{RAA<0>^AOcl-UL}x(1$VY0w+)
z`?q-knAs%VhW)onpcF-~9fMOnBgveabfU`|+q!b%gA6iRLgKoe*2bS*oS6aG4YIBq
zdLyoM6AvNdvX#ug@K2$A1
z_=W;+wW0D&{MHl*tf<$E2+%SVI<5Z`xF
z1AF@WR1(i5YCxO+5BbGz#RHvE4rI*R!7P&v`#+ICRes;V`L}amhdnPpz#)*%iwLb7
z>vAMlS>4PVFo}>RR$l=f%uJwpSiG0kHT&;9JYWD@Cmuap?RvHy32gV~@Oq}dY?p2f
z;Bd8Q`lnC*Qa$v4KK8eD{W9n2pXreQ(-G6Gg8Vb{*UM&m5t@6yPr;}pkPGi9_MPlX
z^c9h{V0^2as*k5Pp(wUXT~_P$QK?a3c`uN3H}~)2Q2U@;;9T0w{zI?^={HH=-~pXm
z6#AN@dnihjyuoeq9GfscPyIERS`EK{W#O~{lrfN`dSY*^B
zYaFC?n*qPz>^lot&}YtE{m-aoYuawCdc{UZ$>Crt^jPEX@J%5_F8tMHqoNcS5ym1O
z*l2QB2-8`pP~^KUE*tv>c2m}%0v}S)kfojxb7n`?@`Tc2zHQscXoLZUCR=I0
z;@_3Tz%ITdpb$~=?pHzFG@K~{)-{p^b{7_9Ue5aKGV`#PTi>AnX?xvgi*4RRED?aC
zLkQIBegEFVYMDJYRm+ECeTmvLCQx3BW&5lyruZedBlLbXTt8>okxh#%F9f5$Xxm;8
zSt#R|#YFhqc88j)N1Qu*Aa#fw=e;!Nf!8dFb!R+fja=)*kvS$^dw#dl*3(EgGyh(U
zJ3FsAecY|u$+Pkir`$FqPrq34G}x**{|@razhf{bI)VJOot(}iRvoe)N$UIM=D}Ww
zUq=3KiD7ek9I~mrGHDAIdRklpnwHL9ryY#H2Qglw#7X>0-^b0pyz*6q&4p*`myrJQ
z!GwCDC*NPit~-=Z8*=DQuFlzpt`m`of>-QR9riqJZeA)V(8kUE>yFW+8e_89hVOSM~7NKCI8LAKd4!X?+9=s6Xwc+Hs<=4=9`T2kQ>d8Lx^Oq$g!%35Q
z7?9d?IQTs2?PM@Ek*^8z;s3T}lt^}-g5PInRJ~@mPC{y4O~G(ZXOK59_P=Fb=VIym
zjU+DKV~Gsq5BM|fB_WgegSb>CSi1Dk^wo4fOD0IjD|Rm6$JMOIp9sT07+1SDJ&FB{
znHHOX@mjEF=8)7J4SVcT8K}CTZjzJpZza-=Jj8HS0WG&oE`DB3#n4b_rLD<`W-UR`
zNWj2mktXclO>`u<@f^8ut0Zh1uTfR8J9K!<#A=!5{xgVt+KV{hNAyK*GwV)%#wCjo
zroUEIw)c-?0K&IVml%iQT&80`T1gf1HsJ65=hd8Er-D|kPCyjvcd%s=v2pZE7NIh|
ze}kFSY@LHUWwjiGfL#i%TYM&7=tR(0UJCOfwN&BzBLXYc4vgudHVBJIt@&sbV-#=s
zwPKX1Lo|j?F%A|HI
z$Wh%CNB*zNt7?PwuqY_b@q(iD$}SV8uqpHl-u#F2KXdfR%Pr}Ze_@g`)Q7S;q_;wt
zu#$6mF=B?jfL`jSPcpBBF;B9}IVdy}dJKxar>YH+ycM#g>^nBTucrUyE!A*?YL)5@
z4gvzPG`y@X^QJ|W
z2d*Y=>pyBelU2N>ppRJ0?b}#7RNac+vo*P|$!GRZ&F}B>P_i~|p{7lEh^l~L1$(!N
zdF=^hQQCvt@1E@5-Db-A6qBr9v!4Go8+#br=<~@LkY>AW3WKm)?4BQ%n19!J@QWnd
z$L4o$idpm>M_h3y8eKvu_ciZS(PqEm5H=>8^tN8HX@}Z1ZpXYmcZ5ybpSRU6PG{A_pn=WAE{Vr??M__oq19-2LAn}3;?J+Yz@
zw^SvWqT@^0iY39D>bh`m>7W(?*GIz1j^my|xpy?YMI-fBVlE9$NdhZAvwr^m-1ARC
zG=A$6m7YXfVwiZ|Dse6*Ye`M<^FeK8R#od*>J_*KORKrvJdpx*`$ZZ=xMnSnzQ?=tyx-WVW6y*Fr%_4*
zdt${LiW`R!1e8Mm=aFxAARvVqEs$G5B^gK~*3u>bOx>oC4B{rFHgCi6mm+BH&EZM0
zAqWoGD&pcn?9OyZ>dTdt%a*b_lKq>BqsMF8%yB`&%RC$9%v0$a6qZjZW01xAiM65g
zaGhO)nT1`$#TVr6%{&6#tJgkOoGcuoqNUk}I|T?#yYp{#=XnnzFIbhAj1l5W+c><6
z63(?k!9kHEM*?;}VlNiD8B9emz|@ruw##@y-{%j-miYERn8fawK~k{;LbEQ$>Hdu7
z(SJ%R;vx;m+*xG+?FA88xT3??Cr~W;)lIx?ZXT+@DR~rdP1W#m4)h!}WC%}ZoF`9&0R1!9`R+Gc1_tCr2xlM
z`yy?&h_5+<99_VIu&$_qHJu9u1sP_GveKcrM5b89xMIG6-b7=g#O3Y$st5`juK86a
zOTJ9}1>RI9k2MvL*Bq>QNxO6>+>05*uL!ecDas~92k7;PB6l{3o34@jFt*=$oK&S@
z?Nu|Q&k_Im%d7)aPRXr#Qe|W@04CZT^>UBnnb!+u-pE6Z}e57n$qLH~0*1A)lk&Hcj_O
zeIjSSaV<40ZlVR(%N9e~(UKaMn0{?G@ryRh!(_bj|IQ2ui08O2>wcr>sE|48_Ir2$
zqwDdP;Zh7c+VJ1YrN@;vY6^RmG(Yt0#MEIBQSyH;hAS}4=
zU?{sJUL%X9LzkSQQ)!s)(&Okkhfr&^Uo_>oY*4$2Rz=tQ-g1ndDv)=(+t$DIJ->6E
zP)vC_w5zdwkei^&YTE=kAJA^(D7tra3CvI6Yd1JVFQ6`(fQAnvoW?tvHNB*8`?oPA
zzsQV)fF!zbvLXED{3hk#q!V{BxopTz31LV#vBg7kq
zbVs9UEpCFapsSzdHs(SpZb|rjA_&n9Q=KDGD{NYqNPcXxJxRmR)#k_C1Xq^G7BNIy
zc>kFW_YnZM>7RaCAc^l7+&%p)3r}m5%T{))pD!=Q(uV@=#GBr0BLoFB^Vg*7e_yuJ
z{ooR^V8KtZavZ`ft!=z3u01TRLirYCI-%;Mhxfw3{=hJ9Vyj6XyQT}zUR))GBFj|I
zx8BBsg!@=-Z+>*@G*l
z2rMk}?Qz9G#?}kB*wp7+OR3#?~(K$35krGHm<#Go;%3k(zaKse|lc0C^8_ikZ_d
zU1&O-gq$H;S$5V2UWgO}gn8Bc!fg=HkORc!QiBmPs^la}N|eoOJ0~lzTb^7>N1x*e0hAoFA2aj(!P7Ma8-
zx(=_-JE7+ZNp(s8>%oHpyN^1~knb+!Guo;`ANa(c4@7G4Sj?2&zlWN4jzV7_dK=d6
zpNdkJv8m$DH19P-N3e;APfvBiPrS8GyN=p#$p9VLk5p7<4dizOfYAi?ac4iE3kVG6
zM!$Y6Z1?NQJ_jJeDZ80IilSr+
zBKQE0{#yA*c%z2b?sxN6wK;iC5peF#i?kYX8A03Qk=bD>V194bMzCO_FuSrLfO_Jx
zuMU*~bm2a>k?hR7{<4<{`kjs+@irgmJ8Br1RIHN3%8A5LQZtOBN%ajur`kyyts8me
zsku4poTsbiF9$_H~}>m`!hU2#8Gx37QAAtu#{~z8y(o
zxl4i7ws_r4=J7!-tSTO#_)CqWi|m~5vgzlT5bShsukch)qMLy}U=~Er>*C>1o(zy7
zPEQc<8!_(i^T_}Z>)FEohfdPIPMjMGOwGxKOhDxzSJ|I#zO0T+~Y27`zXcE{_@|fL;!)>GI^m2^kCmG(;t?
zP8Y&TRPvabP}ROZKO%oiL1N5`B_w@*&*VUsyf4{}76)J2PZBtonglRKtuPCGdvaR9
zli>ojKJHS{bjKegzE8K4<)Os|j3w6|JTzt19YU@1xu-xxY4b$25k*F$3plFaXCBLO
zlfVC5M{EFmJq4adIxipB+STGe?`vfJLS<%P1K{m8y^?oVKSvLt6jim);}iL6(Yrc@
zR_7HGE_#H(?O@1gql2s{gQq#wI1_JWJaQ&aHo1oY>kE-9ku<9Qaa^@hbW+~*P$qUR(o)2_I<}euCibGSADHwN%9}sL3~GDsafTBD
zBWD|K3KSY(FK{5y4Dv7VQF}F`{+Bj=>@{xChmNir)lgrLme{iE-2UZbPOJ7%ug4*%
z;qKj{L`dP7Q93Q1W=_X|#0j~X&AN3PH=dQ)hdB*NpkApiY>+N+jg^+&Hj5>JbwRyK
zSj6u<7!J|+2e(*0=5~gaJbktjXWGp0<-`x8@|>yo4QZv$+AhhVz*!k=$7DgU{te?T
z{Qr=-+(-DhVrm60i#EU7drd#3pg|7!xGH^XMO?-Od^sag$?jnSi3T8T=Usg+G*s^G
zzcU<+KZqL@)+TZgCMN@Xnc~F9YDHf{YqR0Uh4^mYQ;8at^DOEMJX^{W>W+ENjeiX5
zq?jD4FWsG%XMe?z-kF}#UMgxgR;9K>_s`tVNU9z5pIbxT*4ZVFpUpX)&qj@QS`G*}
zd5Eu;(=n2yg4%6;$@9@hz#Sb3qKc^7UE?|p=Q%QQrKEDt{at#GJ40e}I*QypWKYV|7|>?F+zI-y@g3CDW@QYj
z*!Ua*+INrSEcOj7b#=Q&pJ6YrnGIllk07=e{gKBVU`#gjsax7S7Rmu4w3;7jPgu^fb03799HS;@^j9jVC+nS4Xgn)evl
zHc=b!wL0z@q@yoWFS?9qmKi1cueFr?zL!AEFN^f)Y)ydhq~FA;+8}Nj4+DCCWfhbA*=hb7gk|
znNi^`g)g-eA
z>=ZZxM&3WnSP-H+KipEB&b0e1E96Bjy~GwM5{`VBlh#|g;1Beu{X|8u{VH-u<0z~K
zr2jD8ZW88nSMnI5&z(=oD7#cvO#1Y8o0rlWgxDn-UhWom`IkIxPKt=IDmX1G8IOYV
zh!P~&_M|m=5(Al_Rx=@~1;3)$Sxx*MvzTABs)3TK2)IFT%fHJjGdn0g*#b}8j(f+8
z01FjACP2}{9W)a1X!4-@`u8jvaL9zIS%`(l0-zbfJ;l?x`hObdFxGq9#`rcioG}U~
z_d!_vTl`I{s``o>8?qqex?+0`q
zmC-S)V4Tpqc78EP5rPnMEeY>`siwralRzUuQ=>~asEB~0aqpe2^Kr=MSc
zLw_7l6Udc^>|^5hJ7I=Fzp$|}T99Ie~3K7s9|8*%6q>wD55y
z8(*Rwj~KLQtpiXl?<}9cf1c+qUtdu5#`l*5saa%7%UwVsj#xVGXN`x$noGGyVnvx;
zc<7nq5w9CvH4vlwdP
zm{U;tgHs3Pz!yvi_*;undPCEbsMJYSzGzh}*_mZo;?gM@<}JV0!@6L?+&gjyHj(lM
zribmpnVM0Jw0VpGrJ0N%0bzq_S`Yel>NJV|#%Gj&wYh@9>H9;->K%V6k7F`*NN}5;
zAe%uzqN|a9wC~5qE}5JG7-k%{qOSKNzD+S
z6t%y8rEF978FR<3`S2@vu`7D~Y3F{oIw+2Ulog`AQ}DHt+FoD9CBM`y#zj@uOF
z=3w%s%XC3)uTDBMM-oBtQh&q1Xwe2rteMqi>x;}WiB6`%B+x#g?WlHiCyz7H=QP0C
zG%z})@_|+aCuH7rn>w;T42n2Pa}k@-`_I~TqVVu73|Hd_42nT=#uItHwy!y;vi;9y
zA)RFQN-V94@Nq#3F-t9(9I4*S)Bf<-0pK!F*lb@~p))VkHpa7EJ$nRxGb>~B9U?J>
zz<#?;glGk)2{W$!c;$-Cua9;QHG4PaC~#K!dfcg!i%gxD7$$dj1JTw9p%6`Q%%%Wn
zmGRN&7;=Rod0EYq7X5Zku662JuWm#X^`xx9v{k)E1xecylPJ$Ki&EdIs4bhF&Y7xv
z8qSa64Bm80*evZ&L*EO=>$uFUagWI6aQePJIgLjY%`5D(QlIuK6gMnrsC)nJq5|Wu
z+)8a01h6l&qeAKyr{%T%$CQx0HwHL8{i4mh+!dSUA8zYOg8UTq9+K#$jy$)@kFH;P
zOrCChcueotD)lW+`=dlyTDwhO3>-#5s|#Ojpq+hp!fZ5X0jT7RWTz+}mS2|-V`Gc&6*r2iLDEUg_80c{
za`5t&^G=;yf?jHLiX-PqD0}+Py3oETmLa~Et3v$ioe7>NqN8RdD`&FhU37C7S7dU_
zDWZbjb&^J>B4gY8emwjQxTU7al^T}C9KXq)C#!%L8P=#7MAw!5$zc2T=fi6XF3G#?
zo(ywSEjD|H1QWhhsH-R80qL=ybBxQs$_0bu5CQ4W9`HDt2j%rJl68-hZ4Nfbf%z(!
ziF!Xe$IYK(R876#6ejJ8|2`NuE*7^V5h;#x1k2Z8)PU(>xTD$)E-ZhcbH
zZ7#X+>FZ;@vkvr!s|xf}g$n0{Wlmh>03VvOdhR!xf;q=ame?JX+)pvlUUKl;f2IAM
zr$z*MOCunDQwUUoAry~ng+1mA^}Bg2b8lQ&}kvs+MbA#PSofAC&1
z%^FJj%lDCi$*<<2>_>Zsfq~nCJh8}9KCWm5?QiIY{X=3iR8Yo`pNB_DwL%@sES6ol
z()&^S$UQxShJxV&u;s+~>U2bj>ZTv-3N%oWAim
zV+Wl?^lr!93LBZs2$D6hlmhMzYsR?J+@3icU7
zYn1azILuN^gO;U8l@@$I!Lyf5NzqrS+t%XbCV!Oa(@)8}ooob#$<9fA+u>kij<@cZ
zejY`jahv4lTM9K-8(p}d_uygv>xbIZOS+!fMn|@47OOsXVpM$TKPR``=b0^3pZcD$
zuCbNG9Cz}x+y{-7Awg#h&hJMY$&((Uk(J5(nGt*r3YMFvI_09%FQ5LMLoklY3W9@v
zCcrS>{#ct#YilV|cj~-5UOmV#S6su7*_>Ial%YFq>J%)@nV3oJ7r2}q@9JH9IC-hR
zlt0n*&eUwUsB+UrJw91bv#**MiO}}7=|XD!!Sv|MkdG`wsChdI-5P7{D)
zslz~DbE|Hnz&%fPKaT(T-wHeaFVS!7wdvnhC>ptJpK$9=cfsp~j^sX8;aW0S6xuqK
z{{~pidnXl-tcsTgQ*U@LKwh!QGlXbgtDN|m)pAq&p
z^P*#Sq7R)h5R@ZK%EocZod`ej3`X$I=@Z<=eXeHN63|UmXi&*fQyG`RFXw!9ZN0yc
zUp)N42#fg5!0~gV%Z;_#93$jk5;$xSg34sVjWkFmWS!7j$l{Mr?o>B>s$dm!n>Q#P
zf8(j}Q{@Q81=gl6SJ-w|g^ubZ#8U}q8q
zV>Ds>gz8kJNra7{#P#jdnh30{j)4IB__GAtICQcCNOVSGOYtw+5@Gk><>Jv%n_{^s$xVaUdXW4KOofRPTnb~4tx1qt&<
z7JrBVaPYLZ>~X#ArzU3NxtI1@vy=S7Zuk9gEmtUDg8rfL+ifC2r9ur`9|dPj;fY&&f0}SRu>$XV_V6Npw1mH?YfHbL&R$w)4djjj7pag}JDreM?
zQ%vS2lkM(-*k6Q5>#!VVRyq$-fK^23YDK@}ED?n!Ywt2l6dw)@AW07Ku|SvU&)+39
zzq}Wwn>OwBB}A~RN_^vW9#M0kVeHX4f9yv|cnIXmIEKyl{J9)b?N5LXKeQQs?8Ik}
zlQ%VWShwonK8H1s3>+_2j9yTsS?XcSFx`AEsll@x5y{7*&sJBVHFc28vG7Gb?WC-)
z{Uhkf3A_Mibd;@ZP`X{(Q!DDZrb?XO(@j|cg|hwvFKPQ3+ygOEREf0M_@=|D@6pJz
zAi^K+I_+_I|Htizk%X@@`DAC(c_x-k(a`>&4o6VTrpP2`zTGLxP#IcpC8*Lv*Lk_m
z!oBOQ_qQfHeSUlkr&VeLGb?tTpmNi)km;4wFa!iGakSlRXl2lU&$+XIkx5#+%%qRN
zr^c0Gi)nZS`pS9zU_uI8_XAsxr1hN2pE4wa3uU22SF2Dm8Oac`?=>|bUI;0yVrMs4rk_G``DG34T?(Xhhy1RRUdwd>!
z?!E7a_rv+Ladv0sKl7WJ-^}?WkBeYW*dR|d6HPK~qTT!GrWf!-Eg?^xS~K|z#M2$h)%Di+2cj)b0#i~jT|p6kCY@^KmZh(MMZ%DPukaRz*{$N6B;v*2}}Cop%J&B2H3`nw@3Ll(ls->{>q
zq)5g42PfTM>P_~~Nt}cQrUV8oi2m;Dg(n=|Mj?86oN6y_Vv>dfbHh?wQRFl{OZ5MVE
zlCL)3GI$&6#r78`HGhv47L8~RaVO(5h?t(FR6s?ISr}rv2QG~}=p*KI&TUxb#tl-9
z=oh1`Q0$Uy+*$uQtj=U!nos*5XWLARjc8iWrxR!BG$0(hdah0W+ucvIrX>_S@mcq$
zwkz2VQ2sW5y2p|?U#C$TQiSF==_?O!RvHMog{E~=XrDpc=4|As1Fe}+(z=!0R**o%
z9451jnvP3#U9yAO_h>1~y4)>~ssAjv_k*uQ#RuDV8e*1F?@CA?z*L*LCMr2Hw2pdH
zaM-l3x<9c0JBDsml;}O^YulZ7Sa^EIeoRRTvef0=KBDXdrz{7eYz1f7L@hX0bvvy)
z656wI>FRP5ew~IXo*br1>mjuZ-q6sz>AJS(KswtN4o=)hvU=qM>#jdnVAb2SMM)@eRldd}`Jdf!
zar$s__lO8ij|hl7gpBoIb36=h%)>>B&jc8B4Y`czCL7Eq8J6?-%2J40AH@j`111
zhplT{m?_?{YI$w5?RszVoH}@4h&(MY=eC6Gz1Y%!z`ERxnn_)kf(xif{6WO4_+1#G
zvN}js{tqu$LV~|D86Ww?e|mhBN`Wl;ZNRu>}n;ex#T
zSQwGW)Zo#F2P0CQlSa1e`4@2P5872m8)8XCg&P`|Vx6(#YCCjGwm#Q~JmB?(dm+p}CH^`TtvGm->G;{HM94GRltTw8-}UGN5%TmI
zQ{Rp22zVt({kO&7>cy5ptWU_hle>=4>sIkk6?_C++ivSsEuT&ArhjR5&;+|5^qKW;
zqvIzMxIav_e71D(qA>dp!4n>b$KoVlFWGfIe>1Z_oa9*VyWU)fIYQ{t^YC;^Mr&x3
z&3ihGI_;&}(|5nwhIOZY3BTWTcJ1>Upd=G^2oEOrPSF5g;rhT(T1IlPSx*Alyi?`q
z(M7ov*KgUpl4OrtdeXhNm(SX|uH7C3OQQQsuidx)B%2Owj)H_%Dw-=!uh%5##U^zd
z9ygo4pvbVFCQTsPw_vZXC)=_B_b;xH;WxOT6;V?R@N*v
zqyUX`_B2kn{)T*lC)b=C;^lPtY(}`TGoND{#A|B5wvT9jt+SQ*A1%i$viFf{+NEsOn{c65
zF;Z9BcYaF1ldZaaO#utOR`0pJg$qybobLa+8Cbm)vqOf2;T%6xwb}YPnx4VNZtK8%
z;|z(kXLWQGb^FK%XE|yjs_)Y`N$4~-?sX<99O$C6mOzMqOVi+BvyflJ5xU~ap)b=)|`xNzz>
zZCpOrcDBl^y(%589Ixh9&tsVX{jf;y%1zPT`4+rmW0
zn?Wt;A{(LccEiUOx84)q`eo*FnR4_Iu!186K>lMiJwy%U$3Fyk1jL_OSCZd6JOm65
zE#AQ~5+u597xCP5k(8VrII=}c(;n@m{AbtG68psoYTZvk5GGp$7r~5P3$jHQ1vCVq
z(iKe5Qqy!gKfCvaC%%JLWmYnxRNc}_ICN?AtX`%_#B#|?cDk`m9fldgIaf=E{C0FM
zk?SX}&6kkcV%dDPjd@_f)6J4VK~F*aGq#5v6v4;I3c<@k$L}BBgYVX`U$L^-xHYA>
zz;Iix_I(o985GaQKC-C&;oQeGjh&1W9Wj7{b{Iq!d#qH15rsIb`iej){!N=QS3K&>w
zoAE!+CO0Ut4gLt(y7?HN`(3wz-h$kLI&yv!=+ziUcvZsuMUQnVTN#4Zf9aBE1D(X;
z9Ydg%FJoJt9Np*kjzWes$z4~;OaSWh{rP5b3AqAS!0x|P#~1_TZs!vfR`7U7M+ZMv
z5ROUvp<;7DB1J2axT6I@dn$@%EqSPy2vtJ&!R*!gXVt$^tn%lz8bzpXY%clBpA3Y@
zbGsfofUBeak;m0m=nXxNoS{GpQ?(xIV#6>b3%0Y5Wz4H_#teP+U*c-HtgH=jVb|iX
zMw{~K4Fml&-Rs(x@r<8~mr{!zzCVS}WpuU&SpMGW;2nNjED%NPs?ATEUYVSr4`31}
z%nwpJQ@}G{Chado#uxpqsm~#ie8penY)yc4+H?;&8Nm>%)#-n0xCq1bXbp?LBzAlj
z?IQcPI>gGt_o~!T+x*l!H~y@?d)!Hfq|@UTY$ueQvwH>4tR?>MeP6pvcd}c37bHXV
zbjeYMxJfuSB1N!7#W$VFe$xM!FWtZ%e~Kn;?Aw3Ad}-$*wSD|cO#EzA2G*<`Lj9YE
z_2|Y+OYyI?^?rN2EJQMKoi<*$k%4~U;l@DwAh19=eJm{T_&9=4db5O`ujo^mb^h7p
zFMxE(U;DM*6p`5-Ijqx1j?}eVOQs(tNBw@)kIjfQ_-tzCmG@15W5nSWUl0OOlFJyi9DYO
zzib$R*a|Cfe>VzhnDTBqZc3@rz7>vGL$-L|4L%N3IsL_V62#4j89Mhl^6>5FAHyUfEUkDP^%~`{pC_C#*dE)gl~cw4
zw}pP-AE8@HzyqBlmtH!1l!_ob@Y&eBD~+UL95M_@<@y>u&G^^U(3Lm*;TSB7g|8k$
z1Fc773lDrM1CTNGn<)@D3F%!06)htE!c)D{=?+6X*V(m&eQkXoCmrNI`OO{h+Dx0|
zU^DEgNQ7Y-ThzqJn2;l(=x^>m7uefvo4;5pV_h~q&PN~9El*e~7MHojX-va>w$WYFG<>3jk^58D+F&yGVq|)!F(_xuu}
zv`lROIyUuhv%4If+W{_&q>8-K4LCEzu7Hg0@~6U8GChgH>kd?;Dd*5*NdwBt38hYY9n$m%Uu8pND~1!5ige|w04op~6_4bZvhH)F56
zeceR*QqjEiV?Fl`P}Y<6r5eLaoTIyoj3yRFM^4@|tjYbKwPf}pnb!@~)Ic+SmbE=f
zG07AEPH&Vwx-jcaa|=HR?eVQWVAZUb5yvFH`u_I6Fjf{0PdWK#vX!M*<6;2(|jJhsmdy$ROzlDSyq6yQom)o3{07Q;L}77aYo@
zPtSan;KrN(ihKN5Z}&@DlFDc?2R)ba;0%
zh@xDgod&7Xx!iyFD;bD-GUpc(%9rAqOjyxC_D6zc55p%2nanma`0IQvCO$xp54l5~
zWBKH$Bdn(Zbb;CPqw@oy0ATfT|Ni6q=`N5m(HFkqWBoqzMco>)gJ-T)VX1GW|3Cku
zw+p^nYuO>CrSWOZbkiBstr!p}El+$E|GzJZsex{J?z6h+SEKl5aJHO+X1eV4zTj6+
zK3BZ@J5mzEJ=cqbzzwAr?RSF1`M%99*gT){Q+cTpQSskN&jvlAO~N{OFwTMuB8XOA%UB0>*iIf@qX3tu(HcPCOOv2o)x#gO*U@q=#)>$
z>mIWnFRC?j@eKxWUIkPh{|g4A6Hga>;|Sg$UemBkDVFaua6cqSzq|)*N#NhFEma@@
z%`9YgT?4MjFbo+J)U9)5JfjvD^zgUjpN%;^+{M`1^iZj~{l
zQ>C*h>1uCWYCI+6_nmsDl>G-RTCH(O1BE9+3gDbeQmqoOH0!Y;tTj}iM09Mx6Z;szj{{AT3cm@}T$HVJ<2MwAb5%T(O>wSM5H$Zr_
zHSuR0B1SR)2(JlohG?sa-0nKW`pd
z0>SNyNMp?^5l;mvWqggr>0xdw5t1}Yryo-pQ{soli!6#isdI!wUHI`m?4+bwu}&AB
zGD&W%)&!yGPZF2feCb;SRDOk@x=PN@6Ag@QT<&ayk^bD`_B*;iK5`!Gpt1q9_B^E_
zMeJEWx{m$;t%~my`JY>$M|&-Aw*^y}cpdNq`EUxKr--89?Mv|8IJO1n8Wz>U)fIct
zcFWC2Kz?t)>vzfGKziiKVSk&GG4r(a>pz!)`i|M^(sbyINa8>@oeM!M=V^TdH|h4~
zy60!8?*+XH2>OMbJzG!wok+T;sfTHGjy(#isK?1_4`bp$<5@)_=w@f{h44KLT@bbt
z*Lc-GFlqTQwr?`oQ6(S$a=xe+V9}f`3AC&pyw^
z04|8WkJiuhKu?`qeV>x=^fPisnBTWd^Vq&9z1yz6U|5g%v~3$HR%=g#;tP$YLck|9
zd$qsqxJ*{dC9St8G&o$SXTr(%M&T!ug7Wat@TdrT?UtL*6Q!dgM}Yxhm~7+uGzn}i
zLc{&4j!>Ew*Hgs)k9h0M3Jb-aS&@`Dx^n0dnXF+N*Pup%NJY?yGV4DaVEH2uQpzjJ
zJ8T_1Y@pi{zctudJE%LCQ-Fe2=BEZQFrysKF0^9%Xc-hzjW$k{i@|R0i&d;Xb}@m0
zd}&@=bq#luualhqm2N_Z$s~hlGuAuDFY*+pv-LdEU@9+xz*u2J$lvQJD
z;}(lrr)$;DlyshO5UOkV=ly&4$>AA7_qpv-B4iKLXDF;S^ig>Aal=9pX!(F8i~r#&
zRWfq9Ju9VEeQ&rPKJo#jp)?1}6tFaR^aI1)
zHgC~2+xJvZ%w9MA6+t!uwTNxZLJ8p7IRwNJ_p=zJDRKg;?e_
zYPYZT;1~XGJ=PNRfrSzgc)M7>R-EcmeVPA->IHitTp{sO{r5vdGX!->wE=ocbKr;P
zzK}r>jyjLQ1g+~oIsyxCv+Od$H3HVqnc(b@>~`ZO!Lk@SOYh0Aykj)B`rfz8(h2O%S`!X;aoNd$DMO%B2v
z45;YSF*iAR%LM7H#-Yq{&_pm&Xh$mj#|8MfABBbcH%yX9Uz_n=lVJP5ncPRhu)9cN
zEl055=Ib%ISD%+LWlsw((kL6ctDcF{@giye*1!M159;jjgTFFf_#qcB&LM?;3zFz2IL3rh(%{pY2eA28{c8^!F650~CA
z0d)_8{(TTsjUbG!5Kwf0#9x5CfFF5bx217x@W5Xwyx+2XvdyD(w4YP=1rRldtAX)=4&@Ly`;r)nT1m6d>Ca*Fq&abwGbOeF9$Zq_t4
zPix_EtvGl+w^UhrlF`*>yxi(<1J(i3b}mlqAk*$4+N2Lc50ywFVT)2tEf_20o=L5!
zf6Nmcv2+b)sqJH)ey7G{tV6`+8U;@qgFxwer3F=s1Ugm#GpHMR-{%xyc=s-jc?+_}
zhqZ@j7lFEs?ozKUzVFL52{o_s9RUaDgVla0ATo?SLst-hZ}~vwQskXX7_kDEoUE6*vhQhJ_H0wzsyDeXrjHs
zvR4#H%n`TtTl$Z#v%Rq|g<9tCQ~`H;6?}OIq@22qb%(Q47%E|&lzjQj$f%Vl<9=Bn
znNR6-cTvXSKg-y~G?~VKJRq*~eu@&RURDL_RCT#pEfnEDwNmCBQcmN3d?F@6l(_sL
zJL7`K$2^a)O9`X`l--6Cc;8jl6Mn)9vwcQl#NruM|X-7rKkcQ~GS
z1`dy>#guZuheL;l5Ec@LfUN^qE=BP(Msm>Xw$}kpIDo+C5cG?q+P%|JtnA0#RXVo0
zNo&d<^Xhn!jPOOwS>j0uTO~IXL=Yf|8UQ>jcWtK(!Y&t?Og-#yWc+^nB^}w
zdL*U?0`hDsdYSDT!os1z9G$1E9VkBgB&&<4qN)34>9>
zxqL}qgIya{M
zNN&RbdZ7269Xt}tcSadeN8-Ax1$?!1MG~?}wRL7``6DAETcs}RHvKwC29p?z9xwnh
z<8UfZ7*+V2l;0z0L}1M;_q(pB$eeg{8gk
zO!{Y*W-l)RSql#(4{;jS3{e7BfoZJ6RD!UEoh-%8W795w$`
zHpI_Byg!3qMPoTxI)to19S9k;xtI0exK&kLCkn2m`-8-UdsV(x|G+wpW^sU4)4&hx*1f%O5DGr{3G1d{{`G7_A)TJfiI`pD64$6mLX&Mm
z_eZ9%H)bIn>iVS=H>0f%_x9%m5>7R3t5eLHY06ik{6By=?j(J+Q9*?6vddpwMN39#
z&gNLzukAlB2p+-FH!3Xx^~rqdO}%HH*8X8kc8v>((RoJz?EUSY=iR=IHbYNKT_D>b-BP9_|JaI=RX7hOl%y)hcPp5Xhv#2M3B);6Wnq`MxlGYfLMjiD$VRef-
zf@9aZ5>fZ*aJ{pfgf5(&ckqDf`e%&5`!oihBlptN<*EKzq)bVq9$Dkqm$6O3r{~_;
z$coW-<03{z7JOeUZ64aP;|2|3wAETY(*-Q@Ju=zsk+Pa4qC^K*bA9B%8p?868jJK8
zGjIeNWn3y<8P3z&R4b>gM17^S9vl>-q8)b_gw`V{PtixtVFy2w@M(?J`=$msC`(}^
zBA+~aQ^7&w!6jptqZ&YmR;{=RDC(Dl+tMgdi$9q?k%Mh~OUrxP7kujOdNS&GF_B?M
z&%@V^vzjm`0ie7T%N}Hgj1HrA|8d|wV&c1UM>41fc3hm@>#;R~;m_ek#gI2qB;d)p
zK!EbT5TdA3vTa>JYTTfSU&gP4F|izwOt!qY*&W|)yyM`*94B5~2N6j$lU%C<&rzN@
zi3!T4JM)UO^>W{^%(e^}KT>xrxezvTrgmsx&EuLnVH#tm+oqY5$XNmYuulwh*9@rR
z5Q#rR9o2eRm733?6gR~19`S-qj%p?F_!{p%Bu;y&
zm_nS}`{8ZsNm{Hzx*O+zgoX4TVFFuLT4#<))@oE_9&~wS2u$IYQkRfFVpW6?dJF42d>uIX{Iw=9J-y-qNiYWUTj%FB%+zM~%
zh(BUZt#w}dvCbo})p;weGo
zf$O5>=RByy03ud+9hP`V$2ereJ4hscHA|zJ;dX1rXD7HDP9MEO`>F^)~
zbRU#z*^1Bg>tP(0CWPERmSJ(Ts~og>8kPxqLfo(-i$R%`l=Cx=Z?QgjmIS#8HUHOxk{TE^4`4S_j-PdT}I3%X5llh=P
zx25a6unHUr)dPT_3)MHlFZC$PK}0%R!=PP?RHBuxUAp1~?b|_1M==XOiPvEUM6;Zt
zXZMjSpFII~262VSf<8y#3oW-pML@;{TKT2g*-p1FfUrQz3Kd~>+%>ox;3#VlMp%DBx{0PDX9Ymw4S>yUAI&bcm>)=$wSrpBb&c!RgK
z3?m=9mHEvhOj*dhLL~07!K}&XbAcX`iFxF4f3Dpcgb8(m7{2!3Xtf^~H)Ge_
z@;Tj>dpdDt)c1H9PUU^E`jDnC8@|4}d3SR5a1;2rXzj%88lSkIb=_whD{?*ekoK*&
zxN)m3@B)>nqpzEj;}XjyoFfQ84WPXVio>1Bsp=Kk)Hx1iexO+u!|hD5Z)8t}4or{8
zGUo`r_H-)A5De~$-kGbVb9o%($POOv^yHP(-&=`*47NNFUWlAq7w)Up-w{{O)jGQw
zeGBAiA@niA_@gDhN1|%|U))peMp?l}
zSTgim(Odd)k^^AEtp7qk-SS^3lv!ZuXl@3V~S#ySEp-6P;*0TSv!l;)QH?X{Zi
z7k!&oC{h5X0w7#SWtCcw2qmLUN)-X$&aX!JFdK3nbGzEQ)~}0q;ti?NnCV?NuiE?D
zi|D0U*h4wH74f)85VZrG41w0i`xyOxP=I~
zl?dwOchRf$Y`aDDXj0X!P9Ih*1~9CofSz9rxzI@K_S5sesTEX=pyJ@>@Kan*ZjD`x
z_1kR8;fnEfURPM?Lt3o#0x=ls-=LJ*<#b|O3GmkiE@=URGohq1S?P0d+WGYlos0*{D&s{qlOQ#q?D;!3!v
z_?HxF6Rntq&84%xGNe|{;e__~UbyB?bD8k*`R0HKlGUjv_C(6V*S!dA)YnBmnRV16
z^Ib7!QI4zF>vC!Kx=ZpAxT(VL46bm1ae)+xt!cFG(V>1R1eaS1WQ?y>xahWzF98sB
z9k<*$avdjf&n!y_Zd`ZoTa4p7!--69MV1G6^?X;9VT3+kF}ZJ^8hYUf`4>S>AAj*D
z;<5*|-x9KezjYrFRh5w;OV^Pz2W^cHVaZEh`2#H|>u-gMqjGC=(MxvT_ImS&E6M0q
z7R(Apz7hsd6{izFs`?QTEaW>`6W%u3x}RR#NA8gJ)f?**vxaq^o@>H!ondE&^l$I0
z-VWW`llD+KZnWtQUnHvj=IJndf)KiG+{Wn+q=PUnA^QP~-B8RgS;(FD&Jvf;iqkXf
zp3v>DOmCR=u)%@i22ViXzNjKAxj&614~&7A;y?pm=f`~-@d@==JQoCDAz*Z!@}Ek@
zQnz53dmQOXE$;DoS~QkwdCQHG-gm?R69H({5iH%18oBtJGg`lqNuv%rvZyH$iWM
z4ni4P-<^&tTCmC)!8nsTwy!-+sjWkyg2=M<;DR?Di5{_}Bh}0H+>Ws4up_EWkHDNT
zktKVA-hs<*l4;i0qWr!8u_m02HX;uaSt2X61Rts5MmiQZ)|WGzHIWzR%Pe0O9U5}(
zSrm*>B4c(0-fhO!@LlYno&)=j36Kdyj7}xkLche0Z_Hx}Ei!oaVY{|%zEp{)@1p!v
zKCKVgiLJUI3OKamGjd+T1uruunMA47-^~kYxQu%K#`f)rq*&|9QEpX%G*$z~sMf<~
zOln&f{)X0jgX*mmdBz)_Ak019KIXo*I3Ni}DjrzV@rhhqy`FdzBwM%s#fb-HQgE6cPdx<`
znuj~YbNbAqO31sSK(lH5m+21_t9;Him0t$1n`b}$Eb063dQg7+=Hc6|n`|Ejp8loT
zC_^Ak!T*5|LK*I$*@7bSWmGT8zxW_%n+&{1q|m+!Qwfl=uT{@K_W{>d7z{=j2S|V)
z?w*^hvw{8_MVfqrIcB^7>MtFq;R`YiP(=k8XK#x6}P?LTEl5c?=`&UisY6_B&uv
zEEmWGxu^Dnfl@YPK+l|ccGSVzeI$!ys@AlH*oB@17vHQ@**9)4XL}Mg!j6cU^tYU0
zbuZ4>q1qyg%9MrQ!41c2cyvO;u+;OLm+2-+w6A7XMfk=C%DzCtPC7#F28oEI7dtiu
zyFB0#NNv81aTNyoX1@`T+ff#2
zAQ~64AkB5$FWj53m(j|!$}^dPeO9GICwSI&MAAL;OPKaIfxYUSHP70i@X|njNh-}V
z>dfAChdp+Jf!#iyYK&&r-)~*~N*i%_2>CAMdWxAEYR1cX8AqOf-%3q|1_Hb&OzwXM-2+Xc5s
zKwlRsC^{$fI_~hz$(pkFhzRiYittX41H-fbf(%rsnEN+T7{6vs%9s~aTn*~yjbpVvRiLZXGx2=Ub>yWeV+Ff
zb~V$YLq&5le~H;K!WUas2W17A#+XRV;Z@evkW@*(
z4LKMKmX3h-tTp&FStRw1W@Tm9PjC)k5)dM{wjx~Go07l2e;jw4pDD|j(WhD>kJly`evtx
z6uwow`OHF!UU+O1@1M58VY`Wsn94<$*irtHP-m{!Y^|)XJyN0e(03xrMH09DOos-j
zc8Lvc+_nSb{cTPw@YyYQ=OSHD8d
zwVmheWpWtLDHQjz58a8(qI^=*fFH-$e%CPU6ti|9g2;TP;Rj
zRW2HYGWkecXDzo5T#sE}_zVIW#?0DB%!p0UE5;FVDu5vjIYiH`SGpb>;wk|2MjI6uBo
zaw;OtR22t`SICJM0!5&-5(A6N4)$xhs#`1H&ZC8zEfWqKTnhtbk(4?j1X^Qzc)cUt
z$sGlM%b2q&4$6$f4GN)gXS4kn{;L=B3Sda&_9MBT!A;K(vX1L*iFY_J`M-&-LCu$r
z>eJHSqq1{&UvCp@3yw=5lk9~~tXok_0Ke~PMG8b@{lKX1ST(JK`aXmBH5{^7hMyCf
zP28Ho?rSu8qZwrH=8RcSM
z8u0Moq_k|^XB5AjenkY{PLUS|-fGRy^G_c@EUdQk!U8l
zof*~a%ImK)Bx7%;;DZvLzLym8)nrQ9>uqXgmF+L$?uU;x`#74=6~AJ92R-*)izj#v
ze<5Ypb}+>v8g0o*Mjo0BQ`i>jABV5HMT_>IT{4?tX647eWIwxo1N|+#V#OHxh8BJ-
zTjnrTFd>qis7`k3U53LU!d{rFZ}vll4`Ei-jlN_=Hv3!eRS0wY6LkdqX==Chbp``J
z>K>P6*bKyGonR|kI=nhTNjxm|eV&IoOg2x>d)5h(p`X*t8!FniH(RxOs?zZ?4c0S4
z8HxbEnkd%4$yhtztK>mlRrb?4>_Z)y@7~3&ry|=6c%xZqxJQ0#Qf)zALAzHjHCYzK
zo>$~6i6T#@XUB3Anff}5VQu!L%nSOrf!{lg?S=2#!x}HUt(aMgCqtbompzLl!h#bo
zn|+MBlRE&{%5?(-=ClLQU^6@lV!YZ#P
z$#mzZ3Vz!$mg`%s^E&M&flY{xd36vu*Us!>=#=Ti3l2UfFq*~--3F6|qaX6`RL81L
zxMnzCG=juuWOAyjPpYj+!q0YlgSurniWFqcZ1JMm%F1KEvM)YWH-3O-}mLOtJVlWyK1;EIU%h~z2l_R
z(_+^XKIqpSE&7kN#Gx7c{NJd1x9>&AV!HS&tEivuzptFWa8%7eam(nkAN;w5!d^=hXV66XUY=-kOl>T?Nip+5B$%_@WzRmm}
zVy{rAQ&FrJ-l=}f4p%DZ!Wr)<95k}AU(zKU5=DLC6?LV?RIoc?3^uabjliz-tMvTB
zR;TL{?}uPDelSCgIMQ@NeePHR{h`0uVN&4pgP_IRsj{Z%{$T+@=#vLF%M-IloS~Vf
z$32@2A6GU-w5u~eZjp6}Y|A+f~|gAAR6u;82n5{;r>G%q2;!L7IpQ!2ry>)Ke2u@zYw-zrZ^
z%EVD1QsToT&lf7bZ4lWtD{X4NeK)pnR|ZjG94k}wPc^2}5xo;&P;MT(ezM3)q%qew
z-}zw^dVc$s>~Ixv{*{-Y=Jhc#mlwa^7glU}Oj@O3SomOEOO*8W`Y|{yr^et}#M1}T
zAuc5-QH~eeyAS1rOYKZww|~DM_Z4e8Voev}`~It5t?g3&_tf4Q$D%+&Ye+JbX!)0+
z!edWmI!pkSL#%HngWuc6^WHWF<@Vkn5XXs(0xpBy9m~}|VWXXEFw!Vxma;3%_KQcz
zqZ~Hh^1=l;&~$W>+aKhBXLdTU-`H>qe`vzm{-IQ}5O?xOFX(Y%FCyOdrlc!jK5p^cwV%9Ots?26^;MiX!)@t#l!RR(+clL
zxe4t{fr0WoJ|=88!L*gEisOpoRx030eMyjq4XgLsg1S3pqbDa!e6MGQaTlFQX(ptu
z!=4aD+$f$8PMqGhyxD;ycl8ZrLzwygs5Ax2vnHz?{wL8(xTDRT#vV_aK#!{u({1Gq#4Qa
zcT?PoKbT&x(tb1#;jZ0h9<7mES&u(AAH(-354ao8%2L?n_HgNJdMmIf%%1o0Rf*I49F!{@K#(Rr$M{i2Ha{daV=iqFh7iuOIvPFhmLO@h059acT%BKd4
zTC54Jd8ScSU(-&J2t@av;bi63j~QF{YQJ!Ob@5%}SI-;%pinG|T&LY3GCZr&`>U)S
z`b#J?*gZi1jmp}K?Kk61M7zQ%0@aaefGyP$E?YZtbSlob+pbYWil(Flub=
z*0qHkrr~`0o}`&j5==1MybKHq{wfzSqM<9mpzSK90*9!0vo}h5`HxREGbUC=4dk8T?JgbJvF)V-X5G2
zbuVuB)wppg(Y%U|?Z2$xU>?C|MQD2-dmbOCyIp+
z@*yizfz(rm+vAyyDmSeAp;84Du`?l**3-1r-aZT_1`CSsH0B5m>Lg*9M=19-;z)ImG>_%{+J_y|UMp_4
z6xiDl!Fw)vD-o{GY<)BawC)?S=3_THv1<9XrwGAmm=09vZ3Mi`G71^!QCO6;5Tf`Ee)|&cm8aw!s=4
z8#_PF2_HID_b8ymG}Xt7>F0Y^Re?DCtzp+wRTdvQ`aB;LP~At!kCzuit3E=m($g%l
zwJRbqze@D!rK6Ke6irj=b2X(QRMa_Kb2n)>LmKIOY;q$QY~H`AK!eqOWmH*G@|s=9
zJ!0um%;O&AcGaNdFvotk-QD9J*=?<}qVaT|O(b-{<}^CW2JI&FiHq2p-)U(aWC#gmv9zgWHNE~uU?ekv%r+S%wMFL#(z03v#y
zi4dHxkc#lMWcl4@`>C;#-@(!X{^~l;+57jm;rtz(!;xlRjbT+ti?lZwzNLEpWY62!
z*|Ar^#1!`il0?cde^fl-&e7;VK+g3OnaXY-6QPfdqoM8BX&RyneY?ipIBC=ZY+=zz
zAC`V_Y{d2~*YR_+z)M!{EAMlh30pk|AC@oQH6f6UYCEz5PYjk=%5n0xaI`{A-{<)p
z-c{}onz|adl8VU__NnKh>J>Ly2OzUUeSZPi7fH|cWjXBleKSS_p(b~U-s@M2-V$Fn
z?AJ_2zP95=QNL>==LLmKjc=={q`qX}Kcg*+>B$=^QlGdBXvWAr$C?;pg`G`Xf~qu0
zB!5xBW1E2;bE6hQn2D1T{3eafN?3_L&yG8mXE{{{ceUDA
z@RZg|m7!p%);qjDi2o!xibuv+A7L!ntC7}ziA%Y!Mn6)_zw9~p_8yl>fetMt^f2?G
zliYtHB`_hLAuUC0LOpkBk?ETe4GxQ6Q1DljanZefiq1-A`r^XF2xWlrcc>we_32Ni?M@u8?WouyhM&KP%Ws=XH!^vK`@GYINNler@*aoYSFz>!f>LO
zjx7*}FO(i=ANrh2MqQVE+NX+1J=rJembn=9^2n(}Qqi?z2krGtkG)OdCA|hA)2#J#
zW`m_`Wg5B581vJsd(TW1R4V3dHRTib4NIC^H*xFT?Pl4GSDp9o0(RU4<@z}A13@P*
z;NaY9=BVWbjFH;TTuCD?jA@N`f+BtwKNve+o@m2@{O~m7zugMkB+N&Boy!3AXIcD+)YF
z-v_sw&P>fQ>3leLK0ilAldLDif8l@6fUvwa)_SmrAianFvojiJ^yva8v0^ALe1DF8
zb6)y-^!!rf{g{o6GdkkiLcV9R)-gE)@}2|{grv{(TiG1B{1->;x=>$4oA`;}uYLB|
z)1ps%*7e~-#d~AD(^9l+tPG;(v@D^=!GVAgB&XF6%P!wz?}LRs9fK&qPizn{x1-57
zibhy^f{#neYoFVuC)=KqvMyWfcT>tmM9<)wK6n=)LkekZtm567ewW9n>cSt5szN!(
z&C@zU&-fqkva<#4lQ&`rLnBgKO9=9o&wg3ID;kA1e7uBrxZDaOe1$mE5V`VA^4nxm
zdZwnbif7~+lQMOOR44`+)d|7LCi4nH?3x_h(0Jl|kiXaa|OE>=W!
z1umNFk+I)aG-!{e^(WjqC?>b`BTJj$7=%-QSgl+gHlX8o4zj%n4w_#;{c5^0sN0=X
z7cwOx>op>i*+8C^*5sGCT-%oCWHm{U%RY}%+HkFu#@lqb?>!re6@;`^HOFMt4bm!5
zfwV+U)rIwrzWGK7#uQy!L2r!Flo@*gpFn+RSQ9551xGE1nSjIl-g55c2SOkDPdlj6
z(}&(p41iI5JkN^(-~%2{gF9O_0n4)RoA^mXQkrMCbppKqzX>Vv9p(<6$6Qgl|_DSd7|8M-Ga~G30p2hL?0+jc5);yQUf&q8(c0R)3)C~P+zsZHDsJ&Ruo|B==5qwj?YqCi*
zD+y{@-nv)APgB7g!C0eKAddE-ji{XQ4=iQvo8i@p3OMCw9!EX~S3lfgcS-<7`l>wQt%fW_xJokQ#Wzrm%
zC0VR&eb$Av!4(^%|0+x)#nz+PwDy*-Qu-Oq#PZu{Z7810GF&u{e7u(VWNC7!9kazu
z$0=ie$%}Wd)BYctzACECt_>C|4ess^rMSC8fZ`OF;#S<<-L1I06b}@qK#IG&wYXbw
zPQL$~bCtWSth~vd*)#Jz6PR9%S?NJqbZl}qYd;xwJ_EnZk@F%LU-z@e|HXZui5Bzk
z0lQd0{06*dTw{-P<;02W#RqUhQMxH)dK&uP!q=6_?A@$K+RMZBG~6GY^mu%<=pq+Sl{*Qn!D&KGg&)
zo3egWT)30nO*{7>@X4Tg&bcbX(nf((gJV>Y%7%tAMmVlDWnO<|ze7hegtq{EeA_0Ft
z&oWLdJl_*IS;8jte;%<_tMy4PnH-fgXm&3)bQX-9dzld@**cHLj-8ra;ZeRjW-iJ$
zHp9kVAT3}r{?qfVqT6rg+8n!)W%!ZT5vki}|6KnN|H0zy
z>-C7qx~Z4KOoB)rtl666~WLMgMTjd}9UUU+kcXM0$j5>PrX3
z8{x$5kA>?i;e5}8GUT)g>HA8)p&C8
z7Ke3{PNt=?6jldO(tG@KR#h3tq~BwqJ2IiG$`UDjSr79Y-|UA28l6s4fH0G(mS@L2Aq=26V&f%|ET=I1;kbOAb(|$
zeH+~yKiz-O2Sx5KpBNgmvlmkmwFq7fn!2hlX#YCxAa&3Q&<$f_GXVbpo7M_5BEUep~z99?)uQnwq;(_
z(>R({4@mJ90;1AB7C>$<6XgVtTD9^Gt@g2@I(JxID*x?E#FT{n8!_cHHIq;8TZOsu
z%kS)q(L+-Dn_CKMx8_F)a?Ut6jKXbvf}_BuoY&sK%z-LK>6=C_Ol)Tr2Kkjdsy^~IVr5JucWvabz7~c3!u|8wwNC1xG
z&d-3UK4E6%*;?9{-NHeT-2Rehv9q!Ca23xE?KWZJUT5|!ts3sDfSz>tTQ98Dz8@BP
z9M{FT@X}Z}p{uMryeP^$zbx&zCLPiW
z`h9;j6R?2dUA(>l%-4bQjmQO_4%?i=Y3JH=4xgS|l^G2Y5~H<&p!}ncSmh06a-4^1
zp;og+e7=t3dY-+>Z0BGHfb};UN=kA=thjaz_x)etx=Bq77*$|HDz%x^4FFO<#xtm!
zs=x8LdrpIrN^C_qt!{;QrjCE6j&LXii?c(v9*=WBuQis{%8o0T#p`F8hzm-Z@W!MVWOEbSV77s$i
z(bV6PyAql`XcLyO59){*50Z%bowcGIXU%LehIt4WEa?09_(x
zp$wN0{t;Gn!iJ}lK(BBQgiFX}y%T(n5}S6SIEOjk)>DEx2oaVlBqD6LiOJY3;?JvC
zWZ!m7AKrLMc#$R3n0}B^tts}^p6+&~om-MGuh%FLka^tmTy$&hC3$ftPq-BD`cO&>
zz46+G`jn1>xc+W>XF*?zW*3Id#tN7$X*K)c!W^crR(c~BL^?K$$dSjtEDQEc)VBaU
z{yw=A!pxlWH`Wn;ymw2U*37rtYPXyqnW>htZ8XGHDzx4a-v1zvx%~tG$5)n)%F)jwX#g^&?gTq$rAPw}W;+_uf*+)8-*t$KEn_)DYm{a5`B9N&d$gw;k=UYGJF<=
zKh}F(TuaVZ+)l%)jg3H#o8-V%8e*|Z?ulJ#MA_5$g46Vj5t2qy?#Ca`
zIDO_>EBnkY7?E5zHr~Fp7!TM~*z3J(tN^S+JZE?pm3>zTL^f-VQ`!!qLn{27T===5D;Y
zB|QUdHBM@JZ9OrhfuP1*vbrg4Cze7@++!Q!SN*!PHJgb1wTb-t@ENixjG-H;(HKVc
z4-Xhi8I|15w^{Ni3wp1)@>SQd%c4E0J~2<5Y)SkN!V6CTupb-Pk0JJ^B&zj5t(MTi
zIk^8(yEQ|=nL@I@KPo5*Vd01Pz<}hKxb2m7$)GskbGtg5dD(Yv*JqsG6%N!Ou3pfs
zV2~Ab=v`X-n6c^iD1uu1W)w9VIU-em52`+C8_1eigiO}9sp5^REY>lk&6!MIMmy8P
z_Decx%$)anOl<0wKy=tO2y!_l0A=Qf(^pDukZP0FLUPA>DyC0oQ!n;VkJqorP|%X?>bZtCo_@%kO!xL|99(bLMV_;$
z4Q5wrbo+OPmUBfMKfL!d|L4}(>_?w{N>HcTu
z&sw4R{kou_!%H(tgyf<&yUOFHCi
z5zxZta5II0fw_>avV>DE`TOP({FtMOKlV9yt9*8wH#tAncr-+HdJZGdXRjnd^=om7
z%IwX*Km|y~yRZ6CZ^Qym%<^EgJ0GgQWth0598713@E>|*n4qGmb9#{$XbNrZI7d_^X+lFbE_ZBD`&C^nHgrHpt4|I%Jz18LgDSy;^|*^0>&yr2vnCj1mTWj{ued(NI3hC=LpSe1vtYif
zJnR^gqC;NE1!$DIxvFCNm{dY~t^Wh$1>x=#b!MkTC$EH2HmtCxaqwB03OBg8X4(H4
z3jkH`QHeu-#_%o>$`JBGA#$>5{l<1ag5W{RzSp+a@bGWF1y)S|1f)U@E&Y0(A(McO
zu58S4XX(?RYyoZ00j-gZ&DYz%9-rn8I67scF9f1(WoCBm5kSay;E{i;<+mDJw46?1
z$MXWY@#akw;&HOC$>l!|18waM*Uiu@e(qH<_8RGQ{#pgDz6U@hzUf_iXrN#RGQC?Q
z-B|1vaDGuDt4=8akav3^oY^r$a3DMQ)6pJX(g#2x@O(G}$f2Srb7J&MC6Mxu}rhC#bdzHJpt{iD|Bz*=z
zAcA@Ck9kbC$t?yo4}%Zu_LjSSgF$F_*~PXx@#LJ7w~uEVz|a*gKHiruqdM1fU#m;o
z8WGnYpDOJ!<1epW=QGMVR-YPuA>m5qOTX*)lR0Y_swNF6+uxhxRS@*JWsaA%ZN`sx
zdZSdMwy*VTFlcd8BB863-JgUJV4IA}TKS`Ac!L(8`wh=d0#b>;G(#ZhT+Y=y-cuVv
zKUqjh@v$s|~pNb9c*bBNhU4*SqBa
zTQPA-s9N~g+VRShEB=+EQw==fwy7;drKLWvsMRJW807Tcmr$HS>y>L%V^=lHgNRvvPj(8$ICWFks`@AKU
zY$|M6Fa;NYx%VHUMh4o9yAEn`jKCRe8?PwqvSlchO!gtb20rO?i!T1Qomb~?7Q#vB
zm2tNuEtPhpK;WJoFsTkEHw^r3?w&yD2G1v!sBK{2+3718a`4Np-vsMx+0d+at4Pmz
z-M?r^|H&y)s8D?W+U01GYH0F#$#d*Gn&eF7M8Nn9^E)Dxctb(qX_k9(Vr(qA@*#MN
zMdhI_DnU5m$D#D%SXzC7?wh~80~}1Jqib1To=l1pGVS-9F
zbSxHRdsZ7Xz`}vVH3tzN{@1oFnp|WCm1%%&e|AZ>ilE+6eT($JW1A+&cf4?nKv;Eb
z3SS=q|Cc(R8J_CAua?57MeZ
zHEHoLbw*CeGT+KiSuF4w%j5HpB@o|Qj}u!%+&=wkC%ScGOGy3GA~~gF(&T*{)Ibg8
znjeE)&HUu*EohECfeICOcQ;Gj{cuLkuq>MiE23R>z+mmn0Zyw*tu={5Mv1(HEQn1r
zZe4z${ltAVe8IpmdD)(8VB*V1F=-C!qSD*pR2YQRi_qSb1Wo;4%3lyO$vQDRR=9l{
z=i&k^DDo*jOwjHKkt#+6GWe&;?5E#{7V1>uRw)NSqe8_5msS}Em~a7{IWz|!(%6m}
zv(%El3F>~5#K?Ke4y~+`;1o%Orxd|B68J0nfEC~!Yr|9>!FfM^4Y!G*i9j893dmHs
z2)UNC^U%QMPfobHH;p#fD04d3HqU>dmtBKNE*j9JpR8ROs>iL=5=Ff*i~`MYO$}sq
z#w>J44sR>;i8THHEI=~Zjn|fAi%x{NEG&hgG1&ylI*b->XS6l)f5zK8WL4O`w|zx3
zm-QQ>y`LD?Xl0HXJM4Y#;KUSkob+aU*M}xXjh*1l7L3vl(V{vVB_pMlFt`xl&
zAbvEPqhv>9=c-*Lt?@s}DSFH7{NO$0Th6W&Om)$WH-B8F6+tQ`?iU6{m^90n+}E2q
zyZezv|6I!LRdpo3gCuv4JspnO03t5`_%#vN`$i+mS}LC;wOjU(zmBSWtGmC8{}Y0S
zO+gr;2m_ys)^{ovN)WTFur3V6uu}@gIo@V<$0w5;1WtG7f5b?%#kz8RA*$9?_rfD+
zGhh${c}Ns5JI@aFA_f`j^=GXKFH}D3uz4JBF7zrNeA4tQ&?bj^`P52@KiW>RCp9-*dvx(Jn}H=y2TGZDb(XwReqtW+B3E%
zluLQ)rz)godkaL?#v^pYA{au
zz3*RJ8fH9>SCz?>cB__j34Y{Tet!$x-cNjEvkZKCPx5__)U24o;{V4kpthh|O9*w|
zB{|yeg$HHx#X;D#cDkbPJH1rH0YRS&4payNW0GK3tSNXJv5z#B((k+T7(J!Y;44T+
z`xNEPmvC|j-s)Z77qS!qGpg;rz+&Q}`7UvHD~T`&h+S00yEV#JPK8$qAX~g2ac3J#
zp7FJ;r7Q*R7dek3bint+qi^TD3d1Wf)`EL5w#F9(N
z!7AJ5-_5JRuOULm@7t(w>K
zq`JumG`QVP&;_nrVQcd_#wQJ7et|z+U%UfeCI*bFc2L_-AU}+L5rtymDD~yEz1HzQ
zb2M%+OwWl_HlhZkz6rHG>6Rjp{)`CUo-kvef`$@}yl{LkDVwzDoN9(ULN6lvQIYJ<
zoDRlS3M)G0N&WIi<8NxHzX*+d8-zwFEQ>Ttv{WdA1K7qi%VZ;qpncV{fJx7Y85nST
zh^_t1Gb2LdOofEF`!VT9TMDj^lypWmSoJNy$7A0j!Q$c~YkK=BKN67zrR(90k^DDU
zuL<8|>qgX>+#i2`7MX)p6^A^arJ7^
zd@nI2fvbq;B5*j?h|#ZXA=Qob9;x;CQxP^mo`)IDyqbY2jp(*ipHmX^t>-rpA=j>c
z(k6cZ*IciIW-~Zc4r&v|wFbQCh3|$h@p=3L${$^?L7zwDMqtwQpvb(fLNMC^Inc)$
zwl8}PvrJBY~t3oXlTOuqn3RIosc}aw=
zb2=r@=OH5nuSDRhB_>1fjN`v@C(2O6p$0RoX|3D%Sz|T-O=>)$h%8Y&Zt!zJJzu;r
zMx_7}jOBj0v%`wa$#|CKGYlS00--L
z3aOk|A`AnY{*WM3X-p>-S*=)=d}tD6H(5H?QuPc$a&h{u6T^E;J+@}Ta7BG^AHSXr
z*V`iC6n|e(Y7Vn`Z(r&{
z8ok0ZjV;t-cW4EH=%s-5KhHDl$a~rS&^FxP1)JC|Nh$dwTa@dcd^#cz>n40HHstUA
z@XxwW7u%Tnisq4P>r2FzH$J0NhSQQ`^v<3BlWEfa0U!qN?#V=El(+69&$B!dXEhud8g#WA%m~qr26nDVd1fs
z(7r?P@g0}>mUkAIuSe>iZKkVZsn4+RBTI+z3&Ws?SoHL{1MIJNeL2FnQ^5Njkb$f`
z0w5XAqiYPuWP_mn<63dh8rnqvtid7z7>S)1=FeSk2PdMAAaQkPL-Lw1CI@ivE2>B@N!bi4
zgfAXDQ)9*Hy|&X7MvP>MDDMqTU4eRFsEsTSVEgr&;uV>SF4})8{4N-SGC5cZ<{{h$
z7nE#y_{(eIOpp&DflnM7r5FxcUn$rVq6=_o?#oeRj&1CT`dw&m`pd$l;@wB!mA&VJ
z%aa1{(tmvy8xWk|@eDSL&6DEMjLQti;(~f9?42IT-p3f?fNG5c9lx7SXwy>xqv6{`
zYr+Y4HjmsB`gc1qF1+7Sk!DsC(Vi9hISoS{krLomh1c6x;jM%6JwKWdwr8St#?}*_(7(tPy;Lpdiy1XnVCuT^dHxE&-+OZ
z#31;8&t4ROuw9RS!&d$|?w9<*Z_xFiXK{tE+BhHp)ZmahmPec475qs7FhLn`iBdU(
z%X!I^>r3~YyHn{nMtQ>#{$^9%{yZG2+5(vxJLQ%PE5CAw+ocm*@m}$7G6!pvL*oq4
znN!yASVw3QWgZvEg$3h!L
z(CVp0fQOmgM8Me_{IZA{aEk%*w$fLcTYS!lg4;1hJ#pccOTC+GNiz
zKrmw@pROE(p1!5822=^j__1>*t%LD~Mo+Uy#=H1Hmd~XQ)2fZHMAchMX~dHmz@lXqAaW#a)YS;1qc
zdHxgrNQp5u@6%sHv89=02CNv#yFW5b6+KW>vIwlc!*Kz(@O_>VgjyOI^U-eKdS(}=
zfA|(ULBR&goElsI^PXrvmIt48oad)llP~dvj-yeBV|a$-*Q52NgkmND7ADW15!QHY
zFII`4U;IsqtNMOxdG)&Tfv+9H(C$_(P@4xM!#@?2>QzHM(1Om86;RIbHkJax*1BKC
zbATH80^f~>>^-EJ}d`eOXeBjFo_
z;=jP9)xN35PS_GbEWZ-!EpPo`{_1Cfc-HC#?lLxkmVfifQ}ZLH7oyai}`~w
zIG|Zv@(OQo;ho(<@Vh>=k0J2>V4grLa4Uhq+qFvCKtmv@LDeC#LqXo;g@;qcA4OyX
zn!{pD?_})rym4KI|H!fS3ahtxs-Eyd;h-sj&
zC2SP~#+_T)TmdRSeXP;QE%3>h6&Y8Xb#>05=U9zwe1d57bn$}jl{H;0ypNs*^Q|Pd
zckDThk(3^6j!|oQ{N!xRISelvX*5ODI!jUs{Ma<)_!@4
zY~ToH1wnabQn1{8H^ub*DFrl$@MmH|EvI1l`ik;PBfOrHDFx^MG(PkNAQFJw=k8B-D{{&SGMyY}_9L=4xZyk{cnmZeP?$z7x
zMJ4Rdc;X1isy(sjIvGk!dHMeHVl59?cg);L^BOJA;pXcN1D->10J7#8pK9$OyR1ySL0+iR3)`~oIQjEv+#&y?Cb)}JJK
zl72~AxKMH@zT!aCo&1*VeQI7MJ0a(B1{UkjXSru9~B=BO8Q`QnwBWdgT;vk(E>xcH1P$ehE&
zmE!T5%?KnHoLu>?YHB7NjAw}d#C|(nW$VYQMTJHfH1f#hDnHFa8asxpg{~r@Kjte1
zMQF?(+7nYGK7Lc=%>8D!E-T&2D<%Ow8{*2}`JYN@GY=0>p^>ZXh_iN*7m!a1BO
zC97Nz?x-zmvEi&`)})lWZK>}X#`pSiJa`q+ajn{;>Ny2{r-Xl?*}2E-wU<}Jvo6zG
z>6-un?ZS=q;5Qb}(6o8WdR60WdR`y68mqMBLk+0cfJBXZsN=UMM8b-G&_YY00}t#k
ze$l5dWTU%a{mIkkh&QF}=pfoyqZK#51HHMawco>nW9zpj4A1%T*uGV|O#u4fj
z7d#0nBpM&dJGZy!eU|Cqxu$qaxivEelks
zQS;V)Cr0JdMWgv%Q|EyHMv1d^gX&YAQ>bTtl$UWR$O%(5blHtiCdmLN&)qs~WiT}P#tY4kp}vqIcKN`0s~b`aiN74Af=;geZnL1(@l6<
z^uXXUjd$-2Er4Ajg^?B1F>;!z{!e-`;Uy;N$oVU&(&ZEWcr)Sp^i$SsM!%_FU!r&8
zL6?DV)#1zfGszJ*1DF07WRvxvmL1GQoKsd(!{N^T237$T{?
z8npJi*`bRt9{d^ZnIf9Co(dlmXez9fC9nw~Q}((d_UDvTq6585(J@)%l@E9FEqAtz
zugXA7(LMlDp;T}8du1I?oc3tEXULLAL5Go=yq>%TpeV#yy=WA!6uPIvaYy@Ue$cAjC7OBWa
zC~6mbzt6`6qMmmn=lrAUG4SjY5eE2*ePeq3Hl*XXLHSWj-owB&e@aTB7QOFr{bE9i
zdW!$WM=!8|rjUG75oITy*3Lb3am;Vbt#_#Pqw5~g(n~FRnS9`^I#2EU9_MsJhLT78^5^KOg|S=PX6DX6?TYYIM~Z34q%W
zil%rh<`l4Z9bTVQo*qsxqi-uh69uI1wcQ!<#!mB~2iyQ~2+}BGbhGV*lDc(juh^#I
zUH@_=!X@GE5o)1z%Zs;@|0yyWj{@^~ST0kr6EQ9P(y3J=Ry&I-vj51Gn7^KM7@Jo>
zJA)5Z=y889wB2IucF`y+YCIEYE87IY{ST4hf6Q7L4s
zYWLsVa)*@t7}r8*JNx)DsG55Gg{LsiGOz!0{bZg0nWr5c@uNIkv}moSSp3QY93xCJ
z83v_a*3%;-K-~YDI)9^!lQs|0)$#SiM#1wC0_Pgig|PC!<7YeakJ$;9h)Mae>xGZ*
zk-mx*A@e&L;q0Hs%_$_GM9Fi$6+t)RxuWHQ^sk8PN{Ns5-<8A$5<{Q^@aniX{s^6s
zNVn(v7^y1Pez)wiVt7-l=+MxF$N9P>q&&U6R^R%L+Q|LKm8avksL#~z^m}42e1DZi
zBJ&EQGhrn|Bcsj(q|r>RB7pf1h>cPO;4c{8%0B|`&*-~uBzEOQr>cgPlTxK%x-y(j+2bwP*W)Ejeyo^}>R)}U>xBC}5@)eN{c`>n%W2~dr1^Q!QfiO?e
zDz}cl0YN``_Z=A78pNZ-A(s&e6O%QCTVJ;P2bM3VLxbdwX7%kq%8gY`ZNgN=rSmYi
zyy2X4G{P5v<1Cz*1r!3r8Bisrl8sE)b_vVH57G1Y)Y#^o%1T?pAt_HUXr+6m_TsNo
z4q+0R;@wAnN7UJ}!}Wi^I^-MQT}n@sf0NcMT!_%*uYCN5q;s_YDOQhCdN5oJQB;`m%r@YRkH#7PU31qltZQaYDj;nh{
zSDI#Er|jdX@0Z@&=kczG=QQY=e*1l5C>E#{^afA6g>?G@MIXMVVEBbE7foTU+yQ>)
z8v>c+31kJdI^`2H;F&6UR~@5~Wr)N2ZwimP@P+z}#P-^=zC3P}`W-2)+hQ@#$kj&g
z`G8WS6%K1AUG~KShrzufW8+8oS(+Pt*96%h-qn+k?oL<