From 6aa6cbc46039be0d148819e1717c1a9c8bb3a792 Mon Sep 17 00:00:00 2001
From: macobo
See
- Similar to Example: Similar to Example:insert_all/2
but with the following differences:Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+
insert_all/2
but with the following differences:
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
Give
Queries the ClickHouse database for the monthly pageview usage. If the given user's
subscription is active
, past_due
, or a deleted
(but not yet expired), a map
-with the following structure is returned:
%{
- current_cycle: usage_cycle(),
- last_cycle: usage_cycle(),
- penultimate_cycle: usage_cycle()
-}
In all other cases of the subscription status (or a free_10k
subscription which
-does not have a last_bill_date
defined) - the following structure is returned:
%{last_30_days: usage_cycle()}
Given only a user as input, the usage is queried from across all the sites that the +with the following structure is returned:
%{
+ current_cycle: usage_cycle(),
+ last_cycle: usage_cycle(),
+ penultimate_cycle: usage_cycle()
+}
In all other cases of the subscription status (or a free_10k
subscription which
+does not have a last_bill_date
defined) - the following structure is returned:
%{last_30_days: usage_cycle()}
Given only a user as input, the usage is queried from across all the sites that the
user owns. Alternatively, given an optional argument of site_ids
, the usage from
across all those sites is queried instead.
Cldr.LanguageTag
.The format of an Accept-Language
header is as follows in ABNF
format:
Accept-Language = "Accept-Language" ":"
1#( language-range [ ";" "q" "=" qvalue ] )
- language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an + language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an estimate of the user's preference for the languages specified by that range. The quality value defaults to "q=1". For example,
Accept-Language: da, en-gb;q=0.8, en;q=0.7
would mean: "I prefer Danish, but will accept British English and other types of English."
@@ -261,54 +261,54 @@ a configuredExamples
-iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
-{:error,
- {Cldr.NoMatchingLocale,
- "No configured locale could be matched to \"xx,yy;q=0.3\""}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
+{:error,
+ {Cldr.NoMatchingLocale,
+ "No configured locale could be matched to \"xx,yy;q=0.3\""}}
-iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
-{:error, {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
+{:error, {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
@@ -369,95 +369,95 @@ wuth an error tuple for each invalid tag added at the end of the list.
Example
-iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
- ]}
+ transform: %{},
+ language_variants: []
+ }}
+ ]}
-iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
-{:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
+{:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
- ]}
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+ ]}
@@ -502,92 +502,92 @@ wuth an error tuple for each invalid tag added at the end of the list.
Example
-iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
-]
+ transform: %{},
+ language_variants: []
+ }}
+]
Plausible.Cldr.AcceptLanguage.parse! "invalid_tag"
** (Cldr.AcceptLanguageError) "Expected a BCP47 language tag. Could not parse the remaining "g" starting at position 11
(ex_cldr) lib/cldr/accept_language.ex:304: Cldr.AcceptLanguage.parse!/1
-iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-]
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+]
diff --git a/Plausible.Cldr.Currency.html b/Plausible.Cldr.Currency.html
index 7dbabc79e..aa6aa9678 100644
--- a/Plausible.Cldr.Currency.html
+++ b/Plausible.Cldr.Currency.html
@@ -419,11 +419,11 @@ The default is :all
. See FJD: %Cldr.Currency{
+ %{ FJD: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "FJD",
- count: %{one: "Fijian dollar", other: "Fijian dollars"},
+ count: %{one: "Fijian dollar", other: "Fijian dollars"},
digits: 2,
from: nil,
iso_digits: 2,
@@ -433,12 +433,12 @@ The default is :all
. See symbol: "FJD",
tender: true,
to: nil
- },
- SUR: %Cldr.Currency{
+ },
+ SUR: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "SUR",
- count: %{one: "Soviet rouble", other: "Soviet roubles"},
+ count: %{one: "Soviet rouble", other: "Soviet roubles"},
digits: 2,
from: nil,
iso_digits: nil,
@@ -448,7 +448,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
- },
+ },
...
}}
@@ -499,11 +499,11 @@ The default is :all
. See Example
MyApp.Cldr.Currency.currencies_for_locale!("en")
- => %{
FJD: %Cldr.Currency{
+ => %{FJD: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "FJD",
- count: %{one: "Fijian dollar", other: "Fijian dollars"},
+ count: %{one: "Fijian dollar", other: "Fijian dollars"},
digits: 2,
from: nil,
iso_digits: 2,
@@ -513,12 +513,12 @@ The default is :all
. See symbol: "FJD",
tender: true,
to: nil
-},
-SUR: %Cldr.Currency{
+},
+SUR: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "SUR",
- count: %{one: "Soviet rouble", other: "Soviet roubles"},
+ count: %{one: "Soviet rouble", other: "Soviet roubles"},
digits: 2,
from: nil,
iso_digits: nil,
@@ -528,7 +528,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
-},
+},
...
}
@@ -586,13 +586,13 @@ or a
Examples
-iex> Plausible.Cldr.Currency.currency_for_code("AUD")
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("AUD")
+{:ok,
+ %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -600,15 +600,15 @@ or a rounding: 0,
symbol: "A$",
tender: true
-}}
+}}
-iex> Plausible.Cldr.Currency.currency_for_code("THB")
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("THB")
+{:ok,
+ %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "THB",
- count: %{one: "Thai baht", other: "Thai baht"},
+ count: %{one: "Thai baht", other: "Thai baht"},
digits: 2,
iso_digits: 2,
name: "Thai Baht",
@@ -616,7 +616,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}}
+}}
@@ -675,12 +675,12 @@ or a
Examples
-iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
+%Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -688,14 +688,14 @@ or a rounding: 0,
symbol: "A$",
tender: true
-}
+}
-iex> Plausible.Cldr.Currency.currency_for_code!("THB")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("THB")
+%Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "THB",
- count: %{one: "Thai baht", other: "Thai baht"},
+ count: %{one: "Thai baht", other: "Thai baht"},
digits: 2,
iso_digits: 2,
name: "Thai Baht",
@@ -703,7 +703,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}
+}
@@ -744,15 +744,15 @@ or a
Examples
-iex> {:ok, locale} = Plausible.Cldr.validate_locale("en")
+iex> {:ok, locale} = Plausible.Cldr.validate_locale("en")
iex> Plausible.Cldr.Currency.currency_from_locale locale
:USD
-iex> {:ok, locale} = Plausible.Cldr.validate_locale("en-AU")
+iex> {:ok, locale} = Plausible.Cldr.validate_locale("en-AU")
iex> Plausible.Cldr.Currency.currency_from_locale locale
:AUD
-iex> Plausible.Cldr.Currency.currency_from_locale("en-GB")
+iex> Plausible.Cldr.Currency.currency_from_locale("en-GB")
:GBP
@@ -796,14 +796,14 @@ or a
Example
-iex> MyApp.Cldr.Currency.currency_history_for_locale("en")
-{:ok,
- %{
- USD: %{from: ~D[1792-01-01], to: nil},
- USN: %{tender: false},
- USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
- }
-}
+iex> MyApp.Cldr.Currency.currency_history_for_locale("en")
+{:ok,
+ %{
+ USD: %{from: ~D[1792-01-01], to: nil},
+ USN: %{tender: false},
+ USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
+ }
+}
@@ -862,9 +862,9 @@ The default is :all
. See Example
-MyApp.Cldr.Currency.currency_strings("en")
-=> {:ok,
- %{
+MyApp.Cldr.Currency.currency_strings("en")
+=> {:ok,
+ %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -874,7 +874,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }}
+ }}
@@ -933,8 +933,8 @@ The default is :all
. See Example
-MyApp.Cldr.Currency.currency_strings!("en")
-=> %{
+MyApp.Cldr.Currency.currency_strings!("en")
+=> %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -944,7 +944,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }
+ }
@@ -982,10 +982,10 @@ or a
Example
-iex> MyApp.Cldr.Currency.current_currency_from_locale("en")
+iex> MyApp.Cldr.Currency.current_currency_from_locale("en")
:USD
-iex> MyApp.Cldr.Currency.current_currency_from_locale("en-AU")
+iex> MyApp.Cldr.Currency.current_currency_from_locale("en-AU")
:AUD
@@ -1033,7 +1033,7 @@ mapping is returned for that territory.Example
-iex> Plausible.Cldr.Currency.current_territory_currencies()
+iex> Plausible.Cldr.Currency.current_territory_currencies()
@@ -1125,11 +1125,11 @@ currency codeExamples
-iex> Plausible.Cldr.Currency.known_currency_code("AUD")
-{:ok, :AUD}
+iex> Plausible.Cldr.Currency.known_currency_code("AUD")
+{:ok, :AUD}
-iex> Plausible.Cldr.Currency.known_currency_code("GGG")
-{:error, {Cldr.UnknownCurrencyError, "The currency \"GGG\" is invalid"}}
+iex> Plausible.Cldr.Currency.known_currency_code("GGG")
+{:error, {Cldr.UnknownCurrencyError, "The currency \"GGG\" is invalid"}}
@@ -1176,13 +1176,13 @@ currency codeExamples
-iex> Plausible.Cldr.Currency.known_currency_code?("AUD")
+iex> Plausible.Cldr.Currency.known_currency_code?("AUD")
true
-iex> Plausible.Cldr.Currency.known_currency_code?("GGG")
+iex> Plausible.Cldr.Currency.known_currency_code?("GGG")
false
-iex> Plausible.Cldr.Currency.known_currency_code?(:XCV)
+iex> Plausible.Cldr.Currency.known_currency_code?(:XCV)
false
@@ -1217,7 +1217,7 @@ currency codeExample
-iex> Plausible.Cldr.Currency.known_currency_codes()
+iex> Plausible.Cldr.Currency.known_currency_codes()
@@ -1276,14 +1276,14 @@ such as 0.05
. Optional.Example
-iex> Plausible.Cldr.Currency.new(:XAE, name: "Custom Name", digits: 0)
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.new(:XAE, name: "Custom Name", digits: 0)
+{:ok,
+ %Cldr.Currency{
alt_code: :XAE,
cash_digits: 0,
cash_rounding: nil,
code: :XAE,
- count: %{other: "Custom Name"},
+ count: %{other: "Custom Name"},
digits: 0,
from: nil,
iso_digits: 0,
@@ -1293,11 +1293,11 @@ such as 0.05
. Optional.symbol
: "XAE",
tender: false,
to: nil
- }}
-iex> MyApp.Cldr.Currency.new(:XAH, name: "Custom Name")
-{:error, "Required options are missing. Required options are [:name, :digits]"}
-iex> Plausible.Cldr.Currency.new(:XAE, name: "XAE", digits: 0)
-{:error, {Cldr.CurrencyAlreadyDefined, "Currency :XAE is already defined."}}
+ }}
+iex> MyApp.Cldr.Currency.new(:XAH, name: "Custom Name")
+{:error, "Required options are missing. Required options are [:name, :digits]"}
+iex> Plausible.Cldr.Currency.new(:XAE, name: "XAE", digits: 0)
+{:error, {Cldr.CurrencyAlreadyDefined, "Currency :XAE is already defined."}}
@@ -1355,20 +1355,20 @@ default is Plaus
Examples
-iex> Plausible.Cldr.Currency.pluralize(1, :USD)
-{:ok, "US dollar"}
+iex> Plausible.Cldr.Currency.pluralize(1, :USD)
+{:ok, "US dollar"}
-iex> Plausible.Cldr.Currency.pluralize(3, :USD)
-{:ok, "US dollars"}
+iex> Plausible.Cldr.Currency.pluralize(3, :USD)
+{:ok, "US dollars"}
-iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "zh")
-{:ok, "美元"}
+iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "zh")
+{:ok, "美元"}
-iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "fr")
-{:ok, "dollars des États-Unis"}
+iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "fr")
+{:ok, "dollars des États-Unis"}
-iex> Plausible.Cldr.Currency.pluralize(1, :USD, locale: "fr")
-{:ok, "dollar des États-Unis"}
+iex> Plausible.Cldr.Currency.pluralize(1, :USD, locale: "fr")
+{:ok, "dollar des États-Unis"}
@@ -1410,8 +1410,8 @@ or a
Example
-iex> MyApp.Cldr.Currency.strings_for_currency(:AUD, "en")
-["a$", "australian dollars", "aud", "australian dollar"]
+iex> MyApp.Cldr.Currency.strings_for_currency(:AUD, "en")
+["a$", "australian dollars", "aud", "australian dollar"]
diff --git a/Plausible.Cldr.Locale.html b/Plausible.Cldr.Locale.html
index 2274c0350..4907cb85a 100644
--- a/Plausible.Cldr.Locale.html
+++ b/Plausible.Cldr.Locale.html
@@ -326,16 +326,16 @@ this specific locale..Examples
-iex> Plausible.Cldr.Locale.fallback_locale_names(:"fr-CA")
-{:ok, [:"fr-CA", :fr, :und]}
+iex> Plausible.Cldr.Locale.fallback_locale_names(:"fr-CA")
+{:ok, [:"fr-CA", :fr, :und]}
# Fallbacks are typically formed by progressively
# stripping variant, territory and script from the
# given locale name. But not always - there are
# certain fallbacks that take a different path.
-iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)
-{:ok, [:nb, :no, :und]}
+iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)
+{:ok, [:nb, :no, :und]}
@@ -389,20 +389,20 @@ this specific locale.Examples
-Plausible.Cldr.Locale.fallback_locales(:"fr-CA")
-=> {:ok,
- [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>,
- #Cldr.LanguageTag<und [validated]>]}
+Plausible.Cldr.Locale.fallback_locales(:"fr-CA")
+=> {:ok,
+ [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>,
+ #Cldr.LanguageTag<und [validated]>]}
# Fallbacks are typically formed by progressively
# stripping variant, territory and script from the
# given locale name. But not always - there are
# certain fallbacks that take a different path.
-Plausible.Cldr.Locale.fallback_locales(:nb))
-=> {:ok,
- [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
- #Cldr.LanguageTag<und [validated]>]}
+Plausible.Cldr.Locale.fallback_locales(:nb))
+=> {:ok,
+ [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
+ #Cldr.LanguageTag<und [validated]>]}
@@ -533,15 +533,15 @@ generic top-level domain names.Examples
iex> Plausible.Cldr.Locale.locale_from_host "a.b.com.au"
-Elixir.Plausible.Cldr.validate_locale(:"en-AU")
+Elixir.Plausible.Cldr.validate_locale(:"en-AU")
-iex> Plausible.Cldr.Locale.locale_from_host("a.b.com.tv")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"tv\""}}
+iex> Plausible.Cldr.Locale.locale_from_host("a.b.com.tv")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"tv\""}}
-iex> Plausible.Cldr.Locale.locale_from_host("a.b.com")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
+iex> Plausible.Cldr.Locale.locale_from_host("a.b.com")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
@@ -683,12 +683,12 @@ be a territory.Examples
-iex> Cldr.Locale.territory_from_host("a.b.com.au")
-{:ok, :AU}
+iex> Cldr.Locale.territory_from_host("a.b.com.au")
+{:ok, :AU}
-iex> Cldr.Locale.territory_from_host("a.b.com")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
+iex> Cldr.Locale.territory_from_host("a.b.com")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
diff --git a/Plausible.Cldr.Number.Cardinal.html b/Plausible.Cldr.Number.Cardinal.html
index a457d44b3..6722f13af 100644
--- a/Plausible.Cldr.Number.Cardinal.html
+++ b/Plausible.Cldr.Number.Cardinal.html
@@ -455,31 +455,31 @@ The valid substitution keys are :zero
, Examples
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
"few"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
"other"
diff --git a/Plausible.Cldr.Number.Format.html b/Plausible.Cldr.Number.Format.html
index 7d534c833..bbfe66b7f 100644
--- a/Plausible.Cldr.Number.Format.html
+++ b/Plausible.Cldr.Number.Format.html
@@ -468,7 +468,7 @@ to precompile all the known formats at compile time.Example
#=> Plausible.Cldr.Number.Format.Format.decimal_format_list
-["#", "#,##,##0%",
+["#", "#,##,##0%",
"#,##,##0.###", "#,##,##0.00¤", "#,##,##0.00¤;(#,##,##0.00¤)",
"#,##,##0 %", "#,##0%", "#,##0.###", "#,##0.00 ¤",
"#,##0.00 ¤;(#,##0.00 ¤)", "#,##0.00¤", "#,##0.00¤;(#,##0.00¤)",
@@ -478,7 +478,7 @@ to precompile all the known formats at compile time."000 B ¤"
, "000 E ¤", "000 K ¤", "000 MRD ¤", "000 Md ¤", "000 Mio'.' ¤",
"000 Mio ¤", "000 Mld ¤", "000 Mln ¤", "000 Mn ¤", "000 Mrd'.' ¤",
"000 Mrd ¤", "000 Mr ¤", "000 M ¤", "000 NT ¤", "000 N ¤", "000 Tn ¤",
-"000 Tr ¤", ...]
+"000 Tr ¤", ...]
iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
-{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
+iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
+{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
"0 billion", "0 million", "0 thousand",
"0 trillion", "00 billion", "00 million", "00 thousand", "00 trillion",
"000 billion", "000 million", "000 thousand", "000 trillion", "000B", "000K",
@@ -535,7 +535,7 @@ the known formats at compile time. Its use is not otherwise recommended."¤#,##0.00", "¤#,##0.00;(¤#,##0.00)", "¤000B", "¤000K", "¤000M",
"¤000T", "¤00B", "¤00K", "¤00M", "¤00T", "¤0B", "¤0K", "¤0M", "¤0T",
"¤ #,##0.00", "¤ #,##0.00;(¤ #,##0.00)", "¤ 000B", "¤ 000K", "¤ 000M",
- "¤ 000T", "¤ 00B", "¤ 00K", "¤ 00M", "¤ 00T", "¤ 0B", "¤ 0K", "¤ 0M", "¤ 0T"]}
+ "¤ 000T", "¤ 00B", "¤ 00K", "¤ 00M", "¤ 00T", "¤ 0B", "¤ 0K", "¤ 0M", "¤ 0T"]}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)
-{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
+iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)
+{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)
-%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
+iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)
+%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
percent: "#,##0 %",
scientific: "#E0",
standard: "#,##0.###"
- currency_short: [{"1000", [one: "0 k ¤", other: "0 k ¤"]},
- {"10000", [one: "00 k ¤", other: "00 k ¤"]},
- {"100000", [one: "000 k ¤", other: "000 k ¤"]},
- {"1000000", [one: "0 M ¤", other: "0 M ¤"]},
- {"10000000", [one: "00 M ¤", other: "00 M ¤"]},
- {"100000000", [one: "000 M ¤", other: "000 M ¤"]},
- {"1000000000", [one: "0 Md ¤", other: "0 Md ¤"]},
- {"10000000000", [one: "00 Md ¤", other: "00 Md ¤"]},
- {"100000000000", [one: "000 Md ¤", other: "000 Md ¤"]},
- {"1000000000000", [one: "0 Bn ¤", other: "0 Bn ¤"]},
- {"10000000000000", [one: "00 Bn ¤", other: "00 Bn ¤"]},
- {"100000000000000", [one: "000 Bn ¤", other: "000 Bn ¤"]}],
+ currency_short: [{"1000", [one: "0 k ¤", other: "0 k ¤"]},
+ {"10000", [one: "00 k ¤", other: "00 k ¤"]},
+ {"100000", [one: "000 k ¤", other: "000 k ¤"]},
+ {"1000000", [one: "0 M ¤", other: "0 M ¤"]},
+ {"10000000", [one: "00 M ¤", other: "00 M ¤"]},
+ {"100000000", [one: "000 M ¤", other: "000 M ¤"]},
+ {"1000000000", [one: "0 Md ¤", other: "0 Md ¤"]},
+ {"10000000000", [one: "00 Md ¤", other: "00 Md ¤"]},
+ {"100000000000", [one: "000 Md ¤", other: "000 Md ¤"]},
+ {"1000000000000", [one: "0 Bn ¤", other: "0 Bn ¤"]},
+ {"10000000000000", [one: "00 Bn ¤", other: "00 Bn ¤"]},
+ {"100000000000000", [one: "000 Bn ¤", other: "000 Bn ¤"]}],
...
}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
-{:ok, 1}
+iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
+{:ok, 1}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
+iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
1
:zero
, Examples
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
"other"
diff --git a/Plausible.Cldr.Number.Symbol.html b/Plausible.Cldr.Number.Symbol.html
index a8a900fd2..da413d077 100644
--- a/Plausible.Cldr.Number.Symbol.html
+++ b/Plausible.Cldr.Number.Symbol.html
@@ -378,9 +378,9 @@ is Plausible.Cld
Example:
-iex> Plausible.Cldr.Number.Symbol.number_symbols_for(:th)
-{:ok, %{
- latn: %Cldr.Number.Symbol{
+iex> Plausible.Cldr.Number.Symbol.number_symbols_for(:th)
+{:ok, %{
+ latn: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
@@ -393,8 +393,8 @@ is Plausible.Cld
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
- },
- thai: %Cldr.Number.Symbol{
+ },
+ thai: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
@@ -407,8 +407,8 @@ is Plausible.Cld
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
- }
- }}
+ }
+ }}
diff --git a/Plausible.Cldr.Number.System.html b/Plausible.Cldr.Number.System.html
index 3f7da5768..b0726b5db 100644
--- a/Plausible.Cldr.Number.System.html
+++ b/Plausible.Cldr.Number.System.html
@@ -317,23 +317,23 @@ it is returned as is.Examples
iex> Plausible.Cldr.Number.System.number_system_for "th", :latn
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :default
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "he", :traditional
-{:ok, %{rules: "hebrew", type: :algorithmic}}
+{:ok, %{rules: "hebrew", type: :algorithmic}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :native
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :finance
-{
+{
:error,
- {Cldr.UnknownNumberSystemError,
- "The number system :finance is unknown for the locale named :en. Valid number systems are %{default: :latn, native: :latn}"}
-}
+ {Cldr.UnknownNumberSystemError,
+ "The number system :finance is unknown for the locale named :en. Valid number systems are %{default: :latn, native: :latn}"}
+}
@@ -424,10 +424,10 @@ or a Examples
iex> Plausible.Cldr.Number.System.number_system_names_for "en"
-{:ok, [:latn]}
+{:ok, [:latn]}
iex> Plausible.Cldr.Number.System.number_system_names_for "zz"
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
@@ -509,13 +509,13 @@ or a Examples
iex> Plausible.Cldr.Number.System.number_systems_for "en"
-{:ok, %{default: :latn, native: :latn}}
+{:ok, %{default: :latn, native: :latn}}
iex> Plausible.Cldr.Number.System.number_systems_for "th"
-{:ok, %{default: :latn, native: :thai}}
+{:ok, %{default: :latn, native: :thai}}
iex> Plausible.Cldr.Number.System.number_systems_for "zz"
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
@@ -613,20 +613,20 @@ actual system name.Examples
-ex> Plausible.Cldr.Number.System.system_name_from(:default, "en")
-{:ok, :latn}
+ex> Plausible.Cldr.Number.System.system_name_from(:default, "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from("latn", "en")
-{:ok, :latn}
+iex> Plausible.Cldr.Number.System.system_name_from("latn", "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from(:native, "en")
-{:ok, :latn}
+iex> Plausible.Cldr.Number.System.system_name_from(:native, "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from(:nope, "en")
-{
+iex> Plausible.Cldr.Number.System.system_name_from(:nope, "en")
+{
:error,
- {Cldr.UnknownNumberSystemError, "The number system :nope is unknown"}
-}
Note that return value is not guaranteed to be a valid
+
{Cldr.UnknownNumberSystemError, "The number system :nope is unknown"}
+}
Note that return value is not guaranteed to be a valid
number system for the given locale as demonstrated in the third example.
@@ -673,16 +673,16 @@ is recommended.Examples
iex> Plausible.Cldr.Number.System.to_system 123456, :hebr
-{:ok, "קכ״ג׳תנ״ו"}
+{:ok, "קכ״ג׳תנ״ו"}
iex> Plausible.Cldr.Number.System.to_system 123, :hans
-{:ok, "一百二十三"}
+{:ok, "一百二十三"}
iex> Plausible.Cldr.Number.System.to_system 123, :hant
-{:ok, "一百二十三"}
+{:ok, "一百二十三"}
iex> Plausible.Cldr.Number.System.to_system 123, :hansfin
-{:ok, "壹佰贰拾叁"}
+{:ok, "壹佰贰拾叁"}
To configure these transliteration pairs, add the to the use Cldr
configuration
-in a backend module:
defmodule MyApp.Cldr do
+in a backend module:defmodule MyApp.Cldr do
use Cldr,
- locale: ["en", "fr", "th"],
+ locale: ["en", "fr", "th"],
default_locale: "en",
- precompile_transliterations: [{:latn, :thai}, {:arab, :thai}]
-end
Where each tuple in the list configures one transliteration map. In this example, two maps are
+
precompile_transliterations: [{:latn, :thai}, {:arab, :thai}]
+end
Where each tuple in the list configures one transliteration map. In this example, two maps are
configured: from :latn
to :thai
and from :arab
to :thai
.
A list of configurable number systems is returned by Cldr.Number.System.numeric_systems/0
.
If a transliteration is requested between two number pairs that have not been configured for precompilation, a warning is logged.
Examples
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556")
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556")
"123556"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123,556.000", "fr", :default)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123,556.000", "fr", :default)
"123 556,000"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :default)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :default)
"123556"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", "thai")
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", "thai")
"๑๒๓๕๕๖"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :native)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :native)
"๑๒๓๕๕๖"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("Some number is: 123556", "th", "thai")
+iex> Plausible.Cldr.Number.Transliterate.transliterate("Some number is: 123556", "th", "thai")
"Some number is: ๑๒๓๕๕๖"
diff --git a/Plausible.Cldr.Number.html b/Plausible.Cldr.Number.html
index 9e304ef48..51697d75b 100644
--- a/Plausible.Cldr.Number.html
+++ b/Plausible.Cldr.Number.html
@@ -441,19 +441,19 @@ using the Elixir standard library functions.
Examples
-iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de")
-{:ok, 1000.34}
+iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de")
+{:ok, 1000.34}
-iex> Plausible.Cldr.Number.parse("-1_000_000.34")
-{:ok, -1000000.34}
+iex> Plausible.Cldr.Number.parse("-1_000_000.34")
+{:ok, -1000000.34}
-iex> Plausible.Cldr.Number.parse("1.000", locale: "de", number: :integer)
-{:ok, 1000}
+iex> Plausible.Cldr.Number.parse("1.000", locale: "de", number: :integer)
+{:ok, 1000}
-iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de", number: :integer)
-{:error,
- {Cldr.Number.ParseError,
- "The string \"+1.000,34\" could not be parsed as a number"}}
+iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de", number: :integer)
+{:error,
+ {Cldr.Number.ParseError,
+ "The string \"+1.000,34\" could not be parsed as a number"}}
@@ -525,17 +525,17 @@ financial instruments.
Examples
-iex> Plausible.Cldr.Number.scan("100 US dollars")
+iex> Plausible.Cldr.Number.scan("100 US dollars")
...> |> Plausible.Cldr.Number.resolve_currencies
-[100, :USD]
+[100, :USD]
-iex> Plausible.Cldr.Number.scan("100 eurosports")
-...> |> Plausible.Cldr.Number.resolve_currencies(fuzzy: 0.75)
-[100, :EUR]
+iex> Plausible.Cldr.Number.scan("100 eurosports")
+...> |> Plausible.Cldr.Number.resolve_currencies(fuzzy: 0.75)
+[100, :EUR]
-iex> Plausible.Cldr.Number.scan("100 dollars des États-Unis")
-...> |> Plausible.Cldr.Number.resolve_currencies(locale: "fr")
-[100, :USD]
+iex> Plausible.Cldr.Number.scan("100 dollars des États-Unis")
+...> |> Plausible.Cldr.Number.resolve_currencies(locale: "fr")
+[100, :USD]
@@ -612,19 +612,19 @@ financial instruments.Examples
-iex> Plausible.Cldr.Number.resolve_currency("US dollars")
-[:USD]
+iex> Plausible.Cldr.Number.resolve_currency("US dollars")
+[:USD]
-iex> Plausible.Cldr.Number.resolve_currency("100 eurosports", fuzzy: 0.75)
-[:EUR]
+iex> Plausible.Cldr.Number.resolve_currency("100 eurosports", fuzzy: 0.75)
+[:EUR]
-iex> Plausible.Cldr.Number.resolve_currency("dollars des États-Unis", locale: "fr")
-[:USD]
+iex> Plausible.Cldr.Number.resolve_currency("dollars des États-Unis", locale: "fr")
+[:USD]
-iex> Plausible.Cldr.Number.resolve_currency("not a known currency", locale: "fr")
-{:error,
- {Cldr.UnknownCurrencyError,
- "The currency \"not a known currency\" is unknown or not supported"}}
+iex> Plausible.Cldr.Number.resolve_currency("not a known currency", locale: "fr")
+{:error,
+ {Cldr.UnknownCurrencyError,
+ "The currency \"not a known currency\" is unknown or not supported"}}
@@ -688,13 +688,13 @@ The default is options[:backend].get_locale()
Examples
iex> Plausible.Cldr.Number.resolve_per "11%"
-["11", :percent]
+["11", :percent]
iex> Plausible.Cldr.Number.resolve_per "% of linguists"
-[:percent, " of linguists"]
+[:percent, " of linguists"]
iex> Plausible.Cldr.Number.resolve_per "% of linguists %"
-[:percent, " of linguists ", :percent]
+[:percent, " of linguists ", :percent]
@@ -751,9 +751,9 @@ The default is options[:backend].get_locale()
Examples
-iex> Plausible.Cldr.Number.scan("100%")
-...> |> Plausible.Cldr.Number.resolve_pers()
-[100, :percent]
+iex> Plausible.Cldr.Number.scan("100%")
+...> |> Plausible.Cldr.Number.resolve_pers()
+[100, :percent]
iex> Plausible.Cldr.Number.scan("£1_000_000.34")
-["£", 1000000.34]
+iex> Plausible.Cldr.Number.scan("£1_000_000.34")
+["£", 1000000.34]
-iex> Plausible.Cldr.Number.scan("I want £1_000_000 dollars")
-["I want £", 1000000, " dollars"]
+iex> Plausible.Cldr.Number.scan("I want £1_000_000 dollars")
+["I want £", 1000000, " dollars"]
-iex> Plausible.Cldr.Number.scan("The prize is 23")
-["The prize is ", 23]
+iex> Plausible.Cldr.Number.scan("The prize is 23")
+["The prize is ", 23]
-iex> Plausible.Cldr.Number.scan("The lottery number is 23 for the next draw")
-["The lottery number is ", 23, " for the next draw"]
+iex> Plausible.Cldr.Number.scan("The lottery number is 23 for the next draw")
+["The lottery number is ", 23, " for the next draw"]
-iex> Plausible.Cldr.Number.scan("The loss is -1.000 euros", locale: "de", number: :integer)
-["The loss is ", -1000, " euros"]
+iex> Plausible.Cldr.Number.scan("The loss is -1.000 euros", locale: "de", number: :integer)
+["The loss is ", -1000, " euros"]
iex> Plausible.Cldr.Number.to_approx_string 1234
-{:ok, "~1,234"}
+{:ok, "~1,234"}
iex> Plausible.Cldr.Number.to_at_least_string 1234
-{:ok, "1,234+"}
+{:ok, "1,234+"}
iex> Plausible.Cldr.Number.to_at_most_string 1234
-{:ok, "≤1,234"}
+{:ok, "≤1,234"}
iex> Plausible.Cldr.Number.to_range_string 1234..5678
-{:ok, "1,234–5,678"}
+{:ok, "1,234–5,678"}
iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
...> string, :currency_symbol -> "<span class=\"symbol\">" <> string <> "</span>"
...> string, :number -> "<span class=\"number\">" <> string <> "</span>"
...> string, :currency_space -> "<span>" <> string <> "</span>"
...> string, _other -> string
-...> end)
-{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}
It is also possible and recommended to use the Phoenix.HTML.Tag.content_tag/3
+
It is also possible and recommended to use the Phoenix.HTML.Tag.content_tag/3
function if wrapping HTML tags since these will ensure HTML entities are
-correctly encoded. For example:
iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
-...> string, :currency_symbol -> Phoenix.HTML.Tag.content_tag(:span, string, class: "symbol")
-...> string, :number -> Phoenix.HTML.Tag.content_tag(:span, string, class: "number")
-...> string, :currency_space -> Phoenix.HTML.Tag.content_tag(:span, string)
+correctly encoded. For example:iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
+...> string, :currency_symbol -> Phoenix.HTML.Tag.content_tag(:span, string, class: "symbol")
+...> string, :number -> Phoenix.HTML.Tag.content_tag(:span, string, class: "number")
+...> string, :currency_space -> Phoenix.HTML.Tag.content_tag(:span, string)
...> string, _other -> string
-...> end)
-{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}
When formatting a number the format is parsed into format elements that might include
+
...> end)
+{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}
When formatting a number the format is parsed into format elements that might include a currency symbol, a literal string, inserted text between a currency symbol and the currency amount, a percent sign, the number itself and several other elements. In some cases it is helpful to be apply specific formatting to each element. @@ -1168,80 +1168,80 @@ inserted in the final formatted number.
iex> Plausible.Cldr.Number.to_string 12345
-{:ok, "12,345"}
+{:ok, "12,345"}
iex> Plausible.Cldr.Number.to_string 12345, locale: "fr"
-{:ok, "12 345"}
+{:ok, "12 345"}
iex> Plausible.Cldr.Number.to_string 1345.32, currency: :EUR, locale: "es", minimum_grouping_digits: 1
-{:ok, "1.345,32 €"}
+{:ok, "1.345,32 €"}
iex> Plausible.Cldr.Number.to_string 1345.32, currency: :EUR, locale: "es"
-{:ok, "1345,32 €"}
+{:ok, "1345,32 €"}
iex> Plausible.Cldr.Number.to_string 12345, locale: "fr", currency: "USD"
-{:ok, "12 345,00 $US"}
+{:ok, "12 345,00 $US"}
iex> Plausible.Cldr.Number.to_string 12345, format: "#E0"
-{:ok, "1.2345E4"}
+{:ok, "1.2345E4"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB"
-{:ok, "THB 12,345.00"}
+{:ok, "THB 12,345.00"}
iex> Plausible.Cldr.Number.to_string -12345, format: :accounting, currency: "THB"
-{:ok, "(THB 12,345.00)"}
+{:ok, "(THB 12,345.00)"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB",
...> locale: "th"
-{:ok, "฿12,345.00"}
+{:ok, "฿12,345.00"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB",
...> locale: "th", number_system: :native
-{:ok, "฿๑๒,๓๔๕.๐๐"}
+{:ok, "฿๑๒,๓๔๕.๐๐"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :long
-{:ok, "1 thousand"}
+{:ok, "1 thousand"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :long, currency: "USD"
-{:ok, "1,244 US dollars"}
+{:ok, "1,244 US dollars"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :short
-{:ok, "1K"}
+{:ok, "1K"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :short, currency: "EUR"
-{:ok, "€1K"}
+{:ok, "€1K"}
iex> Plausible.Cldr.Number.to_string 1234, format: :spellout
-{:ok, "one thousand two hundred thirty-four"}
+{:ok, "one thousand two hundred thirty-four"}
iex> Plausible.Cldr.Number.to_string 1234, format: :spellout_verbose
-{:ok, "one thousand two hundred and thirty-four"}
+{:ok, "one thousand two hundred and thirty-four"}
iex> Plausible.Cldr.Number.to_string 1989, format: :spellout_year
-{:ok, "nineteen eighty-nine"}
+{:ok, "nineteen eighty-nine"}
iex> Plausible.Cldr.Number.to_string 123, format: :ordinal
-{:ok, "123rd"}
+{:ok, "123rd"}
iex> Plausible.Cldr.Number.to_string 123, format: :roman
-{:ok, "CXXIII"}
+{:ok, "CXXIII"}
iex> Plausible.Cldr.Number.to_string 123, locale: "th-u-nu-thai"
-{:ok, "๑๒๓"}
An error tuple {:error, reason}
will be returned if an error is detected.
-The two most likely causes of an error return are:
iex> Plausible.Cldr.Number.to_string(12345, format: "0#")
- {:error, {Cldr.FormatCompileError,
- "Decimal format compiler: syntax error before: \"#\""}}
locale
and
+The two most likely causes of an error return are: iex> Plausible.Cldr.Number.to_string(12345, format: "0#")
+ {:error, {Cldr.FormatCompileError,
+ "Decimal format compiler: syntax error before: \"#\""}}
locale
and
number_system
. This happens typically when the number system is
:algorithmic
rather than the more common :numeric
. In this case the error
-return looks like: iex> Plausible.Cldr.Number.to_string(1234, locale: "he", number_system: "hebr", format: :percent)
- {:error, {Cldr.UnknownFormatError,
- "The locale :he with number system :hebr does not define a format :percent"}}
+return looks like: iex> Plausible.Cldr.Number.to_string(1234, locale: "he", number_system: "hebr", format: :percent)
+ {:error, {Cldr.UnknownFormatError,
+ "The locale :he with number system :hebr does not define a format :percent"}}
iex> Plausible.Cldr.Number.validate_number_system "en", :latn
-{:ok, :latn}
+{:ok, :latn}
iex> Plausible.Cldr.Number.validate_number_system "en", :default
-{:ok, :latn}
+{:ok, :latn}
iex> Plausible.Cldr.Number.validate_number_system "en", :unknown
-{:error,
- {Cldr.UnknownNumberSystemError, "The number system :unknown is unknown"}}
+{:error,
+ {Cldr.UnknownNumberSystemError, "The number system :unknown is unknown"}}
iex> Plausible.Cldr.Number.validate_number_system "zz", :default
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
Functions to implement the number system rule-based-number-format rules of CLDR.
These rules are defined only on the "und" locale and represent specialised number formatting.
The standard public API for RBNF is via the Cldr.Number.to_string/2
function.
The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:
iex> Plausible.Cldr.Rbnf.NumberSystem.rule_sets(:und)
-...> |> Enum.sort()
-[
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Plausible.Cldr.Rbnf.NumberSystem.rule_sets(:und)
+...> |> Enum.sort()
+[
:armenian_lower,
:armenian_upper,
:cyrillic_lower,
@@ -161,9 +161,9 @@ defined in the Unicode CLDR data repository. Available rules are identified by:
:roman_upper,
:tamil,
:zz_default
-]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.NumberSystem.roman_upper(123, :und)
-"CXXIII"
This particular call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :roman)
-{:ok, "CXXIII"}
+]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.NumberSystem.roman_upper(123, :und)
+"CXXIII"
This particular call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :roman)
+{:ok, "CXXIII"}
Functions to implement the ordinal rule-based-number-format rules of CLDR.
As CLDR notes, the data is incomplete or non-existent for many languages. It is considered complete for English however.
The standard public API for RBNF is via the Cldr.Number.to_string/2
function.
The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:
iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets(:en)
-[:digits_ordinal]
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets(:en)
+[:digits_ordinal]
-iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets("fr")
-...> |> Enum.sort()
-[
+iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets("fr")
+...> |> Enum.sort()
+[
:digits_ordinal,
:digits_ordinal_feminine,
:digits_ordinal_feminine_plural,
:digits_ordinal_masculine,
:digits_ordinal_masculine_plural
-]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.Ordinal.digits_ordinal(123, :en)
-"123rd"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :ordinal)
-{:ok, "123rd"}
+]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.Ordinal.digits_ordinal(123, :en)
+"123rd"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :ordinal)
+{:ok, "123rd"}
Functions to implement the spellout rule-based-number-format rules of CLDR.
As CLDR notes, the data is incomplete or non-existent for many languages. It is considered complete for English however.
The standard public API for RBNF is via the Cldr.Number.to_string/2
function.
The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:
iex> Plausible.Cldr.Rbnf.Spellout.rule_sets("en")
-...> |> Enum.sort()
-[
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Plausible.Cldr.Rbnf.Spellout.rule_sets("en")
+...> |> Enum.sort()
+[
:spellout_cardinal,
:spellout_cardinal_verbose,
:spellout_numbering,
@@ -155,9 +155,9 @@ defined in the Unicode CLDR data repository. Available rules are identified by:
:spellout_numbering_year,
:spellout_ordinal,
:spellout_ordinal_verbose
-]
A rule can then be invoked on an available rule_set. For example:
iex> Plausible.Cldr.Rbnf.Spellout.spellout_ordinal(123, "en")
-"one hundred twenty-third"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :spellout)
-{:ok, "one hundred twenty-three"}
+]
A rule can then be invoked on an available rule_set. For example:
iex> Plausible.Cldr.Rbnf.Spellout.spellout_ordinal(123, "en")
+"one hundred twenty-third"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :spellout)
+{:ok, "one hundred twenty-three"}
iex> Plausible.Cldr.default_locale()
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.default_locale()
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en-001",
cldr_locale_name: :"en-001",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en-001",
script: :Latn,
territory: :"001",
- transform: %{},
- language_variants: []
-}
+ transform: %{},
+ language_variants: []
+}
iex> Plausible.Cldr.default_territory()
+iex> Plausible.Cldr.default_territory()
:"001"
iex> Plausible.Cldr.ellipsis("And furthermore")
+iex> Plausible.Cldr.ellipsis("And furthermore")
"And furthermore…"
-iex> Plausible.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja)
+iex> Plausible.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja)
"And furthermore…there is much to be done"
-iex> Plausible.Cldr.ellipsis("And furthermore", format: :word)
+iex> Plausible.Cldr.ellipsis("And furthermore", format: :word)
"And furthermore …"
-iex> Plausible.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja, format: :word)
+iex> Plausible.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja, format: :word)
"And furthermore … there is much to be done"
@@ -715,23 +715,23 @@ take an optional locale parameter for which a locale is not supplied.
Example
-iex> Plausible.Cldr.put_locale("pl")
-iex> Plausible.Cldr.get_locale()
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.put_locale("pl")
+iex> Plausible.Cldr.get_locale()
+%Cldr.LanguageTag{
backend: Elixir.Plausible.Cldr,
canonical_locale_name: "pl",
cldr_locale_name: :pl,
- extensions: %{},
+ extensions: %{},
language: "pl",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :pl,
territory: :PL,
requested_locale_name: "pl",
script: :Latn,
- transform: %{},
- language_variants: []
- }
+ transform: %{},
+ language_variants: []
+ }
@@ -818,10 +818,10 @@ take an optional locale parameter for which a locale is not supplied.
Examples
-iex> Plausible.Cldr.known_gettext_locale_name("en")
+iex> Plausible.Cldr.known_gettext_locale_name("en")
"en"
-iex> Plausible.Cldr.known_gettext_locale_name("en-SA")
+iex> Plausible.Cldr.known_gettext_locale_name("en-SA")
false
@@ -864,10 +864,10 @@ name is configured and available in Gettext.Examples
-iex> Plausible.Cldr.known_gettext_locale_name?("en")
+iex> Plausible.Cldr.known_gettext_locale_name?("en")
true
-iex> Plausible.Cldr.known_gettext_locale_name?("!!")
+iex> Plausible.Cldr.known_gettext_locale_name?("!!")
false
@@ -941,10 +941,10 @@ to return the first known locale name from a list.Examples
-iex> Plausible.Cldr.known_locale_name(:"en-AU")
+iex> Plausible.Cldr.known_locale_name(:"en-AU")
:"en-AU"
-iex> Plausible.Cldr.known_locale_name(:"en-SA")
+iex> Plausible.Cldr.known_locale_name(:"en-SA")
false
@@ -986,10 +986,10 @@ name is configured and available in Cldr.Examples
-iex> Plausible.Cldr.known_locale_name?(:en)
+iex> Plausible.Cldr.known_locale_name?(:en)
true
-iex> Plausible.Cldr.known_locale_name?(:"!!")
+iex> Plausible.Cldr.known_locale_name?(:"!!")
false
@@ -1043,8 +1043,8 @@ in this module or in
Example
-iex> Plausible.Cldr.known_number_system_types()
-[:default, :finance, :native, :traditional]
+iex> Plausible.Cldr.known_number_system_types()
+[:default, :finance, :native, :traditional]
@@ -1109,10 +1109,10 @@ and has RBNF rules defined.
Examples
-iex> Plausible.Cldr.known_rbnf_locale_name(:en)
+iex> Plausible.Cldr.known_rbnf_locale_name(:en)
:en
-iex> Plausible.Cldr.known_rbnf_locale_name(:"en-SA")
+iex> Plausible.Cldr.known_rbnf_locale_name(:"en-SA")
false
@@ -1155,10 +1155,10 @@ rules based number formats (RBNF).Examples
-iex> Plausible.Cldr.known_rbnf_locale_name?(:en)
+iex> Plausible.Cldr.known_rbnf_locale_name?(:en)
true
-iex> Plausible.Cldr.known_rbnf_locale_name?(:"!!")
+iex> Plausible.Cldr.known_rbnf_locale_name?(:"!!")
false
@@ -1294,14 +1294,14 @@ CLDR backend defined by the t:Cldr.LanguageTag
is se
Examples
iex> import Cldr.LanguageTag.Sigil
-iex> Plausible.Cldr.put_gettext_locale(~l"en")
-{:ok, "en"}
+iex> Plausible.Cldr.put_gettext_locale(~l"en")
+{:ok, "en"}
iex> import Cldr.LanguageTag.Sigil
-iex> Plausible.Cldr.put_gettext_locale(~l"de")
-{:error,
- {Cldr.UnknownLocaleError,
- "Locale #Cldr.LanguageTag<de [validated]> does not map to a known gettext locale name"}}
+iex> Plausible.Cldr.put_gettext_locale(~l"de")
+{:error,
+ {Cldr.UnknownLocaleError,
+ "Locale #Cldr.LanguageTag<de [validated]> does not map to a known gettext locale name"}}
@@ -1345,29 +1345,29 @@ of a language tag.
Examples
-iex> Plausible.Cldr.put_locale("en")
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.put_locale("en")
+{:ok,
+ %Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en",
cldr_locale_name: :en,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en",
script: :Latn,
territory: :US,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.put_locale("invalid-locale!")
-{:error, {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"!\" starting at position 15"}}
+iex> Plausible.Cldr.put_locale("invalid-locale!")
+{:error, {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"!\" starting at position 15"}}
@@ -1416,10 +1416,10 @@ The default is Examples
-iex> Plausible.Cldr.quote("Quoted String")
+iex> Plausible.Cldr.quote("Quoted String")
"“Quoted String”"
-iex> Plausible.Cldr.quote("Quoted String", locale: :ja)
+iex> Plausible.Cldr.quote("Quoted String", locale: :ja)
"「Quoted String」"
@@ -1550,47 +1550,47 @@ of a language tag.Examples
-iex> Plausible.Cldr.validate_locale(:en)
-{:ok,
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.validate_locale(:en)
+{:ok,
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en",
cldr_locale_name: :en,
- extensions: %{},
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en",
script: :Latn,
territory: :US,
- transform: %{},
- language_variants: []
-}}
+ transform: %{},
+ language_variants: []
+}}
-iex> Plausible.Cldr.validate_locale Plausible.Cldr.default_locale()
-{:ok,
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.validate_locale Plausible.Cldr.default_locale()
+{:ok,
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en-001",
cldr_locale_name: :"en-001",
- extensions: %{},
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en-001",
script: :Latn,
territory: :"001",
- transform: %{},
- language_variants: []
-}}
+ transform: %{},
+ language_variants: []
+}}
-iex> Plausible.Cldr.validate_locale("zzz")
-{:error, {Cldr.InvalidLanguageError, "The language \"zzz\" is invalid"}}
+iex> Plausible.Cldr.validate_locale("zzz")
+{:error, {Cldr.InvalidLanguageError, "The language \"zzz\" is invalid"}}
@@ -1660,23 +1660,23 @@ of a language tag.Examples
-iex> Plausible.Cldr.validate_number_system_type(:default)
-{:ok, :default}
+iex> Plausible.Cldr.validate_number_system_type(:default)
+{:ok, :default}
-iex> Plausible.Cldr.validate_number_system_type(:traditional)
-{:ok, :traditional}
+iex> Plausible.Cldr.validate_number_system_type(:traditional)
+{:ok, :traditional}
-iex> Plausible.Cldr.validate_number_system_type(:latn)
-{
+iex> Plausible.Cldr.validate_number_system_type(:latn)
+{
:error,
- {Cldr.UnknownNumberSystemTypeError, "The number system type :latn is unknown"}
-}
+ {Cldr.UnknownNumberSystemTypeError, "The number system type :latn is unknown"}
+}
-iex> Plausible.Cldr.validate_number_system_type("bork")
-{
+iex> Plausible.Cldr.validate_number_system_type("bork")
+{
:error,
- {Cldr.UnknownNumberSystemTypeError, "The number system type \"bork\" is invalid"}
-}
+ {Cldr.UnknownNumberSystemTypeError, "The number system type \"bork\" is invalid"}
+}
diff --git a/Plausible.ClickhouseRepo.html b/Plausible.ClickhouseRepo.html
index e8624e105..9559803d6 100644
--- a/Plausible.ClickhouseRepo.html
+++ b/Plausible.ClickhouseRepo.html
@@ -845,23 +845,23 @@ pool to disconnect within the given interval.
diff --git a/Plausible.DataMigration.Repo.html b/Plausible.DataMigration.Repo.html
index f8f4c73f8..61e922cfd 100644
--- a/Plausible.DataMigration.Repo.html
+++ b/Plausible.DataMigration.Repo.html
@@ -1152,23 +1152,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Geo.html b/Plausible.Geo.html
index c2f5c0997..0b602d92d 100644
--- a/Plausible.Geo.html
+++ b/Plausible.Geo.html
@@ -260,8 +260,8 @@ and MaxMind license key.
Examples
- In the case of a DB-IP database:
iex> database_type()
-"DBIP-City-Lite"
In the case of a MaxMind database:
iex> database_type()
+ In the case of a DB-IP database:
iex> database_type()
+"DBIP-City-Lite"
In the case of a MaxMind database:
iex> database_type()
"GeoLite2-City"
@@ -301,8 +301,8 @@ asynchronously.
Examples
- Loading from a local file:
iex> load_db(path: "/etc/plausible/dbip-city.mmdb")
-:ok
Downloading a MaxMind DB (this license key is no longer active):
iex> load_db(license_key: "LNpsJCCKPis6XvBP", edition: "GeoLite2-City", async: true)
+ Loading from a local file:
iex> load_db(path: "/etc/plausible/dbip-city.mmdb")
+:ok
Downloading a MaxMind DB (this license key is no longer active):
iex> load_db(license_key: "LNpsJCCKPis6XvBP", edition: "GeoLite2-City", async: true)
:ok
@@ -331,21 +331,21 @@ asynchronously.
Examples
-iex> lookup("8.7.6.5")
-%{
- "city" => %{
+iex> lookup("8.7.6.5")
+%{
+ "city" => %{
"geoname_id" => 5349755,
- "names" => %{
+ "names" => %{
"de" => "Fontana",
"en" => "Fontana",
"ja" => "フォンタナ",
"ru" => "Фонтана"
- }
- },
- "continent" => %{
+ }
+ },
+ "continent" => %{
"code" => "NA",
"geoname_id" => 6255149,
- "names" => %{
+ "names" => %{
"de" => "Nordamerika",
"en" => "North America",
"es" => "Norteamérica",
@@ -354,12 +354,12 @@ asynchronously."pt-BR" => "América do Norte",
"ru" => "Северная Америка",
"zh-CN" => "北美洲"
- }
- },
- "country" => %{
+ }
+ },
+ "country" => %{
"geoname_id" => 6252001,
"iso_code" => "US",
- "names" => %{
+ "names" => %{
"de" => "Vereinigte Staaten",
"en" => "United States",
"es" => "Estados Unidos",
@@ -368,20 +368,20 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "location" => %{
+ }
+ },
+ "location" => %{
"accuracy_radius" => 50,
"latitude" => 34.1211,
"longitude" => -117.4362,
"metro_code" => 803,
"time_zone" => "America/Los_Angeles"
- },
- "postal" => %{"code" => "92336"},
- "registered_country" => %{
+ },
+ "postal" => %{"code" => "92336"},
+ "registered_country" => %{
"geoname_id" => 6252001,
"iso_code" => "US",
- "names" => %{
+ "names" => %{
"de" => "Vereinigte Staaten",
"en" => "United States",
"es" => "Estados Unidos",
@@ -390,13 +390,13 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "subdivisions" => [
- %{
+ }
+ },
+ "subdivisions" => [
+ %{
"geoname_id" => 5332921,
"iso_code" => "CA",
- "names" => %{
+ "names" => %{
"de" => "Kalifornien",
"en" => "California",
"es" => "California",
@@ -405,10 +405,10 @@ asynchronously."pt-BR" => "Califórnia",
"ru" => "Калифорния",
"zh-CN" => "加州"
- }
- }
- ]
-}
+ }
+ }
+ ]
+}
diff --git a/Plausible.ImportDeletionRepo.html b/Plausible.ImportDeletionRepo.html
index d434cf76f..4f1ee58ba 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -1143,23 +1143,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Imported.Importer.html b/Plausible.Imported.Importer.html
index 6d4e278e3..c6a480da5 100644
--- a/Plausible.Imported.Importer.html
+++ b/Plausible.Imported.Importer.html
@@ -178,30 +178,30 @@ scope of importer logic and is expected to be implemented separately.
In case it's necessary to run the whole import job fully synchronously, the
Plausible.Workers.ImportAnalytics
worker sends an Oban.Notifier
message
-on completion, failure or transient failure of the import.
A basic usage scenario looks like this:
{:ok, job} = Plausible.Imported.NoopImporter.new_import(
+on completion, failure or transient failure of the import.A basic usage scenario looks like this:
{:ok, job} = Plausible.Imported.NoopImporter.new_import(
site,
user,
start_date: ~D[2005-01-01],
- end_date: Date.utc_today(),
+ end_date: Date.utc_today(),
# this option is necessary to setup the calling process as listener
listen?: true
-)
+)
-import_id = job.args[:import_id]
+import_id = job.args[:import_id]
-receive do
- {:notification, :analytics_imports_jobs, %{"complete" => ^import_id}} ->
- IO.puts("Job completed")
+receive do
+ {:notification, :analytics_imports_jobs, %{"complete" => ^import_id}} ->
+ IO.puts("Job completed")
- {:notification, :analytics_imports_jobs, %{"transient_fail" => ^import_id}} ->
- IO.puts("Job failed transiently")
+ {:notification, :analytics_imports_jobs, %{"transient_fail" => ^import_id}} ->
+ IO.puts("Job failed transiently")
- {:notification, :analytics_imports_jobs, %{"fail" => ^import_id}} ->
- IO.puts("Job failed permanently")
-after
+ {:notification, :analytics_imports_jobs, %{"fail" => ^import_id}} ->
+ IO.puts("Job failed permanently")
+after
15_000 ->
- IO.puts("Job didn't finish in 15 seconds")
-end
In a more realistic scenario, job scheduling will be done inside a GenServer process
+
IO.puts("Job didn't finish in 15 seconds")
+end
In a more realistic scenario, job scheduling will be done inside a GenServer process
like LiveView, where notifications can be listened for via handle_info/2
.
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index 44ef7bd9e..31bcd05b6 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -1143,23 +1143,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Stats.Filters.html b/Plausible.Stats.Filters.html
index 30686062a..347fa6b5a 100644
--- a/Plausible.Stats.Filters.html
+++ b/Plausible.Stats.Filters.html
@@ -253,14 +253,14 @@ Pages
Examples:
-
iex> Filters.parse("{\"page\":\"/blog/**\"}")
-%{"event:page" => {:matches, "/blog/**"}}
+iex> Filters.parse("{\"page\":\"/blog/**\"}")
+%{"event:page" => {:matches, "/blog/**"}}
-iex> Filters.parse("visit:browser!=Chrome")
-%{"visit:browser" => {:is_not, "Chrome"}}
+iex> Filters.parse("visit:browser!=Chrome")
+%{"visit:browser" => {:is_not, "Chrome"}}
-iex> Filters.parse(nil)
-%{}
+iex> Filters.parse(nil)
+%{}
diff --git a/Plausible.epub b/Plausible.epub
index f51563c7d2a7bc7d67de520d8ee0afddada99ed0..52a40f37454b262f20d9ad281e62f2c157953c65 100644
GIT binary patch
delta 123923
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
xm;&23>Aksr4
zt~*A2Y$T+N7+Cd7RKgT(GzeTi0Lc1SoPvAD09kP#J&y&>TunSU^8*`3Ee83|nf@%`
zHp17BN^%Yo56v&1z{Umuq_6}XG)nmSC!i9d+1M@46z!oo9~~Avjc7)P{n2@#<$;Aj
ze1uM}R~%2$L$a6){=bPOyzvXL^f5bxTbBaSAP8dYKWat)z;_pD5Mv$bK8#gc1$>U+
z&Be;3dD0JKIY0S-65awK{H=U)y%1~WB4LxBe@
z1LqNXhHJn~#Jc#q`9CWLyFe2}Ys;TNoiQ3Ad?LArB#7RFBl
z(dL<6mU+$l{wo8zA~$61iP(#xvFBZ`UCKIfevw1nAwM)~aU&AYzY~Yk3sSfVpnH6m
z?w_@7TD3>c$N5S^FMv`gWl*I?Zh!Xk#14BSeknWq{FcEv{19kRxP=d)$VW0U!y9r{
zUhzSGabl9fBC)>nMxh6qz8D3GRHhjNFqG8>y$D89`(~R^&9e^qW#`F0Ee~P&dEhKJ}IknHT{SYR#d?jwP%lZz(
z7QH0=lSrMM!&?_e3E?94l&n^Jbz{)agC{2e@=wFs2G5@2g`wP5LQ}icaoa({7@yF-
zvAJVl5r9-=wWJhXr$de3xiSKfgLhI)Vh2NXvoP4-g&aZ=C_NKo$D-6*ZxU5sWd<4k_@qLUMLzL9i5$ZWi4
zl8`*t-)gdk^}G&nh)Q;<$)=C|wb6KNTKPr3kDPY-2m8^I5Y-j3v?aD(-$OtN_0qgz
zd7NE7RUQ431$UjLj}@g^u$X(Aomk*aaq`A>&Z6#Rp}CSKE7YP`o`Vo)+Sn`p25e#A
zK8WJ0rWheH4A$6AKcSyNtz;5NoMR*F(cR@P48Q1?(@z8|#KsZ}adKFMtL={;^qaI_
z|As4_bocctnB#^#ZAxwiMwube&lRP*@X@3)VeW~RVq}bqmK@Y_fl_%{g;^%p$IYN4
zWXS^&Lr*olpuB(JNFVIy8`zvtv@8urL{2P_2PStHJZ3d^rtv28_;mOk!(%ZA33C;u
zLfvKt;z@mOKMTCk*V|B6-Qi2IEjG_g(i)KtI3mBfbp8glY2N9HJF84b86=}-eYsNp
zvqQpn*pWSB6HgoFWhz(T&>g}tt%_dZ$6ocWMry-VncQ1wXv7_B29M5tK@bw
zzY-FeXoWjd{Korl9rR*v)~=ljJ|rT$^=qWL0R)p#M<5n
zH!WsQ{jP$FQGjnZCGH(tEIeIL!bo2(9`x&LW3HLtxu350Z}Ys{FyVIJKkg?Lh;@H{
zMRH}DJZ46Mk$vE~=OwhXs3^*pVPw-iWp%9sBht-%!p!3ziMKrS7AkmSyl*cR_WU`$
z0Q>taW-!ZANV!bm=1Pl8;GL6CRm1yZ
zkV0X}DJvG-1`A)xqx8NMFpRM@>FNjx(R)kIq`ESHo&tTlj?o=l2uPu@iSB
z*3rdlk~wcFT`JS!Y;4t0l+n@A2p_EyhZ}*Bj>WVgS0C=T6L#81EBwV;_su?hDf9L@
zQrx6x@#)Y=%G=B2{uKuW%Riir^D40hJo^P-uPGA85++n$Ylo5O
zx;fr&{<+!2uUR7p6`p8d^|Hwi$Wttgoog)^sL_e;rkj44*-eK=i<=-5-53ojUa=V_
zFtxt#+GR?I+(9DSDbsGVrqh-a{+!9t@7olP=T@QNlZrYP#T9p3nPhJC*@e$HY>&abV0V9vZuC#Bz%6o8)HRsTy__nv)qF1FrQL
z_I*TusmE~ABTN=;%vQXrM%u70FM$NDV|(d2@H;W31N__Zs*YCw*ThQ`J$3;feP$+E
zXe`7b@$;;QKYtVEyIHR_5szq5$AxnqcOQ)P61#5QaMr`+*{u1%6rY(@!GD6?xkl;|$XUWa@O`w|gE`qH6K+zixpMV0V(C
z&y0(J0k0)d9KJ5xla^v9`7IOwOy_nd_i`--r=Q1r2TFZ%E}Dx8f3hIsJucD94Bt}}
z&gh2G-
zpic-iAOXrmAX_O=J_2FMfKU;ZNfkiJ2w9aP$oIc-RY8deS?4QI8bW5Q2@*yS<4o=U
z*%Q(QO(9Cc<5DI91MMG0CQK0lp}|D0&`99gMxg)d)hcG7a0IKJvIfZ^2B&ra
zog<8rID>8wi3IT*5EJl`ch|TOOAkCGFP`)d$;-o8hBX=v+}#f}k4Q7rfQUnIlbrHGGB
zi|QH=ofhTJUwY^4%jHw=P4K1aa(3(e=_09uR!TTZ@EvtD+i&+hIz>X-<($#YCI6M*
z<{OuB@$t7|8*V&5mUi{8@@f{JwKOlAq;8_Vq$<+*!zMIp6wsHN@)Z4^>z9bjuO@~|a>TXLRuccw
z$tz6%fzdmH!H-(v{wslL6PGO-2T7&qStawP7tn!;;xkU9WAZL<8U44i?*3I(*~CD^rt>`oey4w|>4dTxx3S
z2c_i=c1i1c2f|D;T_aFFd83e*tf;I>7&OS=8~VmzUm?D#k!E!|L#=i%aH3YW%mIfv
z#Ur0)aE&{RKR$DgT2zUiB<)jeYDef0+
z8d}fXUQ^%M%vKu{^}En%h(@U}Rxn_D<@*b-8H@4xhBUIymaTg(Efv#{Umf)pKT(o~t=
z&_*yxG$|K%MXfjCLmR$CV8;q!HrN(>m)!cVVeOQ?TQ>9<_J`{I?2=vPoilQeiQE=t
z>hdx8NXM0-Dq+^49k!h}=qa$9-uyM_d8%c`i;28DUDC7{AJ+@LfklqvAJVnMrS{oS
z>lbzo>{lD=53TzAV$P0Jp4ICB{FMOiD4!8ODcxUKlvG3Vz@e>G~M>Hw4
zv#dFv_Zwb0GfuMfsvJ9}F<7%3F>`z!rRO*!O;Hm#&J#Y3_G|i+{KK{nbqj
z_rYh!iPf=E@xRcYYG1@e^cJ8mw)ld$jf^XDz}iH
zoDrWt^m^B}+cwwMpfghJ*37GHkolmf&g_?~K2zOe3LYVom3w-)DvckIwJPEfb{DwF
z$e1PR0j-@BL>2Rdi_K2$Z&(YYuPmyCH1dfmNM{>sI?Tr`8o3BB&XKcL+#~ICwN{9v
z-t>5QTsMIBfdaS0|9}1MxEqA=xR*2xf;bUdNr1Z1(ZIvbcl+<~m=NX~
z1VVuujDXe=`-jBD!$$wOBYZc%=9_$|HnE{3xpff2#2wMlVA+ljXS>)_pe4i}cr*k0
zh}fy#uYmrm`)sX&DiFJ7+73trVRUvMWPy;0oq>oEGW|^&`*1hKWv86``;dI&}t^ig3p#42*}M6)}4xEpeALg%MAmWj641;YD_EX2eO91{N68s(tjq00VUqp}LJ@9`=^~VA1u?`P`g`vW*
zk%14(?kyS?toZH2%$Xm9y$~bKoq=Z&sNoNI1A%gGz~zWV`RX3*fslOzLK+ayE)Wg!
z-y*uhgp?!3tiXpDBJ?nbA&H1<5}#-xN(k8@0|X!O7`Kfzks}^%8F*pCXwU(KFlrlXrS$T1CHw~hmdyTtb>Q1CAP@_zRH!|rR96k+D6#p8pP!Mif7-H2$)drP*+}0
z;DiGcZ?kI2J>0;#kNh
z3BM`Q%=1fu9u)Fsvw+{7$l;p*8IoL|2;GfGq_U%4+7W|n9upGUOUbA#{=UQaI4>k&
z?`@jQNRv{MH#`cdo~73qZi@BSqUM!snRAk1%8tK%^YmutNYRO5WXp1~W=n{v_h&0a
zEk$NcD5BhoLO^Pdg``J4Zt&Su)7r?v+HFWGy%G35BL}oCnl~&lFWO8c2EFsGi?O-G
z%7O&aRA3{g72RvU#a?zSo3|(n9>EhSh8+Gu&;;%NqJ>;v8rBKNxn?=^O=9baRJB*3
za~9sr>fCw$@^XfUAPtY-=NKybvPFuoR0e8Af%di|L(xb%F-UxpZ<3K&*EGN5G-|G+
zB@7M>)AmAzGR9#F?w3_ItV2#8MAGp-<6YEX=Oj>Ef{*#t4;pV+C-y{TGZvE~Yp>hY
zY%XQ8Um0Y_w>KVKWoqQA@zCmbvwJ%og%Qv0bB*dGYlnT^!80_m8H{$KvhzBnTCkEE
zHOQJ4UJJ3E{x;{rkW=QZ;;j{G9VWwvB><8viZ{Nq2ula!nmiEm(pO7SEP
zt#Ii4M?DelyOJexaIJ)^g$l+nGbU!zKo+S45Bqu|{aE-bNS%WNjLCW(PV}Lx1d^l-
zY7q~$lD@>kZIVP!{J|7KU3!e6knYQ
zI_!mNO(3<*f{a5uy>CZ+0|4?O_viK=|1J*|dD7pLwzv*fd2#07dvExcv)+TgP>
z$Cq9A9^dK`F||ab`&5T)+^^{zvn4+V#M=dMmplXHkY{)b4R-5(FLV69Nfsiu#00?%9}&R*vw4%xh?pP9|)5DN{brWABh
zXb0zvL|afFMrycg{V|d@9BE!0z|w9%II!!E0yokp9WbnnP#SIf{w7GS?bHFENhG{`
z+m&A!5==&ZN!G}2_!=Evm?HATlzncvS2nW`aJTV1N6kOK?C03g$2T$V0kpYJl2!IM
zFLH4!4@FwfbZ05bF0eemSU__UtFje5pz>KugND0iE_u<5o9+az>`n$Nr(Y+o
zc-9Rot(`^m8Kf>#^F13JEDKWP5t(OH=$rqW;~Ld)J|D(o$$okMrY{;xpCvtxDr<)J$2S^)klk2u9C(i_1&DTmH$B;qZiENOLt<4Js;T
zuPH|LP35yhW;Ae5teE<%xN{g08Os~L>N!Wl!6OKXB&jS1Cw{^EeL;>)ABpx0r!G8s
z0D8-ecV@0eXE%XqgNZ|L%*k^SQhO5Rc^2yoQ{TMT3xt$St&
zJq%Ylsy~bGYOfrGC)(=}$)
z_kzLNO@=9+G^<>1rUu}|4bhN3^7rN2<|%Aip|R7FLQl;?Pu*L;&FI2!CWh93|Ab#(
zSyCFK7QriEEExGZr$dOqB+X8HT2{}Lx4Jx|C}`@5$~q=lMVqtL-(XH&+ACsd)`480
z^Lsuhj=knMUUn9gu5^YHe5{>Jr;c~;JU^bJS~;P$$K9^4b5yR>s2P79^MiP|w+s~C
z2u~A^Bkg=0Iiyi%<+DoQBn=fr{lc)meQbG3CNh;v)T47vf@a6__Y5uI#=mzvc6E~I
z@@abOPc=@6kS)5&J5ARTVTes`8((e+R8ET%N8^Hf>s3psN=b^;VH|ju{%pJY=LT;L
zz4~Ua@qK!Vw~Fd4Nj=fup+%pLMRds9v0b)^yjOUTG^o;ZQsMVi+1F47_lv||^73kd
z@V=U=zZR|Y(zjxUr5D{eIvHhpt{USDhlMQ+Pf=&BL-E%g*$33GU9ES^Yw8Ot
zE`Qbk;zoV_wbtSMZU*BFn&K2k^|nQL@kOP;?pc0|G@eY!#mS$0Q@W(2-V>1;g#d_Z
z@aC9P#^;l}_!d`L9)f~1nao#Elnad
z%f!-TYJxQ{_(J)92i&rMd8=A}i#{%zq{t+mJa7HmRIsu~cxK@0?C^zwzX|
z7rQo7PQg^DZ;wnT?oPICC^x*s__Laq_qb=E;_%u4|AmthAP1E2XXV{;=a-%rta!QyOXxHV$9R;F%VL
zGDK+;SM%;hZ6|W!vppv?H0ps&Gsv9wm91VH#lETt{JZ&T+SHW6+Xbi0;~TkD-S=z5
zrM70#+q?P0HibZlzjd);vJ9@|N8~bV5B)L)6Lrjr6XcjCqzoiY#;=)pCZ5lK9gD78
zHy3Gt9M)GjY;+{dbfDr_w-fL}=dagyhBgxD__0Sfn1>CmtUu>hp-hqi`k$T1qZwjKNnE4wo3|r57Yi_YAZ=dyO;f&-8nyf
z$S$x&tA-GAr9JXey`0)7Gm-SXVus{awZyQf4t`ab`*ZHdh%s(_mJJ4ZBI^oJh1$4z
zyI!(=b6R0YmvPz9O896DODK&WqVX!lWS#-i;VV+O%ZpaEA-DGDB6mvNQBU|X<(@W#
zimb3mO9~}GK&~+ZbelrF!F`js;WJy$Mb|1&EhdQ)TMM$0;YrZSKBzPr2
z#ka~!sxraPxovu4B)}7J
zl;BTM=(6JJv`e88a3kw-;RndRD*a@qmlH>Nm`JqpE#sUvU76&W;V@fu7>|FaM-&%G
zFKWxexy|Bq9UUSZ7qfWs^tzw;-P_DvXU~jHWt4?ZuWwbgHz$yOXTsCLcBnFHBHIkn
z6$$dwngk&Qtc8@9_wm@)iex27zZ&xF@rSR~oH;j_)#@j=>qa{=gW)f$t0A~pXlAp|
za$Zt6!H6Zsc@}D5IC*IMGejVrS(Wt(apo+OiHBvqYX7;pCGNT;IScgy
zGGU0%N)b?5fbst8&6TCQJ8!mfU(yfLRzKY7PA1}#k%jSx>gJJlP@roc6;vtFa=qI=
zKlWOcL)5gZ{a{d*@A6j4RVK8+{1Q_Oe`g1+q>M+9@Pjmlh*4~aWg2wti6W9>e>J2y
z*UbC~B1T5~sZ%Ims~FQ@;%waw&DK^aCpn#bie4^%Zb6RINA2PCoz9t}Ai$No?>0r4IVxW2qUgUjFp6=N}1bejePY1sz##YV9)4#Q4=zg9q78Z0yaqmw93c%3UCYukHxS3ch%(r(
zHJC>t#JQ%7Tkculz*EH4I1X0>w1CNYWIx%8cbbi0>eyBG7kNMvfj3(TVfh{CEko0H
znNc>#Ix;xzcqbGk6;+DRcZmdq>G`n56!jdQJ0wt?@#|jKn~siTmWh5wTYkcyzk|P|
zz37NqoGBO^{q0i5Y2ef!GMv6Thg*B5R}8h)fT9BuDlrfRh_g#jmDa6t9IG98=Q
zn={l{6ixa%UviW&bndvo0uUDYPWKU~AvJT<)0d7nl4D%jnt-~Bsk<_Qc_SYW*To3$
zMZPyNL}9f6=GW1vJvSX*zd9+msZ@t(U7mDjyxlk0TB_uNHlwd_Gp*0Y!$2#_%R@RX
zb8zr;beD0|vFR<`HyhL35VsRsEDnQT2W|jTX|ip1%vrX+86QID(5$j9^c8#6FQcj^
zp^@=XUb^RCsS)#FK$3gO$~#9D7rDdLyqOmdw6Ew%mHwXi509$&F!Ig|NvqviO1b6h
zJ%HEnE=2%T@*1TWv<4b@=e3rUzcXh-#nX_BUV*8-?HOzinC<
z=*_FrC;P5Yoi9hZm;Lk%CDzfPRg<7$e3mwxkPo^8#p4RY`GL!HTe5n!?}O)J&@jLB
z8RdENI%{b|IH!37(b)t;!tq~jlD|HU*}-c
zz{p=_(et%#t|2c9ktc$d-%B;{U%Qbjl!9k9%u`k?*wPDsM`pd0;2y3HUfmif7Y?ll
zS@hRe-vUpn^~jw-u(RcWpmiI$6-V`%x|!{u7f`K$>>~P>zGH)l$>Pu_Zhnc%IgE_V
zCUHsA-a{Q)HF6o{VYf*Rq3D{Sr~&W3vi)sVZZPOO_+?IA+)n3F5b{%v$D`?NCwgm2U7rGww#TzF%e-CkVJo-6JXG$K0#zSnm6^8~!Tv!*Y4^-{C5
zRYssD$|jjAy_#DqK@?T~ZlnCzZ;p{yg=gs#da}BS|-sSJ0GtTSd_?+%4qW^yK#R%
zKI)iqvQLw;QEm>51z9q$^*z0!-2ZQ3Bl{XA82k-m4qr55!
zJM+@Rzm)h(Bf_l_8T@WSWFfWu*SbWntAIveXY_TQF6a&5-kQIM?c3y4kg#9MtyrQKg
zGEdAI^2XX)0V+?O%H_lJiOw=bz@nTXvb$So?rZab(WT(m
z-MCZGc^igN_i7J$!LlK4z_K_`;nQM6-ARv;-iwCdjnI|P&aaRsum3oJ`n=g8=ZTRo
zg$&Pv{mKQONqwztXZXGps3D4`m5Ew~v!Qg2D&XSYsqhtr_heW7(4&0fim>Er@AL-H#mBTF3~geS6g|
zvH3H4>!#A;#GXpIh}6|Fw{;1SjJ5?$9ncLv@dGjKPEql>wS0O?u0J+>P(B|iaNf+<
zt@_!+@>A<9LoyBa@7Znb!>L4E*n)JZ(!^I9WFWm%t&5S%5`P7?l3GhJIsl3nyBv9`
zjwfqg7;I}6Le3W71Ex;f*am4qD+lQYFrH3!U236%Y+i$)Nk}rkR2K2aA3Gm
zT=H81IMTbUb>BoQbTG52qs+Gn|FD7)&LnNntdHo+ASK_;7Q6tw@=)#xoDudsh2Tc;XuQWNKRMN5JwddWw
zuWA}O8n;h=C2MfEJpC0+=Fi59{T@rJOF5+O`_%e^`3se%RC*N67q90!61J<0-PX-(
z>to}7*25fb^IF^T=5*0L3=WkNqZkzhAj=xj^wm7N_VpJVK1Jv)H=acR+vcekQ}&nK
zqzwub05&+#*gyVx4~sc1H2Y%KXjq2FSEAHccC#n>p|q;n(~YxES??F}nzFH#jth--
zn0roL!_23Y@ZET4?YEoW4Q#?!FyB-2O9e_(CN=(NHN0E_)07_MDmUJ_=ENBtJ+7uf
zh9-wbrcBGZp+NtG0!uIvuHYkNQ5<1?J9G3=)BmSR>fbFS?h){2v;y=JuG
z=4QdNT8ygO+1J6DgW%V^QyD;vUW=f
z35P<{;pBnYOgqunl~eUeg+QHv1wD}|>%6SpzQ0;to`jYG9R6^;iQRxw>TBJEpB*%l
z@XlXSMdmFAiW^F&>BmJlM%foWz02RNertyBzOP1E%i5yPvXAg^<#w7HQH)S*TRz=~g*k`xkTuDRLNz7DOjo>$
z?YB1({3=EaY-unSH%Zp-s`BT=(Qi#@S=s|t(fC3xp)WoZcuq`v&`=`WFzn?1Po2NTG9KYR!=0CJM8KUi@Fg@6OSZfQ}yRS
zv-;F|%^5ETToXxCO@9nEb*bjr(irKCAV-emOP)+brG>s{<T_{d0??&1IQPY*;-WrQPLO$bN(FQth~-cLVm8koF$jjW
z?OS~0J=N>>kVnZ~;9OR=sW4F6!0!A
z;hlRccaFm;!5qdx>wRuNZA?l2V5cn)iOk`VFZ3v*kJY0|Scw6<)v~&>381DeQ;QPO
z%N^HBb4rM@`o&BecXwfSU}J49gr!&WnFiIeT!y*AIKAh^%NV3jurKrB)ZijJu!9Zf36NQ{Qf3Qkk9B2KQ_Bfy5KX4<~G;!
zN^s^=mKZU9{i)N-ev5m*a4-
z^~K7M)}5y5c;E510)5-zhozLNrH-I`G^IGy9m(EUF(5kPgVxZdnK-=}qludvvpySS
zO##?e-PRXssFBoxM}eoIXJfIaVPz{(h;5xor(c|sU`{TYVrFasv#;7QlzX#%1|%RU
zAT6nm+FHh~(2=%q4=0#0&*!3zCY=I2%hBmvT67bu+fg2OBoE1a{&06!-i>hxpSKT6
z6mY1bEty6oIYWQrbxk>kH5Vw?X|7=HHFtqG8~!5Zl2{fdv-~P;{O6lLe*Rb1!Ut=3
zV-6lQ$zT8K*(Jo^$T~+<28zQPU0E+69;Ci
z{kB(0T0LbJ$v$H96?C?#?8!kUOUhL-?|GStizZEOn->-<
z&0cx{xc9X%bY9r8x99HVIh-zAN4#J6a4*fPhmknc=+^E8SJkRSpm=*T@iUyWL#Nd{
zM>#PLbJaQmkcZ-2%a3uip#bk-pmyNm$0WX=lnck-zx$3~`H`R;lp3k=qGv6qi~r`L
zP>tyRMT1&b>sI+;z68Ihk=<)g|Ndv*yyHUTDWTQ!4JDqUZL${`*(bb9b!S_!rwVFi
z`Vq!VDf%NF;ey7*tXf&Hk(F&*6R8H&J4fI1ZVP;>}m!tb3&l&Ajc?@2(^8((HN#ebmBiY*fbNGBfEr8XzOp
zm7qLhK$d*pJ^}D!W53a!m~YCB$TxTAo+;i$uF|Ry2}rY?KOv6?C|Vb)fG90gFu*PC
zUf1kao1*rcYDBetqLYNkOn?Cy-31BF$)wM!|Umvg>yX-^Z&)w4V*qxKV
zj$gPX0Zhcg$b0a9i0ypYh?F&-DPK!lPLVDX%PMBfUaFNlVNj`w{zdClRa=v{f~ll0
zGff9H;~=Y^sW$%`!ORJw`pso_XQ>3vHITIh)5vK5C2mS6(fk}3{D)LFkvig|_F^PQ
zN7-1`BUit%*zW@Ma$!$!?|!t6^K68~K{qL^myG+@`LBY;8njX?hB*VXMUprq`mE*S
zF7QV3rt@KG>B8AGrsKP1G)*BsO@)-Jo-thn3H4e)#Wsf?U>Fvp;Y4~inTYXFXNln=^O5Qen*;MN#I`QD6CjKL-Xm4a
zm^vabW2;#g`$@FwC?L5TuHQDfj<(A221nAZIrQ@%87hb*ki?LG0xd|f=jrHO3
z+y?Q}Cq}0a1^fv_KdOA^6nI`5W+(RjYS(Vk9C^W~^!Mpv{pIn8o9>m+{jPUMsgeKR
z6JO76^2p@L&RbB2DW%lpk(61|U&L(i>3m(GxTA|auAOYFk%W0sRWfvdJys?*L|nZ3
zkkA($CA|Eu60bzN72R(+Ueo8aPsktXXx73fBe8mg2FuS3`xI@yz?e7KRly{c|M~$Z
zo_U(Lgm!@U=R6KPc!Ll>r;Z6Is^cxf`;RZp*yVu#1uo(%0qpWwCY>}SpTyWXf^=I|Gvz>1Bm|z2bqUO9*RZ)10&M|
z1H(xZnfi*BcD)aP18INK8IS{(YlJg0qS??Qmv-1#ElkEDcWLTG{g
zDgtc*yuy=dDC(2g8x6%_d;@#~3E!OFUw*fDS2IZ$C9PaVPe5f*v1n2Oi`;$Ay&Ha4
z^5MCKWczd$7LqwSSmBGg;j0P?IDh6=eNK^IEG6*8GGp*uKw9a*%A)tn%kNYw2Y*JG
zBfo`q9pF>s)4-6@VjQDU&7(cdkQg|ZWyJP&$6A-HaED&vArDY2db%{PZCpG`8UQuX
zMy$c9rqH>ie}=e86SqLd;xZl{kupaI88kO9ptA+Y-IGc%BDh`vWO>9z{dTE4!$l;(
z+U_|LnR%Q=K_$N|@jXZ^Tq!r+2Van`m=vemQ=8E%!ADgTlHpJ3ucjEGG#vwcHs0`1
zaJ+dEwob5}I#6?FwSwVL2h@z6V4?JeW~szk(g+`*;VQ&lTO-tg`x2dcZVt#0nJ^B|
zs3;aJ!K6;I9Dgc*nfXQ5OO}5ynndoak*Dm&hU7yZfcA&a<%OY8RFcMRSpg_f
z-*9&}64L$_i`LAv3_+$)z@$VK1F(fK>9{0ovsI)oZA6rv+99cIPuBFrFOR9sJTc4z
zwt=h;+UPWm2i7Z0f#Ol=f)&sNAMVfGw`F<5#fE*G1)`DK=Jso?CaOSp${&}i#c5O2
z^IUcLAQEZEWfC2gYLlNV1g%c5e{ZJXY?VS7Pk(k*DR*vbc~6+>oPxw<#)g1W!lFM<
z(rJlxkc-O~f`RPPs59K0#`-!|$y>puHDM~?D5B-T&g9~yKkpJOWBpCZGgt_;1<>uG
z!=)?s%hoo$-gjqG88_2U9eSIb-=&>Cz}UYwfZ*kfBj_XFh8USl8&B<=>w^-M;#?o9
zMlsEUbf1=}nInQGNx_QS_BZ6yAx&08A?Ul=F;v97CRcB5ytU#0b!6&=*s$~qNX
z1nH%{ougbdF2N`S*}MLlQyr_Sv?_D2RHmDp;#I{;o!5EuSg?0UQJ`cSX8C48#O+*t
zu7s6d#62jBmWIo2bEojZ?%B
zJxwKzc0h|Iw0M4TZy=-5U_!HASF&Q%0CMI+jz~*Q+A7Q*f|~?Ch%se(L>+6vYH*GL
zXRCp`v($v@hZPFt3zl;Yz8$0r>knt)Sugo}hUhwrsn%|)yIax@4i5D-c%FvUI9`xbp3dLUi}nNU9E=oKY-xnWCYklFfRNs(`7_jsXk8
zvm=GrZ+!-jD(N)cy${&4_keDYo7V~vd~;9R=sk1g);DJ2Cx*?l9|1ERKS7fd7nJH3
z^|$*L3uEqQbigv>D;dQyM~^l7L$#D-hpu7&%WpcJXv$e&czfTh>OBf)rw#9&jE{#NlCIYG%D6ep#ghjC#0HTV);DHump@()*2s-&w8cWizMU
z8~_FDEO)VM@*;N~yihTbpJ~~F=(Q;FYDbQ7URZJqvZZkzc`M8#N>JlZhv;b04@+G8
zD-pRQOG-!9b#lYZv>P$sn^clZRlX{SsTdmN*!@ko6XQ9*A(HDg*;SaA#)_EI)#tEnd6h3h#iSq&a*auTsm8{do`|
z62*1C701zR)fC6IR1|M*fh6;tNu3X=;~RR-RdW|8x#lfz`vGM7K!o-2d8mGTtY=Jr
z&gY-*{WBdjCY_E^y$Mx)k~(HQCJu8xbSU72BYzMpDoXw*`64eKEc#=4f9(V7d97*`
z;nIbQ8-o(OoaeDn{wsp$8mKV&6Ln-fK7!QRaV6lt=}X?7ug^#A3kO&BIOUWnZ=lrWfIHIbh$Nj
zs0@xEMX0z>`1LaE+EQ{$qKcwH^g)wNxbEPkkcMp
zhpvow?g^Kcto)`7+Y#Fs9aC=G5O+vR>bET-BX{kD1o9mwZS~+R5ZY{vkQoqt45{bq
z%x;18LE^s_390#I)?rQP+#A!8C3;SaE;Ry1HslFGihyEkRuFKYW>^4A|#6zLsD?&Y8n-FuAr8<6xBT02WdRY|6WCXrL(pf6Z?Xxzw(O_W6w
z8CSyu7vKxOnwIr9(>u~`WwaOHH*BRpfIUYnf>J{@lDocsp_*}V?BKMZL9bzKrJZ#`
z+W6}BLhIO;u2`pB#|4pTYWMw=xv-sEZjL5L9aQ@?7+2Ww<3|Kf-*v_&-lP#eJV#uu
z=5%5JZx()Vv0pF?vc;v-T%f%qRnVNtifd}Brfn=+-$9zC#i;NCx|*4{p2U!oQab#A
za!(Cl*}`x%EB@IW=PQKY)VHo_XMJd;)i;I}Xv6w88P+%Fq?^qX%sg_a)9D1d{U69J6-UUp%N-Y<7o)<@2({>dI6vLHSX79^(i*G__L{{}gCTAxA728q)!Acda;LdHo5+t+0
zFvUI-EqBB*Tq(2QUJQc)i^G4%B82-e`Bk-yP{Ua%NysHj)4Hw8J(ewr2E7nOiF73E
zirf4A821JaaWpmvJGD9pH>LE4{DsH^_P*z|6`ktlO$!y|sEazbn^3X)84>^dcTc7X
zIL-^>hdueho{{q=3^93=*qG9YgXD=Jf7TPDx84j2n7u^%LpDNxhHt@Ow6ugpKfQ*)
z0WegXw16*9Y+5LWL9Y24p?~CGU7SN#6874CUq3cB_6WV;)r{MBtWygeq_+A-7WiwR
z@be!z;p-dEb>;*x!ENN^tuAat1l7e@1$Kv_t2ij>Q4i^?x`
zRkJctZUJlc@ZbcH-#1%0*4EI^c`dD7I+ZU(vM3AqF(D>S-C
zcnOM?C6h8NUd4&at_2zRLwHo}Tmn{<>h&(7<4l#(aIWyp@elTDP~CXO*((pj0)7R5
z85FK%nbR#zHeuL&&CY%iJ8jrP&DKs%-$sBnfAusDB{!lVl%wn(&w34#gRA6U|3{n0
zclOB(wiW+h!we6D(T;ElsTdb|x!t9OQX^t3)xnt5!kwCSD49GGrUaa8D(J0rmi51F
z{+{P|P}H(YuE`?lfEKeKODqalJnWMdEhB!`}a$C?HlyUTH5X82S)-NesYYQ
z%b3;AH}CAraTgykm2XZ3_)#Y~6WH)EZ9YFGvW*(LYyq|c4ST1fEPHEdi
zBc9}R{uzlT^Sx8pfW}$Pn%#lLu(ru~N?O%zZIl>y6nBt75{QNSh=GrVc0coONGpXa
z&%f-v&fXJRIDEP^ej{#k&eJN?@S{@Z7O!-2g2x1J`>0gWVj0}<=;=l6!0~a*INi#Dw
zr27At@2_f%&_Ct-k;o)=`~REG|Nrv6+&}r=V_#B@bhuxM%(33xv*YFRC6C!A!QLm6jUil)bW&}
zn#{NgP^tR}I{h9gF~9qcel3~jIUW2r68YZ!r3w@a^i~jE6!!th9txJti01g)(tETS
zuElcijsJ1Yd0oDQ@Tb{S9i;dtNK3+Q2q7b-e#{L6uJER@<}k%D9V*y*sxP{fX5_5r
z6jd+KZ%+lI_Lh}bO@;pJs?S7QXeeu%qM;aa;#2R0Xh^S9`=Y5wxN#ArW;-34+&u2heh^%!Tcgp_v|UG3`S`xmcUB>C
ztBtnaLQ;+rTcQYJG%;l@n
zsc4yQ8U_y}Ek-AoDfy^u>o@eZ>tYB~E{}3>vhLixxCcz&DD
zuF6GoY?f<32p`+czkkoUgo}0dAAeB0CWG(i8^Ll)`!bJG%|Tdj%Ge{Qls{JU;&NNk
z7UXN7%|qt{GDJ$teW5-2LhwB0sE~il&6ky(lXDRyoD<_4w4U0@JZN8TIo-E>7tm0L
zc2w~#;Hg=Wx=VS<*6NS!xvVrq#9ee=6%?&Y-J;%@?cnI=Uywbr6O7{v*>rT15JP
zTR)#FI*k=1Hh)iICHeRgJ*E=6@A!DCF_S&X%-kTUYyzwd2TP>?Q^IFNz7Ab6_Iq)z
zA*xOr-|f4nP~v0A6QY!m0aWC^gq!_GK`=_O#h))yR8;y*iO5o=(iAxR!QWNVFGshJuY@@nJmN0oU1aAtI!EU+KujsYa@2gv9`!?M7^s
zQWe)UR-d_hPG&T6gsJmX+YZ&gjrM!y!Yc7AL!4JIW8~|T*VY#g6Y0wDAOM*HM-WaI
z3sF3#w58gQ_QZCKh41pzZMP{4&)z(e;wro5>7TlkXuc!8s
zrY>Af4+URUkm_r1O5lKQG`*D?sMXlBO7_#7b`XFb7`>?>OM_c&1K7QQI$tGZj|ChUc@!
zC3Q2QFB4=1$iHXMe8-5H04aM3Hy0$suY(+&=Zy6Sz*{8;hS|LKJ+B<4SQ|0mQ0;6zQOzpQ40>
znv^v+{xB{w^2>_x)W1aY1b@Wk#c6dqSDsRCiKaBHVyP7p{*}qQb9%1&^ynf(K6)m10P^gGN5Y+c8XZTiEQ%^KkORz5
z<=F$Jq-8GzKh<`${I){wc==DYy~=I4WQ3t_tF&l_IK|PTTDoTSb(f+=7ufiQ`6v#Pb6ZD&9%MX6qZ7rSIHhc83U!NSncy%vNGfJ*G&`j4stj^0bx>
zgi}iv1Rn5UG_RC_GIiK~OAhcfB+l8!{sJ~kVoG5?DUst@b7BoFL7s_}YW)3mY-f
z+5r_pZP|dMu4bkdXD1qCn;Xj`CzGm-$Au><&TeB;iJ}HJ^=sA?IuNg{d_)L=jGE4-
zE}uvEt*&GhWH)q>Xme8~QpD*31gQ6rN^_RZ28fB%CqV3>|0Ir<4V1v8w?iLTs-*S5
z6SkAEp${=`2NaRR>1c+#JoYT0)yHy-REI^vmo^OulW$*Ka$)mX`64|-GnOAXuSprH
z0pTMKWtY^=qDICwx%zk1Z%=nAWu1IhDT|!{?wT^lPd?#%gLA?L_mgaj1lF4*&a332
z-mfY4=^5q}(zLnabBn1>kW3sOW!_14#EDqii$28~F%V($09|?M%ne*m6U3|Xzsv{)
zl98}RrG=V7l7o1(XUu0Ngu8Ke3|#$Hchx*IR%w6jY;k^;`A#uv#xK3RJ2P0u?uadW
zvXm=cFo4ryK_6}0!IZX1+8R}L5c-7%y*99-mg$H{=l4oZ(V0NZ^j=?VNP&^kTE*`t
zO3Ocylo}D3Az(*t*OY*pt%Ue1^|C5}<}fdH{
z9aAK|PnL$+Vm8WK%l>@e8Mk!n^+XQckOqzxR}kyPthxpw7#E^y$nY!gP20`&+?9EA
z{SwDaSNNN|be|9HWY_sU<7Qw==YTccSETF~4|Ou^D^mmHP5&{QIRBohA+D8jO+j4G
z%9NllPoU-^|E7=&c-9rU?0k!hQR8tBW(&&x4^ECM|LM4_(ap|Np*1@EPkj+{L(p90
z?I#|+7G2j%$J?5{1Z4N$^^jkPl)t9lwog1&f-f
z)H;D>t>mo&o``%-1~LM;ukceDRi>p1QFX)PjM}Z!`pjMH5x0X4g39moT!OZkSFH!u
zp#=LDQm}2ntcw@?7v2-^sQEI#03JX^A
z!ADjyZ$LGV`)hI1sUukPHw(zqe{WWMJ4nfYAouxHs=bxw4oAo-0Mxn%fu7V_ZCZjm
zBm?LpSIWkPVZTZXTPYH!9NX&3?=plH9CWD+VtrD<7e5~&ih+J_9O5P?Db+FL<&{JI
z$yuG)9GlmD0jl{etCU1jR;(18sMUKr=S^B9OKl123k)(Mo**rj4SHH9kyQS{!{KxS
zee&mPqUk4Av4X8YETa!+hqVZQU;$G0!xQqg5W`b9;3UPp_aQU;nc?y3efpu2
zu@s!xM+n0iTtc(8;=Ds6CS7i<61|@o%qmkv?2`nMXxj&YqK*1(&XRm0861VRLP4Co
z5Bgy*FxSH3`!TkbCbTyeK}Wmj-tLyMRu@1_9-aa=v`98I{~;~&RS&yD!>Qa%^cZC2
zkfCjD7RdIUB}02^pN>`oN59w6O`Y{m!f#uaRX8KKmXQ3>gju>e)mBbd)i{sFLE`K+prJ_<6_4{&U5s9MdohCydmCzx3Ku%&Bl{1~kJkN1Mpx$c(Kp
zCR)a7Sh6Of@#mW+9l2GgnFY>NJ_mG5F)uDH<`(+gPwcbL@j{ja*!$h^Eufc#gsHsDy&M;;u`#DY~mKb58Xf=b*6@n=0Z?e~4
z>;3gOxz;>|%^n&PIDXj&RzILK5)leU!cnYMj{%926B9VGPd+A4fAH{9K?K_5XSL&M
zp;|fZtlf+Z|CviVlYpZcBnJ0ooo>=MhYTU0r&-X~*(PRjSg`?IUJQ%HAC8VYl_5h9#|zQ+f8S{A>__rq
z%bO<#)OXICvSOOeXZaf@AB?3xT0)t}c{CqR23CKk0+D&g<7&KBLpqnNj>x}vwt~mZ
z>?j8^+JAM#tCw9P4zyQ1$_>>c%u|aSqY9Qt1Nw(M{j?%wPIkUnWvm6kSokRq>rQx@
z=A%Gv{}ED`Jv8v!c`{L3E5Bbd_%*@Xs(KF@#=bps?$})y+`z)Vh}qzxD4eqCkmj#6
zJ>|B4!BHQG6C2&q$MlG9X`=US?1JG*i$k-{FE@*O1%>T&h(1zSk5|%My03Nkl!mw1
zJzb|&H
z@@OQ+_{SqS<5#91@?O~h1Q=Zg%Gv;zMnKBWPERqwZp0{-^IIuLS2tS=g`;^%pJa8D
zQKNd_BBNxfDOU{*(I>HQH?)|t7EsTVbgFhzi*jZh@Y;~fSL6UfRP}E0K%D$tl~<_Y
z!xiT1LKjFe>E*BK60n?oI`MIJpu#tB^AX{?HE{BqRu#H&enslW{il&9K*vEj2=?o`
z9KnY!U$-CbY2!v3WghQ%ur19#^bn=jN>9TveicW(EO&Ir?Em(au8cfTHGUrucZ&Y
zqc8@KA?3=3OPl<}lFwR}CDcply2_x?L@!N%PLU2W`8{rZGJ20Et9P}s3`Lu)3?;i$
z^a`ftuw`vP8*7a{ibP#g?Wdc*Osh>bxM-^ht03=Vd4&l|5G0wfJC84KS7DXYZ`WaB
zG{^xxxcq&HDv!b&_#>E<`=C%?b(fQ(K=2Xu#q4qV^qtVja~y;aBI2VdXQ}~U?|?*k
z(7m(#3X7!Wx8UR9$t6ZxWHb_Sco+a*s{EwtoA!nq>>CiE936MeRp8{7rhIiyl5@XlkZM^HOPg{27&Xx97rp%JsOShmW;XVjng80A!$I6%il}x*gKl?
z$amGw@R%O@l-C|Yuo9cjR^jqMV@2Ly3;t|<@mcz^N_J5jK5j1lteh+_fT}9?mhs6S
zZ}>Ch%hJLN^5*e-FgZ5#*-7ihCw*AEkypTIFNGY+2=MX!{P0CASdeg9j{{}i8D+CB
z|89?*bT?KQUs>i)@^=s?GLim#SmMp}G}JI79sx~iW?}1nY9<-);y0BE=|Owd>Qad!8xvMl%+4w$5_w6)Z@cw5ZlJ?#sB;FD~wm2)~
zYZ|SSL*NKAjmyeu#fwJ4uo3khVOfczI(kAOFPIB_7BVqwi+Q)hoVe@
zktl|lz#6C@KR}oq(A=Z&Ki^YQJZTeBr4weY
z*o0x|t2Ex+2zy-Y-U#7eur%Msw{7u)*0Kd(A~NnQE!4ipRI%A7EMRe5>3FW3k3`k8
zFL@vGB7h*|nSZdb{8&g)12aqbMx2bkzY#@YMOs9%B+RLgLi0@tWsl<(^#>cJaC&+H
z_kjO8YX=AzsvmOEkD3J;Mq8&BecQ(;s2LQ~f~$qg^jfk~
zKEYPmND`ovW}r)y7Ik!wSf31LDObW7*)*$WNi!M@87rw;$nF(OsKX;HZtzD;
zJJ}!atVz8^qFcSK*zkPm2&%vLV7&L)>AH`|YX>w+B3k;wJlSNt@0bMVG^H}>#!N5Q
z4(+zL*+VIYvfpV{3i-Zen)P|jMuBxMN`{WGf}kJqmC*Y%{|E4}yr3z?_ErOQ_f%5bVuXHcv^?;wc&)b(KRcgm=KjIcFn<=ub=ac3)%&3eozmbiS8Y?GG)2oZ06QTZOJvc_ux@gv7
z{xM4s?ll?Q8qF39NK*>(LYX$n_SQLILns2}?}GOrik6{3s?r{7w{({BXB8W?H#O$i
z(MQa0o~%*rm#%_^Wf9f8bC~g5Gubt|+01Y0>8sXmy#R5KhCw=5^+wrf5*bZUcme&+?d5RVNi$le-qyC9xwQ~86ak*?Oc)Cize$@Qr495(?;
z4L;B}t*vNeq+#~X{ai}+`p$4U8GEpFu~oAK$g9@%H_WV8tieqw-Hws%F3nCM$X#)j
z$)-7PKn``U=cTv23f2q%t8B@ltps>u+XdQD+uB@xNdH`sh-rkbV3P-hf
z4`&nm^vgf|7g;np_lCsG@#GpcA(BQq=hE)2{yiK
zIp02PIcKYCz4H%PkMW9!ZZI&=e|u{G=t|Qy#Mr-%zsbm+w*lwGSD5c7kp_9s&9UKi
z+O+hn5-G|DL|BZvErjg4&7`z7&b8{vG_6w@&~BkBU&GQk|gr0HNdAKVhM+h&Izd
zZpPzUT^vEFG_4ac<2@6}-#^};mqCC&hKvIl$!t%%fBSr+enxVO>*H>Xr(_Yv{5`6y6bj{6>
zmd&)9?RK3y=@JwqOm$B(l6N$oB=S|U3Agjd4UwXF^#RNUMkif?P&;Y2(r8*)_Erfk
z6v59#{%8p00+k-2RbfA2KmIbAYBOh}hsM_?elEapOa4H+5P-{ooP+n)WmrHZptFm0
z(nb4O!wnUtkj{Gp&rYCubG|go0O9;Igl=nR`Cmhg_YsPqAmJ8o{Jd-^F(|I5c
z#e@^48NY&vfs&;QJ?jxljeMnrI`Y)zcvF3%|qn(
zw}Ua63TQ@RdMi{CMaa{-!bh#AO0My;LNl@=#5@l>5IG5X
ziJD7ANPd~CQ9vB=zGK9T&PAn?x3UluX#Y{CLBO#(#EE9+GD^$t#5#^qi!OATOtQ4)3U3KGj{BBCL1m&51
zawHh&Pz!W@T2tS)Ev!t7S?>4~9j_##4YGk6yO?(kBUok8HrScjlRcoB+gip5-5E*9
zA9fimheV~7lK4+{Rt)QPa8BG*TCKo2Bk$=`D3zl@-eYL*O*Nr*6z9dj->E8xRwlUL
z1oJvjOTJF+Ee;E?F;!U))~^L$QZ6)}&OY%8R3IDJ!ZNo9|G8iaO=3LWVh{VY>DPAA
z?>i3Qb|=Wqty#?F;A3M$X**U^)iL7Z*l7M*wpD-4%_^a3!^80xt{4~(oJN1NEzBBF
z#>jY0H>**pb&Kj@6Wh~fTpI+6;Gq#g(bim!5n8{y=X@-RYyEii3*;)28KHhif9KfL
zwR3ggO(RGu;qu0@C&@o@T1M=KreLkqxRUwxoaFQP=W;n;q*Ar8dy)CP)oI!h-<@gb
zimklUQswjK1gl-9E(x`s?9XsAy%__wlweo+#p*<|sP-9yS}QNF?H*JB&-%=YH0c~o
zmueGZr-&46fTN?puGyDQi1=r#R(nJB6P)zfs{O&n#&vDPx4#|hGIXNgJC8-kJ3QIx
z#v5%?V~S9}FUv~K_O{oaC=}is9Dlf~V)Tdk=F;Y=ndn`+0G|=SK+J!?I|~Yrr#4?E
z-%&ebV*-fbJh|r6PxM>7j;zFsO!mSxeYfC?a%Ox
z{Xiy*7|o#6rarFG@
zZ;?mW`AwM^&x!SHTsnCemLpF9WsJvvY^Fuf|7k
zMn<%HMy<%+oS>rm`;KogVysWfO*7ccY*(@#|Bch=c8=iB?(pRqGd3oG8zY67!juoe
zni?hM0&KCBQsVnM-zC&3UlQTR&(FV%ZuTKRCz&PNilct*1Qd%f)9x{SYouZSLQk%w
zwJID?9z>cjX{AZnR}5k|h+v1U5|&RV7BUt{kpCHoOS)*K)NoU{l%b43Q!YEPp@6tC
z*XV9ig?7$DKN>w*=c%G+_6sqN5@m-w9Urh)3)A~02!_C=6vZ09-Ujqo$qagy14_0=X+sRk5z(P!{lu3vFMm(76o
zs(-`1YlmI3y2iMesZ>Y4oZRp$js9Q^`i@;UmJ?cUO_o6KYS}{)&{PuWj;W!76|(g4
ziKr5JHxh|T>}QZ;VW)-^F42q
z)vXYz^zFPq#>r;J5ubLiX$fMhwB68e>sDK(KsDyky(bOdJTVE{X9SL-sTx(Zc{eR^
zt<`PkdNmbhK6;#P9O$2JTNO74c*uK7TbD9L%>xZ(E&;DN|W_J
z@_#N}nQ~=Dzelbf77nB)N)pnTecn_tL(<18#dSeSZ#v_WF$;E61P-dM6SxR&(rZ3Q
z#j6`UVLaKbt@|J_T+gMt3?u@2N+Uzrcd`zYvL&Bb(C?bv_U~Kq6B6Z|XOccL2xa80
zKnO}%`~kVG6BUO#ZrVk>fYPzrSQ^O;tn5394a%MjN4MF?g3?*#_5;=c6tDhY--j|d
z#Vt0v_F>~@AP7A1;*W$t)?CDnwI-4&J=OCOYN@tH+T^je@qXHeM&-l_w2fJ@iDvA^
z**FkT)`rR^l8xv-W>u9`6;X1!W;^6wPbA!k1Rw8{r{#)-#b7=317lAVLyTNmM`*oKG!^c;ck6cgqo9^n4DIzd(>y-U7T*`CBl)FJ$iq;`Znf&6E`QAXp#avtCq0p@y5tR!1P~gs-xLOg
zBuhDf%}K;O)PcQVL9UdCrU>%;u!S@O0{6rga8hbLM1RSEzA#MrSSN(>Z_X0C)=rJB
zK2T-?{;q_U&ShHi(#z}h-OSB}pZ_70o%@`1E)(*|@q>o-4yDNRLCU)o?o~N$R-n;N
zXs}A+IM~Y?1=}9|dsYPj8Hjn66`Zq>O8)pjC3)yzqW1JzWeouF3&eA<#9Z3Yc`<*&p=Q$kKbBmATvWYrQt6OerMv_EJ}K_&Q&
zTJEg_Xq_iRi5V)jiX?&gmu3$Y&wE7+<@X`dUC>!g@GUeSCmjtLEW}^11g6%vq<(?c
zQCN)L#97W_PILZ?ol&>lR_i+ikL8)Q>jm;gvqkgxI2yIXxqkQwQhPNX7n>p6lM>hP
z`(>$17K=YNj*fOwI3NgkxFFq+->aIsqy);kFhFqE_QHVNzs%i@*)N6f?MQEETL@dW
zmg|c0w1^YluEdB|GkUY9?DX9Hyrf4*6|FOFM|FX~4cfxIO2S))#i@26?a~
z3Jdjf4ttE@J^nx7=}jtVl0P4U$J3=Ih^K=UYvI3XQTg?eP=XE&d_8I)#=j=n^p&PR
zvKXTpveE0T{Xhw7AuCvW*ae5%G_}zwBA%SOEx_A7&}`G5
z%0-D~HUv=vLlLWVAo^V|G-?=FX%GI!b$jK4^tT3WPaVvGQHYTX4Z5&*^tTZ=H=p-M
z3phk8+~!hXe<+iMt^2N_HokVdb
zdufeG^P-)dY*@(JK1U%o>947(jV0A>yXE+L6_bB58^(4#>FitqVCyq8F?hU0O-=BkW?
z#l)cwk70jNhH+8^k&V+3&iGB?`%oMxN%{7vV|>8TLN}f
zsS`FBLdLu`oIID~m4zgN+gb5^FUKg(&v{C>k*
zuW{($x&{(j`}Lov++s(%-bXeXP&&yoFHs&lkt3J~uEUv&!`sA}r|!A3`%fj{su0wr
zhBN{9mMx6{|LGYLB+~&@P|AqFavbFUL`smh{ePyp_uT(ZbH3-#sL0l`w1Vhc6X9jnh_+G;dt~r?cvcC~1tEr4u`U``H-=+}&E$FAg%0vL`ccnf{}J6;tly~ydTj8&?Vr;k0NIK5u`hf;FHOJSa(NiOwA4??(EYdC{fSo8TS<8}@{%Nt?e~#l
z8x1q!Xb)UPT$BDHC)IqIf~#QYdwVcG0r=uu+~laWE?WD1j3s&+jZIIsFr~q=ta|b<
z&WG6QM$zA=WlK2)UrSwSaV0*l1q&v^HT>>~)i1JL3iU_(nt8htuf?Vrq=3mHp+-N#
zaX_y#Ne}>*6bc6%DjWm0s3^77!N-H!N=Ak6L1TRp
zY>K?LvUZ`;=1f1-`Kpxy%&~;I@AVh%e(Q`s6o7uZ6?1Qmc{XTSo7Y8(v#Fzbb@}#t
ztlYLmt-G_b2A2*7d#uG((Ubd03dn=}H9KV7#@rKZQSI?7=%N=_XO`&&oMpm^ei-gm
zGJ#TDHV^CIn4g
zMmqDe1f^Oz%WP)o68nR!cXx;BFKS9%%=AkE1Lpgd$uQ@K%5r^(9!Q6LSe~C0F-XQL
zr+(x9S*Yt*5azbw=cF#DU54#otUt7vORU+BoeSJ>+2;qlfsEG8T^-SwNwqAe)L7~n
z`!0T}!pe4pShv(W&ol7XpKh}!wre~kDETWnkCy^PbHhJN8gb)o=HOL5!lOdzTy{`lw
zca!yaJ3AF)&X(SAt&QPpBT1^Kd%}?ljzC$9$)JTqg2aevsfzi6)#r_FE>9@0H?O16
zX3fP%Q^d=C??^cNKBJK(QM9da6bq5dJeazW@&}zu>Bnpbsu;t6dFOMjel@2YtQJ
zLR>y5!Ey6`Cw{!CTNY9Kv9NSIere_-MC^2j&e;z*fO2PkvR?B+=>K|wq8G@**sZoXs~D>
z?yi+nEKp#Y(Qh!%Ed-)uV|MQzrg~Zi-{=w+;v8A~qF%KErIUH&XIxVu&QeKlGYRkH
zN0NwxyAVa6sJGUPxL7;qOV0RdIDq=X)Nf;{dZ75BMxx;}SZyO%N@3>YDQh~m%y0jL6oZe}-=i#SD3D+l4
z^yc>?ErW}yyzK6Oya8?d|L_LhFAaNXtd_wOlDSH=&Y*SMO|avU#O5#Llp%hJ%ZXd5
zkbO#chi{JrG_wizqp^0DpQRkZf!Kj|-^)u9Z_m*Yc9c5UTN!EW92K0?m+Z3ao(6fv
zmEN*^`IqFE$5yNu>fze}?A_x<+k3v<*aF~>Vn!sFf>Tf&j!$k2;!g`^8<{!=1%gms->TpS3GHS*m
za=k*m$aLz5Mo}Tus!=sEN|Om_Tsanz7OrRs@CqD_)4sxNWnhOi(q@A=WLkPD060pO
zjVRW@2;1YpJ^@5lVC?9aS+*{}Z&Sl1e9#fKs&P$(GIV};AR=zcQ$aq
zPmY&y!8f4&(XX`{v0A{+L$$&{6UXQ~o9FF}CCS~9ar#Sn95!Cp81b0N(74~*5`^xB
zZA%`(NKOTVyWuHiOhA({G`gX=Gpd7saOz@=08`s1PRmZBI}D0JJ^6oBz2jS^@B4}%HHb;8Ya;*bZ%ey#KV`QZvYz}O8FQu8jQYM;eUhk
zqqIHcCV4^GDFL%)MT{h<4*0l2)u>d1nPQ;-{ZM=tNOQ#NX#;Du{;~A4Y!bsp8a;G5dw85W6{Lv_xnWjg*>$4LUfdd7f8h@PGcABQEFU9Mi}x;`--ViRtLkc~pnPHQyUWPmkg)T$
z4Klms&}x-JpmBl!`ekiSMw2#^RWcSWm_Rs3fGmf_XFq(5igsu6d|+0wj7Q9HGa80Q
zbsob7aXYw1#(Qo@9tx7F`ohuzUDle)#yC0^Jkc0-RS(_rdd-w=VhgHRf9A$WQ7nt~
zq;*I;rePN5oS2Vi_i;!+@4l_Zqu9mZa>kRl3Ly&boG!^zD8Yoj=Z7Tr#R_{>dKY~v
zP&MIqyqk0WWZ8U5-n5IiwX*il2Dw(+haN%&l){q$CN+4_k?Nnr=iAv@L@6UhQ<+2H
z@|m-&u}$#;x^dsyh-JYxiRJz&R-NzX4uSzAqGa;mZaFX~z{?}>c6
z-?!Y06;ku{9wQ5A0!L(C;?-Xjy#0~q9CFt{BW^EW=AEM}qh>)V@QeJ;G)BHJOum@~
zbGfb!9`P|^u%bn(v`}tyWOEQOed}vcajWn@u3qc%iwr>dyeKlj1qtmjShsM0Z4fO<;HrpMxy
zVz4TYYqMT0-g1nqh#tkMCP-BE28h=?O);F?lMPbi&W>8=;h>5O0IjQxX|aiJl;GUjI`&Nq(~E7QtSa0>&8SSrFv-4
z>(Z9Z0?JM;C!M<6TEFn2(`lu`!>oI?_DrGqv<5VhGj7X~dhZ+V?G?57m+5m7%LDDj
zGRw0iJA9%LIWjmxf%Vz;&W%`y$4DwU1w5REl9Ej_zVEXT@sZ-8ImFSEuG#r{rEz}7
z(>1alfq`sPHCQC*Dg{S@Og;V0+N>t0Z7)=PJql@Iq_&|f51L>LlK(Nr_YY}is(MQN
zDcnxf0*RPsh>1+5_2en%(dYa`*W9o4whh&g^RGLCFlg0*wt7C
zGMQ^faeoALSn-G^9wJOQCL!T=l<;}SdPW#+Bm!#&(YDGHI4&%xDPENFw#^v3AA|Z3
z&B0zfta#FXM~WCKro>WlqW0~QZa?nNKp79^D_kU+80rj1BmQBazoUf>AKpk=tVi3c
z(9yy!m%$h4$uLh}p^^-s|At;Bm+y8twF++#(wq#g1xC(6IUUj|U`8n)vaTrqRfGwElAb>-OwAX+4cXAWjWCkHUERg(88Bg5D$En&
zgsPCvp7qd8PpD&mEHbrVpuhgi
z=GPctG3VH);4!^>(PpOy*2dBgkpES&7UfKRO01(+`DkG+#!rXcWC|IC9-Jh`J)J(N
ztJp7Quzn7kuqz11n!}iM{4qJTy462uVU*kF*Nh_@
z+ByTEIHtnMv}uuS*+Geiy_)J@h2j;V!)0Q2=1XBqXgq5@(ZF>HGbAmlnj*v|uX$m1Q2$L&n!Qm~>b=r=r#M_#4H=MG^rg~7XzTf=Ih5d27u}n`pRa%P^lS+I+DwMXfszGQ-N#|`#YY!8?Nzy3pKa%!
zSR|rO43_Oa&s)#?N>r5YJ}813)kk=-HqKXbxAI(R+|NDfR@1S5lz6AdQ%_YQ&RzxL
zz@X|*Dn~BiD6_1b_?BH@M&2SZ`$a1NzcUdLr0gd|k2XeqW37LaUZO!IgcwdOPFqUq
zO@?9^;<*DsQ8yj-lK&q3xhtb7d
z{xU_zLRD%s){O}%RsHS#t$uIc?0Od;o!yj7hdYr2pOyx_$)~k=Nk7Y3yEt2wnx=R8
zaBea)oUz8|<12~qpEvgZszEwlHLBrSC4Gl#fx73Vdm7=0ye0!BHd{t9!>JifGT8*}
zcxju0=SxEATJqJ}gdvtRkaQ6;os3k@UuHzZIFvz`$BE%NB3J(&EuLfVq=rfs7NgB-
zawt`{Q1buVI5oQlI{WjEXa!~m8~()zwfAXv=eq7FAa-`tIEsuH?Ri>}ij=zVzBMuf
z;%(*-_vd7|$Jy{5u8MPh+i4bepeB?5l1{zi!dFudVrRGvBT^52nAtST*=>
z=fA8mdOaD(L|VvfULgwQKU4lnGJ%(3z!^hP|6(k-{!^$)ag-66cqpL&q8%s)wTyw;
zqRVUvbX~4#FYl>O`-#4Lm!>)z>%Ij3{nZQ1x><99%pNsVi`=;5W?dOLeCw%~W$Z4)
zHdN-xt|!tL5Qbzp-B5QoYARV{<6R_)fBRGKf>MxN(bP1Fn%I^{v##$O~1jBPRS(ux4Sd>*kZ}UX&NaVbBrPUen$gj(r7aF
z!_iqyZBwzrynna;DNJ@c?|JUNv1c}rm?pGsLUn}EuFoC0A3j1m+I|FCzA(
z;P}Y7Cd=~(SMjja$MUbkRoSow+Pec4NGKdIn$^CtBe3g|m<3q5!
zId3s;qN&zm{zpy%mk=trrtJl9xOa>NyVt0Ysy!;!N#2oQpK7Jl9EniEV)bYA!ct1!
zMrGNfRoNNyw52j?8FE569T`WCT#j<|W=2H?3+|G8gvG)-GNfLafNK(1Gm9dW*&wWs
ze!q4k*T@>~$AtTqlX{mJrr;=ISk8emGh=htm%}OKl@sa?XrtZi#{$eUP%Wna3}<=1;>@=A4acrV@z9
zA3EPA)vc{Xu)5QlfZf*j?X>GhvY8}x+0#@S)u`kKTs%Ah23Tnsf7i5RgSkp=;^?I+jtRU99r-$O>B=^Qv1VGevt{}FIj;6*zAk6~8`58|%oFKSzM98o
z##qYf9um?CrU*0D6%M^e~-aK-yaF7~+c@U7a4ho>@FH
ztznb@4;__F+o|RS4Ok9Y`dwr0rQ6u58F<>N*aRoyY+b=A-{?|yl@mr=j8B_dSXr?=
zucFupMI;vI{HqgK>=vfl^k6tK8^-`1fV
z$3_|0#9}4~ujpH6HZK!H)7g%9|&W#%!xwHUEp8&6w5rVP|xw;B^d?#^H2%;Hq5FgWHmLN+eW>3@Fdy
zWpd8dOBVOMqI_Mobow3-Z6l7(4DqUnW&@D7)W~~Utkmq2npSwdeo}wPI4zY6u*YR8
z=$I58b9=%Ev>|^sh+_$TUANNPJkH&kH&A)~na7(gJ}8_h%k6l)O0Gd@g~`mHXGI
z3s+#l=5jRC<>uYBY4YOy!SmhCsZYoM1NnbAfUUx=ILep#$EcwwOR(1gEgq!BprQ0a
zghExV@Fcl0oZ|tdO0&wl%~~?&`EvapA9e|9>>$wjkD?^OWF70|7~k&t-D`lt&sk0H
ztd@AuFizI0A#>3YrwoJ3;)@sh2YwPj^)V`ODc}zngXNeh_(45r9TsyB6-hXk3~EuB
zNPrU`QS?hf!pE}79zyWa>vm_t@}PdVjG{F35AzxYoH6dOZt*=lZUsd9RcfO^MwQy%
zk9KB(7hU1eZEDjs^EA>B9i(svUqWrvnCeH3?`6OlBpueCh7$VG(|dVIfpY7~Wf!@GsU5dY`=y
zO45{cHaxPzi>~W2KX^7QEVTiokx*s@_2bixPx94nQ>A)tZf>@Sj|dOB9dDUNRgEq;
z9wef=qk1wC&c(ZRP{guCau1$eS9IjqViDdo`|5w91%w4n!5246WG*fbA}vWWr|p76
zrA2Q++LHRUiYWQkYaQRYK;9Wq6+<&F*gDXMrAs|^+G)4J6$4o!5$u6^7QQGfk^{#I
zb6^iiR>Zp9cjHW(n=}?gl(OW-%U>8&5v44EQ-S+_U=!7`V#+4)vO$KBjPa{i
z$W$&lqgd7VVIflVZvZe`NcgK{OuiVJH`}==Bp|YvFip4+joW3NLd~%C=-FY9vT&;<
z5WP`-F8RWL0G^X9u`QCJ@#0EOrRQXK0K8%@rbWbYCl=)IB1n=d!l%?Wmfm2=Rql>U
zvZjh)w6pVX7B;#*Cj!pc_J$db2JR*;`j*y|n^I5Rm>R}EIlqBaxw!r|2zO~M7+R;F
zjA6Q(B3KuTDbq_ELUB36#xK&!T)-N&%OPI%
zU+5wpw~h-xc`L2|VOrbF=gM{`BmXr0c?x^WCB$ooS_q0=GE@0!aR#5PsDq`Go-vJy
zd0~2Bwy|MVs{0N=XzMCdP6UYD{c2O+V=`-@DKdpLT^8+s{`WnWRBOu`{HEkq~aos2Vk-@cAIi)2Kb3QofMy2|r=F)I})
zDv|22D8&A;s0UA+1AW4<7T0h6X9BV$O9;=pAmXg1TCj1Tp0R2aTjnRCHqNH+5PLOB
z#-gPzsVXm|ojhO7qe_eVvZJK8fT6Pnj5_4v36sB!ZI!6&Uq>rFosl5_mfgef3N_43z854TKF4_N+{IPsJ+U
z>k1P jb9VtO@vJK)7tT$~V`do{e)o8)p@HJ=Fs}Rk&H30z6J4
zTTSTHmr6S|ksx*W?_sA<0aINjx35?zfgX>!%bP
zFigKuVaY-C@*ZvWJrKbwHl8<&F4FEqG!fhR#_;B19Qo;y!$YC&mGryX)S0?ZGOaL!Ez`}z>%8CBSnJeFm9ry=yti#
zCujL+xN(1FjbItQpWnMC>o*_MP{`vB@p|2D9q^im__9^(!@H&zcy}%^F?(6BXs8~O
zK|FapN`L>4o=N=(?dqp(&N+u&`i-L4`c;kz*T@Hqx>pkE;Wt!S10A98r|<_L%58w7BL~(CslN&!Rd01KlRR(<8gnR49<9
zDX}jANFM(k_Twkb9L^u>q0XPA7cnI-&GfB(9}|TPTpYGHYxm18AD8Fj>fZTJzs{6C
zzal-fw?k@{Aw%S}s-O`6fcUIT*UHT