From 9f8b04ce777caeaa2864ccd70e31fa32801eca07 Mon Sep 17 00:00:00 2001 From: vinibrsl Date: Mon, 24 Jul 2023 09:33:21 +0000 Subject: [PATCH] deploy: 79274480aa9b11070b83f2e84a2d270e30340fb7 --- .build | 4 +- 404.html | 2 +- Mix.Tasks.AnalyzePlans.html | 2 +- Mix.Tasks.CleanClickhouse.html | 2 +- Mix.Tasks.CreateFreeSubscription.html | 2 +- Mix.Tasks.DownloadCountryDatabase.html | 2 +- Mix.Tasks.GenerateReferrerFavicons.html | 2 +- Mix.Tasks.PullSandboxSubscription.html | 2 +- Mix.Tasks.SendPageview.html | 2 +- ObanErrorReporter.html | 2 +- Plausible.AsyncInsertRepo.html | 18 +- Plausible.Auth.ApiKey.html | 2 +- Plausible.Auth.ApiKeyAdmin.html | 2 +- Plausible.Auth.GracePeriod.html | 2 +- Plausible.Auth.Invitation.html | 2 +- Plausible.Auth.Password.html | 2 +- Plausible.Auth.Token.html | 2 +- Plausible.Auth.User.html | 2 +- Plausible.Auth.UserAdmin.html | 2 +- Plausible.Auth.html | 2 +- Plausible.Billing.EnterprisePlan.html | 2 +- Plausible.Billing.EnterprisePlanAdmin.html | 2 +- Plausible.Billing.PaddleApi.html | 2 +- Plausible.Billing.Plans.html | 2 +- Plausible.Billing.SiteLocker.html | 2 +- Plausible.Billing.html | 2 +- Plausible.ChangesetHelpers.html | 2 +- Plausible.Cldr.AcceptLanguage.html | 264 +++++++++--------- Plausible.Cldr.Currency.html | 166 +++++------ Plausible.Cldr.Locale.html | 142 +++++++--- Plausible.Cldr.Number.Cardinal.html | 40 +-- Plausible.Cldr.Number.Format.html | 92 +++--- Plausible.Cldr.Number.Formatter.Decimal.html | 8 +- Plausible.Cldr.Number.Ordinal.html | 40 +-- Plausible.Cldr.Number.PluralRule.Range.html | 10 +- Plausible.Cldr.Number.Symbol.html | 20 +- Plausible.Cldr.Number.System.html | 102 +++---- Plausible.Cldr.Number.Transliterate.html | 38 +-- Plausible.Cldr.Number.html | 238 ++++++++-------- Plausible.Cldr.Rbnf.NumberSystem.html | 29 +- Plausible.Cldr.Rbnf.Ordinal.html | 27 +- Plausible.Cldr.Rbnf.Spellout.html | 83 +++--- Plausible.Cldr.html | 252 ++++++++--------- Plausible.ClickhouseEventV2.html | 2 +- Plausible.ClickhouseRepo.html | 18 +- Plausible.ClickhouseSessionV2.BoolUInt8.html | 2 +- Plausible.ClickhouseSessionV2.html | 2 +- Plausible.ConfigHelpers.html | 2 +- Plausible.DataCase.html | 2 +- Plausible.DataMigration.NumericIDs.html | 2 +- Plausible.DataMigration.Repo.html | 18 +- Plausible.DataMigration.html | 2 +- Plausible.Ecto.EventName.html | 2 +- Plausible.Event.WriteBuffer.html | 2 +- Plausible.Factory.html | 2 +- Plausible.Funnel.Step.html | 2 +- Plausible.Funnel.html | 2 +- Plausible.Funnels.html | 2 +- Plausible.Geo.html | 66 ++--- Plausible.Goal.html | 2 +- Plausible.Goals.html | 2 +- Plausible.Google.Api.Mock.html | 2 +- Plausible.Google.Api.html | 2 +- Plausible.Google.Buffer.html | 2 +- Plausible.Google.HTTP.html | 2 +- Plausible.Google.ReportRequest.html | 2 +- Plausible.HTTPClient.Interface.html | 2 +- Plausible.HTTPClient.Non200Error.html | 2 +- Plausible.HTTPClient.html | 2 +- Plausible.ImportDeletionRepo.html | 18 +- Plausible.Imported.html | 2 +- Plausible.IngestRepo.html | 18 +- Plausible.Ingestion.Counters.Buffer.html | 2 +- Plausible.Ingestion.Counters.Record.html | 2 +- ...e.Ingestion.Counters.TelemetryHandler.html | 2 +- Plausible.Ingestion.Counters.html | 2 +- Plausible.Ingestion.Event.html | 2 +- Plausible.Ingestion.Request.html | 2 +- Plausible.Mailer.html | 2 +- Plausible.OpenTelemetry.Sampler.html | 2 +- Plausible.PaddleApi.Mock.html | 2 +- ...sible.PromEx.Plugins.PlausibleMetrics.html | 2 +- Plausible.PromEx.html | 2 +- Plausible.Purge.html | 2 +- Plausible.Release.html | 2 +- Plausible.Repo.html | 2 +- Plausible.Sentry.Client.html | 2 +- Plausible.SentryFilter.html | 2 +- Plausible.Session.CacheStore.html | 2 +- Plausible.Session.Salts.html | 2 +- Plausible.Session.WriteBuffer.html | 2 +- Plausible.Site.Cache.Warmer.All.html | 2 +- ...ble.Site.Cache.Warmer.RecentlyUpdated.html | 2 +- Plausible.Site.Cache.Warmer.html | 2 +- Plausible.Site.Cache.html | 2 +- Plausible.Site.CustomDomain.html | 2 +- Plausible.Site.Domain.html | 2 +- Plausible.Site.GateKeeper.html | 2 +- Plausible.Site.GoogleAuth.html | 2 +- Plausible.Site.ImportedData.html | 2 +- Plausible.Site.Membership.html | 2 +- Plausible.Site.MonthlyReport.html | 2 +- Plausible.Site.Removal.html | 2 +- Plausible.Site.SharedLink.html | 2 +- Plausible.Site.SpikeNotification.html | 2 +- Plausible.Site.WeeklyReport.html | 2 +- Plausible.Site.html | 2 +- Plausible.SiteAdmin.html | 2 +- Plausible.Sites.html | 2 +- Plausible.Stats.Aggregate.html | 2 +- Plausible.Stats.Base.html | 2 +- Plausible.Stats.Breakdown.html | 2 +- Plausible.Stats.Clickhouse.html | 2 +- Plausible.Stats.Compare.html | 2 +- Plausible.Stats.Comparisons.html | 2 +- Plausible.Stats.CurrentVisitors.html | 2 +- Plausible.Stats.CustomProps.html | 2 +- Plausible.Stats.FilterParser.html | 14 +- Plausible.Stats.FilterSuggestions.html | 2 +- Plausible.Stats.Filters.html | 2 +- Plausible.Stats.Fragments.html | 2 +- Plausible.Stats.Funnel.html | 2 +- Plausible.Stats.Imported.html | 2 +- Plausible.Stats.Interval.html | 2 +- Plausible.Stats.Props.html | 2 +- Plausible.Stats.Query.html | 2 +- Plausible.Stats.Timeseries.html | 2 +- Plausible.Stats.Util.html | 2 +- Plausible.Stats.html | 2 +- Plausible.Test.Support.HTML.html | 2 +- Plausible.TestUtils.html | 2 +- Plausible.Themes.html | 2 +- Plausible.Timezones.html | 2 +- Plausible.Workers.CheckUsage.html | 2 +- ...e.Workers.CleanEmailVerificationCodes.html | 2 +- Plausible.Workers.CleanInvitations.html | 2 +- ...Workers.ExpireDomainChangeTransitions.html | 2 +- Plausible.Workers.ImportGoogleAnalytics.html | 2 +- Plausible.Workers.LockSites.html | 2 +- Plausible.Workers.NotifyAnnualRenewal.html | 2 +- Plausible.Workers.RotateSalts.html | 2 +- Plausible.Workers.ScheduleEmailReports.html | 2 +- Plausible.Workers.SendCheckStatsEmails.html | 2 +- Plausible.Workers.SendEmailReport.html | 2 +- Plausible.Workers.SendSiteSetupEmails.html | 2 +- Plausible.Workers.SendTrialNotifications.html | 2 +- Plausible.Workers.SpikeNotifier.html | 2 +- Plausible.epub | Bin 446636 -> 446918 bytes Plausible.html | 2 +- PlausibleWeb.Api.ExternalController.html | 2 +- PlausibleWeb.Api.ExternalSitesController.html | 2 +- PlausibleWeb.Api.ExternalStatsController.html | 2 +- PlausibleWeb.Api.Helpers.html | 2 +- PlausibleWeb.Api.InternalController.html | 2 +- PlausibleWeb.Api.PaddleController.html | 2 +- PlausibleWeb.Api.StatsController.html | 18 +- PlausibleWeb.AuthController.html | 2 +- PlausibleWeb.AuthPlug.html | 2 +- PlausibleWeb.AuthView.html | 2 +- PlausibleWeb.AuthorizeSiteAccess.html | 2 +- PlausibleWeb.AuthorizeSitesApiPlug.html | 2 +- PlausibleWeb.AuthorizeStatsApiPlug.html | 2 +- PlausibleWeb.BillingController.html | 2 +- PlausibleWeb.BillingView.html | 2 +- PlausibleWeb.CRMAuthPlug.html | 2 +- PlausibleWeb.Captcha.html | 2 +- PlausibleWeb.Components.Generic.html | 2 +- PlausibleWeb.Components.Site.Feature.html | 2 +- PlausibleWeb.ConnCase.html | 2 +- PlausibleWeb.ControllerHelpers.html | 2 +- PlausibleWeb.Email.html | 2 +- PlausibleWeb.EmailView.html | 2 +- PlausibleWeb.Endpoint.html | 2 +- PlausibleWeb.ErrorHelpers.html | 2 +- PlausibleWeb.ErrorReportController.html | 2 +- PlausibleWeb.ErrorView.html | 2 +- PlausibleWeb.Favicon.html | 2 +- PlausibleWeb.FirstLaunchPlug.html | 2 +- PlausibleWeb.FormHelpers.html | 2 +- PlausibleWeb.InvitationController.html | 2 +- PlausibleWeb.LastSeenPlug.html | 2 +- PlausibleWeb.LayoutView.html | 2 +- ...Live.Components.ComboBox.StaticSearch.html | 2 +- PlausibleWeb.Live.Components.ComboBox.html | 2 +- PlausibleWeb.Live.Flash.html | 2 +- PlausibleWeb.Live.FunnelSettings.Form.html | 2 +- PlausibleWeb.Live.FunnelSettings.List.html | 2 +- PlausibleWeb.Live.FunnelSettings.html | 2 +- PlausibleWeb.MJML.WeeklyReport.html | 2 +- PlausibleWeb.PageController.html | 2 +- PlausibleWeb.PageView.html | 2 +- PlausibleWeb.Plugs.NoRobots.html | 2 +- PlausibleWeb.Plugs.RuntimeSessionAdapter.html | 2 +- PlausibleWeb.RefInspector.html | 2 +- PlausibleWeb.RemoteIp.html | 2 +- PlausibleWeb.RequireAccountPlug.html | 2 +- PlausibleWeb.RequireLoggedOutPlug.html | 2 +- PlausibleWeb.Router.html | 2 +- PlausibleWeb.SessionTimeoutPlug.html | 2 +- PlausibleWeb.Site.MembershipController.html | 2 +- PlausibleWeb.Site.MembershipView.html | 2 +- PlausibleWeb.SiteController.html | 2 +- PlausibleWeb.SiteView.html | 2 +- PlausibleWeb.StatsController.html | 2 +- PlausibleWeb.StatsView.html | 2 +- PlausibleWeb.Tracker.html | 2 +- PlausibleWeb.UnsubscribeController.html | 2 +- PlausibleWeb.UnsubscribeView.html | 2 +- PlausibleWeb.html | 2 +- account-locking.html | 2 +- api-reference.html | 2 +- contributing.html | 2 +- dist/search_items-5710C136.js | 1 - dist/search_items-EA6D46AD.js | 1 + dist/sidebar_items-625D214B.js | 1 - dist/sidebar_items-D1A5539C.js | 1 + readme.html | 2 +- search.html | 4 +- 218 files changed, 1100 insertions(+), 1025 deletions(-) delete mode 100644 dist/search_items-5710C136.js create mode 100644 dist/search_items-EA6D46AD.js delete mode 100644 dist/sidebar_items-625D214B.js create mode 100644 dist/sidebar_items-D1A5539C.js diff --git a/.build b/.build index f1a35014b..7d0425830 100644 --- a/.build +++ b/.build @@ -236,8 +236,8 @@ dist/merriweather-latin-ext-300-normal-K6L27CZ5.woff2 dist/merriweather-vietnamese-300-italic-EHHNZPUO.woff2 dist/merriweather-vietnamese-300-normal-U376L4Z4.woff2 dist/remixicon-NKANDIL5.woff2 -dist/search_items-5710C136.js -dist/sidebar_items-625D214B.js +dist/search_items-EA6D46AD.js +dist/sidebar_items-D1A5539C.js index.html readme.html search.html diff --git a/404.html b/404.html index 85ea677fc..26fceaccd 100644 --- a/404.html +++ b/404.html @@ -13,7 +13,7 @@ - + diff --git a/Mix.Tasks.AnalyzePlans.html b/Mix.Tasks.AnalyzePlans.html index a3f5c5772..7116762ad 100644 --- a/Mix.Tasks.AnalyzePlans.html +++ b/Mix.Tasks.AnalyzePlans.html @@ -13,7 +13,7 @@ - + diff --git a/Mix.Tasks.CleanClickhouse.html b/Mix.Tasks.CleanClickhouse.html index 4e823892f..5e4c04b81 100644 --- a/Mix.Tasks.CleanClickhouse.html +++ b/Mix.Tasks.CleanClickhouse.html @@ -13,7 +13,7 @@ - + diff --git a/Mix.Tasks.CreateFreeSubscription.html b/Mix.Tasks.CreateFreeSubscription.html index 2ae752974..a4906e11e 100644 --- a/Mix.Tasks.CreateFreeSubscription.html +++ b/Mix.Tasks.CreateFreeSubscription.html @@ -13,7 +13,7 @@ - + diff --git a/Mix.Tasks.DownloadCountryDatabase.html b/Mix.Tasks.DownloadCountryDatabase.html index 7cb0f5509..320b552ce 100644 --- a/Mix.Tasks.DownloadCountryDatabase.html +++ b/Mix.Tasks.DownloadCountryDatabase.html @@ -13,7 +13,7 @@ - + diff --git a/Mix.Tasks.GenerateReferrerFavicons.html b/Mix.Tasks.GenerateReferrerFavicons.html index 73ec12e19..fcbb301d0 100644 --- a/Mix.Tasks.GenerateReferrerFavicons.html +++ b/Mix.Tasks.GenerateReferrerFavicons.html @@ -13,7 +13,7 @@ - + diff --git a/Mix.Tasks.PullSandboxSubscription.html b/Mix.Tasks.PullSandboxSubscription.html index a3ac3cc48..40241ba36 100644 --- a/Mix.Tasks.PullSandboxSubscription.html +++ b/Mix.Tasks.PullSandboxSubscription.html @@ -13,7 +13,7 @@ - + diff --git a/Mix.Tasks.SendPageview.html b/Mix.Tasks.SendPageview.html index 83263b794..54abce6d8 100644 --- a/Mix.Tasks.SendPageview.html +++ b/Mix.Tasks.SendPageview.html @@ -13,7 +13,7 @@ - + diff --git a/ObanErrorReporter.html b/ObanErrorReporter.html index eb651372e..95762aad5 100644 --- a/ObanErrorReporter.html +++ b/ObanErrorReporter.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.AsyncInsertRepo.html b/Plausible.AsyncInsertRepo.html index 72a7bc284..9038a8a30 100644 --- a/Plausible.AsyncInsertRepo.html +++ b/Plausible.AsyncInsertRepo.html @@ -13,7 +13,7 @@ - + @@ -1116,23 +1116,23 @@ pool to disconnect within the given interval.

See -

Similar to insert_all/2 but with the following differences:

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.Auth.ApiKey.html b/Plausible.Auth.ApiKey.html index a6eaf4a83..a0edded9f 100644 --- a/Plausible.Auth.ApiKey.html +++ b/Plausible.Auth.ApiKey.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Auth.ApiKeyAdmin.html b/Plausible.Auth.ApiKeyAdmin.html index be4feaec9..96be57192 100644 --- a/Plausible.Auth.ApiKeyAdmin.html +++ b/Plausible.Auth.ApiKeyAdmin.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Auth.GracePeriod.html b/Plausible.Auth.GracePeriod.html index b7c8c525e..0480243a5 100644 --- a/Plausible.Auth.GracePeriod.html +++ b/Plausible.Auth.GracePeriod.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Auth.Invitation.html b/Plausible.Auth.Invitation.html index 322ce4bf7..bb55c1379 100644 --- a/Plausible.Auth.Invitation.html +++ b/Plausible.Auth.Invitation.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Auth.Password.html b/Plausible.Auth.Password.html index 9747b03f0..2edb35d2a 100644 --- a/Plausible.Auth.Password.html +++ b/Plausible.Auth.Password.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Auth.Token.html b/Plausible.Auth.Token.html index a8f42ea49..63c4984ae 100644 --- a/Plausible.Auth.Token.html +++ b/Plausible.Auth.Token.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Auth.User.html b/Plausible.Auth.User.html index e36572476..0ce79e194 100644 --- a/Plausible.Auth.User.html +++ b/Plausible.Auth.User.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Auth.UserAdmin.html b/Plausible.Auth.UserAdmin.html index fc3be3c7e..863888407 100644 --- a/Plausible.Auth.UserAdmin.html +++ b/Plausible.Auth.UserAdmin.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Auth.html b/Plausible.Auth.html index c7667ab8e..81432a1f8 100644 --- a/Plausible.Auth.html +++ b/Plausible.Auth.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Billing.EnterprisePlan.html b/Plausible.Billing.EnterprisePlan.html index 7483f2642..a3358cecf 100644 --- a/Plausible.Billing.EnterprisePlan.html +++ b/Plausible.Billing.EnterprisePlan.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Billing.EnterprisePlanAdmin.html b/Plausible.Billing.EnterprisePlanAdmin.html index 9777bcb2e..eb3ae5824 100644 --- a/Plausible.Billing.EnterprisePlanAdmin.html +++ b/Plausible.Billing.EnterprisePlanAdmin.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Billing.PaddleApi.html b/Plausible.Billing.PaddleApi.html index 064e313e5..e2de4decb 100644 --- a/Plausible.Billing.PaddleApi.html +++ b/Plausible.Billing.PaddleApi.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Billing.Plans.html b/Plausible.Billing.Plans.html index 41f249128..31db19350 100644 --- a/Plausible.Billing.Plans.html +++ b/Plausible.Billing.Plans.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Billing.SiteLocker.html b/Plausible.Billing.SiteLocker.html index 19b57add0..2462f4b9e 100644 --- a/Plausible.Billing.SiteLocker.html +++ b/Plausible.Billing.SiteLocker.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Billing.html b/Plausible.Billing.html index eb4b566c1..c4a839621 100644 --- a/Plausible.Billing.html +++ b/Plausible.Billing.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.ChangesetHelpers.html b/Plausible.ChangesetHelpers.html index 1a70cbac0..5927d3096 100644 --- a/Plausible.ChangesetHelpers.html +++ b/Plausible.ChangesetHelpers.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Cldr.AcceptLanguage.html b/Plausible.Cldr.AcceptLanguage.html index 7192a0395..92fe9001a 100644 --- a/Plausible.Cldr.AcceptLanguage.html +++ b/Plausible.Cldr.AcceptLanguage.html @@ -13,7 +13,7 @@ - + @@ -117,9 +117,9 @@ Plausible

Parses HTTP Accept-Language header values as defined in rfc2616.

The Accept-Language request-header field is similar to Accept, but restricts the set of natural languages that are preferred as a response to the request. -Language tags function are provided in Cldr.LanguageTag.

The format of an Accept-Language header is as follows in ABNF format:

   Accept-Language = "Accept-Language" ":"
+Language tags function are provided in 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."

@@ -145,7 +145,7 @@ quality value defaults to "q=1". For example,

Parse an Accept-Language string and return the best match for -a configured Cldr locale.

+a configured Cldr locale.

@@ -210,13 +210,13 @@ Functions
@spec best_match(String.t()) ::
-  {:ok, Cldr.LanguageTag.t()}
+  {:ok, Cldr.LanguageTag.t()}
   | {:error, {Cldr.AcceptLanguageError | Cldr.NoMatchingLocale, String.t()}}

Parse an Accept-Language string and return the best match for -a configured Cldr locale.

+a configured Cldr locale.

arguments

@@ -234,54 +234,54 @@ a configured 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"}}

@@ -310,7 +310,7 @@ a configured @spec parse([{float(), String.t()}, ...] | String.t()) :: {:ok, [ - {float(), Cldr.LanguageTag.t()} + {float(), Cldr.LanguageTag.t()} | {:error, {Cldr.InvalidLanguageTag, String.t()}}, ... ]} @@ -328,7 +328,7 @@ or tokenized form to return a tuple of the form
  • accept-language is any string in the format defined by rfc2616

  • backend is any module that includes use Cldr and therefore -is a Cldr backend module

+is a Cldr backend module

returns

@@ -342,95 +342,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"}} + ]}
@@ -467,7 +467,7 @@ in descending order.

Returns

-

If at least one valid language tag is found but errors are also +

If at least one valid language tag is found but errors are also detected on one more more tags, an {ok, list} tuple is returned wuth an error tuple for each invalid tag added at the end of the list.

@@ -475,92 +475,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 8df4ce2a9..3df5ccf40 100644 --- a/Plausible.Cldr.Currency.html +++ b/Plausible.Cldr.Currency.html @@ -13,7 +13,7 @@ - + @@ -355,13 +355,13 @@ Functions
@spec currencies_for_locale(
-  Cldr.Locale.locale_name() | Cldr.LanguageTag.t(),
+  Cldr.Locale.locale_name() | Cldr.LanguageTag.t(),
   only :: Cldr.Currency.filter(),
   except :: Cldr.Currency.filter()
 ) :: {:ok, map()} | {:error, {module(), String.t()}}
@spec currencies_for_locale(
-  Cldr.Locale.locale_name() | Cldr.LanguageTag.t(),
+  Cldr.Locale.locale_name() | Cldr.LanguageTag.t(),
   only :: Cldr.Currency.filter(),
   except :: Cldr.Currency.filter()
 ) :: map() | no_return()
@@ -376,7 +376,7 @@ a given locale.

locale is any valid locale name returned by MyApp.Cldr.known_locale_names/0 -or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1

  • currency_status is :all, :current, :historic, +or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1

  • currency_status is :all, :current, :historic, unannotated or :tender; or a list of one or more status. The default is :all. See Cldr.Currency.currency_filter/2.

  • @@ -392,11 +392,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,
    @@ -406,12 +406,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,
    @@ -421,7 +421,7 @@ The default is :all. See symbol: "SUR",
        tender: true,
        to: nil
    - },
    + },
      ...
     }}
    @@ -457,7 +457,7 @@ a given locale and raises on error.

    locale is any valid locale name returned by MyApp.Cldr.known_locale_names/0 -or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1

  • currency_status is :all, :current, :historic, +or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1

  • currency_status is :all, :current, :historic, unannotated or :tender; or a list of one or more status. The default is :all. See Cldr.Currency.currency_filter/2.

  • @@ -472,11 +472,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,
    @@ -486,12 +486,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,
    @@ -501,7 +501,7 @@ The default is :all. See symbol: "SUR",
       tender: true,
       to: nil
    -},
    +},
     ...

    }

    @@ -546,8 +546,8 @@ The default is :all. See :locale is any valid locale name returned by Cldr.known_locale_names/1 -or a Cldr.LanguageTag struct returned by Cldr.Locale.new!/2

    +

    returns

    @@ -559,13 +559,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",
    @@ -573,15 +573,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",
    @@ -589,7 +589,7 @@ or a rounding: 0,
         symbol: "THB",
         tender: true
    -}}
    +}}
    @@ -635,8 +635,8 @@ or a Options

    -

    +

    returns

    @@ -648,12 +648,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",
    @@ -661,14 +661,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",
    @@ -676,7 +676,7 @@ or a rounding: 0,
       symbol: "THB",
       tender: true
    -}
    +}
    @@ -704,8 +704,8 @@ or a Arguments -

    +

    returns

    @@ -717,11 +717,11 @@ 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
     
    @@ -750,7 +750,7 @@ or a 
     
    -          
    @spec currency_history_for_locale(Cldr.LanguageTag.t() | Cldr.Locale.locale_name()) ::
    +          
    @spec currency_history_for_locale(Cldr.LanguageTag.t() | Cldr.Locale.locale_name()) ::
       map() | {:error, {module(), String.t()}}
    @@ -763,20 +763,20 @@ currency for a given locale.

    • locale is any valid locale name returned by MyApp.Cldr.known_locale_names/0 -or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1

    +or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1

    example

    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]}
    -  }
    -}
    +{:ok, + %{ + USD: %{from: ~D[1792-01-01], to: nil}, + USN: %{tender: false}, + USS: %{from: nil, tender: false, to: ~D[2014-03-01]} + } +}
    @@ -805,7 +805,7 @@ or a
    @spec currency_strings(
    -  Cldr.LanguageTag.t() | Cldr.Locale.locale_name(),
    +  Cldr.LanguageTag.t() | Cldr.Locale.locale_name(),
       only :: Cldr.Currency.filter(),
       except :: Cldr.Currency.filter()
     ) :: {:ok, map()} | {:error, {module(), String.t()}}
    @@ -821,7 +821,7 @@ representing a currency in a locale-specific manner.

    locale is any valid locale name returned by MyApp.Cldr.known_locale_names/0 -or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1

  • currency_status is :all, :current, :historic, +or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1

  • currency_status is :all, :current, :historic, unannotated or :tender; or a list of one or more status. The default is :all. See Cldr.Currency.currency_filter/2.

  • @@ -836,8 +836,8 @@ The default is :all. See MyApp.Cldr.Currency.currency_strings "en" -=> {:ok, - %{ +=> {:ok, + %{ "mexican silver pesos" => :MXP, "sudanese dinar" => :SDD, "bad" => :BAD, @@ -847,7 +847,7 @@ The default is :all. See "guyanaese dollars" => :GYD, "equatorial guinean ekwele" => :GQE, ... - }} + }}

    @@ -876,7 +876,7 @@ The default is :all. See
    @spec currency_strings!(
    -  Cldr.LanguageTag.t() | Cldr.Locale.locale_name(),
    +  Cldr.LanguageTag.t() | Cldr.Locale.locale_name(),
       only :: Cldr.Currency.filter(),
       except :: Cldr.Currency.filter()
     ) :: map() | no_return()
    @@ -892,7 +892,7 @@ representing a currency in a locale-specific manner.

    locale is any valid locale name returned by MyApp.Cldr.known_locale_names/0 -or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1

  • currency_status is :all, :current, :historic, +or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1

  • currency_status is :all, :current, :historic, unannotated or :tender; or a list of one or more status. The default is :all. See Cldr.Currency.currency_filter/2.

  • @@ -907,7 +907,7 @@ The default is :all. See MyApp.Cldr.Currency.currency_strings! "en" -=> %{ +=> %{ "mexican silver pesos" => :MXP, "sudanese dinar" => :SDD, "bad" => :BAD, @@ -917,7 +917,7 @@ The default is :all. See "guyanaese dollars" => :GYD, "equatorial guinean ekwele" => :GQE, ... - } + }

    @@ -949,7 +949,7 @@ circumstances.

    locale is any valid locale name returned by MyApp.Cldr.known_locale_names/0 -or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1

    +or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1

    example

    @@ -986,7 +986,7 @@ or a
    @spec current_territory_currencies() :: %{
    -  required(Cldr.Locale.territory_code()) => Cldr.Currency.code()
    +  required(Cldr.Locale.territory_code()) => Cldr.Currency.code()
     }
    @@ -1006,7 +1006,7 @@ mapping is returned for that territory.

    iex> Plausible.Cldr.Currency.current_territory_currencies() +
    iex> Plausible.Cldr.Currency.current_territory_currencies()

    @@ -1099,10 +1099,10 @@ currency code

    iex> Plausible.Cldr.Currency.known_currency_code "AUD" -{:ok, :AUD} +{:ok, :AUD} iex> Plausible.Cldr.Currency.known_currency_code "GGG" -{:error, {Cldr.UnknownCurrencyError, "The currency \"GGG\" is invalid"}} +{:error, {Cldr.UnknownCurrencyError, "The currency \"GGG\" is invalid"}}

    @@ -1249,14 +1249,14 @@ such as 0.05. Optional.

    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,
    @@ -1266,11 +1266,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."}}

    @@ -1315,7 +1315,7 @@ on the plural rules in effect for the locale.

    returns

    @@ -1329,19 +1329,19 @@ default is
    Plaus Examples

    iex> Plausible.Cldr.Currency.pluralize 1, :USD
    -{:ok, "US dollar"}
    +{:ok, "US dollar"}
     
     iex> Plausible.Cldr.Currency.pluralize 3, :USD
    -{:ok, "US dollars"}
    +{:ok, "US dollars"}
     
     iex> Plausible.Cldr.Currency.pluralize 12, :USD, locale: "zh"
    -{:ok, "美元"}
    +{:ok, "美元"}
     
     iex> Plausible.Cldr.Currency.pluralize 12, :USD, locale: "fr"
    -{:ok, "dollars des États-Unis"}
    +{:ok, "dollars des États-Unis"}
     
     iex> Plausible.Cldr.Currency.pluralize 1, :USD, locale: "fr"
    -{:ok, "dollar des États-Unis"}
    +{:ok, "dollar des États-Unis"}
    @@ -1371,7 +1371,7 @@ in a given locale.

    currency is an ISO4217 currency code

  • locale is any valid locale name returned by MyApp.Cldr.known_locale_names/0 -or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1

  • +or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1

    returns

    @@ -1384,7 +1384,7 @@ or a
    iex> MyApp.Cldr.Currency.strings_for_currency :AUD, "en"
    -["a$", "australian dollars", "aud", "australian dollar"]
    +["a$", "australian dollars", "aud", "australian dollar"]

    diff --git a/Plausible.Cldr.Locale.html b/Plausible.Cldr.Locale.html index 6d5523f65..72ea997f8 100644 --- a/Plausible.Cldr.Locale.html +++ b/Plausible.Cldr.Locale.html @@ -13,7 +13,7 @@ - + @@ -191,6 +191,16 @@ with the provided locale name.

    +
    + + +

    Returns the script direction for a locale.

    + +
    +
    territory_from_host(host) @@ -261,8 +271,8 @@ Functions
    -
    @spec fallback_locale_names(Cldr.LanguageTag.t() | Cldr.Locale.locale_reference()) ::
    -  {:ok, [Cldr.Locale.locale_name(), ...]} | {:error, {module(), String.t()}}
    +
    @spec fallback_locale_names(Cldr.LanguageTag.t() | Cldr.Locale.locale_reference()) ::
    +  {:ok, [Cldr.Locale.locale_name(), ...]} | {:error, {module(), String.t()}}
    @@ -270,9 +280,7 @@ Functions with the provided locale name.

    Fallbacks are a list of locate names which can be used to resolve translation or other localization data if such localised data does not exist for -this specific locale. After locale-specific fallbacks -are determined, the the default locale and its fallbacks -are added to the chain.

    +this specific locale..

    arguments

    @@ -291,16 +299,16 @@ are added to the chain.

    :"en-001".

    iex> Plausible.Cldr.Locale.fallback_locale_names(:"fr-CA")
    -{:ok, [:"fr-CA", :fr, :"en-001", :en]}
    +
    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, :"en-001", :en]}
    +
    iex> Plausible.Cldr.Locale.fallback_locale_names(:nb) +{:ok, [:nb, :no, :und]}
    @@ -326,8 +334,8 @@ are added to the chain.

    -
    @spec fallback_locales(Cldr.LanguageTag.t() | Cldr.Locale.locale_reference()) ::
    -  {:ok, [Cldr.LanguageTag.t(), ...]} | {:error, {module(), String.t()}}
    +
    @spec fallback_locales(Cldr.LanguageTag.t() | Cldr.Locale.locale_reference()) ::
    +  {:ok, [Cldr.LanguageTag.t(), ...]} | {:error, {module(), String.t()}}

    @@ -335,9 +343,7 @@ are added to the chain.

    +this specific locale.

    arguments

    @@ -356,20 +362,20 @@ are added to the chain.

    :"en-001".

    Plausible.Cldr.Locale.fallback_locales(:"fr-CA")
    -=> {:ok,
    -     [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>,
    -      #Cldr.LanguageTag<en [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<en [validated]>]}
    +
    Plausible.Cldr.Locale.fallback_locales(:nb)) +=> {:ok, + [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>, + #Cldr.LanguageTag<und [validated]>]}
    @@ -395,8 +401,8 @@ are added to the chain.

    -
    @spec locale_for_territory(Cldr.Locale.territory_code()) ::
    -  {:ok, Cldr.LanguageTag.t()} | {:error, {module(), String.t()}}
    +
    @spec locale_for_territory(Cldr.Locale.territory_code()) ::
    +  {:ok, Cldr.LanguageTag.t()} | {:error, {module(), String.t()}}

    @@ -413,7 +419,7 @@ is validated and if that fails, "en" is validated.

    territory is any ISO 3166 Alpha-2 territory -code that can be validated by Cldr.validate_territory/1

    +code that can be validated by Cldr.validate_territory/1

    returns

    @@ -457,7 +463,7 @@ code that can be validated by
    @spec locale_from_host(String.t(), Keyword.t()) ::
    -  {:ok, Cldr.LanguageTag.t()} | {:error, {module(), String.t()}}
    + {:ok, Cldr.LanguageTag.t()} | {:error, {module(), String.t()}} @@ -476,7 +482,7 @@ is [].

    :tlds is a list of territory codes as upper-cased atoms that are to be considered as top-level domains. -See Cldr.Locale.locale_from_host/2 for the default +See Cldr.Locale.locale_from_host/2 for the default list.

    returns

    @@ -500,15 +506,15 @@ generic top-level domain names.

    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\""}}
    @@ -553,6 +559,54 @@ generic top-level domain names.

    +

    + +
    + +
    + + + Link to this function + +

    script_direction_from_locale(locale)

    + + + + View Source + + + + (since 2.37.0) + +
    + +
    + +

    Returns the script direction for a locale.

    + +

    arguments

    +
    + Arguments +

    +

    + +

    returns

    +
    + Returns +

    +
    • The script direction which is either :ltr (for left-to-right +scripts) or :rtl (for right-to-left scripts).

    + +

    examples

    +
    + Examples +

    +
    iex> Plausible.Cldr.Locale.script_direction_from_locale "en-US"
    +:ltr
    +
    +iex> Plausible.Cldr.Locale.script_direction_from_locale :ar
    +:rtl
    @@ -579,7 +633,7 @@ generic top-level domain names.

    @spec territory_from_host(String.t()) ::
    -  {:ok, Cldr.Locale.territory_code()} | {:error, {module(), String.t()}}
    + {:ok, Cldr.Locale.territory_code()} | {:error, {module(), String.t()}} @@ -602,12 +656,12 @@ be a territory.

    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\""}}

    @@ -633,8 +687,8 @@ be a territory.

    -
    @spec territory_from_locale(Cldr.LanguageTag.t() | Cldr.Locale.locale_name()) ::
    -  Cldr.Locale.territory_code()
    +
    @spec territory_from_locale(Cldr.LanguageTag.t() | Cldr.Locale.locale_name()) ::
    +  Cldr.Locale.territory_code()
    @@ -690,7 +744,7 @@ or a locale name in the list returned by
    -
    @spec timezone_from_locale(Cldr.LanguageTag.t() | Cldr.Locale.locale_name()) ::
    +          
    @spec timezone_from_locale(Cldr.LanguageTag.t() | Cldr.Locale.locale_name()) ::
       String.t() | {:error, {module(), String.t()}}
    diff --git a/Plausible.Cldr.Number.Cardinal.html b/Plausible.Cldr.Number.Cardinal.html index 70df76887..8fca2103d 100644 --- a/Plausible.Cldr.Number.Cardinal.html +++ b/Plausible.Cldr.Number.Cardinal.html @@ -13,7 +13,7 @@ - + @@ -249,13 +249,13 @@ Functions
    -
    @spec known_locale_names() :: [Cldr.Locale.locale_name(), ...]
    +
    @spec known_locale_names() :: [Cldr.Locale.locale_name(), ...]

    The configured locales for which plural rules are defined.

    Returns the intersection of Plausible.Cldr.known_locale_names/0 and -the locales for which Cardinal plural rules are defined.

    There are many Cldr locales which don't have their own plural -rules so this list is the intersection of Cldr's configured +the locales for which Cardinal plural rules are defined.

    There are many Cldr locales which don't have their own plural +rules so this list is the intersection of Cldr's configured locales and those that have rules.

    @@ -283,10 +283,10 @@ locales and those that have rules.

    @@ -302,7 +302,7 @@ list or other content in a plural-sensitive way.

    number is any integer, float or Decimal

  • locale is any locale returned by Cldr.Locale.new!/2 or any +

    @@ -366,7 +366,7 @@ default is :half_even.

  • -
    @spec plural_rules_for(Cldr.Locale.locale_name() | Cldr.LanguageTag.t()) :: [
    +          
    @spec plural_rules_for(Cldr.Locale.locale_name() | Cldr.LanguageTag.t()) :: [
       {atom(), list()},
       ...
     ]
    @@ -405,8 +405,8 @@ default is :half_even.

    @spec pluralize(
    -  Cldr.Math.number_or_decimal() | Range.t(),
    -  Cldr.Locale.locale_reference(),
    +  Cldr.Math.number_or_decimal() | Range.t(),
    +  Cldr.Locale.locale_reference(),
       %{}
     ) :: any()
    @@ -428,31 +428,31 @@ The valid substitution keys are :zero, 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 4ec74c8da..eb1b9a8b4 100644 --- a/Plausible.Cldr.Number.Format.html +++ b/Plausible.Cldr.Number.Format.html @@ -13,7 +13,7 @@ - + @@ -302,7 +302,7 @@ Functions
    -
    @spec all_formats_for(Cldr.LanguageTag.t() | Cldr.Locale.locale_name()) ::
    +          
    @spec all_formats_for(Cldr.LanguageTag.t() | Cldr.Locale.locale_name()) ::
       {:ok, map()} | {:error, {module(), String.t()}}
    @@ -315,7 +315,7 @@ Functions

    @@ -350,7 +350,7 @@ keyed by number system or

  • {:error, {exceptio

    @@ -363,7 +363,7 @@ keyed by number system or

  • {:error, {exceptio

  • @@ -397,8 +397,8 @@ keyed by number system or

  • raises an exception

  • See

    @@ -428,7 +428,7 @@ number system.

    -
    @spec decimal_format_list() :: [Cldr.Number.Format.format()]
    +
    @spec decimal_format_list() :: [Cldr.Number.Format.format()]
    @@ -441,7 +441,7 @@ to precompile all the known formats at compile time.

    #=> 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¤)", @@ -451,7 +451,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 ¤", ...]
    @@ -477,7 +477,7 @@ to precompile all the known formats at compile time.

    -
    @spec decimal_format_list_for(Cldr.LanguageTag.t() | Cldr.Locale.locale_name()) ::
    +          
    @spec decimal_format_list_for(Cldr.LanguageTag.t() | Cldr.Locale.locale_name()) ::
       {:ok, [String.t()]} | {:error, {module(), String.t()}}
    @@ -490,7 +490,7 @@ to precompile all the known formats at compile time.

    locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 -or a Cldr.LanguageTag struct returned by +or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1. The default is Plausible.Cldr.get_locale/0.

    This function exists to allow the decimal formatter to precompile all the known formats at compile time. Its use is not otherwise recommended.

    @@ -499,8 +499,8 @@ the known formats at compile time. Its use is not otherwise recommended.

    Example

    -
    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",
    @@ -508,7 +508,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"]}

    @@ -534,7 +534,7 @@ the known formats at compile time. Its use is not otherwise recommended.

    -
    @spec default_grouping_for(Cldr.LanguageTag.t() | Cldr.Locale.locale_name()) ::
    +          
    @spec default_grouping_for(Cldr.LanguageTag.t() | Cldr.Locale.locale_name()) ::
       {:ok, map()} | {:error, {module(), String.t()}}
    @@ -547,7 +547,7 @@ the known formats at compile time. Its use is not otherwise recommended.

    @@ -561,8 +561,8 @@ is 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}}}

    @@ -586,7 +586,7 @@ is Plausible.Cld @@ -600,7 +600,7 @@ or raises on error.

    locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 -or a Cldr.LanguageTag struct returned by +or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1. The default is Plausible.Cldr.get_locale/0.

    @@ -614,8 +614,8 @@ is 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}}
    @@ -643,7 +643,7 @@ is Plausible.Cld
    -
    @spec formats_for(Cldr.LanguageTag.t() | binary(), atom() | String.t()) ::
    +          
    @spec formats_for(Cldr.LanguageTag.t() | binary(), atom() | String.t()) ::
       {:ok, map()} | {:error, {module(), String.t()}}
    @@ -656,7 +656,7 @@ is Plausible.Cld

    @@ -672,18 +672,18 @@ by 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 ¤"]}], ... } @@ -714,8 +714,8 @@ by
    @spec formats_for!(
    -  Cldr.LanguageTag.t() | Cldr.Locale.locale_name(),
    -  Cldr.Number.System.system_name()
    +  Cldr.LanguageTag.t() | Cldr.Locale.locale_name(),
    +  Cldr.Number.System.system_name()
     ) ::
       map() | no_return()
    @@ -747,7 +747,7 @@ by -
    @spec minimum_grouping_digits_for(Cldr.LanguageTag.t() | Cldr.Locale.locale_name()) ::
    +          
    @spec minimum_grouping_digits_for(Cldr.LanguageTag.t() | Cldr.Locale.locale_name()) ::
       {:ok, non_neg_integer()} | {:error, {module(), String.t()}}
    @@ -760,7 +760,7 @@ by

    @@ -774,8 +774,8 @@ is 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}
    @@ -799,7 +799,7 @@ is Plausible.Cld @@ -813,7 +813,7 @@ or raises on error.

    locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 -or a Cldr.LanguageTag struct returned by +or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1. The default is Plausible.Cldr.get_locale/0.

    @@ -827,7 +827,7 @@ is Plausible.Cld Examples

    -
    iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
    +
    iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
     1
    diff --git a/Plausible.Cldr.Number.Formatter.Decimal.html b/Plausible.Cldr.Number.Formatter.Decimal.html index 062c985b5..a17efcc10 100644 --- a/Plausible.Cldr.Number.Formatter.Decimal.html +++ b/Plausible.Cldr.Number.Formatter.Decimal.html @@ -13,7 +13,7 @@ - + @@ -205,9 +205,9 @@ Functions diff --git a/Plausible.Cldr.Number.Ordinal.html b/Plausible.Cldr.Number.Ordinal.html index f78629321..67f88bcfe 100644 --- a/Plausible.Cldr.Number.Ordinal.html +++ b/Plausible.Cldr.Number.Ordinal.html @@ -13,7 +13,7 @@ - + @@ -249,13 +249,13 @@ Functions
    -
    @spec known_locale_names() :: [Cldr.Locale.locale_name(), ...]
    +
    @spec known_locale_names() :: [Cldr.Locale.locale_name(), ...]

    The configured locales for which plural rules are defined.

    Returns the intersection of Plausible.Cldr.known_locale_names/0 and -the locales for which Ordinal plural rules are defined.

    There are many Cldr locales which don't have their own plural -rules so this list is the intersection of Cldr's configured +the locales for which Ordinal plural rules are defined.

    There are many Cldr locales which don't have their own plural +rules so this list is the intersection of Cldr's configured locales and those that have rules.

    @@ -283,10 +283,10 @@ locales and those that have rules.

    @@ -302,7 +302,7 @@ list or other content in a plural-sensitive way.

    number is any integer, float or Decimal

  • locale is any locale returned by Cldr.Locale.new!/2 or any +

    @@ -366,7 +366,7 @@ default is :half_even.

  • -
    @spec plural_rules_for(Cldr.Locale.locale_name() | Cldr.LanguageTag.t()) :: [
    +          
    @spec plural_rules_for(Cldr.Locale.locale_name() | Cldr.LanguageTag.t()) :: [
       {atom(), list()},
       ...
     ]
    @@ -405,8 +405,8 @@ default is :half_even.

    @spec pluralize(
    -  Cldr.Math.number_or_decimal() | Range.t(),
    -  Cldr.Locale.locale_reference(),
    +  Cldr.Math.number_or_decimal() | Range.t(),
    +  Cldr.Locale.locale_reference(),
       %{}
     ) :: any()
    @@ -431,31 +431,31 @@ The valid substitution keys are :zero, 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.PluralRule.Range.html b/Plausible.Cldr.Number.PluralRule.Range.html index d8de84ecd..05fe93868 100644 --- a/Plausible.Cldr.Number.PluralRule.Range.html +++ b/Plausible.Cldr.Number.PluralRule.Range.html @@ -13,7 +13,7 @@ - + @@ -178,10 +178,10 @@ Functions

    diff --git a/Plausible.Cldr.Number.Symbol.html b/Plausible.Cldr.Number.Symbol.html index 314e0b37e..55a7b8eb8 100644 --- a/Plausible.Cldr.Number.Symbol.html +++ b/Plausible.Cldr.Number.Symbol.html @@ -13,7 +13,7 @@ - + @@ -329,7 +329,7 @@ when builing a regular expression.

    -
    @spec number_symbols_for(Cldr.LanguageTag.t() | Cldr.Locale.locale_name()) ::
    +          
    @spec number_symbols_for(Cldr.LanguageTag.t() | Cldr.Locale.locale_name()) ::
       {:ok, map()} | {:error, {module(), String.t()}}
    @@ -343,7 +343,7 @@ of the number systems of a locale.

    @@ -351,9 +351,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: ",",
    @@ -366,8 +366,8 @@ is Plausible.Cld
          plus_sign: "+",
          superscripting_exponent: "×",
          time_separator: ":"
    -   },
    -   thai: %Cldr.Number.Symbol{
    +   },
    +   thai: %Cldr.Number.Symbol{
          decimal: ".",
          exponential: "E",
          group: ",",
    @@ -380,8 +380,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 2f2573592..dbd9bfb80 100644 --- a/Plausible.Cldr.Number.System.html +++ b/Plausible.Cldr.Number.System.html @@ -13,7 +13,7 @@ - + @@ -271,17 +271,17 @@ Functions -

    Returns the actual number system from a number system type.

    This function will decode a number system type into the actual +

    Returns the actual number system from a number system type.

    This function will decode a number system type into the actual number system. If the number system provided can't be decoded it is returned as is.

    @@ -290,23 +290,23 @@ it is returned as is.

    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}"} +}

    @@ -330,8 +330,8 @@ it is returned as is.

    -
    @spec number_system_from_locale(Cldr.Locale.locale_reference()) ::
    -  Cldr.Number.System.system_name()
    +
    @spec number_system_from_locale(Cldr.Locale.locale_reference()) ::
    +  Cldr.Number.System.system_name()
    @@ -342,8 +342,8 @@ locale name.

    locale is any language tag returned be Cldr.Locale.new/2 -or a locale name in the list returned by Cldr.known_locale_names/1

    +

    returns

    @@ -383,24 +383,24 @@ or a locale name in the list returned by -
    @spec number_system_names_for(Cldr.Locale.locale_reference()) ::
    +          
    @spec number_system_names_for(Cldr.Locale.locale_reference()) ::
       {:ok, [atom()]} | {:error, {module(), String.t()}}

    Returns the number systems available for a locale or {:error, message} if the locale is not known.

    +or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1

    examples

    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"}}

    @@ -468,27 +468,27 @@ or a -
    @spec number_systems_for(Cldr.Locale.locale_reference()) ::
    +          
    @spec number_systems_for(Cldr.Locale.locale_reference()) ::
       {:ok, map()} | {:error, {module(), String.t()}}

    Returns the number systems available for a locale or {:error, message} if the locale is not known.

    +or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1

    examples

    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"}}
    @@ -535,8 +535,8 @@ or a
    @spec number_systems_like(
    -  Cldr.Locale.locale_reference(),
    -  Cldr.Number.System.system_name()
    +  Cldr.Locale.locale_reference(),
    +  Cldr.Number.System.system_name()
     ) ::
       {:ok, list()} | {:error, tuple()}
    @@ -567,8 +567,8 @@ or a
    @spec system_name_from(
    -  Cldr.Number.System.system_name(),
    -  Cldr.Locale.locale_name() | Cldr.LanguageTag.t()
    +  Cldr.Number.System.system_name(),
    +  Cldr.Locale.locale_name() | Cldr.LanguageTag.t()
     ) :: {:ok, atom()} | {:error, {module(), String.t()}}
    @@ -576,7 +576,7 @@ or a Returns a number system name for a given locale and number system reference.

    Number systems can be references in one of two ways:

    Number systems can be references in one of two ways:

    • As a number system type such as :default, :native, :traditional and :finance. This allows references to a number system for a locale in a consistent fashion for a given use

    • WIth the number system name directly, such as :latn, :arab or any of the other 70 or so

    This function dereferences the supplied system_name and returns the @@ -586,20 +586,20 @@ actual system name.

    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.

    @@ -626,16 +626,16 @@ number system for the given locale as demonstrated in the third example.

    a non-latin number system.

    This function converts numbers to a known number system only, it does not provide number formatting.

    There are two types of number systems in CLDR:

    There are two types of number systems in CLDR:

    • :numeric in which the number system defines a direct mapping between the latin digits 0..9 into a the number system equivalent. In this case, -to_system/2 invokes Cldr.Number.Transliterate.transliterate_digits/3 +to_system/2 invokes Cldr.Number.Transliterate.transliterate_digits/3 for the given number.

    • :algorithmic in which the number system does not have the same structure as the :latn number system and therefore the conversion is done algorithmically. For CLDR the algorithm -is implemented through Cldr.Rbnf rulesets. +is implemented through Cldr.Rbnf rulesets. These rulesets are considered by CLDR to be less rigorous than the :numeric number systems and caution and testing for a specific use case @@ -646,16 +646,16 @@ is recommended.

    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, "壹佰贰拾叁"}
    diff --git a/Plausible.Cldr.Number.Transliterate.html b/Plausible.Cldr.Number.Transliterate.html index 92c9a5db1..0cc07cb65 100644 --- a/Plausible.Cldr.Number.Transliterate.html +++ b/Plausible.Cldr.Number.Transliterate.html @@ -13,7 +13,7 @@ - + @@ -128,18 +128,18 @@ fast than when formal transliteration is required.

    Cldr.Number.Transliterate.transliterate_digits/3 which transliterates +

    This module includes Cldr.Number.Transliterate.transliterate_digits/3 which transliterates digits between number systems. For example from :arabic to :latn. Since generating a transliteration map is slow, pairs of transliterations can be configured so that the transliteration map is created at compile time and therefore speeding up transliteration at run time.

    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 -configured: from :latn to :thai and from :arab to :thai.

    A list of configurable number systems is returned by Cldr.Number.System.systems_with_digits/0.

    If a transliteration is requested between two number pairs that have not been configured for + 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.systems_with_digits/0.

    If a transliteration is requested between two number pairs that have not been configured for precompilation, a warning is logged.

    @@ -226,8 +226,8 @@ Functions
    @spec transliterate(
       String.t(),
    -  Cldr.LanguageTag.t() | Cldr.Locale.locale_name(),
    -  Cldr.Number.System.system_name() | Cldr.Number.System.types()
    +  Cldr.LanguageTag.t() | Cldr.Locale.locale_name(),
    +  Cldr.Number.System.system_name() | Cldr.Number.System.types()
     ) :: String.t() | {:error, {module(), String.t()}}
    @@ -246,7 +246,7 @@ is the actual name of a known number system. If epressed as an :default and :native but :traditional and :finance are also part of the standard). See Plausible.Cldr.Number.System.number_systems_for/1 for a locale to -see what number system types are defined. The default is :default.

    For available number systems see Cldr.Number.System.number_systems/0 +see what number system types are defined. The default is :default.

    For available number systems see Cldr.Number.System.number_systems/0 and Plausible.Cldr.Number.System.number_systems_for/1. Also see Plausible.Cldr.Number.Symbol.number_symbols_for/1.

    @@ -254,22 +254,22 @@ and 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: ๑๒๓๕๕๖"
    @@ -318,14 +318,14 @@ and
    @spec transliterate_digits( String.t(), - Cldr.Number.System.system_name(), - Cldr.Number.System.system_name() + Cldr.Number.System.system_name(), + Cldr.Number.System.system_name() ) :: String.t()

    Transliterates digits from one number system to another number system

    +Cldr.Number.System.systems_with_digits/0 for available number systems.

    example

    diff --git a/Plausible.Cldr.Number.html b/Plausible.Cldr.Number.html index 7ea78e4c9..eca59810a 100644 --- a/Plausible.Cldr.Number.html +++ b/Plausible.Cldr.Number.html @@ -13,7 +13,7 @@ - + @@ -117,7 +117,7 @@ Plausible

    Formats numbers and currencies based upon CLDR's decimal formats specification.

    The format specification is documentated in Unicode TR35. There are several classes of formatting including non-scientific, scientific, rules based (for spelling and ordinal formats), compact formats that display 1k -rather than 1,000 and so on. See Cldr.Number.to_string/2 for specific formatting +rather than 1,000 and so on. See Cldr.Number.to_string/2 for specific formatting options.

    non-scientific-notation-formatting

    @@ -414,19 +414,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"}}
    @@ -464,8 +464,8 @@ names and symbols are expected

  • options Options

  • -
    • :locale is any valid locale returned by Cldr.known_locale_names/1 -or a Cldr.LanguageTag struct returned by Cldr.Locale.new!/2 +

      • :locale is any valid locale returned by Cldr.known_locale_names/1 +or a Cldr.LanguageTag struct returned by Cldr.Locale.new!/2 The default is Plausible.Cldr.get_locale()

      • :only is an atom or list of atoms representing the currencies or currency types to be considered for a match. The equates to a list of acceptable currencies for parsing. @@ -498,17 +498,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]
      @@ -545,8 +545,8 @@ names and symbols are expected

    • options Options

    -
    • :locale is any valid locale returned by Cldr.known_locale_names/1 -or a Cldr.LanguageTag struct returned by Cldr.Locale.new!/2 +

      • :locale is any valid locale returned by Cldr.known_locale_names/1 +or a Cldr.LanguageTag struct returned by Cldr.Locale.new!/2 The default is Plausible.Cldr.get_locale()

      • :only is an atom or list of atoms representing the currencies or currency types to be considered for a match. The equates to a list of acceptable currencies for parsing. @@ -585,19 +585,19 @@ financial instruments.

      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"}}
      @@ -626,8 +626,8 @@ financial instruments.

    @spec resolve_per(String.t(), Keyword.t()) ::
    -  Cldr.Number.Parser.per()
    -  | [Cldr.Number.Parser.per() | String.t()]
    +  Cldr.Number.Parser.per()
    +  | [Cldr.Number.Parser.per() | String.t()]
       | {:error, {module(), String.t()}}
    @@ -646,8 +646,8 @@ and permille symbols are expected

  • options Options

  • -

    -
    • :locale is any valid locale returned by Cldr.known_locale_names/1 -or a t:Cldr.LanguageTag struct returned by Cldr.Locale.new!/2 +

      examples

      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]
      @@ -766,7 +766,7 @@ a list of strings and numbers.

      :number is one of :integer, :float, :decimal or nil. The default is nil meaning that the type auto-detected as either -an integer or a float.

    • :locale is any locale returned by Cldr.known_locale_names/1 +an integer or a float.

    • :locale is any locale returned by Cldr.known_locale_names/1 or a Cldr.LanguageTag.t. The default is Plausible.Cldr.get_locale/0.

    returns

    @@ -779,27 +779,27 @@ or a Cldr.LanguageTag.t. The default is
    Cldr.Number.Parser.parse/2 +

    Number parsing is performed by Cldr.Number.Parser.parse/2 and any options provided are passed to that function.

    examples

    Examples

    -
    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"]
    @@ -838,7 +838,7 @@ a locale and number system.

    number is an integer, float or Decimal to be formatted

  • options is a keyword list defining how the number is to be formatted. -See Cldr.Number.to_string/3 for a description of the available +See Cldr.Number.to_string/3 for a description of the available options.

  • example

    @@ -846,7 +846,7 @@ options.

    iex> Plausible.Cldr.Number.to_approx_string 1234 -{:ok, "~1,234"} +{:ok, "~1,234"}

    @@ -893,7 +893,7 @@ options.

    iex> Plausible.Cldr.Number.to_at_least_string 1234 -{:ok, "1,234+"} +{:ok, "1,234+"}

    @@ -932,7 +932,7 @@ a locale and number system.

    number is an integer, float or Decimal to be formatted

  • options is a keyword list defining how the number is to be formatted. -See Cldr.Number.to_string/3 for a description of the available +See Cldr.Number.to_string/3 for a description of the available options.

  • example

    @@ -940,7 +940,7 @@ options.

    iex> Plausible.Cldr.Number.to_at_most_string 1234 -{:ok, "≤1,234"} +{:ok, "≤1,234"}

    @@ -979,7 +979,7 @@ the :range format for a locale and number system.

    example

    @@ -987,7 +987,7 @@ options.

    iex> Plausible.Cldr.Number.to_range_string 1234..5678
    -{:ok, "1,234–5,678"}
    +{:ok, "1,234–5,678"}

    @@ -1031,14 +1031,14 @@ options.

    • format: the format style or a format string defining how the number is -formatted. See Cldr.Number.Format for how format strings can be constructed. -See Cldr.Number.Format.format_styles_for/3 to return available format styles +formatted. See Cldr.Number.Format for how format strings can be constructed. +See Cldr.Number.Format.format_styles_for/3 to return available format styles for a locale. The default format is :standard.

    • If :format is set to :long or :short then the formatting depends on whether :currency is specified. If not specified then the number is formatted as :decimal_long or :decimal_short. If :currency is specified the number is formatted as :currency_long or :currency_short and :fractional_digits is set to 0 as a default.

    • :format may also be a format defined by CLDR's Rules Based Number -Formats (RBNF). Further information is found in the module Cldr.Rbnf. +Formats (RBNF). Further information is found in the module Cldr.Rbnf. The most commonly used formats in this category are to spell out the number in a the locales language. The applicable formats are :spellout, :spellout_year, :ordinal. A number can also be formatted as roman @@ -1065,10 +1065,10 @@ should be used to define the separators and digits for the formatted number. If number_system is an atom then number_system is interpreted as a number system. If the :number_system is binary then it is interpreted as a number system name. See -Cldr.Number.System.number_system_names_for/2. The default is :default.

    • :locale: determines the locale in which the number is formatted. See -Cldr.known_locale_names/0. The default isCldr.get_locale/0 which is the +Cldr.Number.System.number_system_names_for/2. The default is :default.

    • :locale: determines the locale in which the number is formatted. See +Cldr.known_locale_names/0. The default isCldr.get_locale/0 which is the locale currently in affect for this Process and which is set by -Cldr.put_locale/1.

    • If :fractional_digits is set to a positive integer value then the number +Cldr.put_locale/1.

    • If :fractional_digits is set to a positive integer value then the number will be rounded to that number of digits and displayed accordingly - overriding settings that would be applied by default. For example, currencies have fractional digits defined reflecting each currencies minor unit. Setting @@ -1106,21 +1106,21 @@ extensions.

      iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn +applied to the symbol than the number. For example:

      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 +...> 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 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. @@ -1141,80 +1141,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, "๑๒๓"}

      +{:ok, "๑๒๓"}

      errors

      Errors

      An error tuple {:error, reason} will be returned if an error is detected. -The two most likely causes of an error return are:

      • A format cannot be compiled. In this case the error tuple will look like:
          iex> Plausible.Cldr.Number.to_string(12345, format: "0#")
      -    {:error, {Cldr.FormatCompileError,
      -      "Decimal format compiler: syntax error before: \"#\""}}
      • The format style requested is not defined for the locale and +The two most likely causes of an error return are:

        • A format cannot be compiled. In this case the error tuple will look like:
            iex> Plausible.Cldr.Number.to_string(12345, format: "0#")
        +    {:error, {Cldr.FormatCompileError,
        +      "Decimal format compiler: syntax error before: \"#\""}}
        • The format style requested is not defined for the 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")
        -    {:error, {Cldr.UnknownFormatError,
        -      "The locale :he with number system :hebr does not define a format :standard"}}
        +return looks like:
          iex> Plausible.Cldr.Number.to_string(1234, locale: "he", number_system: "hebr")
      +    {:error, {Cldr.UnknownFormatError,
      +      "The locale :he with number system :hebr does not define a format :standard"}}

    @@ -1293,9 +1293,9 @@ returned.

    @@ -1308,27 +1308,27 @@ underlying number system is returned.

    locale is any valid locale name returned by Cldr.known_locale_names/1 -or a Cldr.LanguageTag struct returned by Cldr.Locale.new!/2

  • system_name is any number system name returned by -Cldr.known_number_systems/0 or a number system type -returned by Cldr.known_number_system_types/0

  • +

    examples

    Examples

    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"}}
    diff --git a/Plausible.Cldr.Rbnf.NumberSystem.html b/Plausible.Cldr.Rbnf.NumberSystem.html index ead26dc9b..2a6c320f5 100644 --- a/Plausible.Cldr.Rbnf.NumberSystem.html +++ b/Plausible.Cldr.Rbnf.NumberSystem.html @@ -13,7 +13,7 @@ - + @@ -115,13 +115,26 @@ Plausible

    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)
    -[:zz_default, :tamil, :roman_upper, :roman_lower, :hebrew_item,
    - :hebrew, :greek_upper, :greek_lower, :georgian,
    - :ethiopic, :cyrillic_lower, :armenian_upper, :armenian_lower]

    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"}
    +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()
    +[
    +  :armenian_lower,
    +  :armenian_upper,
    +  :cyrillic_lower,
    +  :ethiopic,
    +  :georgian,
    +  :greek_lower,
    +  :greek_upper,
    +  :hebrew,
    +  :hebrew_item,
    +  :roman_lower,
    +  :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"}
    diff --git a/Plausible.Cldr.Rbnf.Ordinal.html b/Plausible.Cldr.Rbnf.Ordinal.html index 89d746372..a1606a3b6 100644 --- a/Plausible.Cldr.Rbnf.Ordinal.html +++ b/Plausible.Cldr.Rbnf.Ordinal.html @@ -13,7 +13,7 @@ - + @@ -115,20 +115,21 @@ Plausible

    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]
    +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]
     
    -iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets("fr")
    -[
    -  :digits_ordinal_masculine_plural,
    -  :digits_ordinal_masculine,
    -  :digits_ordinal_feminine_plural,
    +iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets("fr")
    +...> |> Enum.sort()
    +[
    +  :digits_ordinal,
       :digits_ordinal_feminine,
    -  :digits_ordinal
    -]

    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"}
    +
    :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"}
    diff --git a/Plausible.Cldr.Rbnf.Spellout.html b/Plausible.Cldr.Rbnf.Spellout.html index cfb3a3184..b2577838b 100644 --- a/Plausible.Cldr.Rbnf.Spellout.html +++ b/Plausible.Cldr.Rbnf.Spellout.html @@ -13,7 +13,7 @@ - + @@ -115,13 +115,20 @@ Plausible

    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")
    -[:spellout_ordinal_verbose, :spellout_ordinal, :spellout_numbering_year,
    -  :spellout_numbering_verbose, :spellout_numbering, :spellout_cardinal_verbose,
    -  :spellout_cardinal]

    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"}
    +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()
    +[
    +  :spellout_cardinal,
    +  :spellout_cardinal_verbose,
    +  :spellout_numbering,
    +  :spellout_numbering_verbose,
    +  :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"}
    @@ -138,14 +145,6 @@ defined in the Unicode CLDR data repository. Available rules are identified by: Functions

    -
    - - -
    -
    all_rule_sets() @@ -186,6 +185,14 @@ defined in the Unicode CLDR data repository. Available rules are identified by:
    + +
    rule_sets() @@ -288,28 +295,6 @@ defined in the Unicode CLDR data repository. Available rules are identified by: Functions
    -
    - -
    - - - Link to this function - -

    2d_year(number, language_tag)

    - - - - View Source - - - -
    - -
    - - -
    -
    @@ -418,6 +403,28 @@ Functions
    +
    +
    +
    + +
    + + + Link to this function + +

    r2d_year(number, language_tag)

    + + + + View Source + + + +
    + +
    + +
    diff --git a/Plausible.Cldr.html b/Plausible.Cldr.html index dd9599586..c9ac8d8b5 100644 --- a/Plausible.Cldr.html +++ b/Plausible.Cldr.html @@ -13,7 +13,7 @@ - + @@ -141,7 +141,7 @@ territories.

    - +
    @@ -182,7 +182,7 @@ does not specify one and none can be inferred.

    -

    Return the current locale to be used for Cldr functions that +

    Return the current locale to be used for Cldr functions that take an optional locale parameter for which a locale is not supplied.

    @@ -193,7 +193,7 @@ take an optional locale parameter for which a locale is not supplied.

    -

    See Cldr.known_calendars/0.

    +

    See Cldr.known_calendars/0.

    @@ -203,7 +203,7 @@ take an optional locale parameter for which a locale is not supplied.

    -

    See Cldr.known_currencies/0.

    +

    See Cldr.known_currencies/0.

    @@ -215,7 +215,7 @@ take an optional locale parameter for which a locale is not supplied.

    Returns either the Gettext locale_name in Cldr format or false based upon whether the locale name is configured in -Gettext.

    +Gettext.

    @@ -238,7 +238,7 @@ name is configured and available in Gettext.

    Returns a list of Gettext locale names but in CLDR format with underscore replaced by hyphen in order to facilitate comparisons -with Cldr locale names.

    +with Cldr locale names.

    @@ -249,7 +249,7 @@ with +whether the locale name is configured in Cldr.

    @@ -280,7 +280,7 @@ name is configured and available in Cldr.

    -

    Returns a list of atoms representing the number systems types known to Cldr.

    +

    Returns a list of atoms representing the number systems types known to Cldr.

    @@ -290,7 +290,7 @@ name is configured and available in Cldr.

    - + @@ -301,7 +301,7 @@ name is configured and available in Cldr.

    Returns either the RBNF locale_name or false based upon -whether the locale name is configured in Cldr +whether the locale name is configured in Cldr and has RBNF rules defined.

    @@ -335,7 +335,7 @@ formats (RBNF).

    - + @@ -356,7 +356,7 @@ of common symbols in numbers, currencies and dates

    -

    Set the current locale to be used for Cldr functions that +

    Set the current locale to be used for Cldr functions that take an optional locale parameter for which a locale is not supplied.

    @@ -388,7 +388,7 @@ but not known in CLDR.

    - + @@ -398,7 +398,7 @@ but not known in CLDR.

    - + @@ -418,7 +418,7 @@ but not known in CLDR.

    - + @@ -438,7 +438,7 @@ but not known in CLDR.

    - + @@ -486,7 +486,7 @@ Functions
    -

    See Cldr.available_locale_name?/1.

    +

    See Cldr.available_locale_name?/1.

    @@ -510,7 +510,7 @@ Functions
    -
    @spec default_locale() :: Cldr.LanguageTag.t() | no_return()
    +
    @spec default_locale() :: Cldr.LanguageTag.t() | no_return()
    @@ -520,24 +520,24 @@ Functions Example -
    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: [] +}
    @@ -561,7 +561,7 @@ Functions
    -
    @spec default_territory() :: Cldr.Locale.territory_code()
    +
    @spec default_territory() :: Cldr.Locale.territory_code()
    @@ -572,7 +572,7 @@ does not specify one and none can be inferred.

    iex> Plausible.Cldr.default_territory() +
    iex> Plausible.Cldr.default_territory()
     :"001"

    @@ -611,8 +611,8 @@ does not specify one and none can be inferred.

    string is any String.t or a 2-element list of String.t between which the ellipsis is inserted.

  • backend is any module that includes use Cldr and therefore -is a Cldr backend module. The default is Cldr.default_backend!/0. -Note that Cldr.default_backend!/0 will raise an exception if +is a Cldr backend module. The default is Cldr.default_backend!/0. +Note that Cldr.default_backend!/0 will raise an exception if no :default_backend is configured under the :ex_cldr key in config.exs.

  • options is a keyword list of options

  • @@ -620,8 +620,8 @@ no :default_backend is configured under the Options

    -

    +Cldr.known_number_system_types/1

    returns

    @@ -1557,22 +1557,22 @@ of a language tag.

    iex> Plausible.Cldr.validate_number_system_type :default -{:ok, :default} +{:ok, :default} iex> Plausible.Cldr.validate_number_system_type :traditional -{:ok, :traditional} +{:ok, :traditional} 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" -{ +{ :error, - {Cldr.UnknownNumberSystemTypeError, "The number system type \"bork\" is invalid"} -} + {Cldr.UnknownNumberSystemTypeError, "The number system type \"bork\" is invalid"} +}
    @@ -1594,7 +1594,7 @@ of a language tag.

    -

    See Cldr.validate_territory/1.

    +

    See Cldr.validate_territory/1.

    @@ -1620,9 +1620,9 @@ of a language tag.

    -
    @spec with_locale(Cldr.LanguageTag.t(), (... -> any())) :: any()
    +
    @spec with_locale(Cldr.LanguageTag.t(), (... -> any())) :: any()
    -
    @spec with_locale(Cldr.Locale.locale_name(), (... -> any())) :: any()
    +
    @spec with_locale(Cldr.Locale.locale_name(), (... -> any())) :: any()
    @@ -1633,7 +1633,7 @@ current locale is restored after the function.

    locale is any valid locale name returned by Cldr.known_locale_names/1.

  • fun is any 0-arity function or function capture.

  • +

    returns

    diff --git a/Plausible.ClickhouseEventV2.html b/Plausible.ClickhouseEventV2.html index bf6d4a2fc..1ee77bab2 100644 --- a/Plausible.ClickhouseEventV2.html +++ b/Plausible.ClickhouseEventV2.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.ClickhouseRepo.html b/Plausible.ClickhouseRepo.html index f9ec95a9e..ba9f537fa 100644 --- a/Plausible.ClickhouseRepo.html +++ b/Plausible.ClickhouseRepo.html @@ -13,7 +13,7 @@ - + @@ -818,23 +818,23 @@ pool to disconnect within the given interval.

    See -

    Similar to insert_all/2 but with the following differences:

    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.ClickhouseSessionV2.BoolUInt8.html b/Plausible.ClickhouseSessionV2.BoolUInt8.html index f993be1ac..c58b8a115 100644 --- a/Plausible.ClickhouseSessionV2.BoolUInt8.html +++ b/Plausible.ClickhouseSessionV2.BoolUInt8.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.ClickhouseSessionV2.html b/Plausible.ClickhouseSessionV2.html index 9cc7fbf4a..48e3990ba 100644 --- a/Plausible.ClickhouseSessionV2.html +++ b/Plausible.ClickhouseSessionV2.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.ConfigHelpers.html b/Plausible.ConfigHelpers.html index c9f9c7926..5df0f5078 100644 --- a/Plausible.ConfigHelpers.html +++ b/Plausible.ConfigHelpers.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.DataCase.html b/Plausible.DataCase.html index f0b3e05aa..722b81897 100644 --- a/Plausible.DataCase.html +++ b/Plausible.DataCase.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.DataMigration.NumericIDs.html b/Plausible.DataMigration.NumericIDs.html index b4bbd4b8f..0664072af 100644 --- a/Plausible.DataMigration.NumericIDs.html +++ b/Plausible.DataMigration.NumericIDs.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.DataMigration.Repo.html b/Plausible.DataMigration.Repo.html index 6c94f6044..5408b4121 100644 --- a/Plausible.DataMigration.Repo.html +++ b/Plausible.DataMigration.Repo.html @@ -13,7 +13,7 @@ - + @@ -1125,23 +1125,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.DataMigration.html b/Plausible.DataMigration.html index fe247f5ba..4fcae5eea 100644 --- a/Plausible.DataMigration.html +++ b/Plausible.DataMigration.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Ecto.EventName.html b/Plausible.Ecto.EventName.html index 64c3470d3..36bd2c7f5 100644 --- a/Plausible.Ecto.EventName.html +++ b/Plausible.Ecto.EventName.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Event.WriteBuffer.html b/Plausible.Event.WriteBuffer.html index d033c644f..af906f210 100644 --- a/Plausible.Event.WriteBuffer.html +++ b/Plausible.Event.WriteBuffer.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Factory.html b/Plausible.Factory.html index 7ce51d565..e40cd2c05 100644 --- a/Plausible.Factory.html +++ b/Plausible.Factory.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Funnel.Step.html b/Plausible.Funnel.Step.html index 0d757b9ef..30700cbae 100644 --- a/Plausible.Funnel.Step.html +++ b/Plausible.Funnel.Step.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Funnel.html b/Plausible.Funnel.html index 2ef3cc5a4..c1a85d736 100644 --- a/Plausible.Funnel.html +++ b/Plausible.Funnel.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Funnels.html b/Plausible.Funnels.html index 1a3de6a90..43c00f69a 100644 --- a/Plausible.Funnels.html +++ b/Plausible.Funnels.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Geo.html b/Plausible.Geo.html index b6beed284..ff8b2f298 100644 --- a/Plausible.Geo.html +++ b/Plausible.Geo.html @@ -13,7 +13,7 @@ - + @@ -233,8 +233,8 @@ Functions 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"
    @@ -274,8 +274,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
    @@ -304,21 +304,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",
    @@ -327,12 +327,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", @@ -341,20 +341,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", @@ -363,13 +363,13 @@ asynchronously.

    "pt-BR" => "EUA", "ru" => "США", "zh-CN" => "美国" - } - }, - "subdivisions" => [ - %{ + } + }, + "subdivisions" => [ + %{ "geoname_id" => 5332921, "iso_code" => "CA", - "names" => %{ + "names" => %{ "de" => "Kalifornien", "en" => "California", "es" => "California", @@ -378,10 +378,10 @@ asynchronously.

    "pt-BR" => "Califórnia", "ru" => "Калифорния", "zh-CN" => "加州" - } - } - ] -}

    +
    } + } + ] +}
    diff --git a/Plausible.Goal.html b/Plausible.Goal.html index 96bfc8334..19e84163c 100644 --- a/Plausible.Goal.html +++ b/Plausible.Goal.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Goals.html b/Plausible.Goals.html index 6fca3b079..82e29817a 100644 --- a/Plausible.Goals.html +++ b/Plausible.Goals.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Google.Api.Mock.html b/Plausible.Google.Api.Mock.html index 4533e6568..3a99bba27 100644 --- a/Plausible.Google.Api.Mock.html +++ b/Plausible.Google.Api.Mock.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Google.Api.html b/Plausible.Google.Api.html index bb557ee45..143a896be 100644 --- a/Plausible.Google.Api.html +++ b/Plausible.Google.Api.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Google.Buffer.html b/Plausible.Google.Buffer.html index 3f6113bcf..a91dbbd32 100644 --- a/Plausible.Google.Buffer.html +++ b/Plausible.Google.Buffer.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Google.HTTP.html b/Plausible.Google.HTTP.html index 17c318ef9..0f026301b 100644 --- a/Plausible.Google.HTTP.html +++ b/Plausible.Google.HTTP.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Google.ReportRequest.html b/Plausible.Google.ReportRequest.html index 24e75c1c2..988ffc5e0 100644 --- a/Plausible.Google.ReportRequest.html +++ b/Plausible.Google.ReportRequest.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.HTTPClient.Interface.html b/Plausible.HTTPClient.Interface.html index 221ff5390..c1388ecb2 100644 --- a/Plausible.HTTPClient.Interface.html +++ b/Plausible.HTTPClient.Interface.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.HTTPClient.Non200Error.html b/Plausible.HTTPClient.Non200Error.html index e19bc8351..1689c0aaa 100644 --- a/Plausible.HTTPClient.Non200Error.html +++ b/Plausible.HTTPClient.Non200Error.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.HTTPClient.html b/Plausible.HTTPClient.html index 82fc4f631..52b33deb1 100644 --- a/Plausible.HTTPClient.html +++ b/Plausible.HTTPClient.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.ImportDeletionRepo.html b/Plausible.ImportDeletionRepo.html index d149007f7..65252754c 100644 --- a/Plausible.ImportDeletionRepo.html +++ b/Plausible.ImportDeletionRepo.html @@ -13,7 +13,7 @@ - + @@ -1116,23 +1116,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.html b/Plausible.Imported.html index 1d0601cea..f2a5ab8c1 100644 --- a/Plausible.Imported.html +++ b/Plausible.Imported.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html index d81cabd15..a482eab09 100644 --- a/Plausible.IngestRepo.html +++ b/Plausible.IngestRepo.html @@ -13,7 +13,7 @@ - + @@ -1116,23 +1116,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.Ingestion.Counters.Buffer.html b/Plausible.Ingestion.Counters.Buffer.html index e786b9b5b..1fee1fb11 100644 --- a/Plausible.Ingestion.Counters.Buffer.html +++ b/Plausible.Ingestion.Counters.Buffer.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Ingestion.Counters.Record.html b/Plausible.Ingestion.Counters.Record.html index 50539f2be..22d88eef4 100644 --- a/Plausible.Ingestion.Counters.Record.html +++ b/Plausible.Ingestion.Counters.Record.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Ingestion.Counters.TelemetryHandler.html b/Plausible.Ingestion.Counters.TelemetryHandler.html index 1bcda6b38..8c9b5ffa2 100644 --- a/Plausible.Ingestion.Counters.TelemetryHandler.html +++ b/Plausible.Ingestion.Counters.TelemetryHandler.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Ingestion.Counters.html b/Plausible.Ingestion.Counters.html index 433218a1e..8e9506d69 100644 --- a/Plausible.Ingestion.Counters.html +++ b/Plausible.Ingestion.Counters.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Ingestion.Event.html b/Plausible.Ingestion.Event.html index 9a47def13..d0e5fb68f 100644 --- a/Plausible.Ingestion.Event.html +++ b/Plausible.Ingestion.Event.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Ingestion.Request.html b/Plausible.Ingestion.Request.html index 56ff0fe83..ac333e303 100644 --- a/Plausible.Ingestion.Request.html +++ b/Plausible.Ingestion.Request.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Mailer.html b/Plausible.Mailer.html index 4743d5573..3813fcdbd 100644 --- a/Plausible.Mailer.html +++ b/Plausible.Mailer.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.OpenTelemetry.Sampler.html b/Plausible.OpenTelemetry.Sampler.html index 31a52ce67..ff84059dd 100644 --- a/Plausible.OpenTelemetry.Sampler.html +++ b/Plausible.OpenTelemetry.Sampler.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.PaddleApi.Mock.html b/Plausible.PaddleApi.Mock.html index 5151357ec..651d46a97 100644 --- a/Plausible.PaddleApi.Mock.html +++ b/Plausible.PaddleApi.Mock.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.PromEx.Plugins.PlausibleMetrics.html b/Plausible.PromEx.Plugins.PlausibleMetrics.html index 5bff2b853..a7ab9783c 100644 --- a/Plausible.PromEx.Plugins.PlausibleMetrics.html +++ b/Plausible.PromEx.Plugins.PlausibleMetrics.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.PromEx.html b/Plausible.PromEx.html index f5ddcf987..e134d4f77 100644 --- a/Plausible.PromEx.html +++ b/Plausible.PromEx.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Purge.html b/Plausible.Purge.html index 2035bd365..7b56db387 100644 --- a/Plausible.Purge.html +++ b/Plausible.Purge.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Release.html b/Plausible.Release.html index 24da7217c..e231cf33a 100644 --- a/Plausible.Release.html +++ b/Plausible.Release.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Repo.html b/Plausible.Repo.html index d3e574b2f..5dd1409ff 100644 --- a/Plausible.Repo.html +++ b/Plausible.Repo.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Sentry.Client.html b/Plausible.Sentry.Client.html index 1602462cc..e0e9aabcf 100644 --- a/Plausible.Sentry.Client.html +++ b/Plausible.Sentry.Client.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.SentryFilter.html b/Plausible.SentryFilter.html index 412d1364c..9e4e60801 100644 --- a/Plausible.SentryFilter.html +++ b/Plausible.SentryFilter.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Session.CacheStore.html b/Plausible.Session.CacheStore.html index a1fdec921..e9590ac53 100644 --- a/Plausible.Session.CacheStore.html +++ b/Plausible.Session.CacheStore.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Session.Salts.html b/Plausible.Session.Salts.html index 6906b8de1..16b0fe904 100644 --- a/Plausible.Session.Salts.html +++ b/Plausible.Session.Salts.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Session.WriteBuffer.html b/Plausible.Session.WriteBuffer.html index 97c4908e2..8ffd89a3d 100644 --- a/Plausible.Session.WriteBuffer.html +++ b/Plausible.Session.WriteBuffer.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.Cache.Warmer.All.html b/Plausible.Site.Cache.Warmer.All.html index 1d6fabb0e..af35c3d1c 100644 --- a/Plausible.Site.Cache.Warmer.All.html +++ b/Plausible.Site.Cache.Warmer.All.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.Cache.Warmer.RecentlyUpdated.html b/Plausible.Site.Cache.Warmer.RecentlyUpdated.html index aa7a86644..0708e4de6 100644 --- a/Plausible.Site.Cache.Warmer.RecentlyUpdated.html +++ b/Plausible.Site.Cache.Warmer.RecentlyUpdated.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.Cache.Warmer.html b/Plausible.Site.Cache.Warmer.html index 6178d8850..ce7242b2d 100644 --- a/Plausible.Site.Cache.Warmer.html +++ b/Plausible.Site.Cache.Warmer.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.Cache.html b/Plausible.Site.Cache.html index fcb205149..c35a07359 100644 --- a/Plausible.Site.Cache.html +++ b/Plausible.Site.Cache.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.CustomDomain.html b/Plausible.Site.CustomDomain.html index 625aad1a5..b647a4d4b 100644 --- a/Plausible.Site.CustomDomain.html +++ b/Plausible.Site.CustomDomain.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.Domain.html b/Plausible.Site.Domain.html index 69de9732c..b520b0b7b 100644 --- a/Plausible.Site.Domain.html +++ b/Plausible.Site.Domain.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.GateKeeper.html b/Plausible.Site.GateKeeper.html index 743e0f660..394a99fac 100644 --- a/Plausible.Site.GateKeeper.html +++ b/Plausible.Site.GateKeeper.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.GoogleAuth.html b/Plausible.Site.GoogleAuth.html index f6908ce26..7a7f626c6 100644 --- a/Plausible.Site.GoogleAuth.html +++ b/Plausible.Site.GoogleAuth.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.ImportedData.html b/Plausible.Site.ImportedData.html index c6fee8665..b0cfa55bd 100644 --- a/Plausible.Site.ImportedData.html +++ b/Plausible.Site.ImportedData.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.Membership.html b/Plausible.Site.Membership.html index 3c6c60162..77daff842 100644 --- a/Plausible.Site.Membership.html +++ b/Plausible.Site.Membership.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.MonthlyReport.html b/Plausible.Site.MonthlyReport.html index 6e409e8b9..811b55172 100644 --- a/Plausible.Site.MonthlyReport.html +++ b/Plausible.Site.MonthlyReport.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.Removal.html b/Plausible.Site.Removal.html index 4edbfe01d..9d9c9b079 100644 --- a/Plausible.Site.Removal.html +++ b/Plausible.Site.Removal.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.SharedLink.html b/Plausible.Site.SharedLink.html index 0e7740886..d9006b104 100644 --- a/Plausible.Site.SharedLink.html +++ b/Plausible.Site.SharedLink.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.SpikeNotification.html b/Plausible.Site.SpikeNotification.html index d88c1a8ef..803984f16 100644 --- a/Plausible.Site.SpikeNotification.html +++ b/Plausible.Site.SpikeNotification.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.WeeklyReport.html b/Plausible.Site.WeeklyReport.html index f48c94adb..b51e188cd 100644 --- a/Plausible.Site.WeeklyReport.html +++ b/Plausible.Site.WeeklyReport.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.html b/Plausible.Site.html index c5f20cae4..4b57eaae6 100644 --- a/Plausible.Site.html +++ b/Plausible.Site.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.SiteAdmin.html b/Plausible.SiteAdmin.html index 43e5ce576..d8842e293 100644 --- a/Plausible.SiteAdmin.html +++ b/Plausible.SiteAdmin.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Sites.html b/Plausible.Sites.html index b4b5e8299..20130c45d 100644 --- a/Plausible.Sites.html +++ b/Plausible.Sites.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Aggregate.html b/Plausible.Stats.Aggregate.html index 46a5bf8b7..0bb6a8df9 100644 --- a/Plausible.Stats.Aggregate.html +++ b/Plausible.Stats.Aggregate.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Base.html b/Plausible.Stats.Base.html index c5b857961..df3a65cb7 100644 --- a/Plausible.Stats.Base.html +++ b/Plausible.Stats.Base.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Breakdown.html b/Plausible.Stats.Breakdown.html index 310572f4d..b7597dc4e 100644 --- a/Plausible.Stats.Breakdown.html +++ b/Plausible.Stats.Breakdown.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Clickhouse.html b/Plausible.Stats.Clickhouse.html index c5782013b..534a7917d 100644 --- a/Plausible.Stats.Clickhouse.html +++ b/Plausible.Stats.Clickhouse.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Compare.html b/Plausible.Stats.Compare.html index e745ee702..21c9df3d3 100644 --- a/Plausible.Stats.Compare.html +++ b/Plausible.Stats.Compare.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Comparisons.html b/Plausible.Stats.Comparisons.html index 147bedfcd..e8d4f6d44 100644 --- a/Plausible.Stats.Comparisons.html +++ b/Plausible.Stats.Comparisons.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.CurrentVisitors.html b/Plausible.Stats.CurrentVisitors.html index 2933cf6c3..1b91e1f9b 100644 --- a/Plausible.Stats.CurrentVisitors.html +++ b/Plausible.Stats.CurrentVisitors.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.CustomProps.html b/Plausible.Stats.CustomProps.html index 0e309d9a1..6f81e17cd 100644 --- a/Plausible.Stats.CustomProps.html +++ b/Plausible.Stats.CustomProps.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.FilterParser.html b/Plausible.Stats.FilterParser.html index 817a18214..ed448ced1 100644 --- a/Plausible.Stats.FilterParser.html +++ b/Plausible.Stats.FilterParser.html @@ -13,7 +13,7 @@ - + @@ -180,14 +180,14 @@ Functions Examples: -
    iex> FilterParser.parse_filters("{\"page\":\"/blog/**\"}")
    -%{"page" => "/blog/**"}
    +
    iex> FilterParser.parse_filters("{\"page\":\"/blog/**\"}")
    +%{"page" => "/blog/**"}
     
    -iex> FilterParser.parse_filters("visit:browser!=Chrome")
    -%{"visit:browser" => {:is_not, "Chrome"}}
    +iex> FilterParser.parse_filters("visit:browser!=Chrome")
    +%{"visit:browser" => {:is_not, "Chrome"}}
     
    -iex> FilterParser.parse_filters(nil)
    -%{}
    +
    iex> FilterParser.parse_filters(nil) +%{}
    diff --git a/Plausible.Stats.FilterSuggestions.html b/Plausible.Stats.FilterSuggestions.html index 41cba9809..1f999cb43 100644 --- a/Plausible.Stats.FilterSuggestions.html +++ b/Plausible.Stats.FilterSuggestions.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Filters.html b/Plausible.Stats.Filters.html index f1e31767c..de3d1eb93 100644 --- a/Plausible.Stats.Filters.html +++ b/Plausible.Stats.Filters.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Fragments.html b/Plausible.Stats.Fragments.html index 8ff6b3265..e6d05eea9 100644 --- a/Plausible.Stats.Fragments.html +++ b/Plausible.Stats.Fragments.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Funnel.html b/Plausible.Stats.Funnel.html index 5fc5d1a5b..4ea4e9bc0 100644 --- a/Plausible.Stats.Funnel.html +++ b/Plausible.Stats.Funnel.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Imported.html b/Plausible.Stats.Imported.html index 9d7c0c420..569b37b20 100644 --- a/Plausible.Stats.Imported.html +++ b/Plausible.Stats.Imported.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Interval.html b/Plausible.Stats.Interval.html index b3c9f0459..6b014a782 100644 --- a/Plausible.Stats.Interval.html +++ b/Plausible.Stats.Interval.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Props.html b/Plausible.Stats.Props.html index 3956cf430..eef443177 100644 --- a/Plausible.Stats.Props.html +++ b/Plausible.Stats.Props.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Query.html b/Plausible.Stats.Query.html index 4fdb88f68..097957420 100644 --- a/Plausible.Stats.Query.html +++ b/Plausible.Stats.Query.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Timeseries.html b/Plausible.Stats.Timeseries.html index b68cebbde..32b492506 100644 --- a/Plausible.Stats.Timeseries.html +++ b/Plausible.Stats.Timeseries.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Util.html b/Plausible.Stats.Util.html index 61eb676f6..9c37a75a8 100644 --- a/Plausible.Stats.Util.html +++ b/Plausible.Stats.Util.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.html b/Plausible.Stats.html index 0dad805e6..78ca7ebc8 100644 --- a/Plausible.Stats.html +++ b/Plausible.Stats.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Test.Support.HTML.html b/Plausible.Test.Support.HTML.html index 7fba80288..5baf6cabd 100644 --- a/Plausible.Test.Support.HTML.html +++ b/Plausible.Test.Support.HTML.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.TestUtils.html b/Plausible.TestUtils.html index daeb55e74..7f8b3a1f6 100644 --- a/Plausible.TestUtils.html +++ b/Plausible.TestUtils.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Themes.html b/Plausible.Themes.html index 1a019ac30..fa92ad531 100644 --- a/Plausible.Themes.html +++ b/Plausible.Themes.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Timezones.html b/Plausible.Timezones.html index 5c86885d2..b8c8d40d5 100644 --- a/Plausible.Timezones.html +++ b/Plausible.Timezones.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.CheckUsage.html b/Plausible.Workers.CheckUsage.html index e6d176fe6..1cf4a7e10 100644 --- a/Plausible.Workers.CheckUsage.html +++ b/Plausible.Workers.CheckUsage.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.CleanEmailVerificationCodes.html b/Plausible.Workers.CleanEmailVerificationCodes.html index b6137042e..91295be87 100644 --- a/Plausible.Workers.CleanEmailVerificationCodes.html +++ b/Plausible.Workers.CleanEmailVerificationCodes.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.CleanInvitations.html b/Plausible.Workers.CleanInvitations.html index d0ead0ab8..198dda9b3 100644 --- a/Plausible.Workers.CleanInvitations.html +++ b/Plausible.Workers.CleanInvitations.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.ExpireDomainChangeTransitions.html b/Plausible.Workers.ExpireDomainChangeTransitions.html index 71ebdadb4..7f8fdc102 100644 --- a/Plausible.Workers.ExpireDomainChangeTransitions.html +++ b/Plausible.Workers.ExpireDomainChangeTransitions.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.ImportGoogleAnalytics.html b/Plausible.Workers.ImportGoogleAnalytics.html index 3078583ef..c4584b8c0 100644 --- a/Plausible.Workers.ImportGoogleAnalytics.html +++ b/Plausible.Workers.ImportGoogleAnalytics.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.LockSites.html b/Plausible.Workers.LockSites.html index a7becabf6..fd0c7f6eb 100644 --- a/Plausible.Workers.LockSites.html +++ b/Plausible.Workers.LockSites.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.NotifyAnnualRenewal.html b/Plausible.Workers.NotifyAnnualRenewal.html index dd3dceb39..4d17ec8d4 100644 --- a/Plausible.Workers.NotifyAnnualRenewal.html +++ b/Plausible.Workers.NotifyAnnualRenewal.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.RotateSalts.html b/Plausible.Workers.RotateSalts.html index 40e4753a9..2f1727f07 100644 --- a/Plausible.Workers.RotateSalts.html +++ b/Plausible.Workers.RotateSalts.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.ScheduleEmailReports.html b/Plausible.Workers.ScheduleEmailReports.html index f7d233db1..71f229885 100644 --- a/Plausible.Workers.ScheduleEmailReports.html +++ b/Plausible.Workers.ScheduleEmailReports.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.SendCheckStatsEmails.html b/Plausible.Workers.SendCheckStatsEmails.html index 2918908c1..36dd00084 100644 --- a/Plausible.Workers.SendCheckStatsEmails.html +++ b/Plausible.Workers.SendCheckStatsEmails.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.SendEmailReport.html b/Plausible.Workers.SendEmailReport.html index 98d6aa191..01096d393 100644 --- a/Plausible.Workers.SendEmailReport.html +++ b/Plausible.Workers.SendEmailReport.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.SendSiteSetupEmails.html b/Plausible.Workers.SendSiteSetupEmails.html index 18ff83d2f..51675e57b 100644 --- a/Plausible.Workers.SendSiteSetupEmails.html +++ b/Plausible.Workers.SendSiteSetupEmails.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.SendTrialNotifications.html b/Plausible.Workers.SendTrialNotifications.html index 4a5130462..cc4fb1285 100644 --- a/Plausible.Workers.SendTrialNotifications.html +++ b/Plausible.Workers.SendTrialNotifications.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.SpikeNotifier.html b/Plausible.Workers.SpikeNotifier.html index e4e59e83e..152ebdb3d 100644 --- a/Plausible.Workers.SpikeNotifier.html +++ b/Plausible.Workers.SpikeNotifier.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.epub b/Plausible.epub index ccda9b0f0053b6d36a7d011f2a944603e9542a36..1c272abba598526cb2908b2fbea7ba23294529f6 100644 GIT binary patch delta 126721 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 aOhQ@7j0V7*D9HQtN#GP<76VlR>i+;`I#gl+ delta 126185 zcmYIvbzD^6^EbOoH%NDPNlFOPjf8Y}cjpQc(#=YDcbBx3v~-t%bV*1)u%GYm_3#HX z_netI=iUnw?>ToMpSU8I7*$yw1d9Xn`r{=RkNOViC08qz0eB(xzX3H8ji z!3CN7nQ;bRh_qd3`H`MG>j0)7JUj$yQ<%6 zAnrugK0mnO>)jgC)90gZ;y1udw6qf4%U9ML<8*X%gd~~CGW@1G7(Dl;srw;v-jtmI zo(8)jG61Tq#YAHs6(Ybehekh@tNvt&ju{wd5JiPslNaV-i4s-1hQVr1X|rh)$~(cL zswU>-87xHpj45L75m)5-BAfgh&VXdV*bzrv$9$F2CuxC!zV&yXP_fy&cOu9B{DOUe zA4urqTLC0`8Q?%8n0K=9_+Lj=^rVhrz^x<3U)f#MhLFyFsXYp7>qfk}R`7vWtsW5W zAu=lqEhWTsrP%s-=lsn5b>hp@qM8uFHGJRG;(C6`9}O~-$3}+5wt%nGut{q$%4pW! z0VExFYpPFqdJn9CbkWC#TfgUlu}ns!ux|HFlE>C3VHcH3g}>M&K!9 zSUih&&6MVi&z1`Bw+h;{JVdcEWsTDto~{U024%IJSoekIEnMs_5A3sDf>QK?Ylm9V zzjd=W{`s;yA=~^zWE86_S#?NyD0rq_K{rLQOdm}hs+ zi9UP4(+jB;%%sOD?kxUP(#raQ!kt_=lc6kBzA9%EpYgU~EMM+4Z8w5bqrH(7DdwV2 z*TKOwwE#KFqBLUl#`O;od{zHZglhz%u@T;;McdDIF)P(eezM1)9bvt_3&~2iEpY7_2laLn}q_8 zhn2KO3&ZU`{^prN8oUw8TrN^kbQ{7lpq6Ejt{}BKbdmL-H;Zr+oL}0`Dq9d(gDKjV z4iT(tH}k)Z&-Hf_sZ&dl|3T&oo_^4(m_Gg-<^UwpJ&f90# z4X`jUIe3u3Q~+W9{LfM7b_*v4pbGZWD9~%4`6gJXLKIwc4fl(}E=pq01}h{d2_CuL zeMJ~5)VN{s-#s0uK=!!3eC(E0EyQnnw@C@7Es|u2Ea!s z!^8rp!+f1u69NdozM5t-1wb15E7PU}2!hH88vrI=pF=Z-G2rm^wKYFj16ZMJF*^X_ zp)#G$05FshaR)d;WorBZ*U&{vz5rsNQ}4n62~cJ<;(uC(F#sGCwAc6IQ6(3m&&w zrwCw#2tF|sEzxQR#N+bor+LJDb`XyQ!lg7We>NsS)e+FuV^F0neK#=q+$s1oVf%+h z0>AUL136F{$D17^)^kE7P+64$F=75R;O;8e|M{Ln&K({}p0=9h?_zk9Migxg7aMa; z6tR(bniyBbdvqc|h;s6m{)>()R~P-%6GFl+CGY_1MnmeiN)G2pg9+REhCGtgpNhb|-=X*$-G3J`_zQ|V8f}#jImF7IUEwU&vI+DhzDNy7 z5W@?N5p&)3l_-S9;|#|=ojtpA(u?KkEF&VNvSm(2$TxZQWmu$Qsn#h>;E4bA%I-io zs{(g;u4rFh{8n@v(snR%A^AO?d@YHSTv;n7ovLJSX6-U0e_n#eI>RkP1}@R4};E#@Dn+98qVXJBO^*{v9=8dvJQW(pnw;8o{~cS!e|; zvQj~Sd-NzD8{BKuXI5`o?bq9aAI9NM5P!0e$z>ceJ+Kxj?e4QuD{XDAuUX-^89SZ5 zh1mavL-^0972WCyxCMVHT<1Qzium=o)98MH1mLgQ)pB&B~So8qm%=LLA|NY0^rQma3Q0K z_LBP^aP#i*yKWQ}+dr5o#zfBzru?|%njlEj&xmTjH>`zODv$3%S}Ujd3a?@kKFJ-Y zB+DQle#_!62rJ_o<~ak9m(I+D5g}meqx_s_N_&g(ueIjAp4>;W%JgK3;X#UHusX_D z%(wK&4OE&!G0;)@{Bgl6VBhXvw-_f+NXlpj)tz2q?Rz>p1si`kq88Kdd-8nwofIS! z;&-d!CCF#uc$Mk-Vji;k9aa_0$;KAI<3N9N9jpQ4xDu-}8{KVq6Ce z9UzEa49n3s_-6oD)WyPf zOOW~{mQ}>LR`h)-8#rbC3)R{RhJS+^*Ob3u@k@ zA8?BJ=hb}OgL=WDn$qh#le4AnSCHENQG3u6I`FXzYXgI&1_2{0fHLqAqq(sGUkzdP+ym^jjGc zQ^8gJ%-d7GrbO;#i}r@F$<^ERQH->=;+)|^;~R|RzNG#d82w_IBypU#Srq(Rf0$^@k~VlRl#sM@w-9hO zE{207)1|=X(YNZv9wTJ8VOWD)#Ek%mNYznEnCt!gp;vQcTA;Ce*xAcTR?p=;Y{w}tUqC0t0T zRWdr|M~wBZ2dC@9fLnTG9O*TN#l>13$xN;Dig67Z*3A{%Rft=c<3Ozj5`I3Z_KCCle(YmtkH`v~Iz(sNeOsRQA z8m%GjVf$lXM?}gl`&NuJ^A!vqo|ukAtkLW9MJt#1OqFvtRe7_0v&KPXp1EAY3!Je3 zBH^1v&>zf}+G9^=lU7kFVz*A-I&@bg`s-;qlt2TBfYvN1OIJ0^GYr1%$}_La`5PT*La%G>@T2EA{?lcX)wZbUXpliGtrWU+Tm?V zpPwGAtK&er6XL$tpOn>_Yk2S0PQkwXczqFrA}Gg|)JP7~=djN=cjG|BH&=c1!I#rk zD9zO&!UC_z9e4O7_$&CE(az7aPtx^uS(3QhR80TujEtpQV}$xG2g}8@)FB=g2!0r$k%1$ANGhX>w2pryY?}G_w18Tkflzo zY%ZLdVd`M48$w)~^$jB6cLX2eKn833czq7{DvCA$g&9{Xj z4|ni2X8bE?-Y$IKG6%f>-kz^cuJcwqB%V$Y3>iE-9NUQ{8V>B7L>Q~Dk}xL3@O~>8 zp7B_>=Xh^kd`Jq{o6%{HZS^Vld3}Hz zn_n67|k^TvnaZg|%rf7TERiFGf$_-sZ^Od(Uh#ZzB(_`@LkiyJym8`2PdW5MO|^ z<{D|B57bYxC;*k9?$Pffa0KdIWi^2s(2-mnp#E#Q+GGsWgAN#&0oCB4kplMdCnL&B zeN+yKuLa@%=dhP;fHY7sfCKOc)b$Q}0HO76GteK1js|u0Z^g{WzrH9=VIpN1!9E89;d` z1D^x@1r0b%}r^L0582g;z<0pnja zi?i#2(7H3X7bpgu*%<d*as(umeCn|JnLwI?r?QQk$>fKu#M#c#xffNOl4mH|_4#I+tjA4VSpdek#&P2I>#0j z28L7W_3rT?1+UTIyD^K5T=r%OxFS}% zk|i@Px;#K3gf%#BA8f&3DNeM@@{L=zzna%tlbjSOx&X}{`UlYpD&FnTQF(3iwwREq z+X2nXpX{TcUT#a{foYuI>PGHJY@(g+rN~;ogrrQ28UXwE7HS$hp&WAasHFoLzVxv=J)a30}`z_W3@G=aM0Uf;Qu7vAc=xwN5lEZ)MDC@yb* zLY`~(P+7C($6t$gpCL>(+`UBfF}fEq7o z9#7T!KwNEn*)ZGex)6!G+cYGa@U|G+Yc*^_CPpyGD}#ZU4g4I=E$EQ1m@giFNxQC0 ztls(aQhVg`9DklPTO1iD5{$wQXKJUD){rc=HRBhqPQE*eikQavZyoem=!fv>=9= z54mpb9&!&CG5)sc9&!|s_dP#J8Xa=)kA3stqi0k;%wCAucrT2U*}%X0>9?(StpX^m zS4h*Ev3pxqM^roq+$(l>%hIkYy;j_5b(PXWjv=U-wq~t~a?nQPY*4X;k;IZCf|s_Z zP+cUibtOQ!&u0nlO|Lo~`kYqvNjJ0U!B%zrV`;~o``RkIBabUO)v-FN2A4H!7vdl5 z^6OBe5Y){G*%T4S>6Gj z5jlhMj;24qxBl@)7BjP@VA1m|kJmd&G+_UJLs;(Xhj8SFdBb+_OL{w|-Nmu{ zk$FFNh3p2_{EQt2a;gWy13OPqYO~}pT&F--`wW)Eatb3Qlc;bLY)nw^*9Xb#Oa@)_ z1jXWs0%WcBPloQ-{AHFHOeIPg$4xRasFQJ(vEk+Pr6ZEmUF@Ip26h4TmiiOSQ7(D1 z9FV*!VA{uXM+pA;?+ebXs4reoiQx9{auJDMLP~?%&YqKI4dz%S;6r}=cbiG14V}-| zsY9b&tG333N>4#@cHy`lcN@VjaH_>}@)SEy+Nmz+?cZ^f0$Qs>o=7=ae^to1GK7GC z$>Tav^^05H91+W<79L2#EeGizzd16mWplc)UdEOopI#=r)d~hX%I}2;m#lX!i{uWc z9Gw2WYpnh`b{97W4{qaxRTdU0DKSLfDw?JEDS^IgNK45t?hyh{#MH73w`|O%6FMRK z<|jv8U@C>T*_^XQhwGjFDjmb;-xRgc_G@oG$+VU6m139hG_Y#!Re|Zkl3b=C?=KUXi`bT$Kk0A@25XQajJl{(hg5 z*qy3*bl0aPM>6F~@Rw|;AV})wao+V5b70cx&cDJa=d42z{%P(JKZy z5^C4+IBQgFQIBnpN~E`SoCAst#BUvdrEV* zFDDJ@cB+kj?#>iiA9G`4E9shZt-}STukZGxf1;1wTw~d=%!IdRe{RP`_Q;vnxt27P zq$zNK7;v_L@r`Xyq=y&PLd8`A-Db%sZ@TN<^A3(x8`oCb7j+s>!)kPj{{Di zAu?35i+W_>2T4w08x|3Y#2LN~94~nLMUv!Z@ER-?S007528v{398OXx`xGJ>WqIR0 ztd)`?3>e=TCbgy+Mi7!~1j1$YWEbt&omr^HJmzE!ft6?_OmUd@rrrHgnIZE0SlG9r zUVssUf7KIywWjq<-n?xD`T|XYtjs`1{}uN)3TVyEdRCxTbg&(EON6pfdl)d1jHm(P zU_AM2fl47>C!x#~=kX;y2^b3hEfEt*CFP=8;XQFP7UhP{jp|3{A@dLaTa+v|lEo+~ z&yt!di`A`Q7=No~YYfF%<_}fjGwp?aw-xcxXXHqFQ2dUKJ+(%BZQ2N9|GX$(fQeX? zHaE4<7;FIrE13BQyF?4el7Ju%Mgx)-Z90Vp(bh<9<@Zlq05tw|~RE$fGr5Skg2mc{VOVX|v zE%kTZ*Q6>R!n5S6-HPzNh(7R3Wo3!yx<^HhU@UST23lP3voKws8veb-s{_~U# zU9=G%bxK6&$VwYxq)^?Sg!x=twc%^F0~f%lHJ2bH*_X6TLw-Y*e3xp}x@ig!PE=rF ziH#Bg3iu zGw|N7S|wo>96@d0@z>RB>mTz~YDjy|wmjJ=vG$ozdr4D{D;}$CwlviX#OOK4SyN3B zz?dYT_3*{UrU=9TnE{E+U@iU-;QyvVg~iau3AC*^d}|zJ9c(C|8uXTII#4t6CA*_wxMUt_eJSbB6e5j**Zk;5LQ%UOc$J-$g6*GrhxPOdc#& zb{QLW*CWgE)hs_@;ysYu@-~FOUn9}bg;MUyA1F|+mWIDk?)^5>nxKzH-I*;%6r4DN zhlcX_hVGY?WfQa85C0XjNcEjjJg?C?D)H%P6)$l$>h3?s>KQrBVw==OD_siOyH+6(v@4~8)ff@@Y>SP36cdz}z?2v;n-k2o}KG0I;OmvmK%k<%rU zi_V1}R!xncb#sTCWyXeu8KGb3o*Mx;M2}A;>!;+v4}!!uShcLWvpCg-Deo_Z6_&>a zGTl3iHa)?7ScTR}jYLF>j3<37MOc%(6nZ>kTt=214n$6i89NT9jeL`?VAA`&xX4s&%JEzk5WP#5rsIMSJkOo7wErhT&-DFoSc)^T$z85|A+tDl|K5m?zqg0Ikw)7h;_5PQ(5Wb`>IQQ$)sxN7ast`Zf9D#Q&hBAwAng3pehyX=)Bu-j9v0P({2aTcOh<7uM#}N)oX!ha zgk1Q6m;sIuGJg<0pc=yK50U_H52TOtzbym`>Pog){P@uLzWqn&EEX58&A}$wzy6wp zJyZ7SG@RDAs)iC%8EM}$LP{B^hGk0kqeLa%8Ka1+k&b=)CJC1-Wa8FjB8tLzgqH>Y z@tv2}wL2l+3~KI0w{YVMQ6&4x0P0PFiP7U=l@{^&yibhW2UR17ax|0Rz%kW5CEJA} zx3C#z>Ploi#-l^}I=D~jzqTXZSoePwSvJ22=*EGAdREFXEk-m=D$Y_s#GcJ-O z`CBRY4>!r+rtIH#`>>N4WLLGC?Y}14KOtqAMlns{1?g@XDLG7GIn z=1q&OXjR$k%HqNhQpRk(z`8*?n7Y^0GzC+CE-nA=k1%VB2xz(|JNEq4J&r6BMbP-N z=fv~wQw@BzS%+2~{4;uGPu4=+jRg29(_yReNMJF(CTubcK|6DKGDRYl$dju=XNl+d z;~iER>tE*2>`2|XBuyL(S|=#tvN#HlogKlo_%^mD2uLg9q2iRH|G+QV!*gEH5pFg9 z=Xsx0$1uCu0FjbpkGJ?4INVpZ`wnsMt(T*mK6k&DbI}s{E_U4~KBu~|{BGH45yi%~ zc=2Gi?m+8#ziF}Su>aEOW6#0g>E@FFSsca#-<@Z#K@xKA?9+I~17as+p%9Blp{#kZ z9voL5rMMD`Vze?&gTAJf3FeBp4$<>V`e6V0AZ<&w&bS)TwDrERT#r(?3KN`-W&L4) zGDa`gVD{glnp-vh>@~C1y#jJBjEX~g$hv>l@O{pk+d=SL1A!3Azn)D_kp=ii5t!yt zFzDldU`sHl70N7p1>r!MlPFLq6ddzN0(nA5PQQT|p^ynt7Dye6b~zV;-n^a$X%4Lg z=|Yo|?H3#eim%+afhJ&~CkF5e2})tmVPJaoVPFU$#utD$keW_-B=Cy%{>y(p&htrE zkXj%W9Mg#O7KuA-g{-EV`+Uyc9b-tXrdVZCQITUNXbeeF77x`;GuhvBi+@U9~m_KM|EnQX*uiGALA=9(4E@|DRTnOk1Hk72;h*g34p_U`A zSOfz-&Ys{(MvI4tKk5;BL@7%sNiJW5Z)a3|aKA*rxb5507=t|yf)%VM-W`dJrYN)} z-el9|Pc38UkLV(61e%r7$-%p)^nKy8Jf&j~TLojr*FxU>%ZvdGGEWhHlx(3ARltQW zcIq}K@fX8!-B-!3sS)@wuUO$i#eT4t=lX?WQo(5i@|7c!5+_ittjDsDcH1?HN9oZM zOO2+OsuX9Q1(r#YfxgS|I|UczFsd6SC6BkW=q`l`mNNBs!E4p7Pk(TU9BW0*WyM~y zJxF%XOF1cGs-r5oMO0wBb%2BAt6WybMS;SsO;i8ZVGEOq(487DwEHc!89beW-4~TY zL`mx;H@H}p>rg=^ zdi|eFot-ytueLj+=W>`dl{K&S@n)H0{DV{5WFKQ0WO21XNTo$;WuL7?lZsT|2uxGR ze%M~1*-!eQq;yq8;8?+q4Z{}JHwq`0v@7uq}%of%650goWt&Yt$)9EImIjrjDchjIZ zb;2YaBzU42FXdVXVb?tT`Xqz4iS#y;osJ7nJnSOwd)|m9>hk~#OiWOfk^5;$csYwb z+!)DG?capZT#4$F&=uHz#)Lw6zTR5}Oaa_fFt0e!QY?2%V?F(#lbdPo@rW!`veNrW zXgkklo7gmuRWBJtD}bAVc1D77EH%RJd?U0DgS#s zg|6z-&(mqy*j`-?p)sxVO0SgZK%RQU;S({f<(xr??NrBys|lA>H`loH-y7V%p*k z6F#X*ye<7QgtL)!EUie&WH&Qk&5@Wdp`uCIBOoh$)!HrnZaal)k)%^lV>o*8aU^*- z`gj{*Zg{F%|3$5O23$?iV2&f!eUt#M`wF9`zoZ)Rqj&f5pBjEK$C{uDiu@TSVasG| zoYiE?EE|h;!dCM9BCnX^*g^VH@zc9#yiq<({d#Akb(60`(Zy4 zWW#jrYxG-#{Lq9!IMV+=Vz1qc4FyCSCzO%11ZY@Kx`Vz8Z z_0t4Q!ZrO)_hun6>7b;Bj&t*L5mqMGW``M_c>L91wl||du&$fR2EdbR z$2hMRhW>kV*Sg@*%{_wjm!7k3|E%Xoa=nNzKbc$%fl_%XqP(bFj0sE~nDS}4NFCfnkvT$}# zEk78TWcUj%oVw<0;Pp1X0MqrkU)26fF&o%j;8ef#(7@v+qUKtw1yV7#41M}uW__jL zvR*PvivN=}>UoxlpYfr&Hm|X){kgyB!`@+2;@WwQC-*xNdu?*uDoXDW>obdg!du$ht>3fDP5yB2s0C+<(E56el<;5% zk+*i2T=K8wj3Rc0N{e{^mL3f2+w9q}a%}H8Q~0(^L^Twdk6aF>Zdm3wlIzMN83^Sel^oUK8~V5%!P` z^&<0Pc*6!B0`fo-m|)LFs@?SXQ+evxsGUhOPK28cl092)SeB}f)snmnF+-se#y`;E zI>oQ2=+5>8JZ6K+vq7c=rTc%Kr$Q4#r=xwa9{TZ0pGmSAX1il+J5>3$`L<7!d#_2S z$ox4;H&t6;6PB0}du$J^=)ABq*3eI-`1Q(=F5j9sfbPW_z?TY3B_Z z^)7H3WW}dd1OBL|saohTr&yhF#x)RF?4EP-%_7p8-7bY>>MbZcID*ID23zTYdW^)J z*MEvzFxYw8a!d`}P{J_PXS=+k!$TX-A4F{S;Z4F!7}X4hsxUdn9l>#gvH-WabH;!c zdMGDM^o5DiKDQLTvQODBYbpcdFx; zhX@N}2frtj+1lRX2~3oKnC@rQj@>iGS*Nr|=2p%o<@ABMX zhDOGg@MNJeS!G#F*ASzCpGNIu}HoV4WhE zJilQW|E$C|%ny%i^#M1MT{pg6_aD1%?2Wt4-kBOrO-!Z#xh){>h>FRFwD!}p!Az%} zmtV4;O=~QVy8ZjUcS=p6arQ}XqUV>nz71En|8Ue*eZBX&!MFD4TAkX8i=}~I4pFm` z%LJa_V7EZQ;U)P7ejvkf?ifLe8bt*mk^?FpZDun&a)>*HC8{l#=wFV4AvBeW!JW4} zr&$k^r%yAd?@w<6jy=K5s9HJEv8UiTYga@UIJu-&iIijSzXCqE9m4+vn(XM;^Z!`? z^}M*X{HvK2)=o3YF0`GPxhVg)i*Nn$ey|(}&al3+$t+b5=0a;txpW#*(QOe&KXXZ5 zZXVG*+4+WjPu^{LdW`qGey=~hiam|b{{yXgMkBXmdm3iu9yR`0-idQjDe?9%?=3Cv z$hJam=MXU%47QPNmGuD7o8)dL^qHgBm6X{uhhzP%Q8V7*y$q<9y3c+7Pw75sut9EcT1K$V`$26znT|QYRTLOiq>9KW7e8HrZC+D| zrmwVOrw~u(Jk{X#yMGJkyH_u<9rH{$J%^A7L$vLY%dP-;9J#TZ3F83p8x>bcB&2@Z z>6#}aD@kfcdH;@djd6t-oHVd~mth>Vz2SOR#GTa#vi3^n`gK~bd3jT;?a&pvD($Nm zKcP*<%Dg1<9&9)mTN4(pkHo4h=~TTy#qAm~KxfxfSSI&Td&HuAzrOE6$H+XYDVemP zjQ?2CYU{1Dea1(N@}l}a`3jt{;g9{x7Ol$8o{Qg@XzyD~c`54Y!STc6YoXKZn^Bov zWQ3K*3nAl_l{7C;>WBeGR&S%9K2S_WnEm*Jk~>*_Q+c25$$#F80#u zpX`B$g^WLdkRdERFU|UqCr~mv_yt@Fm@w?&(AtBEH>bB(^@`xgIqdsvf`QTmap$nw zx5FxuNiIks=zF>$rCp9ERtd+(5Rd*n{Py(5e|?o7x!&2&O`@#pYrI0=Lz=}Lo&|O& zibK5%ufiuXyrAUJ3D{r-&e}Smx0?zj+TXa?#Ct5!!jrUl$Nq_NjU=P;fN^XPJ?XRA z7-eC(cGE5-hCkDuq++81^@A7~YFCh3in?4|X!*)!kS4uINy2ZXbT27X7-8u+ZYA*$ z*#fbP_)$2siYTf}XKBl%D7!TI;1Y>Zq!8pHaHEN{@+M^~cJkwlwPRMolAhJo890^U zzSqW={m>fQ0g4MnMBIYjfd8*Mj$mE>cUW&fEO~5Wd>06|EoY$cIDQ`MZPF(}0ndoZ#Z| z?_3^7D{~7ak@J2;?FVyku52|j?V&-aTF5@Do%T=kH$`0u;KAS&T^PS!@K^O87AtYy zjJ5@KKCNG1i}8QQHgV8NkkNl#FCfXc6R^;OQtSx z5)9y+in;mOz*vN1a66>Yk=6Cp(H0?0jvw;>JNfSfsS#g0 z`C#nxbn2~8%#T|ptlvKhP=)>krXxS0EyQ^*GOaj!)WELN@yl@1;TvtZiv)aWSfL!4 z9$HlX_mN@AxsW&HTJo28ryj9(=dZsMR(F5Dct~4jOY|26?vTzO>uiJ|oXm~&B-D>P zDU&zPrs|S@x0EPfem)-{CFhoR^cshou1W`2c9r`5wTa+fkgzDEZC-%+0Z%a-qTKu^ zs=!Ye0gV&D@YFf0=M=(!+j4fIxD5?$3evV%cNV&c^CQOY_Mm<3`qQAe4{ib)j`VRBIwN1|6&Aw8(pj?-;oZ?I6vU3#y#nM1^%{ z6lBd-N1g^g6*~S)R8M5H4(3Ch&IiX+X@N z<@vJn89F`KP%16y1?mRlD|x;X)t`VWyRU*$&t`bfCL=0DOROek+ zV(7$qB)`kYAeb2cj?iA6Kq;wZy8ZWcnPpaDVimr2RH9lzJy5RqgXj34jOK9~vhCl# z5KUQU?AXD5FQK(aRgX-5bFko!r&kBz;QO&s=Zk53+R^Gb!gveGv}L8Mk588Yt87V4 zrD?6foksY}u)aDKTp4}`@_|RDKJy^*h%-||{*Qk}uXeAl;WBS3o}{YB6-^<@=_lg6 z_Itfj%mB5}w68g;Pg{4aSL^p{vQLN@Qw}J3d zoCQ1F%`_}ffUidg+9Mb%5jlCzDfZw6hsSqjosPf>f#UE{X?ba(sSMP^GKKp|uQNhFcR~)|0Y?G>(Hj{DdA|`1ySiD7~!)Mw?o~sA6H7kz%Eff2jo%vH_FKHWI z^3NPxPj&ry%0P6x_%_vkQ~E7;K6n{>q8uH|-7$o$g7pU0)g zm|LrW3v1C=JQ;}DsQF+?xwPecgmXn@50`@B?WMQa7TSzk!e6T|A|^%@Eew{*?j))8 z+0^1u1a}6OE!h|7bb_UjHYcAE{|62)xF; zJ0q~QAzn%;;oPnY2`E^d49F(W9S|e`cOQ7Gn`aCPs@&;hNRklMIbA}*Yo@aAf28pC zEpcL?xwRnAy$iHFl9?YVwrw2Y<7%?&BLBsd2;Oy7l1nReU|qd(mS32oCZTYQjUeGA zkBRDV8xXkjePdzE=1Xb6!=l@%d52$axIDLh>T@Wx!Zn%ge>bPk7EWdETKe$J_U&AB z`ybh2UMHZqo68DPU37UDTW%!B{d>qdw-hTPsOeAvHOO~}Nev9-&gcEyl|MtVSThep zEVQq5Oy%2a`tkNYLk1)l=3()%&GB;nV^7D{%mRD7zNRWN+*cPtmcxF3x|1&kYvj*L z)5d2kTL{aP<_vc(B6Iv__Q}RuP)$nD*f1y~!U#(bi}adL z6_mhX(KI`Jxn#Gh8;dt^%&lcvFOh`pMjv;r9}{AjMd5<`n_(o~x)+Gce#4LXG% zPd|$2ZAAOB#8XkI(-1KJH0J+_a+XYp9`Mxj2YYo`l@?}l=`BueG%rlrP!hbr=N31M zslu=t_s{M1zt{?RitrK{6c)2_1>%d6`-q846&h3&Mtk}bOTMmSj~CNuQ>5U7Gj=}_ zsD@7z_(a%9omK{P4T;w<^^H6^O?Dx!_qjf6MrvBP1f)fgTQZY;_{4k5nvfSE95Cru zh8?0o-SqYV! z3$C&fnG&+)pa?lK>5P6F*^;qzMM^57S^hah0T|1rKZps+NH$Er5Z(qQRDf|%(ttCD za%E#0Y{{P@Ptm9f<6W6bfOw*{>UhV35Y^DCzv3l}NIJ~B|DyX*e+L(}?Sks0dX0*&f417Nmy?Y{51z1-GL79IW!|EqP7i9iT1qoEbvew{$${ViuHMX(wv->W z4z7(V)+1f|KU*1R84V%F|6HWFOp}TYdOmP(51gTpWZ%<0+k2qO&(YU25xF8Y4P+*$ z^99dwlaep&*KQEZCyv$!VQ`>Y#Elq1;HOQhrpR(^5OOeZly{mtGrpHw)a(uYl-+z! zCKcnI%teBsf5<1GY>f(rPwX*rLIpO`ouE1CdKn`N(oST+Rqq9K)Z*?jlYnm^<;r@M zqvh5uVn?d2Rd^eRm{CNY7*_pf7_K%=KB7g6DMR3_P+VP3q^* zY@~}KB|8L#hSm`0jT~o=(rm%mF}yEhw2d9P2X5kHw6ez?_3I&*I*0LRC@q#vfma7u zrqz)0E#c~f^W#X-39hHDdgJrJYN5sjmChp>Q9kqf`}c!S?~iVAi+TTD*dT8msLwB6 zkN-RLEBL3Ox<=bbcN-W{RuH4ETusJwKwdl|3=3^7j!D4!gP^U&LzhgxC4m=QL>B-< z1i=b`BY?Qdz~X=s65JpWGO!e2lXmUHAJ&(Jb?(&@q}hUP`+V%r@4)vbR}%%?xa0_> zk6|oKY=0S8qD!;shy8?O_dc4G77Y(CE^61+aOUFr{6D6?fjg`)4YOfm+qSJXwr$%s zZfx7OjYf^p*hb^VcCwk7-E;Ow-0!}Rrz+B8g^-9(@<9K7WJeq+a3-z&|y#6N0B1MpMevx zdwWl0vRymB3-i&V`>CN679`LUWnjQSb>F%?s9CE#yfA<^r=g4|fr&;jdN9}|6Rj{2 z5W5&W{KJM3dCt1BlW$V~W8AdI{TBgD&=G*$Y zz1>gel5dQFP$Gq%1s*s?PH_-r&Zv(hiyXUJnJkeJsIw4O_x(+9eHRd+uMhS|n*1Q5 z?VL1lf{8lYi2OEGn4ziuHfVZ{ilWqlu4bezCA$HSjhUP%97bXmsw_@lQUuD>5HdJ2 zTSaAt8eHw>?e78k7`0k|GFp@UKP{RfNn%ye7{OaWF6d9RQ)xvDW|`yhh zZ-vqnARyWrHqgr3d#(eIt`Oo%6UqHt4g;+kEk^#w8ENIc5@bE`EVHn-;y6et0S(W# z7fF*kr3O4TlGx^_Rxn7(vXJcY)gCV4294ozf#sB0H!LG^4Gg~w6}|lWo@l3!cb~&s zrMFFY;r;x@ZySe#{Vs9KdGE>6z)Z2edZBK8fM)R&H2~8<(`&)H?BVKhvu(ZYs82+*;BQcF^ToG!sT{S@8>h$livQh zLhxu%Kg-;+b5Wc}*<wbqb>kK~FQRvk!g)FXAFOr>jJ0>^N;D7>u?6ttl3=wI|%KD1K*h;;oZOZ00;ItUS zZZIl0uDHOswO!kAiPwhpmx%O2>adPpq|%_sOt9m^m103jPkHYiMBM!H*8#TmW+MF7 z2MmWOnX?PZnN>1I5jf+d`L*O+X?+x-cEa}+s4Ta$^Zr+R2q_9Br{BB3MW$H(F|<@W zKvYI7$Z(XA(*?(T-+Jq}8G!#@Uv54*@MsY1Ttb zQ9)==9B^Lx6Q0_`%~@NY`J+3nXr5sqKV59wlKx_fg(5tH1$E?rTqZx$0cKN^yPCpm zi{J|>dRAbIDX*3;v=q1|j|lMWjdQ7g(Ji_N)+m}RJeLPMm(Jze351H@>du<$c76Uh z;XQ#mk?zOo3DsKT;kd9P57n3*yY}(o7pL*RfBdt~Ee*hjC13ohxah#Q#EnMfl}@Ny zi|PK_+)ex(60P%S``GImASJ%>DDtPl?{sN@G*r>EjJyWHY2zfCr$jE>Rb6k1$cv?f-bY~Gtz`ULxy zp@>4Op~KU_T+wsYg{77NcTXnEr!gr^Kz(WB^zm-;ue&epNe;XUq%5si9$XvXJuRUH z^f3jI<6G}OpFDfByJHJkoYc#Z8X;gK*i)6W^WWHS)W_hcblIMrGs*H%Qmfw{+g$J`xN& z`_#;`rZ&82Nh%>T1?0_i=wktwVR-KDy=Yt{{w?e_$I|1s(;WXamOU#+m*1Rn0QyeL z6X&<5CE;39#ax%~87OS~BVMM4&VDPc4s=A3yT-N4YXXh1aj84)_bxUhZpKeI9BwW> zAX2S-nOUyCl5%}d96uMqW?Pv=V1x&8creTsbxqCpszZkF|E)yZzPtnMHnyXLaTRS7 zgQ|OHaal3?e@Z=#!cO1g{W=4g{&1^Lo(!(7Hp?OL{IS=4RtRZYDtAu$y{Z!+c6>!6 zi0S6v2Bz7vt_HrIJH-dz!PirvmtqeU#gOxYva2#HVnDUG)}m~HI`PyT+cx8FoR17S zgEY>}SYqS}2IG#rESI7e8q-h;L(?E7*`PBZi-*UG?P`o6O2mL)#4>R=D^Eal< zNxDPns%5Vi!;miOG&TZxXih&Ev_yMq4ZOE1doB3iP}zq;>FGBb7b`mL9d7RCJIFM) zotf-8pgC<#5qt=k?_5%m|Lj$lK1Uk)#GLYlEd$_I?8VnCWx$@CEAz7gQneR$LP6xf zV?UD?8FfiE*%G3nc$bgS(f>p<>~j91`?sirrH$H67!!kU`_{bu+TgVDyhxjrr~U-oLwnFN<(&v1qgg!C5XJH_=%fFt_)5LU@$iH z4wqamrCql#H8MmGi+vlQOHYzP-O0TD?u<&z3J^)Zrr;epK}0C^o74=Du|{ zaoxKfIAK>~cfT=mqrcuy6tp@AXsCn0*9nRYEWJh1<6b2AY~1f(*oCS{^u?o2?!6<) z?QO}Qb3UsRZJgXSYY@)Zi|p<&?Db$Gp0F`$axH5b94is_pX4n3aDR(?RDAJiPd7BZ zinL+WMkF|Qwm}X`c_FU>5HK%LqWj_r>ocX4K4Aa*&1-Jjefhw89sy+s8Z|NjlU2Lh zBcA?9Lv`3zLwvV+3=n#JZ4rzA_Qr4+$TxjoPdZabMx#!}UstZT!$KNt9lX7M1H@JG zPe|Y?ANV7<7GK7tyRS@8s`d4~4CCTkd9}QW%Zzeoxtlk|2d^Oq-S`-No~e@#;h`Qo zK<<#(O+`E@rAi5ah>C&_oiVz5O`n6DyjZ4$nJ23!sNTkkZS@P9i@omdx($&wSUCKBTGtI z)AW?*3zXrhhN4xfrtX|Cydn8mzP$wC9SgKmo;53;e0_WN+d(18^982<2tK{A;nO$w(?7?nZOl4_%l z?B1(z_}V<6o(t0P06QfhjH5|Pq^y}mj#eM0=ca$jc80dSwVo({D9uDevZ*7VLfL<9 zP3W(Ly?SoEUc1@B>@}H0Xh$8+heWjGJr~sB1lejc;h1Q=Q>G=y0g{5?^LV|)cV&jM zzCada2acMWaF6O2htI!W8r%t@N>2+N5mY;g1o1+?1rYXsFJYea0QO9C9) z$khG{$b0N>CB+RW}MU*3jw2SZb%>(eyLcireaad#uEn+3;XXDf3KnZrh=Y9 zN{0+r<#Fb_Pvzk%=oPntcJ~ze9U+A27QFDr8 zbQ-l{*Mp!xn_3k!zNCaF(--1g^QDyLonvx+bRgf8O#2JT@^mW8SNO?PO~*mV>euWW z45W&*k*-NmF<7PmE(~2E_`jljQI0p3Dbs97;v)#ZV};9+AysIOHQT$*e`HnYb+)$T z*bGV(_!ijb#phWWt>W%)Pz|XR5~8de;*HUc(E|ZQ(*tht{lAoeCk(Z8mF}e$1awPz%qsUk ze* zrp9Sh@1GG#A-)v-zva}!OwViLr4{*aT#OHfyKJ?$%L^ICy%0)QjJ%N-mlso3sF9s9 zJ2mIIvCRzt1=y~#^MPV~6S6*R#z3*{i=&t-JQ`}ZDK{4$;bxSV@{b9gKhUDafktTf z^a+XkvGN>fW`bl826Z47xE+&ST7LVRB-;`yD-hxR1TZ zi&V6(^IuC6AezsGDw>m_Qhjlz&KD)F19%(QE&lWaI5FRl1(Ctb&*u~BZ`c{^^;L}0 z#A;{f<&@;zs{cy9`=_>0JkyCo{kn$}{Cq_~mYT-DD?OxF>!(xZ_<@=Jl%>yZ!-u=# ze|K~V*nGDZeSQ1U=2!2;!H2J>r-vY3_FzzQzYhTJ_MXcPKk}c`t^ar=tTOAY&G%|V z)@a)TZ5G?hMX$XN|M&l)@n6BjZ@P{Mt6CyJvNDH4Q%QV<>24Bni091ot9I;{h7MIC zdBvb0vq7&JzfG@+_?X(6MkA@b=C6Fl8l&sc&dZBe51vX(ALdB9KdyW?pNS$&){H0g zF_QC_OND)x)kFLFv%$l4Khej#Uj>2E{YoYVuq4_qeD$0LfcMjnMUj!pB~Zt!NR}_P z;m>)D%OnYDA;oiXpbHoy+^Vxa)-uCn%sd4dgdDW9y(t!#TBZ~_u2{$#BL!Ojv86oL zaIM-q)c{VqI?3epK0}NqR`I30(C{&|FL|o@g*IQz-z;)tj5|8v}OU-h7z& zphMX{?lYteJ%!vO&m)i9dZbj#gQ1UWRI*f0LL9^S81fVgm41IV2R!+EEXND#jNSZx zalCHkZlzz zpxcX$-v+{VSfY_bw^j*49kIcZX;wdyL=%Vmt3biI4JZn($ zA^aHJI6*vz^ZxsAdV)ql+e!1pj{a|6*6GcG+;zmIHaE{+hHivz|x(clZ9ZqvJf#|`e86p~#s(pNPj42xC?b);5 zgKAdeRuX6LRX6OZm%?|;8%7A6*%%1ApIhsUIwV!pB$$|48Dj<)o6xQVeLjCd;zDV}|UbzG3O3y$4eT6kF^?(7=RP0F;jSL{d7jA1gjq z#g9H+TSFj{c79d(5M?m4I$pCx>ltJuE5TRzht~%=E}>BIfQzvyEkcYeyDS1=&b4Jql++xk7idXM^OJ=leYFkDtFQmjQHcZM-sFpo%=H_`Ak`FCwfG%g@6+*ZO1sJB9nz$4JRw4zEUTy_?_7=2mSm9EzZdk>2E#K#84?~!pvaYDD`0~!ynu$ zN%RL#l)FGZzpk3QM}tpA(3@2H5!r-R%Z16r_&)+_RrfY;bHEhr;YbjNdI&JpuocK0&`g9g)Y);0_~nn#uQsMdm&Sn zJ0_gS$55lPh&pY)oJ>X}TlPB|^|Xq_(f2e|LM6H8pO2a}q5?_-#aDugvCay5&j#tc zcN?EMv%KwzEm9SE9y4!))q84m5~gBc_!f9npi|)Y0aRjvfu`8#M?H${jl;;D=F8~F zK+cykO8wL?56L=|P-1bi7fzOYv>Fz@NpT^mT;@PYnpD9N8If_R$IDQBURG{Vd8yyA zoKk3jhFsn%$QmMo9%h9c1X|W2xCk`A)kryz?&q}UDjFYe=s0Jf$kjnmpX^FS!|=34 zhNxmIP94gKs>_YlGm-N%nN#pQB)N?O8nlRUu{&or>?^!bfxX0(Iz^PTGu~y*1kqLd zsO&8$I8+oUs{Vvm(#B|m9EHAKP?&Qj29|i5f#B)>c}#gkX_aJ<#W!Ny+COk|sb|@O ze)X?xqBrOLN z!Oyu|u9XkrsOy(Sf!vKEtpZE{_*Ifn7rF7sdEa0M(FH%!l?Z)=oe{U@s66^ha`V*v z&?R)Xn120p$I-2XDVp+-QoJ7mGpBz2$8YBoT_YWIt1Jx?gpd}|FlA8U9q%SJv?Irt zZzd|RHhcD;l_j3?qPGBi)1&4@(FWtXcHd%H8SjLd%z95&n(ktU=vNZMMEgfVP5AiCKHM}!I`BeJ5wNZilM_Upfz0Y#cB3mJ=} znM=`G{t>@pUdL3Va%ANXgo+)VxitThi;nR z7y8E#dTb#^86F}=heLc5;%(fiS`ne#8pPo^Xim|C&%tRKhOz2%%m?EQN=Q*j&LELt75 znkPrfbQiKz^xqC7T2y5|26CWE#*eL}_@rb-qhs@RuASjWXw%-qAyM~-T=k07MB30C<0^Y)diVB{OZ#CqVY5@<@Y$SKDK)MF^f?pq=mSL{b@TII&BF~Ud7#%#W8Spsi*BbE~7+O;K=_;?Zm|5oDk`7aUq-5@3n(P%Q$W=G%1q06LlJl*v~ zbk3zbXHV7vph~Fs`)=N+C1Dy7TyE@6aC&kv3Je!n<}hAYc;DT*NUysV9SY-1(7Y7$ z8II3>h08rn7nMWoLm{r>MufE(djMuOf&OAWe$f-B-)ieH8BnnEA7p1 z7)3;T!mKiGDVR)_3*^*XPgvL&Bn0@y@RY{&4=8>BEHm(KLgpzqQKtWCV%^b*4{JQ5 z{W{z%b0EV#fH0gPd@7w}PikR_y&h`f(3rexg1X+=2sHMIB{EOEToIN)Wl9V@78VqIVG!?$Y4>=vXtu zq9qm}mp)a=B@xL-cLai^B={`TBoe~R_?M|nCOCU2hX6X%;@f;ql(&$k5>%encsO{h z^EXCqyH6tr@!Ci!iW!!*vW4L2Iv<^kak$YgMD#x^?jG!HE znGV)(^H$VB!z-^(mu;N3wB{m6nI$(^ff1#$d_kp9N>zyAL**D|`({L8Xbef+(24*= z*MQH11zAl{U_DS5fCBc+ma;!Y;glGW%VNY<`{oLFmANaNkhEG7*0{PEaF>?jRN=o% zsBHu`ACPJ_u|$uDq}yIkIzie(aOH6tuTCJ;8>#W(IAX-e)HX*@{xgZF9+N#`-%w;G zZA)(At|+EZUAhqXxwl%WN{cEo<@o~Os_x*dE&-9f!&@_0J>$|$L%u-+N!iW*4Z4Jr zyRQr{9hN!Xqhx|{t=U@wswi2CutTrbb8v(@_zi(&D#`#!ROMaFXKZX(*vP=%K+>h} zMxuKf4GdD&&UsB0Z}fU@5{q`;L69n)cEiKrq|@vJ*27vfU|6EAo=ZvdBM7*Lr~1+I zN^{AP;{L<5KVz=AUaQ!wqtldzmSz07Z3-99G+AGb%0l~sCDjCMJvOs65`CdO+4<)B z@4V@{qPYqpix(^zB$93dD+5^t63UDt(f4wve=B2A%|g~!vTYxXvzpt-J*=;Xq|OUyQNfTfu5Baui9(o&bq8aWt7hD zjYFprRrMtD;C`iPuErrVKm5Hcu>fVAHBiwCW6dRXXyc}v${}v05GT0-%YB+I zYip0!LC=cjht9uK-w)@GY5l8>W%n{b6_q7V5Opkt=Zd_jv}|KskJ z(PXH`#kj0Hb6B~$$y$%K>KsiuWMsFJZg7Vo$gS`~*6s5&KpbIMe*OgP_CQ!HMYp_q zf|y_t+f5c9#jiod_KAMb9Hcwgo&>V$;^yQ3N*(`$t&epE==l!*qgHs$n>yl}oHl7J zmf&xhkxkogQ1eUWdf)arFtu*CNh$h22TI* zH@4+z>I9#$-qGzM7Kqzp8j0xnmCR7cAvq3Ig^XsQ;dY zz?s#R9fH-GmbFkuJzXTYO!kvQ<}B&0#27E{<1(JX30gDa1!x$~t@jnrA8PjBywm|g znTSMhQE>-*98{|l=?b-&f0nu$R}Y-(3d33T`PAfF(!k+NH?)O&ns!zKV-Zl@HaVR4 z!4BHnGJKb2@x8@)jna41{~bLcGAE`dTe46GM>XBVY_;u`vd(g&OQW6ZKqB{dEdG?5 z`z!3#Rd1#&C|h6VHoo_p}+A;miex>pBa!8KG2 zLMZAtIOf-Qr6FtlcbqCm6_NpO9d8aY!9ai2=iqQ-cSYf#d$ECysFZXK#%lF|Ym+pI zU85y9@Ucsb9g~V$*pYn-6_9bX>GniuY-Lzn23C1Kjv2tAoWYz>r=##uvD*@$rmbWtDYCg~ zM9DHI_JPIL`-jsKJMOxm5d3|a6h?=A-0lAR`s2W5uebNx)QH^nwo-!ajeC1dX~S1z zRPpwM0^+iuZe^c(omy4DY)@P0J9Tj}tz;ZAc}>x0RPw@mx1W#P3-a`z%3u7sa-tue zh+|(Dn}}SdkWf-q@(?v3dBPqEQ?>F|YIN#K)%tw_6ikYl6n(uLrdhX3<%83$!~A1v zVr0Mfo5rW@qM*=7&s6Za${hUrM&?%hbmy&@#)snrr;Za696t$zb0r%%rRy^dvJR)K z1u>)IMx=dJnxAL2cEhq?hP1fI2uoPeF9*M8p;CiNuQO15J*b;%k2`|(L)sdLXPTP(&%zJEm z;B~dp*VCtCbL%7awzp0Zx9pxO5DnkIWR*tsmj~e87qR}tlc+AP&AI1HQwovOZ||Zd zZfKWg+r@TZv^@&&x1&55R>Y1jhv`?Du~2)oB*4$6eK2ekv>Mff{)6hRN&bgvumNwQ zIV`hjAK!)?-#_lOu*Z9n!M;{fpp20sXpFUR2iFZsS1fYq7JtJ-WD_gluDo@urjOL@ z7XcwAv3C)`9aQZ4XPqueTmQ_CX>0pn>yn`@Ok7N|jFc7lC0)hiL8mHeqgC+#WFlR= zjjt@nBQ+K_yb)1i*Je||_5(RITZz+N`%uy;rr%U4CO&6frd;YSgW>M|MkhHDPy@Ggi^{EIV~ec7 zPB0)yW)w&gn!@8oWuA;mX@fy00=g{`91yn~rudZ7#5CIPETo`Nll_$lBi&vWVmeSP z9LbH3uvdFH;96VX-gN(pM_ULP6DP<)D`7_*r;BMQ_i+wl84fbZJ7pskJN||6!+<)v2)F$smdBf6Go36lz~9waa76;fwm_O^*^P56D2U))4vHer(VgvJ`3A`@r|2aoD-BEKNMGxVyuw0 z)I;b74q41xg-1eq0(~G8k5}in6U<;$g=DBxEfiQ1v&SSfb;b|*J8O+UGTPY_MW(=a z&dEUXE-_2Wu7j_!p2K`B>oW?a{S523W>!9|3xr1mLU+TuYuaM?dg}%=+~jCQEuji)TdX{OIZXt~)m<*lQ^i`}A}=y^{#|j7Q9o z`AMy7izb@=;uM;$zerM&EiTp?J>B~D;j;C$lA|JU&hC4s`&6mC=DBFUmO-eMS_BVyo+9E zEOxSfnUjtRrOim4J~V!+{xdFQHjO>+z}_Du%%t;|DOANiY{4uoIL-o?Uw?+592BCg z$B;IT&b7Gdl(<>8p8qD6WhWh(!hQ>C{uZVbGR)nEB`uq8-OaH{|1_?v+E(kBF-}FR zc6Yf$j6YFg+21fl-Z5X+l-jMJC4|)_Lc+R+_HqT%{Ry>7jGru0*x5ZF{Ev;$Ga>y& zGlkZ7g1K{vP3a>%BEcT$Uo&@6$ui7@Ajq)Ig+H{JlW@Sq^y$+xsE0IM&0fi)?hra6 zNkh(s7YWXF6cLPe@jTr0NFKF?mZrRIl=(q&0kMmBwpjM{}9{K zc{SYM)T&=vJ?HA^Lt`_RR}4%2&^|ssCa%1IP`P-E{GE7C1iL-ROw;3Tw;0&QxAK!O z(}-Jf$0@-%$qiPV?(Xj&_%ox7ePvL}s_zfG>jy9Aebe`h9J|{p1FD!?8>Z>fG1bpT z#r0h>MNlZqE0q z+gNZEtzMnG>S;|nx>crrC(13yR-Y#+g>g2kt${meO8hf$zVJZ9bniL&=p>!ccu22V zwepE+QnNT#{C4R6FYe8P%vgo&{K42r8=86f_W5ucLN(9+L#yVzxAx=%erbt5^u>03 zP3RnRV=PDC&QHJo`p+a`lo>E~B7@&9l1>8sF4_?D28)_SZXx-xUFtpGP!&nOBY z&&+9(e6>?bl5;e^J>pYqCfKY>;<=s%-bt&R=;e7|#Ig|^<`aJbcZ&tT>O6^wils6= z(9r+j^=z+_cC;HU9S3Y>1kAw0{2*aQoERu*RJX;&Yu0>dsyCS{eF@1@1Gj(OYX+vG z8LW;c$OCX;%9n7T!qH?D#+egRyObo=@I{ub3#t<*{{intU*J8_pX)xFrZ1}BpPlAc zzHFq{*Hs*ncINVB+_*Ro6Li~0I?YeSRz8+QDxNSoaKZb-N5w_Yp5+8pp8v(lRtJ5t zvP5Mv;Mua;D9rK;Sci2}u{d~|bRqJz#o?f_Km9S`ivgB)ilasqW;Ox0glJRHo(E>) z98Hbgp9-A$Yc~tSjiB?2lmZtjWLo5T(JhKH#asAB^tmUXY0<9WP{2|FDh9iSgBA|l zyLpv>l4=wV>LI*&dBa%NlF!5r?rh( zqJ$mZ`dDWA{dDP66964`%t|yAOp*NMU`k*mqmCcQGvRw_1eV(M3k zh!1T)gF@ZkTdm6*0gfq!s*Yp^4d@F{nuZhHA@+7~Q^5i};X-J`3T1?aR;p7)DM@KC zq-Qd@cw&TID5P_d#_LXm;*$UP8;}z*PV^t_{&j%!IHUSim`$#+3wx?TrUD@zmm};; zk-Lqg^~cHn`HCgNEk~r)`P&k4r#VA=z>M_9jM>U>a-GPR!6l}0SVq1#Y~JsF*-e!uIc7b28SxR|u(4&=RqvBXBQ9jw zMHgPYo7&ym{;!i(+7*5*_LZ_yURCRmDB6zammLD9a#ijMkCHc?$qkGOyLORy>}0)$ z_1UmrllX?mo9Q!7o1|NGRPnyzsOD#8WnfKOVrR(i5HMac7aFOuOxYDIi&>NW3dEh< z-@ZDj#NuziuxV#GlA$mCtAN{X&CqV7?*%W@#m@S0QCBJ-8QZv4{(X;#8wdIxnIiSa z6KjP8qE!o5QWK(;mt6fmjNHVwTYBWBEl8CG<6T3wDQ0=GgNd!%mWakGytQ%}Od4cS zsru9|3{aN<>kL|7B*4%z?}R<0e6@l;4P~uKNIYc*W5tzDflRFm$Q-iY?)D5js3gF< zHedNVknwqcuSO3onEgy-)OUbvdXZOPP%3C^j zI4L!ND}CcPnsrL>yEL?0B?oglK9|Gu;-w0M8LB;dp}TLJ#zfT7cT;@f(fMUXW41kl z_4+^dKz;o`CFH)->PR{+U+?FEG{BkVfnOjx8wL?rDA4L_2^*A1fq@*kkeF;tIoX@G zK<`FE-9YmlzLhb8-a6ELY9f0VkBH3~Jp$FqRhwdazIeB3T(#( z{I-4CkHVzjDq7;bpEKlGAtI>e#G;v8YNkc7qwA~zQ8O?KPI*2 zZy!lAa-FJfao@;p{$E({i)b5DQxq|9tynR*(R6`9T5wU|B|0EM0;qW)4^-7#jCW;P z;~xIq`q+}_>~#o!Mg`U0(tv@zf^|$cx#2>7m{75shPx9S5s_PI2?=*a+gj@>jp>XLwDtCttzgY2kGg`yTnl#P;Oooq>hoy-iR(|0RlJ zP8U|X?;ilZ*&nKtrbvp-%JOHJS@IQ;xf1-%3a^mx-b<&?Mzt2qdOHy5JpFUgjr>q)D@Oq2V+lx8FKb2Q|wm_%`dEz>ou<(tMH&+;e`4fG zJrY|8VT&y}F0$~&_{KZ8a5V9|iMJNS^u{x^)nr3SK(QpL+ycCU3Bgs)Z?&`2q|Rc` z?EmRYK6>i+5!52W$7ZNg$}OPN!98kjPGM_uHj1v6;6;WP-Z|3vvrue#I5#drUJRow zDellZtar{FN_cCB94Z}&I9uLW3M=PA)0f{unvk(0V;KdXvI=wWaGG^;XOXPfE~;GY zT3A}!na?Bj4hRw%aZ*D}lV{hrlmM$3$$N6L1LIA0&pJ z$OfUS!1~DPhyR6E0hj;RHA_QVAl6C7ho+Hkz!{G-zRPirqJ_InlfI)g{if1OCyqox zOQ~nHRN}8LC|?O(V2ZDO{2)X1VJfscUwSrNs2v4+0uZa|jO@jVYc_;E{da=Ba;(&f z-e^R2&fIwE=1vpia(7<*(_LpdmUe2TTsTD_pTKY2j|274F|gGD*%t4m zf@21#e}EucNF7?DFn19x@y_U*Sl5W*$-*gH-xAhwX6~w)vhe z27NkT_AQbI@C@txwxX`dM9LVo=ek1y3S<6MAa0T^eAw*k_{n0{;S<{r}dGVkouV}+8h z&-?o)GGHJ_EJ)BaXz%x4N@z9ONITkKS$AIawbE_kU-n$a@+k=Uuwl14UT--r+39pC+OpgJr14$oO>WjT;Gr;>1UUKxHj_rDk*A7CuqFoGswNSY#0%eGA3`TXb`nzyQ1b+(rG=(D*&7+i zMX`kKF*TWgxt8))K00)i%1Jo*YqUPik z?SXjA`HrzuOzFLOCvjY<$l92P5t#3(UwRlCyv((W<5pSwO?w1O^!t(V9cl6zx_3l0{rHq;Aw8}FgLVV7`-ig3R^xai;{LWQpD}p@l)%oQCi#a6E^ipbpVOt}74ga(e zy5Ej}H0EuM%TC(eel)SK>oC+=ol;wjJK1-WFQ@Ctz;-}Q%MusWB>$+fUJ=79o~)db z>#{W#UgX#kVa+ja@(u#RF+|M6&xD6++@+f=JbEuSD$5f&cG+dUj+nw>#~FkjYx)rPGwgEoNTDgWj{?wqt-nt`|^|Gtr;IN^caGzvb*Lr(9jsjvhlJISqNP)w7R7n1b514&HzXhwSM8_+X0D%+WxkqEa|u%`E)|*+qh)?iVlw0 z*&%KS<1PvAlzNY~i!`odZE`4qW}I#I=s!q%A3G$d5;@k|e3nu^y zn5{Ju{RJ>7Kx%1}F}T_kWAvFMXs82DwSaHte9$mykP^_ozg_#G*q6>=6!Xk#C)a<&Y9MDFHk5aLQC*~ahx{p)h*IhAD=8fBmX~3?c!gM4#t6gT zNWzl@SjD((k8Tl@UA@^U|M+P^+8jnmbg@K}E@pQK|NjZ2CpEA#P%Oc(L0U-ZuXUO) zOOd>&kb*L!f{mf8bDDq5wUy%QH4S?>gur1qxXUczZQS%U}!F7%{sAVN) zqzJRj@~SQzD0|0U-=<70B_#eCJGG$Oisty8t>WB3OztwJ`+pOSQ2~)GW+GD99XrdB zp)+>p_i9p^$Y>`s(mVt$!iSn3C+T7}lW2 zgUS%dLsDV6!!Eacg!cB?b=0QPe}Hqtqtz8&~q2FK-1JbY2pqIf&-#o^INY< zTvoEtWOR&N`{k+WaN)JdRA|Vt<)Lh7rawW^V@t*>_-907$F5I0o5~3>!IC|SH`Pgs zLEhISrKlm}E&D}CYGA-bXvmO=Cy)fHkjN9WBRl?#C&~$k2m3JLj)o{$qy`2iFPx>m ziO6uxV~_2l)e5M-Fjk+0Mgqx|$p$7|(xbCwh_MG}%W;=A#Ol#J11~PfURjqos6T@; zAgE|=u*?R)K?uFlTsLC8(lZ)h`^6vW8dX~?_h-Ox+?lT;WC{W^p(g~PAZ1e_UHMxF z(`j7Ms5BI?esa)#|JyGz-VZeRyRU>;7X3B& z*l#kJQp2RhB!UQ8fU~xaogvg!9ImL5AT+5$4I+ZWWkqAjB=nF*uYSp%|LUpv3rj^L zrdYtut`RIm!k2j{D#}CsAEYOvUPXn)l-`}5-j+U{YLlWt)|Vq&9P=GrtfnzAz||`J zT&gVxGXRV%n@SU-0H7~Aui3oVn$o+JWjq59O0$*GxM%E1nd^es{p1(Bsp2TDs96Yu z8PItvT9j$N&96KwP@zUmMr`mAQxfh>?K{=3wt`ow3M|7st3o-o;QC%kK(&3p|7!g- zJyW5|*L@uPpMvTo&Ngfigi9vGv zeYo5>4}jg41Gy|0m|1e}?%s8so9k4#cVPSUa|i^R4+MJ`h+7@-hAT@SJ&Piq z&&5N_S}-s>#N-`TFZ{Om%I9d;MiuR*lQX8d%Ix|K*zFC>wZhrcvI@}Ge`F8Bj}Xqy z_S2A+K6h1m^2f>a^b0ok1Bdc^G%KuFh+wNU(46lK0fL>0af|c@v=Oxp5LIY5X5(cn z*MKxB(`1;E9jaFeGVCpCH&ch8$NsONZH2nb&~Eqj{RVEE%Zjbpd$R5#4WDQ`-bEI| zeba@}ST#n{WG0iwg%xZKRkwCc3_VS9_7YV~jx`7JLNZJya^=07GN7hcvafMQs)R^4^3`In8C3zsNj9|DkHkP zfwINqH+-fk4cF`P(4AFGR~#(*d1i+a-Xm^$RHMVT`jo3;Xp} z9%x~-bOEw|TSG*mQ8b1?N;Z6je{Fso6^}w>G?J zla{xDq4Th(((XVYtR0x`7tSW{jp6xUq-(sz*l^F^H zgx3(vsxm2(@2%D+;(1O8+tGeuCND=8dmV8YQqYPcBMdkyzCWNVpYb>kpy0=~;|+0} zk{sGBG-un%trc5gm#b#^2Spm;buHk+sbS{jS zJ!!S)I~;5^CS`TkF=heVqs_ywn(~?e=C98u#{aoqmnUP_n2^3-@yZ)|GHO?7rV&&H zQ?6*2=oLk%*y!R}5kK`5at%23(S8J4~i zh-9TfT-^3PBpIVn2+!YiB^9uUk%kTM(D9cm0mZ$}hhwx8 zPu5Sry9|3MMpA1o9-7awyyj|`l+@GMvIEE^tZ1Ycupe7Rdn6#>$?YHp6s9P|s@V1M zx@BlMtlK&<>wT4{!>lUVo|cSOY9P+hp6ZQlpN#DLj}R-$k95VnxfizTHZX~4Zd|py zB<90Y0+$pE6#OAu9>{X2fMjYBu;P$Hqh_JXxt^WrvgKzaBFQ4uV^Sjw)pp3r#rOlx ze!{aV%bG#rzIUh+YGy~t^ufg}zH7kpgM4Z>WtjMZ+D$`bX0D0b#jN-?)n&+?whb0^ zY<3+uStxn(X&kGy@IrB2N3+nxild%Ug+)IksHD0XCUJI79jmngyl6Vda=o(%9}R|^ zZc15%w{%wr$(C zZQC|FcIVG`zH{-Pt9@5v?@_DPTs8N6pXopH@PHqt_ZOAr`gh*z1kw^yjBtI zBa^zA(5sMepyHWqa0eQdsaCFZ9a%80{EyySGxF90WZphvcK4(0c2{lxg|slh*Y3G3 zT>#4VfT1n^(d>h=t$Bwl*X^!91^RxXh!Mi*b@Bx{kbRC)g3@PeL9 zS1I0$CIJ2?H+Y>eYq!Y&J96s_E!b_-r$fXIU!R-T3e*kWG^8bBIv#iC>hVE&m&+v> zX>>UUBUg251UQqOy$h&q6h!O80c8gYANu zkAo=fA*gCd%r9O1w?K>;_0~GJiyjpHsxY3Zjyn?+^I3>0b5)n%_C~}3*^)FgxEGr# zTe6;FW?NKPb5-Ogp`gVC?nA~2PjOjYAe!K*AtzlAyK`;&b&-}Od6NyVz<}o3SXTbj zCp^?;3joc>W0Hf0~(l541+@_El!k+umvQ45uOf)5di z76w~4n=MMT(y>s1I7%)wTh7l8Z+*Qyv1=ri;(A3MnGz96HP5?DwZDbR9iC+niIy%Z zO}{XxlQHF^T^H_q)$96m)S1yF=Mv>2!id6BVCx*CKX<+>)af;_78FDf>UQk>hB!N_ zXZSCdq4CSfCN^UdBQs$;ejo)ZCqJk@6XhrHf2{iyX!paJ>o_U*wR+b(*v%V4~lKr?0OZSvXj;kl74V zzd>T{5ma-v#sL2`P=1rri@|ZTjE}A;wQlpliq>>NqP|o1OPa8LV9jF=Q>H|m`KzDR z1CH|T-;|W6B_3n;h31h+`mv-<>=_RZ_o`(mMq%H|JR?i4^YEPC^A{`9PdP|H{s?iz zYrvf6YuL+jyn1m0h>Qx?c;TPbeX)+!CFmXJ7EEdeH2{sBA;u@%>!a{*)MhR4 zin^f+e&liBVOVO3Wk(>s<2v%bB~5wmF!E(-cW)d=IWigUnRuAkp$urdY7=5gOi7We zWV!vu1wg_*l*Y~Jd}V;PWpI-K%Ouu#AN2yIpwYQ-02m+$P10M>goOC3J`QW;IatUj zYGy`X2lR^}wr{VzK_3Ytqs)9oA%Mt7g=oUqkjKIp2eeK8V?=RSuR6`Qc?s~Ibd#^$0Np8w;EuI{+EqUbtgPgv1&fzsh_Qel z8I&ZU3=d1Hr=ngi`65gLE7OmJP2Z@XKh!n>d!$r~*dk3nfJ{hcT$fEa7624HU@XfV z0IfCC7#~4e2me<%72Waz~xHS8`4$44@wHs~(BRP-OacDaZxMj@D34 z8{M(RGs%X2g;~kCCvGeuYNBes@ww6D0eps|ir!=rbMaUZxWvS4eAxCLipsB03VMaf zLH0&=mtH2Bm2kPSf`fiK8QVi;D^!OVF&k{!d^c0hHOKp=o?qKa)na_Tw|0u z)qDRKE4y)L>6>Z2QNV++m2C{PR%wkwb_XJlSNOa>+!)3QivJL;De-)m5njd<02L;a z-6L!^Yelx&;*2esK;k54H{Mh=dCh|}K=KZS-OwGIEPD$pb>>z7#QSPOsqBzqy(1 zN+T?4o~d72G8j25J{vg)D!u$~&^K<8PkS$|in9g=jxk#d8I(m+4BIuLO&Jc9O1v>G zo7Ax#77ehP7oVpo&PUi)zWN9olcd0=gnF=ix{qxd)jKMv{h(=8Nt^F|0Vn;8xkmiO zP+5>dZwJd;Nh!S<(x4d+@)Rz`@dCxMkHf^3r=|BTe zj(L8!-U{1q7i+n-0gKwZ7U$rS6p$6YAE<_tmoep*<0PT_(iYwh;Hj_1MLD$jV&0`i zMYOKDc71cq+Ei($PS8m*QV}tdW@?f|D=dGJh9z2+!^jBLEbTsSUQu>HXBf<+$8D$l zR}rH<26xz2vz?TNp5a@30+uH|G}h`w3sC-glh5&>l*+|sWrwYaF2WCCJutIoK>O*w zr@wK-v?{S`qU+zCExPN@*(vwJ!-?pRPXy{`G%_r;nI@q7Cua zFVVtZzi9r;efrTIuvFY+P<%k&Pgk+Yq-};t%zqTeKv2EteC~e~hwOh8N1yAe_f|xz zA#2Qa5v%bOA>3wX(g`8fjRy|k{&jhLefsi8p@JD5A8r!xAHkW)R=NC~dNFTIXUB0D zBKQ4%d|b*+Ws;+G9$}E5!5hF^;=v<&U?iWB(2G*Pn&Zd?U`h+tzD!`WI|?aamVl1t z&*Pej7^4^ECU_H=(p7~~tlpN7t{$g~VrRW>_NDM(Md$JLm zEns<3ECrxzvT_W{C20>@&ELZIHb@%XecNecxj7GKmZCM9N@ ztWN)j?oTZM%N+nLDZC3EEG|x_?<>1zPjdhkfvHxfulkGb7!d{0y1LXyTxJN2q&_TbgPDh#mQud&lL28DfW9R`T?AI3IU@mH^AmqN7(r56 zNd)D-!K6m+bnVZEOgFSeM@2?)_V{`q!Fl(9H2b4mAkiE|CdinsAZJ9%q1{Jd{5?t^ zJjaj5(}EBd4k?UofIp~qj12n=F*z~JNUZ->5p3*z8Bu5wM+qCXJ_^YOvJmMf)2J#{ zkeRy+=oVGUryL%+L{#V2E9nT(kst3m8k%Izof1d-%hM2(MBol0A+c-!$MR(YOMjZrOxnQ*-D=4F-a-7b-N&s>ZWvWLWHPYrhXpuDJ_iLx zayXnWN;PgZh1EkM8gtd|5SNlh9m1N$OXr6l+}MRK>!@NcifLkTKK2vE`%dfI8O#T& zS2e`v)V>r?#pih9y5=;*T7#@ezR;S*6OPD~P&~5p@C-=YsZ31$>d(7<&i-qeii{cx z_zUa!>IKVpsg#j?dS5?62nW!Qyt!OOA_b;PyJ^AU(+@0kQje01W}a|0lZ}9VP>eqn zxmhDeX~f%*8P`Zy533pPgky_s!P>?e5kYorHKwbc-gZn!Y|~PhauX-@_oQ^hzJ@hw zic1otUUxXs5DG2kmVX_&0&mKs9wTT5C~X(X6weOAEFviUBoX#4U~T>7hqEnD=W3Aj zEOAYJg6;0nJ?YaA@5S!E|KMywFZme7#>xjC?htZt>TYr{T?Bm@)HQy6pWrt|Tr2WI zey(+H9GA+gtE)eI$gXUqw5H-p%N7P0LY)t4cp#AILvsat>3NK!o@g1VIYa;Yso?vZ z>*x<3|3{C<=768hG+lhV$yU6IpqGW)i<{N;T8ligQ?RPR{n6w5!CU`tQd(gWGpVk3 zxq>NL)Xacus)p<-|^_zdm z+W^0!NQp7HyaqQr+e*Y!3D9ZvBSh7zq^$RLCw)xjy?&ZbE0 zB^Ztz(U4c#AafWflF{ zAbD&-b52Zky?#%H*>gO)qBK?-mul*a|A^2A_tI-HG>4TLO79CGFQ>YS-^YxQbsc!e z%HaBRJ5ZXg6fPiTW>NyYd2d?zBqjn@_1x4^s)CYxSnT0Ech%&*ri64x_y~p5~|M*NH zRSp6#R9c{rHfp8sMH+oZ6s+7^a#qIswBTDQ2lAJw_vP13`@)iimwLCSm2nIR^1T>C=c_n*NSjjcM;1io69%zt0ma(d) zCgA>-apqjwXSKa0Rd7V0+_X$a(Qiv!>1se#nH^c(c~B51+%{!8&`&~#e(*9{#9OY7 zQUO>R`qfs&471{u54H)k2Gc?(L?@`SdzRXVIPS%4im z-cDcW^eZoc^SqkG37-NNlx*m)juBtWW=!!kBD`#nVxN5TT*;JV4=UK-pz!T8!F`dh zhU*Dj05(t3dHS`~+|u2p$m!n2(j9lw`KIbeN;1U~RS!;ttr7dqaI}m&wOomJwhB2p zF0{U!6$J$jl2*)zX+r{A(R}hr`k>OpI9_imV=3JC6YIDGT*!I+8$bA$&|VmB1~=lH z8SYm7VA+6-a{sjivq~%|i++gp;3N(j+kw*(Kp;H=Q*~om7TwlM)kg%;ae`e=X+Q5gSpWrIJTP>J@-j)adV%>!Oh8WR$Hzb zfGm}*po*6BV4nU~RdvLwBAx7Hdf;BZ3=d!w{i7u08j8xKFG zDeyYlZv>*?NzEtn5N>&>s5PD9fEJ|CVuAr2-lo>FutjXreq&})!zr3Ld;Dlx~COCbJQ7QgfBt9_rRbFHC+Bs**uu*GY z{pKFuo}8)JwE4AS$~C<+we&0r%<-ZNy%%HF_Y3QO-SW;|LxUze+v*QfvcvH8TC?%5>YkIK`>I0Ee)>6qNvtuprxN}GFpIEi z7inH!`48-W(v)lcF_{dA;Co&<1NVAbtj&j0Wnv?!f`ohAryMVB5_uHC^AMNXA=SJeyKO6n8waa;hUZK2b;37o zLrP|-_&_TcQi45m+BAN#wh5rinUphCCvNv2W2*mS!dkEci=N*#A3`ZhvFG&OMv^iC z!c=cQg7$XC627ZCMk)xG_Vy;_7d0*Z%jbUVKLp!|M;P;*t^rrutLSPe z>@|By6lkzMisFc^8GC!uj`~d}BG_BQ41O_ZxRl^Eg))UeAeUEyoXLdA0qBn-XQM)- zYDaMQGU&u}B)M<~*)fzRx}4=-fn9({ba1;f5-yc!d{kh@pssf?3<&P@t_gib4d8L7P#bi@=2JpBHW~V&>!-GZ(8Z#UaWKuwt$OW{{2NB^R1<<> zzLr|zn&-rhb?;uf$BHmmQ*`<}dfMEEDuK8s^=}z7Ps5kJdI9x>hr-TRH`fI${_%V6 zKotjq>gP9K=ZSqd+e3BljdVjtwvh`?+w!%Qi=>*Ha@7rRE1*NWnr{38wZdOoH-849 zS-=*phjzU-a&cY6OjhnqV4pLH>E>j6FKWm(){=eY^(9?-3Nfd*%WUSe%? z#4r1DEiFN4f>REy6&}_%p7%DAGs_<>J3y@h_n)sP=$mw_o`75<{3jYTh=P&`oh98? zERg{WAi-#V7Dl677{k&CC@Uxs$hQ9@OdSoDeN+RqZEnxTq}6@r%%V*5j5PYHA<(gI z^Bfr9Te>}#|7a3|8yr8Qy+C$L5({*0#^YTpgiyp$NW4#mt&MDP7foPhQOXq?NfiWq zJs*UrVR}clk3e$FEqFP6xp(OFG4SK%5|8Qu0&dipI6TeH^e~pco$eaKF-oyE*W1_O zDz5WNlmZc2wmJU@wsN0uqFE0v_O!`!Epcwp%V0r4^N$v6xbkItD0=L+-3lcgRmSm4 zDMyM4+9y$?<_UItB*-0292I~s2r2SK#8uSAzMk%TaC7`;nZWBYMpCuQbI=}GmrMcR ztJn0VPt)D~!*VXTl{ywUak5w4W|{AJ=h~m=uqbU?f6=grBAJ{y%3-+%n6 z|D7h73M4hflSIAXL@fJW7>94J#j_w>Prc9@;B1j`&c3bJrDEUtzLI&fJq>vh3q?3B=Eyt;~I{=#AjK^X~EezrDNv-_lr@GTnaE`0tJ(3X-#@ z7#;mtdVaH*8W$IATM?mKt^z6tKF$8@{m;^-U*n@_2p|QwbK6!})P#(Z`}!Ox#e#JN ziz`?lA;rRtuOpIE9MAyA&0GGb?-8p@x@umY=R?fhK;PDxtmFXGAx0j|By;+NBkqyp zQVf4m;5k8fV*x_E3cw=v&ZbLI$gXa0iNH_0ej3tdqDA>dALYQi)#mV6) z2|E8yKd6kNOoJz>1wA_CtbC55&(9ZH#Z%Ej8xV#)1}QsCSg^FfyEof8dOfU7RV}%9 zgzr=qt6h;9IStbG3KJ?l%t3*}o90HyGgYVIO)pw=HWORZ$eO0J3BpyMEp@HY#bW^R zl&z_Io)tYa&g(+c1ID!}XC*z?ro;tOTyMFvBkXmjM0tIo?RB>0+*2R=e4w4@be;d8 z0KjHF!4Jg9C1>V}ql=sC>G((xd%I>!D zFmX+;Zk>A5$nx&JGMzMY=vJN?J@WcD@ttFkpH=gH^!?i|H`giLD~wBqe@lGhc>Z1K z$KQJRZ!1M}!mQjN18nH6PXtA$p9laWn#Ae@w3Em|)b4;5-A;*&vW}PctI-t?*n#-B z_`6Tb17&d((MybcgD24^;%pBLHVm4!y()Q#GDTSf4Gy&M?XrgGQg|0i2GNKTcC9h= zQH-OU9V zr${0RQ@Z_@p4cOvM%3YKt8KbicQ?+AZEoy18Wj=JQFEVkdBGO*T~G|#d{a`Dl2OUM86)$p-=vmowLi~V9C@cb; zV;jf1n#;TUc}~6x3-Fc>^o@Q-YHszN@%h;^=vVuOR(7($=So5z7IyP%45i7FSZ`xnEtV&an=CVtC z^3REwPIQ~*`Dm<4k4v(2@w`!FnLNjMkOqS%vopIUq%bMg$b!+YTRi06LK$;q0 zOLX!FW(TvKV(3UT{(L;ML$X~X^9+p%X+W9$N@aTB|D!f*c#l_z;=+IaK*KBz#Fqwf(DjB16c8Dq7p+)vhXK z8Jfxb=`(qOtTjYcF2}HILSw^%wn7DZ5Pd5wij{S!+x_c)+bzVDIGK!ojmZYU!irC0 zIw5&#lCtC^(LFAzQTLrA38`SIJn-9&NK?&b1mwowRF+IR8A_aq)~dK#vWl8^ z`?ttG3BrKwU!t7vqt=E@H*<`}pxNI@u=4>9pUemFNt8UWe`RO`gV8nmVwx>O(V6c!l$B`lyS}vFA30VOX!sL&wk7^Kw6u>ljM-+1)JW8y0{q6&RBl8D#zb_vM zR&RVXY%Lp&>259H2Cbi=g5m9BdJ7!asHP!*_>=$kB+I?QF-{8*C;5$qFHF^O~qy z>{N-`>OsKW7f!6A-2_Q*`gR_$bM&SYnYkrZ@l$&Z%y4WDSQ=(4I$BAtnR$j(Re-6OuF1L5t4n~s z2SA?&>R^p5SZ2O za~1Z5+rPRZKFO!xElxV$CpzAxG{R-8^9M2|*_N>rp|nWm!NHAU8M7=f90XdQg9gr+ z9q~-mN#tf{w7G7_dD7=H;keWPJw%<+7syd;4Sj}gXyqLNq+%PTbyNfGRQMn9fIs$4 zn1X>}bL4fT71G#EDPYitj+`>ry*VrR-KtHQK14`BfSiq#V&_Diy_NLET8y z?ryCpSB}-IR}7#eM7pOckma9nvw5YAHK8#&Dm?u|N_L+HOEl+~N|g)6hGD8@KkMFb zBNTD5$b&x}x2#G=Mj&FlOs#G9jvMJZN>@5^n|Bj%QNT=#s{6dXcq@S0iC(ZV8h3Vk z5kw&PEaScb?n)a;Toij&fGgzr#ZvUo;>E=C)nu#sPT5#QhYLK?OALZR%+6v1qSGnt zNnGWX#lx}I_xa)`M)rl9P2MS-?gBZ$oB+po6SH+rrXc2OY=kmxtI`|(!Ef0Y*`}DH z0Ui$k+p&81Ko^DTjXhX^8(1iCcAFYvc`vxq5sz^BjQ32@htl-|GrR+Ds7V?Dyq)pFm(HxvbkR5ZW-pk;D7H>kl6M70qc#NQwxXhrD;aIi%c z+L8aZEob0bIFCuT7G5KodaWVhbks-8;e5HE4R>^BNDXW+fwZcYP)gUdc6L$$fuot} zNEjcgh4tdXP!HTV+{mYOi$>iD3{>FO&lz_>MGZEODOOhW0%@Ccib}Wo>Wly&tBwwJ z4q%mZht=2v=$?=I#gq%7TExy7pOW4Gol;E$p)L!k>jyUb0ad=p$hv>ezU;JR58ed) zNg3~y3)W}UV^h75$MOj^d$VjSvZ?it=?K32RQ+JJ2!33A-f$2IR=b2R&VLahx5J@* zN4j`aIz}3|lo{=qK((M&cPIuNw0rqp{fX)$2jC3(z6JZdj-r^Wi({2t{qyV#ur0PC zIUi`w=_Tuz;H2M}r8SybO(KyfqAH3*XJ{WV95fd#li=3%+U@0_I$Nn|Luu{ITmcHZ zq30?Qc`dN$e&9NrVBdOONW$%VSgayVlDKOfw)psfwCx4Y)e3U=qU`}ZAvVK)u;ne4 zjUycTx9X!sM08C3R@~HfpKf(CVIfiK6mu{`C{XenRFMm)?j@Q7M;#TRDn}Uij2g=Wc z&{&Esn=t&oDVu1tV|Kswoelzdd(q`qP#QF6+`|p|wfy5Jwb>M%q=*UztkiMq)Q>t)KKOhhaGq0>-+i{>Bp-hXQ^o5+ zX@PV8rMlLGQXtOLkrMa-QS9ymyC1vD*h!?;)Pphut)?E-gOdGRAR9nM!80W425N;; zl^Z~5P{$W_)_{R21<)$Kz$gSd4y&Nfty2>lK)C=tK@iIL*LU5El~Ef6H@@^*NYMK0 zRqz4pN}f20AN97^OGGu)!h)UPws8tY@FK#z6nuZ+YARutl2ak+>qyJ`vQ~YHDp&k_ z{dE1uax_q_B~bU-Xr?KHN76Sj)~S2;|?7`sz-VpxGch67U+dlr{oEBsZ*k` zSkc;F7Mvj8T%$9%?bdhKx*HROx3{88FmV8r+*PYlcA4VpChdN%;OU-5HD_WYn~~9z z){14p&r$syD~2R_y zp{Kn?@9&%?A1+10&U>9zU$jhfct(0FAWqp%W(e0>y)!ulljv9?34VqA?QcfF!|?}j zfv@r=1?mNEqmXcmJwmr2@OGiF&+4jb6#8z5zw*J$rV0*Lw)RB90~kyn$ydR=yoZMa z`6pZ>W$wO7yIyR>n8 z;bnZ7-TpjHV{6OK^o}R#=G0DVk3S%Ii^U}6$XGOKpFw2&&=!mCD0}VYd`k`<gHL40GHya3+}iLuhB2lV)$l72}58Y&=kx{B~0ot%2{S zx)feF^^sXL8Y;>R=y*Cccm|ALgx{(uFA6Axfqu|dcupsx0#sWt!x)M-_6^Wu`0m$% zEwl-nX+&FuofkD@CNdyvb!z*7XY#=wd+R+ERj(I5CS7LAh$hqC5H^`$0JX^X9;{pm z4i4Xg^U&@zb%OcQCJpR) z5>0!|(e(EK96oDt?@ngCu#$A@Y()<&(sF});RMFNEVc;eMpg>%sZR}Y6%a#$uZ&NCDok4&!HLE;n88prOt!ptA(rAb?#dFlXcVY5Mwb)btc-H;j+cm(v( zbdmKEvw?%-^ZS*D=O$cOxuAEEeB>%@8`^7@h~F$0M3{vTSCI%IG6voFe^?Km{E(=i z4rWcQ2Iwcf;mJQUaA5x6o2dYB16~&iq^|!x+k#JVkt{Xj!Uwzxi*gd4yyyecLlVc2 z_Rfw6LF)h_sZ6F)+-wkPaix@pDGnuF4}()Lf*-e`q@t6kWL#jMwG0ZQ=*YjD?%P-R zR^+1}QE@St3`ke~mhYkI5*IKP!hhl58HrGk+L*!Agp`#4RgeM8^GFXbcf2})^MEOf zrcQHA!qUtHns-Cr)=A~_flopG-sf=-1u&GRPX+-@Bb7YVt?DT>Sh~dAdmQi?>_7?3 ziDd<|A!d>US|U=0JC}!6qM8#b32#&v-OtvE_4rK|Q?zN&+=_vkR_sm5+$`!B1iQ{p zoG7cf4LS(>Q+!_gdOq;EMcJz7Z~T%t)z=y+w4hUy9~kC6R3!AY7*i1)hL0!0hs2!9 zPZa?(!4XAiZWPE=Qf(g3b{oLd$kiiV0Wnx{WgsT=MxO{kt5-s)?SZFUh%h}#cQO%}f*Fc?8#D@hj*LV~t?(i1Gs_c!LqSHX=@Lw8+|AgOIUqO+9V zkcz_v+q|9%y&KFD=5iFeeYv8VHq@}J@1WwSZSj4Yj9Ru$ad37OX2W=KdnZXqm&Hn9dTXefkjJ;k z&3IpcWwv5Pb+LFa*NyW|oS|Pv1x}G|Yon#}W0?45xGE-V4x1M*IB z?;9vpIEXjk*jsTuz1TKQTJXZ5YR^XM75q5eqHl+>)|{j0N=~CG;B!2I5g~h7L5U%; z;1QtK)K<1)M_Ht+o}8tvSaitc(kQcsyKk#Ny&3nw}7 z{QV2Gn`Or%UEgELLqX&tQdtvjT6y`k>6X!oq2JAumD3d7oH@)9i5o(DKJ{xr7^8=% zZ!f6p@WO5amzAM0d`4G?0)&*tGGqz2Q)2YIyzZ=>e`2eYc=-a*NcF4mqUE%G*~5wc zslZbdD$)RQ@Y70XnIa^9ikdctqaEAua)gq2P9@*M`U#@d$CF~~Z&zHbbs-K@PD>)& z!D{At=DY2tJX{q7`Dl#-dR4{>jyjb!yU8T58vzWmZt3>#Ft9D}jv+|cZIvC(_Db$a zKBFbnXJ{y+O#5cQrpxx@@%ZKV(bM_)9cHZZZ0nAl+;5cUf4~pYQd?`!?UFjH4Xe!$ z;J${K@CTuBpOJj<6tA&HJ?TBMow~OMA=0~UJ~Hin$xck`59nU6r9m$k`aDA|x1qS( zw0VH_0FI4f!aSA@^o_Pq^r880S3#TMlVb%?2GFOs8ull^?DHMF{v7AQ(Xw!r*Acx1 zo?-33B5c6Jzs%6J=UuJC(at4z-aE`}2j35@RR(U~*wGXS^v}C*7+=K9L|U+29VY&s zgUvm<=XYM`?U_>Quf^-)?;mKx5B26q1`#on@<(!`RQ#H3po+x8R{iPT1s22gFNgu9DR4eOssJ+9(X-E_*|{o zjfg8+TG$b(Y&g4nWWnX(_3Y{W{(OC{bHg3Uy^#Is0094no<8u)!%NYqF~M!(SIf1! zrff`#jLXxTjzU(yVxnv|V@el;FvRsEpEHG~>NEu>N*l_}K4UmmZ>#`#VHHv?8eX9( zCRnoZ!4WuPW^Pinec~cdRvVP=V|f#)A!RxUj}$wHmL&yf>D?}GU0)s(AH=8})_O@rSYoX@~|&w|4?@F*~e^*jqR1GZsMWWoHNS!d-`FP75?yrO9utIIj> zhmsB9Xmp{V_ir~XhpQ1^y`umo_7Iy!Q6s|_IXbBe+w};8B4Y)NnN+F5?{;Gz3G+Ye2~$U@e%b*xNpja8wa%BcRgD+MmfneZ`tKD~?>8Z=^!n`vm$+tZ<96PM;e?%u zRfNDYBNx!na21^R1y_Xf<7vnW&y9-5*5FFSd&fvzox;Hgxz6}GuWrTZ>oHB(FcA2p zU1;gMTcj~8)dxDa95OqOGSxuLRj`G;)a7T&vXYz!b`}BQ4_3(_wCgFlQ#VZYF9U~D zcoT!f>re7)w`#BZ#oY!t{x4W0lsJn@8nBwBA-fk1TW%fXQ)+R1p5B|StEJ0OO12^R z+b3nJ9<<;<70hDY8o&W32ELN+A=nSc7iPCkdttgHm{+e4p-nt_(yh- z=5tE^`a`y(~ z?=3o>J!aT4nNz}8U!u8SHFd;M77N7Z!O%(wnpl*4Skge1V^SQky1l>)t4rJ6>Su!@ zjvPd6A|)%H;rjuy*3XD=ORojN+V_5IbvKqkC?s%Tdyp4k9g&o`Fv~{8vY1Rn>9TW5 zDQdu6dI}VYF_nOJew0(bY!)l+ruwN@)0GEUr|o+3^LonH3_V@T6-GiAAK>HBz@7!? z7b)3Z1Q<|Sx1y2{x1knww|LLn258z9l0`N6`_{`X44xs}1l@G&sJrWj9g=H@`JGRo zG;4=wl&+Ca?cjU8q(kkkYLCRu%CrHwksY8d8Xbn1=xka8iX!co?%pITd~cc#%6LAg z$34c~B_kGP=JlLgld-|biSf)rcOM;?nJZ2bWHesi!mLJE+rpNdBtqggaOoZ&_8zKc zeGNqMZsn;9voSAE3JU3>eA`Z?A;?^bHeEC1!E|!rHg*2 z5KP@}a}LYowlp23X@lg6l6 zhl$Eu_1639$Bp>~zB;7K=N%)2IS=Sw=tCqb0b&t9Tg25lM!p5R(dzO@HDYI>AM%kp z3kca(o7eiXA@WhJW@}byT+cgFK$-}6)wI~RwK|D+Q0g!PT_v_8*PDE`TdJ zdrMT4Z-nvVY@Ka%7Y`!0=3uWf(ruIC6N%&11`nc=OW3~S^HSczufz=qFp)=uFjCDh`rgU@)F1B9;8mQDVGd^Q_JUs<-6 z1orHcVke2+_xizhRL1rN_g^NQ=AR#?k?-mc5&3EWh zN_u3+ilufu|B|T9Akotn(Bylsws8SZ;muYB$OuI&H0n(d9JKW804wDB4^w|RSQcQ* zk78IUBdFHX=lKRegg8%DICrK+31`+O#%t(V(peg%V`k*Qg%rM&32UthSZ?B4kd#<< znkZ73llCNTRD6{oC2o0JlCx4jM$2w_iEFjNgT)gP0=69+n#$?_lHCi3iJQMt0KCOy zD2pfwW@078KXs~=mxtjP2vio@eM4I2R#zU%C5Jo!`$3jFCOM~JV0e7ABzhK@WQ@No ze~~AGMm6UOAU#NR(+G57v1K&VphHv2kf3l~e$8ULe;YB7{8`iqne*$2su(91=RC`b zfE%iV+hc`nWodSx^>6M7AW@1=@QMgW9Gk;~-~Q*oy~!ifdVlG_RB8y-@#SYv&8iBX z@3}?=XsOr0AGIGxuTV6I!wK|d{7l9x!aGZ*7-3*9Y12FaGIt{HZVlG7t3vTD8r`_u z^ldJJgYP~}T-MP@zUQVfE00PUTCz^gGG@Zp#tUCYXX|Brb0oPZ{Z-zT&wbGea;u&w z3_!KMAxnk^Q1O;%C@Mn$-6UBl9`_zye6K_RxDfomTnxWL870yuQ0@&O(mmq^Fi z2+ei4WjKaAu76u5Ijxa2Xxo0i)>~b<=&6e`jDND5QXx|jUzxZOuJH>X79s|bm$T$T z9pYALr<1Rp`GGQ+3gtNu9ukFXf||(xfg&@7%I5+gBd8;QhfY}L7gW>mmNmguVi zb~kc%`|(O&2q#Z&Z`W6UuS<1W9^pV#l>mBcQtud|Lfzp{wsP%HNPJNi&of#mBh*fv zN}OE^ka@7mG!Pp_(g+*Vf*s)MOciR8$gSc*Da9SHs2D~+=Md2ZJjIs5U6!%tS0rvG zCg`4wOt3Swa?HKYU=>B*i+=H*@Y=WowB&d|PiGzP94tEgupd~8N}5uHoa8x$^CD<% zrrlX!!X)a}iV-s8oKK!7SsTN#}ZVWMtq$HCAR zv*h;iXg3GQLA07^yG!C86!>9cBL~Wn(SaHXrn>C|@yJ{x*TnYlo>L+1EN7YlQ0pbg zZP*YjL*(eXoyv1)72Sto8z)2bK0aCp{6BYipuUib@-5rmwvnh8X%{!5x>^1}pj??) zb0dM^%-x(H%8YnIgbKt-lr{^UIGH8z1Y>NCYao{xHMj^|Kj6J4v2>6se5c*4H9COX zB8^G*2!9`y1o1pE3@C`}CeH?#kzzn|yvy8q+I_&D(3id^dn6M56qrETemC@tcUE7@ zVK7=batG7!@^(;|{rukW|4`F^&nSOcF}N%GR_(WRtlSAADavM-%REdmdN5$a`QpOL z$pik4_m_AyiynJMr(fq@9fw+}kN!*1t99yJyrpLvpr4`zmNv^cj1~gmajXrx^zUG& z@*e7VH5M{&M*TZEkb~DfDU`?dxKD42Q>0FY=L}cY7IU~jY~*-qMmSWN?JDS*J?MGX z%(}3}7rN$&cG7)$k7MR^e1a-*gvf~1T$Rt{Z5Ag<(Lzm(Hv<2O#Sk-BF_8atu!&ft z-9bzLX&BjtRTG*D`BeviAO`C+MbuQeJ~&s#n8! zcxhiTJkip<^6WCBdzzjuT51d-%HG;7CF1T%N6kU)+}{5%7w+ms5HB@1gPq&tsXKdN z@5*Tz=i50QZw|oTkyt4R5%}K<-v8x>{HKCfARZVHf0W8%sU)sZe?3^2N1bA%zcG+k z+$b7E%$g8!o&Rn2ZPIH~L_wKA+pC6CXFzZ;_PBj_(|#I5|Nib+vlHVJp2&ikDUYf| zb6nkM54^-SBlP=Kz=3=`Dd2@SI_QN@x`c2es2#<s&8ixophx1EoYm0j>?C0*2A7#*Fpr<|!Ilw~k?+qwxe6Dz1C^}B8U zZ&2S710Yf1?ldB0tX8pm{#SJa}k~H3E z1YFw<*kk@!lKVB5{SiMBL^*?G#t5(}yKD?V@I0%b)LLL5sv@dgHuo18WsHgpX@)6{ zTOC7@Y`l_soX)H)ZV*_%olF7bT6Lia_z1UB`B6>kD|9MzhhxBspZUi~2(SoN3Zr5rkHZhAf&&}C zMKI6ZV#9#<6oW1$vJ^n-ZAqTNkdJIJL&U-gF@^pH94(FXXlfXpj@0jh)2{@rrWZ*g z&nw5$O4WjGpC!tnxUw*zz90RWs1s~sL&imbwt!RLTNZON%LVv;F2KT_T`tfIu2KYZ zT~Nd$jIzz$A1n`)864OU{oKMuDeVeiC=#v`HVX}w{ylN8M&_ct;DUr;edSu8W*$z* zs+q6Bk%Y4LUO&Ez-kioCP$vQ(b9BbBEl}6+N9RUW$6Fo#5<4ce!{8GRg7IPGIh+-6u-RXrZh=u+Ic!|%5&+GwqcAvzzVs<(y*}v*~A*FrP zNn!ZY7Z6!$?dcMoQM)rEMAz}xA-Jn%$(9IXB{TTbx?YO~=7&<;Y-|mfilXLVIw+B9 zy*p{iobO>5Hm$NWc)6w+7Rtb0*_!X1#=;oyM`NU9U`(EW0r$P;*z=h)%P&J=21~;` za`V#%~OUYJ&|0I)RJA6V`XOjy-x|_0O)XYk_a?>RF zB=haP9TQW@5qomv9DiTc*x-CPWY0}Pdg@2o`rmeK*PkNEwhx_k zCl^RB3U%nAinV$zY@+V^NqGy{6lhUkdO6Y+)zl$RC&+rX!8bQdSF6iQ=yUej)REQD zc@3#VTerRR|HsukMQ0Xm(Ymp1R&3iz#kOtR&L7*hU9p{1Y}>Z&oZ5Te+fHleWxcJp z*~XlskJ0;=g2N2>>s~`KqF&}wVIp#MU+xb=ZMM8Uaqa&$DfZQj&9u@=wu)Gaq*VjVfNi$CKPZ{8yF z1K3%Z`^Ytl#W^#9De!rx`q9K3JkAlHqN{59YgyWKv4aix>L+VT=+05seLIS@r*Cm4 zxQzK{KvQWCZhw1K&Kmx^M)T-;vZd)rbA#9&z;O$x+o@7@Et+h$;VP}_e%MlXT<*=g zx=0Ppagwopxv>A=3`b+?Kk1=8A5>5f8kdC$=o^xacho{r-#Q(XFkq)8|8%JTJhTg? zlp+8ztlcks?G$%Uf{joB!*W` zO;aEk_1Gjiw4<#>TmkN8j5J?Rb68SB-{1p4xN|_16myfhYX@sO81m-Q5vMp3su_226_%np+N4wM-FP5ifszl;}^ z7ZfLUPG}5!q?+(Jz}{BK>8S2fJr0?OguL&s>Zn%@e6cSa8C)XK-W?a)eS=8HBE10s zaLU9+r!*Q}+N=zpu*dv>V!*UMi`1x5=TwIwLTvxr6YGNw9#pTE`Z~2M8Kso-0p-_7 zyrD{EA0B8PkNg`k!qJ$_q-9%QYlQ|XDRys9b((iT9^8PQLO3H5uShD7B&}t|*ntNG z_FhH+l>xpkbcBkOXipfFCB~oxb3i1(2(;dKuJu&jBfgzXjzc&8qM<%~cRe1f#v`;i zL1epQp(YlFF75Nl8xu$#^Wc&hrM`ofs7c^5F7_Sthezk)=W@9cCgn*o#=?DdiVpsQ z8h)ZB2G%)3P&~4eG@{E1x(;_3JPYbnb?k*8{r)O|SI?8t*plAhqeB~F)piM>dU}=l zQJ_;rGtKT9HJ_|2oRH+CpkRbH(bQMUSC%1Sj^n;kx{!^Q0TH07{cSO7_-tpzUqEBM z%sx$w^G&Q#z?J!o3%P6>o%^0c$f{#jKXLi*FftWqhX(DPz9#T>*F0q>rehz=rqDXg zVDyhHG|rt~9;}TeaOCglu8;#_gt6_T?7D6plG2gSwg^I4^S*KLj82ap*aNm#vd&8# z9=4W6|LqO`3>iPE6pa|v$(|OXPL=?bP8B9wx~hV4w+dHmSQ-3T!r?pss!e9^vc^-W zu}|eOAKIH&TVWk^AgNOkIEcy-C;!{-qH02)0)r92aZwf4l!{xmAe#d)^t5d_C&H$6 zd$1gqDKIE$S6lGWj~y0PiXp#0f_=MsL0s(&3j5>f*)P{F87V1{Sdq5^f6^Eo(Y}}P zOd%xqnS2LFu~}?rDDFsL2AKy5Yvma{5S?;}3=ZP!KZ;5FGrpIqGb$unx7#9HQ_U*x zon9oz%TbxP_l8`Eo0|!EO#ST8s(g$9*PzzvvcXGx45$~|<5GRPP5QvbHFmvb>+ipi zy^}O#e6+v(rY4)RF%ZUkIwMU*+g6K%74Wgyshe)Nvtilus^e?O~uJiI;=`!MwH zv_Q2keJa6k<7{Y4-JUQ$!}$Ev{u5B_SEkqlzbu2h_4Ji%IV^m9+xc;Fv$KEY;1lHa zRO2Q#-7yV-*NZxoHh9Pbr? zZRw8BGi*Y;=x9V3o`80d&mo&;wFD*sU=l7|R&faNdjtQvT4^-Z(lb#EzU(CvD9ARrq_1o;Yg2TYl8EFo^Oki^smahNLoekub=k^FXcQtpJRa+e!a9PZ zd7>_D-*wK$U13TL4nXX;3eT{Dxcg2?#P?#r$w=aSn9C=F|3j8@Qb_2`7WSzE;4)7Z z?$J=9IcAHR*@vO@~)NyEuYs@V(wK98sn?MuBCw@?vjcXy57Paa7 zD@Np`KHl~RYtmMCkyL$)=A$F^&_Nr*&=4MCB_?$C$7cB>es*sg|4K&EPKHxbwhBcnXjykVNL~` z8f)H0+QRZbS7mmAJR($Mfy@k*Jqfz#z$hR4{xy^UgEEjhq)6PlX-+qKL%$Z0E=p5@ zl4Y=G0FXV-U8xpoMf@sZG;QA{kIqUo3VH^*^n!)$iqnSWTK}|e>9KAo`*Oe=VijY8 z@$n?*g~U|~xhlw=>BK$C97v`!)XAe$>`_Yv)Jml(6kx~ZA#u0=Nh2;kH`}NHjUa+` z(*a(0`2>N5wbqU#+SFGBt=cz9;t(37VCA1F`@Czi&~%`ItOy&;ugRr`vcN?}umtHS z(+2vt^#B+e%K0nZm}Lm|BcB$kzJV-^_Q0Y>?@$oMV-Kv$l@~k{Os8Hv{E-5yN@R{` z$PQ(?Ct#N$VjIZ;bW8o0|aH;`^MG^kD;y)@@>?SDghY;#)B#2^Ld+#Gd*{%E{o9=duyHhS- z`T6KQcN8ZrCyF=V}L14?Ju@A=7rEC&tK*MXmhXmjhgzg zT`Fugr()q@v#Wg@*5JtDwV|U%hBDsR4%VpL-q-V^;35kfykv<0wp{xXi}Ut?>9>b8 z{hVHp=l!F%PvU9*7&@iCONYbgjR~_CNiKpG~*vYec#u;yX(8U)FFRHtBA^D&~@ zYAFoJ9sVbyO^LKYwd_DnBAnJuZVpE^g80^>YvGNg2PMP$Qmdo`!!Dja!Xn2kvt7F0 z8&NzHApGt}mC3IIu2&cug3BQggg%?xADiSEL{6g?2_lg(`b(Yk`=^5WCM=@4+>atH zVhxN6KdR|lSmlR8^r@KLcH+95&tL#So&VacS@qO@Sw3xM4a^LeK! zgfUzQ*6{{}eE<)w=ju$HXPkL58^>J6FevBk+%$PSYH9T|7-Rus7Ng}8hM6r*{tECy z=-7Z9VjrDoh$k9P+%@}WFqFKpiV?4e1}1VlbM zWSI(;OZqmeV2Sp8kc|g<1fDOGaEx_^ioX_jsJuL4lp%EKa2+c&11xld+68=vpmpfi zr&ZzGj8QeTVtrbVpNz*^R{T64$WzzeE=OQsR>RO|Paw$u+nJ#XutA6~4q7Vph+y#e z^^wQD;3g=sfr1KN4Q|BcL-_po3m;;^l>0o%xJ~0aP@D1ceFWYcmu?};>|A5&sKNof zi6i}b$pD~A2B)2RD|D;pj^mNO;BT|(?L41aXegR>6nl;WC$*n4AZP-Fb7N*k0vkzv zzKzS`u4-5}ri&g3Xdd7O>dr!C0A9a*+j|riu2Le!dNqqLW{Bv=-A7ENCw-Y(khFZc zB*ubg^HH=T;xp)sAGsPsP^Iu%4~m0VLvaQRTqPOOREJBt<5lV7id=p!x3~Hmr@`^r zT@{wL9dj%9m0+yeA{#cR1tpdr8an>-Uvc|i9BbT08#3U#MqiNfw*%esd=DvP_5l{> zp;psxEi~CkKPm$UvT@>6V)Vpy-Jg%?_+$}V(v8km$W33U{ndfJNtT%|CbqqXL-6Lw z_^`~iOiQ7N%S`Q8hl#e$B&oAdtqCb1_=2%g1u~M5{9zxNb~K#^mri=_>I_3P+DQW<*j@R`$B$6iYEv!j$EHjNs4#AV`)i(R6MCy-!w4%}G(s8K2k; zcL`>ljCZM12X-A^m5$!fVcZ?9rJ$l{=v6@b_OODJT(RuL2*e*Cm`P+q1|&i4Rm&}_ z!d6=eX|8_H*J>tfMA9g`ZO75Ry8-_lFe46(zzu*vEIPd_6hj5V-DebOD;FWW17m7F z7m0v!4^6>-gK^p>g8E|y>o8vkq>JJ5r2Zbo*q5Jgf_@d;%}IhK#o!Qzi*7OgT~SftS&pQQydd|R3Rv^tz{ zNE;AGq*e)uUDYA6%!a;HW6co$GkBd5JOh3}*c~RHq9FCsyRZ1V+5CMEMBi5DznOpU zsdGPiISKq}a}1R2K(%{X0>2No3!|#=H!(mNj4K2vXez%SpS7waQ>#Q)MwnM%AO1JR zcVP6VFOl!@WrJ$9dbw7Zt59sm~c6$+EPL>JaZ;0CKJW4zt7*vY= zOFkk?n8;2`qK_rbp1hc;O0clLzFhUtWfoULEwjwd<-LhsxX1%oK3rLwGIdJ<1l}|N zyaszc(yTVZIZ!9uJwnz5!|yL#az$9YFjV2zWLxDUx|4phs{(C`UXR#%Os!z zd(qWYU>O+Mjyj@0Ot~XfXrBoepZZ$plUU}vfwF?6Enw241~CEDe%>CM>Fah5Pv=;q z^*VT|WhOe*+80s_AR9F3@>wnJK!8dzvTEkdd+*~!KSYzqgM>d2B%(=>^kAuL#7Ef$>$1sz9nqc`H)q=X1m$k=%AJ(%e_n4MgZgv0?#f7&AgAQ*)7$(4%g4Ks0<{B zwMg2}5?N|>QAj=@7(F{B355n1YQ0SEk%xd9TZ=6!jI3 zn?OlPoeCh}iwO-ZX><9R&Ngyi#h!GGev>A=&)g+Wje|CJjOj*2cf4&$2$JOb+ALH- zDm+?N>wJkfB8av<)hJpP}1`#kDRaKuZv6G;I7 z-ANvj*zlIkGLl(g#=ee~Y^K4Xw-Bb+HqAS|Fj!6~= z+_+h~Fg(&Q;(7Q_(D@(6@-1tKh-lvoxqCAki~t$m%r78b+>5I`sOX#LF^pX&h025? z2l)wBEjDG4V_?tOcq5q+p!f^)rOjUw;7b(2pw7%DoQzV8>efCq(8FkzmMOus@;X$5 zwncvn>;t%l&n;qx_5o}^oWF}y)99)_6VUkK`oDQ6N|f%p0Lr(lfO5y?>nb)63Hw>@SrL<){lto6m0vb5D~$PJ)L z`8ecAFo(ZlmKbt~?mv0+qt*zt;k|CG0DQz?lfBgfM>E66JOLCfS?`&*_r_LB(>qD} zwLUr8_2LtxJtXNV1R;AXOB#Ih+e8D|l7BK4ZTQdFi4LkhkJTw_>T9cjs(G-?Jb$W> zum7kfp-9knRB|n1LH{~MP}n-$+}c4{K1)g5kGGrY#GCv3z=$xQpXWP7FcZHgqavOp ztEX>|S`H(C*a^T&H}M=|N+D7zH3hFl7${1n0XFPSR}tV4Bh%L%i_)uGrnkVNkKXv4 zCa?`N24vQ(d~eM=LX@&ZRK$GsV`Cl%p6~&Y`i3b!AnR)g5l2{jg-fj2Z518j^W+CO z)_>bE1S;aPnMmC@Pid7@k5%`0=JlSr0nQFm?K+vlzW~!IZIpdVOYM$UKDU3vbkh-q zG(%0ZoB~2-yL$ruyzlNhPYe3wIoi&4WBseah%AkO zu8}7@A3*SnD6`awpA3Srw8D$Ya=Kj{zo7P1X|Vk%{)N`QKBUrWPB|+Gd0JeBihp%L zWA|xKNc9}!Ce589`C3{=M;3v-Ux%J<$p*nO0vlfF@Wh0t??zPn4S-<&s>*t}SeqaU-1g$cD(V~Z#C4LV z;N}hD`(%Ql)^vk0;M;5AI+h7o%9{+ciOhKiFmgjXf$pYM3gUDLk405%&?B$h&x+YwNz(MGbcz z1iTji0ZP$9U@SSu-RZBd%uEcm+7TtgYM8-;tegzVM3(kxNE?DS(eMDuC5v4ar%5Z@m+qa8%hfq7cI4*75} zmgD{`FCvu~X$Dp`XRfso34kYLwdv@ka?NOb^gr(78E>*Mn;(wqK@yykrGkOUnnXV4 zd(RE8D*buiW$(izY?ile%rkqqQ?;Vl1I@Ztus1~0Q?UgL`p09dAvdL z_iQM_oD+c#3_TU^3vFw(TBm`barVTh6InoA7`@-xvNNu944A${qN`gbBgu>o-UL>j^r>xA}3N5BTH`{7s4Tc@_qK3xjvuzpp;5 zJQ_ZGc1}+u0)wv0>a8*Sq$~b1eYpp8;*`<&XfN~^E zY`!&F9wn2CBw=LLpziWZfxJ{Q7QD4Q!@r>=lXWe>MQ*V#BLsP!3MJLMGz3D(0_Tro zYNd|WN#eF1vLVm_MT6#Vz5J6@DMy`joKGEE?WS0CD}vo18>|#!k;!}_*wz^^QTFMO z1x+z1z+)RK7|B3*oM#g@`8&R5GVRt|%tUY%iBU956pCEbFryaE%*3qPI8D&fKky}7 z`J^NzKiaPe27|R`WwHDXqs)yrEek_dsXVVlOh%~$6Hu)3J2UdF-l!u3x@FE?A%o3y zr!4;*>NLAl;*tqCg9X2{CA!X0V`Ss7zm;gL0F>(JBqyC{N^@yYo|#$O3NO!?Jf|9I zPwAqmW}Qxk)gk-|1$MRMy@uc+GE=t%OdR^g8_au!d2n?Inm4l37O9-`4WWOCpcw5aibvG`w@gegO zT>(aL`M|!q`iL2>8$)+7>q3_j;GE( zC}BVew_kdLh*rv_{J$BDvRR1TLge=egJvEMNhi*NK4~xy^VMI6~j zfFq#HshKH6vM)l?^Dd*mTYLJ3l|A=Z)00tLReeHO3KYWqFp<1~!biDl1OH zF>D$Al4Jl^q9PUDD@5WW^61j@-9g^J7aEQmy^D+`6+5(&ag{j>Gy~g}Al$=JjUc?M zw}(}(@Vyc*pIE)!|LTE*Jo{#rbs4JSvJ~p`c~@z~iPN1E&Ci&(7^}HAEThc)pnGVO zAwO|z<^D+I`bFJu{%qtzCcZzmsuNU?U0FAf9!&vG1CZF~ouv`=KUM0VKj^IVbM>pd zhc;Knt&f`jwIzJINPK4I(P0tH+)9&U8|xv`F=QK7?(```D-Ew^sY5RfuZkD~hMGRe z1Y=aHB|Ga(s@=Wryoepkp$L`f>@^Y~BArw2^bi6iTmzPbu({QLt*PDrmwuJ;pRH;D z+Q`iV8W<=VF4CKD%RwABNF*z0An-sP`)>vauqGE9hRSL&Ca(u>LmjU?s@yP}7JM)he-Ss@QgQ;c4c{w1sLzNw((E5}1VKN1t_N;(A zzD^20dV7x-%p<4Cu!`?mq`gq~mi^<%#~_UQ;vP0hrQ0C1-5~_<0A8-|?;GeH4?rD% z5|9go$fag%nrnyIpPA*&a$~UVUt=%b-NJVVz6cOs0Q{Rjs!2kam!W`uw{qgXR+R(m zOVkzj#&6pl(CQR+7gVso(UeCcgEnhgM)hDB>S#*k`T)QUTA&Xwo=n!%XL&o>}d!QC;vW^v{mq3%lsQq;*j1 zHL3k&wnSD!+eBJV_XYr@H%>yVj75hds@$V=n1Pc(S+=EQxh-#ah?_LtoAFR_d<7xp zu8-`YpBlN8#u2+5gsG&1C}6^i=Eg9>oRaBn8j zQto{muaj*&K)ji9zX}x2$=xHx=GL38CXZ>}-b_&4KsBX)-|_%zsOmE%Nz%cqT+sp; zR!NG{dcTwl8HjFTN45%fuw5bb(jazhJDU)m9jtXQJx*S&sXy+Ddu!*LDqXj%94_>k zxngCD9j&2Md&hYOo$CBXF?YKtv!ZaAjw-0+r_Chwghx@y*^jh57Ep~+=NmdzEvJF< z28uV)QYUMdE+PTBu@~@v#-x^hpyclqdYr2sCoA@-MThA_P-kDTu`bXSk;)v9C)-gM z+m##Igi=?s07SzwV&WxRCiGM*W)TR9sy7&(7pyF1mN4^3oibeOLW(^xg2%t26pOJ! z3{y688S51?H#qn9xRItDx?r==Q&Dtm!h{M<-gwDRVIKj*zf+0{s@)(dPLA_W@_pLDVcTy*@)bxQT=MyU}@;UUdF&4o@eqLDH&0jrrX(6w|}$`3raMg z@*o4V>y;$!-52f}kfeAHZZ3OJEjRaPGzq%gv1O8#luj-Tl1o>dTd~uK40)-EN10i^ zleXh=yT^ym!}A6*R=n~h zs}0$S-Y=fI;C+C^s9}~hs8MQs1Pcm~Ms)N$^wn|NMFtN%yvQFrml8#CG(0|2gwYfP zicA?76Wc5^GQ9FMp+XevnjooXiBupNdAC<3V2ueuxI6<*u zHB9;jrWc7WB34tZw7rg~_F;6qJ#x)+Ymh{RX+1_0Euc?B6@gr=CDW)?@mR;TWLKKO zLZ@^y!x)Z^fADL`h8?=cb!Igbv$@xt=I@T6BRV- zMEwiBpEkKr8b4G7c!bTrjHV7?&PcJstWH!#SYvDxzBJX*wnWSBKOpSTx~r>M5!n#5 zrZgr_&!uF0uM&!&Z6Bi%;;so}*y3kGaKN=XsX#|tIk!i;g7wZ}=7$VGsVH`&p<<$y zA?;?p3upva?$IkXP`?@C-kYJ|I_Q`XS&2<+4PVGQfIi;a-&0J97>?##H;G36c;DFPi* z(K&bu#f-RGn<(Fbnl?3R#cP1M!;p^B8Wdh^tREVmHmyr%yf}J*t0RzOS>pBwju#Ia z3U2jI`fKeRvY=f6@Rrc*Y?h95C=0hss2dLD&%a?YRw*4l&~&t&P!rJ4t+d=ek06=Eu88qVVa+Qmwj47oBNAUC_hw?BEh239 z*y4Gyjp=N#WWaS753KLQSZ}&jjT$fd;(jk3Do;OhfgrHdrMBUt1)uZ7rB)c7)H?TvS32{X6j<@rbmDKy)V5W zwlX!>py=45YYX{j1{BXXRjSD*f?CQ&leA>CbIJ*tID;0E-XXQ%`RKV#iGk%Ku$hXK zr(&$95Qj$s>-|uvlg2;N_Q@1d&&;ztFIfD^4Ve+JOkMP6dAd%K<7U*Z+GzbDcFwz`k5cMvsxt*;zv~ld&3FZa2VYC=%&NNT)*{i~y!#k?xH220n4&mFZ^ijJw{AY9u}v655AD z1nZUV6~CR2?Ugs9a*NCa(Kj*VGATO8(6JDE-!SO=YMPKSRXF=a2i+vh*BL>krKY^Y zc@tj@21hKp;l?uy47m>y8GdWTq^xNN=Sopr2YpwWZj~fB>;iw`;JCp5YCc*YS>ZQ;0|s&@$y-yfm$e+PWg8OiRl z>Qc-mc+-<+r&71S)GdHFZF`^XH)7W+E|bo(0p(MbijP}yPI_Dl4hLO6oAgr?#37it zoP!H3yAce2sjL+{%j5GGmF0JuCLprVxY5P8HMWy|;!Q6j`+mH-9Id^Gn29x@_YPX% z@;a_5=S8Wuc&nUp{U}AuBvxOVL~b3+@sq|9YYgi${>Y%VBeB;NH>vQv^kDJZVa5on zkq$bRKmb@Ur8DuaM@Hu&IcfL*AfIxs4{zn4%Z(v^aD;O4l{THBC z{%>U;9hZm_3dhyHb1=<30v3HMytLhb1J6INrM3>K5=q6X*vd_hK%U81YEH4V`$W_# z#?OrWXF_I|$II2xl>AP&cu3_qYx*f-Qsq2^v*OR>NTr069st(YSKg!9a#eztsoUN^v-Y81Au0zvm#sjF&G?zxpXHd5fs|Un*=ui4-${N|;o_6IrU6 zI)WBTksl<4urZ3UOo@ye4w>pKG4k|WKtQ+K&-Y8%#-rOH16qrQRCL+Y)A{-9Xlkif z?2ZAcOwuS~o^X~(+GmnnIk#3p%?O&x89^jDKpsh(rkhic)gE*2&Y0LjGiiU2y2&h2 zMsYg2De^>C(kVAYkIM&;CZ)g*37^D$6}ce8La!iqq9Pfr8B1DG58W9}A(>;xT*uWv z8Y!&eOxREbo%EQSPlYuTp3EequSkTh1b){9o+@!?AjRrC=A1|}jwY^UJNze;1qwJ5 zRtK|~SZh#Lu*wn4T(mO~1I%PA3CM#+CrG9!NQzp?H=8t*^QjV(bT+aHLeM`?rNd%{{_VCaFCak*vZ%kEC@sV< zUNM19r2u?YP+_WMigrC(fRVWdq(B!53FC^{?2kMXe$~J*iZPiBa$q^)#M?$Ky!sE} zq~9;14^5+^+$LfGQAvhtmYORxw!!%NmP8@CVp1=a>4nw&plbw+(k(NEP+`{`Fswm! z|M;>3G}Dwi)4O6=2PUJsCcnWc5KdO$!qK={rYHc>28~opLDeQ>I}Sb?Z>qGdzeHQm zXIWkHUX9p-pO0$}E%U{cw}-{5 zP7Wo=@q8{<)|nXp@RxuKKfg_4)=?XF;ydtIuly2fJvs2YRW}F)-?ubs+r2N zwKv@gj@`LP99Bd*)yFZ|3T|OCc~I<75rQf-A+^0q@I}fl3n|hxZ5B?7KnejkWr{(C zVyPQuK^>6}pq{R+o=rI34_oCm*8j^b4n9Y8_fvF~Qw1)%d_8IV$S^Z0 z106Dpn)V4A!!R;5w~^r~yNV(9hA3JTOw>=u6&&*As)TI;#Z4m|@v%0exCFW-yIgnr!% zneVeesSfcMd>G&Mo=D@N3D`-we)vFt7PYS$+jMdyY+PNPvZQTWh@V}VdV!~#r?Hsn zd!#1L_ZxgJ$TQs>IBV3YkFE7!o!Z|2;06I2bC_23;eztQuqB?_T;xAX2P0Mg
  • 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 - + diff --git a/PlausibleWeb.Api.ExternalController.html b/PlausibleWeb.Api.ExternalController.html index 677cb7dfe..c9c6c43ae 100644 --- a/PlausibleWeb.Api.ExternalController.html +++ b/PlausibleWeb.Api.ExternalController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Api.ExternalSitesController.html b/PlausibleWeb.Api.ExternalSitesController.html index bceebab12..f4a70680a 100644 --- a/PlausibleWeb.Api.ExternalSitesController.html +++ b/PlausibleWeb.Api.ExternalSitesController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Api.ExternalStatsController.html b/PlausibleWeb.Api.ExternalStatsController.html index 3a0cc772f..da7fd0987 100644 --- a/PlausibleWeb.Api.ExternalStatsController.html +++ b/PlausibleWeb.Api.ExternalStatsController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Api.Helpers.html b/PlausibleWeb.Api.Helpers.html index 1cc5e1a92..c3c27b3d5 100644 --- a/PlausibleWeb.Api.Helpers.html +++ b/PlausibleWeb.Api.Helpers.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Api.InternalController.html b/PlausibleWeb.Api.InternalController.html index b379f6e92..e506a8e61 100644 --- a/PlausibleWeb.Api.InternalController.html +++ b/PlausibleWeb.Api.InternalController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Api.PaddleController.html b/PlausibleWeb.Api.PaddleController.html index ae6a9ef05..667021ced 100644 --- a/PlausibleWeb.Api.PaddleController.html +++ b/PlausibleWeb.Api.PaddleController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Api.StatsController.html b/PlausibleWeb.Api.StatsController.html index ba010e8d2..819d0b419 100644 --- a/PlausibleWeb.Api.StatsController.html +++ b/PlausibleWeb.Api.StatsController.html @@ -13,7 +13,7 @@ - + @@ -656,13 +656,13 @@ and month. The default depends on the Plausible.Query.from/2 for each default.

  • filters - optional filters to drill down data. See the Stats API "Filtering" section for more details.

  • with_imported - boolean indicating whether to include Google Analytics -imported data or not. Defaults to false.

  • Full example:

    %{
    +imported data or not. Defaults to false.

    Full example:

    %{
       "from" => "2021-09-06",
       "interval" => "month",
       "metric" => "visitors",
       "period" => "custom",
       "to" => "2021-12-13"
    -}

    +}

    response

    @@ -677,20 +677,20 @@ cut off by the requested date range or not. For example, if looking at a month week-by-week, some weeks may be cut off by the month boundaries. It's useful to adjust the graph display slightly in case the interval is not 'full' so that the user understands why the numbers might be lower for -those partial periods.

    Full example:

    %{
    -  "full_intervals" => %{
    +those partial periods.

    Full example:

    %{
    +  "full_intervals" => %{
         "2021-09-01" => false,
         "2021-10-01" => true,
         "2021-11-01" => true,
         "2021-12-01" => false
    -  },
    +  },
       "imported_source" => nil,
       "interval" => "month",
    -  "labels" => ["2021-09-01", "2021-10-01", "2021-11-01", "2021-12-01"],
    -  "plot" => [0, 0, 0, 0],
    +  "labels" => ["2021-09-01", "2021-10-01", "2021-11-01", "2021-12-01"],
    +  "plot" => [0, 0, 0, 0],
       "present_index" => nil,
       "with_imported" => false
    -}
    +
    }
    diff --git a/PlausibleWeb.AuthController.html b/PlausibleWeb.AuthController.html index 5c7878dc6..7ba0c3cf3 100644 --- a/PlausibleWeb.AuthController.html +++ b/PlausibleWeb.AuthController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.AuthPlug.html b/PlausibleWeb.AuthPlug.html index dc035d93c..cf1fde8fa 100644 --- a/PlausibleWeb.AuthPlug.html +++ b/PlausibleWeb.AuthPlug.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.AuthView.html b/PlausibleWeb.AuthView.html index 2586d14ca..b2cb3d9af 100644 --- a/PlausibleWeb.AuthView.html +++ b/PlausibleWeb.AuthView.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.AuthorizeSiteAccess.html b/PlausibleWeb.AuthorizeSiteAccess.html index a300edc65..ca53126ad 100644 --- a/PlausibleWeb.AuthorizeSiteAccess.html +++ b/PlausibleWeb.AuthorizeSiteAccess.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.AuthorizeSitesApiPlug.html b/PlausibleWeb.AuthorizeSitesApiPlug.html index cba9a9398..db64ad63f 100644 --- a/PlausibleWeb.AuthorizeSitesApiPlug.html +++ b/PlausibleWeb.AuthorizeSitesApiPlug.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.AuthorizeStatsApiPlug.html b/PlausibleWeb.AuthorizeStatsApiPlug.html index d72d7b710..d57909b49 100644 --- a/PlausibleWeb.AuthorizeStatsApiPlug.html +++ b/PlausibleWeb.AuthorizeStatsApiPlug.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.BillingController.html b/PlausibleWeb.BillingController.html index e4e484354..1fb4b1782 100644 --- a/PlausibleWeb.BillingController.html +++ b/PlausibleWeb.BillingController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.BillingView.html b/PlausibleWeb.BillingView.html index 2354f694a..95348cf3a 100644 --- a/PlausibleWeb.BillingView.html +++ b/PlausibleWeb.BillingView.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.CRMAuthPlug.html b/PlausibleWeb.CRMAuthPlug.html index 2911fdaa5..5088ca1f1 100644 --- a/PlausibleWeb.CRMAuthPlug.html +++ b/PlausibleWeb.CRMAuthPlug.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Captcha.html b/PlausibleWeb.Captcha.html index 2f92d0b17..46d820021 100644 --- a/PlausibleWeb.Captcha.html +++ b/PlausibleWeb.Captcha.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Components.Generic.html b/PlausibleWeb.Components.Generic.html index 19cde2f11..e6923f2a8 100644 --- a/PlausibleWeb.Components.Generic.html +++ b/PlausibleWeb.Components.Generic.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Components.Site.Feature.html b/PlausibleWeb.Components.Site.Feature.html index d46b0ad9e..2c27baf24 100644 --- a/PlausibleWeb.Components.Site.Feature.html +++ b/PlausibleWeb.Components.Site.Feature.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.ConnCase.html b/PlausibleWeb.ConnCase.html index a73f0509e..c23017774 100644 --- a/PlausibleWeb.ConnCase.html +++ b/PlausibleWeb.ConnCase.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.ControllerHelpers.html b/PlausibleWeb.ControllerHelpers.html index 0a6e44a99..d7bf2c426 100644 --- a/PlausibleWeb.ControllerHelpers.html +++ b/PlausibleWeb.ControllerHelpers.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Email.html b/PlausibleWeb.Email.html index 1e477c704..a0ac4a735 100644 --- a/PlausibleWeb.Email.html +++ b/PlausibleWeb.Email.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.EmailView.html b/PlausibleWeb.EmailView.html index 21c79b103..d817446e0 100644 --- a/PlausibleWeb.EmailView.html +++ b/PlausibleWeb.EmailView.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Endpoint.html b/PlausibleWeb.Endpoint.html index 2378ec421..cd3fbc46e 100644 --- a/PlausibleWeb.Endpoint.html +++ b/PlausibleWeb.Endpoint.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.ErrorHelpers.html b/PlausibleWeb.ErrorHelpers.html index afbb458ac..fd94860bb 100644 --- a/PlausibleWeb.ErrorHelpers.html +++ b/PlausibleWeb.ErrorHelpers.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.ErrorReportController.html b/PlausibleWeb.ErrorReportController.html index adb4fda25..c4c8496e0 100644 --- a/PlausibleWeb.ErrorReportController.html +++ b/PlausibleWeb.ErrorReportController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.ErrorView.html b/PlausibleWeb.ErrorView.html index cb30bd999..7de9c52ab 100644 --- a/PlausibleWeb.ErrorView.html +++ b/PlausibleWeb.ErrorView.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Favicon.html b/PlausibleWeb.Favicon.html index a28ec26d5..fcb34c415 100644 --- a/PlausibleWeb.Favicon.html +++ b/PlausibleWeb.Favicon.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.FirstLaunchPlug.html b/PlausibleWeb.FirstLaunchPlug.html index 4e4dd2417..4645bf215 100644 --- a/PlausibleWeb.FirstLaunchPlug.html +++ b/PlausibleWeb.FirstLaunchPlug.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.FormHelpers.html b/PlausibleWeb.FormHelpers.html index 9fc52f0cb..a6448fe9f 100644 --- a/PlausibleWeb.FormHelpers.html +++ b/PlausibleWeb.FormHelpers.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.InvitationController.html b/PlausibleWeb.InvitationController.html index 518266895..6b71db712 100644 --- a/PlausibleWeb.InvitationController.html +++ b/PlausibleWeb.InvitationController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.LastSeenPlug.html b/PlausibleWeb.LastSeenPlug.html index a41e4c086..97f3b42e8 100644 --- a/PlausibleWeb.LastSeenPlug.html +++ b/PlausibleWeb.LastSeenPlug.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.LayoutView.html b/PlausibleWeb.LayoutView.html index 34058a85e..44185d64d 100644 --- a/PlausibleWeb.LayoutView.html +++ b/PlausibleWeb.LayoutView.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Live.Components.ComboBox.StaticSearch.html b/PlausibleWeb.Live.Components.ComboBox.StaticSearch.html index 58e3f323a..ce6ab4a74 100644 --- a/PlausibleWeb.Live.Components.ComboBox.StaticSearch.html +++ b/PlausibleWeb.Live.Components.ComboBox.StaticSearch.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Live.Components.ComboBox.html b/PlausibleWeb.Live.Components.ComboBox.html index b68b5d9d8..9047ab3fd 100644 --- a/PlausibleWeb.Live.Components.ComboBox.html +++ b/PlausibleWeb.Live.Components.ComboBox.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Live.Flash.html b/PlausibleWeb.Live.Flash.html index 7438cd78b..327f60f34 100644 --- a/PlausibleWeb.Live.Flash.html +++ b/PlausibleWeb.Live.Flash.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Live.FunnelSettings.Form.html b/PlausibleWeb.Live.FunnelSettings.Form.html index 1bbb28cb7..3d463dfad 100644 --- a/PlausibleWeb.Live.FunnelSettings.Form.html +++ b/PlausibleWeb.Live.FunnelSettings.Form.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Live.FunnelSettings.List.html b/PlausibleWeb.Live.FunnelSettings.List.html index 2f1cb9db8..fbe18aee0 100644 --- a/PlausibleWeb.Live.FunnelSettings.List.html +++ b/PlausibleWeb.Live.FunnelSettings.List.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Live.FunnelSettings.html b/PlausibleWeb.Live.FunnelSettings.html index 1afb10f88..c9eeee1c0 100644 --- a/PlausibleWeb.Live.FunnelSettings.html +++ b/PlausibleWeb.Live.FunnelSettings.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.MJML.WeeklyReport.html b/PlausibleWeb.MJML.WeeklyReport.html index 497e985da..4deb2e065 100644 --- a/PlausibleWeb.MJML.WeeklyReport.html +++ b/PlausibleWeb.MJML.WeeklyReport.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.PageController.html b/PlausibleWeb.PageController.html index 6ab22ec26..63a2a30d2 100644 --- a/PlausibleWeb.PageController.html +++ b/PlausibleWeb.PageController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.PageView.html b/PlausibleWeb.PageView.html index c278ad462..68612f0ea 100644 --- a/PlausibleWeb.PageView.html +++ b/PlausibleWeb.PageView.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugs.NoRobots.html b/PlausibleWeb.Plugs.NoRobots.html index 2c911d08b..02cad4cea 100644 --- a/PlausibleWeb.Plugs.NoRobots.html +++ b/PlausibleWeb.Plugs.NoRobots.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugs.RuntimeSessionAdapter.html b/PlausibleWeb.Plugs.RuntimeSessionAdapter.html index f2144e09e..e558d51c4 100644 --- a/PlausibleWeb.Plugs.RuntimeSessionAdapter.html +++ b/PlausibleWeb.Plugs.RuntimeSessionAdapter.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.RefInspector.html b/PlausibleWeb.RefInspector.html index b578e1582..f9785a4bb 100644 --- a/PlausibleWeb.RefInspector.html +++ b/PlausibleWeb.RefInspector.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.RemoteIp.html b/PlausibleWeb.RemoteIp.html index 68f0958ca..37ed9a90c 100644 --- a/PlausibleWeb.RemoteIp.html +++ b/PlausibleWeb.RemoteIp.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.RequireAccountPlug.html b/PlausibleWeb.RequireAccountPlug.html index 39ae0d8bd..132bc0431 100644 --- a/PlausibleWeb.RequireAccountPlug.html +++ b/PlausibleWeb.RequireAccountPlug.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.RequireLoggedOutPlug.html b/PlausibleWeb.RequireLoggedOutPlug.html index cf9d9f2e7..03dce76a8 100644 --- a/PlausibleWeb.RequireLoggedOutPlug.html +++ b/PlausibleWeb.RequireLoggedOutPlug.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Router.html b/PlausibleWeb.Router.html index d6e2ba246..0470d22ab 100644 --- a/PlausibleWeb.Router.html +++ b/PlausibleWeb.Router.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.SessionTimeoutPlug.html b/PlausibleWeb.SessionTimeoutPlug.html index 8c1e35e18..ba3d99b42 100644 --- a/PlausibleWeb.SessionTimeoutPlug.html +++ b/PlausibleWeb.SessionTimeoutPlug.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Site.MembershipController.html b/PlausibleWeb.Site.MembershipController.html index dc54b6edb..9bd7aca0e 100644 --- a/PlausibleWeb.Site.MembershipController.html +++ b/PlausibleWeb.Site.MembershipController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Site.MembershipView.html b/PlausibleWeb.Site.MembershipView.html index e55069844..74325a292 100644 --- a/PlausibleWeb.Site.MembershipView.html +++ b/PlausibleWeb.Site.MembershipView.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.SiteController.html b/PlausibleWeb.SiteController.html index c95f8baac..19a5e1758 100644 --- a/PlausibleWeb.SiteController.html +++ b/PlausibleWeb.SiteController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.SiteView.html b/PlausibleWeb.SiteView.html index 641648a63..ceadce862 100644 --- a/PlausibleWeb.SiteView.html +++ b/PlausibleWeb.SiteView.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.StatsController.html b/PlausibleWeb.StatsController.html index 3d3de31c9..d65ed2523 100644 --- a/PlausibleWeb.StatsController.html +++ b/PlausibleWeb.StatsController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.StatsView.html b/PlausibleWeb.StatsView.html index b1106252d..4bbac4573 100644 --- a/PlausibleWeb.StatsView.html +++ b/PlausibleWeb.StatsView.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Tracker.html b/PlausibleWeb.Tracker.html index 88d103089..b5ba190b8 100644 --- a/PlausibleWeb.Tracker.html +++ b/PlausibleWeb.Tracker.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.UnsubscribeController.html b/PlausibleWeb.UnsubscribeController.html index e8cb8abb3..fc916f056 100644 --- a/PlausibleWeb.UnsubscribeController.html +++ b/PlausibleWeb.UnsubscribeController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.UnsubscribeView.html b/PlausibleWeb.UnsubscribeView.html index 634cb46f5..3ba8367c3 100644 --- a/PlausibleWeb.UnsubscribeView.html +++ b/PlausibleWeb.UnsubscribeView.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.html b/PlausibleWeb.html index 5914ff703..eadef1c54 100644 --- a/PlausibleWeb.html +++ b/PlausibleWeb.html @@ -13,7 +13,7 @@ - + diff --git a/account-locking.html b/account-locking.html index ab5c51820..fd8201593 100644 --- a/account-locking.html +++ b/account-locking.html @@ -13,7 +13,7 @@ - + diff --git a/api-reference.html b/api-reference.html index 2f54699aa..c6818a2de 100644 --- a/api-reference.html +++ b/api-reference.html @@ -13,7 +13,7 @@ - + diff --git a/contributing.html b/contributing.html index 8c7bc9b5c..7cb488568 100644 --- a/contributing.html +++ b/contributing.html @@ -13,7 +13,7 @@ - + diff --git a/dist/search_items-5710C136.js b/dist/search_items-5710C136.js deleted file mode 100644 index e97272174..000000000 --- a/dist/search_items-5710C136.js +++ /dev/null @@ -1 +0,0 @@ -searchNodes=[{"doc":"","ref":"Mix.Tasks.AnalyzePlans.html","title":"Mix.Tasks.AnalyzePlans","type":"task"},{"doc":"Callback implementation for Mix.Task.run/1 .","ref":"Mix.Tasks.AnalyzePlans.html#run/1","title":"Mix.Tasks.AnalyzePlans.run/1","type":"function"},{"doc":"","ref":"Mix.Tasks.CleanClickhouse.html","title":"Mix.Tasks.CleanClickhouse","type":"task"},{"doc":"Callback implementation for Mix.Task.run/1 .","ref":"Mix.Tasks.CleanClickhouse.html#run/1","title":"Mix.Tasks.CleanClickhouse.run/1","type":"function"},{"doc":"","ref":"Mix.Tasks.CreateFreeSubscription.html","title":"Mix.Tasks.CreateFreeSubscription","type":"task"},{"doc":"","ref":"Mix.Tasks.CreateFreeSubscription.html#execute/1","title":"Mix.Tasks.CreateFreeSubscription.execute/1","type":"function"},{"doc":"Callback implementation for Mix.Task.run/1 .","ref":"Mix.Tasks.CreateFreeSubscription.html#run/1","title":"Mix.Tasks.CreateFreeSubscription.run/1","type":"function"},{"doc":"This task downloads the Country Lite database from DB-IP for self-hosted or development purposes. Plausible Cloud runs a paid version of DB-IP with more detailed geolocation data.","ref":"Mix.Tasks.DownloadCountryDatabase.html","title":"Mix.Tasks.DownloadCountryDatabase","type":"task"},{"doc":"Callback implementation for Mix.Task.run/1 .","ref":"Mix.Tasks.DownloadCountryDatabase.html#run/1","title":"Mix.Tasks.DownloadCountryDatabase.run/1","type":"function"},{"doc":"","ref":"Mix.Tasks.GenerateReferrerFavicons.html","title":"Mix.Tasks.GenerateReferrerFavicons","type":"task"},{"doc":"Callback implementation for Mix.Task.run/1 .","ref":"Mix.Tasks.GenerateReferrerFavicons.html#run/1","title":"Mix.Tasks.GenerateReferrerFavicons.run/1","type":"function"},{"doc":"","ref":"Mix.Tasks.PullSandboxSubscription.html","title":"Mix.Tasks.PullSandboxSubscription","type":"task"},{"doc":"Callback implementation for Mix.Task.run/1 .","ref":"Mix.Tasks.PullSandboxSubscription.html#run/1","title":"Mix.Tasks.PullSandboxSubscription.run/1","type":"function"},{"doc":"It's often necessary to generate fake events for development and testing purposes. This Mix Task provides a quick and easy way to generate a pageview or custom event, either in your development environment or a remote Plausible instance. See Mix.Tasks.SendPageview.usage/1 for more detailed documentation.","ref":"Mix.Tasks.SendPageview.html","title":"Mix.Tasks.SendPageview","type":"task"},{"doc":"Callback implementation for Mix.Task.run/1 .","ref":"Mix.Tasks.SendPageview.html#run/1","title":"Mix.Tasks.SendPageview.run/1","type":"function"},{"doc":"","ref":"ObanErrorReporter.html","title":"ObanErrorReporter","type":"module"},{"doc":"","ref":"ObanErrorReporter.html#handle_event/4","title":"ObanErrorReporter.handle_event/4","type":"function"},{"doc":"Plausible keeps the contexts that define your domain and business logic. Contexts are also responsible for managing your data, regardless if it comes from the database, an external API or others.","ref":"Plausible.html","title":"Plausible","type":"module"},{"doc":"Clickhouse access with async inserts enabled","ref":"Plausible.AsyncInsertRepo.html","title":"Plausible.AsyncInsertRepo","type":"module"},{"doc":"Callback implementation for Ecto.Repo.aggregate/3 .","ref":"Plausible.AsyncInsertRepo.html#aggregate/3","title":"Plausible.AsyncInsertRepo.aggregate/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.aggregate/4 .","ref":"Plausible.AsyncInsertRepo.html#aggregate/4","title":"Plausible.AsyncInsertRepo.aggregate/4","type":"function"},{"doc":"Callback implementation for Ecto.Repo.all/2 .","ref":"Plausible.AsyncInsertRepo.html#all/2","title":"Plausible.AsyncInsertRepo.all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checked_out?/0 .","ref":"Plausible.AsyncInsertRepo.html#checked_out?/0","title":"Plausible.AsyncInsertRepo.checked_out?/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checkout/2 .","ref":"Plausible.AsyncInsertRepo.html#checkout/2","title":"Plausible.AsyncInsertRepo.checkout/2","type":"function"},{"doc":"","ref":"Plausible.AsyncInsertRepo.html#child_spec/1","title":"Plausible.AsyncInsertRepo.child_spec/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.config/0 .","ref":"Plausible.AsyncInsertRepo.html#config/0","title":"Plausible.AsyncInsertRepo.config/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.default_options/1 .","ref":"Plausible.AsyncInsertRepo.html#default_options/1","title":"Plausible.AsyncInsertRepo.default_options/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete/2 .","ref":"Plausible.AsyncInsertRepo.html#delete/2","title":"Plausible.AsyncInsertRepo.delete/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete!/2 .","ref":"Plausible.AsyncInsertRepo.html#delete!/2","title":"Plausible.AsyncInsertRepo.delete!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete_all/2 .","ref":"Plausible.AsyncInsertRepo.html#delete_all/2","title":"Plausible.AsyncInsertRepo.delete_all/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that forces all connections in the pool to disconnect within the given interval. See Ecto.Adapters.SQL.disconnect_all/3 for more information.","ref":"Plausible.AsyncInsertRepo.html#disconnect_all/2","title":"Plausible.AsyncInsertRepo.disconnect_all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.exists?/2 .","ref":"Plausible.AsyncInsertRepo.html#exists?/2","title":"Plausible.AsyncInsertRepo.exists?/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get/3 .","ref":"Plausible.AsyncInsertRepo.html#get/3","title":"Plausible.AsyncInsertRepo.get/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get!/3 .","ref":"Plausible.AsyncInsertRepo.html#get!/3","title":"Plausible.AsyncInsertRepo.get!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by/3 .","ref":"Plausible.AsyncInsertRepo.html#get_by/3","title":"Plausible.AsyncInsertRepo.get_by/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by!/3 .","ref":"Plausible.AsyncInsertRepo.html#get_by!/3","title":"Plausible.AsyncInsertRepo.get_by!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_dynamic_repo/0 .","ref":"Plausible.AsyncInsertRepo.html#get_dynamic_repo/0","title":"Plausible.AsyncInsertRepo.get_dynamic_repo/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert/2 .","ref":"Plausible.AsyncInsertRepo.html#insert/2","title":"Plausible.AsyncInsertRepo.insert/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert!/2 .","ref":"Plausible.AsyncInsertRepo.html#insert!/2","title":"Plausible.AsyncInsertRepo.insert!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_all/3 .","ref":"Plausible.AsyncInsertRepo.html#insert_all/3","title":"Plausible.AsyncInsertRepo.insert_all/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_or_update/2 .","ref":"Plausible.AsyncInsertRepo.html#insert_or_update/2","title":"Plausible.AsyncInsertRepo.insert_or_update/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_or_update!/2 .","ref":"Plausible.AsyncInsertRepo.html#insert_or_update!/2","title":"Plausible.AsyncInsertRepo.insert_or_update!/2","type":"function"},{"doc":"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 use Ecto.Schema @primary_key false schema "ecto_ch_demo" do field :a , Ch , type : "UInt64" field :b , :string 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 ) # schemaless { 100_000 , nil } = Repo . insert_stream ( "ecto_ch_demo" , rows , types : [ a : Ch.Types . u64 ( ) , b : :string ] )","ref":"Plausible.AsyncInsertRepo.html#insert_stream/3","title":"Plausible.AsyncInsertRepo.insert_stream/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.load/2 .","ref":"Plausible.AsyncInsertRepo.html#load/2","title":"Plausible.AsyncInsertRepo.load/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one/2 .","ref":"Plausible.AsyncInsertRepo.html#one/2","title":"Plausible.AsyncInsertRepo.one/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one!/2 .","ref":"Plausible.AsyncInsertRepo.html#one!/2","title":"Plausible.AsyncInsertRepo.one!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.preload/3 .","ref":"Plausible.AsyncInsertRepo.html#preload/3","title":"Plausible.AsyncInsertRepo.preload/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.prepare_query/3 .","ref":"Plausible.AsyncInsertRepo.html#prepare_query/3","title":"Plausible.AsyncInsertRepo.prepare_query/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.put_dynamic_repo/1 .","ref":"Plausible.AsyncInsertRepo.html#put_dynamic_repo/1","title":"Plausible.AsyncInsertRepo.put_dynamic_repo/1","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query/4 for more information.","ref":"Plausible.AsyncInsertRepo.html#query/3","title":"Plausible.AsyncInsertRepo.query/3","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query!/4 for more information.","ref":"Plausible.AsyncInsertRepo.html#query!/3","title":"Plausible.AsyncInsertRepo.query!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload/2 .","ref":"Plausible.AsyncInsertRepo.html#reload/2","title":"Plausible.AsyncInsertRepo.reload/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload!/2 .","ref":"Plausible.AsyncInsertRepo.html#reload!/2","title":"Plausible.AsyncInsertRepo.reload!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.start_link/1 .","ref":"Plausible.AsyncInsertRepo.html#start_link/1","title":"Plausible.AsyncInsertRepo.start_link/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stop/1 .","ref":"Plausible.AsyncInsertRepo.html#stop/1","title":"Plausible.AsyncInsertRepo.stop/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stream/2 .","ref":"Plausible.AsyncInsertRepo.html#stream/2","title":"Plausible.AsyncInsertRepo.stream/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that translates the given query to SQL. See Ecto.Adapters.SQL.to_sql/3 for more information.","ref":"Plausible.AsyncInsertRepo.html#to_sql/2","title":"Plausible.AsyncInsertRepo.to_sql/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update/2 .","ref":"Plausible.AsyncInsertRepo.html#update/2","title":"Plausible.AsyncInsertRepo.update/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update!/2 .","ref":"Plausible.AsyncInsertRepo.html#update!/2","title":"Plausible.AsyncInsertRepo.update!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update_all/3 .","ref":"Plausible.AsyncInsertRepo.html#update_all/3","title":"Plausible.AsyncInsertRepo.update_all/3","type":"function"},{"doc":"","ref":"Plausible.Auth.html","title":"Plausible.Auth","type":"module"},{"doc":"","ref":"Plausible.Auth.html#create_user/3","title":"Plausible.Auth.create_user/3","type":"function"},{"doc":"","ref":"Plausible.Auth.html#delete_user/1","title":"Plausible.Auth.delete_user/1","type":"function"},{"doc":"","ref":"Plausible.Auth.html#enterprise?/1","title":"Plausible.Auth.enterprise?/1","type":"function"},{"doc":"","ref":"Plausible.Auth.html#find_user_by/1","title":"Plausible.Auth.find_user_by/1","type":"function"},{"doc":"","ref":"Plausible.Auth.html#has_active_sites?/2","title":"Plausible.Auth.has_active_sites?/2","type":"function"},{"doc":"","ref":"Plausible.Auth.html#is_super_admin?/1","title":"Plausible.Auth.is_super_admin?/1","type":"function"},{"doc":"","ref":"Plausible.Auth.html#issue_email_verification/1","title":"Plausible.Auth.issue_email_verification/1","type":"function"},{"doc":"","ref":"Plausible.Auth.html#user_owns_sites?/1","title":"Plausible.Auth.user_owns_sites?/1","type":"function"},{"doc":"","ref":"Plausible.Auth.html#verify_email/2","title":"Plausible.Auth.verify_email/2","type":"function"},{"doc":"","ref":"Plausible.Auth.ApiKey.html","title":"Plausible.Auth.ApiKey","type":"module"},{"doc":"","ref":"Plausible.Auth.ApiKey.html#changeset/2","title":"Plausible.Auth.ApiKey.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Auth.ApiKey.html#do_hash/1","title":"Plausible.Auth.ApiKey.do_hash/1","type":"function"},{"doc":"","ref":"Plausible.Auth.ApiKey.html#process_key/1","title":"Plausible.Auth.ApiKey.process_key/1","type":"function"},{"doc":"","ref":"Plausible.Auth.ApiKey.html#update/2","title":"Plausible.Auth.ApiKey.update/2","type":"function"},{"doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html","title":"Plausible.Auth.ApiKeyAdmin","type":"module"},{"doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#create_changeset/2","title":"Plausible.Auth.ApiKeyAdmin.create_changeset/2","type":"function"},{"doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#custom_index_query/3","title":"Plausible.Auth.ApiKeyAdmin.custom_index_query/3","type":"function"},{"doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#form_fields/1","title":"Plausible.Auth.ApiKeyAdmin.form_fields/1","type":"function"},{"doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#index/1","title":"Plausible.Auth.ApiKeyAdmin.index/1","type":"function"},{"doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#search_fields/1","title":"Plausible.Auth.ApiKeyAdmin.search_fields/1","type":"function"},{"doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#update_changeset/2","title":"Plausible.Auth.ApiKeyAdmin.update_changeset/2","type":"function"},{"doc":"This embedded schema stores information about the account locking grace period. Users are given this 7-day grace period to upgrade their account after outgrowing their subscriptions. The actual account locking happens in background with Plausible.Workers.LockSites . The grace period can also be manual, without an end date, being controlled manually from the CRM, and not by the background site locker job. This is useful for enterprise subscriptions.","ref":"Plausible.Auth.GracePeriod.html","title":"Plausible.Auth.GracePeriod","type":"module"},{"doc":"Returns whether the grace period is still active for a User. Defaults to false if the user is nil or there is no grace period.","ref":"Plausible.Auth.GracePeriod.html#active?/1","title":"Plausible.Auth.GracePeriod.active?/1","type":"function"},{"doc":"Ends an existing grace period by setting users.grace_period.is_over to true. This means the grace period has expired.","ref":"Plausible.Auth.GracePeriod.html#end_changeset/1","title":"Plausible.Auth.GracePeriod.end_changeset/1","type":"function"},{"doc":"Returns whether the grace period has already expired for a User. Defaults to false if the user is nil or there is no grace period.","ref":"Plausible.Auth.GracePeriod.html#expired?/1","title":"Plausible.Auth.GracePeriod.expired?/1","type":"function"},{"doc":"Removes the grace period from the User completely.","ref":"Plausible.Auth.GracePeriod.html#remove_changeset/1","title":"Plausible.Auth.GracePeriod.remove_changeset/1","type":"function"},{"doc":"Starts a account locking grace period of 7 days by changing the User struct.","ref":"Plausible.Auth.GracePeriod.html#start_changeset/2","title":"Plausible.Auth.GracePeriod.start_changeset/2","type":"function"},{"doc":"Starts a manual account locking grace period by changing the User struct. Manual locking means the grace period can only be removed manually from the CRM.","ref":"Plausible.Auth.GracePeriod.html#start_manual_lock_changeset/2","title":"Plausible.Auth.GracePeriod.start_manual_lock_changeset/2","type":"function"},{"doc":"","ref":"Plausible.Auth.GracePeriod.html#t:t/0","title":"Plausible.Auth.GracePeriod.t/0","type":"type"},{"doc":"","ref":"Plausible.Auth.Invitation.html","title":"Plausible.Auth.Invitation","type":"module"},{"doc":"","ref":"Plausible.Auth.Invitation.html#new/1","title":"Plausible.Auth.Invitation.new/1","type":"function"},{"doc":"","ref":"Plausible.Auth.Password.html","title":"Plausible.Auth.Password","type":"module"},{"doc":"","ref":"Plausible.Auth.Password.html#dummy_calculation/0","title":"Plausible.Auth.Password.dummy_calculation/0","type":"function"},{"doc":"","ref":"Plausible.Auth.Password.html#hash/1","title":"Plausible.Auth.Password.hash/1","type":"function"},{"doc":"","ref":"Plausible.Auth.Password.html#match?/2","title":"Plausible.Auth.Password.match?/2","type":"function"},{"doc":"","ref":"Plausible.Auth.Token.html","title":"Plausible.Auth.Token","type":"module"},{"doc":"","ref":"Plausible.Auth.Token.html#sign_password_reset/1","title":"Plausible.Auth.Token.sign_password_reset/1","type":"function"},{"doc":"","ref":"Plausible.Auth.Token.html#sign_shared_link/1","title":"Plausible.Auth.Token.sign_shared_link/1","type":"function"},{"doc":"","ref":"Plausible.Auth.Token.html#verify_password_reset/1","title":"Plausible.Auth.Token.verify_password_reset/1","type":"function"},{"doc":"","ref":"Plausible.Auth.Token.html#verify_shared_link/1","title":"Plausible.Auth.Token.verify_shared_link/1","type":"function"},{"doc":"","ref":"Plausible.Auth.User.html","title":"Plausible.Auth.User","type":"module"},{"doc":"","ref":"Plausible.Auth.User.html#changeset/2","title":"Plausible.Auth.User.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Auth.User.html#end_trial/1","title":"Plausible.Auth.User.end_trial/1","type":"function"},{"doc":"","ref":"Plausible.Auth.User.html#hash_password/1","title":"Plausible.Auth.User.hash_password/1","type":"function"},{"doc":"","ref":"Plausible.Auth.User.html#new/1","title":"Plausible.Auth.User.new/1","type":"function"},{"doc":"","ref":"Plausible.Auth.User.html#remove_trial_expiry/1","title":"Plausible.Auth.User.remove_trial_expiry/1","type":"function"},{"doc":"","ref":"Plausible.Auth.User.html#set_password/2","title":"Plausible.Auth.User.set_password/2","type":"function"},{"doc":"","ref":"Plausible.Auth.User.html#start_trial/1","title":"Plausible.Auth.User.start_trial/1","type":"function"},{"doc":"","ref":"Plausible.Auth.User.html#t:t/0","title":"Plausible.Auth.User.t/0","type":"type"},{"doc":"","ref":"Plausible.Auth.UserAdmin.html","title":"Plausible.Auth.UserAdmin","type":"module"},{"doc":"","ref":"Plausible.Auth.UserAdmin.html#custom_index_query/3","title":"Plausible.Auth.UserAdmin.custom_index_query/3","type":"function"},{"doc":"","ref":"Plausible.Auth.UserAdmin.html#form_fields/1","title":"Plausible.Auth.UserAdmin.form_fields/1","type":"function"},{"doc":"","ref":"Plausible.Auth.UserAdmin.html#index/1","title":"Plausible.Auth.UserAdmin.index/1","type":"function"},{"doc":"","ref":"Plausible.Auth.UserAdmin.html#resource_actions/1","title":"Plausible.Auth.UserAdmin.resource_actions/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html","title":"Plausible.Billing","type":"module"},{"doc":"","ref":"Plausible.Billing.html#active_subscription_for/1","title":"Plausible.Billing.active_subscription_for/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html#change_plan/2","title":"Plausible.Billing.change_plan/2","type":"function"},{"doc":"","ref":"Plausible.Billing.html#change_plan_preview/2","title":"Plausible.Billing.change_plan_preview/2","type":"function"},{"doc":"","ref":"Plausible.Billing.html#has_active_subscription?/1","title":"Plausible.Billing.has_active_subscription?/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html#last_two_billing_cycles/2","title":"Plausible.Billing.last_two_billing_cycles/2","type":"function"},{"doc":"","ref":"Plausible.Billing.html#last_two_billing_months_usage/2","title":"Plausible.Billing.last_two_billing_months_usage/2","type":"function"},{"doc":"","ref":"Plausible.Billing.html#needs_to_upgrade?/1","title":"Plausible.Billing.needs_to_upgrade?/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html#on_trial?/1","title":"Plausible.Billing.on_trial?/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html#paddle_api/0","title":"Plausible.Billing.paddle_api/0","type":"function"},{"doc":"Returns the number of sites that an account is allowed to have. Accounts for grandfathering old accounts to unlimited websites and ignores site limit on self-hosted installations.","ref":"Plausible.Billing.html#sites_limit/1","title":"Plausible.Billing.sites_limit/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html#subscription_cancelled/1","title":"Plausible.Billing.subscription_cancelled/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html#subscription_created/1","title":"Plausible.Billing.subscription_created/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html#subscription_payment_succeeded/1","title":"Plausible.Billing.subscription_payment_succeeded/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html#subscription_updated/1","title":"Plausible.Billing.subscription_updated/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html#trial_days_left/1","title":"Plausible.Billing.trial_days_left/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html#usage/1","title":"Plausible.Billing.usage/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html#usage_breakdown/1","title":"Plausible.Billing.usage_breakdown/1","type":"function"},{"doc":"","ref":"Plausible.Billing.EnterprisePlan.html","title":"Plausible.Billing.EnterprisePlan","type":"module"},{"doc":"","ref":"Plausible.Billing.EnterprisePlan.html#changeset/2","title":"Plausible.Billing.EnterprisePlan.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html","title":"Plausible.Billing.EnterprisePlanAdmin","type":"module"},{"doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html#custom_index_query/3","title":"Plausible.Billing.EnterprisePlanAdmin.custom_index_query/3","type":"function"},{"doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html#form_fields/1","title":"Plausible.Billing.EnterprisePlanAdmin.form_fields/1","type":"function"},{"doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html#index/1","title":"Plausible.Billing.EnterprisePlanAdmin.index/1","type":"function"},{"doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html#search_fields/1","title":"Plausible.Billing.EnterprisePlanAdmin.search_fields/1","type":"function"},{"doc":"","ref":"Plausible.Billing.PaddleApi.html","title":"Plausible.Billing.PaddleApi","type":"module"},{"doc":"","ref":"Plausible.Billing.PaddleApi.html#checkout_domain/0","title":"Plausible.Billing.PaddleApi.checkout_domain/0","type":"function"},{"doc":"","ref":"Plausible.Billing.PaddleApi.html#get_invoices/1","title":"Plausible.Billing.PaddleApi.get_invoices/1","type":"function"},{"doc":"","ref":"Plausible.Billing.PaddleApi.html#get_subscription/1","title":"Plausible.Billing.PaddleApi.get_subscription/1","type":"function"},{"doc":"","ref":"Plausible.Billing.PaddleApi.html#update_subscription/2","title":"Plausible.Billing.PaddleApi.update_subscription/2","type":"function"},{"doc":"","ref":"Plausible.Billing.PaddleApi.html#update_subscription_preview/2","title":"Plausible.Billing.PaddleApi.update_subscription_preview/2","type":"function"},{"doc":"","ref":"Plausible.Billing.PaddleApi.html#vendors_domain/0","title":"Plausible.Billing.PaddleApi.vendors_domain/0","type":"function"},{"doc":"","ref":"Plausible.Billing.Plans.html","title":"Plausible.Billing.Plans","type":"module"},{"doc":"","ref":"Plausible.Billing.Plans.html#all_yearly_plan_ids/0","title":"Plausible.Billing.Plans.all_yearly_plan_ids/0","type":"function"},{"doc":"","ref":"Plausible.Billing.Plans.html#allowance/1","title":"Plausible.Billing.Plans.allowance/1","type":"function"},{"doc":"","ref":"Plausible.Billing.Plans.html#for_product_id/1","title":"Plausible.Billing.Plans.for_product_id/1","type":"function"},{"doc":"","ref":"Plausible.Billing.Plans.html#plans_for/1","title":"Plausible.Billing.Plans.plans_for/1","type":"function"},{"doc":"","ref":"Plausible.Billing.Plans.html#subscription_interval/1","title":"Plausible.Billing.Plans.subscription_interval/1","type":"function"},{"doc":"","ref":"Plausible.Billing.Plans.html#suggested_plan/2","title":"Plausible.Billing.Plans.suggested_plan/2","type":"function"},{"doc":"","ref":"Plausible.Billing.Plans.html#t:plan/0","title":"Plausible.Billing.Plans.plan/0","type":"type"},{"doc":"","ref":"Plausible.Billing.SiteLocker.html","title":"Plausible.Billing.SiteLocker","type":"module"},{"doc":"","ref":"Plausible.Billing.SiteLocker.html#check_sites_for/1","title":"Plausible.Billing.SiteLocker.check_sites_for/1","type":"function"},{"doc":"","ref":"Plausible.Billing.SiteLocker.html#set_lock_status_for/2","title":"Plausible.Billing.SiteLocker.set_lock_status_for/2","type":"function"},{"doc":"Helper function for working with Ecto changesets","ref":"Plausible.ChangesetHelpers.html","title":"Plausible.ChangesetHelpers","type":"module"},{"doc":"","ref":"Plausible.ChangesetHelpers.html#traverse_errors/1","title":"Plausible.ChangesetHelpers.traverse_errors/1","type":"function"},{"doc":"Provides the core functions to retrieve and manage the CLDR data that supports formatting and localisation. It provides the core functions to access formatted CLDR data, set and retrieve a current locale and validate certain core data types such as locales, currencies and territories.","ref":"Plausible.Cldr.html","title":"Plausible.Cldr","type":"module"},{"doc":"See Cldr.available_locale_name?/1 .","ref":"Plausible.Cldr.html#available_locale_name?/1","title":"Plausible.Cldr.available_locale_name?/1","type":"function"},{"doc":"Returns the default locale . Example iex> Plausible.Cldr . default_locale ( ) % Cldr.LanguageTag { backend : Plausible.Cldr , canonical_locale_name : "en-001" , cldr_locale_name : :"en-001" , language_subtags : [ ] , extensions : %{ } , gettext_locale_name : "en" , language : "en" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :en , requested_locale_name : "en-001" , script : :Latn , territory : :"001" , transform : %{ } , language_variants : [ ] }","ref":"Plausible.Cldr.html#default_locale/0","title":"Plausible.Cldr.default_locale/0","type":"function"},{"doc":"Returns the default territory when a locale does not specify one and none can be inferred. Example iex> Plausible.Cldr . default_territory ( ) :"001"","ref":"Plausible.Cldr.html#default_territory/0","title":"Plausible.Cldr.default_territory/0","type":"function"},{"doc":"Add locale-specific ellipsis to a string. Arguments string is any String.t or a 2-element list of String.t between which the ellipsis is inserted. backend is any module that includes use Cldr and therefore is a Cldr backend module. The default is Cldr.default_backend!/0 . Note that Cldr.default_backend!/0 will raise an exception if no :default_backend is configured under the :ex_cldr key in config.exs . options is a keyword list of options Options :locale is any valid locale name returned by Cldr.known_locale_names/1 . The default is Cldr.get_locale/0 . :location determines where to place the ellipsis. The options are :after (the default for a single string argument), :between (the default and only valid location for an argument that is a list of two strings) and :before . :format formats based upon whether the ellipsis is inserted between words or sentences. The valid options are :word or :sentence . The default is :sentence . Examples iex> Plausible.Cldr . ellipsis "And furthermore" "And furthermore…" 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 "And furthermore …" iex> Plausible.Cldr . ellipsis [ "And furthermore" , "there is much to be done" ] , locale : :ja , format : :word "And furthermore … there is much to be done"","ref":"Plausible.Cldr.html#ellipsis/2","title":"Plausible.Cldr.ellipsis/2","type":"function"},{"doc":"Return the current locale to be used for Cldr functions that 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 { backend : Elixir.Plausible.Cldr , canonical_locale_name : "pl" , cldr_locale_name : :pl , extensions : %{ } , language : "pl" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :pl , territory : :PL , requested_locale_name : "pl" , script : :Latn , transform : %{ } , language_variants : [ ] }","ref":"Plausible.Cldr.html#get_locale/0","title":"Plausible.Cldr.get_locale/0","type":"function"},{"doc":"See Cldr.known_calendars/0 .","ref":"Plausible.Cldr.html#known_calendars/0","title":"Plausible.Cldr.known_calendars/0","type":"function"},{"doc":"See Cldr.known_currencies/0 .","ref":"Plausible.Cldr.html#known_currencies/0","title":"Plausible.Cldr.known_currencies/0","type":"function"},{"doc":"Returns either the Gettext locale_name in Cldr format or false based upon whether the locale name is configured in Gettext . Arguments locale is any valid locale name returned by Plausible.Cldr.known_gettext_locale_names/0 Examples iex> Plausible.Cldr . known_gettext_locale_name "en" "en" iex> Plausible.Cldr . known_gettext_locale_name "en-SA" false","ref":"Plausible.Cldr.html#known_gettext_locale_name/1","title":"Plausible.Cldr.known_gettext_locale_name/1","type":"function"},{"doc":"Returns a boolean indicating if the specified locale name is configured and available in Gettext. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 Examples iex> Plausible.Cldr . known_gettext_locale_name? ( "en" ) true iex> Plausible.Cldr . known_gettext_locale_name? ( "!!" ) false","ref":"Plausible.Cldr.html#known_gettext_locale_name?/1","title":"Plausible.Cldr.known_gettext_locale_name?/1","type":"function"},{"doc":"Returns a list of Gettext locale names but in CLDR format with underscore replaced by hyphen in order to facilitate comparisons with Cldr locale names.","ref":"Plausible.Cldr.html#known_gettext_locale_names/0","title":"Plausible.Cldr.known_gettext_locale_names/0","type":"function"},{"doc":"Returns either the locale_name or false based upon whether the locale name is configured in Cldr . This is helpful when building a list of or expressions to return the first known locale name from a list. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 Examples iex> Plausible.Cldr . known_locale_name :"en-AU" :"en-AU" iex> Plausible.Cldr . known_locale_name :"en-SA" false","ref":"Plausible.Cldr.html#known_locale_name/1","title":"Plausible.Cldr.known_locale_name/1","type":"function"},{"doc":"Returns a boolean indicating if the specified locale name is configured and available in Cldr. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 Examples iex> Plausible.Cldr . known_locale_name? ( :en ) true iex> Plausible.Cldr . known_locale_name? ( :"!!" ) false","ref":"Plausible.Cldr.html#known_locale_name?/1","title":"Plausible.Cldr.known_locale_name?/1","type":"function"},{"doc":"Returns a list of the known locale names. Known locales are those locales which are the subset of all CLDR locales that have been configured for use either in this module or in Gettext .","ref":"Plausible.Cldr.html#known_locale_names/0","title":"Plausible.Cldr.known_locale_names/0","type":"function"},{"doc":"Returns a list of atoms representing the number systems types known to Cldr . Example iex> Plausible.Cldr . known_number_system_types [ :default , :finance , :native , :traditional ]","ref":"Plausible.Cldr.html#known_number_system_types/0","title":"Plausible.Cldr.known_number_system_types/0","type":"function"},{"doc":"See Cldr.known_number_systems/0 .","ref":"Plausible.Cldr.html#known_number_systems/0","title":"Plausible.Cldr.known_number_systems/0","type":"function"},{"doc":"Returns either the RBNF locale_name or false based upon whether the locale name is configured in Cldr and has RBNF rules defined. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 Examples iex> Plausible.Cldr . known_rbnf_locale_name :en :en iex> Plausible.Cldr . known_rbnf_locale_name :"en-SA" false","ref":"Plausible.Cldr.html#known_rbnf_locale_name/1","title":"Plausible.Cldr.known_rbnf_locale_name/1","type":"function"},{"doc":"Returns a boolean indicating if the specified locale name is configured and available in Cldr and supports rules based number formats (RBNF). Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 Examples iex> Plausible.Cldr . known_rbnf_locale_name? ( :en ) true iex> Plausible.Cldr . known_rbnf_locale_name? ( :"!!" ) false","ref":"Plausible.Cldr.html#known_rbnf_locale_name?/1","title":"Plausible.Cldr.known_rbnf_locale_name?/1","type":"function"},{"doc":"Returns a list of locale names which have rules-based number formats (RBNF).","ref":"Plausible.Cldr.html#known_rbnf_locale_names/0","title":"Plausible.Cldr.known_rbnf_locale_names/0","type":"function"},{"doc":"See Cldr.known_territories/0 .","ref":"Plausible.Cldr.html#known_territories/0","title":"Plausible.Cldr.known_territories/0","type":"function"},{"doc":"Normalizes a string by applying transliteration of common symbols in numbers, currencies and dates","ref":"Plausible.Cldr.html#normalize_lenient_parse/3","title":"Plausible.Cldr.normalize_lenient_parse/3","type":"function"},{"doc":"Set the current locale to be used for Cldr functions that take an optional locale parameter for which a locale is not supplied. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a t:Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 See rfc5646 for the specification of a language tag. Examples iex> Plausible.Cldr . put_locale ( "en" ) { :ok , % Cldr.LanguageTag { backend : Plausible.Cldr , canonical_locale_name : "en" , cldr_locale_name : :en , language_subtags : [ ] , extensions : %{ } , gettext_locale_name : "en" , language : "en" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :en , requested_locale_name : "en" , script : :Latn , territory : :US , 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" } }","ref":"Plausible.Cldr.html#put_locale/1","title":"Plausible.Cldr.put_locale/1","type":"function"},{"doc":"Add locale-specific quotation marks around a string. Arguments string is any valid Elixir string options is a keyword list of options Options locale is any valid locale name returned by Cldr.known_locale_names/1 . The default is Cldr.get_locale/0 Examples iex> Plausible.Cldr . quote "Quoted String" "“Quoted String”" iex> Plausible.Cldr . quote "Quoted String" , locale : :ja "「Quoted String」"","ref":"Plausible.Cldr.html#quote/2","title":"Plausible.Cldr.quote/2","type":"function"},{"doc":"Returns a list of the locales names that are configured, but not known in CLDR. Since there is a compile-time exception raised if there are any unknown locales this function should always return an empty list.","ref":"Plausible.Cldr.html#unknown_locale_names/0","title":"Plausible.Cldr.unknown_locale_names/0","type":"function"},{"doc":"See Cldr.validate_calendar/1 .","ref":"Plausible.Cldr.html#validate_calendar/1","title":"Plausible.Cldr.validate_calendar/1","type":"function"},{"doc":"See Cldr.validate_currency/1 .","ref":"Plausible.Cldr.html#validate_currency/1","title":"Plausible.Cldr.validate_currency/1","type":"function"},{"doc":"Normalise and validate a locale name. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 Returns {:ok, language_tag} {:error, reason} Notes See rfc5646 for the specification of a language tag. Examples iex> Plausible.Cldr . validate_locale ( :en ) { :ok , % Cldr.LanguageTag { backend : Plausible.Cldr , canonical_locale_name : "en" , cldr_locale_name : :en , extensions : %{ } , gettext_locale_name : "en" , language : "en" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :en , requested_locale_name : "en" , script : :Latn , territory : :US , transform : %{ } , language_variants : [ ] } } 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 : %{ } , gettext_locale_name : "en" , language : "en" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :en , requested_locale_name : "en-001" , script : :Latn , territory : :"001" , transform : %{ } , language_variants : [ ] } } iex> Plausible.Cldr . validate_locale ( "zzz" ) { :error , { Cldr.InvalidLanguageError , "The language \\" zzz \\" is invalid" } }","ref":"Plausible.Cldr.html#validate_locale/1","title":"Plausible.Cldr.validate_locale/1","type":"function"},{"doc":"See Cldr.validate_number_system/1 .","ref":"Plausible.Cldr.html#validate_number_system/1","title":"Plausible.Cldr.validate_number_system/1","type":"function"},{"doc":"Normalise and validate a number system type. Arguments number_system_type is any number system type returned by Cldr.known_number_system_types/1 Returns {:ok, normalized_number_system_type} or {:error, {exception, message}} Examples 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 :latn { :error , { Cldr.UnknownNumberSystemTypeError , "The number system type :latn is unknown" } } iex> Plausible.Cldr . validate_number_system_type "bork" { :error , { Cldr.UnknownNumberSystemTypeError , "The number system type \\" bork \\" is invalid" } }","ref":"Plausible.Cldr.html#validate_number_system_type/1","title":"Plausible.Cldr.validate_number_system_type/1","type":"function"},{"doc":"See Cldr.validate_territory/1 .","ref":"Plausible.Cldr.html#validate_territory/1","title":"Plausible.Cldr.validate_territory/1","type":"function"},{"doc":"Execute a function with a locale ensuring that the current locale is restored after the function. Arguments locale is any valid locale name returned by Cldr.known_locale_names/1 . fun is any 0-arity function or function capture. Returns The value returned by the function fun/0 or {:error, {exception, reason}} if the locale is invalid or raises an exception if the current locale cannot be identified.","ref":"Plausible.Cldr.html#with_locale/2","title":"Plausible.Cldr.with_locale/2","type":"function"},{"doc":"Parses HTTP Accept-Language header values as defined in rfc2616 . The Accept-Language request-header field is similar to Accept, but restricts the set of natural languages that are preferred as a response to the request. Language tags function are provided in 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 * 8 ALPHA * ( "-" 1 * 8 ALPHA ) ) | "*" ) 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."","ref":"Plausible.Cldr.AcceptLanguage.html","title":"Plausible.Cldr.AcceptLanguage","type":"module"},{"doc":"Parse an Accept-Language string and return the best match for a configured Cldr locale. Arguments accept_langauge is a string representing an accept language header Returns {:ok, language_tag} or {:error, reason} Examples 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 : %{ } , gettext_locale_name : nil , language : "zh" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :"zh-Hant" , requested_locale_name : "zh-TW" , script : :Hant , territory : :TW , transform : %{ } , language_variants : [ ] } } 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 : %{ } , gettext_locale_name : nil , language : "zh" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :"zh-Hant" , requested_locale_name : "zh-TW" , script : :Hant , territory : :TW , 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 ( "invalid_tag" ) { :error , { Cldr.LanguageTag.ParseError , "Expected a BCP47 language tag. Could not parse the remaining \\" g \\" starting at position 11" } }","ref":"Plausible.Cldr.AcceptLanguage.html#best_match/1","title":"Plausible.Cldr.AcceptLanguage.best_match/1","type":"function"},{"doc":"Parses an Accept-Language header value in its string or tokenized form to return a tuple of the form {:ok, [{quality, %Cldr.LanguageTag{}}, ...]} sorted by quality. Arguments accept-language is any string in the format defined by rfc2616 backend is any module that includes use Cldr and therefore is a Cldr backend module Returns {:ok, [{quality, language_tag}, ...]} or {:error, {Cldr.AcceptLanguageError, String.t}} If at least one valid language tag is found but errors are also detected on one more more tags, an {ok, list} tuple is returned 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 { backend : TestBackend.Cldr , canonical_locale_name : "da" , cldr_locale_name : :da , language_subtags : [ ] , extensions : %{ } , gettext_locale_name : nil , language : "da" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :da , requested_locale_name : "da" , script : :Latn , territory : :DK , transform : %{ } , language_variants : [ ] } } , { 0.3 , % Cldr.LanguageTag { backend : TestBackend.Cldr , canonical_locale_name : "zh-TW" , cldr_locale_name : :"zh-Hant" , language_subtags : [ ] , extensions : %{ } , gettext_locale_name : nil , language : "zh" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :"zh-Hant" , requested_locale_name : "zh-TW" , script : :Hant , territory : :TW , 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 ( "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 : %{ } , gettext_locale_name : nil , language : "da" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :da , requested_locale_name : "da" , script : :Latn , territory : :DK , transform : %{ } , language_variants : [ ] } } , { 0.3 , % Cldr.LanguageTag { backend : TestBackend.Cldr , canonical_locale_name : "zh-TW" , cldr_locale_name : :"zh-Hant" , language_subtags : [ ] , extensions : %{ } , gettext_locale_name : nil , language : "zh" , 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" } } ] }","ref":"Plausible.Cldr.AcceptLanguage.html#parse/1","title":"Plausible.Cldr.AcceptLanguage.parse/1","type":"function"},{"doc":"Parses an Accept-Language header value in its string or tokenized form to produce a list of tuples of the form [{quality, %Cldr.LanguageTag{}}, ...] sorted by quality in descending order. Arguments accept-language is any string in the format defined by rfc2616 Returns {:ok, [{quality, language_tag}, ...]} or raises a Cldr.AcceptLanguageError exception If at least one valid language tag is found but errors are also detected on one more more tags, an {ok, list} tuple is returned 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 { backend : TestBackend.Cldr , canonical_locale_name : "da" , cldr_locale_name : :da , language_subtags : [ ] , extensions : %{ } , gettext_locale_name : nil , language : "da" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :da , requested_locale_name : "da" , script : :Latn , territory : :DK , transform : %{ } , language_variants : [ ] } } , { 0.3 , % Cldr.LanguageTag { backend : TestBackend.Cldr , canonical_locale_name : "zh-TW" , cldr_locale_name : :"zh-Hant" , language_subtags : [ ] , extensions : %{ } , gettext_locale_name : nil , language : "zh" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :"zh-Hant" , requested_locale_name : "zh-TW" , script : :Hant , territory : :TW , 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 { backend : TestBackend.Cldr , canonical_locale_name : "da" , cldr_locale_name : :da , language_subtags : [ ] , extensions : %{ } , gettext_locale_name : nil , language : "da" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :da , requested_locale_name : "da" , script : :Latn , territory : :DK , transform : %{ } , language_variants : [ ] } } , { 0.3 , % Cldr.LanguageTag { backend : TestBackend.Cldr , canonical_locale_name : "zh-TW" , cldr_locale_name : :"zh-Hant" , language_subtags : [ ] , extensions : %{ } , gettext_locale_name : nil , language : "zh" , 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" } } ]","ref":"Plausible.Cldr.AcceptLanguage.html#parse!/1","title":"Plausible.Cldr.AcceptLanguage.parse!/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Currency.html","title":"Plausible.Cldr.Currency","type":"module"},{"doc":"Returns a map of the metadata for all currencies for a given locale. Arguments locale is any valid locale name returned by MyApp.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1 currency_status is :all , :current , :historic , unannotated or :tender ; or a list of one or more status. The default is :all . See Cldr.Currency.currency_filter/2 . Returns {:ok, currency_map} or {:error, {exception, reason}} Example MyApp.Cldr.Currency.currencies_for_locale "en" => {:ok, %{ FJD : % Cldr.Currency { cash_digits : 2 , cash_rounding : 0 , code : "FJD" , count : %{ one : "Fijian dollar" , other : "Fijian dollars" } , digits : 2 , from : nil , iso_digits : 2 , name : "Fijian Dollar" , narrow_symbol : "$" , rounding : 0 , symbol : "FJD" , tender : true , to : nil } , SUR : % Cldr.Currency { cash_digits : 2 , cash_rounding : 0 , code : "SUR" , count : %{ one : "Soviet rouble" , other : "Soviet roubles" } , digits : 2 , from : nil , iso_digits : nil , name : "Soviet Rouble" , narrow_symbol : nil , rounding : 0 , symbol : "SUR" , tender : true , to : nil } , ... } }","ref":"Plausible.Cldr.Currency.html#currencies_for_locale/3","title":"Plausible.Cldr.Currency.currencies_for_locale/3","type":"function"},{"doc":"Returns a map of the metadata for all currencies for a given locale and raises on error. Arguments locale is any valid locale name returned by MyApp.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1 currency_status is :all , :current , :historic , unannotated or :tender ; or a list of one or more status. The default is :all . See Cldr.Currency.currency_filter/2 . Returns {:ok, currency_map} or raises an exception Example MyApp.Cldr.Currency.currencies_for_locale! "en" => %{ FJD : % Cldr.Currency { cash_digits : 2 , cash_rounding : 0 , code : "FJD" , count : %{ one : "Fijian dollar" , other : "Fijian dollars" } , digits : 2 , from : nil , iso_digits : 2 , name : "Fijian Dollar" , narrow_symbol : "$" , rounding : 0 , symbol : "FJD" , tender : true , to : nil } , SUR : % Cldr.Currency { cash_digits : 2 , cash_rounding : 0 , code : "SUR" , count : %{ one : "Soviet rouble" , other : "Soviet roubles" } , digits : 2 , from : nil , iso_digits : nil , name : "Soviet Rouble" , narrow_symbol : nil , rounding : 0 , symbol : "SUR" , tender : true , to : nil } , ... }","ref":"Plausible.Cldr.Currency.html#currencies_for_locale!/3","title":"Plausible.Cldr.Currency.currencies_for_locale!/3","type":"function"},{"doc":"Returns the currency metadata for the requested currency code. Arguments currency_or_currency_code is a binary or atom representation of an ISO 4217 currency code, or a %Cldr.Currency{} struct. Options :locale is any valid locale name returned by Cldr.known_locale_names/1 or a Cldr.LanguageTag struct returned by Cldr.Locale.new!/2 Returns A {:ok, currency} or {:error, {exception, reason}} Examples 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" } , digits : 2 , iso_digits : 2 , name : "Australian Dollar" , narrow_symbol : "$" , rounding : 0 , symbol : "A$" , tender : true } } 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" } , digits : 2 , iso_digits : 2 , name : "Thai Baht" , narrow_symbol : "฿" , rounding : 0 , symbol : "THB" , tender : true } }","ref":"Plausible.Cldr.Currency.html#currency_for_code/2","title":"Plausible.Cldr.Currency.currency_for_code/2","type":"function"},{"doc":"Returns the currency metadata for the requested currency code. Arguments currency_or_currency_code is a binary or atom representation of an ISO 4217 currency code, or a %Cldr.Currency{} struct. Options :locale is any valid locale name returned by Cldr.known_locale_names/1 or a Cldr.LanguageTag struct returned by Cldr.Locale.new!/2 Returns A t:Cldr.Current.t/0 or raises an exception Examples 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" } , digits : 2 , iso_digits : 2 , name : "Australian Dollar" , narrow_symbol : "$" , rounding : 0 , symbol : "A$" , tender : true } 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" } , digits : 2 , iso_digits : 2 , name : "Thai Baht" , narrow_symbol : "฿" , rounding : 0 , symbol : "THB" , tender : true }","ref":"Plausible.Cldr.Currency.html#currency_for_code!/2","title":"Plausible.Cldr.Currency.currency_for_code!/2","type":"function"},{"doc":"Returns the effective currency for a given locale Arguments locale is a Cldr.LanguageTag struct returned by Cldr.Locale.new!/2 Returns A ISO 4217 currency code as an upcased atom Examples 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> Plausible.Cldr.Currency . currency_from_locale locale :AUD iex> Plausible.Cldr.Currency . currency_from_locale "en-GB" :GBP","ref":"Plausible.Cldr.Currency.html#currency_from_locale/1","title":"Plausible.Cldr.Currency.currency_from_locale/1","type":"function"},{"doc":"Returns a list of historic and the current currency for a given locale. Arguments locale is any valid locale name returned by MyApp.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1 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] } } }","ref":"Plausible.Cldr.Currency.html#currency_history_for_locale/1","title":"Plausible.Cldr.Currency.currency_history_for_locale/1","type":"function"},{"doc":"Returns a map that matches a currency string to a currency code. A currency string is a localised name or symbol representing a currency in a locale-specific manner. Arguments locale is any valid locale name returned by MyApp.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1 currency_status is :all , :current , :historic , unannotated or :tender ; or a list of one or more status. The default is :all . See Cldr.Currency.currency_filter/2 . Returns {:ok, currency_string_map} or {:error, {exception, reason}} Example MyApp.Cldr.Currency . currency_strings "en" => { :ok , %{ "mexican silver pesos" => :MXP , "sudanese dinar" => :SDD , "bad" => :BAD , "rsd" => :RSD , "swazi lilangeni" => :SZL , "zairean new zaire" => :ZRN , "guyanaese dollars" => :GYD , "equatorial guinean ekwele" => :GQE , ... } }","ref":"Plausible.Cldr.Currency.html#currency_strings/3","title":"Plausible.Cldr.Currency.currency_strings/3","type":"function"},{"doc":"Returns a map that matches a currency string to a currency code or raises an exception. A currency string is a localised name or symbol representing a currency in a locale-specific manner. Arguments locale is any valid locale name returned by MyApp.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1 currency_status is :all , :current , :historic , unannotated or :tender ; or a list of one or more status. The default is :all . See Cldr.Currency.currency_filter/2 . Returns {:ok, currency_string_map} or raises an exception Example MyApp.Cldr.Currency . currency_strings! "en" => %{ "mexican silver pesos" => :MXP , "sudanese dinar" => :SDD , "bad" => :BAD , "rsd" => :RSD , "swazi lilangeni" => :SZL , "zairean new zaire" => :ZRN , "guyanaese dollars" => :GYD , "equatorial guinean ekwele" => :GQE , ... }","ref":"Plausible.Cldr.Currency.html#currency_strings!/3","title":"Plausible.Cldr.Currency.currency_strings!/3","type":"function"},{"doc":"Returns the current currency for a given locale. This function does not consider the U extenion parameters cu or rg . It is recommended to us Cldr.Currency.currency_from_locale/1 in most circumstances. Arguments locale is any valid locale name returned by MyApp.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1 Example iex> MyApp.Cldr.Currency . current_currency_from_locale "en" :USD iex> MyApp.Cldr.Currency . current_currency_from_locale "en-AU" :AUD","ref":"Plausible.Cldr.Currency.html#current_currency_from_locale/1","title":"Plausible.Cldr.Currency.current_currency_from_locale/1","type":"function"},{"doc":"Returns a mapping from a territory code to its current currency code. If a territory has no current currency (like Antartica, territory code :AQ ) then no mapping is returned for that territory. Returns A map of {territory_code => Cldr.Currency.t} Example iex> Plausible.Cldr.Currency . current_territory_currencies ( )","ref":"Plausible.Cldr.Currency.html#current_territory_currencies/0","title":"Plausible.Cldr.Currency.current_territory_currencies/0","type":"function"},{"doc":"See Plausible.Cldr.Currency.known_currency_codes/0 .","ref":"Plausible.Cldr.Currency.html#known_currencies/0","title":"Plausible.Cldr.Currency.known_currencies/0","type":"function"},{"doc":"See Plausible.Cldr.Currency.known_currency_code?/1 .","ref":"Plausible.Cldr.Currency.html#known_currency?/1","title":"Plausible.Cldr.Currency.known_currency?/1","type":"function"},{"doc":"Returns a 2-tuple indicating if the supplied currency code is known. Arguments currency_code is a binary or atom representing an ISO4217 currency code Returns {:ok, currency_code} or {:error, {exception, reason}} Examples 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" } }","ref":"Plausible.Cldr.Currency.html#known_currency_code/1","title":"Plausible.Cldr.Currency.known_currency_code/1","type":"function"},{"doc":"Returns a boolean indicating if the supplied currency code is known. Arguments currency_code is a binary or atom representing an ISO4217 currency code Returns true or false Examples iex> Plausible.Cldr.Currency . known_currency_code? "AUD" true iex> Plausible.Cldr.Currency . known_currency_code? "GGG" false iex> Plausible.Cldr.Currency . known_currency_code? :XCV false","ref":"Plausible.Cldr.Currency.html#known_currency_code?/1","title":"Plausible.Cldr.Currency.known_currency_code?/1","type":"function"},{"doc":"Returns a list of all known currency codes. Example iex> Plausible.Cldr.Currency . known_currency_codes","ref":"Plausible.Cldr.Currency.html#known_currency_codes/0","title":"Plausible.Cldr.Currency.known_currency_codes/0","type":"function"},{"doc":"Returns a Currency struct created from the arguments. Arguments currency is a private use currency code in a format defined by ISO4217 which is X followed by two alphanumeric characters. options is a map of options representing the optional elements of the Cldr.Currency.t struct. Options :name is the name of the currency. Required. :digits is the precision of the currency. Required. :symbol is the currency symbol. Optional. :narrow_symbol is an alternative narrow symbol. Optional. :round_nearest is the rounding precision such as 0.05 . Optional. :alt_code is an alternative currency code for application use. :cash_digits is the precision of the currency when used as cash. Optional. :cash_rounding_nearest is the rounding precision when used as cash such as 0.05 . Optional. Returns {:ok, Cldr.Currency.t} or {:error, {exception, message}} Example 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" } , digits : 0 , from : nil , iso_digits : 0 , name : "Custom Name" , narrow_symbol : nil , rounding : 0 , 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." } }","ref":"Plausible.Cldr.Currency.html#new/2","title":"Plausible.Cldr.Currency.new/2","type":"function"},{"doc":"Returns the appropriate currency display name for the currency , based on the plural rules in effect for the locale . Arguments number is an integer, float or Decimal currency is any currency returned by Cldr.Currency.known_currencies/0 options is a keyword list of options Options locale is any valid locale name returned by MyApp.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1 . The default is Plausible.Cldr.get_locale/0 Returns {:ok, plural_string} or {:error, {exception, message}} Examples 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 12 , :USD , locale : "zh" { :ok , "美元" } 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" }","ref":"Plausible.Cldr.Currency.html#pluralize/3","title":"Plausible.Cldr.Currency.pluralize/3","type":"function"},{"doc":"Returns the strings associated with a currency in a given locale. Arguments currency is an ISO4217 currency code locale is any valid locale name returned by MyApp.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1 Returns A list of strings or {:error, {exception, reason}} Example iex> MyApp.Cldr.Currency . strings_for_currency :AUD , "en" [ "a$" , "australian dollars" , "aud" , "australian dollar" ]","ref":"Plausible.Cldr.Currency.html#strings_for_currency/2","title":"Plausible.Cldr.Currency.strings_for_currency/2","type":"function"},{"doc":"Backend module that provides functions to define new locales and display human-readable locale names for presentation purposes.","ref":"Plausible.Cldr.Locale.html","title":"Plausible.Cldr.Locale","type":"module"},{"doc":"Returns the list of fallback locale names, starting with the provided locale name. Fallbacks are a list of locate names which can be used to resolve translation or other localization data if such localised data does not exist for this specific locale. After locale-specific fallbacks are determined, the the default locale and its fallbacks are added to the chain. Arguments locale_name is any locale name returned by Plausible.Cldr.known_locale_names/0 Returns {:ok, list_of_locale_names} or {:error, {exception, reason}} Examples In these examples the default locale is :"en-001" . iex> Plausible.Cldr.Locale . fallback_locale_names ( :"fr-CA" ) { :ok , [ :"fr-CA" , :fr , :"en-001" , :en ] } # 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 , :"en-001" , :en ] }","ref":"Plausible.Cldr.Locale.html#fallback_locale_names/1","title":"Plausible.Cldr.Locale.fallback_locale_names/1","type":"function"},{"doc":"Returns the list of fallback locales, starting with the provided locale name. Fallbacks are a list of locate names which can be used to resolve translation or other localization data if such localised data does not exist for this specific locale. After locale-specific fallbacks are determined, the the default locale and its fallbacks are added to the chain. Arguments locale_name is any locale name returned by Plausible.Cldr.known_locale_names/0 Returns {:ok, list_of_locales} or {:error, {exception, reason}} Examples In these examples the default locale is :"en-001" . Plausible.Cldr.Locale . fallback_locales ( :"fr-CA" ) => { :ok , [ # Cldr.LanguageTag < fr - CA [ validated ] > , # Cldr.LanguageTag < fr [ validated ] > , # Cldr.LanguageTag < en [ 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 < en [ validated ] > ] }","ref":"Plausible.Cldr.Locale.html#fallback_locales/1","title":"Plausible.Cldr.Locale.fallback_locales/1","type":"function"},{"doc":"Returns the "best fit" locale for a given territory. Using the population percentage data from CLDR, the language most commonly spoken in the given territory is used to form a locale name which is then validated against the given backend. First a territory-specific locale is validated and if that fails, the base language only is validate. For example, if the territory is AU then then the language most spoken is "en". First, the locale "en-AU" is validated and if that fails, "en" is validated. Arguments territory is any ISO 3166 Alpha-2 territory code that can be validated by Cldr.validate_territory/1 Returns {:ok, language_tag} or {:error, {exception, reason}} Examples iex> Plausible.Cldr.Locale.locale_for_territory(:AU) Elixir.Plausible.Cldr.validate_locale(:"en-AU") iex> Plausible.Cldr.Locale.locale_for_territory(:US) Elixir.Plausible.Cldr.validate_locale(:"en-US") iex> Plausible.Cldr.Locale.locale_for_territory(:ZZ) {:error, {Cldr.UnknownTerritoryError, "The territory :ZZ is unknown"}}","ref":"Plausible.Cldr.Locale.html#locale_for_territory/1","title":"Plausible.Cldr.Locale.locale_for_territory/1","type":"function"},{"doc":"Returns a "best fit" locale for a host name. Arguments host is any valid host name options is a keyword list of options. The default is [] . Options :tlds is a list of territory codes as upper-cased atoms that are to be considered as top-level domains. See Cldr.Locale.locale_from_host/2 for the default list. Returns {:ok, langauge_tag} or {:error, {exception, reason}} Notes Certain top-level domains have become associated with content underlated to the territory for who the domain is registered. Therefore Google (and perhaps others) do not associate these TLDs as belonging to the territory but rather are considered generic top-level domain names. Examples iex> Plausible.Cldr.Locale . locale_from_host "a.b.com.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" ) { :error , { Cldr.UnknownLocaleError , "No locale was identified for territory \\" com \\" " } }","ref":"Plausible.Cldr.Locale.html#locale_from_host/2","title":"Plausible.Cldr.Locale.locale_from_host/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Locale.html#new/1","title":"Plausible.Cldr.Locale.new/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Locale.html#new!/1","title":"Plausible.Cldr.Locale.new!/1","type":"function"},{"doc":"Returns the last segment of a host that might be a territory. Arguments host is any valid host name Returns {:ok, territory} or {:error, {exception, reason}} Examples 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 \\" " } }","ref":"Plausible.Cldr.Locale.html#territory_from_host/1","title":"Plausible.Cldr.Locale.territory_from_host/1","type":"function"},{"doc":"Returns the territory from a language tag or locale name. Arguments locale is any language tag returned by Plausible.Cldr.Locale.new/1 or a locale name in the list returned by Plausible.Cldr.known_locale_names/0 Returns A territory code as an atom Examples iex> Plausible.Cldr.Locale . territory_from_locale "en-US" :US iex> Plausible.Cldr.Locale . territory_from_locale "en-US-u-rg-GBzzzz" :GB","ref":"Plausible.Cldr.Locale.html#territory_from_locale/1","title":"Plausible.Cldr.Locale.territory_from_locale/1","type":"function"},{"doc":"Returns the time zone from a language tag or locale name. Arguments locale is any language tag returned by Plausible.Cldr.Locale.new/1 or a locale name in the list returned by Plausible.Cldr.known_locale_names/0 Returns A time zone ID as a string or :error if no time zone can be determined Examples iex> Plausible.Cldr.Locale . timezone_from_locale "en-US-u-tz-ausyd" "Australia/Sydney"","ref":"Plausible.Cldr.Locale.html#timezone_from_locale/1","title":"Plausible.Cldr.Locale.timezone_from_locale/1","type":"function"},{"doc":"Formats numbers and currencies based upon CLDR's decimal formats specification. The format specification is documentated in Unicode TR35 . There are several classes of formatting including non-scientific, scientific, rules based (for spelling and ordinal formats), compact formats that display 1k rather than 1,000 and so on. See Cldr.Number.to_string/2 for specific formatting options. Non-Scientific Notation Formatting The following description applies to formats that do not use scientific notation or significant digits: If the number of actual integer digits exceeds the maximum integer digits, then only the least significant digits are shown. For example, 1997 is formatted as "97" if the maximum integer digits is set to 2. If the number of actual integer digits is less than the minimum integer digits, then leading zeros are added. For example, 1997 is formatted as "01997" if the minimum integer digits is set to 5. If the number of actual fraction digits exceeds the maximum fraction digits, then half-even rounding it performed to the maximum fraction digits. For example, 0.125 is formatted as "0.12" if the maximum fraction digits is 2. This behavior can be changed by specifying a rounding increment and a rounding mode. If the number of actual fraction digits is less than the minimum fraction digits, then trailing zeros are added. For example, 0.125 is formatted as "0.1250" if the minimum fraction digits is set to 4. Trailing fractional zeros are not displayed if they occur j positions after the decimal, where j is less than the maximum fraction digits. For example, 0.10004 is formatted as "0.1" if the maximum fraction digits is four or less. Scientific Notation Formatting Numbers in scientific notation are expressed as the product of a mantissa and a power of ten, for example, 1234 can be expressed as 1.234 x 10^3. The mantissa is typically in the half-open interval [1.0, 10.0) or sometimes [0.0, 1.0), but it need not be. In a pattern, the exponent character immediately followed by one or more digit characters indicates scientific notation. Example: "0.###E0" formats the number 1234 as "1.234E3". The number of digit characters after the exponent character gives the minimum exponent digit count. There is no maximum. Negative exponents are formatted using the localized minus sign, not the prefix and suffix from the pattern. This allows patterns such as "0.###E0 m/s". To prefix positive exponents with a localized plus sign, specify '+' between the exponent and the digits: "0.###E+0" will produce formats "1E+1", "1E+0", "1E-1", and so on. (In localized patterns, use the localized plus sign rather than '+'.) The minimum number of integer digits is achieved by adjusting the exponent. Example: 0.00123 formatted with "00.###E0" yields "12.3E-4". This only happens if there is no maximum number of integer digits. If there is a maximum, then the minimum number of integer digits is fixed at one. The maximum number of integer digits, if present, specifies the exponent grouping. The most common use of this is to generate engineering notation, in which the exponent is a multiple of three, for example, "##0.###E0". The number 12345 is formatted using "##0.####E0" as "12.345E3". When using scientific notation, the formatter controls the digit counts using significant digits logic. The maximum number of significant digits limits the total number of integer and fraction digits that will be shown in the mantissa; it does not affect parsing. For example, 12345 formatted with "##0.##E0" is "12.3E3". Exponential patterns may not contain grouping separators. Significant Digits There are two ways of controlling how many digits are shows: (a) significant digits counts, or (b) integer and fraction digit counts. Integer and fraction digit counts are described above. When a formatter is using significant digits counts, it uses however many integer and fraction digits are required to display the specified number of significant digits. It may ignore min/max integer/fraction digits, or it may use them to the extent possible.","ref":"Plausible.Cldr.Number.html","title":"Plausible.Cldr.Number","type":"module"},{"doc":"Parse a string locale-aware manner and return a number. Arguments string is any String.t options is a keyword list of options Options :number is one of :integer , :float , :decimal or nil . The default is nil meaning that the type auto-detected as either an integer or a float . :locale is any locale returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag.t . The default is Plausible.Cldr.get_locale/0 . Returns A number of the requested or default type or {:error, {exception, error}} if no number could be determined Notes This function parses a string to return a number but in a locale-aware manner. It will normalise grouping characters and decimal separators, different forms of the + and - symbols that appear in Unicode and strips any _ characters that might be used for formatting in a string. It then parses the number 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_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,34" , locale : "de" , number : :integer ) { :error , { Cldr.Number.ParseError , "The string \\" +1.000,34 \\" could not be parsed as a number" } }","ref":"Plausible.Cldr.Number.html#parse/2","title":"Plausible.Cldr.Number.parse/2","type":"function"},{"doc":"Resolve curencies from strings within a list. Arguments list is any list in which currency names and symbols are expected options is a keyword list of options Options :locale is any valid locale returned by Cldr.known_locale_names/1 or a Cldr.LanguageTag struct returned by Cldr.Locale.new!/2 The default is Plausible.Cldr.get_locale() :only is an atom or list of atoms representing the currencies or currency types to be considered for a match. The equates to a list of acceptable currencies for parsing. See the notes below for currency types. :except is an atom or list of atoms representing the currencies or currency types to be not considered for a match. This equates to a list of unacceptable currencies for parsing. See the notes below for currency types. :fuzzy is a float greater than 0.0 and less than or equal to 1.0 which is used as input to String.jaro_distance/2 to determine is the provided currency string is close enough to a known currency string for it to identify definitively a currency code. It is recommended to use numbers greater than 0.8 in order to reduce false positives. Notes The :only and :except options accept a list of currency codes and/or currency types. The following types are recognised. If both :only and :except are specified, the :except entries take priority - that means any entries in :except are removed from the :only entries. :all , the default, considers all currencies :current considers those currencies that have a :to date of nil and which also is a known ISO4217 currency :historic is the opposite of :current :tender considers currencies that are legal tender :unannotated considers currencies that don't have "(some string)" in their names. These are usually financial instruments. Examples iex> Plausible.Cldr.Number . scan ( "100 US dollars" ) ...> |> Plausible.Cldr.Number . resolve_currencies [ 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 dollars des États-Unis" ) ...> |> Plausible.Cldr.Number . resolve_currencies ( locale : "fr" ) [ 100 , :USD ]","ref":"Plausible.Cldr.Number.html#resolve_currencies/2","title":"Plausible.Cldr.Number.resolve_currencies/2","type":"function"},{"doc":"Resolve a currency from a string Arguments list is any list in which currency names and symbols are expected options is a keyword list of options Options :locale is any valid locale returned by Cldr.known_locale_names/1 or a Cldr.LanguageTag struct returned by Cldr.Locale.new!/2 The default is Plausible.Cldr.get_locale() :only is an atom or list of atoms representing the currencies or currency types to be considered for a match. The equates to a list of acceptable currencies for parsing. See the notes below for currency types. :except is an atom or list of atoms representing the currencies or currency types to be not considered for a match. This equates to a list of unacceptable currencies for parsing. See the notes below for currency types. :fuzzy is a float greater than 0.0 and less than or equal to 1.0 which is used as input to String.jaro_distance/2 to determine is the provided currency string is close enough to a known currency string for it to identify definitively a currency code. It is recommended to use numbers greater than 0.8 in order to reduce false positives. Returns An ISO4217 currency code as an atom or {:error, {exception, message}} Notes The :only and :except options accept a list of currency codes and/or currency types. The following types are recognised. If both :only and :except are specified, the :except entries take priority - that means any entries in :except are removed from the :only entries. :all , the default, considers all currencies :current considers those currencies that have a :to date of nil and which also is a known ISO4217 currency :historic is the opposite of :current :tender considers currencies that are legal tender :unannotated considers currencies that don't have "(some string)" in their names. These are usually financial instruments. Examples 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 ( "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" } }","ref":"Plausible.Cldr.Number.html#resolve_currency/2","title":"Plausible.Cldr.Number.resolve_currency/2","type":"function"},{"doc":"Resolve and tokenize percent or permille from the beginning and/or the end of a string Arguments list is any list in which percent and permille symbols are expected options is a keyword list of options Options :locale is any valid locale returned by Cldr.known_locale_names/1 or a Cldr.LanguageTag struct returned by Cldr.Locale.new!/2 The default is options[:backend].get_locale() Returns An :percent or permille or {:error, {exception, message}} Examples iex> Plausible.Cldr.Number . resolve_per "11%" [ "11" , :percent ] iex> Plausible.Cldr.Number . resolve_per "% of linguists" [ :percent , " of linguists" ] iex> Plausible.Cldr.Number . resolve_per "% of linguists %" [ :percent , " of linguists " , :percent ]","ref":"Plausible.Cldr.Number.html#resolve_per/2","title":"Plausible.Cldr.Number.resolve_per/2","type":"function"},{"doc":"Resolve and tokenize percent and permille sybols from strings within a list. Percent and permille symbols can be identified at the beginning and/or the end of a string. Arguments list is any list in which percent and permille symbols are expected options is a keyword list of options Options :locale is any valid locale returned by Cldr.known_locale_names/1 or a t:Cldr.LanguageTag struct returned by Cldr.Locale.new!/2 The default is options[:backend].get_locale() Examples iex> Plausible.Cldr.Number . scan ( "100%" ) ...> |> Plausible.Cldr.Number . resolve_pers ( ) [ 100 , :percent ]","ref":"Plausible.Cldr.Number.html#resolve_pers/2","title":"Plausible.Cldr.Number.resolve_pers/2","type":"function"},{"doc":"Scans a string locale-aware manner and returns a list of strings and numbers. Arguments string is any String.t options is a keyword list of options Options :number is one of :integer , :float , :decimal or nil . The default is nil meaning that the type auto-detected as either an integer or a float . :locale is any locale returned by Cldr.known_locale_names/1 or a Cldr.LanguageTag.t . The default is Plausible.Cldr.get_locale/0 . Returns A list of strings and numbers Notes Number parsing is performed by Cldr.Number.Parser.parse/2 and any options provided are passed to that function. Examples 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 ( "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 loss is -1.000 euros" , locale : "de" , number : :integer ) [ "The loss is " , - 1000 , " euros" ]","ref":"Plausible.Cldr.Number.html#scan/2","title":"Plausible.Cldr.Number.scan/2","type":"function"},{"doc":"Formats a number and applies the :approximately format for a locale and number system. Arguments number is an integer, float or Decimal to be formatted options is a keyword list defining how the number is to be formatted. See Cldr.Number.to_string/3 for a description of the available options. Example iex> Plausible.Cldr.Number . to_approx_string 1234 { :ok , "~1,234" }","ref":"Plausible.Cldr.Number.html#to_approx_string/2","title":"Plausible.Cldr.Number.to_approx_string/2","type":"function"},{"doc":"Formats a number and applies the :at_least format for a locale and number system. Arguments number is an integer, float or Decimal to be formatted options is a keyword list defining how the number is to be formatted. See Plausible.Cldr.Number.to_string/2 for a description of the available options. Example iex> Plausible.Cldr.Number . to_at_least_string 1234 { :ok , "1,234+" }","ref":"Plausible.Cldr.Number.html#to_at_least_string/2","title":"Plausible.Cldr.Number.to_at_least_string/2","type":"function"},{"doc":"Formats a number and applies the :at_most format for a locale and number system. Arguments number is an integer, float or Decimal to be formatted options is a keyword list defining how the number is to be formatted. See Cldr.Number.to_string/3 for a description of the available options. Example iex> Plausible.Cldr.Number . to_at_most_string 1234 { :ok , "≤1,234" }","ref":"Plausible.Cldr.Number.html#to_at_most_string/2","title":"Plausible.Cldr.Number.to_at_most_string/2","type":"function"},{"doc":"Formats the first and last numbers of a range and applies the :range format for a locale and number system. Arguments number is an integer, float or Decimal to be formatted options is a keyword list defining how the number is to be formatted. See Cldr.Number.to_string/3 for a description of the available options. Example iex> Plausible.Cldr.Number . to_range_string 1234 .. 5678 { :ok , "1,234–5,678" }","ref":"Plausible.Cldr.Number.html#to_range_string/2","title":"Plausible.Cldr.Number.to_range_string/2","type":"function"},{"doc":"Returns a number formatted into a string according to a format pattern and options. Arguments number is an integer, float or Decimal to be formatted options is a keyword list defining how the number is to be formatted. Options format : the format style or a format string defining how the number is formatted. See Cldr.Number.Format for how format strings can be constructed. See Cldr.Number.Format.format_styles_for/3 to return available format styles for a locale. The default format is :standard . If :format is set to :long or :short then the formatting depends on whether :currency is specified. If not specified then the number is formatted as :decimal_long or :decimal_short . If :currency is specified the number is formatted as :currency_long or :currency_short and :fractional_digits is set to 0 as a default. :format may also be a format defined by CLDR's Rules Based Number Formats (RBNF). Further information is found in the module Cldr.Rbnf . The most commonly used formats in this category are to spell out the number in a the locales language. The applicable formats are :spellout , :spellout_year , :ordinal . A number can also be formatted as roman numbers by using the format :roman or :roman_lower . currency : is the currency for which the number is formatted. For available currencies see Cldr.Currency.known_currencies/0 . This option is required if :format is set to :currency . If currency is set and no :format is set, :format will be set to :currency as well. currency_symbol : Allows overriding a currency symbol. The alternatives are: :iso the ISO currency code will be used instead of the default currency symbol. :narrow uses the narrow symbol defined for the locale. The same narrow symbol can be defined for more than one currency and therefore this should be used with care. If no narrow symbol is defined, the standard symbol is used. :symbol uses the standard symbol defined in CLDR. A symbol is unique for each currency and can be safely used. "string" uses string as the currency symbol :standard (the default and recommended) uses the CLDR-defined symbol based upon the currency format for the locale. :cash : a boolean which indicates whether a number being formatted as a :currency is to be considered a cash value or not. Currencies can be rounded differently depending on whether :cash is true or false . *This option is deprecated in favour of currency_digits: :cash . :currency_digits indicates which of the rounding and digits should be used. The options are :accounting which is the default, :cash or :iso :rounding_mode : determines how a number is rounded to meet the precision of the format requested. The available rounding modes are :down , :half_up, :half_even, :ceiling, :floor, :half_down, :up. The default is :half_even . :number_system : determines which of the number systems for a locale should be used to define the separators and digits for the formatted number. If number_system is an atom then number_system is interpreted as a number system. If the :number_system is binary then it is interpreted as a number system name. See Cldr.Number.System.number_system_names_for/2 . The default is :default . :locale : determines the locale in which the number is formatted. See Cldr.known_locale_names/0 . The default is Cldr.get_locale/0 which is the locale currently in affect for this Process and which is set by Cldr.put_locale/1 . If :fractional_digits is set to a positive integer value then the number will be rounded to that number of digits and displayed accordingly - overriding settings that would be applied by default. For example, currencies have fractional digits defined reflecting each currencies minor unit. Setting :fractional_digits will override that setting. If :maximum_integer_digits is set to a positive integer value then the number is left truncated before formatting. For example if the number 1234 is formatted with the option maximum_integer_digits: 2 , the number is truncated to 34 and formatted. If :round_nearest is set to a positive integer value then the number will be rounded to nearest increment of that value - overriding settings that would be applied by default. :minimum_grouping_digits overrides the CLDR definition of minimum grouping digits. For example in the locale es the number 1234 is formatted by default as 1345 because the locale defines the minimium_grouping_digits as 2 . If minimum_grouping_digits: 1 is set as an option the number is formatting as 1.345 . The :minimum_grouping_digits is added to the grouping defined by the number format. If the sum of these two digits is greater than the number of digits in the integer (or fractional) part of the number then no grouping is performed. :wrapper is a 2-arity function that will be called for each number component with parameters string and tag where tag is one of :number , :currency_symbol , :currency_space , :literal , :quote , :percent , :permille , :minus or :plus . The function must return a string. The function can be used to wrap format elements in HTML or other tags. Locale extensions affecting formatting A locale identifier can specify options that affect number formatting. These options are: nu : defines the number system to be used if none is specified by the :number_system option to to_string/2 This key is part of the u extension and that document should be consulted for details on how to construct a locale identifier with these extensions. Wrapping format elements Wrapping elements is particularly useful when formatting a number with a currency symbol and the requirement is to have different HTML formatting applied to the symbol than the number. For example: 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 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 ) ...> 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 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. This can be achieved by specifying a :wrapper option. This option takes a 2-arity function as an argument. For each element of the format the wrapper function is called with two parameters: the format element as a string and an atom representing the element type. The wrapper function is required to return a string that is then inserted in the final formatted number. Returns {:ok, string} or {:error, {exception, message}} Examples iex> Plausible.Cldr.Number . to_string 12345 { :ok , "12,345" } iex> Plausible.Cldr.Number . to_string 12345 , locale : "fr" { :ok , "12 345" } iex> Plausible.Cldr.Number . to_string 1345.32 , currency : :EUR , locale : "es" , minimum_grouping_digits : 1 { :ok , "1.345,32 €" } iex> Plausible.Cldr.Number . to_string 1345.32 , currency : :EUR , locale : "es" { :ok , "1345,32 €" } iex> Plausible.Cldr.Number . to_string 12345 , locale : "fr" , currency : "USD" { :ok , "12 345,00 $US" } iex> Plausible.Cldr.Number . to_string 12345 , format : "#E0" { :ok , "1.2345E4" } iex> Plausible.Cldr.Number . to_string 12345 , format : :accounting , currency : "THB" { :ok , "THB 12,345.00" } iex> Plausible.Cldr.Number . to_string - 12345 , format : :accounting , currency : "THB" { :ok , "(THB 12,345.00)" } iex> Plausible.Cldr.Number . to_string 12345 , format : :accounting , currency : "THB" , ...> locale : "th" { :ok , "฿12,345.00" } iex> Plausible.Cldr.Number . to_string 12345 , format : :accounting , currency : "THB" , ...> locale : "th" , number_system : :native { :ok , "฿๑๒,๓๔๕.๐๐" } iex> Plausible.Cldr.Number . to_string 1244.30 , format : :long { :ok , "1 thousand" } iex> Plausible.Cldr.Number . to_string 1244.30 , format : :long , currency : "USD" { :ok , "1,244 US dollars" } iex> Plausible.Cldr.Number . to_string 1244.30 , format : :short { :ok , "1K" } iex> Plausible.Cldr.Number . to_string 1244.30 , format : :short , currency : "EUR" { :ok , "€1K" } iex> Plausible.Cldr.Number . to_string 1234 , format : :spellout { :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" } iex> Plausible.Cldr.Number . to_string 1989 , format : :spellout_year { :ok , "nineteen eighty-nine" } iex> Plausible.Cldr.Number . to_string 123 , format : :ordinal { :ok , "123rd" } iex> Plausible.Cldr.Number . to_string 123 , format : :roman { :ok , "CXXIII" } iex> Plausible.Cldr.Number . to_string 123 , locale : "th-u-nu-thai" { :ok , "๑๒๓" } Errors An error tuple {:error, reason} will be returned if an error is detected. The two most likely causes of an error return are: A format cannot be compiled. In this case the error tuple will look like: iex> Plausible.Cldr.Number . to_string ( 12345 , format : "0#" ) { :error , { Cldr.FormatCompileError , "Decimal format compiler: syntax error before: \\" # \\" " } } The format style requested is not defined for the 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" ) { :error , { Cldr.UnknownFormatError , "The locale :he with number system :hebr does not define a format :standard" } }","ref":"Plausible.Cldr.Number.html#to_string/2","title":"Plausible.Cldr.Number.to_string/2","type":"function"},{"doc":"Same as the execution of to_string/2 but raises an exception if an error would be returned. Arguments number is an integer, float or Decimal to be formatted options is a keyword list defining how the number is to be formatted. See Plausible.Cldr.Number.to_string/2 Returns a formatted number as a string or raises an exception Examples iex> Plausible.Cldr.Number . to_string! 12345 "12,345" iex> Plausible.Cldr.Number . to_string! 12345 , locale : "fr" "12 345"","ref":"Plausible.Cldr.Number.html#to_string!/2","title":"Plausible.Cldr.Number.to_string!/2","type":"function"},{"doc":"Return a valid number system from a provided locale and number system name or type. The number system or number system type must be valid for the given locale. If a number system type is provided, the underlying number system is returned. Arguments locale is any valid locale name returned by Cldr.known_locale_names/1 or a Cldr.LanguageTag struct returned by Cldr.Locale.new!/2 system_name is any number system name returned by Cldr.known_number_systems/0 or a number system type returned by Cldr.known_number_system_types/0 Examples iex> Plausible.Cldr.Number . validate_number_system "en" , :latn { :ok , :latn } iex> Plausible.Cldr.Number . validate_number_system "en" , :default { :ok , :latn } iex> Plausible.Cldr.Number . validate_number_system "en" , :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" } }","ref":"Plausible.Cldr.Number.html#validate_number_system/2","title":"Plausible.Cldr.Number.validate_number_system/2","type":"function"},{"doc":"Implements cardinal plural rules for numbers.","ref":"Plausible.Cldr.Number.Cardinal.html","title":"Plausible.Cldr.Number.Cardinal","type":"module"},{"doc":"The locale names for which plural rules are defined.","ref":"Plausible.Cldr.Number.Cardinal.html#available_locale_names/0","title":"Plausible.Cldr.Number.Cardinal.available_locale_names/0","type":"function"},{"doc":"The configured locales for which plural rules are defined. Returns the intersection of Plausible.Cldr.known_locale_names/0 and the locales for which Cardinal plural rules are defined. There are many Cldr locales which don't have their own plural rules so this list is the intersection of Cldr 's configured locales and those that have rules.","ref":"Plausible.Cldr.Number.Cardinal.html#known_locale_names/0","title":"Plausible.Cldr.Number.Cardinal.known_locale_names/0","type":"function"},{"doc":"Return the plural key for a given number in a given locale Returns which plural key ( :zero , :one , :two , :few , :many or :other ) a given number fits into within the context of a given locale. Note that these key names should not be interpreted literally. For example, the key returned from Cldr.Number.Ordinal.plural_rule(0, "en") is actually :other , not :zero . This key can then be used to format a number, date, time, unit, list or other content in a plural-sensitive way. Arguments number is any integer , float or Decimal locale is any locale returned by Cldr.Locale.new!/2 or any locale_name returned by Plausible.Cldr.known_locale_names/0 rounding is one of [:down, :up, :ceiling, :floor, :half_even, :half_up, :half_down] . The default is :half_even . Examples iex> Plausible.Cldr.Number.Cardinal . plural_rule 0 , "fr" :one iex> Plausible.Cldr.Number.Cardinal . plural_rule 0 , "en" :other","ref":"Plausible.Cldr.Number.Cardinal.html#plural_rule/3","title":"Plausible.Cldr.Number.Cardinal.plural_rule/3","type":"function"},{"doc":"Returns all the plural rules defined in CLDR.","ref":"Plausible.Cldr.Number.Cardinal.html#plural_rules/0","title":"Plausible.Cldr.Number.Cardinal.plural_rules/0","type":"function"},{"doc":"Return the plural rules for a locale. Arguments locale is any locale returned by Plausible.Cldr.Locale.new!/1 or any locale_name returned by Plausible.Cldr.known_locale_names/0 The rules are returned in AST form after parsing.","ref":"Plausible.Cldr.Number.Cardinal.html#plural_rules_for/1","title":"Plausible.Cldr.Number.Cardinal.plural_rules_for/1","type":"function"},{"doc":"Pluralize a number using cardinal plural rules and a substitution map. Arguments number is an integer, float or Decimal locale is any locale returned by Plausible.Cldr.Locale.new!/1 or any locale_name returned by Plausible.Cldr.known_locale_names/0 substitutions is a map that maps plural keys to a string. The valid substitution keys are :zero , :one , :two , :few , :many and :other . See also Plausible.Cldr.Number.Cardinal.Cardinal.plural_rule/3 . Examples iex> Plausible.Cldr.Number.Cardinal . pluralize 1 , "en" , %{ one : "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" } "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" } "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" } nil 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" } "other"","ref":"Plausible.Cldr.Number.Cardinal.html#pluralize/3","title":"Plausible.Cldr.Number.Cardinal.pluralize/3","type":"function"},{"doc":"Functions to manage the collection of number patterns defined in Cldr. Number patterns affect how numbers are interpreted in a localized context. Here are some examples, based on the French locale. The "." shows where the decimal point should go. The "," shows where the thousands separator should go. A "0" indicates zero-padding: if the number is too short, a zero (in the locale's numeric set) will go there. A "#" indicates no padding: if the number is too short, nothing goes there. A "¤" shows where the currency sign will go. The following illustrates the effects of different patterns for the French locale, with the number "1234.567". Notice how the pattern characters ',' and '.' are replaced by the characters appropriate for the locale. Number Pattern Examples Pattern Currency Text #,##0.## n/a 1 234,57 #,##0.### n/a 1 234,567 ###0.##### n/a 1234,567 ###0.0000# n/a 1234,5670 00000.0000 n/a 01234,5670 #,##0.00 ¤ EUR 1 234,57 € The number of # placeholder characters before the decimal do not matter, since no limit is placed on the maximum number of digits. There should, however, be at least one zero some place in the pattern. In currency formats, the number of digits after the decimal also do not matter, since the information in the supplemental data (see Supplemental Currency Data) is used to override the number of decimal places — and the rounding — according to the currency that is being formatted. That can be seen in the above chart, with the difference between Yen and Euro formatting. Details of the number formats are described in the Unicode documentation","ref":"Plausible.Cldr.Number.Format.html","title":"Plausible.Cldr.Number.Format","type":"module"},{"doc":"Returns the decimal formats defined for a given locale. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 . The default is Plausible.Cldr.get_locale/0 . Returns {:ok, map} where map is a map of decimal formats keyed by number system or {:error, {exception, message}}","ref":"Plausible.Cldr.Number.Format.html#all_formats_for/1","title":"Plausible.Cldr.Number.Format.all_formats_for/1","type":"function"},{"doc":"Returns the decimal formats defined for a given locale. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 . The default is Plausible.Cldr.get_locale/0 . Returns {:ok, map} where map is a map of decimal formats keyed by number system or raises an exception See Plausible.Cldr.Number.Format.Number.Format.all_formats_for/1 for further information.","ref":"Plausible.Cldr.Number.Format.html#all_formats_for!/1","title":"Plausible.Cldr.Number.Format.all_formats_for!/1","type":"function"},{"doc":"Returns the currency space for a given locale and number system.","ref":"Plausible.Cldr.Number.Format.html#currency_spacing/2","title":"Plausible.Cldr.Number.Format.currency_spacing/2","type":"function"},{"doc":"Returns the list of decimal formats in the configured locales including the list of locales configured for precompilation in config.exs . This function exists to allow the decimal formatter to precompile all the known formats at compile time. Example #=> Plausible.Cldr.Number.Format.Format.decimal_format_list [ "#" , "#,##,##0%" , "#,##,##0.###" , "#,##,##0.00¤" , "#,##,##0.00¤;(#,##,##0.00¤)" , "#,##,##0 %" , "#,##0%" , "#,##0.###" , "#,##0.00 ¤" , "#,##0.00 ¤;(#,##0.00 ¤)" , "#,##0.00¤" , "#,##0.00¤;(#,##0.00¤)" , "#,##0 %" , "#0%" , "#0.######" , "#0.00 ¤" , "#E0" , "%#,##0" , "% #,##0" , "0" , "0.000000E+000" , "0000 M ¤" , "0000¤" , "000G ¤" , "000K ¤" , "000M ¤" , "000T ¤" , "000mM ¤" , "000m ¤" , "000 Bio'.' ¤" , "000 Bln ¤" , "000 Bn ¤" , "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 ¤" , ... ]","ref":"Plausible.Cldr.Number.Format.html#decimal_format_list/0","title":"Plausible.Cldr.Number.Format.decimal_format_list/0","type":"function"},{"doc":"Returns the list of decimal formats for a configured locale. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 . The default is Plausible.Cldr.get_locale/0 . This function exists to allow the decimal formatter to precompile all the known formats at compile time. Its use is not otherwise recommended. Example 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" , "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" , "¤ #,##0.00" , "¤ #,##0.00;(¤ #,##0.00)" , "¤ 000B" , "¤ 000K" , "¤ 000M" , "¤ 000T" , "¤ 00B" , "¤ 00K" , "¤ 00M" , "¤ 00T" , "¤ 0B" , "¤ 0K" , "¤ 0M" , "¤ 0T" ] }","ref":"Plausible.Cldr.Number.Format.html#decimal_format_list_for/1","title":"Plausible.Cldr.Number.Format.decimal_format_list_for/1","type":"function"},{"doc":"Returns the default grouping for a locale as a map. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 . The default is Plausible.Cldr.get_locale/0 . Returns {:ok, grouping} or {:error, {exception, message}} Examples iex> Plausible.Cldr.Number.Format . default_grouping_for ( :en ) { :ok , %{ fraction : %{ first : 0 , rest : 0 } , integer : %{ first : 3 , rest : 3 } } }","ref":"Plausible.Cldr.Number.Format.html#default_grouping_for/1","title":"Plausible.Cldr.Number.Format.default_grouping_for/1","type":"function"},{"doc":"Returns the default grouping for a locale or raises on error. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 . The default is Plausible.Cldr.get_locale/0 . Returns grouping as a map or raises an exception Examples iex> Plausible.Cldr.Number.Format . default_grouping_for! ( :en ) %{ fraction : %{ first : 0 , rest : 0 } , integer : %{ first : 3 , rest : 3 } }","ref":"Plausible.Cldr.Number.Format.html#default_grouping_for!/1","title":"Plausible.Cldr.Number.Format.default_grouping_for!/1","type":"function"},{"doc":"Return the predfined formats for a given locale and number_system . Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 . The default is Plausible.Cldr.get_locale/0 . number_system is any valid number system or number system type returned by Plausible.Cldr.Number.System.number_systems_for/1 . Example Plausible.Cldr.Number.Format . formats_for :fr , :native #=> %Cldr.Number.Format{ accounting : "#,##0.00 ¤;(#,##0.00 ¤)" , currency : "#,##0.00 ¤" , 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 ¤" ] } ] , ... }","ref":"Plausible.Cldr.Number.Format.html#formats_for/2","title":"Plausible.Cldr.Number.Format.formats_for/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Number.Format.html#formats_for!/2","title":"Plausible.Cldr.Number.Format.formats_for!/2","type":"function"},{"doc":"Returns the minimum grouping digits for a locale. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 . The default is Plausible.Cldr.get_locale/0 . Returns {:ok, minumum_digits} or {:error, {exception, message}} Examples iex> Plausible.Cldr.Number.Format . minimum_grouping_digits_for ( "en" ) { :ok , 1 }","ref":"Plausible.Cldr.Number.Format.html#minimum_grouping_digits_for/1","title":"Plausible.Cldr.Number.Format.minimum_grouping_digits_for/1","type":"function"},{"doc":"Returns the minimum grouping digits for a locale or raises on error. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 . The default is Plausible.Cldr.get_locale/0 . Returns minumum_digits or raises an exception Examples iex> Plausible.Cldr.Number.Format . minimum_grouping_digits_for! ( "en" ) 1","ref":"Plausible.Cldr.Number.Format.html#minimum_grouping_digits_for!/1","title":"Plausible.Cldr.Number.Format.minimum_grouping_digits_for!/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Number.Formatter.Decimal.html","title":"Plausible.Cldr.Number.Formatter.Decimal","type":"module"},{"doc":"","ref":"Plausible.Cldr.Number.Formatter.Decimal.html#metadata!/1","title":"Plausible.Cldr.Number.Formatter.Decimal.metadata!/1","type":"function"},{"doc":"Formats a number according to a decimal format string. Arguments number is an integer, float or Decimal format is a format string. See Plausible.Cldr.Number for further information. options is a map of options. See Plausible.Cldr.Number.to_string/2 for further information.","ref":"Plausible.Cldr.Number.Formatter.Decimal.html#to_string/3","title":"Plausible.Cldr.Number.Formatter.Decimal.to_string/3","type":"function"},{"doc":"Implements ordinal plural rules for numbers.","ref":"Plausible.Cldr.Number.Ordinal.html","title":"Plausible.Cldr.Number.Ordinal","type":"module"},{"doc":"The locale names for which plural rules are defined.","ref":"Plausible.Cldr.Number.Ordinal.html#available_locale_names/0","title":"Plausible.Cldr.Number.Ordinal.available_locale_names/0","type":"function"},{"doc":"The configured locales for which plural rules are defined. Returns the intersection of Plausible.Cldr.known_locale_names/0 and the locales for which Ordinal plural rules are defined. There are many Cldr locales which don't have their own plural rules so this list is the intersection of Cldr 's configured locales and those that have rules.","ref":"Plausible.Cldr.Number.Ordinal.html#known_locale_names/0","title":"Plausible.Cldr.Number.Ordinal.known_locale_names/0","type":"function"},{"doc":"Return the plural key for a given number in a given locale Returns which plural key ( :zero , :one , :two , :few , :many or :other ) a given number fits into within the context of a given locale. Note that these key names should not be interpreted literally. For example, the key returned from Cldr.Number.Ordinal.plural_rule(0, "en") is actually :other , not :zero . This key can then be used to format a number, date, time, unit, list or other content in a plural-sensitive way. Arguments number is any integer , float or Decimal locale is any locale returned by Cldr.Locale.new!/2 or any locale_name returned by Plausible.Cldr.known_locale_names/0 rounding is one of [:down, :up, :ceiling, :floor, :half_even, :half_up, :half_down] . The default is :half_even . Examples iex> Plausible.Cldr.Number.Ordinal . plural_rule 0 , "fr" :other iex> Plausible.Cldr.Number.Ordinal . plural_rule 1 , "en" :one","ref":"Plausible.Cldr.Number.Ordinal.html#plural_rule/3","title":"Plausible.Cldr.Number.Ordinal.plural_rule/3","type":"function"},{"doc":"Returns all the plural rules defined in CLDR.","ref":"Plausible.Cldr.Number.Ordinal.html#plural_rules/0","title":"Plausible.Cldr.Number.Ordinal.plural_rules/0","type":"function"},{"doc":"Return the plural rules for a locale. Arguments locale is any locale returned by Plausible.Cldr.Locale.new!/1 or any locale_name returned by Plausible.Cldr.known_locale_names/0 The rules are returned in AST form after parsing.","ref":"Plausible.Cldr.Number.Ordinal.html#plural_rules_for/1","title":"Plausible.Cldr.Number.Ordinal.plural_rules_for/1","type":"function"},{"doc":"Pluralize a number using ordinal plural rules and a substitution map. Arguments number is an integer, float or Decimal or a Range.t{} . When a range, The is that in any usage, the start value is strictly less than the end value, and that no values are negative. Results for any cases that do not meet these criteria are undefined. locale is any locale returned by Plausible.Cldr.Locale.new!/1 or any locale_name returned by Plausible.Cldr.known_locale_names/0 substitutions is a map that maps plural keys to a string. The valid substitution keys are :zero , :one , :two , :few , :many and :other . See also Plausible.Cldr.Number.Ordinal.Ordinal.plural_rule/3 . Examples iex> Plausible.Cldr.Number.Ordinal . pluralize 1 , :en , %{ one : "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" } "two" 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" } "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" } "two" 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" } "other"","ref":"Plausible.Cldr.Number.Ordinal.html#pluralize/3","title":"Plausible.Cldr.Number.Ordinal.pluralize/3","type":"function"},{"doc":"Implements plural rules for ranges","ref":"Plausible.Cldr.Number.PluralRule.Range.html","title":"Plausible.Cldr.Number.PluralRule.Range","type":"module"},{"doc":"Returns a final plural type for a start-of-range plural type, an end-of-range plural type and a locale. Arguments first is a plural type for the start of a range last is a plural type for the end of a range locale is any Cldr.LanguageTag.t or a language name (not locale name) Example iex> Plausible.Cldr.Number.PluralRule.Range . plural_rule :other , :few , "ar" :few","ref":"Plausible.Cldr.Number.PluralRule.Range.html#plural_rule/3","title":"Plausible.Cldr.Number.PluralRule.Range.plural_rule/3","type":"function"},{"doc":"","ref":"Plausible.Cldr.Number.Symbol.html","title":"Plausible.Cldr.Number.Symbol","type":"module"},{"doc":"Returns a list of all decimal symbols defined by the locales configured in this backend as a list.","ref":"Plausible.Cldr.Number.Symbol.html#all_decimal_symbols/0","title":"Plausible.Cldr.Number.Symbol.all_decimal_symbols/0","type":"function"},{"doc":"Returns a list of all decimal symbols defined by the locales configured in this backend as a string. This string can be used as a character class when builing a regular expression.","ref":"Plausible.Cldr.Number.Symbol.html#all_decimal_symbols_class/0","title":"Plausible.Cldr.Number.Symbol.all_decimal_symbols_class/0","type":"function"},{"doc":"Returns a list of all grouping symbols defined by the locales configured in this backend as a list.","ref":"Plausible.Cldr.Number.Symbol.html#all_grouping_symbols/0","title":"Plausible.Cldr.Number.Symbol.all_grouping_symbols/0","type":"function"},{"doc":"Returns a list of all grouping symbols defined by the locales configured in this backend as a string. This string can be used as a character class when builing a regular expression.","ref":"Plausible.Cldr.Number.Symbol.html#all_grouping_symbols_class/0","title":"Plausible.Cldr.Number.Symbol.all_grouping_symbols_class/0","type":"function"},{"doc":"Returns a map of Cldr.Number.Symbol.t structs of the number symbols for each of the number systems of a locale. Options locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 . The default is Plausible.Cldr.get_locale/0 . Example: iex> Plausible.Cldr.Number.Symbol . number_symbols_for ( :th ) { :ok , %{ latn : % Cldr.Number.Symbol { decimal : "." , exponential : "E" , group : "," , infinity : "∞" , list : ";" , minus_sign : "-" , nan : "NaN" , per_mille : "‰" , percent_sign : "%" , plus_sign : "+" , superscripting_exponent : "×" , time_separator : ":" } , thai : % Cldr.Number.Symbol { decimal : "." , exponential : "E" , group : "," , infinity : "∞" , list : ";" , minus_sign : "-" , nan : "NaN" , per_mille : "‰" , percent_sign : "%" , plus_sign : "+" , superscripting_exponent : "×" , time_separator : ":" } } }","ref":"Plausible.Cldr.Number.Symbol.html#number_symbols_for/1","title":"Plausible.Cldr.Number.Symbol.number_symbols_for/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Number.Symbol.html#number_symbols_for/2","title":"Plausible.Cldr.Number.Symbol.number_symbols_for/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Number.System.html","title":"Plausible.Cldr.Number.System","type":"module"},{"doc":"Returns the actual number system from a number system type. locale is any valid locale name returned by Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Cldr.Locale.new!/2 system_name is any number system name returned by Cldr.known_number_systems/0 or a number system type returned by Cldr.known_number_system_types/0 This function will decode a number system type into the actual number system. If the number system provided can't be decoded it is returned as is. Examples iex> Plausible.Cldr.Number.System . number_system_for "th" , :latn { :ok , %{ digits : "0123456789" , type : :numeric } } iex> Plausible.Cldr.Number.System . number_system_for "en" , :default { :ok , %{ digits : "0123456789" , type : :numeric } } iex> Plausible.Cldr.Number.System . number_system_for "he" , :traditional { :ok , %{ rules : "hebrew" , type : :algorithmic } } iex> Plausible.Cldr.Number.System . number_system_for "en" , :native { :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}" } }","ref":"Plausible.Cldr.Number.System.html#number_system_for/2","title":"Plausible.Cldr.Number.System.number_system_for/2","type":"function"},{"doc":"Returns the number system from a language tag or locale name. Arguments locale is any language tag returned be Cldr.Locale.new/2 or a locale name in the list returned by Cldr.known_locale_names/1 Returns A number system name as an atom Examples iex> Plausible.Cldr.Number.System . number_system_from_locale "en-US-u-nu-thai" :thai iex> Plausible.Cldr.Number.System . number_system_from_locale "en-US" :latn","ref":"Plausible.Cldr.Number.System.html#number_system_from_locale/1","title":"Plausible.Cldr.Number.System.number_system_from_locale/1","type":"function"},{"doc":"Returns the number systems available for a locale or {:error, message} if the locale is not known. locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 Examples iex> Plausible.Cldr.Number.System . number_system_names_for "en" { :ok , [ :latn ] } iex> Plausible.Cldr.Number.System . number_system_names_for "zz" { :error , { Cldr.InvalidLanguageError , "The language \\" zz \\" is invalid" } }","ref":"Plausible.Cldr.Number.System.html#number_system_names_for/1","title":"Plausible.Cldr.Number.System.number_system_names_for/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Number.System.html#number_system_names_for!/1","title":"Plausible.Cldr.Number.System.number_system_names_for!/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Number.System.html#number_system_types_for/1","title":"Plausible.Cldr.Number.System.number_system_types_for/1","type":"function"},{"doc":"Returns the number systems available for a locale or {:error, message} if the locale is not known. locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 Examples iex> Plausible.Cldr.Number.System . number_systems_for "en" { :ok , %{ default : :latn , native : :latn } } iex> Plausible.Cldr.Number.System . number_systems_for "th" { :ok , %{ default : :latn , native : :thai } } iex> Plausible.Cldr.Number.System . number_systems_for "zz" { :error , { Cldr.InvalidLanguageError , "The language \\" zz \\" is invalid" } }","ref":"Plausible.Cldr.Number.System.html#number_systems_for/1","title":"Plausible.Cldr.Number.System.number_systems_for/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Number.System.html#number_systems_for!/1","title":"Plausible.Cldr.Number.System.number_systems_for!/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Number.System.html#number_systems_like/2","title":"Plausible.Cldr.Number.System.number_systems_like/2","type":"function"},{"doc":"Returns a number system name for a given locale and number system reference. system_name is any number system name returned by Plausible.Cldr.known_number_systems/0 or a number system type returned by Plausible.Cldr.known_number_system_types/0 locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 Number systems can be references in one of two ways: As a number system type such as :default, :native, :traditional and :finance. This allows references to a number system for a locale in a consistent fashion for a given use WIth the number system name directly, such as :latn, :arab or any of the other 70 or so This function dereferences the supplied system_name and returns the actual system name. Examples 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 ( :native , "en" ) { :ok , :latn } 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 number system for the given locale as demonstrated in the third example.","ref":"Plausible.Cldr.Number.System.html#system_name_from/2","title":"Plausible.Cldr.Number.System.system_name_from/2","type":"function"},{"doc":"Converts a number into the representation of a non-latin number system. This function converts numbers to a known number system only, it does not provide number formatting. number is a float , integer or Decimal system_name is any number system name returned by Cldr.known_number_systems/0 or a number system type returned by Cldr.known_number_system_types/0 There are two types of number systems in CLDR: :numeric in which the number system defines a direct mapping between the latin digits 0..9 into a the number system equivalent. In this case, to_system/2 invokes Cldr.Number.Transliterate.transliterate_digits/3 for the given number. :algorithmic in which the number system does not have the same structure as the :latn number system and therefore the conversion is done algorithmically. For CLDR the algorithm is implemented through Cldr.Rbnf rulesets. These rulesets are considered by CLDR to be less rigorous than the :numeric number systems and caution and testing for a specific use case is recommended. Examples iex> Plausible.Cldr.Number.System . to_system 123456 , :hebr { :ok , "קכ״ג׳תנ״ו" } iex> Plausible.Cldr.Number.System . to_system 123 , :hans { :ok , "一百二十三" } iex> Plausible.Cldr.Number.System . to_system 123 , :hant { :ok , "一百二十三" } iex> Plausible.Cldr.Number.System . to_system 123 , :hansfin { :ok , "壹佰贰拾叁" }","ref":"Plausible.Cldr.Number.System.html#to_system/2","title":"Plausible.Cldr.Number.System.to_system/2","type":"function"},{"doc":"Converts a number into the representation of a non-latin number system. Returns a converted string or raises on error. number is a float , integer or Decimal system_name is any number system name returned by Plausible.Cldr.known_number_systems/0 or a number system type returned by Plausible.Cldr.known_number_system_types/0 See Plausible.Cldr.Number.System.to_system/2 for further information. Examples iex> Plausible.Cldr.Number.System . to_system! 123 , :hans "一百二十三" iex> Plausible.Cldr.Number.System . to_system! 123 , :hant "一百二十三" iex> Plausible.Cldr.Number.System . to_system! 123 , :hansfin "壹佰贰拾叁"","ref":"Plausible.Cldr.Number.System.html#to_system!/2","title":"Plausible.Cldr.Number.System.to_system!/2","type":"function"},{"doc":"Transliteration for digits and separators. Transliterating a string is an expensive business. First the string has to be exploded into its component graphemes. Then for each grapheme we have to map to the equivalent in the other {locale, number_system} . Then we have to reassemble the string. Effort is made to short circuit where possible. Transliteration is not required for any {locale, number_system} that is the same as {"en", "latn"} since the implementation uses this combination for the placeholders during formatting already. When short circuiting is possible (typically the en-* locales with "latn" number_system - the total number of short circuited locales is 211 of the 537 in CLDR) the overall number formatting is twice as fast than when formal transliteration is required. Configuring precompilation of digit transliterations This module includes Cldr.Number.Transliterate.transliterate_digits/3 which transliterates digits between number systems. For example from :arabic to :latn. Since generating a transliteration map is slow, pairs of transliterations can be configured so that the transliteration map is created at compile time and therefore speeding up transliteration at run time. To configure these transliteration pairs, add the to the use Cldr configuration in a backend module: defmodule MyApp.Cldr do use Cldr , 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 configured: from :latn to :thai and from :arab to :thai . A list of configurable number systems is returned by Cldr.Number.System.systems_with_digits/0 . If a transliteration is requested between two number pairs that have not been configured for precompilation, a warning is logged.","ref":"Plausible.Cldr.Number.Transliterate.html","title":"Plausible.Cldr.Number.Transliterate","type":"module"},{"doc":"Transliterates from latin digits to another number system's digits. Transliterates the latin digits 0..9 to their equivalents in another number system. Also transliterates the decimal and grouping separators as well as the plus, minus and exponent symbols. Any other character in the string will be returned "as is". Arguments sequence is the string to be transliterated. locale is any known locale, defaulting to Plausible.Cldr.get_locale/0 . number_system is any known number system. If expressed as a string it is the actual name of a known number system. If epressed as an atom it is used as a key to look up a number system for the locale (the usual keys are :default and :native but :traditional and :finance are also part of the standard). See Plausible.Cldr.Number.System.number_systems_for/1 for a locale to see what number system types are defined. The default is :default . For available number systems see Cldr.Number.System.number_systems/0 and Plausible.Cldr.Number.System.number_systems_for/1 . Also see Plausible.Cldr.Number.Symbol.number_symbols_for/1 . Examples iex> Plausible.Cldr.Number.Transliterate . transliterate ( "123556" ) "123556" iex> Plausible.Cldr.Number.Transliterate . transliterate ( "123,556.000" , "fr" , :default ) "123 556,000" 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" , :native ) "๑๒๓๕๕๖" iex> Plausible.Cldr.Number.Transliterate . transliterate ( "Some number is: 123556" , "th" , "thai" ) "Some number is: ๑๒๓๕๕๖"","ref":"Plausible.Cldr.Number.Transliterate.html#transliterate/3","title":"Plausible.Cldr.Number.Transliterate.transliterate/3","type":"function"},{"doc":"","ref":"Plausible.Cldr.Number.Transliterate.html#transliterate!/3","title":"Plausible.Cldr.Number.Transliterate.transliterate!/3","type":"function"},{"doc":"Transliterates digits from one number system to another number system digits is binary representation of a number from_system and to_system are number system names in atom form. See Cldr.Number.System.systems_with_digits/0 for available number systems. Example iex> Plausible.Cldr.Number.Transliterate . transliterate_digits "٠١٢٣٤٥٦٧٨٩" , :arab , :latn "0123456789"","ref":"Plausible.Cldr.Number.Transliterate.html#transliterate_digits/3","title":"Plausible.Cldr.Number.Transliterate.transliterate_digits/3","type":"function"},{"doc":"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 ) [ :zz_default , :tamil , :roman_upper , :roman_lower , :hebrew_item , :hebrew , :greek_upper , :greek_lower , :georgian , :ethiopic , :cyrillic_lower , :armenian_upper , :armenian_lower ] 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" }","ref":"Plausible.Cldr.Rbnf.NumberSystem.html","title":"Plausible.Cldr.Rbnf.NumberSystem","type":"module"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#all_rule_sets/0","title":"Plausible.Cldr.Rbnf.NumberSystem.all_rule_sets/0","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#armenian_lower/1","title":"Plausible.Cldr.Rbnf.NumberSystem.armenian_lower/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#armenian_lower/2","title":"Plausible.Cldr.Rbnf.NumberSystem.armenian_lower/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#armenian_upper/1","title":"Plausible.Cldr.Rbnf.NumberSystem.armenian_upper/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#armenian_upper/2","title":"Plausible.Cldr.Rbnf.NumberSystem.armenian_upper/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower/1","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower/2","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_1_10/2","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower_1_10/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_final/2","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower_final/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_post/2","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower_post/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_thousands/2","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower_thousands/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic/1","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic/2","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic_p1/2","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic_p1/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic_p2/2","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic_p2/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic_p3/2","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic_p3/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic_p/2","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic_p/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#georgian/1","title":"Plausible.Cldr.Rbnf.NumberSystem.georgian/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#georgian/2","title":"Plausible.Cldr.Rbnf.NumberSystem.georgian/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_lower/1","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_lower/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_lower/2","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_lower/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_numeral_majuscules/2","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_numeral_majuscules/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_numeral_minuscules/2","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_numeral_minuscules/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_upper/1","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_upper/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_upper/2","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_upper/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew/1","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew/2","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew_0_99/2","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew_0_99/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew_item/1","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew_item/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew_item/2","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew_item/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew_item_hundreds/2","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew_item_hundreds/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew_thousands/2","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew_thousands/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#roman_lower/1","title":"Plausible.Cldr.Rbnf.NumberSystem.roman_lower/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#roman_lower/2","title":"Plausible.Cldr.Rbnf.NumberSystem.roman_lower/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#roman_upper/1","title":"Plausible.Cldr.Rbnf.NumberSystem.roman_upper/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#roman_upper/2","title":"Plausible.Cldr.Rbnf.NumberSystem.roman_upper/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#rule_sets/0","title":"Plausible.Cldr.Rbnf.NumberSystem.rule_sets/0","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#rule_sets/1","title":"Plausible.Cldr.Rbnf.NumberSystem.rule_sets/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#tamil/1","title":"Plausible.Cldr.Rbnf.NumberSystem.tamil/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#tamil/2","title":"Plausible.Cldr.Rbnf.NumberSystem.tamil/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#tamil_thousands/2","title":"Plausible.Cldr.Rbnf.NumberSystem.tamil_thousands/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#zz_default/1","title":"Plausible.Cldr.Rbnf.NumberSystem.zz_default/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#zz_default/2","title":"Plausible.Cldr.Rbnf.NumberSystem.zz_default/2","type":"function"},{"doc":"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 ] iex> Plausible.Cldr.Rbnf.Ordinal . rule_sets ( "fr" ) [ :digits_ordinal_masculine_plural , :digits_ordinal_masculine , :digits_ordinal_feminine_plural , :digits_ordinal_feminine , :digits_ordinal ] 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" }","ref":"Plausible.Cldr.Rbnf.Ordinal.html","title":"Plausible.Cldr.Rbnf.Ordinal","type":"module"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Ordinal.html#all_rule_sets/0","title":"Plausible.Cldr.Rbnf.Ordinal.all_rule_sets/0","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Ordinal.html#digits_ordinal/2","title":"Plausible.Cldr.Rbnf.Ordinal.digits_ordinal/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Ordinal.html#rule_sets/0","title":"Plausible.Cldr.Rbnf.Ordinal.rule_sets/0","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Ordinal.html#rule_sets/1","title":"Plausible.Cldr.Rbnf.Ordinal.rule_sets/1","type":"function"},{"doc":"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" ) [ :spellout_ordinal_verbose , :spellout_ordinal , :spellout_numbering_year , :spellout_numbering_verbose , :spellout_numbering , :spellout_cardinal_verbose , :spellout_cardinal ] 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" }","ref":"Plausible.Cldr.Rbnf.Spellout.html","title":"Plausible.Cldr.Rbnf.Spellout","type":"module"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#2d_year/2","title":"Plausible.Cldr.Rbnf.Spellout.2d_year/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#all_rule_sets/0","title":"Plausible.Cldr.Rbnf.Spellout.all_rule_sets/0","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#and/2","title":"Plausible.Cldr.Rbnf.Spellout.and/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#and_o/2","title":"Plausible.Cldr.Rbnf.Spellout.and_o/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#commas/2","title":"Plausible.Cldr.Rbnf.Spellout.commas/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#commas_o/2","title":"Plausible.Cldr.Rbnf.Spellout.commas_o/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#rule_sets/0","title":"Plausible.Cldr.Rbnf.Spellout.rule_sets/0","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#rule_sets/1","title":"Plausible.Cldr.Rbnf.Spellout.rule_sets/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_cardinal/2","title":"Plausible.Cldr.Rbnf.Spellout.spellout_cardinal/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_cardinal_verbose/2","title":"Plausible.Cldr.Rbnf.Spellout.spellout_cardinal_verbose/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_numbering/2","title":"Plausible.Cldr.Rbnf.Spellout.spellout_numbering/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_numbering_verbose/2","title":"Plausible.Cldr.Rbnf.Spellout.spellout_numbering_verbose/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_numbering_year/2","title":"Plausible.Cldr.Rbnf.Spellout.spellout_numbering_year/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_ordinal/2","title":"Plausible.Cldr.Rbnf.Spellout.spellout_ordinal/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_ordinal_verbose/2","title":"Plausible.Cldr.Rbnf.Spellout.spellout_ordinal_verbose/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#th/2","title":"Plausible.Cldr.Rbnf.Spellout.th/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#tieth/2","title":"Plausible.Cldr.Rbnf.Spellout.tieth/2","type":"function"},{"doc":"Event schema for when NumericIDs migration is complete","ref":"Plausible.ClickhouseEventV2.html","title":"Plausible.ClickhouseEventV2","type":"module"},{"doc":"","ref":"Plausible.ClickhouseEventV2.html#new/1","title":"Plausible.ClickhouseEventV2.new/1","type":"function"},{"doc":"","ref":"Plausible.ClickhouseRepo.html","title":"Plausible.ClickhouseRepo","type":"module"},{"doc":"Callback implementation for Ecto.Repo.aggregate/3 .","ref":"Plausible.ClickhouseRepo.html#aggregate/3","title":"Plausible.ClickhouseRepo.aggregate/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.aggregate/4 .","ref":"Plausible.ClickhouseRepo.html#aggregate/4","title":"Plausible.ClickhouseRepo.aggregate/4","type":"function"},{"doc":"Callback implementation for Ecto.Repo.all/2 .","ref":"Plausible.ClickhouseRepo.html#all/2","title":"Plausible.ClickhouseRepo.all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checked_out?/0 .","ref":"Plausible.ClickhouseRepo.html#checked_out?/0","title":"Plausible.ClickhouseRepo.checked_out?/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checkout/2 .","ref":"Plausible.ClickhouseRepo.html#checkout/2","title":"Plausible.ClickhouseRepo.checkout/2","type":"function"},{"doc":"","ref":"Plausible.ClickhouseRepo.html#child_spec/1","title":"Plausible.ClickhouseRepo.child_spec/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.config/0 .","ref":"Plausible.ClickhouseRepo.html#config/0","title":"Plausible.ClickhouseRepo.config/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.default_options/1 .","ref":"Plausible.ClickhouseRepo.html#default_options/1","title":"Plausible.ClickhouseRepo.default_options/1","type":"function"},{"doc":"A convenience function for SQL-based repositories that forces all connections in the pool to disconnect within the given interval. See Ecto.Adapters.SQL.disconnect_all/3 for more information.","ref":"Plausible.ClickhouseRepo.html#disconnect_all/2","title":"Plausible.ClickhouseRepo.disconnect_all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.exists?/2 .","ref":"Plausible.ClickhouseRepo.html#exists?/2","title":"Plausible.ClickhouseRepo.exists?/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get/3 .","ref":"Plausible.ClickhouseRepo.html#get/3","title":"Plausible.ClickhouseRepo.get/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get!/3 .","ref":"Plausible.ClickhouseRepo.html#get!/3","title":"Plausible.ClickhouseRepo.get!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by/3 .","ref":"Plausible.ClickhouseRepo.html#get_by/3","title":"Plausible.ClickhouseRepo.get_by/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by!/3 .","ref":"Plausible.ClickhouseRepo.html#get_by!/3","title":"Plausible.ClickhouseRepo.get_by!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_dynamic_repo/0 .","ref":"Plausible.ClickhouseRepo.html#get_dynamic_repo/0","title":"Plausible.ClickhouseRepo.get_dynamic_repo/0","type":"function"},{"doc":"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 use Ecto.Schema @primary_key false schema "ecto_ch_demo" do field :a , Ch , type : "UInt64" field :b , :string 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 ) # schemaless { 100_000 , nil } = Repo . insert_stream ( "ecto_ch_demo" , rows , types : [ a : Ch.Types . u64 ( ) , b : :string ] )","ref":"Plausible.ClickhouseRepo.html#insert_stream/3","title":"Plausible.ClickhouseRepo.insert_stream/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.load/2 .","ref":"Plausible.ClickhouseRepo.html#load/2","title":"Plausible.ClickhouseRepo.load/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one/2 .","ref":"Plausible.ClickhouseRepo.html#one/2","title":"Plausible.ClickhouseRepo.one/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one!/2 .","ref":"Plausible.ClickhouseRepo.html#one!/2","title":"Plausible.ClickhouseRepo.one!/2","type":"function"},{"doc":"","ref":"Plausible.ClickhouseRepo.html#parallel_tasks/1","title":"Plausible.ClickhouseRepo.parallel_tasks/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.preload/3 .","ref":"Plausible.ClickhouseRepo.html#preload/3","title":"Plausible.ClickhouseRepo.preload/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.prepare_query/3 .","ref":"Plausible.ClickhouseRepo.html#prepare_query/3","title":"Plausible.ClickhouseRepo.prepare_query/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.put_dynamic_repo/1 .","ref":"Plausible.ClickhouseRepo.html#put_dynamic_repo/1","title":"Plausible.ClickhouseRepo.put_dynamic_repo/1","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query/4 for more information.","ref":"Plausible.ClickhouseRepo.html#query/3","title":"Plausible.ClickhouseRepo.query/3","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query!/4 for more information.","ref":"Plausible.ClickhouseRepo.html#query!/3","title":"Plausible.ClickhouseRepo.query!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload/2 .","ref":"Plausible.ClickhouseRepo.html#reload/2","title":"Plausible.ClickhouseRepo.reload/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload!/2 .","ref":"Plausible.ClickhouseRepo.html#reload!/2","title":"Plausible.ClickhouseRepo.reload!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.start_link/1 .","ref":"Plausible.ClickhouseRepo.html#start_link/1","title":"Plausible.ClickhouseRepo.start_link/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stop/1 .","ref":"Plausible.ClickhouseRepo.html#stop/1","title":"Plausible.ClickhouseRepo.stop/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stream/2 .","ref":"Plausible.ClickhouseRepo.html#stream/2","title":"Plausible.ClickhouseRepo.stream/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that translates the given query to SQL. See Ecto.Adapters.SQL.to_sql/3 for more information.","ref":"Plausible.ClickhouseRepo.html#to_sql/2","title":"Plausible.ClickhouseRepo.to_sql/2","type":"function"},{"doc":"Session schema for when NumericIDs migration is complete","ref":"Plausible.ClickhouseSessionV2.html","title":"Plausible.ClickhouseSessionV2","type":"module"},{"doc":"","ref":"Plausible.ClickhouseSessionV2.html#random_uint64/0","title":"Plausible.ClickhouseSessionV2.random_uint64/0","type":"function"},{"doc":"Custom type to cast Bool as UInt8","ref":"Plausible.ClickhouseSessionV2.BoolUInt8.html","title":"Plausible.ClickhouseSessionV2.BoolUInt8","type":"module"},{"doc":"Callback implementation for Ecto.Type.embed_as/1 .","ref":"Plausible.ClickhouseSessionV2.BoolUInt8.html#embed_as/1","title":"Plausible.ClickhouseSessionV2.BoolUInt8.embed_as/1","type":"function"},{"doc":"Callback implementation for Ecto.Type.equal?/2 .","ref":"Plausible.ClickhouseSessionV2.BoolUInt8.html#equal?/2","title":"Plausible.ClickhouseSessionV2.BoolUInt8.equal?/2","type":"function"},{"doc":"","ref":"Plausible.ConfigHelpers.html","title":"Plausible.ConfigHelpers","type":"module"},{"doc":"","ref":"Plausible.ConfigHelpers.html#get_int_from_path_or_env/3","title":"Plausible.ConfigHelpers.get_int_from_path_or_env/3","type":"function"},{"doc":"","ref":"Plausible.ConfigHelpers.html#get_var_from_path_or_env/3","title":"Plausible.ConfigHelpers.get_var_from_path_or_env/3","type":"function"},{"doc":"This module defines the setup for tests requiring access to the application's data layer. You may define functions here to be used as helpers in your tests. Finally, if the test case interacts with the database, it cannot be async. For this reason, every test runs inside a transaction which is reset at the beginning of the test unless the test case is marked as async.","ref":"Plausible.DataCase.html","title":"Plausible.DataCase","type":"module"},{"doc":"Base module for coordinated Clickhouse data migrations run via remote shell or otherwise (TBD).","ref":"Plausible.DataMigration.html","title":"Plausible.DataMigration","type":"module"},{"doc":"Numeric IDs migration, SQL files available at: priv/data_migrations/NumericIDs/sql","ref":"Plausible.DataMigration.NumericIDs.html","title":"Plausible.DataMigration.NumericIDs","type":"module"},{"doc":"","ref":"Plausible.DataMigration.NumericIDs.html#confirm/3","title":"Plausible.DataMigration.NumericIDs.confirm/3","type":"function"},{"doc":"","ref":"Plausible.DataMigration.NumericIDs.html#run/1","title":"Plausible.DataMigration.NumericIDs.run/1","type":"function"},{"doc":"","ref":"Plausible.DataMigration.NumericIDs.html#run_sql/2","title":"Plausible.DataMigration.NumericIDs.run_sql/2","type":"function"},{"doc":"","ref":"Plausible.DataMigration.NumericIDs.html#run_sql_confirm/2","title":"Plausible.DataMigration.NumericIDs.run_sql_confirm/2","type":"function"},{"doc":"Ecto.Repo for Clickhouse data migrations, to be started manually, outside of the main application supervision tree.","ref":"Plausible.DataMigration.Repo.html","title":"Plausible.DataMigration.Repo","type":"module"},{"doc":"Callback implementation for Ecto.Repo.aggregate/3 .","ref":"Plausible.DataMigration.Repo.html#aggregate/3","title":"Plausible.DataMigration.Repo.aggregate/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.aggregate/4 .","ref":"Plausible.DataMigration.Repo.html#aggregate/4","title":"Plausible.DataMigration.Repo.aggregate/4","type":"function"},{"doc":"Callback implementation for Ecto.Repo.all/2 .","ref":"Plausible.DataMigration.Repo.html#all/2","title":"Plausible.DataMigration.Repo.all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checked_out?/0 .","ref":"Plausible.DataMigration.Repo.html#checked_out?/0","title":"Plausible.DataMigration.Repo.checked_out?/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checkout/2 .","ref":"Plausible.DataMigration.Repo.html#checkout/2","title":"Plausible.DataMigration.Repo.checkout/2","type":"function"},{"doc":"","ref":"Plausible.DataMigration.Repo.html#child_spec/1","title":"Plausible.DataMigration.Repo.child_spec/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.config/0 .","ref":"Plausible.DataMigration.Repo.html#config/0","title":"Plausible.DataMigration.Repo.config/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.default_options/1 .","ref":"Plausible.DataMigration.Repo.html#default_options/1","title":"Plausible.DataMigration.Repo.default_options/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete/2 .","ref":"Plausible.DataMigration.Repo.html#delete/2","title":"Plausible.DataMigration.Repo.delete/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete!/2 .","ref":"Plausible.DataMigration.Repo.html#delete!/2","title":"Plausible.DataMigration.Repo.delete!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete_all/2 .","ref":"Plausible.DataMigration.Repo.html#delete_all/2","title":"Plausible.DataMigration.Repo.delete_all/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that forces all connections in the pool to disconnect within the given interval. See Ecto.Adapters.SQL.disconnect_all/3 for more information.","ref":"Plausible.DataMigration.Repo.html#disconnect_all/2","title":"Plausible.DataMigration.Repo.disconnect_all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.exists?/2 .","ref":"Plausible.DataMigration.Repo.html#exists?/2","title":"Plausible.DataMigration.Repo.exists?/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get/3 .","ref":"Plausible.DataMigration.Repo.html#get/3","title":"Plausible.DataMigration.Repo.get/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get!/3 .","ref":"Plausible.DataMigration.Repo.html#get!/3","title":"Plausible.DataMigration.Repo.get!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by/3 .","ref":"Plausible.DataMigration.Repo.html#get_by/3","title":"Plausible.DataMigration.Repo.get_by/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by!/3 .","ref":"Plausible.DataMigration.Repo.html#get_by!/3","title":"Plausible.DataMigration.Repo.get_by!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_dynamic_repo/0 .","ref":"Plausible.DataMigration.Repo.html#get_dynamic_repo/0","title":"Plausible.DataMigration.Repo.get_dynamic_repo/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert/2 .","ref":"Plausible.DataMigration.Repo.html#insert/2","title":"Plausible.DataMigration.Repo.insert/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert!/2 .","ref":"Plausible.DataMigration.Repo.html#insert!/2","title":"Plausible.DataMigration.Repo.insert!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_all/3 .","ref":"Plausible.DataMigration.Repo.html#insert_all/3","title":"Plausible.DataMigration.Repo.insert_all/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_or_update/2 .","ref":"Plausible.DataMigration.Repo.html#insert_or_update/2","title":"Plausible.DataMigration.Repo.insert_or_update/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_or_update!/2 .","ref":"Plausible.DataMigration.Repo.html#insert_or_update!/2","title":"Plausible.DataMigration.Repo.insert_or_update!/2","type":"function"},{"doc":"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 use Ecto.Schema @primary_key false schema "ecto_ch_demo" do field :a , Ch , type : "UInt64" field :b , :string 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 ) # schemaless { 100_000 , nil } = Repo . insert_stream ( "ecto_ch_demo" , rows , types : [ a : Ch.Types . u64 ( ) , b : :string ] )","ref":"Plausible.DataMigration.Repo.html#insert_stream/3","title":"Plausible.DataMigration.Repo.insert_stream/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.load/2 .","ref":"Plausible.DataMigration.Repo.html#load/2","title":"Plausible.DataMigration.Repo.load/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one/2 .","ref":"Plausible.DataMigration.Repo.html#one/2","title":"Plausible.DataMigration.Repo.one/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one!/2 .","ref":"Plausible.DataMigration.Repo.html#one!/2","title":"Plausible.DataMigration.Repo.one!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.preload/3 .","ref":"Plausible.DataMigration.Repo.html#preload/3","title":"Plausible.DataMigration.Repo.preload/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.prepare_query/3 .","ref":"Plausible.DataMigration.Repo.html#prepare_query/3","title":"Plausible.DataMigration.Repo.prepare_query/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.put_dynamic_repo/1 .","ref":"Plausible.DataMigration.Repo.html#put_dynamic_repo/1","title":"Plausible.DataMigration.Repo.put_dynamic_repo/1","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query/4 for more information.","ref":"Plausible.DataMigration.Repo.html#query/3","title":"Plausible.DataMigration.Repo.query/3","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query!/4 for more information.","ref":"Plausible.DataMigration.Repo.html#query!/3","title":"Plausible.DataMigration.Repo.query!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload/2 .","ref":"Plausible.DataMigration.Repo.html#reload/2","title":"Plausible.DataMigration.Repo.reload/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload!/2 .","ref":"Plausible.DataMigration.Repo.html#reload!/2","title":"Plausible.DataMigration.Repo.reload!/2","type":"function"},{"doc":"","ref":"Plausible.DataMigration.Repo.html#start/2","title":"Plausible.DataMigration.Repo.start/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.start_link/1 .","ref":"Plausible.DataMigration.Repo.html#start_link/1","title":"Plausible.DataMigration.Repo.start_link/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stop/1 .","ref":"Plausible.DataMigration.Repo.html#stop/1","title":"Plausible.DataMigration.Repo.stop/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stream/2 .","ref":"Plausible.DataMigration.Repo.html#stream/2","title":"Plausible.DataMigration.Repo.stream/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that translates the given query to SQL. See Ecto.Adapters.SQL.to_sql/3 for more information.","ref":"Plausible.DataMigration.Repo.html#to_sql/2","title":"Plausible.DataMigration.Repo.to_sql/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update/2 .","ref":"Plausible.DataMigration.Repo.html#update/2","title":"Plausible.DataMigration.Repo.update/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update!/2 .","ref":"Plausible.DataMigration.Repo.html#update!/2","title":"Plausible.DataMigration.Repo.update!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update_all/3 .","ref":"Plausible.DataMigration.Repo.html#update_all/3","title":"Plausible.DataMigration.Repo.update_all/3","type":"function"},{"doc":"Custom type for event name. Accepts Strings and Integers and stores them as String. Returns cast error if any other type is provided. Accepting integers is important for 404 tracking.","ref":"Plausible.Ecto.EventName.html","title":"Plausible.Ecto.EventName","type":"module"},{"doc":"Callback implementation for Ecto.Type.cast/1 .","ref":"Plausible.Ecto.EventName.html#cast/1","title":"Plausible.Ecto.EventName.cast/1","type":"function"},{"doc":"Callback implementation for Ecto.Type.dump/1 .","ref":"Plausible.Ecto.EventName.html#dump/1","title":"Plausible.Ecto.EventName.dump/1","type":"function"},{"doc":"Callback implementation for Ecto.Type.embed_as/1 .","ref":"Plausible.Ecto.EventName.html#embed_as/1","title":"Plausible.Ecto.EventName.embed_as/1","type":"function"},{"doc":"Callback implementation for Ecto.Type.equal?/2 .","ref":"Plausible.Ecto.EventName.html#equal?/2","title":"Plausible.Ecto.EventName.equal?/2","type":"function"},{"doc":"Callback implementation for Ecto.Type.load/1 .","ref":"Plausible.Ecto.EventName.html#load/1","title":"Plausible.Ecto.EventName.load/1","type":"function"},{"doc":"Callback implementation for Ecto.Type.type/0 .","ref":"Plausible.Ecto.EventName.html#type/0","title":"Plausible.Ecto.EventName.type/0","type":"function"},{"doc":"","ref":"Plausible.Event.WriteBuffer.html","title":"Plausible.Event.WriteBuffer","type":"module"},{"doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Plausible.Event.WriteBuffer.html#child_spec/1","title":"Plausible.Event.WriteBuffer.child_spec/1","type":"function"},{"doc":"","ref":"Plausible.Event.WriteBuffer.html#flush/0","title":"Plausible.Event.WriteBuffer.flush/0","type":"function"},{"doc":"Callback implementation for GenServer.init/1 .","ref":"Plausible.Event.WriteBuffer.html#init/1","title":"Plausible.Event.WriteBuffer.init/1","type":"function"},{"doc":"","ref":"Plausible.Event.WriteBuffer.html#insert/1","title":"Plausible.Event.WriteBuffer.insert/1","type":"function"},{"doc":"","ref":"Plausible.Event.WriteBuffer.html#start_link/1","title":"Plausible.Event.WriteBuffer.start_link/1","type":"function"},{"doc":"","ref":"Plausible.Factory.html","title":"Plausible.Factory","type":"module"},{"doc":"","ref":"Plausible.Factory.html#api_key_factory/0","title":"Plausible.Factory.api_key_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#build/2","title":"Plausible.Factory.build/2","type":"function"},{"doc":"","ref":"Plausible.Factory.html#build_list/3","title":"Plausible.Factory.build_list/3","type":"function"},{"doc":"","ref":"Plausible.Factory.html#build_pair/2","title":"Plausible.Factory.build_pair/2","type":"function"},{"doc":"","ref":"Plausible.Factory.html#ch_session_factory/0","title":"Plausible.Factory.ch_session_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#create/1","title":"Plausible.Factory.create/1","type":"function"},{"doc":"","ref":"Plausible.Factory.html#create/2","title":"Plausible.Factory.create/2","type":"function"},{"doc":"","ref":"Plausible.Factory.html#create_list/3","title":"Plausible.Factory.create_list/3","type":"function"},{"doc":"","ref":"Plausible.Factory.html#create_pair/2","title":"Plausible.Factory.create_pair/2","type":"function"},{"doc":"","ref":"Plausible.Factory.html#custom_domain_factory/0","title":"Plausible.Factory.custom_domain_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#enterprise_plan_factory/0","title":"Plausible.Factory.enterprise_plan_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#event_factory/0","title":"Plausible.Factory.event_factory/0","type":"function"},{"doc":"Raises a helpful error if no factory is defined.","ref":"Plausible.Factory.html#factory/1","title":"Plausible.Factory.factory/1","type":"function"},{"doc":"","ref":"Plausible.Factory.html#goal_factory/0","title":"Plausible.Factory.goal_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#google_auth_factory/0","title":"Plausible.Factory.google_auth_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#imported_browsers_factory/0","title":"Plausible.Factory.imported_browsers_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#imported_devices_factory/0","title":"Plausible.Factory.imported_devices_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#imported_entry_pages_factory/0","title":"Plausible.Factory.imported_entry_pages_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#imported_exit_pages_factory/0","title":"Plausible.Factory.imported_exit_pages_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#imported_locations_factory/0","title":"Plausible.Factory.imported_locations_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#imported_operating_systems_factory/0","title":"Plausible.Factory.imported_operating_systems_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#imported_pages_factory/0","title":"Plausible.Factory.imported_pages_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#imported_sources_factory/0","title":"Plausible.Factory.imported_sources_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#imported_visitors_factory/0","title":"Plausible.Factory.imported_visitors_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#insert/1","title":"Plausible.Factory.insert/1","type":"function"},{"doc":"","ref":"Plausible.Factory.html#insert/2","title":"Plausible.Factory.insert/2","type":"function"},{"doc":"","ref":"Plausible.Factory.html#insert/3","title":"Plausible.Factory.insert/3","type":"function"},{"doc":"","ref":"Plausible.Factory.html#insert_list/3","title":"Plausible.Factory.insert_list/3","type":"function"},{"doc":"","ref":"Plausible.Factory.html#insert_list/4","title":"Plausible.Factory.insert_list/4","type":"function"},{"doc":"","ref":"Plausible.Factory.html#insert_pair/2","title":"Plausible.Factory.insert_pair/2","type":"function"},{"doc":"","ref":"Plausible.Factory.html#insert_pair/3","title":"Plausible.Factory.insert_pair/3","type":"function"},{"doc":"","ref":"Plausible.Factory.html#invitation_factory/0","title":"Plausible.Factory.invitation_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#monthly_report_factory/0","title":"Plausible.Factory.monthly_report_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#pageview_factory/0","title":"Plausible.Factory.pageview_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#params_for/2","title":"Plausible.Factory.params_for/2","type":"function"},{"doc":"","ref":"Plausible.Factory.html#params_with_assocs/2","title":"Plausible.Factory.params_with_assocs/2","type":"function"},{"doc":"","ref":"Plausible.Factory.html#shared_link_factory/0","title":"Plausible.Factory.shared_link_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#site_factory/0","title":"Plausible.Factory.site_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#site_membership_factory/0","title":"Plausible.Factory.site_membership_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#spike_notification_factory/0","title":"Plausible.Factory.spike_notification_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#string_params_for/2","title":"Plausible.Factory.string_params_for/2","type":"function"},{"doc":"","ref":"Plausible.Factory.html#string_params_with_assocs/2","title":"Plausible.Factory.string_params_with_assocs/2","type":"function"},{"doc":"","ref":"Plausible.Factory.html#subscription_factory/0","title":"Plausible.Factory.subscription_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#user_factory/1","title":"Plausible.Factory.user_factory/1","type":"function"},{"doc":"","ref":"Plausible.Factory.html#weekly_report_factory/0","title":"Plausible.Factory.weekly_report_factory/0","type":"function"},{"doc":"A funnel is a marketing term used to capture and describe the journey that users go through, from initial step to conversion. A funnel consists of several steps (here: 2..8). This module defines the database schema for storing funnels and changeset helpers for enumerating the steps within. Each step references a goal (either a Custom Event or Visit) see: Plausible.Goal .","ref":"Plausible.Funnel.html","title":"Plausible.Funnel","type":"module"},{"doc":"","ref":"Plausible.Funnel.html#changeset/2","title":"Plausible.Funnel.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Funnel.html#max_steps/0","title":"Plausible.Funnel.max_steps/0","type":"macro"},{"doc":"","ref":"Plausible.Funnel.html#min_steps/0","title":"Plausible.Funnel.min_steps/0","type":"macro"},{"doc":"","ref":"Plausible.Funnel.html#put_step_orders/1","title":"Plausible.Funnel.put_step_orders/1","type":"function"},{"doc":"","ref":"Plausible.Funnel.html#t:t/0","title":"Plausible.Funnel.t/0","type":"type"},{"doc":"This module defines the database schema for a single Funnel step. See: Plausible.Funnel for more information.","ref":"Plausible.Funnel.Step.html","title":"Plausible.Funnel.Step","type":"module"},{"doc":"","ref":"Plausible.Funnel.Step.html#changeset/2","title":"Plausible.Funnel.Step.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Funnel.Step.html#t:t/0","title":"Plausible.Funnel.Step.t/0","type":"type"},{"doc":"This module implements contextual Funnel interface, allowing listing, creating and deleting funnel definitions. For brief explanation of what a Funnel is, please see Plausible.Funnel schema. See Plausible.Stats.Funnel for the evaluation logic.","ref":"Plausible.Funnels.html","title":"Plausible.Funnels","type":"module"},{"doc":"","ref":"Plausible.Funnels.html#create/3","title":"Plausible.Funnels.create/3","type":"function"},{"doc":"","ref":"Plausible.Funnels.html#create_changeset/3","title":"Plausible.Funnels.create_changeset/3","type":"function"},{"doc":"","ref":"Plausible.Funnels.html#delete/2","title":"Plausible.Funnels.delete/2","type":"function"},{"doc":"","ref":"Plausible.Funnels.html#enabled_for?/1","title":"Plausible.Funnels.enabled_for?/1","type":"function"},{"doc":"","ref":"Plausible.Funnels.html#ephemeral_definition/3","title":"Plausible.Funnels.ephemeral_definition/3","type":"function"},{"doc":"","ref":"Plausible.Funnels.html#get/2","title":"Plausible.Funnels.get/2","type":"function"},{"doc":"","ref":"Plausible.Funnels.html#list/1","title":"Plausible.Funnels.list/1","type":"function"},{"doc":"This module provides an API for fetching IP geolocation.","ref":"Plausible.Geo.html","title":"Plausible.Geo","type":"module"},{"doc":"Waits for the database to start after calling load_db/1 with the async option.","ref":"Plausible.Geo.html#await_loader/0","title":"Plausible.Geo.await_loader/0","type":"function"},{"doc":"Returns geodatabase type. Used for deciding whether to show the DB-IP disclaimer or not. 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 ( ) "GeoLite2-City"","ref":"Plausible.Geo.html#database_type/0","title":"Plausible.Geo.database_type/0","type":"function"},{"doc":"Starts the geodatabase loading process. Two modes are supported: local file and MaxMind license key. Options :path - the path to the .mmdb database local file. When present, :license_key and :edition are not required. :license_key - the license key from MaxMind to authenticate requests to MaxMind. :edition - the name of the MaxMind database to be downloaded from MaxMind servers. Defaults to GeoLite2-City . :async - when used, configures the database loading to run 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 ) :ok","ref":"Plausible.Geo.html#load_db/1","title":"Plausible.Geo.load_db/1","type":"function"},{"doc":"Looks up geo info about an IP address. Examples iex> lookup ( "8.7.6.5" ) %{ "city" => %{ "geoname_id" => 5349755 , "names" => %{ "de" => "Fontana" , "en" => "Fontana" , "ja" => "フォンタナ" , "ru" => "Фонтана" } } , "continent" => %{ "code" => "NA" , "geoname_id" => 6255149 , "names" => %{ "de" => "Nordamerika" , "en" => "North America" , "es" => "Norteamérica" , "fr" => "Amérique du Nord" , "ja" => "北アメリカ" , "pt-BR" => "América do Norte" , "ru" => "Северная Америка" , "zh-CN" => "北美洲" } } , "country" => %{ "geoname_id" => 6252001 , "iso_code" => "US" , "names" => %{ "de" => "Vereinigte Staaten" , "en" => "United States" , "es" => "Estados Unidos" , "fr" => "États Unis" , "ja" => "アメリカ" , "pt-BR" => "EUA" , "ru" => "США" , "zh-CN" => "美国" } } , "location" => %{ "accuracy_radius" => 50 , "latitude" => 34.1211 , "longitude" => - 117.4362 , "metro_code" => 803 , "time_zone" => "America/Los_Angeles" } , "postal" => %{ "code" => "92336" } , "registered_country" => %{ "geoname_id" => 6252001 , "iso_code" => "US" , "names" => %{ "de" => "Vereinigte Staaten" , "en" => "United States" , "es" => "Estados Unidos" , "fr" => "États Unis" , "ja" => "アメリカ" , "pt-BR" => "EUA" , "ru" => "США" , "zh-CN" => "美国" } } , "subdivisions" => [ %{ "geoname_id" => 5332921 , "iso_code" => "CA" , "names" => %{ "de" => "Kalifornien" , "en" => "California" , "es" => "California" , "fr" => "Californie" , "ja" => "カリフォルニア州" , "pt-BR" => "Califórnia" , "ru" => "Калифорния" , "zh-CN" => "加州" } } ] }","ref":"Plausible.Geo.html#lookup/1","title":"Plausible.Geo.lookup/1","type":"function"},{"doc":"","ref":"Plausible.Goal.html","title":"Plausible.Goal","type":"module"},{"doc":"","ref":"Plausible.Goal.html#changeset/2","title":"Plausible.Goal.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Goal.html#currency_options/0","title":"Plausible.Goal.currency_options/0","type":"function"},{"doc":"","ref":"Plausible.Goal.html#revenue?/1","title":"Plausible.Goal.revenue?/1","type":"function"},{"doc":"","ref":"Plausible.Goal.html#valid_currencies/0","title":"Plausible.Goal.valid_currencies/0","type":"function"},{"doc":"","ref":"Plausible.Goal.html#t:t/0","title":"Plausible.Goal.t/0","type":"type"},{"doc":"","ref":"Plausible.Goals.html","title":"Plausible.Goals","type":"module"},{"doc":"","ref":"Plausible.Goals.html#count/1","title":"Plausible.Goals.count/1","type":"function"},{"doc":"Creates a Goal for a site. If the created goal is a revenue goal, it sets site.updated_at to be refreshed by the sites cache, as revenue goals are used during ingestion.","ref":"Plausible.Goals.html#create/3","title":"Plausible.Goals.create/3","type":"function"},{"doc":"If a goal belongs to funnel(s), we need to inspect their number of steps. If it exceeds the minimum allowed (defined via Plausible.Funnel.min_steps/0 ), the funnel will be reduced (i.e. a step associated with the goal to be deleted is removed), so that the minimum number of steps is preserved. This is done implicitly, by postgres, as per on_delete: :delete_all. Otherwise, for associated funnel(s) consisting of minimum number steps only, funnel record(s) are removed completely along with the targeted goal.","ref":"Plausible.Goals.html#delete/2","title":"Plausible.Goals.delete/2","type":"function"},{"doc":"","ref":"Plausible.Goals.html#find_or_create/2","title":"Plausible.Goals.find_or_create/2","type":"function"},{"doc":"","ref":"Plausible.Goals.html#for_site/2","title":"Plausible.Goals.for_site/2","type":"function"},{"doc":"","ref":"Plausible.Google.Api.html","title":"Plausible.Google.Api","type":"module"},{"doc":"","ref":"Plausible.Google.Api.html#fetch_and_persist/3","title":"Plausible.Google.Api.fetch_and_persist/3","type":"function"},{"doc":"","ref":"Plausible.Google.Api.html#fetch_stats/3","title":"Plausible.Google.Api.fetch_stats/3","type":"function"},{"doc":"","ref":"Plausible.Google.Api.html#fetch_verified_properties/1","title":"Plausible.Google.Api.fetch_verified_properties/1","type":"function"},{"doc":"Returns a single Google Analytics view if the user has access to it.","ref":"Plausible.Google.Api.html#get_view/2","title":"Plausible.Google.Api.get_view/2","type":"function"},{"doc":"Imports stats from a Google Analytics UA view to a Plausible site. This function fetches Google Analytics reports in batches of 7500 per request. The batches are then buffered to Clickhouse by the Plausible.Google.Buffer process. Requests to Google Analytics can fail, and are retried at most 5 times with an exponential backoff. Returns :ok when importing has finished or {:error, term()} when a request to GA failed too many times. Useful links: Feature documentation GA API reference GA Dimensions reference","ref":"Plausible.Google.Api.html#import_analytics/4","title":"Plausible.Google.Api.import_analytics/4","type":"function"},{"doc":"","ref":"Plausible.Google.Api.html#import_authorize_url/2","title":"Plausible.Google.Api.import_authorize_url/2","type":"function"},{"doc":"Lists Google Analytics views grouped by hostname.","ref":"Plausible.Google.Api.html#list_views/1","title":"Plausible.Google.Api.list_views/1","type":"function"},{"doc":"","ref":"Plausible.Google.Api.html#search_console_authorize_url/2","title":"Plausible.Google.Api.search_console_authorize_url/2","type":"function"},{"doc":"","ref":"Plausible.Google.Api.html#t:google_analytics_view/0","title":"Plausible.Google.Api.google_analytics_view/0","type":"type"},{"doc":"","ref":"Plausible.Google.Api.html#t:import_auth/0","title":"Plausible.Google.Api.import_auth/0","type":"type"},{"doc":"","ref":"Plausible.Google.Api.Mock.html","title":"Plausible.Google.Api.Mock","type":"module"},{"doc":"","ref":"Plausible.Google.Api.Mock.html#fetch_stats/3","title":"Plausible.Google.Api.Mock.fetch_stats/3","type":"function"},{"doc":"This GenServer inserts records into Clickhouse imported_* tables. Multiple buffers are automatically created for each table. Records are flushed when the table buffer reaches the maximum size, defined by max_buffer_size/0 .","ref":"Plausible.Google.Buffer.html","title":"Plausible.Google.Buffer","type":"module"},{"doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Plausible.Google.Buffer.html#child_spec/1","title":"Plausible.Google.Buffer.child_spec/1","type":"function"},{"doc":"Flushes all table buffers to Clickhouse.","ref":"Plausible.Google.Buffer.html#flush/2","title":"Plausible.Google.Buffer.flush/2","type":"function"},{"doc":"Callback implementation for GenServer.handle_continue/2 .","ref":"Plausible.Google.Buffer.html#handle_continue/2","title":"Plausible.Google.Buffer.handle_continue/2","type":"function"},{"doc":"Callback implementation for GenServer.init/1 .","ref":"Plausible.Google.Buffer.html#init/1","title":"Plausible.Google.Buffer.init/1","type":"function"},{"doc":"Puts the given records into the table buffer.","ref":"Plausible.Google.Buffer.html#insert_many/3","title":"Plausible.Google.Buffer.insert_many/3","type":"function"},{"doc":"Returns the total count of items in the given table buffer.","ref":"Plausible.Google.Buffer.html#size/2","title":"Plausible.Google.Buffer.size/2","type":"function"},{"doc":"","ref":"Plausible.Google.Buffer.html#start_link/0","title":"Plausible.Google.Buffer.start_link/0","type":"function"},{"doc":"","ref":"Plausible.Google.Buffer.html#stop/1","title":"Plausible.Google.Buffer.stop/1","type":"function"},{"doc":"","ref":"Plausible.Google.HTTP.html","title":"Plausible.Google.HTTP","type":"module"},{"doc":"","ref":"Plausible.Google.HTTP.html#fetch_access_token/1","title":"Plausible.Google.HTTP.fetch_access_token/1","type":"function"},{"doc":"","ref":"Plausible.Google.HTTP.html#get_analytics_start_date/2","title":"Plausible.Google.HTTP.get_analytics_start_date/2","type":"function"},{"doc":"","ref":"Plausible.Google.HTTP.html#get_report/1","title":"Plausible.Google.HTTP.get_report/1","type":"function"},{"doc":"","ref":"Plausible.Google.HTTP.html#list_sites/1","title":"Plausible.Google.HTTP.list_sites/1","type":"function"},{"doc":"","ref":"Plausible.Google.HTTP.html#list_stats/5","title":"Plausible.Google.HTTP.list_stats/5","type":"function"},{"doc":"","ref":"Plausible.Google.HTTP.html#list_views_for_user/1","title":"Plausible.Google.HTTP.list_views_for_user/1","type":"function"},{"doc":"","ref":"Plausible.Google.HTTP.html#refresh_auth_token/1","title":"Plausible.Google.HTTP.refresh_auth_token/1","type":"function"},{"doc":"","ref":"Plausible.Google.ReportRequest.html","title":"Plausible.Google.ReportRequest","type":"module"},{"doc":"","ref":"Plausible.Google.ReportRequest.html#full_report/0","title":"Plausible.Google.ReportRequest.full_report/0","type":"function"},{"doc":"","ref":"Plausible.Google.ReportRequest.html#t:t/0","title":"Plausible.Google.ReportRequest.t/0","type":"type"},{"doc":"HTTP Client built on top of Finch. By default, request parameters are json-encoded. If a raw binary value is supplied, no encoding is performed. If x-www-form-urlencoded content-type is set in headers, URL encoding is invoked.","ref":"Plausible.HTTPClient.html","title":"Plausible.HTTPClient","type":"module"},{"doc":"Make a GET request","ref":"Plausible.HTTPClient.html#get/2","title":"Plausible.HTTPClient.get/2","type":"function"},{"doc":"","ref":"Plausible.HTTPClient.html#impl/0","title":"Plausible.HTTPClient.impl/0","type":"function"},{"doc":"Make a POST request","ref":"Plausible.HTTPClient.html#post/4","title":"Plausible.HTTPClient.post/4","type":"function"},{"doc":"","ref":"Plausible.HTTPClient.Interface.html","title":"Plausible.HTTPClient.Interface","type":"behaviour"},{"doc":"","ref":"Plausible.HTTPClient.Interface.html#c:get/1","title":"Plausible.HTTPClient.Interface.get/1","type":"callback"},{"doc":"","ref":"Plausible.HTTPClient.Interface.html#c:get/2","title":"Plausible.HTTPClient.Interface.get/2","type":"callback"},{"doc":"","ref":"Plausible.HTTPClient.Interface.html#c:post/3","title":"Plausible.HTTPClient.Interface.post/3","type":"callback"},{"doc":"","ref":"Plausible.HTTPClient.Interface.html#c:post/4","title":"Plausible.HTTPClient.Interface.post/4","type":"callback"},{"doc":"","ref":"Plausible.HTTPClient.Interface.html#t:finch_request_opts/0","title":"Plausible.HTTPClient.Interface.finch_request_opts/0","type":"type"},{"doc":"","ref":"Plausible.HTTPClient.Interface.html#t:headers/0","title":"Plausible.HTTPClient.Interface.headers/0","type":"type"},{"doc":"","ref":"Plausible.HTTPClient.Interface.html#t:params/0","title":"Plausible.HTTPClient.Interface.params/0","type":"type"},{"doc":"","ref":"Plausible.HTTPClient.Interface.html#t:response/0","title":"Plausible.HTTPClient.Interface.response/0","type":"type"},{"doc":"","ref":"Plausible.HTTPClient.Interface.html#t:url/0","title":"Plausible.HTTPClient.Interface.url/0","type":"type"},{"doc":"","ref":"Plausible.HTTPClient.Non200Error.html","title":"Plausible.HTTPClient.Non200Error","type":"module"},{"doc":"","ref":"Plausible.HTTPClient.Non200Error.html#new/1","title":"Plausible.HTTPClient.Non200Error.new/1","type":"function"},{"doc":"","ref":"Plausible.HTTPClient.Non200Error.html#t:t/0","title":"Plausible.HTTPClient.Non200Error.t/0","type":"type"},{"doc":"A dedicated repo for import related mutations","ref":"Plausible.ImportDeletionRepo.html","title":"Plausible.ImportDeletionRepo","type":"module"},{"doc":"Callback implementation for Ecto.Repo.aggregate/3 .","ref":"Plausible.ImportDeletionRepo.html#aggregate/3","title":"Plausible.ImportDeletionRepo.aggregate/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.aggregate/4 .","ref":"Plausible.ImportDeletionRepo.html#aggregate/4","title":"Plausible.ImportDeletionRepo.aggregate/4","type":"function"},{"doc":"Callback implementation for Ecto.Repo.all/2 .","ref":"Plausible.ImportDeletionRepo.html#all/2","title":"Plausible.ImportDeletionRepo.all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checked_out?/0 .","ref":"Plausible.ImportDeletionRepo.html#checked_out?/0","title":"Plausible.ImportDeletionRepo.checked_out?/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checkout/2 .","ref":"Plausible.ImportDeletionRepo.html#checkout/2","title":"Plausible.ImportDeletionRepo.checkout/2","type":"function"},{"doc":"","ref":"Plausible.ImportDeletionRepo.html#child_spec/1","title":"Plausible.ImportDeletionRepo.child_spec/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.config/0 .","ref":"Plausible.ImportDeletionRepo.html#config/0","title":"Plausible.ImportDeletionRepo.config/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.default_options/1 .","ref":"Plausible.ImportDeletionRepo.html#default_options/1","title":"Plausible.ImportDeletionRepo.default_options/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete/2 .","ref":"Plausible.ImportDeletionRepo.html#delete/2","title":"Plausible.ImportDeletionRepo.delete/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete!/2 .","ref":"Plausible.ImportDeletionRepo.html#delete!/2","title":"Plausible.ImportDeletionRepo.delete!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete_all/2 .","ref":"Plausible.ImportDeletionRepo.html#delete_all/2","title":"Plausible.ImportDeletionRepo.delete_all/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that forces all connections in the pool to disconnect within the given interval. See Ecto.Adapters.SQL.disconnect_all/3 for more information.","ref":"Plausible.ImportDeletionRepo.html#disconnect_all/2","title":"Plausible.ImportDeletionRepo.disconnect_all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.exists?/2 .","ref":"Plausible.ImportDeletionRepo.html#exists?/2","title":"Plausible.ImportDeletionRepo.exists?/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get/3 .","ref":"Plausible.ImportDeletionRepo.html#get/3","title":"Plausible.ImportDeletionRepo.get/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get!/3 .","ref":"Plausible.ImportDeletionRepo.html#get!/3","title":"Plausible.ImportDeletionRepo.get!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by/3 .","ref":"Plausible.ImportDeletionRepo.html#get_by/3","title":"Plausible.ImportDeletionRepo.get_by/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by!/3 .","ref":"Plausible.ImportDeletionRepo.html#get_by!/3","title":"Plausible.ImportDeletionRepo.get_by!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_dynamic_repo/0 .","ref":"Plausible.ImportDeletionRepo.html#get_dynamic_repo/0","title":"Plausible.ImportDeletionRepo.get_dynamic_repo/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert/2 .","ref":"Plausible.ImportDeletionRepo.html#insert/2","title":"Plausible.ImportDeletionRepo.insert/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert!/2 .","ref":"Plausible.ImportDeletionRepo.html#insert!/2","title":"Plausible.ImportDeletionRepo.insert!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_all/3 .","ref":"Plausible.ImportDeletionRepo.html#insert_all/3","title":"Plausible.ImportDeletionRepo.insert_all/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_or_update/2 .","ref":"Plausible.ImportDeletionRepo.html#insert_or_update/2","title":"Plausible.ImportDeletionRepo.insert_or_update/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_or_update!/2 .","ref":"Plausible.ImportDeletionRepo.html#insert_or_update!/2","title":"Plausible.ImportDeletionRepo.insert_or_update!/2","type":"function"},{"doc":"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 use Ecto.Schema @primary_key false schema "ecto_ch_demo" do field :a , Ch , type : "UInt64" field :b , :string 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 ) # schemaless { 100_000 , nil } = Repo . insert_stream ( "ecto_ch_demo" , rows , types : [ a : Ch.Types . u64 ( ) , b : :string ] )","ref":"Plausible.ImportDeletionRepo.html#insert_stream/3","title":"Plausible.ImportDeletionRepo.insert_stream/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.load/2 .","ref":"Plausible.ImportDeletionRepo.html#load/2","title":"Plausible.ImportDeletionRepo.load/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one/2 .","ref":"Plausible.ImportDeletionRepo.html#one/2","title":"Plausible.ImportDeletionRepo.one/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one!/2 .","ref":"Plausible.ImportDeletionRepo.html#one!/2","title":"Plausible.ImportDeletionRepo.one!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.preload/3 .","ref":"Plausible.ImportDeletionRepo.html#preload/3","title":"Plausible.ImportDeletionRepo.preload/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.prepare_query/3 .","ref":"Plausible.ImportDeletionRepo.html#prepare_query/3","title":"Plausible.ImportDeletionRepo.prepare_query/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.put_dynamic_repo/1 .","ref":"Plausible.ImportDeletionRepo.html#put_dynamic_repo/1","title":"Plausible.ImportDeletionRepo.put_dynamic_repo/1","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query/4 for more information.","ref":"Plausible.ImportDeletionRepo.html#query/3","title":"Plausible.ImportDeletionRepo.query/3","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query!/4 for more information.","ref":"Plausible.ImportDeletionRepo.html#query!/3","title":"Plausible.ImportDeletionRepo.query!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload/2 .","ref":"Plausible.ImportDeletionRepo.html#reload/2","title":"Plausible.ImportDeletionRepo.reload/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload!/2 .","ref":"Plausible.ImportDeletionRepo.html#reload!/2","title":"Plausible.ImportDeletionRepo.reload!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.start_link/1 .","ref":"Plausible.ImportDeletionRepo.html#start_link/1","title":"Plausible.ImportDeletionRepo.start_link/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stop/1 .","ref":"Plausible.ImportDeletionRepo.html#stop/1","title":"Plausible.ImportDeletionRepo.stop/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stream/2 .","ref":"Plausible.ImportDeletionRepo.html#stream/2","title":"Plausible.ImportDeletionRepo.stream/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that translates the given query to SQL. See Ecto.Adapters.SQL.to_sql/3 for more information.","ref":"Plausible.ImportDeletionRepo.html#to_sql/2","title":"Plausible.ImportDeletionRepo.to_sql/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update/2 .","ref":"Plausible.ImportDeletionRepo.html#update/2","title":"Plausible.ImportDeletionRepo.update/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update!/2 .","ref":"Plausible.ImportDeletionRepo.html#update!/2","title":"Plausible.ImportDeletionRepo.update!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update_all/3 .","ref":"Plausible.ImportDeletionRepo.html#update_all/3","title":"Plausible.ImportDeletionRepo.update_all/3","type":"function"},{"doc":"","ref":"Plausible.Imported.html","title":"Plausible.Imported","type":"module"},{"doc":"","ref":"Plausible.Imported.html#forget/1","title":"Plausible.Imported.forget/1","type":"function"},{"doc":"","ref":"Plausible.Imported.html#from_google_analytics/3","title":"Plausible.Imported.from_google_analytics/3","type":"function"},{"doc":"","ref":"Plausible.Imported.html#tables/0","title":"Plausible.Imported.tables/0","type":"function"},{"doc":"Write-centric Clickhouse access interface","ref":"Plausible.IngestRepo.html","title":"Plausible.IngestRepo","type":"module"},{"doc":"Callback implementation for Ecto.Repo.aggregate/3 .","ref":"Plausible.IngestRepo.html#aggregate/3","title":"Plausible.IngestRepo.aggregate/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.aggregate/4 .","ref":"Plausible.IngestRepo.html#aggregate/4","title":"Plausible.IngestRepo.aggregate/4","type":"function"},{"doc":"Callback implementation for Ecto.Repo.all/2 .","ref":"Plausible.IngestRepo.html#all/2","title":"Plausible.IngestRepo.all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checked_out?/0 .","ref":"Plausible.IngestRepo.html#checked_out?/0","title":"Plausible.IngestRepo.checked_out?/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checkout/2 .","ref":"Plausible.IngestRepo.html#checkout/2","title":"Plausible.IngestRepo.checkout/2","type":"function"},{"doc":"","ref":"Plausible.IngestRepo.html#child_spec/1","title":"Plausible.IngestRepo.child_spec/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.config/0 .","ref":"Plausible.IngestRepo.html#config/0","title":"Plausible.IngestRepo.config/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.default_options/1 .","ref":"Plausible.IngestRepo.html#default_options/1","title":"Plausible.IngestRepo.default_options/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete/2 .","ref":"Plausible.IngestRepo.html#delete/2","title":"Plausible.IngestRepo.delete/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete!/2 .","ref":"Plausible.IngestRepo.html#delete!/2","title":"Plausible.IngestRepo.delete!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete_all/2 .","ref":"Plausible.IngestRepo.html#delete_all/2","title":"Plausible.IngestRepo.delete_all/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that forces all connections in the pool to disconnect within the given interval. See Ecto.Adapters.SQL.disconnect_all/3 for more information.","ref":"Plausible.IngestRepo.html#disconnect_all/2","title":"Plausible.IngestRepo.disconnect_all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.exists?/2 .","ref":"Plausible.IngestRepo.html#exists?/2","title":"Plausible.IngestRepo.exists?/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get/3 .","ref":"Plausible.IngestRepo.html#get/3","title":"Plausible.IngestRepo.get/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get!/3 .","ref":"Plausible.IngestRepo.html#get!/3","title":"Plausible.IngestRepo.get!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by/3 .","ref":"Plausible.IngestRepo.html#get_by/3","title":"Plausible.IngestRepo.get_by/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by!/3 .","ref":"Plausible.IngestRepo.html#get_by!/3","title":"Plausible.IngestRepo.get_by!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_dynamic_repo/0 .","ref":"Plausible.IngestRepo.html#get_dynamic_repo/0","title":"Plausible.IngestRepo.get_dynamic_repo/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert/2 .","ref":"Plausible.IngestRepo.html#insert/2","title":"Plausible.IngestRepo.insert/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert!/2 .","ref":"Plausible.IngestRepo.html#insert!/2","title":"Plausible.IngestRepo.insert!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_all/3 .","ref":"Plausible.IngestRepo.html#insert_all/3","title":"Plausible.IngestRepo.insert_all/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_or_update/2 .","ref":"Plausible.IngestRepo.html#insert_or_update/2","title":"Plausible.IngestRepo.insert_or_update/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_or_update!/2 .","ref":"Plausible.IngestRepo.html#insert_or_update!/2","title":"Plausible.IngestRepo.insert_or_update!/2","type":"function"},{"doc":"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 use Ecto.Schema @primary_key false schema "ecto_ch_demo" do field :a , Ch , type : "UInt64" field :b , :string 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 ) # schemaless { 100_000 , nil } = Repo . insert_stream ( "ecto_ch_demo" , rows , types : [ a : Ch.Types . u64 ( ) , b : :string ] )","ref":"Plausible.IngestRepo.html#insert_stream/3","title":"Plausible.IngestRepo.insert_stream/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.load/2 .","ref":"Plausible.IngestRepo.html#load/2","title":"Plausible.IngestRepo.load/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one/2 .","ref":"Plausible.IngestRepo.html#one/2","title":"Plausible.IngestRepo.one/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one!/2 .","ref":"Plausible.IngestRepo.html#one!/2","title":"Plausible.IngestRepo.one!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.preload/3 .","ref":"Plausible.IngestRepo.html#preload/3","title":"Plausible.IngestRepo.preload/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.prepare_query/3 .","ref":"Plausible.IngestRepo.html#prepare_query/3","title":"Plausible.IngestRepo.prepare_query/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.put_dynamic_repo/1 .","ref":"Plausible.IngestRepo.html#put_dynamic_repo/1","title":"Plausible.IngestRepo.put_dynamic_repo/1","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query/4 for more information.","ref":"Plausible.IngestRepo.html#query/3","title":"Plausible.IngestRepo.query/3","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query!/4 for more information.","ref":"Plausible.IngestRepo.html#query!/3","title":"Plausible.IngestRepo.query!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload/2 .","ref":"Plausible.IngestRepo.html#reload/2","title":"Plausible.IngestRepo.reload/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload!/2 .","ref":"Plausible.IngestRepo.html#reload!/2","title":"Plausible.IngestRepo.reload!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.start_link/1 .","ref":"Plausible.IngestRepo.html#start_link/1","title":"Plausible.IngestRepo.start_link/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stop/1 .","ref":"Plausible.IngestRepo.html#stop/1","title":"Plausible.IngestRepo.stop/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stream/2 .","ref":"Plausible.IngestRepo.html#stream/2","title":"Plausible.IngestRepo.stream/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that translates the given query to SQL. See Ecto.Adapters.SQL.to_sql/3 for more information.","ref":"Plausible.IngestRepo.html#to_sql/2","title":"Plausible.IngestRepo.to_sql/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update/2 .","ref":"Plausible.IngestRepo.html#update/2","title":"Plausible.IngestRepo.update/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update!/2 .","ref":"Plausible.IngestRepo.html#update!/2","title":"Plausible.IngestRepo.update!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update_all/3 .","ref":"Plausible.IngestRepo.html#update_all/3","title":"Plausible.IngestRepo.update_all/3","type":"function"},{"doc":"This is instrumentation necessary for keeping track of per-domain internal metrics. Due to metric labels cardinality (domain x metric_name), these statistics are not suitable for prometheus/grafana exposure, hence an internal storage is used. The module installs Counters.TelemetryHandler and periodically flushes the internal counter aggregates via Counters.Buffer interface. The underlying database schema is running SummingMergeTree engine. To take advantage of automatic roll-ups it provides, upon dispatching the buffered records to Clickhouse this module transforms each event_timebucket aggregate into a 1-minute resolution. Clickhouse connection is set to insert counters asynchronously every time a pool checkout is made. Those properties are reverted once the insert is done (or naturally, if the connection crashes).","ref":"Plausible.Ingestion.Counters.html","title":"Plausible.Ingestion.Counters","type":"module"},{"doc":"","ref":"Plausible.Ingestion.Counters.html#child_spec/1","title":"Plausible.Ingestion.Counters.child_spec/1","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Counters.html#enabled?/0","title":"Plausible.Ingestion.Counters.enabled?/0","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Counters.html#stop/1","title":"Plausible.Ingestion.Counters.stop/1","type":"function"},{"doc":"A buffer aggregating counters for internal metrics, within 10 seconds time buckets. See Plausible.Ingestion.Counters for integration. Flushing is by default possible only once the 10s bucket is complete (its window has moved). This is to avoid race conditions when clearing up the buffer on dequeue - because there is no atomic "get and delete", and items are buffered concurrently, there is a gap between get and delete in which items written may disappear otherwise. aggregate_bucket_fn and flush_boundary_fn control that semantics and are configurable only for test purposes.","ref":"Plausible.Ingestion.Counters.Buffer.html","title":"Plausible.Ingestion.Counters.Buffer","type":"module"},{"doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#aggregate/4","title":"Plausible.Ingestion.Counters.Buffer.aggregate/4","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#bucket_10s/1","title":"Plausible.Ingestion.Counters.Buffer.bucket_10s/1","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#flush/2","title":"Plausible.Ingestion.Counters.Buffer.flush/2","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#new/2","title":"Plausible.Ingestion.Counters.Buffer.new/2","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#previous_10s/1","title":"Plausible.Ingestion.Counters.Buffer.previous_10s/1","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#t:bucket_fn_opt/0","title":"Plausible.Ingestion.Counters.Buffer.bucket_fn_opt/0","type":"type"},{"doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#t:t/0","title":"Plausible.Ingestion.Counters.Buffer.t/0","type":"type"},{"doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#t:unix_timestamp/0","title":"Plausible.Ingestion.Counters.Buffer.unix_timestamp/0","type":"type"},{"doc":"Clickhouse schema for storing ingest counter metrics","ref":"Plausible.Ingestion.Counters.Record.html","title":"Plausible.Ingestion.Counters.Record","type":"module"},{"doc":"","ref":"Plausible.Ingestion.Counters.Record.html#t:t/0","title":"Plausible.Ingestion.Counters.Record.t/0","type":"type"},{"doc":"Susbcribes to telemetry events emitted by Plausible.Ingestion.Event . Every time a request derived event is either dispatched to clickhouse or dropped, a telemetry event is emitted respectively. That event is captured here, its metadata is extracted and sent for internal stats aggregation via Counters.Buffer interface.","ref":"Plausible.Ingestion.Counters.TelemetryHandler.html","title":"Plausible.Ingestion.Counters.TelemetryHandler","type":"module"},{"doc":"","ref":"Plausible.Ingestion.Counters.TelemetryHandler.html#handle_event/4","title":"Plausible.Ingestion.Counters.TelemetryHandler.handle_event/4","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Counters.TelemetryHandler.html#install/1","title":"Plausible.Ingestion.Counters.TelemetryHandler.install/1","type":"function"},{"doc":"This module exposes the build_and_buffer/1 function capable of turning %Plausible.Ingestion.Request{} into a series of events that in turn are uniformly either buffered in batches (to Clickhouse) or dropped (e.g. due to spam blocklist) from the processing pipeline.","ref":"Plausible.Ingestion.Event.html","title":"Plausible.Ingestion.Event","type":"module"},{"doc":"","ref":"Plausible.Ingestion.Event.html#build_and_buffer/1","title":"Plausible.Ingestion.Event.build_and_buffer/1","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Event.html#emit_telemetry_buffered/1","title":"Plausible.Ingestion.Event.emit_telemetry_buffered/1","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Event.html#emit_telemetry_dropped/2","title":"Plausible.Ingestion.Event.emit_telemetry_dropped/2","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Event.html#telemetry_event_buffered/0","title":"Plausible.Ingestion.Event.telemetry_event_buffered/0","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Event.html#telemetry_event_dropped/0","title":"Plausible.Ingestion.Event.telemetry_event_dropped/0","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Event.html#t:drop_reason/0","title":"Plausible.Ingestion.Event.drop_reason/0","type":"type"},{"doc":"","ref":"Plausible.Ingestion.Event.html#t:t/0","title":"Plausible.Ingestion.Event.t/0","type":"type"},{"doc":"The %Plausible.Ingestion.Request{} struct stores all needed fields to create an event downstream. Pre-eliminary validation is made to detect user errors early.","ref":"Plausible.Ingestion.Request.html","title":"Plausible.Ingestion.Request","type":"module"},{"doc":"Builds and initially validates %Plausible.Ingestion.Request{} struct from %Plug.Conn{}.","ref":"Plausible.Ingestion.Request.html#build/2","title":"Plausible.Ingestion.Request.build/2","type":"function"},{"doc":"Removes the "www" part of a hostname.","ref":"Plausible.Ingestion.Request.html#sanitize_hostname/1","title":"Plausible.Ingestion.Request.sanitize_hostname/1","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Request.html#t:t/0","title":"Plausible.Ingestion.Request.t/0","type":"type"},{"doc":"","ref":"Plausible.Mailer.html","title":"Plausible.Mailer","type":"module"},{"doc":"","ref":"Plausible.Mailer.html#deliver/1","title":"Plausible.Mailer.deliver/1","type":"function"},{"doc":"","ref":"Plausible.Mailer.html#deliver_later/2","title":"Plausible.Mailer.deliver_later/2","type":"function"},{"doc":"","ref":"Plausible.Mailer.html#deliver_later!/2","title":"Plausible.Mailer.deliver_later!/2","type":"function"},{"doc":"","ref":"Plausible.Mailer.html#deliver_now/2","title":"Plausible.Mailer.deliver_now/2","type":"function"},{"doc":"","ref":"Plausible.Mailer.html#deliver_now!/2","title":"Plausible.Mailer.deliver_now!/2","type":"function"},{"doc":"","ref":"Plausible.Mailer.html#send/1","title":"Plausible.Mailer.send/1","type":"function"},{"doc":"Custom OpenTelemetry sampler implementation that ignores particular traces to reduce noise. Ingestion HTTP requests and queries to Oban tables are ignored, for example.","ref":"Plausible.OpenTelemetry.Sampler.html","title":"Plausible.OpenTelemetry.Sampler","type":"module"},{"doc":"","ref":"Plausible.PaddleApi.Mock.html","title":"Plausible.PaddleApi.Mock","type":"module"},{"doc":"","ref":"Plausible.PaddleApi.Mock.html#get_invoices/1","title":"Plausible.PaddleApi.Mock.get_invoices/1","type":"function"},{"doc":"","ref":"Plausible.PaddleApi.Mock.html#get_subscription/1","title":"Plausible.PaddleApi.Mock.get_subscription/1","type":"function"},{"doc":"","ref":"Plausible.PaddleApi.Mock.html#update_subscription/2","title":"Plausible.PaddleApi.Mock.update_subscription/2","type":"function"},{"doc":"","ref":"Plausible.PromEx.html","title":"Plausible.PromEx","type":"module"},{"doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Plausible.PromEx.html#child_spec/1","title":"Plausible.PromEx.child_spec/1","type":"function"},{"doc":"Custom PromEx plugin for instrumenting code within Plausible app.","ref":"Plausible.PromEx.Plugins.PlausibleMetrics.html","title":"Plausible.PromEx.Plugins.PlausibleMetrics","type":"module"},{"doc":"Add telemetry events for Cachex user agents and sessions","ref":"Plausible.PromEx.Plugins.PlausibleMetrics.html#execute_cache_metrics/0","title":"Plausible.PromEx.Plugins.PlausibleMetrics.execute_cache_metrics/0","type":"function"},{"doc":"Add telemetry events for Session and Event write buffers","ref":"Plausible.PromEx.Plugins.PlausibleMetrics.html#execute_write_buffer_metrics/0","title":"Plausible.PromEx.Plugins.PlausibleMetrics.execute_write_buffer_metrics/0","type":"function"},{"doc":"Deletes data from a site. Stats are stored on Clickhouse, and unlike other databases data deletion is done asynchronously. Clickhouse ALTER TABLE ... DELETE Statement Synchronicity of ALTER Queries","ref":"Plausible.Purge.html","title":"Plausible.Purge","type":"module"},{"doc":"Deletes imported stats from Google Analytics, and clears the stats_start_date field.","ref":"Plausible.Purge.html#delete_imported_stats!/1","title":"Plausible.Purge.delete_imported_stats!/1","type":"function"},{"doc":"Move stats pointers so that no historical stats are available.","ref":"Plausible.Purge.html#delete_native_stats!/1","title":"Plausible.Purge.delete_native_stats!/1","type":"function"},{"doc":"","ref":"Plausible.Purge.html#reset!/1","title":"Plausible.Purge.reset!/1","type":"function"},{"doc":"","ref":"Plausible.Release.html","title":"Plausible.Release","type":"module"},{"doc":"","ref":"Plausible.Release.html#configure_ref_inspector/0","title":"Plausible.Release.configure_ref_inspector/0","type":"function"},{"doc":"","ref":"Plausible.Release.html#configure_ua_inspector/0","title":"Plausible.Release.configure_ua_inspector/0","type":"function"},{"doc":"","ref":"Plausible.Release.html#createdb/0","title":"Plausible.Release.createdb/0","type":"function"},{"doc":"","ref":"Plausible.Release.html#migrate/0","title":"Plausible.Release.migrate/0","type":"function"},{"doc":"","ref":"Plausible.Release.html#rollback/0","title":"Plausible.Release.rollback/0","type":"function"},{"doc":"","ref":"Plausible.Release.html#seed/0","title":"Plausible.Release.seed/0","type":"function"},{"doc":"","ref":"Plausible.Release.html#selfhost?/0","title":"Plausible.Release.selfhost?/0","type":"function"},{"doc":"","ref":"Plausible.Release.html#should_be_first_launch?/0","title":"Plausible.Release.should_be_first_launch?/0","type":"function"},{"doc":"","ref":"Plausible.Repo.html","title":"Plausible.Repo","type":"module"},{"doc":"Callback implementation for Ecto.Repo.aggregate/3 .","ref":"Plausible.Repo.html#aggregate/3","title":"Plausible.Repo.aggregate/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.aggregate/4 .","ref":"Plausible.Repo.html#aggregate/4","title":"Plausible.Repo.aggregate/4","type":"function"},{"doc":"Callback implementation for Ecto.Repo.all/2 .","ref":"Plausible.Repo.html#all/2","title":"Plausible.Repo.all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checked_out?/0 .","ref":"Plausible.Repo.html#checked_out?/0","title":"Plausible.Repo.checked_out?/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checkout/2 .","ref":"Plausible.Repo.html#checkout/2","title":"Plausible.Repo.checkout/2","type":"function"},{"doc":"","ref":"Plausible.Repo.html#child_spec/1","title":"Plausible.Repo.child_spec/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.config/0 .","ref":"Plausible.Repo.html#config/0","title":"Plausible.Repo.config/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.default_options/1 .","ref":"Plausible.Repo.html#default_options/1","title":"Plausible.Repo.default_options/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete/2 .","ref":"Plausible.Repo.html#delete/2","title":"Plausible.Repo.delete/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete!/2 .","ref":"Plausible.Repo.html#delete!/2","title":"Plausible.Repo.delete!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete_all/2 .","ref":"Plausible.Repo.html#delete_all/2","title":"Plausible.Repo.delete_all/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that forces all connections in the pool to disconnect within the given interval. See Ecto.Adapters.SQL.disconnect_all/3 for more information.","ref":"Plausible.Repo.html#disconnect_all/2","title":"Plausible.Repo.disconnect_all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.exists?/2 .","ref":"Plausible.Repo.html#exists?/2","title":"Plausible.Repo.exists?/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes an EXPLAIN statement or similar depending on the adapter to obtain statistics for the given query. See Ecto.Adapters.SQL.explain/4 for more information.","ref":"Plausible.Repo.html#explain/3","title":"Plausible.Repo.explain/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get/3 .","ref":"Plausible.Repo.html#get/3","title":"Plausible.Repo.get/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get!/3 .","ref":"Plausible.Repo.html#get!/3","title":"Plausible.Repo.get!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by/3 .","ref":"Plausible.Repo.html#get_by/3","title":"Plausible.Repo.get_by/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by!/3 .","ref":"Plausible.Repo.html#get_by!/3","title":"Plausible.Repo.get_by!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_dynamic_repo/0 .","ref":"Plausible.Repo.html#get_dynamic_repo/0","title":"Plausible.Repo.get_dynamic_repo/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.in_transaction?/0 .","ref":"Plausible.Repo.html#in_transaction?/0","title":"Plausible.Repo.in_transaction?/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert/2 .","ref":"Plausible.Repo.html#insert/2","title":"Plausible.Repo.insert/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert!/2 .","ref":"Plausible.Repo.html#insert!/2","title":"Plausible.Repo.insert!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_all/3 .","ref":"Plausible.Repo.html#insert_all/3","title":"Plausible.Repo.insert_all/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_or_update/2 .","ref":"Plausible.Repo.html#insert_or_update/2","title":"Plausible.Repo.insert_or_update/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_or_update!/2 .","ref":"Plausible.Repo.html#insert_or_update!/2","title":"Plausible.Repo.insert_or_update!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.load/2 .","ref":"Plausible.Repo.html#load/2","title":"Plausible.Repo.load/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one/2 .","ref":"Plausible.Repo.html#one/2","title":"Plausible.Repo.one/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one!/2 .","ref":"Plausible.Repo.html#one!/2","title":"Plausible.Repo.one!/2","type":"function"},{"doc":"","ref":"Plausible.Repo.html#paginate/3","title":"Plausible.Repo.paginate/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.preload/3 .","ref":"Plausible.Repo.html#preload/3","title":"Plausible.Repo.preload/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.prepare_query/3 .","ref":"Plausible.Repo.html#prepare_query/3","title":"Plausible.Repo.prepare_query/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.put_dynamic_repo/1 .","ref":"Plausible.Repo.html#put_dynamic_repo/1","title":"Plausible.Repo.put_dynamic_repo/1","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query/4 for more information.","ref":"Plausible.Repo.html#query/3","title":"Plausible.Repo.query/3","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query!/4 for more information.","ref":"Plausible.Repo.html#query!/3","title":"Plausible.Repo.query!/3","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given multi-result query. See Ecto.Adapters.SQL.query_many/4 for more information.","ref":"Plausible.Repo.html#query_many/3","title":"Plausible.Repo.query_many/3","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given multi-result query. See Ecto.Adapters.SQL.query_many!/4 for more information.","ref":"Plausible.Repo.html#query_many!/3","title":"Plausible.Repo.query_many!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload/2 .","ref":"Plausible.Repo.html#reload/2","title":"Plausible.Repo.reload/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload!/2 .","ref":"Plausible.Repo.html#reload!/2","title":"Plausible.Repo.reload!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.rollback/1 .","ref":"Plausible.Repo.html#rollback/1","title":"Plausible.Repo.rollback/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.start_link/1 .","ref":"Plausible.Repo.html#start_link/1","title":"Plausible.Repo.start_link/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stop/1 .","ref":"Plausible.Repo.html#stop/1","title":"Plausible.Repo.stop/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stream/2 .","ref":"Plausible.Repo.html#stream/2","title":"Plausible.Repo.stream/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that translates the given query to SQL. See Ecto.Adapters.SQL.to_sql/3 for more information.","ref":"Plausible.Repo.html#to_sql/2","title":"Plausible.Repo.to_sql/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.transaction/2 .","ref":"Plausible.Repo.html#transaction/2","title":"Plausible.Repo.transaction/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update/2 .","ref":"Plausible.Repo.html#update/2","title":"Plausible.Repo.update/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update!/2 .","ref":"Plausible.Repo.html#update!/2","title":"Plausible.Repo.update!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update_all/3 .","ref":"Plausible.Repo.html#update_all/3","title":"Plausible.Repo.update_all/3","type":"function"},{"doc":"","ref":"Plausible.Sentry.Client.html","title":"Plausible.Sentry.Client","type":"module"},{"doc":"The Sentry.HTTPClient behaviour requires a child spec to be supplied. In this case we don't want Sentry to manage our Finch instances, hence it's fed with a dummy module for the sake of the contract. XXX: Submit a Sentry PR making the child spec callback optional.","ref":"Plausible.Sentry.Client.html#child_spec/0","title":"Plausible.Sentry.Client.child_spec/0","type":"function"},{"doc":"Callback implementation for Sentry.HTTPClient.post/3 .","ref":"Plausible.Sentry.Client.html#post/3","title":"Plausible.Sentry.Client.post/3","type":"function"},{"doc":"Sentry callbacks for filtering and grouping events","ref":"Plausible.SentryFilter.html","title":"Plausible.SentryFilter","type":"module"},{"doc":"","ref":"Plausible.SentryFilter.html#before_send/1","title":"Plausible.SentryFilter.before_send/1","type":"function"},{"doc":"Callback implementation for Sentry.EventFilter.exclude_exception?/2 .","ref":"Plausible.SentryFilter.html#exclude_exception?/2","title":"Plausible.SentryFilter.exclude_exception?/2","type":"function"},{"doc":"","ref":"Plausible.Session.CacheStore.html","title":"Plausible.Session.CacheStore","type":"module"},{"doc":"","ref":"Plausible.Session.CacheStore.html#on_event/3","title":"Plausible.Session.CacheStore.on_event/3","type":"function"},{"doc":"","ref":"Plausible.Session.Salts.html","title":"Plausible.Session.Salts","type":"module"},{"doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Plausible.Session.Salts.html#child_spec/1","title":"Plausible.Session.Salts.child_spec/1","type":"function"},{"doc":"","ref":"Plausible.Session.Salts.html#fetch/0","title":"Plausible.Session.Salts.fetch/0","type":"function"},{"doc":"","ref":"Plausible.Session.Salts.html#rotate/0","title":"Plausible.Session.Salts.rotate/0","type":"function"},{"doc":"","ref":"Plausible.Session.Salts.html#start_link/1","title":"Plausible.Session.Salts.start_link/1","type":"function"},{"doc":"","ref":"Plausible.Session.WriteBuffer.html","title":"Plausible.Session.WriteBuffer","type":"module"},{"doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Plausible.Session.WriteBuffer.html#child_spec/1","title":"Plausible.Session.WriteBuffer.child_spec/1","type":"function"},{"doc":"","ref":"Plausible.Session.WriteBuffer.html#flush/0","title":"Plausible.Session.WriteBuffer.flush/0","type":"function"},{"doc":"Callback implementation for GenServer.init/1 .","ref":"Plausible.Session.WriteBuffer.html#init/1","title":"Plausible.Session.WriteBuffer.init/1","type":"function"},{"doc":"","ref":"Plausible.Session.WriteBuffer.html#insert/1","title":"Plausible.Session.WriteBuffer.insert/1","type":"function"},{"doc":"","ref":"Plausible.Session.WriteBuffer.html#start_link/1","title":"Plausible.Session.WriteBuffer.start_link/1","type":"function"},{"doc":"Site schema","ref":"Plausible.Site.html","title":"Plausible.Site","type":"module"},{"doc":"","ref":"Plausible.Site.html#changeset/2","title":"Plausible.Site.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Site.html#crm_changeset/2","title":"Plausible.Site.crm_changeset/2","type":"function"},{"doc":"","ref":"Plausible.Site.html#feature_toggle_change/3","title":"Plausible.Site.feature_toggle_change/3","type":"function"},{"doc":"","ref":"Plausible.Site.html#import_failure/1","title":"Plausible.Site.import_failure/1","type":"function"},{"doc":"","ref":"Plausible.Site.html#import_success/1","title":"Plausible.Site.import_success/1","type":"function"},{"doc":"Returns the date of the first recorded stat in the timezone configured by the user. This function does 2 transformations: UTC %NaiveDateTime{} -> Local %DateTime{} -> Local %Date Examples iex> Plausible.Site.local_start_date(%Plausible.Site{stats_start_date: nil}) nil iex> utc_start = ~N[2022-09-28 00:00:00] iex> tz = "Europe/Helsinki" iex> site = %Plausible.Site{stats_start_date: utc_start, timezone: tz} iex> Plausible.Site.local_start_date(site) ~D[2022-09-28] iex> utc_start = ~N[2022-09-28 00:00:00] iex> tz = "America/Los_Angeles" iex> site = %Plausible.Site{stats_start_date: utc_start, timezone: tz} iex> Plausible.Site.local_start_date(site) ~D[2022-09-27]","ref":"Plausible.Site.html#local_start_date/1","title":"Plausible.Site.local_start_date/1","type":"function"},{"doc":"","ref":"Plausible.Site.html#make_private/1","title":"Plausible.Site.make_private/1","type":"function"},{"doc":"","ref":"Plausible.Site.html#make_public/1","title":"Plausible.Site.make_public/1","type":"function"},{"doc":"","ref":"Plausible.Site.html#remove_imported_data/1","title":"Plausible.Site.remove_imported_data/1","type":"function"},{"doc":"","ref":"Plausible.Site.html#set_allowed_event_props/2","title":"Plausible.Site.set_allowed_event_props/2","type":"function"},{"doc":"","ref":"Plausible.Site.html#set_imported_source/2","title":"Plausible.Site.set_imported_source/2","type":"function"},{"doc":"","ref":"Plausible.Site.html#set_native_stats_start_at/2","title":"Plausible.Site.set_native_stats_start_at/2","type":"function"},{"doc":"","ref":"Plausible.Site.html#set_stats_start_date/2","title":"Plausible.Site.set_stats_start_date/2","type":"function"},{"doc":"","ref":"Plausible.Site.html#start_import/5","title":"Plausible.Site.start_import/5","type":"function"},{"doc":"","ref":"Plausible.Site.html#tz_offset/2","title":"Plausible.Site.tz_offset/2","type":"function"},{"doc":"","ref":"Plausible.Site.html#update_changeset/3","title":"Plausible.Site.update_changeset/3","type":"function"},{"doc":"","ref":"Plausible.Site.html#t:t/0","title":"Plausible.Site.t/0","type":"type"},{"doc":"A "sites by domain" caching interface. Serves as a thin wrapper around Cachex, but the underlying implementation can be transparently swapped. Even though the Cachex process is started, cache access is disabled during tests via the :sites_by_domain_cache_enabled application env key. This can be overridden on case by case basis, using the child specs options. NOTE: the cache allows lookups by both domain and domain_changed_from fields - this is to allow traffic from sites whose domains changed within a certain grace period (see: Plausible.Site.Transfer ). When Cache is disabled via application env, the get/1 function falls back to pure database lookups. This should help with introducing cached lookups in existing code, so that no existing tests should break. To differentiate cached Site structs from those retrieved directly from the database, a virtual schema field from_cache?: true is set. This indicates the Plausible.Site struct is incomplete in comparison to its database counterpart -- to spare bandwidth and query execution time, only selected database columns are retrieved and cached. There are two modes of refreshing the cache: :all and :updated_recently . :all means querying the database for all Site entries and should be done periodically (via Cache.Warmer ). All stale Cache entries are cleared upon persisting the new batch. :updated_recently attempts to re-query sites updated within the last 15 minutes only, to account for most recent changes. This refresh is lighter on the database and is meant to be executed more frequently (via Cache.Warmer.RecentlyUpdated ). Refreshing the cache emits telemetry event defined as per telemetry_event_refresh/2 . The @cached_schema_fields attribute defines the list of DB columns queried on each cache refresh. Also see tests for more comprehensive examples.","ref":"Plausible.Site.Cache.html","title":"Plausible.Site.Cache","type":"module"},{"doc":"","ref":"Plausible.Site.Cache.html#child_spec/1","title":"Plausible.Site.Cache.child_spec/1","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.html#enabled?/0","title":"Plausible.Site.Cache.enabled?/0","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.html#get/2","title":"Plausible.Site.Cache.get/2","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.html#get_site_id/2","title":"Plausible.Site.Cache.get_site_id/2","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.html#hit_rate/1","title":"Plausible.Site.Cache.hit_rate/1","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.html#merge/2","title":"Plausible.Site.Cache.merge/2","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.html#name/0","title":"Plausible.Site.Cache.name/0","type":"function"},{"doc":"Ensures the cache has non-zero size unless no sites exist. Useful for orchestrating app startup to prevent the service going up asynchronously with an empty cache.","ref":"Plausible.Site.Cache.html#ready?/1","title":"Plausible.Site.Cache.ready?/1","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.html#refresh_all/1","title":"Plausible.Site.Cache.refresh_all/1","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.html#refresh_updated_recently/1","title":"Plausible.Site.Cache.refresh_updated_recently/1","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.html#size/1","title":"Plausible.Site.Cache.size/1","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.html#telemetry_event_refresh/2","title":"Plausible.Site.Cache.telemetry_event_refresh/2","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.html#t:t/0","title":"Plausible.Site.Cache.t/0","type":"type"},{"doc":"A periodic cache warmer. Queries all Sites from Postgres, every interval and pre-populates the cache. After each run the process is hibernated, triggering garbage collection. Currently Cachex is used, but the underlying implementation can be transparently swapped. Child specification options available: interval - the number of milliseconds for each warm-up cycle, defaults to :sites_by_domain_cache_refresh_interval application env value with random jitter added, for which the maximum is stored under :sites_by_domain_cache_refresh_interval_max_jitter key. cache_name - defaults to Cache.name() but can be overriden for testing force_start? - enforcess process startup for testing, even if it's barred by Cache.enabled? . This is useful for avoiding issues with DB ownership and async tests. warmer_fn - used for testing, a custom function to retrieve the items meant to be cached during the warm-up cycle. See tests for more comprehensive examples.","ref":"Plausible.Site.Cache.Warmer.html","title":"Plausible.Site.Cache.Warmer","type":"module"},{"doc":"","ref":"Plausible.Site.Cache.Warmer.html#child_spec/1","title":"Plausible.Site.Cache.Warmer.child_spec/1","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.Warmer.html#interval/0","title":"Plausible.Site.Cache.Warmer.interval/0","type":"function"},{"doc":"A Cache.Warmer adapter that refreshes the Sites Cache fully. This module exists only to make it explicit what the warmer refreshes, to be used in the supervisor tree.","ref":"Plausible.Site.Cache.Warmer.All.html","title":"Plausible.Site.Cache.Warmer.All","type":"module"},{"doc":"See Plausible.Site.Cache.Warmer.child_spec/1 .","ref":"Plausible.Site.Cache.Warmer.All.html#child_spec/1","title":"Plausible.Site.Cache.Warmer.All.child_spec/1","type":"function"},{"doc":"A Cache.Warmer adapter that only refreshes the Cache with recently updated sites every 30 seconds.","ref":"Plausible.Site.Cache.Warmer.RecentlyUpdated.html","title":"Plausible.Site.Cache.Warmer.RecentlyUpdated","type":"module"},{"doc":"","ref":"Plausible.Site.Cache.Warmer.RecentlyUpdated.html#child_spec/1","title":"Plausible.Site.Cache.Warmer.RecentlyUpdated.child_spec/1","type":"function"},{"doc":"","ref":"Plausible.Site.CustomDomain.html","title":"Plausible.Site.CustomDomain","type":"module"},{"doc":"Basic interface for domain changes. Once Plausible.DataMigration.NumericIDs schema migration is ready, domain change operation will be enabled, accessible to the users. We will set a transition period of 72 hours during which, both old and new domains, will be accepted as traffic identifiers to the same site. A periodic worker will call the expire/0 function to end it where applicable. See: Plausible.Workers.ExpireDomainChangeTransitions . The underlying changeset for domain change (see: Plausible.Site ) relies on database trigger installed via Plausible.Repo.Migrations.AllowDomainChange Postgres migration. The trigger checks if either domain or domain_changed_from exist to ensure unicity.","ref":"Plausible.Site.Domain.html","title":"Plausible.Site.Domain","type":"module"},{"doc":"","ref":"Plausible.Site.Domain.html#change/3","title":"Plausible.Site.Domain.change/3","type":"function"},{"doc":"","ref":"Plausible.Site.Domain.html#expire_change_transitions/1","title":"Plausible.Site.Domain.expire_change_transitions/1","type":"function"},{"doc":"Thin wrapper around Hammer for gate keeping domain-specific events during the ingestion phase. When the site is allowed, gate keeping check returns :allow , otherwise a :deny tagged tuple is returned with one of the following policy markers: :not_found (indicates site not found in cache) :block (indicates disabled sites) :throttle (indicates rate limiting) Rate Limiting buckets are configured per site (externally via the CRM). See: Plausible.Site To look up each site's configuration, the RateLimiter fetches a Site by domain using Plausible.Cache interface. The module defines two policies outside the regular bucket inspection: when the the site is not found in cache: not_found when the underlying rate limiting mechanism returns an internal error: :allow","ref":"Plausible.Site.GateKeeper.html","title":"Plausible.Site.GateKeeper","type":"module"},{"doc":"","ref":"Plausible.Site.GateKeeper.html#check/2","title":"Plausible.Site.GateKeeper.check/2","type":"function"},{"doc":"","ref":"Plausible.Site.GateKeeper.html#key/1","title":"Plausible.Site.GateKeeper.key/1","type":"function"},{"doc":"","ref":"Plausible.Site.GateKeeper.html#t:policy/0","title":"Plausible.Site.GateKeeper.policy/0","type":"type"},{"doc":"","ref":"Plausible.Site.GateKeeper.html#t:t/0","title":"Plausible.Site.GateKeeper.t/0","type":"type"},{"doc":"","ref":"Plausible.Site.GoogleAuth.html","title":"Plausible.Site.GoogleAuth","type":"module"},{"doc":"","ref":"Plausible.Site.GoogleAuth.html#changeset/2","title":"Plausible.Site.GoogleAuth.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Site.GoogleAuth.html#set_property/2","title":"Plausible.Site.GoogleAuth.set_property/2","type":"function"},{"doc":"Embedded schema for Google Analytics imports","ref":"Plausible.Site.ImportedData.html","title":"Plausible.Site.ImportedData","type":"module"},{"doc":"","ref":"Plausible.Site.Membership.html","title":"Plausible.Site.Membership","type":"module"},{"doc":"","ref":"Plausible.Site.Membership.html#changeset/2","title":"Plausible.Site.Membership.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Site.MonthlyReport.html","title":"Plausible.Site.MonthlyReport","type":"module"},{"doc":"","ref":"Plausible.Site.MonthlyReport.html#add_recipient/2","title":"Plausible.Site.MonthlyReport.add_recipient/2","type":"function"},{"doc":"","ref":"Plausible.Site.MonthlyReport.html#changeset/2","title":"Plausible.Site.MonthlyReport.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Site.MonthlyReport.html#remove_recipient/2","title":"Plausible.Site.MonthlyReport.remove_recipient/2","type":"function"},{"doc":"A site deletion service stub.","ref":"Plausible.Site.Removal.html","title":"Plausible.Site.Removal","type":"module"},{"doc":"","ref":"Plausible.Site.Removal.html#run/1","title":"Plausible.Site.Removal.run/1","type":"function"},{"doc":"","ref":"Plausible.Site.SharedLink.html","title":"Plausible.Site.SharedLink","type":"module"},{"doc":"","ref":"Plausible.Site.SharedLink.html#changeset/2","title":"Plausible.Site.SharedLink.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Site.SpikeNotification.html","title":"Plausible.Site.SpikeNotification","type":"module"},{"doc":"","ref":"Plausible.Site.SpikeNotification.html#add_recipient/2","title":"Plausible.Site.SpikeNotification.add_recipient/2","type":"function"},{"doc":"","ref":"Plausible.Site.SpikeNotification.html#changeset/2","title":"Plausible.Site.SpikeNotification.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Site.SpikeNotification.html#remove_recipient/2","title":"Plausible.Site.SpikeNotification.remove_recipient/2","type":"function"},{"doc":"","ref":"Plausible.Site.SpikeNotification.html#was_sent/1","title":"Plausible.Site.SpikeNotification.was_sent/1","type":"function"},{"doc":"","ref":"Plausible.Site.WeeklyReport.html","title":"Plausible.Site.WeeklyReport","type":"module"},{"doc":"","ref":"Plausible.Site.WeeklyReport.html#add_recipient/2","title":"Plausible.Site.WeeklyReport.add_recipient/2","type":"function"},{"doc":"","ref":"Plausible.Site.WeeklyReport.html#changeset/2","title":"Plausible.Site.WeeklyReport.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Site.WeeklyReport.html#remove_recipient/2","title":"Plausible.Site.WeeklyReport.remove_recipient/2","type":"function"},{"doc":"","ref":"Plausible.SiteAdmin.html","title":"Plausible.SiteAdmin","type":"module"},{"doc":"","ref":"Plausible.SiteAdmin.html#create_changeset/2","title":"Plausible.SiteAdmin.create_changeset/2","type":"function"},{"doc":"","ref":"Plausible.SiteAdmin.html#custom_index_query/3","title":"Plausible.SiteAdmin.custom_index_query/3","type":"function"},{"doc":"","ref":"Plausible.SiteAdmin.html#form_fields/1","title":"Plausible.SiteAdmin.form_fields/1","type":"function"},{"doc":"","ref":"Plausible.SiteAdmin.html#get_struct_fields/1","title":"Plausible.SiteAdmin.get_struct_fields/1","type":"function"},{"doc":"","ref":"Plausible.SiteAdmin.html#index/1","title":"Plausible.SiteAdmin.index/1","type":"function"},{"doc":"","ref":"Plausible.SiteAdmin.html#list_actions/1","title":"Plausible.SiteAdmin.list_actions/1","type":"function"},{"doc":"","ref":"Plausible.SiteAdmin.html#ordering/1","title":"Plausible.SiteAdmin.ordering/1","type":"function"},{"doc":"","ref":"Plausible.SiteAdmin.html#search_fields/1","title":"Plausible.SiteAdmin.search_fields/1","type":"function"},{"doc":"","ref":"Plausible.SiteAdmin.html#set_allowed_props_for_site/3","title":"Plausible.SiteAdmin.set_allowed_props_for_site/3","type":"function"},{"doc":"","ref":"Plausible.SiteAdmin.html#update_changeset/2","title":"Plausible.SiteAdmin.update_changeset/2","type":"function"},{"doc":"","ref":"Plausible.Sites.html","title":"Plausible.Sites","type":"module"},{"doc":"","ref":"Plausible.Sites.html#create/2","title":"Plausible.Sites.create/2","type":"function"},{"doc":"","ref":"Plausible.Sites.html#create_shared_link/3","title":"Plausible.Sites.create_shared_link/3","type":"function"},{"doc":"","ref":"Plausible.Sites.html#get_by_domain/1","title":"Plausible.Sites.get_by_domain/1","type":"function"},{"doc":"","ref":"Plausible.Sites.html#get_for_user/3","title":"Plausible.Sites.get_for_user/3","type":"function"},{"doc":"","ref":"Plausible.Sites.html#get_for_user!/3","title":"Plausible.Sites.get_for_user!/3","type":"function"},{"doc":"","ref":"Plausible.Sites.html#has_admin_access?/2","title":"Plausible.Sites.has_admin_access?/2","type":"function"},{"doc":"","ref":"Plausible.Sites.html#has_goals?/1","title":"Plausible.Sites.has_goals?/1","type":"function"},{"doc":"","ref":"Plausible.Sites.html#has_stats?/1","title":"Plausible.Sites.has_stats?/1","type":"function"},{"doc":"","ref":"Plausible.Sites.html#is_member?/2","title":"Plausible.Sites.is_member?/2","type":"function"},{"doc":"","ref":"Plausible.Sites.html#locked?/1","title":"Plausible.Sites.locked?/1","type":"function"},{"doc":"","ref":"Plausible.Sites.html#owned_site_ids/1","title":"Plausible.Sites.owned_site_ids/1","type":"function"},{"doc":"","ref":"Plausible.Sites.html#owned_sites_count/1","title":"Plausible.Sites.owned_sites_count/1","type":"function"},{"doc":"","ref":"Plausible.Sites.html#owned_sites_domains/1","title":"Plausible.Sites.owned_sites_domains/1","type":"function"},{"doc":"","ref":"Plausible.Sites.html#owner_for/1","title":"Plausible.Sites.owner_for/1","type":"function"},{"doc":"","ref":"Plausible.Sites.html#role/2","title":"Plausible.Sites.role/2","type":"function"},{"doc":"","ref":"Plausible.Sites.html#shared_link_url/2","title":"Plausible.Sites.shared_link_url/2","type":"function"},{"doc":"Returns the date of the first event of the given site, or nil if the site does not have stats yet. If this is the first time the function is called for the site, it queries Clickhouse and saves the date in the sites table.","ref":"Plausible.Sites.html#stats_start_date/1","title":"Plausible.Sites.stats_start_date/1","type":"function"},{"doc":"","ref":"Plausible.Stats.html","title":"Plausible.Stats","type":"module"},{"doc":"See Plausible.Stats.Aggregate.aggregate/3 .","ref":"Plausible.Stats.html#aggregate/3","title":"Plausible.Stats.aggregate/3","type":"function"},{"doc":"See Plausible.Stats.Breakdown.breakdown/5 .","ref":"Plausible.Stats.html#breakdown/5","title":"Plausible.Stats.breakdown/5","type":"function"},{"doc":"See Plausible.Stats.CurrentVisitors.current_visitors/1 .","ref":"Plausible.Stats.html#current_visitors/1","title":"Plausible.Stats.current_visitors/1","type":"function"},{"doc":"See Plausible.Stats.FilterSuggestions.filter_suggestions/4 .","ref":"Plausible.Stats.html#filter_suggestions/4","title":"Plausible.Stats.filter_suggestions/4","type":"function"},{"doc":"See Plausible.Stats.Funnel.funnel/3 .","ref":"Plausible.Stats.html#funnel/3","title":"Plausible.Stats.funnel/3","type":"function"},{"doc":"See Plausible.Stats.Timeseries.timeseries/3 .","ref":"Plausible.Stats.html#timeseries/3","title":"Plausible.Stats.timeseries/3","type":"function"},{"doc":"","ref":"Plausible.Stats.Aggregate.html","title":"Plausible.Stats.Aggregate","type":"module"},{"doc":"","ref":"Plausible.Stats.Aggregate.html#aggregate/3","title":"Plausible.Stats.Aggregate.aggregate/3","type":"function"},{"doc":"","ref":"Plausible.Stats.Base.html","title":"Plausible.Stats.Base","type":"module"},{"doc":"","ref":"Plausible.Stats.Base.html#apply_entry_prop_filter/3","title":"Plausible.Stats.Base.apply_entry_prop_filter/3","type":"function"},{"doc":"","ref":"Plausible.Stats.Base.html#base_event_query/2","title":"Plausible.Stats.Base.base_event_query/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Base.html#filter_by_entry_props/2","title":"Plausible.Stats.Base.filter_by_entry_props/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Base.html#filter_converted_sessions/3","title":"Plausible.Stats.Base.filter_converted_sessions/3","type":"function"},{"doc":"","ref":"Plausible.Stats.Base.html#page_regex/1","title":"Plausible.Stats.Base.page_regex/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Base.html#query_events/2","title":"Plausible.Stats.Base.query_events/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Base.html#query_sessions/2","title":"Plausible.Stats.Base.query_sessions/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Base.html#select_event_metrics/2","title":"Plausible.Stats.Base.select_event_metrics/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Base.html#select_session_metrics/3","title":"Plausible.Stats.Base.select_session_metrics/3","type":"function"},{"doc":"","ref":"Plausible.Stats.Base.html#utc_boundaries/2","title":"Plausible.Stats.Base.utc_boundaries/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Breakdown.html","title":"Plausible.Stats.Breakdown","type":"module"},{"doc":"","ref":"Plausible.Stats.Breakdown.html#breakdown/5","title":"Plausible.Stats.Breakdown.breakdown/5","type":"function"},{"doc":"","ref":"Plausible.Stats.Clickhouse.html","title":"Plausible.Stats.Clickhouse","type":"module"},{"doc":"","ref":"Plausible.Stats.Clickhouse.html#current_visitors/2","title":"Plausible.Stats.Clickhouse.current_visitors/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Clickhouse.html#has_pageviews?/1","title":"Plausible.Stats.Clickhouse.has_pageviews?/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Clickhouse.html#imported_pageview_count/1","title":"Plausible.Stats.Clickhouse.imported_pageview_count/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Clickhouse.html#last_24h_visitors/1","title":"Plausible.Stats.Clickhouse.last_24h_visitors/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Clickhouse.html#pageview_start_date_local/1","title":"Plausible.Stats.Clickhouse.pageview_start_date_local/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Clickhouse.html#top_sources/6","title":"Plausible.Stats.Clickhouse.top_sources/6","type":"function"},{"doc":"","ref":"Plausible.Stats.Clickhouse.html#usage_breakdown/1","title":"Plausible.Stats.Clickhouse.usage_breakdown/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Clickhouse.html#usage_breakdown/2","title":"Plausible.Stats.Clickhouse.usage_breakdown/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Compare.html","title":"Plausible.Stats.Compare","type":"module"},{"doc":"","ref":"Plausible.Stats.Compare.html#calculate_change/3","title":"Plausible.Stats.Compare.calculate_change/3","type":"function"},{"doc":"This module provides functions for comparing query periods. It allows you to compare a given period with a previous period or with the same period from the previous year. For example, you can compare this month's main graph with last month or with the same month from last year.","ref":"Plausible.Stats.Comparisons.html","title":"Plausible.Stats.Comparisons","type":"module"},{"doc":"Generates a comparison query based on the source query and comparison mode. The mode parameter specifies the type of comparison and can be one of the following: "previous_period" - shifts back the query by the same number of days the source query has. "year_over_year" - shifts back the query by 1 year. "custom" - compares the query using a custom date range. See options for more details. The comparison query returned by the function has its end date restricted to the current day. This can be overriden by the now option, described below. Options :now - a NaiveDateTime struct with the current date and time. This is optional and used for testing purposes. :from - a ISO-8601 date string used when mode is "custom" . :to - a ISO-8601 date string used when mode is "custom" . Must be after from . :match_day_of_week? - determines whether the comparison query should be adjusted to match the day of the week of the source query. When this option is set to true, the comparison query is shifted to start on the same day of the week as the source query, rather than on the exact same date. For example, if the source query starts on Sunday, January 1st, 2023 and the year_over_year comparison query is configured to match_day_of_week? , it will be shifted to start on Sunday, January 2nd, 2022 instead of January 1st. Defaults to false.","ref":"Plausible.Stats.Comparisons.html#compare/4","title":"Plausible.Stats.Comparisons.compare/4","type":"function"},{"doc":"","ref":"Plausible.Stats.Comparisons.html#t:mode/0","title":"Plausible.Stats.Comparisons.mode/0","type":"type"},{"doc":"","ref":"Plausible.Stats.CurrentVisitors.html","title":"Plausible.Stats.CurrentVisitors","type":"module"},{"doc":"","ref":"Plausible.Stats.CurrentVisitors.html#current_visitors/1","title":"Plausible.Stats.CurrentVisitors.current_visitors/1","type":"function"},{"doc":"Module for querying user defined 'custom properties'.","ref":"Plausible.Stats.CustomProps.html","title":"Plausible.Stats.CustomProps","type":"module"},{"doc":"","ref":"Plausible.Stats.CustomProps.html#maybe_allowed_props_only/2","title":"Plausible.Stats.CustomProps.maybe_allowed_props_only/2","type":"function"},{"doc":"Returns a breakdown of event names with all existing custom properties for each event name.","ref":"Plausible.Stats.CustomProps.html#props_for_all_event_names/2","title":"Plausible.Stats.CustomProps.props_for_all_event_names/2","type":"function"},{"doc":"Expects a single goal filter in the query. Returns a list of custom props for that goal. Works for both custom event and pageview goals.","ref":"Plausible.Stats.CustomProps.html#props_for_goal/2","title":"Plausible.Stats.CustomProps.props_for_goal/2","type":"function"},{"doc":"A module for parsing filters used in stat queries.","ref":"Plausible.Stats.FilterParser.html","title":"Plausible.Stats.FilterParser","type":"module"},{"doc":"Parses different filter formats. Depending on the format and type of the filters argument, returns: a decoded map, when filters is encoded JSON a parsed filter map, when filters is a filter expression string the same map, when filters is a map Returns an empty map when argument type is unexpected (e.g. nil ). Examples: iex> FilterParser . parse_filters ( "{ \\" page \\" : \\" /blog/** \\" }" ) %{ "page" => "/blog/**" } iex> FilterParser . parse_filters ( "visit:browser!=Chrome" ) %{ "visit:browser" => { :is_not , "Chrome" } } iex> FilterParser . parse_filters ( nil ) %{ }","ref":"Plausible.Stats.FilterParser.html#parse_filters/1","title":"Plausible.Stats.FilterParser.parse_filters/1","type":"function"},{"doc":"","ref":"Plausible.Stats.FilterSuggestions.html","title":"Plausible.Stats.FilterSuggestions","type":"module"},{"doc":"","ref":"Plausible.Stats.FilterSuggestions.html#filter_suggestions/4","title":"Plausible.Stats.FilterSuggestions.filter_suggestions/4","type":"function"},{"doc":"","ref":"Plausible.Stats.Filters.html","title":"Plausible.Stats.Filters","type":"module"},{"doc":"","ref":"Plausible.Stats.Filters.html#add_prefix/1","title":"Plausible.Stats.Filters.add_prefix/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Filters.html#visit_props/0","title":"Plausible.Stats.Filters.visit_props/0","type":"function"},{"doc":"","ref":"Plausible.Stats.Fragments.html","title":"Plausible.Stats.Fragments","type":"module"},{"doc":"","ref":"Plausible.Stats.Fragments.html#bounce_rate/0","title":"Plausible.Stats.Fragments.bounce_rate/0","type":"macro"},{"doc":"","ref":"Plausible.Stats.Fragments.html#coalesce_string/2","title":"Plausible.Stats.Fragments.coalesce_string/2","type":"macro"},{"doc":"","ref":"Plausible.Stats.Fragments.html#sample_percent/0","title":"Plausible.Stats.Fragments.sample_percent/0","type":"macro"},{"doc":"Converts time or date and time to the specified timezone. Reference: https://clickhouse.com/docs/en/sql-reference/functions/date-time-functions/#totimezone","ref":"Plausible.Stats.Fragments.html#to_timezone/2","title":"Plausible.Stats.Fragments.to_timezone/2","type":"macro"},{"doc":"","ref":"Plausible.Stats.Fragments.html#total/0","title":"Plausible.Stats.Fragments.total/0","type":"macro"},{"doc":"","ref":"Plausible.Stats.Fragments.html#uniq/1","title":"Plausible.Stats.Fragments.uniq/1","type":"macro"},{"doc":"","ref":"Plausible.Stats.Fragments.html#visit_duration/0","title":"Plausible.Stats.Fragments.visit_duration/0","type":"macro"},{"doc":"Returns the weekstart for date . If the weekstart is before the not_before boundary, not_before is returned. Examples In this pseudo-code example, the fragment returns the weekstart. The not_before boundary is set to the past Saturday, which is before the weekstart, therefore the cap does not apply. iex> this_wednesday = ~D[2022-11-09] ...> past_saturday = ~D[2022-11-05] ...> weekstart_not_before(this_wednesday, past_saturday) ~D[2022-11-07] In this other example, the fragment returns Tuesday and not the weekstart. The not_before boundary is set to Tuesday, which is past the weekstart, therefore the cap applies. iex> this_wednesday = ~D[2022-11-09] ...> this_tuesday = ~D[2022-11-08] ...> weekstart_not_before(this_wednesday, this_tuesday) ~D[2022-11-08]","ref":"Plausible.Stats.Fragments.html#weekstart_not_before/2","title":"Plausible.Stats.Fragments.weekstart_not_before/2","type":"macro"},{"doc":"Same as Plausible.Stats.Fragments.weekstart_not_before/2 but converts dates to the specified timezone.","ref":"Plausible.Stats.Fragments.html#weekstart_not_before/3","title":"Plausible.Stats.Fragments.weekstart_not_before/3","type":"macro"},{"doc":"Module responsible for funnel evaluation, i.e. building and executing ClickHouse funnel query based on Plausible.Funnel definition.","ref":"Plausible.Stats.Funnel.html","title":"Plausible.Stats.Funnel","type":"module"},{"doc":"","ref":"Plausible.Stats.Funnel.html#funnel/3","title":"Plausible.Stats.Funnel.funnel/3","type":"function"},{"doc":"","ref":"Plausible.Stats.Imported.html","title":"Plausible.Stats.Imported","type":"module"},{"doc":"","ref":"Plausible.Stats.Imported.html#merge_imported/5","title":"Plausible.Stats.Imported.merge_imported/5","type":"function"},{"doc":"","ref":"Plausible.Stats.Imported.html#merge_imported_timeseries/4","title":"Plausible.Stats.Imported.merge_imported_timeseries/4","type":"function"},{"doc":"Collection of functions to work with intervals. The interval of a query defines the granularity of the data. You can think of it as a GROUP BY clause. Possible values are minute , hour , date , week , and month .","ref":"Plausible.Stats.Interval.html","title":"Plausible.Stats.Interval","type":"module"},{"doc":"Returns the suggested interval for the given Date.Range struct. Examples iex> Plausible.Stats.Interval.default_for_date_range(Date.range(~D[2022-01-01], ~D[2023-01-01])) "month" iex> Plausible.Stats.Interval.default_for_date_range(Date.range(~D[2022-01-01], ~D[2022-01-15])) "date" iex> Plausible.Stats.Interval.default_for_date_range(Date.range(~D[2022-01-01], ~D[2022-01-01])) "hour"","ref":"Plausible.Stats.Interval.html#default_for_date_range/1","title":"Plausible.Stats.Interval.default_for_date_range/1","type":"function"},{"doc":"Returns the suggested interval for the given time period. Examples iex> Plausible.Stats.Interval.default_for_period("7d") "date"","ref":"Plausible.Stats.Interval.html#default_for_period/1","title":"Plausible.Stats.Interval.default_for_period/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Interval.html#list/0","title":"Plausible.Stats.Interval.list/0","type":"function"},{"doc":"","ref":"Plausible.Stats.Interval.html#valid?/1","title":"Plausible.Stats.Interval.valid?/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Interval.html#valid_by_period/0","title":"Plausible.Stats.Interval.valid_by_period/0","type":"function"},{"doc":"Returns whether the given interval is valid for a time period. Intervals longer than periods are not supported, e.g. current month stats with a month interval, or today stats with a week interval. Examples iex> Plausible.Stats.Interval.valid_for_period?("month", "date") true iex> Plausible.Stats.Interval.valid_for_period?("30d", "month") false iex> Plausible.Stats.Interval.valid_for_period?("realtime", "week") false","ref":"Plausible.Stats.Interval.html#valid_for_period?/2","title":"Plausible.Stats.Interval.valid_for_period?/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Interval.html#t:t/0","title":"Plausible.Stats.Interval.t/0","type":"type"},{"doc":"","ref":"Plausible.Stats.Props.html","title":"Plausible.Stats.Props","type":"module"},{"doc":"","ref":"Plausible.Stats.Props.html#event_props/0","title":"Plausible.Stats.Props.event_props/0","type":"function"},{"doc":"","ref":"Plausible.Stats.Props.html#valid_prop?/1","title":"Plausible.Stats.Props.valid_prop?/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Query.html","title":"Plausible.Stats.Query","type":"module"},{"doc":"","ref":"Plausible.Stats.Query.html#from/2","title":"Plausible.Stats.Query.from/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Query.html#get_filter_by_prefix/2","title":"Plausible.Stats.Query.get_filter_by_prefix/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Query.html#has_event_filters?/1","title":"Plausible.Stats.Query.has_event_filters?/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Query.html#include_imported?/3","title":"Plausible.Stats.Query.include_imported?/3","type":"function"},{"doc":"","ref":"Plausible.Stats.Query.html#put_filter/3","title":"Plausible.Stats.Query.put_filter/3","type":"function"},{"doc":"","ref":"Plausible.Stats.Query.html#remove_event_filters/2","title":"Plausible.Stats.Query.remove_event_filters/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Query.html#trace/1","title":"Plausible.Stats.Query.trace/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Query.html#t:t/0","title":"Plausible.Stats.Query.t/0","type":"type"},{"doc":"","ref":"Plausible.Stats.Timeseries.html","title":"Plausible.Stats.Timeseries","type":"module"},{"doc":"","ref":"Plausible.Stats.Timeseries.html#timeseries/3","title":"Plausible.Stats.Timeseries.timeseries/3","type":"function"},{"doc":"","ref":"Plausible.Stats.Timeseries.html#t:results/0","title":"Plausible.Stats.Timeseries.results/0","type":"type"},{"doc":"Utilities for modifying stat results","ref":"Plausible.Stats.Util.html","title":"Plausible.Stats.Util","type":"module"},{"doc":"","ref":"Plausible.Stats.Util.html#cast_revenue_metrics_to_money/2","title":"Plausible.Stats.Util.cast_revenue_metrics_to_money/2","type":"function"},{"doc":"Returns the common currency for the goal filters in a query. If there are no goal filters, or multiple currencies, nil is returned and revenue metrics are dropped. Aggregating revenue data works only for same currency goals. If the query is filtered by goals with different currencies, for example, one USD and other EUR, revenue metrics are dropped.","ref":"Plausible.Stats.Util.html#get_revenue_tracking_currency/3","title":"Plausible.Stats.Util.get_revenue_tracking_currency/3","type":"function"},{"doc":"","ref":"Plausible.Stats.Util.html#remove_internal_visits_metric/1","title":"Plausible.Stats.Util.remove_internal_visits_metric/1","type":"function"},{"doc":"__internal_visits is fetched when querying bounce rate and visit duration, as it is needed to calculate these from imported data. This function removes that metric from all entries in the results list.","ref":"Plausible.Stats.Util.html#remove_internal_visits_metric/2","title":"Plausible.Stats.Util.remove_internal_visits_metric/2","type":"function"},{"doc":"Floki wrappers to help make assertions about HTML/DOM structures","ref":"Plausible.Test.Support.HTML.html","title":"Plausible.Test.Support.HTML","type":"module"},{"doc":"","ref":"Plausible.Test.Support.HTML.html#element_exists?/2","title":"Plausible.Test.Support.HTML.element_exists?/2","type":"function"},{"doc":"","ref":"Plausible.Test.Support.HTML.html#find/2","title":"Plausible.Test.Support.HTML.find/2","type":"function"},{"doc":"","ref":"Plausible.Test.Support.HTML.html#form_exists?/2","title":"Plausible.Test.Support.HTML.form_exists?/2","type":"function"},{"doc":"","ref":"Plausible.Test.Support.HTML.html#submit_button/2","title":"Plausible.Test.Support.HTML.submit_button/2","type":"function"},{"doc":"","ref":"Plausible.Test.Support.HTML.html#text_of_attr/2","title":"Plausible.Test.Support.HTML.text_of_attr/2","type":"function"},{"doc":"","ref":"Plausible.Test.Support.HTML.html#text_of_element/2","title":"Plausible.Test.Support.HTML.text_of_element/2","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html","title":"Plausible.TestUtils","type":"module"},{"doc":"","ref":"Plausible.TestUtils.html#add_imported_data/1","title":"Plausible.TestUtils.add_imported_data/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#await_clickhouse_count/2","title":"Plausible.TestUtils.await_clickhouse_count/2","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#create_api_key/1","title":"Plausible.TestUtils.create_api_key/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#create_events/1","title":"Plausible.TestUtils.create_events/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#create_new_site/1","title":"Plausible.TestUtils.create_new_site/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#create_pageviews/1","title":"Plausible.TestUtils.create_pageviews/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#create_sessions/1","title":"Plausible.TestUtils.create_sessions/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#create_site/1","title":"Plausible.TestUtils.create_site/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#create_user/1","title":"Plausible.TestUtils.create_user/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#eventually/3","title":"Plausible.TestUtils.eventually/3","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#init_session/1","title":"Plausible.TestUtils.init_session/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#log_in/1","title":"Plausible.TestUtils.log_in/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#patch_env/2","title":"Plausible.TestUtils.patch_env/2","type":"macro"},{"doc":"","ref":"Plausible.TestUtils.html#populate_stats/1","title":"Plausible.TestUtils.populate_stats/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#populate_stats/2","title":"Plausible.TestUtils.populate_stats/2","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#relative_time/1","title":"Plausible.TestUtils.relative_time/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#setup_patch_env/2","title":"Plausible.TestUtils.setup_patch_env/2","type":"macro"},{"doc":"","ref":"Plausible.TestUtils.html#to_naive_truncate/1","title":"Plausible.TestUtils.to_naive_truncate/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#use_api_key/1","title":"Plausible.TestUtils.use_api_key/1","type":"function"},{"doc":"","ref":"Plausible.Themes.html","title":"Plausible.Themes","type":"module"},{"doc":"","ref":"Plausible.Themes.html#options/0","title":"Plausible.Themes.options/0","type":"function"},{"doc":"","ref":"Plausible.Timezones.html","title":"Plausible.Timezones","type":"module"},{"doc":"","ref":"Plausible.Timezones.html#options/1","title":"Plausible.Timezones.options/1","type":"function"},{"doc":"","ref":"Plausible.Workers.CheckUsage.html","title":"Plausible.Workers.CheckUsage","type":"module"},{"doc":"","ref":"Plausible.Workers.CheckUsage.html#check_enterprise_subscriber/2","title":"Plausible.Workers.CheckUsage.check_enterprise_subscriber/2","type":"function"},{"doc":"","ref":"Plausible.Workers.CheckUsage.html#day_of_month/1","title":"Plausible.Workers.CheckUsage.day_of_month/1","type":"macro"},{"doc":"","ref":"Plausible.Workers.CheckUsage.html#last_day_of_month/1","title":"Plausible.Workers.CheckUsage.last_day_of_month/1","type":"macro"},{"doc":"","ref":"Plausible.Workers.CheckUsage.html#least/2","title":"Plausible.Workers.CheckUsage.least/2","type":"macro"},{"doc":"","ref":"Plausible.Workers.CheckUsage.html#yesterday/0","title":"Plausible.Workers.CheckUsage.yesterday/0","type":"macro"},{"doc":"","ref":"Plausible.Workers.CleanEmailVerificationCodes.html","title":"Plausible.Workers.CleanEmailVerificationCodes","type":"module"},{"doc":"","ref":"Plausible.Workers.CleanInvitations.html","title":"Plausible.Workers.CleanInvitations","type":"module"},{"doc":"Periodic worker that expires domain change transition period. Old domains are frozen for a given time, so users can still access them before redeploying their scripts and integrations.","ref":"Plausible.Workers.ExpireDomainChangeTransitions.html","title":"Plausible.Workers.ExpireDomainChangeTransitions","type":"module"},{"doc":"","ref":"Plausible.Workers.ImportGoogleAnalytics.html","title":"Plausible.Workers.ImportGoogleAnalytics","type":"module"},{"doc":"","ref":"Plausible.Workers.ImportGoogleAnalytics.html#import_failed/1","title":"Plausible.Workers.ImportGoogleAnalytics.import_failed/1","type":"function"},{"doc":"","ref":"Plausible.Workers.LockSites.html","title":"Plausible.Workers.LockSites","type":"module"},{"doc":"","ref":"Plausible.Workers.NotifyAnnualRenewal.html","title":"Plausible.Workers.NotifyAnnualRenewal","type":"module"},{"doc":"Sends a notification at most 7 days and at least 1 day before the renewal of an annual subscription","ref":"Plausible.Workers.NotifyAnnualRenewal.html#perform/1","title":"Plausible.Workers.NotifyAnnualRenewal.perform/1","type":"function"},{"doc":"","ref":"Plausible.Workers.RotateSalts.html","title":"Plausible.Workers.RotateSalts","type":"module"},{"doc":"","ref":"Plausible.Workers.ScheduleEmailReports.html","title":"Plausible.Workers.ScheduleEmailReports","type":"module"},{"doc":"","ref":"Plausible.Workers.ScheduleEmailReports.html#first_of_month_9am/1","title":"Plausible.Workers.ScheduleEmailReports.first_of_month_9am/1","type":"function"},{"doc":"","ref":"Plausible.Workers.ScheduleEmailReports.html#monday_9am/1","title":"Plausible.Workers.ScheduleEmailReports.monday_9am/1","type":"function"},{"doc":"Email reports should be sent on Monday at 9am according to the timezone of a site. This job runs every day at midnight to ensure that all sites have a scheduled job for email reports.","ref":"Plausible.Workers.ScheduleEmailReports.html#perform/1","title":"Plausible.Workers.ScheduleEmailReports.perform/1","type":"function"},{"doc":"","ref":"Plausible.Workers.SendCheckStatsEmails.html","title":"Plausible.Workers.SendCheckStatsEmails","type":"module"},{"doc":"","ref":"Plausible.Workers.SendEmailReport.html","title":"Plausible.Workers.SendEmailReport","type":"module"},{"doc":"","ref":"Plausible.Workers.SendSiteSetupEmails.html","title":"Plausible.Workers.SendSiteSetupEmails","type":"module"},{"doc":"","ref":"Plausible.Workers.SendTrialNotifications.html","title":"Plausible.Workers.SendTrialNotifications","type":"module"},{"doc":"","ref":"Plausible.Workers.SpikeNotifier.html","title":"Plausible.Workers.SpikeNotifier","type":"module"},{"doc":"","ref":"PlausibleWeb.html","title":"PlausibleWeb","type":"module"},{"doc":"When used, dispatch to the appropriate controller/view/etc.","ref":"PlausibleWeb.html#__using__/1","title":"PlausibleWeb.__using__/1","type":"macro"},{"doc":"","ref":"PlausibleWeb.html#channel/0","title":"PlausibleWeb.channel/0","type":"function"},{"doc":"","ref":"PlausibleWeb.html#controller/0","title":"PlausibleWeb.controller/0","type":"function"},{"doc":"","ref":"PlausibleWeb.html#router/0","title":"PlausibleWeb.router/0","type":"function"},{"doc":"","ref":"PlausibleWeb.html#view/0","title":"PlausibleWeb.view/0","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalController.html","title":"PlausibleWeb.Api.ExternalController","type":"module"},{"doc":"","ref":"PlausibleWeb.Api.ExternalController.html#error/2","title":"PlausibleWeb.Api.ExternalController.error/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalController.html#event/2","title":"PlausibleWeb.Api.ExternalController.event/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalController.html#health/2","title":"PlausibleWeb.Api.ExternalController.health/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalController.html#info/2","title":"PlausibleWeb.Api.ExternalController.info/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html","title":"PlausibleWeb.Api.ExternalSitesController","type":"module"},{"doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#create_site/2","title":"PlausibleWeb.Api.ExternalSitesController.create_site/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#delete_goal/2","title":"PlausibleWeb.Api.ExternalSitesController.delete_goal/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#delete_site/2","title":"PlausibleWeb.Api.ExternalSitesController.delete_site/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#find_or_create_goal/2","title":"PlausibleWeb.Api.ExternalSitesController.find_or_create_goal/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#find_or_create_shared_link/2","title":"PlausibleWeb.Api.ExternalSitesController.find_or_create_shared_link/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#get_site/2","title":"PlausibleWeb.Api.ExternalSitesController.get_site/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#update_site/2","title":"PlausibleWeb.Api.ExternalSitesController.update_site/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalStatsController.html","title":"PlausibleWeb.Api.ExternalStatsController","type":"module"},{"doc":"","ref":"PlausibleWeb.Api.ExternalStatsController.html#aggregate/2","title":"PlausibleWeb.Api.ExternalStatsController.aggregate/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalStatsController.html#breakdown/2","title":"PlausibleWeb.Api.ExternalStatsController.breakdown/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalStatsController.html#realtime_visitors/2","title":"PlausibleWeb.Api.ExternalStatsController.realtime_visitors/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalStatsController.html#timeseries/2","title":"PlausibleWeb.Api.ExternalStatsController.timeseries/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.Helpers.html","title":"PlausibleWeb.Api.Helpers","type":"module"},{"doc":"","ref":"PlausibleWeb.Api.Helpers.html#bad_request/2","title":"PlausibleWeb.Api.Helpers.bad_request/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.Helpers.html#not_found/2","title":"PlausibleWeb.Api.Helpers.not_found/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.Helpers.html#payment_required/2","title":"PlausibleWeb.Api.Helpers.payment_required/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.Helpers.html#too_many_requests/2","title":"PlausibleWeb.Api.Helpers.too_many_requests/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.Helpers.html#unauthorized/2","title":"PlausibleWeb.Api.Helpers.unauthorized/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.InternalController.html","title":"PlausibleWeb.Api.InternalController","type":"module"},{"doc":"","ref":"PlausibleWeb.Api.InternalController.html#disable_feature/2","title":"PlausibleWeb.Api.InternalController.disable_feature/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.InternalController.html#domain_status/2","title":"PlausibleWeb.Api.InternalController.domain_status/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.InternalController.html#sites/2","title":"PlausibleWeb.Api.InternalController.sites/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.PaddleController.html","title":"PlausibleWeb.Api.PaddleController","type":"module"},{"doc":"","ref":"PlausibleWeb.Api.PaddleController.html#verified_signature?/1","title":"PlausibleWeb.Api.PaddleController.verified_signature?/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.PaddleController.html#verify_signature/2","title":"PlausibleWeb.Api.PaddleController.verify_signature/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.PaddleController.html#webhook/2","title":"PlausibleWeb.Api.PaddleController.webhook/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html","title":"PlausibleWeb.Api.StatsController","type":"module"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#all_props_breakdown/2","title":"PlausibleWeb.Api.StatsController.all_props_breakdown/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#browser_versions/2","title":"PlausibleWeb.Api.StatsController.browser_versions/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#browsers/2","title":"PlausibleWeb.Api.StatsController.browsers/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#cities/2","title":"PlausibleWeb.Api.StatsController.cities/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#conversions/2","title":"PlausibleWeb.Api.StatsController.conversions/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#countries/2","title":"PlausibleWeb.Api.StatsController.countries/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#current_visitors/2","title":"PlausibleWeb.Api.StatsController.current_visitors/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#custom_prop_values/2","title":"PlausibleWeb.Api.StatsController.custom_prop_values/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#entry_pages/2","title":"PlausibleWeb.Api.StatsController.entry_pages/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#exit_pages/2","title":"PlausibleWeb.Api.StatsController.exit_pages/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#filter_suggestions/2","title":"PlausibleWeb.Api.StatsController.filter_suggestions/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#funnel/2","title":"PlausibleWeb.Api.StatsController.funnel/2","type":"function"},{"doc":"Returns a time-series based on given parameters. Parameters This API accepts the following parameters: period - x-axis of the graph, e.g. 12mo , day , custom . metric - y-axis of the graph, e.g. visits , visitors , pageviews . See the Stats API "Metrics" section for more details. Defaults to visitors . interval - granularity of the time-series data. You can think of it as a GROUP BY clause. Possible values are minute , hour , date , week , and month . The default depends on the period parameter. Check Plausible.Query.from/2 for each default. filters - optional filters to drill down data. See the Stats API "Filtering" section for more details. with_imported - boolean indicating whether to include Google Analytics imported data or not. Defaults to false . Full example: %{ "from" => "2021-09-06" , "interval" => "month" , "metric" => "visitors" , "period" => "custom" , "to" => "2021-12-13" } Response Returns a map with the following keys: plot - list of values for the requested metric representing the y-axis of the graph. labels - list of date times representing the x-axis of the graph. present_index - index of the element representing the current date in labels and plot lists. interval - the interval used for querying. with_imported - boolean indicating whether the Google Analytics data was queried or not. imported_source - the source of the imported data, when applicable. Currently only Google Analytics is supported. full_intervals - map of dates indicating whether the interval has been cut off by the requested date range or not. For example, if looking at a month week-by-week, some weeks may be cut off by the month boundaries. It's useful to adjust the graph display slightly in case the interval is not 'full' so that the user understands why the numbers might be lower for those partial periods. Full example: %{ "full_intervals" => %{ "2021-09-01" => false , "2021-10-01" => true , "2021-11-01" => true , "2021-12-01" => false } , "imported_source" => nil , "interval" => "month" , "labels" => [ "2021-09-01" , "2021-10-01" , "2021-11-01" , "2021-12-01" ] , "plot" => [ 0 , 0 , 0 , 0 ] , "present_index" => nil , "with_imported" => false }","ref":"PlausibleWeb.Api.StatsController.html#main_graph/2","title":"PlausibleWeb.Api.StatsController.main_graph/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#operating_system_versions/2","title":"PlausibleWeb.Api.StatsController.operating_system_versions/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#operating_systems/2","title":"PlausibleWeb.Api.StatsController.operating_systems/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#pages/2","title":"PlausibleWeb.Api.StatsController.pages/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#prop_breakdown/2","title":"PlausibleWeb.Api.StatsController.prop_breakdown/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#referrer_drilldown/2","title":"PlausibleWeb.Api.StatsController.referrer_drilldown/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#regions/2","title":"PlausibleWeb.Api.StatsController.regions/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#screen_sizes/2","title":"PlausibleWeb.Api.StatsController.screen_sizes/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#sources/2","title":"PlausibleWeb.Api.StatsController.sources/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#top_stats/2","title":"PlausibleWeb.Api.StatsController.top_stats/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#utm_campaigns/2","title":"PlausibleWeb.Api.StatsController.utm_campaigns/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#utm_contents/2","title":"PlausibleWeb.Api.StatsController.utm_contents/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#utm_mediums/2","title":"PlausibleWeb.Api.StatsController.utm_mediums/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#utm_sources/2","title":"PlausibleWeb.Api.StatsController.utm_sources/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#utm_terms/2","title":"PlausibleWeb.Api.StatsController.utm_terms/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html","title":"PlausibleWeb.AuthController","type":"module"},{"doc":"","ref":"PlausibleWeb.AuthController.html#activate/2","title":"PlausibleWeb.AuthController.activate/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#activate_form/2","title":"PlausibleWeb.AuthController.activate_form/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#create_api_key/2","title":"PlausibleWeb.AuthController.create_api_key/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#delete_api_key/2","title":"PlausibleWeb.AuthController.delete_api_key/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#delete_me/2","title":"PlausibleWeb.AuthController.delete_me/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#google_auth_callback/2","title":"PlausibleWeb.AuthController.google_auth_callback/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#login/2","title":"PlausibleWeb.AuthController.login/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#login_form/2","title":"PlausibleWeb.AuthController.login_form/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#logout/2","title":"PlausibleWeb.AuthController.logout/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#new_api_key/2","title":"PlausibleWeb.AuthController.new_api_key/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#password_form/2","title":"PlausibleWeb.AuthController.password_form/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#password_reset/2","title":"PlausibleWeb.AuthController.password_reset/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#password_reset_form/2","title":"PlausibleWeb.AuthController.password_reset_form/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#password_reset_request/2","title":"PlausibleWeb.AuthController.password_reset_request/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#password_reset_request_form/2","title":"PlausibleWeb.AuthController.password_reset_request_form/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#register/2","title":"PlausibleWeb.AuthController.register/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#register_form/2","title":"PlausibleWeb.AuthController.register_form/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#register_from_invitation/2","title":"PlausibleWeb.AuthController.register_from_invitation/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#register_from_invitation_form/2","title":"PlausibleWeb.AuthController.register_from_invitation_form/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#request_activation_code/2","title":"PlausibleWeb.AuthController.request_activation_code/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#save_settings/2","title":"PlausibleWeb.AuthController.save_settings/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#set_password/2","title":"PlausibleWeb.AuthController.set_password/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#user_settings/2","title":"PlausibleWeb.AuthController.user_settings/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthPlug.html","title":"PlausibleWeb.AuthPlug","type":"module"},{"doc":"","ref":"PlausibleWeb.AuthPlug.html#call/2","title":"PlausibleWeb.AuthPlug.call/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthPlug.html#init/1","title":"PlausibleWeb.AuthPlug.init/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html","title":"PlausibleWeb.AuthView","type":"module"},{"doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.AuthView.html#__resource__/0","title":"PlausibleWeb.AuthView.__resource__/0","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#activate.html/1","title":"PlausibleWeb.AuthView.activate.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#base_domain/0","title":"PlausibleWeb.AuthView.base_domain/0","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#delimit_integer/1","title":"PlausibleWeb.AuthView.delimit_integer/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#format_invoices/1","title":"PlausibleWeb.AuthView.format_invoices/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#invitation_expired.html/1","title":"PlausibleWeb.AuthView.invitation_expired.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#login_form.html/1","title":"PlausibleWeb.AuthView.login_form.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#new_api_key.html/1","title":"PlausibleWeb.AuthView.new_api_key.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#password_form.html/1","title":"PlausibleWeb.AuthView.password_form.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#password_reset_form.html/1","title":"PlausibleWeb.AuthView.password_reset_form.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#password_reset_request_form.html/1","title":"PlausibleWeb.AuthView.password_reset_request_form.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#password_reset_request_success.html/1","title":"PlausibleWeb.AuthView.password_reset_request_success.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#plausible_url/0","title":"PlausibleWeb.AuthView.plausible_url/0","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#present_subscription_status/1","title":"PlausibleWeb.AuthView.present_subscription_status/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#register_form.html/1","title":"PlausibleWeb.AuthView.register_form.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#register_from_invitation_form.html/1","title":"PlausibleWeb.AuthView.register_from_invitation_form.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#register_success.html/1","title":"PlausibleWeb.AuthView.register_success.html/1","type":"function"},{"doc":"Renders the given template locally.","ref":"PlausibleWeb.AuthView.html#render/2","title":"PlausibleWeb.AuthView.render/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#subscription_colors/1","title":"PlausibleWeb.AuthView.subscription_colors/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#subscription_interval/1","title":"PlausibleWeb.AuthView.subscription_interval/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#subscription_quota/1","title":"PlausibleWeb.AuthView.subscription_quota/1","type":"function"},{"doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"PlausibleWeb.AuthView.html#template_not_found/2","title":"PlausibleWeb.AuthView.template_not_found/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#user_settings.html/1","title":"PlausibleWeb.AuthView.user_settings.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthorizeSiteAccess.html","title":"PlausibleWeb.AuthorizeSiteAccess","type":"module"},{"doc":"","ref":"PlausibleWeb.AuthorizeSiteAccess.html#call/2","title":"PlausibleWeb.AuthorizeSiteAccess.call/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthorizeSiteAccess.html#init/1","title":"PlausibleWeb.AuthorizeSiteAccess.init/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthorizeSitesApiPlug.html","title":"PlausibleWeb.AuthorizeSitesApiPlug","type":"module"},{"doc":"","ref":"PlausibleWeb.AuthorizeSitesApiPlug.html#call/2","title":"PlausibleWeb.AuthorizeSitesApiPlug.call/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthorizeSitesApiPlug.html#init/1","title":"PlausibleWeb.AuthorizeSitesApiPlug.init/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthorizeStatsApiPlug.html","title":"PlausibleWeb.AuthorizeStatsApiPlug","type":"module"},{"doc":"","ref":"PlausibleWeb.AuthorizeStatsApiPlug.html#call/2","title":"PlausibleWeb.AuthorizeStatsApiPlug.call/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthorizeStatsApiPlug.html#init/1","title":"PlausibleWeb.AuthorizeStatsApiPlug.init/1","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingController.html","title":"PlausibleWeb.BillingController","type":"module"},{"doc":"","ref":"PlausibleWeb.BillingController.html#change_enterprise_plan/2","title":"PlausibleWeb.BillingController.change_enterprise_plan/2","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingController.html#change_plan/2","title":"PlausibleWeb.BillingController.change_plan/2","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingController.html#change_plan_form/2","title":"PlausibleWeb.BillingController.change_plan_form/2","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingController.html#change_plan_preview/2","title":"PlausibleWeb.BillingController.change_plan_preview/2","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingController.html#ping_subscription/2","title":"PlausibleWeb.BillingController.ping_subscription/2","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingController.html#preview_susbcription/2","title":"PlausibleWeb.BillingController.preview_susbcription/2","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingController.html#upgrade/2","title":"PlausibleWeb.BillingController.upgrade/2","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingController.html#upgrade_enterprise_plan/2","title":"PlausibleWeb.BillingController.upgrade_enterprise_plan/2","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingController.html#upgrade_success/2","title":"PlausibleWeb.BillingController.upgrade_success/2","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html","title":"PlausibleWeb.BillingView","type":"module"},{"doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.BillingView.html#__resource__/0","title":"PlausibleWeb.BillingView.__resource__/0","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#base_domain/0","title":"PlausibleWeb.BillingView.base_domain/0","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#change_enterprise_plan.html/1","title":"PlausibleWeb.BillingView.change_enterprise_plan.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#change_enterprise_plan_contact_us.html/1","title":"PlausibleWeb.BillingView.change_enterprise_plan_contact_us.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#change_plan.html/1","title":"PlausibleWeb.BillingView.change_plan.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#change_plan_preview.html/1","title":"PlausibleWeb.BillingView.change_plan_preview.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#plausible_url/0","title":"PlausibleWeb.BillingView.plausible_url/0","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#present_currency/1","title":"PlausibleWeb.BillingView.present_currency/1","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#present_date/1","title":"PlausibleWeb.BillingView.present_date/1","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#reccommended_plan/1","title":"PlausibleWeb.BillingView.reccommended_plan/1","type":"function"},{"doc":"Renders the given template locally.","ref":"PlausibleWeb.BillingView.html#render/2","title":"PlausibleWeb.BillingView.render/2","type":"function"},{"doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"PlausibleWeb.BillingView.html#template_not_found/2","title":"PlausibleWeb.BillingView.template_not_found/2","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#upgrade.html/1","title":"PlausibleWeb.BillingView.upgrade.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#upgrade_success.html/1","title":"PlausibleWeb.BillingView.upgrade_success.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#upgrade_to_plan.html/1","title":"PlausibleWeb.BillingView.upgrade_to_plan.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.CRMAuthPlug.html","title":"PlausibleWeb.CRMAuthPlug","type":"module"},{"doc":"","ref":"PlausibleWeb.CRMAuthPlug.html#call/2","title":"PlausibleWeb.CRMAuthPlug.call/2","type":"function"},{"doc":"","ref":"PlausibleWeb.CRMAuthPlug.html#init/1","title":"PlausibleWeb.CRMAuthPlug.init/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Captcha.html","title":"PlausibleWeb.Captcha","type":"module"},{"doc":"","ref":"PlausibleWeb.Captcha.html#enabled?/0","title":"PlausibleWeb.Captcha.enabled?/0","type":"function"},{"doc":"","ref":"PlausibleWeb.Captcha.html#sitekey/0","title":"PlausibleWeb.Captcha.sitekey/0","type":"function"},{"doc":"","ref":"PlausibleWeb.Captcha.html#verify/1","title":"PlausibleWeb.Captcha.verify/1","type":"function"},{"doc":"Generic reusable components","ref":"PlausibleWeb.Components.Generic.html","title":"PlausibleWeb.Components.Generic","type":"module"},{"doc":"Attributes title ( :string ) - Defaults to "Notice" . class ( :string ) - Defaults to "" . Slots inner_block","ref":"PlausibleWeb.Components.Generic.html#notice/1","title":"PlausibleWeb.Components.Generic.notice/1","type":"function"},{"doc":"Phoenix Component for rendering a user-facing feature toggle capable of flipping booleans in Plausible.Site via the toggle_feature controller action.","ref":"PlausibleWeb.Components.Site.Feature.html","title":"PlausibleWeb.Components.Site.Feature","type":"module"},{"doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.Components.Site.Feature.html#__resource__/0","title":"PlausibleWeb.Components.Site.Feature.__resource__/0","type":"function"},{"doc":"","ref":"PlausibleWeb.Components.Site.Feature.html#button_active/1","title":"PlausibleWeb.Components.Site.Feature.button_active/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Components.Site.Feature.html#button_inactive/1","title":"PlausibleWeb.Components.Site.Feature.button_inactive/1","type":"function"},{"doc":"Renders the given template locally.","ref":"PlausibleWeb.Components.Site.Feature.html#render/2","title":"PlausibleWeb.Components.Site.Feature.render/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Components.Site.Feature.html#target/4","title":"PlausibleWeb.Components.Site.Feature.target/4","type":"function"},{"doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"PlausibleWeb.Components.Site.Feature.html#template_not_found/2","title":"PlausibleWeb.Components.Site.Feature.template_not_found/2","type":"function"},{"doc":"Attributes site ( Plausible.Site ) (required) setting ( :atom ) (required) label ( :string ) (required) conn ( Plug.Conn ) (required) Slots inner_block","ref":"PlausibleWeb.Components.Site.Feature.html#toggle/1","title":"PlausibleWeb.Components.Site.Feature.toggle/1","type":"function"},{"doc":"This module defines the test case to be used by tests that require setting up a connection. Such tests rely on Phoenix.ConnTest and also import other functionality to make it easier to build common data structures and query the data layer. Finally, if the test case interacts with the database, it cannot be async. For this reason, every test runs inside a transaction which is reset at the beginning of the test unless the test case is marked as async.","ref":"PlausibleWeb.ConnCase.html","title":"PlausibleWeb.ConnCase","type":"module"},{"doc":"","ref":"PlausibleWeb.ControllerHelpers.html","title":"PlausibleWeb.ControllerHelpers","type":"module"},{"doc":"","ref":"PlausibleWeb.ControllerHelpers.html#render_error/2","title":"PlausibleWeb.ControllerHelpers.render_error/2","type":"function"},{"doc":"","ref":"PlausibleWeb.ControllerHelpers.html#render_error/3","title":"PlausibleWeb.ControllerHelpers.render_error/3","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html","title":"PlausibleWeb.Email","type":"module"},{"doc":"","ref":"PlausibleWeb.Email.html#activation_email/2","title":"PlausibleWeb.Email.activation_email/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#base_email/0","title":"PlausibleWeb.Email.base_email/0","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#base_email/1","title":"PlausibleWeb.Email.base_email/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#cancellation_email/1","title":"PlausibleWeb.Email.cancellation_email/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#check_stats_email/1","title":"PlausibleWeb.Email.check_stats_email/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#create_site_email/1","title":"PlausibleWeb.Email.create_site_email/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#dashboard_locked/4","title":"PlausibleWeb.Email.dashboard_locked/4","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#enterprise_over_limit_internal_email/5","title":"PlausibleWeb.Email.enterprise_over_limit_internal_email/5","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#error_report/3","title":"PlausibleWeb.Email.error_report/3","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#existing_user_invitation/1","title":"PlausibleWeb.Email.existing_user_invitation/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#import_failure/2","title":"PlausibleWeb.Email.import_failure/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#import_success/2","title":"PlausibleWeb.Email.import_success/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#invitation_accepted/1","title":"PlausibleWeb.Email.invitation_accepted/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#invitation_rejected/1","title":"PlausibleWeb.Email.invitation_rejected/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#mailer_email_from/0","title":"PlausibleWeb.Email.mailer_email_from/0","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#new_user_invitation/1","title":"PlausibleWeb.Email.new_user_invitation/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#over_limit_email/4","title":"PlausibleWeb.Email.over_limit_email/4","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#ownership_transfer_accepted/1","title":"PlausibleWeb.Email.ownership_transfer_accepted/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#ownership_transfer_rejected/1","title":"PlausibleWeb.Email.ownership_transfer_rejected/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#ownership_transfer_request/2","title":"PlausibleWeb.Email.ownership_transfer_request/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#password_reset_email/2","title":"PlausibleWeb.Email.password_reset_email/2","type":"function"},{"doc":"Render an Phoenix template and set the body on the email. Pass an atom as the template name (:welcome_email) to render HTML and plain text emails. Use a string if you only want to render one type, e.g. "welcome_email.text" or "welcome_email.html". Scroll to the top for more examples.","ref":"PlausibleWeb.Email.html#render/3","title":"PlausibleWeb.Email.render/3","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#site_member_removed/1","title":"PlausibleWeb.Email.site_member_removed/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#site_setup_help/2","title":"PlausibleWeb.Email.site_setup_help/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#site_setup_success/2","title":"PlausibleWeb.Email.site_setup_success/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#spike_notification/5","title":"PlausibleWeb.Email.spike_notification/5","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#trial_one_week_reminder/1","title":"PlausibleWeb.Email.trial_one_week_reminder/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#trial_over_email/1","title":"PlausibleWeb.Email.trial_over_email/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#trial_upgrade_email/3","title":"PlausibleWeb.Email.trial_upgrade_email/3","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#weekly_report/3","title":"PlausibleWeb.Email.weekly_report/3","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#welcome_email/1","title":"PlausibleWeb.Email.welcome_email/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#yearly_expiration_notification/1","title":"PlausibleWeb.Email.yearly_expiration_notification/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#yearly_renewal_notification/1","title":"PlausibleWeb.Email.yearly_renewal_notification/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html","title":"PlausibleWeb.EmailView","type":"module"},{"doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.EmailView.html#__resource__/0","title":"PlausibleWeb.EmailView.__resource__/0","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#activation_email.html/1","title":"PlausibleWeb.EmailView.activation_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#base_domain/0","title":"PlausibleWeb.EmailView.base_domain/0","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#cancellation_email.html/1","title":"PlausibleWeb.EmailView.cancellation_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#check_stats_email.html/1","title":"PlausibleWeb.EmailView.check_stats_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#create_site_email.html/1","title":"PlausibleWeb.EmailView.create_site_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#dashboard_locked.html/1","title":"PlausibleWeb.EmailView.dashboard_locked.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#date_format/1","title":"PlausibleWeb.EmailView.date_format/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#enterprise_over_limit_internal.html/1","title":"PlausibleWeb.EmailView.enterprise_over_limit_internal.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#error_report_email.html/1","title":"PlausibleWeb.EmailView.error_report_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#existing_user_invitation.html/1","title":"PlausibleWeb.EmailView.existing_user_invitation.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#google_analytics_import.html/1","title":"PlausibleWeb.EmailView.google_analytics_import.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#greet_recipient/1","title":"PlausibleWeb.EmailView.greet_recipient/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#invitation_accepted.html/1","title":"PlausibleWeb.EmailView.invitation_accepted.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#invitation_rejected.html/1","title":"PlausibleWeb.EmailView.invitation_rejected.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#new_user_invitation.html/1","title":"PlausibleWeb.EmailView.new_user_invitation.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#over_limit.html/1","title":"PlausibleWeb.EmailView.over_limit.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#ownership_transfer_accepted.html/1","title":"PlausibleWeb.EmailView.ownership_transfer_accepted.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#ownership_transfer_rejected.html/1","title":"PlausibleWeb.EmailView.ownership_transfer_rejected.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#ownership_transfer_request.html/1","title":"PlausibleWeb.EmailView.ownership_transfer_request.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#password_reset_email.html/1","title":"PlausibleWeb.EmailView.password_reset_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#plausible_url/0","title":"PlausibleWeb.EmailView.plausible_url/0","type":"function"},{"doc":"Renders the given template locally.","ref":"PlausibleWeb.EmailView.html#render/2","title":"PlausibleWeb.EmailView.render/2","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#sentry_link/2","title":"PlausibleWeb.EmailView.sentry_link/2","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#site_member_removed.html/1","title":"PlausibleWeb.EmailView.site_member_removed.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#site_setup_help_email.html/1","title":"PlausibleWeb.EmailView.site_setup_help_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#site_setup_success_email.html/1","title":"PlausibleWeb.EmailView.site_setup_success_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#spike_notification.html/1","title":"PlausibleWeb.EmailView.spike_notification.html/1","type":"function"},{"doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"PlausibleWeb.EmailView.html#template_not_found/2","title":"PlausibleWeb.EmailView.template_not_found/2","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#trial_one_week_reminder.html/1","title":"PlausibleWeb.EmailView.trial_one_week_reminder.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#trial_over_email.html/1","title":"PlausibleWeb.EmailView.trial_over_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#trial_upgrade_email.html/1","title":"PlausibleWeb.EmailView.trial_upgrade_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#welcome_email.html/1","title":"PlausibleWeb.EmailView.welcome_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#yearly_expiration_notification.html/1","title":"PlausibleWeb.EmailView.yearly_expiration_notification.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#yearly_renewal_notification.html/1","title":"PlausibleWeb.EmailView.yearly_renewal_notification.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Endpoint.html","title":"PlausibleWeb.Endpoint","type":"module"},{"doc":"Callback implementation for Phoenix.Endpoint.broadcast/3 .","ref":"PlausibleWeb.Endpoint.html#broadcast/3","title":"PlausibleWeb.Endpoint.broadcast/3","type":"function"},{"doc":"Callback implementation for Phoenix.Endpoint.broadcast!/3 .","ref":"PlausibleWeb.Endpoint.html#broadcast!/3","title":"PlausibleWeb.Endpoint.broadcast!/3","type":"function"},{"doc":"Callback implementation for Phoenix.Endpoint.broadcast_from/4 .","ref":"PlausibleWeb.Endpoint.html#broadcast_from/4","title":"PlausibleWeb.Endpoint.broadcast_from/4","type":"function"},{"doc":"Callback implementation for Phoenix.Endpoint.broadcast_from!/4 .","ref":"PlausibleWeb.Endpoint.html#broadcast_from!/4","title":"PlausibleWeb.Endpoint.broadcast_from!/4","type":"function"},{"doc":"Callback implementation for Plug.call/2 .","ref":"PlausibleWeb.Endpoint.html#call/2","title":"PlausibleWeb.Endpoint.call/2","type":"function"},{"doc":"Returns the child specification to start the endpoint under a supervision tree.","ref":"PlausibleWeb.Endpoint.html#child_spec/1","title":"PlausibleWeb.Endpoint.child_spec/1","type":"function"},{"doc":"Returns the endpoint configuration for key Returns default if the key does not exist.","ref":"PlausibleWeb.Endpoint.html#config/2","title":"PlausibleWeb.Endpoint.config/2","type":"function"},{"doc":"Reloads the configuration given the application environment changes.","ref":"PlausibleWeb.Endpoint.html#config_change/2","title":"PlausibleWeb.Endpoint.config_change/2","type":"function"},{"doc":"Returns the host for the given endpoint.","ref":"PlausibleWeb.Endpoint.html#host/0","title":"PlausibleWeb.Endpoint.host/0","type":"function"},{"doc":"Callback implementation for Plug.init/1 .","ref":"PlausibleWeb.Endpoint.html#init/1","title":"PlausibleWeb.Endpoint.init/1","type":"function"},{"doc":"Callback implementation for Phoenix.Endpoint.local_broadcast/3 .","ref":"PlausibleWeb.Endpoint.html#local_broadcast/3","title":"PlausibleWeb.Endpoint.local_broadcast/3","type":"function"},{"doc":"Callback implementation for Phoenix.Endpoint.local_broadcast_from/4 .","ref":"PlausibleWeb.Endpoint.html#local_broadcast_from/4","title":"PlausibleWeb.Endpoint.local_broadcast_from/4","type":"function"},{"doc":"","ref":"PlausibleWeb.Endpoint.html#patch_session_opts/0","title":"PlausibleWeb.Endpoint.patch_session_opts/0","type":"function"},{"doc":"Generates the path information when routing to this endpoint.","ref":"PlausibleWeb.Endpoint.html#path/1","title":"PlausibleWeb.Endpoint.path/1","type":"function"},{"doc":"Generates the script name.","ref":"PlausibleWeb.Endpoint.html#script_name/0","title":"PlausibleWeb.Endpoint.script_name/0","type":"function"},{"doc":"Starts the endpoint supervision tree. All other options are merged into the endpoint configuration.","ref":"PlausibleWeb.Endpoint.html#start_link/1","title":"PlausibleWeb.Endpoint.start_link/1","type":"function"},{"doc":"Generates a base64-encoded cryptographic hash (sha512) to a static file in priv/static . Meant to be used for Subresource Integrity with CDNs.","ref":"PlausibleWeb.Endpoint.html#static_integrity/1","title":"PlausibleWeb.Endpoint.static_integrity/1","type":"function"},{"doc":"Returns a two item tuple with the first item being the static_path and the second item being the static_integrity .","ref":"PlausibleWeb.Endpoint.html#static_lookup/1","title":"PlausibleWeb.Endpoint.static_lookup/1","type":"function"},{"doc":"Generates a route to a static file in priv/static .","ref":"PlausibleWeb.Endpoint.html#static_path/1","title":"PlausibleWeb.Endpoint.static_path/1","type":"function"},{"doc":"Generates the static URL without any path information. It uses the configuration under :static_url to generate such. It falls back to :url if :static_url is not set.","ref":"PlausibleWeb.Endpoint.html#static_url/0","title":"PlausibleWeb.Endpoint.static_url/0","type":"function"},{"doc":"Generates the endpoint base URL but as a URI struct. It uses the configuration under :url to generate such. Useful for manipulating the URL data and passing it to URL helpers.","ref":"PlausibleWeb.Endpoint.html#struct_url/0","title":"PlausibleWeb.Endpoint.struct_url/0","type":"function"},{"doc":"Callback implementation for Phoenix.Endpoint.subscribe/2 .","ref":"PlausibleWeb.Endpoint.html#subscribe/2","title":"PlausibleWeb.Endpoint.subscribe/2","type":"function"},{"doc":"Callback implementation for Phoenix.Endpoint.unsubscribe/1 .","ref":"PlausibleWeb.Endpoint.html#unsubscribe/1","title":"PlausibleWeb.Endpoint.unsubscribe/1","type":"function"},{"doc":"Generates the endpoint base URL without any path information. It uses the configuration under :url to generate such.","ref":"PlausibleWeb.Endpoint.html#url/0","title":"PlausibleWeb.Endpoint.url/0","type":"function"},{"doc":"","ref":"PlausibleWeb.Endpoint.html#websocket_url/0","title":"PlausibleWeb.Endpoint.websocket_url/0","type":"function"},{"doc":"","ref":"PlausibleWeb.ErrorHelpers.html","title":"PlausibleWeb.ErrorHelpers","type":"module"},{"doc":"","ref":"PlausibleWeb.ErrorHelpers.html#error_tag/2","title":"PlausibleWeb.ErrorHelpers.error_tag/2","type":"function"},{"doc":"","ref":"PlausibleWeb.ErrorReportController.html","title":"PlausibleWeb.ErrorReportController","type":"module"},{"doc":"","ref":"PlausibleWeb.ErrorReportController.html#submit_error_report/2","title":"PlausibleWeb.ErrorReportController.submit_error_report/2","type":"function"},{"doc":"","ref":"PlausibleWeb.ErrorView.html","title":"PlausibleWeb.ErrorView","type":"module"},{"doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.ErrorView.html#__resource__/0","title":"PlausibleWeb.ErrorView.__resource__/0","type":"function"},{"doc":"","ref":"PlausibleWeb.ErrorView.html#generic_error.html/1","title":"PlausibleWeb.ErrorView.generic_error.html/1","type":"function"},{"doc":"Renders the given template locally.","ref":"PlausibleWeb.ErrorView.html#render/2","title":"PlausibleWeb.ErrorView.render/2","type":"function"},{"doc":"","ref":"PlausibleWeb.ErrorView.html#server_error.html/1","title":"PlausibleWeb.ErrorView.server_error.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.ErrorView.html#server_error_report_thanks.html/1","title":"PlausibleWeb.ErrorView.server_error_report_thanks.html/1","type":"function"},{"doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"PlausibleWeb.ErrorView.html#template_not_found/2","title":"PlausibleWeb.ErrorView.template_not_found/2","type":"function"},{"doc":"A Plug that fetches favicon images from DuckDuckGo and returns them to the Plausible frontend. The proxying is there so we can reduce the number of third-party domains that the browser clients need to connect to. Our goal is to have 0 third-party domain connections on the website for privacy reasons. This module also maps between categorized sources and their respective URLs for favicons. What does that mean exactly? During ingestion we use PlausibleWeb.RefInspector.parse/1 to categorize our referrer sources like so: google.com -> Google google.co.uk -> Google google.com.au -> Google So when we show Google as a source in the dashboard, the request to this plug will come as: https://plausible/io/favicon/sources/Google Now, when we want to show a favicon for Google, we need to convert Google -> google.com or some other hostname owned by Google: https://icons.duckduckgo.com/ip3/google.com.ico The mapping from source category -> source hostname is stored in "priv/referer_favicon_domains.json" and managed by Mix.Tasks.GenerateReferrerFavicons.run/1","ref":"PlausibleWeb.Favicon.html","title":"PlausibleWeb.Favicon","type":"module"},{"doc":"Proxies HTTP request to DuckDuckGo favicon service. Swallows hop-by-hop HTTP headers that should not be forwarded as defined in RFC 2616 Placeholder Cases where we show a placeholder icon instead: In case of network error to DuckDuckGo In case of non-2xx status code from DuckDuckGo In case of broken image response body from DuckDuckGo I'm not sure why DDG sometimes returns a broken PNG image in their response but we filter that out. When the icon request fails, we show a placeholder favicon instead. The placeholder is an emoji from https://favicon.io/emoji-favicons/ DuckDuckGo favicon service has some issues with SVG favicons . For some reason, they return them with content-type=image/x-icon whereas SVG icons should be returned with content-type=image/svg+xml . This Plug detects when the response body starts with <svg and will override the Content-Type to correct it. Preventing XSS vulnerabilities SVGs may contain <script> tags, and as these SVGs come from external sources, we need to prevent untrusted code from running on the browser. This Plug sets a strict Content-Security-Policy header telling the browser not to run scripts. This Plug sets Content-Disposition=attachment to prevent the SVG from rendering when navigating to /favicon/sources/:domain directly. Browsers do not execute scripts from <img> tags, therefore it is safe to use <img src="https://plausible.io/favicon/sources/dummy.site"></img>","ref":"PlausibleWeb.Favicon.html#call/2","title":"PlausibleWeb.Favicon.call/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Favicon.html#init/1","title":"PlausibleWeb.Favicon.init/1","type":"function"},{"doc":"Redirects first-launch users to registration page.","ref":"PlausibleWeb.FirstLaunchPlug.html","title":"PlausibleWeb.FirstLaunchPlug","type":"module"},{"doc":"","ref":"PlausibleWeb.FormHelpers.html","title":"PlausibleWeb.FormHelpers","type":"module"},{"doc":"","ref":"PlausibleWeb.FormHelpers.html#styled_error/1","title":"PlausibleWeb.FormHelpers.styled_error/1","type":"function"},{"doc":"","ref":"PlausibleWeb.FormHelpers.html#styled_label/4","title":"PlausibleWeb.FormHelpers.styled_label/4","type":"function"},{"doc":"","ref":"PlausibleWeb.FormHelpers.html#styled_select/4","title":"PlausibleWeb.FormHelpers.styled_select/4","type":"function"},{"doc":"","ref":"PlausibleWeb.FormHelpers.html#styled_text_input/3","title":"PlausibleWeb.FormHelpers.styled_text_input/3","type":"function"},{"doc":"","ref":"PlausibleWeb.InvitationController.html","title":"PlausibleWeb.InvitationController","type":"module"},{"doc":"","ref":"PlausibleWeb.InvitationController.html#accept_invitation/2","title":"PlausibleWeb.InvitationController.accept_invitation/2","type":"function"},{"doc":"","ref":"PlausibleWeb.InvitationController.html#reject_invitation/2","title":"PlausibleWeb.InvitationController.reject_invitation/2","type":"function"},{"doc":"","ref":"PlausibleWeb.InvitationController.html#remove_invitation/2","title":"PlausibleWeb.InvitationController.remove_invitation/2","type":"function"},{"doc":"","ref":"PlausibleWeb.LastSeenPlug.html","title":"PlausibleWeb.LastSeenPlug","type":"module"},{"doc":"","ref":"PlausibleWeb.LastSeenPlug.html#call/2","title":"PlausibleWeb.LastSeenPlug.call/2","type":"function"},{"doc":"","ref":"PlausibleWeb.LastSeenPlug.html#init/1","title":"PlausibleWeb.LastSeenPlug.init/1","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html","title":"PlausibleWeb.LayoutView","type":"module"},{"doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.LayoutView.html#__resource__/0","title":"PlausibleWeb.LayoutView.__resource__/0","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#app.html/1","title":"PlausibleWeb.LayoutView.app.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#base_domain/0","title":"PlausibleWeb.LayoutView.base_domain/0","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#base_email.html/1","title":"PlausibleWeb.LayoutView.base_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#base_error.html/1","title":"PlausibleWeb.LayoutView.base_error.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#embedded.html/1","title":"PlausibleWeb.LayoutView.embedded.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#focus.html/1","title":"PlausibleWeb.LayoutView.focus.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#grace_period_end/1","title":"PlausibleWeb.LayoutView.grace_period_end/1","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#home_dest/1","title":"PlausibleWeb.LayoutView.home_dest/1","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#is_current_tab/2","title":"PlausibleWeb.LayoutView.is_current_tab/2","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#plausible_url/0","title":"PlausibleWeb.LayoutView.plausible_url/0","type":"function"},{"doc":"Renders the given template locally.","ref":"PlausibleWeb.LayoutView.html#render/2","title":"PlausibleWeb.LayoutView.render/2","type":"function"},{"doc":"http://blog.plataformatec.com.br/2018/05/nested-layouts-with-phoenix/","ref":"PlausibleWeb.LayoutView.html#render_layout/3","title":"PlausibleWeb.LayoutView.render_layout/3","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#settings_tabs/1","title":"PlausibleWeb.LayoutView.settings_tabs/1","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#site_settings.html/1","title":"PlausibleWeb.LayoutView.site_settings.html/1","type":"function"},{"doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"PlausibleWeb.LayoutView.html#template_not_found/2","title":"PlausibleWeb.LayoutView.template_not_found/2","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#trial_notificaton/1","title":"PlausibleWeb.LayoutView.trial_notificaton/1","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#websocket_url/0","title":"PlausibleWeb.LayoutView.websocket_url/0","type":"function"},{"doc":"Phoenix LiveComponent for a combobox UI element with search and selection functionality. The component allows users to select an option from a list of options, which can be searched by typing in the input field. The component renders an input field with a dropdown anchor and a hidden input field for submitting the selected value. The number of options displayed in the dropdown is limited to 15 by default but can be customized. When a user types into the input field, the component searches the available options and provides suggestions based on the input. Any module exposing suggest/2 function can be supplied via suggest_mod attribute - see the provided ComboBox.StaticSearch .","ref":"PlausibleWeb.Live.Components.ComboBox.html","title":"PlausibleWeb.Live.Components.ComboBox","type":"module"},{"doc":"Attributes ref ( :string ) (required) suggestions ( :list ) - Defaults to [] . suggest_mod ( :atom ) (required) target ( :any ) creatable ( :boolean ) (required) display_value ( :string ) (required)","ref":"PlausibleWeb.Live.Components.ComboBox.html#dropdown/1","title":"PlausibleWeb.Live.Components.ComboBox.dropdown/1","type":"function"},{"doc":"Attributes id ( :any ) (required)","ref":"PlausibleWeb.Live.Components.ComboBox.html#dropdown_anchor/1","title":"PlausibleWeb.Live.Components.ComboBox.dropdown_anchor/1","type":"function"},{"doc":"Callback implementation for Phoenix.LiveComponent.handle_event/3 .","ref":"PlausibleWeb.Live.Components.ComboBox.html#handle_event/3","title":"PlausibleWeb.Live.Components.ComboBox.handle_event/3","type":"function"},{"doc":"Attributes display_value ( :string ) (required) submit_value ( :string ) (required) ref ( :string ) (required) target ( :any ) idx ( :integer ) (required) creatable ( :boolean ) - Defaults to false .","ref":"PlausibleWeb.Live.Components.ComboBox.html#option/1","title":"PlausibleWeb.Live.Components.ComboBox.option/1","type":"function"},{"doc":"Attributes placeholder ( :string ) - Defaults to "Select option or search by typing" . id ( :any ) (required) options ( :list ) (required) submit_name ( :string ) (required) display_value ( :string ) - Defaults to "" . submit_value ( :string ) - Defaults to "" . suggest_mod ( :atom ) (required) suggestions_limit ( :integer ) class ( :string ) - Defaults to "" . required ( :boolean ) - Defaults to false . creatable ( :boolean ) - Defaults to false .","ref":"PlausibleWeb.Live.Components.ComboBox.html#render/1","title":"PlausibleWeb.Live.Components.ComboBox.render/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Live.Components.ComboBox.html#select_option/4","title":"PlausibleWeb.Live.Components.ComboBox.select_option/4","type":"function"},{"doc":"Callback implementation for Phoenix.LiveComponent.update/2 .","ref":"PlausibleWeb.Live.Components.ComboBox.html#update/2","title":"PlausibleWeb.Live.Components.ComboBox.update/2","type":"function"},{"doc":"Default suggestion engine for the ComboBox component. Assumes, the user have already queried the database and the data set is small enough to be kept in state and filtered based on external input. Favours exact matches. Skips entries shorter than input. Allows fuzzy matching based on Jaro Distance.","ref":"PlausibleWeb.Live.Components.ComboBox.StaticSearch.html","title":"PlausibleWeb.Live.Components.ComboBox.StaticSearch","type":"module"},{"doc":"","ref":"PlausibleWeb.Live.Components.ComboBox.StaticSearch.html#suggest/2","title":"PlausibleWeb.Live.Components.ComboBox.StaticSearch.suggest/2","type":"function"},{"doc":"Flash component for LiveViews - works also when embedded within dead views","ref":"PlausibleWeb.Live.Flash.html","title":"PlausibleWeb.Live.Flash","type":"module"},{"doc":"","ref":"PlausibleWeb.Live.Flash.html#clear_flash_button/1","title":"PlausibleWeb.Live.Flash.clear_flash_button/1","type":"function"},{"doc":"Attributes on_close ( :any ) - Defaults to "lv:clear-flash" . Slots icon (required) title message (required)","ref":"PlausibleWeb.Live.Flash.html#flash/1","title":"PlausibleWeb.Live.Flash.flash/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Live.Flash.html#icon_error/1","title":"PlausibleWeb.Live.Flash.icon_error/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Live.Flash.html#icon_success/1","title":"PlausibleWeb.Live.Flash.icon_success/1","type":"function"},{"doc":"Callback implementation for Phoenix.LiveComponent.render/1 .","ref":"PlausibleWeb.Live.Flash.html#render/1","title":"PlausibleWeb.Live.Flash.render/1","type":"function"},{"doc":"LiveView allowing listing, creating and deleting funnels.","ref":"PlausibleWeb.Live.FunnelSettings.html","title":"PlausibleWeb.Live.FunnelSettings","type":"module"},{"doc":"Callback implementation for Phoenix.LiveView.handle_event/3 .","ref":"PlausibleWeb.Live.FunnelSettings.html#handle_event/3","title":"PlausibleWeb.Live.FunnelSettings.handle_event/3","type":"function"},{"doc":"Callback implementation for Phoenix.LiveView.handle_info/2 .","ref":"PlausibleWeb.Live.FunnelSettings.html#handle_info/2","title":"PlausibleWeb.Live.FunnelSettings.handle_info/2","type":"function"},{"doc":"Callback implementation for Phoenix.LiveView.mount/3 .","ref":"PlausibleWeb.Live.FunnelSettings.html#mount/3","title":"PlausibleWeb.Live.FunnelSettings.mount/3","type":"function"},{"doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"PlausibleWeb.Live.FunnelSettings.html#render/1","title":"PlausibleWeb.Live.FunnelSettings.render/1","type":"function"},{"doc":"Phoenix LiveComponent that renders a form used for setting up funnels. Makes use of dynamically placed PlausibleWeb.Live.FunnelSettings.ComboBox components to allow building searchable funnel definitions out of list of goals available.","ref":"PlausibleWeb.Live.FunnelSettings.Form.html","title":"PlausibleWeb.Live.FunnelSettings.Form","type":"module"},{"doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#add_step_button/1","title":"PlausibleWeb.Live.FunnelSettings.Form.add_step_button/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#cancel_button/1","title":"PlausibleWeb.Live.FunnelSettings.Form.cancel_button/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#error/1","title":"PlausibleWeb.Live.FunnelSettings.Form.error/1","type":"function"},{"doc":"Attributes at ( :integer ) (required) result ( :map ) (required)","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#evaluation/1","title":"PlausibleWeb.Live.FunnelSettings.Form.evaluation/1","type":"function"},{"doc":"Callback implementation for Phoenix.LiveView.handle_event/3 .","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#handle_event/3","title":"PlausibleWeb.Live.FunnelSettings.Form.handle_event/3","type":"function"},{"doc":"Callback implementation for Phoenix.LiveView.handle_info/2 .","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#handle_info/2","title":"PlausibleWeb.Live.FunnelSettings.Form.handle_info/2","type":"function"},{"doc":"Attributes field ( Phoenix.HTML.FormField )","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#input/1","title":"PlausibleWeb.Live.FunnelSettings.Form.input/1","type":"function"},{"doc":"Callback implementation for Phoenix.LiveView.mount/3 .","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#mount/3","title":"PlausibleWeb.Live.FunnelSettings.Form.mount/3","type":"function"},{"doc":"Attributes step_idx ( :integer ) (required)","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#remove_step_button/1","title":"PlausibleWeb.Live.FunnelSettings.Form.remove_step_button/1","type":"function"},{"doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#render/1","title":"PlausibleWeb.Live.FunnelSettings.Form.render/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#submit_button/1","title":"PlausibleWeb.Live.FunnelSettings.Form.submit_button/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#submit_button_inactive/1","title":"PlausibleWeb.Live.FunnelSettings.Form.submit_button_inactive/1","type":"function"},{"doc":"Phoenix LiveComponent module that renders a list of funnels with their names and the number of steps they have. Each funnel is displayed with a delete button, which triggers a confirmation message before deleting the funnel from the UI. If there are no funnels configured for the site, a message is displayed indicating so.","ref":"PlausibleWeb.Live.FunnelSettings.List.html","title":"PlausibleWeb.Live.FunnelSettings.List","type":"module"},{"doc":"Callback implementation for Phoenix.LiveComponent.render/1 .","ref":"PlausibleWeb.Live.FunnelSettings.List.html#render/1","title":"PlausibleWeb.Live.FunnelSettings.List.render/1","type":"function"},{"doc":"MJML rendered for the weekly report e-mail","ref":"PlausibleWeb.MJML.WeeklyReport.html","title":"PlausibleWeb.MJML.WeeklyReport","type":"module"},{"doc":"Returns the raw MJML template. Useful for debugging rendering issues.","ref":"PlausibleWeb.MJML.WeeklyReport.html#debug_mjml_template/0","title":"PlausibleWeb.MJML.WeeklyReport.debug_mjml_template/0","type":"function"},{"doc":"Safely render the MJML template using Phoenix.HTML","ref":"PlausibleWeb.MJML.WeeklyReport.html#render/1","title":"PlausibleWeb.MJML.WeeklyReport.render/1","type":"function"},{"doc":"","ref":"PlausibleWeb.PageController.html","title":"PlausibleWeb.PageController","type":"module"},{"doc":"The root path is never accessible in Plausible.Cloud because it is handled by the upstream reverse proxy. This controller action is only ever triggered in self-hosted Plausible.","ref":"PlausibleWeb.PageController.html#index/2","title":"PlausibleWeb.PageController.index/2","type":"function"},{"doc":"","ref":"PlausibleWeb.PageView.html","title":"PlausibleWeb.PageView","type":"module"},{"doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.PageView.html#__resource__/0","title":"PlausibleWeb.PageView.__resource__/0","type":"function"},{"doc":"","ref":"PlausibleWeb.PageView.html#index.html/1","title":"PlausibleWeb.PageView.index.html/1","type":"function"},{"doc":"Renders the given template locally.","ref":"PlausibleWeb.PageView.html#render/2","title":"PlausibleWeb.PageView.render/2","type":"function"},{"doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"PlausibleWeb.PageView.html#template_not_found/2","title":"PlausibleWeb.PageView.template_not_found/2","type":"function"},{"doc":"Rejects bot requests by any means available. We're adding x-robots-tag to the response header and annotate the conn with "noindex, nofollow" under private.robots key. The only exception is, if the request is trying to access our live demo at plausible.io/plausible.io - in which case we'll allow indexing, but deny following links and skip the bot detection, in kind robots we trust.","ref":"PlausibleWeb.Plugs.NoRobots.html","title":"PlausibleWeb.Plugs.NoRobots","type":"module"},{"doc":"A Plug.Session adapter that allows configuration at runtime. Sadly, the plug being wrapped has no MFA option for dynamic configuration. This is currently used so we can dynamically pass the :domain and have cookies planted across one root domain.","ref":"PlausibleWeb.Plugs.RuntimeSessionAdapter.html","title":"PlausibleWeb.Plugs.RuntimeSessionAdapter","type":"module"},{"doc":"","ref":"PlausibleWeb.RefInspector.html","title":"PlausibleWeb.RefInspector","type":"module"},{"doc":"","ref":"PlausibleWeb.RefInspector.html#parse/1","title":"PlausibleWeb.RefInspector.parse/1","type":"function"},{"doc":"","ref":"PlausibleWeb.RefInspector.html#right_uri?/1","title":"PlausibleWeb.RefInspector.right_uri?/1","type":"function"},{"doc":"","ref":"PlausibleWeb.RemoteIp.html","title":"PlausibleWeb.RemoteIp","type":"module"},{"doc":"","ref":"PlausibleWeb.RemoteIp.html#get/1","title":"PlausibleWeb.RemoteIp.get/1","type":"function"},{"doc":"","ref":"PlausibleWeb.RequireAccountPlug.html","title":"PlausibleWeb.RequireAccountPlug","type":"module"},{"doc":"","ref":"PlausibleWeb.RequireAccountPlug.html#call/2","title":"PlausibleWeb.RequireAccountPlug.call/2","type":"function"},{"doc":"","ref":"PlausibleWeb.RequireAccountPlug.html#init/1","title":"PlausibleWeb.RequireAccountPlug.init/1","type":"function"},{"doc":"","ref":"PlausibleWeb.RequireLoggedOutPlug.html","title":"PlausibleWeb.RequireLoggedOutPlug","type":"module"},{"doc":"","ref":"PlausibleWeb.RequireLoggedOutPlug.html#call/2","title":"PlausibleWeb.RequireLoggedOutPlug.call/2","type":"function"},{"doc":"","ref":"PlausibleWeb.RequireLoggedOutPlug.html#init/1","title":"PlausibleWeb.RequireLoggedOutPlug.init/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Router.html","title":"PlausibleWeb.Router","type":"module"},{"doc":"","ref":"PlausibleWeb.Router.html#api/2","title":"PlausibleWeb.Router.api/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Router.html#browser/2","title":"PlausibleWeb.Router.browser/2","type":"function"},{"doc":"Callback invoked by Plug on every request.","ref":"PlausibleWeb.Router.html#call/2","title":"PlausibleWeb.Router.call/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Router.html#csrf/2","title":"PlausibleWeb.Router.csrf/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Router.html#flags/2","title":"PlausibleWeb.Router.flags/2","type":"function"},{"doc":"Callback required by Plug that initializes the router for serving web requests.","ref":"PlausibleWeb.Router.html#init/1","title":"PlausibleWeb.Router.init/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Router.html#internal_stats_api/2","title":"PlausibleWeb.Router.internal_stats_api/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Router.html#kaffy_browser/2","title":"PlausibleWeb.Router.kaffy_browser/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Router.html#public_api/2","title":"PlausibleWeb.Router.public_api/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Router.html#shared_link/2","title":"PlausibleWeb.Router.shared_link/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SessionTimeoutPlug.html","title":"PlausibleWeb.SessionTimeoutPlug","type":"module"},{"doc":"","ref":"PlausibleWeb.SessionTimeoutPlug.html#call/2","title":"PlausibleWeb.SessionTimeoutPlug.call/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SessionTimeoutPlug.html#init/1","title":"PlausibleWeb.SessionTimeoutPlug.init/1","type":"function"},{"doc":"This controller deals with user management via the UI in Site Settings -> People. It's important to enforce permissions in this controller. Owner - Can manage users, can trigger a 'transfer ownership' request Admin - Can manage users Viewer - Can not access user management settings Anyone - Can accept invitations Everything else should be explicitly disallowed.","ref":"PlausibleWeb.Site.MembershipController.html","title":"PlausibleWeb.Site.MembershipController","type":"module"},{"doc":"","ref":"PlausibleWeb.Site.MembershipController.html#invite_member/2","title":"PlausibleWeb.Site.MembershipController.invite_member/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Site.MembershipController.html#invite_member_form/2","title":"PlausibleWeb.Site.MembershipController.invite_member_form/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Site.MembershipController.html#remove_member/2","title":"PlausibleWeb.Site.MembershipController.remove_member/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Site.MembershipController.html#transfer_ownership/2","title":"PlausibleWeb.Site.MembershipController.transfer_ownership/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Site.MembershipController.html#transfer_ownership_form/2","title":"PlausibleWeb.Site.MembershipController.transfer_ownership_form/2","type":"function"},{"doc":"Updates the role of a user. The user being updated could be the same or different from the user taking the action. When updating the role, it's important to enforce permissions: Owner - Can update anyone's role except for themselves. If they want to change their own role, they have to use the 'transfer ownership' feature. Admin - Can update anyone's role except for owners. Can downgrade their own access to 'viewer'. Can promote a viewer to admin.","ref":"PlausibleWeb.Site.MembershipController.html#update_role/2","title":"PlausibleWeb.Site.MembershipController.update_role/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Site.MembershipView.html","title":"PlausibleWeb.Site.MembershipView","type":"module"},{"doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.Site.MembershipView.html#__resource__/0","title":"PlausibleWeb.Site.MembershipView.__resource__/0","type":"function"},{"doc":"","ref":"PlausibleWeb.Site.MembershipView.html#invite_member_form.html/1","title":"PlausibleWeb.Site.MembershipView.invite_member_form.html/1","type":"function"},{"doc":"Renders the given template locally.","ref":"PlausibleWeb.Site.MembershipView.html#render/2","title":"PlausibleWeb.Site.MembershipView.render/2","type":"function"},{"doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"PlausibleWeb.Site.MembershipView.html#template_not_found/2","title":"PlausibleWeb.Site.MembershipView.template_not_found/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Site.MembershipView.html#transfer_ownership_form.html/1","title":"PlausibleWeb.Site.MembershipView.transfer_ownership_form.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html","title":"PlausibleWeb.SiteController","type":"module"},{"doc":"","ref":"PlausibleWeb.SiteController.html#add_monthly_report_recipient/2","title":"PlausibleWeb.SiteController.add_monthly_report_recipient/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#add_snippet/2","title":"PlausibleWeb.SiteController.add_snippet/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#add_snippet_after_domain_change/2","title":"PlausibleWeb.SiteController.add_snippet_after_domain_change/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#add_spike_notification_recipient/2","title":"PlausibleWeb.SiteController.add_spike_notification_recipient/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#add_weekly_report_recipient/2","title":"PlausibleWeb.SiteController.add_weekly_report_recipient/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#change_domain/2","title":"PlausibleWeb.SiteController.change_domain/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#change_domain_submit/2","title":"PlausibleWeb.SiteController.change_domain_submit/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#create_goal/2","title":"PlausibleWeb.SiteController.create_goal/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#create_shared_link/2","title":"PlausibleWeb.SiteController.create_shared_link/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#create_site/2","title":"PlausibleWeb.SiteController.create_site/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#delete_custom_domain/2","title":"PlausibleWeb.SiteController.delete_custom_domain/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#delete_goal/2","title":"PlausibleWeb.SiteController.delete_goal/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#delete_google_auth/2","title":"PlausibleWeb.SiteController.delete_google_auth/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#delete_shared_link/2","title":"PlausibleWeb.SiteController.delete_shared_link/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#delete_site/2","title":"PlausibleWeb.SiteController.delete_site/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#disable_monthly_report/2","title":"PlausibleWeb.SiteController.disable_monthly_report/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#disable_spike_notification/2","title":"PlausibleWeb.SiteController.disable_spike_notification/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#disable_weekly_report/2","title":"PlausibleWeb.SiteController.disable_weekly_report/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#edit_shared_link/2","title":"PlausibleWeb.SiteController.edit_shared_link/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#enable_monthly_report/2","title":"PlausibleWeb.SiteController.enable_monthly_report/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#enable_spike_notification/2","title":"PlausibleWeb.SiteController.enable_spike_notification/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#enable_weekly_report/2","title":"PlausibleWeb.SiteController.enable_weekly_report/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#forget_imported/2","title":"PlausibleWeb.SiteController.forget_imported/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#import_from_google/2","title":"PlausibleWeb.SiteController.import_from_google/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#import_from_google_confirm/2","title":"PlausibleWeb.SiteController.import_from_google_confirm/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#import_from_google_user_metric_notice/2","title":"PlausibleWeb.SiteController.import_from_google_user_metric_notice/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#import_from_google_view_id/2","title":"PlausibleWeb.SiteController.import_from_google_view_id/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#import_from_google_view_id_form/2","title":"PlausibleWeb.SiteController.import_from_google_view_id_form/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#index/2","title":"PlausibleWeb.SiteController.index/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#make_private/2","title":"PlausibleWeb.SiteController.make_private/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#make_public/2","title":"PlausibleWeb.SiteController.make_public/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#new/2","title":"PlausibleWeb.SiteController.new/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#new_goal/2","title":"PlausibleWeb.SiteController.new_goal/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#new_shared_link/2","title":"PlausibleWeb.SiteController.new_shared_link/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#remove_monthly_report_recipient/2","title":"PlausibleWeb.SiteController.remove_monthly_report_recipient/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#remove_spike_notification_recipient/2","title":"PlausibleWeb.SiteController.remove_spike_notification_recipient/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#remove_weekly_report_recipient/2","title":"PlausibleWeb.SiteController.remove_weekly_report_recipient/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#reset_stats/2","title":"PlausibleWeb.SiteController.reset_stats/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#settings/2","title":"PlausibleWeb.SiteController.settings/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#settings_custom_domain/2","title":"PlausibleWeb.SiteController.settings_custom_domain/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#settings_danger_zone/2","title":"PlausibleWeb.SiteController.settings_danger_zone/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#settings_email_reports/2","title":"PlausibleWeb.SiteController.settings_email_reports/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#settings_funnels/2","title":"PlausibleWeb.SiteController.settings_funnels/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#settings_general/2","title":"PlausibleWeb.SiteController.settings_general/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#settings_goals/2","title":"PlausibleWeb.SiteController.settings_goals/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#settings_people/2","title":"PlausibleWeb.SiteController.settings_people/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#settings_search_console/2","title":"PlausibleWeb.SiteController.settings_search_console/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#settings_visibility/2","title":"PlausibleWeb.SiteController.settings_visibility/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#update_feature_visibility/2","title":"PlausibleWeb.SiteController.update_feature_visibility/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#update_google_auth/2","title":"PlausibleWeb.SiteController.update_google_auth/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#update_settings/2","title":"PlausibleWeb.SiteController.update_settings/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#update_shared_link/2","title":"PlausibleWeb.SiteController.update_shared_link/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#update_spike_notification/2","title":"PlausibleWeb.SiteController.update_spike_notification/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html","title":"PlausibleWeb.SiteView","type":"module"},{"doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.SiteView.html#__resource__/0","title":"PlausibleWeb.SiteView.__resource__/0","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#base_domain/0","title":"PlausibleWeb.SiteView.base_domain/0","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#change_domain.html/1","title":"PlausibleWeb.SiteView.change_domain.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#edit_shared_link.html/1","title":"PlausibleWeb.SiteView.edit_shared_link.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#goal_name/1","title":"PlausibleWeb.SiteView.goal_name/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#google_logo/1","title":"PlausibleWeb.SiteView.google_logo/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#gravatar/2","title":"PlausibleWeb.SiteView.gravatar/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#import_from_google_confirm.html/1","title":"PlausibleWeb.SiteView.import_from_google_confirm.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#import_from_google_user_metric_form.html/1","title":"PlausibleWeb.SiteView.import_from_google_user_metric_form.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#import_from_google_view_id_form.html/1","title":"PlausibleWeb.SiteView.import_from_google_view_id_form.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#index.html/1","title":"PlausibleWeb.SiteView.index.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#new.html/1","title":"PlausibleWeb.SiteView.new.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#new_goal.html/1","title":"PlausibleWeb.SiteView.new_goal.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#new_shared_link.html/1","title":"PlausibleWeb.SiteView.new_shared_link.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#plausible_url/0","title":"PlausibleWeb.SiteView.plausible_url/0","type":"function"},{"doc":"Renders the given template locally.","ref":"PlausibleWeb.SiteView.html#render/2","title":"PlausibleWeb.SiteView.render/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#render_snippet/1","title":"PlausibleWeb.SiteView.render_snippet/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#settings_custom_domain.html/1","title":"PlausibleWeb.SiteView.settings_custom_domain.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#settings_danger_zone.html/1","title":"PlausibleWeb.SiteView.settings_danger_zone.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#settings_email_reports.html/1","title":"PlausibleWeb.SiteView.settings_email_reports.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#settings_funnels.html/1","title":"PlausibleWeb.SiteView.settings_funnels.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#settings_general.html/1","title":"PlausibleWeb.SiteView.settings_general.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#settings_goals.html/1","title":"PlausibleWeb.SiteView.settings_goals.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#settings_people.html/1","title":"PlausibleWeb.SiteView.settings_people.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#settings_search_console.html/1","title":"PlausibleWeb.SiteView.settings_search_console.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#settings_visibility.html/1","title":"PlausibleWeb.SiteView.settings_visibility.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#shared_link_dest/2","title":"PlausibleWeb.SiteView.shared_link_dest/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#snippet.html/1","title":"PlausibleWeb.SiteView.snippet.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#snippet_after_domain_change.html/1","title":"PlausibleWeb.SiteView.snippet_after_domain_change.html/1","type":"function"},{"doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"PlausibleWeb.SiteView.html#template_not_found/2","title":"PlausibleWeb.SiteView.template_not_found/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#with_indefinite_article/1","title":"PlausibleWeb.SiteView.with_indefinite_article/1","type":"function"},{"doc":"This controller is responsible for rendering stats dashboards. The stats dashboards are currently the only part of the app that uses client-side rendering. Since the dashboards are heavily interactive, they are built with React which is an appropriate choice for highly interactive browser UIs. sequenceDiagram Browser->>StatsController: GET /mydomain.com StatsController-->>Browser: StatsView.render(\"stats.html\") Note left of Browser: ReactDom.render(Dashboard) Browser -) Api.StatsController: GET /api/stats/mydomain.com/top-stats Api.StatsController --) Browser: {\"top_stats\": [...]} Note left of Browser: TopStats.render() Browser -) Api.StatsController: GET /api/stats/mydomain.com/main-graph Api.StatsController --) Browser: [{\"plot\": [...], \"labels\": [...]}, ...] Note left of Browser: VisitorGraph.render() Browser -) Api.StatsController: GET /api/stats/mydomain.com/sources Api.StatsController --) Browser: [{\"name\": \"Google\", \"visitors\": 292150}, ...] Note left of Browser: Sources.render() Note over Browser,StatsController: And so on, for all reports in the viewport This reasoning for this sequence is as follows: First paint is fast because it doesn't do any data aggregation yet - good UX The basic structure of the dashboard is rendered with spinners before reports are ready - good UX Rendering on the frontend allows for maximum interactivity. Re-rendering and re-fetching can be as granular as needed. Routing on the frontend allows the user to navigate the dashboard without reloading the page and losing context Rendering on the frontend allows caching results in the browser to reduce pressure on backends and storage 3.1 No client-side caching has been implemented yet. This is still theoretical. See https://github.com/plausible/analytics/discussions/1278 3.2 This is a big potential opportunity, because analytics data is mostly immutable. Clients can cache all historical data. Since frontend rendering & navigation is harder to build and maintain than regular server-rendered HTML, we don't use SPA-style rendering anywhere else .The only place currently where the benefits outweigh the costs is the dashboard.","ref":"PlausibleWeb.StatsController.html","title":"PlausibleWeb.StatsController","type":"module"},{"doc":"","ref":"PlausibleWeb.StatsController.html#authenticate_shared_link/2","title":"PlausibleWeb.StatsController.authenticate_shared_link/2","type":"function"},{"doc":"The export is limited to 300 entries for other reports and 100 entries for pages because bigger result sets start causing failures. Since we request data like time on page or bounce_rate for pages in a separate query using the IN filter, it causes the requests to balloon in payload size.","ref":"PlausibleWeb.StatsController.html#csv_export/2","title":"PlausibleWeb.StatsController.csv_export/2","type":"function"},{"doc":"Authorizes and renders a shared link: Shared link with no password protection: needs to just make sure the shared link entry is still in our database. This check makes sure shared link access can be revoked by the site admins. If the shared link exists, render it directly. Shared link with password protection: Same checks as without the password, but an extra step is taken to protect the page with a password. When the user passes the password challenge, a cookie is set with Plausible.Auth.Token.sign_shared_link(). The cookie allows the user to access the dashboard for 24 hours without entering the password again. ### Backwards compatibility The URL format for shared links was changed in this pull request in order to make the URLs easier to bookmark. The old format is supported along with the new in order to not break old links. See: https://plausible.io/docs/shared-links","ref":"PlausibleWeb.StatsController.html#shared_link/2","title":"PlausibleWeb.StatsController.shared_link/2","type":"function"},{"doc":"","ref":"PlausibleWeb.StatsController.html#stats/2","title":"PlausibleWeb.StatsController.stats/2","type":"function"},{"doc":"","ref":"PlausibleWeb.StatsView.html","title":"PlausibleWeb.StatsView","type":"module"},{"doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.StatsView.html#__resource__/0","title":"PlausibleWeb.StatsView.__resource__/0","type":"function"},{"doc":"","ref":"PlausibleWeb.StatsView.html#base_domain/0","title":"PlausibleWeb.StatsView.base_domain/0","type":"function"},{"doc":"","ref":"PlausibleWeb.StatsView.html#large_number_format/1","title":"PlausibleWeb.StatsView.large_number_format/1","type":"function"},{"doc":"","ref":"PlausibleWeb.StatsView.html#plausible_url/0","title":"PlausibleWeb.StatsView.plausible_url/0","type":"function"},{"doc":"Returns a readable stats URL. Native Phoenix router functions percent-encode all diacritics, resulting in ugly URLs, e.g. https://plausible.io/café.com transforms into https://plausible.io/caf%C3%A9.com . This function encodes only the slash ( / ) character from the site's domain. Examples iex> PlausibleWeb.StatsView.pretty_stats_url(%Plausible.Site{domain: "user.gittea.io/repo"}) " http://localhost:8000/user.gittea.io%2Frepo" iex> PlausibleWeb.StatsView.pretty_stats_url(%Plausible.Site{domain: "anakin.test"}) " http://localhost:8000/anakin.test" iex> PlausibleWeb.StatsView.pretty_stats_url(%Plausible.Site{domain: "café.test"}) " http://localhost:8000/café.test"","ref":"PlausibleWeb.StatsView.html#pretty_stats_url/1","title":"PlausibleWeb.StatsView.pretty_stats_url/1","type":"function"},{"doc":"Renders the given template locally.","ref":"PlausibleWeb.StatsView.html#render/2","title":"PlausibleWeb.StatsView.render/2","type":"function"},{"doc":"","ref":"PlausibleWeb.StatsView.html#shared_link_password.html/1","title":"PlausibleWeb.StatsView.shared_link_password.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.StatsView.html#site_locked.html/1","title":"PlausibleWeb.StatsView.site_locked.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.StatsView.html#stats.html/1","title":"PlausibleWeb.StatsView.stats.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.StatsView.html#stats_container_class/1","title":"PlausibleWeb.StatsView.stats_container_class/1","type":"function"},{"doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"PlausibleWeb.StatsView.html#template_not_found/2","title":"PlausibleWeb.StatsView.template_not_found/2","type":"function"},{"doc":"","ref":"PlausibleWeb.StatsView.html#waiting_first_pageview.html/1","title":"PlausibleWeb.StatsView.waiting_first_pageview.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Tracker.html","title":"PlausibleWeb.Tracker","type":"module"},{"doc":"","ref":"PlausibleWeb.Tracker.html#call/2","title":"PlausibleWeb.Tracker.call/2","type":"function"},{"doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"PlausibleWeb.Tracker.html#child_spec/1","title":"PlausibleWeb.Tracker.child_spec/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Tracker.html#init/1","title":"PlausibleWeb.Tracker.init/1","type":"function"},{"doc":"","ref":"PlausibleWeb.UnsubscribeController.html","title":"PlausibleWeb.UnsubscribeController","type":"module"},{"doc":"","ref":"PlausibleWeb.UnsubscribeController.html#monthly_report/2","title":"PlausibleWeb.UnsubscribeController.monthly_report/2","type":"function"},{"doc":"","ref":"PlausibleWeb.UnsubscribeController.html#weekly_report/2","title":"PlausibleWeb.UnsubscribeController.weekly_report/2","type":"function"},{"doc":"","ref":"PlausibleWeb.UnsubscribeView.html","title":"PlausibleWeb.UnsubscribeView","type":"module"},{"doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.UnsubscribeView.html#__resource__/0","title":"PlausibleWeb.UnsubscribeView.__resource__/0","type":"function"},{"doc":"Renders the given template locally.","ref":"PlausibleWeb.UnsubscribeView.html#render/2","title":"PlausibleWeb.UnsubscribeView.render/2","type":"function"},{"doc":"","ref":"PlausibleWeb.UnsubscribeView.html#success.html/1","title":"PlausibleWeb.UnsubscribeView.success.html/1","type":"function"},{"doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"PlausibleWeb.UnsubscribeView.html#template_not_found/2","title":"PlausibleWeb.UnsubscribeView.template_not_found/2","type":"function"},{"doc":"Simple Metrics | Lightweight Script | Privacy Focused | Open Source | Docs | Contributing Plausible Analytics is a simple, lightweight (< 1 KB), open source and privacy-friendly alternative to Google Analytics. It doesn’t use cookies and is fully compliant with GDPR, CCPA and PECR. You can self-host or have us run Plausible for you in the cloud. Here's the live demo of our own website stats . Made and hosted in the EU 🇪🇺 We are dedicated to making web analytics more privacy-friendly. Our mission is to reduce corporate surveillance by providing an alternative web analytics tool which doesn’t come from the AdTech world. We are completely independent and solely funded by our subscribers.","ref":"readme.html","title":"Introduction","type":"extras"},{"doc":"Here's what makes Plausible a great Google Analytics alternative and why we're trusted by thousands of paying subscribers to deliver their website and business insights: Clutter Free : Plausible Analytics provides simple web analytics and it cuts through the noise. No layers of menus, no need for custom reports. Get all the important insights on one single page. No training necessary. GDPR/CCPA/PECR compliant : Measure traffic, not individuals. No personal data or IP addresses are ever stored in our database. We don't use cookies or any other persistent identifiers. Read more about our data policy Lightweight : Plausible Analytics works by loading a script on your website, like Google Analytics. Our script is 45x smaller , making your website quicker to load. Email or Slack reports : Keep an eye on your traffic with weekly and/or monthly email or Slack reports. You can also get traffic spike notifications. Open website stats : You have the option to be transparent and open your web analytics to everyone. Your website stats are private by default but you can choose to make them public so anyone with your custom link can view them. Define key goals and track conversions : Set custom events or page URLs as your goals and see how they convert over time to understand and identify the trends that matter. Includes easy ways to track outbound link clicks and 404 error pages. Search keywords : Integrate your dashboard with Google Search Console to get the most accurate reporting on your search keywords. SPA support : Plausible is built with modern web frameworks in mind and it works automatically with any pushState based router on the frontend. We also support frameworks that use the URL hash for routing. See our documentation . Interested to learn more? Read more on our website , learn more about the team and the goals of the project on our about page or explore the documentation .","ref":"readme.html#why-plausible","title":"Introduction - Why Plausible?","type":"extras"},{"doc":"Plausible Analytics is an independently owned and actively developed project. To keep the project development going, to stay in business, to continue putting effort into building a better product and to cover our costs, we need to charge a fee. Google Analytics is free because Google has built their company and their wealth by collecting and analyzing huge amounts of personal information from web users and using these personal and behavioral insights to sell advertisements. Plausible has no part in that business model. No personal data is being collected and analyzed either. With Plausible, you 100% own and control all of your website data. This data is not being shared with or sold to any third-parties. We choose the subscription business model rather than the business model of surveillance capitalism. See reasons why we believe you should stop using Google Analytics on your website .","ref":"readme.html#why-is-plausible-analytics-cloud-not-free-like-google-analytics","title":"Introduction - Why is Plausible Analytics Cloud not free like Google Analytics?","type":"extras"},{"doc":"The easiest way to get started with Plausible is with our official managed service in the cloud . It takes 2 minutes to start counting your stats with a worldwide CDN, high availability, backups, security and maintenance all done for you by us. In order to be compliant with the GDPR and the Schrems II ruling, all visitor data for our managed service in the cloud is exclusively processed on servers and cloud infrastructure owned and operated by European providers. Your website data never leaves the EU. Our managed hosting can save a substantial amount of developer time and resources. For most sites this ends up being the best value option and the revenue goes to funding the maintenance and further development of Plausible. So you’ll be supporting open source software and getting a great service! Can Plausible Analytics be self-hosted? Plausible is fully open source web analytics and we have a free as in beer Plausible Analytics Self-Hosted solution. It’s exactly the same product as our cloud solution with a less frequent release schedule (think of it as a long term support release). Bug fixes and new features are released to the cloud version several times per week. Features are battle-tested in the cloud which allows us to fix any bugs before the general self-hosted release. Every six months or so we combine all the changes into a new self-hosted release. The main difference between the two is that the self-hosted version you have to install, host and manage yourself on your own infrastructure while the cloud version we manage everything for your ease and convenience. Here's the overview of all the differences: Plausible Cloud Self-Hosting Hosting Easy and convenient. It takes 2 minutes to start counting your stats with a worldwide CDN, high availability, backups, security and maintenance all done for you by us. We manage everything so you don’t have to worry about anything and can focus on your stats. You do it all yourself. You need to get a server and you need to manage your infrastructure. You are responsible for installation, maintenance, upgrades, server capacity, uptime, backup, security, stability, consistency, loading time and so on. Storage All visitor data is exclusively processed on EU-owned cloud infrastructure. We keep your site data on a secure, encrypted and green energy powered server in Germany. This ensures that your site data is protected by the strict European Union data privacy laws and ensures compliance with GDPR. Your website data never leaves the EU. You have full control and can host your instance on any server in any country that you wish. Host it on a server in your basement or host it with any cloud provider wherever you want, even those that are not GDPR compliant. Releases Continuously developed and improved with new features and updates multiple times per week. It's a long term release published approximately twice per year so latest features won't be immediately available. You can see all the currently unreleased features in the changelog . Raw data You see all your site stats and metrics on our modern-looking, simple to use and fast loading dashboard. You can only see the stats aggregated in the dashboard. You can download the stats using the CSV export , stats API or tools such as the Data Studio Connector . Do you want access to the raw data? Self-hosting gives you that option. You can take the data directly from the ClickHouse database. Premium Support Real support delivered by real human beings who build and maintain Plausible. Premium support is not included. Self-hosting is community supported only. Costs There's a cost associated with providing an analytics service so we charge a subscription fee. We choose the subscription business model rather than the business model of surveillance capitalism. Your money funds further development of Plausible. You need to pay for your server, CDN, backups and whatever other cost there is associated with running the infrastructure. You never have to pay any fees to us. Your money goes to 3rd party companies with no connection to us. Interested in self-hosting Plausible on your server? Take a look at our self-hosting installation instructions . Plausible Self-Hosted is a community supported project and there are no guarantees that you will get support from the creators of Plausible to troubleshoot your self-hosting issues. There is a community supported forum where you can ask for help. Our only source of funding is our premium, managed service for running Plausible in the cloud. If you're looking for an alternative way to support the project, we've put together some sponsorship packages. If you choose to self-host Plausible you can become a sponsor which is a great way to give back to the community and to contribute to the long-term sustainability of the project.","ref":"readme.html#getting-started-with-plausible","title":"Introduction - Getting started with Plausible","type":"extras"},{"doc":"Plausible Analytics is a standard Elixir/Phoenix application backed by a PostgreSQL database for general data and a Clickhouse database for stats. On the frontend we use TailwindCSS for styling and React to make the dashboard interactive.","ref":"readme.html#technology","title":"Introduction - Technology","type":"extras"},{"doc":"For anyone wishing to contribute to Plausible, we recommend taking a look at our contributor guide .","ref":"readme.html#contributors","title":"Introduction - Contributors","type":"extras"},{"doc":"We welcome feedback from our community. We have a public roadmap driven by the features suggested by the community members. Take a look at our feedback board directly here on GitHub. Please let us know if you have any requests and vote on open issues so we can better prioritize. To stay up to date with all the latest news and product updates, make sure to follow us on Twitter , LinkedIn or Mastodon .","ref":"readme.html#feedback-roadmap","title":"Introduction - Feedback & Roadmap","type":"extras"},{"doc":"Plausible is open-source under the GNU Affero General Public License Version 3 (AGPLv3) or any later version. You can find it here . The only exception is our JavaScript tracker which gets included on your website. To avoid issues with AGPL virality, we've released the tracker under the MIT license. You can find it here .","ref":"readme.html#license","title":"Introduction - License","type":"extras"},{"doc":"We welcome everyone to contribute to Plausible. This document is to help you on setting up your environment, finding a task, and opening pull requests.","ref":"contributing.html","title":"Contributing","type":"extras"},{"doc":"The easiest way to get up and running is to install and use Docker for running both Postgres and Clickhouse. Make sure Docker, Elixir, Erlang and Node.js are all installed on your development machine. The .tool-versions file is available to use with asdf or similar tools. Start the environment Run both make postgres and make clickhouse . You can set up everything with make install , alternatively run each command separately: Run mix deps.get . This will download the required Elixir dependencies. Run mix ecto.create . This will create the required databases in both Postgres and Clickhouse. Run mix ecto.migrate to build the database schema. Run mix run priv/repo/seeds.exs to seed the database. Check the Seeds section for more. Run npm ci --prefix assets to install the required client-side dependencies. Run npm ci --prefix tracker to install the required tracker dependencies. Run npm run deploy --prefix tracker to generate tracker files in priv/tracker/js Run mix download_country_database to fetch geolocation database Run make server or mix phx.server to start the Phoenix server. The system is now available on localhost:8000 . Seeds You can optionally seed your database to automatically create an account and a site with stats: Run mix run priv/repo/seeds.exs to seed the database. Start the server with make server and navigate to http://localhost:8000/login . Log in with the following e-mail and password combination: user@plausible.test and plausible . You should now have a dummy.site site with generated stats. Alternatively, you can manually create a new account: Navigate to http://localhost:8000/register and fill in the form. Fill in the rest of the forms and for the domain use dummy.site Skip the JS snippet and click start collecting data. Run mix send_pageview from the terminal to generate a fake pageview event for the dummy site. You should now be all set! Stopping Docker containers Stop and remove the Postgres container with make postgres-stop . Stop and remove the Clickhouse container with make clickhouse-stop . Volumes are preserved. You'll find that the Postgres and Clickhouse state are retained when you bring them up again the next time: no need to re-register and so on. Note: Since we are deleting the containers, be careful when deleting volumes with docker volume prune . You might accidentally delete the database and would have to go through re-registration process. Pre-commit hooks pre-commit requires Python to be available locally and covers Elixir, JavaScript, and CSS. Set up with pip install --user pre-commit followed by pre-commit install . Conversely, if the prompts are far too bothersome, remove with pre-commit uninstall .","ref":"contributing.html#development-setup","title":"Contributing - Development setup","type":"extras"},{"doc":"Bugs can be found in our issue tracker . Issues are usually up for grabs. New features need to be discussed with the core team and the community first. If you're tackling a feature, please make sure it has been already discussed in the Discussions tab . We kindly ask contributors to use the discussion comment section to propose a solution before opening a pull request. Pull requests without an associated issue or discussion may still be merged, but we will focus on changes that have already been talked through.","ref":"contributing.html#finding-a-task","title":"Contributing - Finding a task","type":"extras"},{"doc":"This document explains the account locking feature from a technical perspective. Account locking happens when users have outgrown their accounts, and despite e-mail and dashboard alerts, don't upgrade after a grace period.","ref":"account-locking.html","title":"Account locking","type":"extras"},{"doc":"The Plausible.Workers.CheckUsage daily background job alerts users they have reached their subscription limits. This runs for outgrown users one day after their last billing date. When users reach the number of sites limit, or use >110% of their pageview limit for 2 consecutive billing cycles, the background job sends them an e-mail alert. The e-mail suggests a suitable subscription plan based on usage. For enterprise users, only an internal e-mail is sent to enterprise@plausible.io . The user is given 7 days to upgrade their account after the alert, and this is called grace period. The background starts this grace period by adding a users.grace_period JSON to the user record: // SELECT grace_period FROM users LIMIT 1 { "id": "1aa855bd-022d-4dfc-b572-6853442c3f19", "is_over": true, "end_date": "2022-03-09", "allowance_required": 100, "manual_lock": false } During this period, the following alert pops up on the dashboard for both standard and enterprise users: If the user upgrades to a suitable plan, the grace period is removed (check Plausible.Billing.subscription_updated/1 ), otherwise Account locking ) follows. For enterprise users, the grace period has a manual lock flag set to true, meaning enterprise accounts can only be locked/unlocked through the internal CRM.","ref":"account-locking.html#usage-alert-and-grace-period","title":"Account locking - Usage alert and grace period","type":"extras"},{"doc":"The grace period is checked daily by the Plausible.Workers.LockSites background job. For users that expired their grace period, sites.locked is is set to true , restricting access to dashboards. This does not stop event ingestion, so users can have their stats up to date when they finally upgrade.","ref":"account-locking.html#account-locking","title":"Account locking - Account locking","type":"extras"}] \ No newline at end of file diff --git a/dist/search_items-EA6D46AD.js b/dist/search_items-EA6D46AD.js new file mode 100644 index 000000000..54d13c816 --- /dev/null +++ b/dist/search_items-EA6D46AD.js @@ -0,0 +1 @@ +searchNodes=[{"doc":"","ref":"Mix.Tasks.AnalyzePlans.html","title":"Mix.Tasks.AnalyzePlans","type":"task"},{"doc":"Callback implementation for Mix.Task.run/1 .","ref":"Mix.Tasks.AnalyzePlans.html#run/1","title":"Mix.Tasks.AnalyzePlans.run/1","type":"function"},{"doc":"","ref":"Mix.Tasks.CleanClickhouse.html","title":"Mix.Tasks.CleanClickhouse","type":"task"},{"doc":"Callback implementation for Mix.Task.run/1 .","ref":"Mix.Tasks.CleanClickhouse.html#run/1","title":"Mix.Tasks.CleanClickhouse.run/1","type":"function"},{"doc":"","ref":"Mix.Tasks.CreateFreeSubscription.html","title":"Mix.Tasks.CreateFreeSubscription","type":"task"},{"doc":"","ref":"Mix.Tasks.CreateFreeSubscription.html#execute/1","title":"Mix.Tasks.CreateFreeSubscription.execute/1","type":"function"},{"doc":"Callback implementation for Mix.Task.run/1 .","ref":"Mix.Tasks.CreateFreeSubscription.html#run/1","title":"Mix.Tasks.CreateFreeSubscription.run/1","type":"function"},{"doc":"This task downloads the Country Lite database from DB-IP for self-hosted or development purposes. Plausible Cloud runs a paid version of DB-IP with more detailed geolocation data.","ref":"Mix.Tasks.DownloadCountryDatabase.html","title":"Mix.Tasks.DownloadCountryDatabase","type":"task"},{"doc":"Callback implementation for Mix.Task.run/1 .","ref":"Mix.Tasks.DownloadCountryDatabase.html#run/1","title":"Mix.Tasks.DownloadCountryDatabase.run/1","type":"function"},{"doc":"","ref":"Mix.Tasks.GenerateReferrerFavicons.html","title":"Mix.Tasks.GenerateReferrerFavicons","type":"task"},{"doc":"Callback implementation for Mix.Task.run/1 .","ref":"Mix.Tasks.GenerateReferrerFavicons.html#run/1","title":"Mix.Tasks.GenerateReferrerFavicons.run/1","type":"function"},{"doc":"","ref":"Mix.Tasks.PullSandboxSubscription.html","title":"Mix.Tasks.PullSandboxSubscription","type":"task"},{"doc":"Callback implementation for Mix.Task.run/1 .","ref":"Mix.Tasks.PullSandboxSubscription.html#run/1","title":"Mix.Tasks.PullSandboxSubscription.run/1","type":"function"},{"doc":"It's often necessary to generate fake events for development and testing purposes. This Mix Task provides a quick and easy way to generate a pageview or custom event, either in your development environment or a remote Plausible instance. See Mix.Tasks.SendPageview.usage/1 for more detailed documentation.","ref":"Mix.Tasks.SendPageview.html","title":"Mix.Tasks.SendPageview","type":"task"},{"doc":"Callback implementation for Mix.Task.run/1 .","ref":"Mix.Tasks.SendPageview.html#run/1","title":"Mix.Tasks.SendPageview.run/1","type":"function"},{"doc":"","ref":"ObanErrorReporter.html","title":"ObanErrorReporter","type":"module"},{"doc":"","ref":"ObanErrorReporter.html#handle_event/4","title":"ObanErrorReporter.handle_event/4","type":"function"},{"doc":"Plausible keeps the contexts that define your domain and business logic. Contexts are also responsible for managing your data, regardless if it comes from the database, an external API or others.","ref":"Plausible.html","title":"Plausible","type":"module"},{"doc":"Clickhouse access with async inserts enabled","ref":"Plausible.AsyncInsertRepo.html","title":"Plausible.AsyncInsertRepo","type":"module"},{"doc":"Callback implementation for Ecto.Repo.aggregate/3 .","ref":"Plausible.AsyncInsertRepo.html#aggregate/3","title":"Plausible.AsyncInsertRepo.aggregate/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.aggregate/4 .","ref":"Plausible.AsyncInsertRepo.html#aggregate/4","title":"Plausible.AsyncInsertRepo.aggregate/4","type":"function"},{"doc":"Callback implementation for Ecto.Repo.all/2 .","ref":"Plausible.AsyncInsertRepo.html#all/2","title":"Plausible.AsyncInsertRepo.all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checked_out?/0 .","ref":"Plausible.AsyncInsertRepo.html#checked_out?/0","title":"Plausible.AsyncInsertRepo.checked_out?/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checkout/2 .","ref":"Plausible.AsyncInsertRepo.html#checkout/2","title":"Plausible.AsyncInsertRepo.checkout/2","type":"function"},{"doc":"","ref":"Plausible.AsyncInsertRepo.html#child_spec/1","title":"Plausible.AsyncInsertRepo.child_spec/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.config/0 .","ref":"Plausible.AsyncInsertRepo.html#config/0","title":"Plausible.AsyncInsertRepo.config/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.default_options/1 .","ref":"Plausible.AsyncInsertRepo.html#default_options/1","title":"Plausible.AsyncInsertRepo.default_options/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete/2 .","ref":"Plausible.AsyncInsertRepo.html#delete/2","title":"Plausible.AsyncInsertRepo.delete/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete!/2 .","ref":"Plausible.AsyncInsertRepo.html#delete!/2","title":"Plausible.AsyncInsertRepo.delete!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete_all/2 .","ref":"Plausible.AsyncInsertRepo.html#delete_all/2","title":"Plausible.AsyncInsertRepo.delete_all/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that forces all connections in the pool to disconnect within the given interval. See Ecto.Adapters.SQL.disconnect_all/3 for more information.","ref":"Plausible.AsyncInsertRepo.html#disconnect_all/2","title":"Plausible.AsyncInsertRepo.disconnect_all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.exists?/2 .","ref":"Plausible.AsyncInsertRepo.html#exists?/2","title":"Plausible.AsyncInsertRepo.exists?/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get/3 .","ref":"Plausible.AsyncInsertRepo.html#get/3","title":"Plausible.AsyncInsertRepo.get/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get!/3 .","ref":"Plausible.AsyncInsertRepo.html#get!/3","title":"Plausible.AsyncInsertRepo.get!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by/3 .","ref":"Plausible.AsyncInsertRepo.html#get_by/3","title":"Plausible.AsyncInsertRepo.get_by/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by!/3 .","ref":"Plausible.AsyncInsertRepo.html#get_by!/3","title":"Plausible.AsyncInsertRepo.get_by!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_dynamic_repo/0 .","ref":"Plausible.AsyncInsertRepo.html#get_dynamic_repo/0","title":"Plausible.AsyncInsertRepo.get_dynamic_repo/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert/2 .","ref":"Plausible.AsyncInsertRepo.html#insert/2","title":"Plausible.AsyncInsertRepo.insert/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert!/2 .","ref":"Plausible.AsyncInsertRepo.html#insert!/2","title":"Plausible.AsyncInsertRepo.insert!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_all/3 .","ref":"Plausible.AsyncInsertRepo.html#insert_all/3","title":"Plausible.AsyncInsertRepo.insert_all/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_or_update/2 .","ref":"Plausible.AsyncInsertRepo.html#insert_or_update/2","title":"Plausible.AsyncInsertRepo.insert_or_update/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_or_update!/2 .","ref":"Plausible.AsyncInsertRepo.html#insert_or_update!/2","title":"Plausible.AsyncInsertRepo.insert_or_update!/2","type":"function"},{"doc":"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 use Ecto.Schema @primary_key false schema "ecto_ch_demo" do field :a , Ch , type : "UInt64" field :b , :string 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 ) # schemaless { 100_000 , nil } = Repo . insert_stream ( "ecto_ch_demo" , rows , types : [ a : Ch.Types . u64 ( ) , b : :string ] )","ref":"Plausible.AsyncInsertRepo.html#insert_stream/3","title":"Plausible.AsyncInsertRepo.insert_stream/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.load/2 .","ref":"Plausible.AsyncInsertRepo.html#load/2","title":"Plausible.AsyncInsertRepo.load/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one/2 .","ref":"Plausible.AsyncInsertRepo.html#one/2","title":"Plausible.AsyncInsertRepo.one/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one!/2 .","ref":"Plausible.AsyncInsertRepo.html#one!/2","title":"Plausible.AsyncInsertRepo.one!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.preload/3 .","ref":"Plausible.AsyncInsertRepo.html#preload/3","title":"Plausible.AsyncInsertRepo.preload/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.prepare_query/3 .","ref":"Plausible.AsyncInsertRepo.html#prepare_query/3","title":"Plausible.AsyncInsertRepo.prepare_query/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.put_dynamic_repo/1 .","ref":"Plausible.AsyncInsertRepo.html#put_dynamic_repo/1","title":"Plausible.AsyncInsertRepo.put_dynamic_repo/1","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query/4 for more information.","ref":"Plausible.AsyncInsertRepo.html#query/3","title":"Plausible.AsyncInsertRepo.query/3","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query!/4 for more information.","ref":"Plausible.AsyncInsertRepo.html#query!/3","title":"Plausible.AsyncInsertRepo.query!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload/2 .","ref":"Plausible.AsyncInsertRepo.html#reload/2","title":"Plausible.AsyncInsertRepo.reload/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload!/2 .","ref":"Plausible.AsyncInsertRepo.html#reload!/2","title":"Plausible.AsyncInsertRepo.reload!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.start_link/1 .","ref":"Plausible.AsyncInsertRepo.html#start_link/1","title":"Plausible.AsyncInsertRepo.start_link/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stop/1 .","ref":"Plausible.AsyncInsertRepo.html#stop/1","title":"Plausible.AsyncInsertRepo.stop/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stream/2 .","ref":"Plausible.AsyncInsertRepo.html#stream/2","title":"Plausible.AsyncInsertRepo.stream/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that translates the given query to SQL. See Ecto.Adapters.SQL.to_sql/3 for more information.","ref":"Plausible.AsyncInsertRepo.html#to_sql/2","title":"Plausible.AsyncInsertRepo.to_sql/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update/2 .","ref":"Plausible.AsyncInsertRepo.html#update/2","title":"Plausible.AsyncInsertRepo.update/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update!/2 .","ref":"Plausible.AsyncInsertRepo.html#update!/2","title":"Plausible.AsyncInsertRepo.update!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update_all/3 .","ref":"Plausible.AsyncInsertRepo.html#update_all/3","title":"Plausible.AsyncInsertRepo.update_all/3","type":"function"},{"doc":"","ref":"Plausible.Auth.html","title":"Plausible.Auth","type":"module"},{"doc":"","ref":"Plausible.Auth.html#create_user/3","title":"Plausible.Auth.create_user/3","type":"function"},{"doc":"","ref":"Plausible.Auth.html#delete_user/1","title":"Plausible.Auth.delete_user/1","type":"function"},{"doc":"","ref":"Plausible.Auth.html#enterprise?/1","title":"Plausible.Auth.enterprise?/1","type":"function"},{"doc":"","ref":"Plausible.Auth.html#find_user_by/1","title":"Plausible.Auth.find_user_by/1","type":"function"},{"doc":"","ref":"Plausible.Auth.html#has_active_sites?/2","title":"Plausible.Auth.has_active_sites?/2","type":"function"},{"doc":"","ref":"Plausible.Auth.html#is_super_admin?/1","title":"Plausible.Auth.is_super_admin?/1","type":"function"},{"doc":"","ref":"Plausible.Auth.html#issue_email_verification/1","title":"Plausible.Auth.issue_email_verification/1","type":"function"},{"doc":"","ref":"Plausible.Auth.html#user_owns_sites?/1","title":"Plausible.Auth.user_owns_sites?/1","type":"function"},{"doc":"","ref":"Plausible.Auth.html#verify_email/2","title":"Plausible.Auth.verify_email/2","type":"function"},{"doc":"","ref":"Plausible.Auth.ApiKey.html","title":"Plausible.Auth.ApiKey","type":"module"},{"doc":"","ref":"Plausible.Auth.ApiKey.html#changeset/2","title":"Plausible.Auth.ApiKey.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Auth.ApiKey.html#do_hash/1","title":"Plausible.Auth.ApiKey.do_hash/1","type":"function"},{"doc":"","ref":"Plausible.Auth.ApiKey.html#process_key/1","title":"Plausible.Auth.ApiKey.process_key/1","type":"function"},{"doc":"","ref":"Plausible.Auth.ApiKey.html#update/2","title":"Plausible.Auth.ApiKey.update/2","type":"function"},{"doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html","title":"Plausible.Auth.ApiKeyAdmin","type":"module"},{"doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#create_changeset/2","title":"Plausible.Auth.ApiKeyAdmin.create_changeset/2","type":"function"},{"doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#custom_index_query/3","title":"Plausible.Auth.ApiKeyAdmin.custom_index_query/3","type":"function"},{"doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#form_fields/1","title":"Plausible.Auth.ApiKeyAdmin.form_fields/1","type":"function"},{"doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#index/1","title":"Plausible.Auth.ApiKeyAdmin.index/1","type":"function"},{"doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#search_fields/1","title":"Plausible.Auth.ApiKeyAdmin.search_fields/1","type":"function"},{"doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#update_changeset/2","title":"Plausible.Auth.ApiKeyAdmin.update_changeset/2","type":"function"},{"doc":"This embedded schema stores information about the account locking grace period. Users are given this 7-day grace period to upgrade their account after outgrowing their subscriptions. The actual account locking happens in background with Plausible.Workers.LockSites . The grace period can also be manual, without an end date, being controlled manually from the CRM, and not by the background site locker job. This is useful for enterprise subscriptions.","ref":"Plausible.Auth.GracePeriod.html","title":"Plausible.Auth.GracePeriod","type":"module"},{"doc":"Returns whether the grace period is still active for a User. Defaults to false if the user is nil or there is no grace period.","ref":"Plausible.Auth.GracePeriod.html#active?/1","title":"Plausible.Auth.GracePeriod.active?/1","type":"function"},{"doc":"Ends an existing grace period by setting users.grace_period.is_over to true. This means the grace period has expired.","ref":"Plausible.Auth.GracePeriod.html#end_changeset/1","title":"Plausible.Auth.GracePeriod.end_changeset/1","type":"function"},{"doc":"Returns whether the grace period has already expired for a User. Defaults to false if the user is nil or there is no grace period.","ref":"Plausible.Auth.GracePeriod.html#expired?/1","title":"Plausible.Auth.GracePeriod.expired?/1","type":"function"},{"doc":"Removes the grace period from the User completely.","ref":"Plausible.Auth.GracePeriod.html#remove_changeset/1","title":"Plausible.Auth.GracePeriod.remove_changeset/1","type":"function"},{"doc":"Starts a account locking grace period of 7 days by changing the User struct.","ref":"Plausible.Auth.GracePeriod.html#start_changeset/2","title":"Plausible.Auth.GracePeriod.start_changeset/2","type":"function"},{"doc":"Starts a manual account locking grace period by changing the User struct. Manual locking means the grace period can only be removed manually from the CRM.","ref":"Plausible.Auth.GracePeriod.html#start_manual_lock_changeset/2","title":"Plausible.Auth.GracePeriod.start_manual_lock_changeset/2","type":"function"},{"doc":"","ref":"Plausible.Auth.GracePeriod.html#t:t/0","title":"Plausible.Auth.GracePeriod.t/0","type":"type"},{"doc":"","ref":"Plausible.Auth.Invitation.html","title":"Plausible.Auth.Invitation","type":"module"},{"doc":"","ref":"Plausible.Auth.Invitation.html#new/1","title":"Plausible.Auth.Invitation.new/1","type":"function"},{"doc":"","ref":"Plausible.Auth.Password.html","title":"Plausible.Auth.Password","type":"module"},{"doc":"","ref":"Plausible.Auth.Password.html#dummy_calculation/0","title":"Plausible.Auth.Password.dummy_calculation/0","type":"function"},{"doc":"","ref":"Plausible.Auth.Password.html#hash/1","title":"Plausible.Auth.Password.hash/1","type":"function"},{"doc":"","ref":"Plausible.Auth.Password.html#match?/2","title":"Plausible.Auth.Password.match?/2","type":"function"},{"doc":"","ref":"Plausible.Auth.Token.html","title":"Plausible.Auth.Token","type":"module"},{"doc":"","ref":"Plausible.Auth.Token.html#sign_password_reset/1","title":"Plausible.Auth.Token.sign_password_reset/1","type":"function"},{"doc":"","ref":"Plausible.Auth.Token.html#sign_shared_link/1","title":"Plausible.Auth.Token.sign_shared_link/1","type":"function"},{"doc":"","ref":"Plausible.Auth.Token.html#verify_password_reset/1","title":"Plausible.Auth.Token.verify_password_reset/1","type":"function"},{"doc":"","ref":"Plausible.Auth.Token.html#verify_shared_link/1","title":"Plausible.Auth.Token.verify_shared_link/1","type":"function"},{"doc":"","ref":"Plausible.Auth.User.html","title":"Plausible.Auth.User","type":"module"},{"doc":"","ref":"Plausible.Auth.User.html#changeset/2","title":"Plausible.Auth.User.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Auth.User.html#end_trial/1","title":"Plausible.Auth.User.end_trial/1","type":"function"},{"doc":"","ref":"Plausible.Auth.User.html#hash_password/1","title":"Plausible.Auth.User.hash_password/1","type":"function"},{"doc":"","ref":"Plausible.Auth.User.html#new/1","title":"Plausible.Auth.User.new/1","type":"function"},{"doc":"","ref":"Plausible.Auth.User.html#remove_trial_expiry/1","title":"Plausible.Auth.User.remove_trial_expiry/1","type":"function"},{"doc":"","ref":"Plausible.Auth.User.html#set_password/2","title":"Plausible.Auth.User.set_password/2","type":"function"},{"doc":"","ref":"Plausible.Auth.User.html#start_trial/1","title":"Plausible.Auth.User.start_trial/1","type":"function"},{"doc":"","ref":"Plausible.Auth.User.html#t:t/0","title":"Plausible.Auth.User.t/0","type":"type"},{"doc":"","ref":"Plausible.Auth.UserAdmin.html","title":"Plausible.Auth.UserAdmin","type":"module"},{"doc":"","ref":"Plausible.Auth.UserAdmin.html#custom_index_query/3","title":"Plausible.Auth.UserAdmin.custom_index_query/3","type":"function"},{"doc":"","ref":"Plausible.Auth.UserAdmin.html#form_fields/1","title":"Plausible.Auth.UserAdmin.form_fields/1","type":"function"},{"doc":"","ref":"Plausible.Auth.UserAdmin.html#index/1","title":"Plausible.Auth.UserAdmin.index/1","type":"function"},{"doc":"","ref":"Plausible.Auth.UserAdmin.html#resource_actions/1","title":"Plausible.Auth.UserAdmin.resource_actions/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html","title":"Plausible.Billing","type":"module"},{"doc":"","ref":"Plausible.Billing.html#active_subscription_for/1","title":"Plausible.Billing.active_subscription_for/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html#change_plan/2","title":"Plausible.Billing.change_plan/2","type":"function"},{"doc":"","ref":"Plausible.Billing.html#change_plan_preview/2","title":"Plausible.Billing.change_plan_preview/2","type":"function"},{"doc":"","ref":"Plausible.Billing.html#has_active_subscription?/1","title":"Plausible.Billing.has_active_subscription?/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html#last_two_billing_cycles/2","title":"Plausible.Billing.last_two_billing_cycles/2","type":"function"},{"doc":"","ref":"Plausible.Billing.html#last_two_billing_months_usage/2","title":"Plausible.Billing.last_two_billing_months_usage/2","type":"function"},{"doc":"","ref":"Plausible.Billing.html#needs_to_upgrade?/1","title":"Plausible.Billing.needs_to_upgrade?/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html#on_trial?/1","title":"Plausible.Billing.on_trial?/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html#paddle_api/0","title":"Plausible.Billing.paddle_api/0","type":"function"},{"doc":"Returns the number of sites that an account is allowed to have. Accounts for grandfathering old accounts to unlimited websites and ignores site limit on self-hosted installations.","ref":"Plausible.Billing.html#sites_limit/1","title":"Plausible.Billing.sites_limit/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html#subscription_cancelled/1","title":"Plausible.Billing.subscription_cancelled/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html#subscription_created/1","title":"Plausible.Billing.subscription_created/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html#subscription_payment_succeeded/1","title":"Plausible.Billing.subscription_payment_succeeded/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html#subscription_updated/1","title":"Plausible.Billing.subscription_updated/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html#trial_days_left/1","title":"Plausible.Billing.trial_days_left/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html#usage/1","title":"Plausible.Billing.usage/1","type":"function"},{"doc":"","ref":"Plausible.Billing.html#usage_breakdown/1","title":"Plausible.Billing.usage_breakdown/1","type":"function"},{"doc":"","ref":"Plausible.Billing.EnterprisePlan.html","title":"Plausible.Billing.EnterprisePlan","type":"module"},{"doc":"","ref":"Plausible.Billing.EnterprisePlan.html#changeset/2","title":"Plausible.Billing.EnterprisePlan.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html","title":"Plausible.Billing.EnterprisePlanAdmin","type":"module"},{"doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html#custom_index_query/3","title":"Plausible.Billing.EnterprisePlanAdmin.custom_index_query/3","type":"function"},{"doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html#form_fields/1","title":"Plausible.Billing.EnterprisePlanAdmin.form_fields/1","type":"function"},{"doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html#index/1","title":"Plausible.Billing.EnterprisePlanAdmin.index/1","type":"function"},{"doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html#search_fields/1","title":"Plausible.Billing.EnterprisePlanAdmin.search_fields/1","type":"function"},{"doc":"","ref":"Plausible.Billing.PaddleApi.html","title":"Plausible.Billing.PaddleApi","type":"module"},{"doc":"","ref":"Plausible.Billing.PaddleApi.html#checkout_domain/0","title":"Plausible.Billing.PaddleApi.checkout_domain/0","type":"function"},{"doc":"","ref":"Plausible.Billing.PaddleApi.html#get_invoices/1","title":"Plausible.Billing.PaddleApi.get_invoices/1","type":"function"},{"doc":"","ref":"Plausible.Billing.PaddleApi.html#get_subscription/1","title":"Plausible.Billing.PaddleApi.get_subscription/1","type":"function"},{"doc":"","ref":"Plausible.Billing.PaddleApi.html#update_subscription/2","title":"Plausible.Billing.PaddleApi.update_subscription/2","type":"function"},{"doc":"","ref":"Plausible.Billing.PaddleApi.html#update_subscription_preview/2","title":"Plausible.Billing.PaddleApi.update_subscription_preview/2","type":"function"},{"doc":"","ref":"Plausible.Billing.PaddleApi.html#vendors_domain/0","title":"Plausible.Billing.PaddleApi.vendors_domain/0","type":"function"},{"doc":"","ref":"Plausible.Billing.Plans.html","title":"Plausible.Billing.Plans","type":"module"},{"doc":"","ref":"Plausible.Billing.Plans.html#all_yearly_plan_ids/0","title":"Plausible.Billing.Plans.all_yearly_plan_ids/0","type":"function"},{"doc":"","ref":"Plausible.Billing.Plans.html#allowance/1","title":"Plausible.Billing.Plans.allowance/1","type":"function"},{"doc":"","ref":"Plausible.Billing.Plans.html#for_product_id/1","title":"Plausible.Billing.Plans.for_product_id/1","type":"function"},{"doc":"","ref":"Plausible.Billing.Plans.html#plans_for/1","title":"Plausible.Billing.Plans.plans_for/1","type":"function"},{"doc":"","ref":"Plausible.Billing.Plans.html#subscription_interval/1","title":"Plausible.Billing.Plans.subscription_interval/1","type":"function"},{"doc":"","ref":"Plausible.Billing.Plans.html#suggested_plan/2","title":"Plausible.Billing.Plans.suggested_plan/2","type":"function"},{"doc":"","ref":"Plausible.Billing.Plans.html#t:plan/0","title":"Plausible.Billing.Plans.plan/0","type":"type"},{"doc":"","ref":"Plausible.Billing.SiteLocker.html","title":"Plausible.Billing.SiteLocker","type":"module"},{"doc":"","ref":"Plausible.Billing.SiteLocker.html#check_sites_for/1","title":"Plausible.Billing.SiteLocker.check_sites_for/1","type":"function"},{"doc":"","ref":"Plausible.Billing.SiteLocker.html#set_lock_status_for/2","title":"Plausible.Billing.SiteLocker.set_lock_status_for/2","type":"function"},{"doc":"Helper function for working with Ecto changesets","ref":"Plausible.ChangesetHelpers.html","title":"Plausible.ChangesetHelpers","type":"module"},{"doc":"","ref":"Plausible.ChangesetHelpers.html#traverse_errors/1","title":"Plausible.ChangesetHelpers.traverse_errors/1","type":"function"},{"doc":"Provides the core functions to retrieve and manage the CLDR data that supports formatting and localisation. It provides the core functions to access formatted CLDR data, set and retrieve a current locale and validate certain core data types such as locales, currencies and territories.","ref":"Plausible.Cldr.html","title":"Plausible.Cldr","type":"module"},{"doc":"See Cldr.available_locale_name?/1 .","ref":"Plausible.Cldr.html#available_locale_name?/1","title":"Plausible.Cldr.available_locale_name?/1","type":"function"},{"doc":"Returns the default locale . Example iex> Plausible.Cldr . default_locale ( ) % Cldr.LanguageTag { backend : Plausible.Cldr , canonical_locale_name : "en-001" , cldr_locale_name : :"en-001" , language_subtags : [ ] , extensions : %{ } , gettext_locale_name : "en" , language : "en" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :en , requested_locale_name : "en-001" , script : :Latn , territory : :"001" , transform : %{ } , language_variants : [ ] }","ref":"Plausible.Cldr.html#default_locale/0","title":"Plausible.Cldr.default_locale/0","type":"function"},{"doc":"Returns the default territory when a locale does not specify one and none can be inferred. Example iex> Plausible.Cldr . default_territory ( ) :"001"","ref":"Plausible.Cldr.html#default_territory/0","title":"Plausible.Cldr.default_territory/0","type":"function"},{"doc":"Add locale-specific ellipsis to a string. Arguments string is any String.t or a 2-element list of String.t between which the ellipsis is inserted. backend is any module that includes use Cldr and therefore is a Cldr backend module. The default is Cldr.default_backend!/0 . Note that Cldr.default_backend!/0 will raise an exception if no :default_backend is configured under the :ex_cldr key in config.exs . options is a keyword list of options Options :locale is any valid locale name returned by Cldr.known_locale_names/1 . The default is Cldr.get_locale/0 . :location determines where to place the ellipsis. The options are :after (the default for a single string argument), :between (the default and only valid location for an argument that is a list of two strings) and :before . :format formats based upon whether the ellipsis is inserted between words or sentences. The valid options are :word or :sentence . The default is :sentence . Examples iex> Plausible.Cldr . ellipsis "And furthermore" "And furthermore…" 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 "And furthermore …" iex> Plausible.Cldr . ellipsis [ "And furthermore" , "there is much to be done" ] , locale : :ja , format : :word "And furthermore … there is much to be done"","ref":"Plausible.Cldr.html#ellipsis/2","title":"Plausible.Cldr.ellipsis/2","type":"function"},{"doc":"Return the current locale to be used for Cldr functions that 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 { backend : Elixir.Plausible.Cldr , canonical_locale_name : "pl" , cldr_locale_name : :pl , extensions : %{ } , language : "pl" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :pl , territory : :PL , requested_locale_name : "pl" , script : :Latn , transform : %{ } , language_variants : [ ] }","ref":"Plausible.Cldr.html#get_locale/0","title":"Plausible.Cldr.get_locale/0","type":"function"},{"doc":"See Cldr.known_calendars/0 .","ref":"Plausible.Cldr.html#known_calendars/0","title":"Plausible.Cldr.known_calendars/0","type":"function"},{"doc":"See Cldr.known_currencies/0 .","ref":"Plausible.Cldr.html#known_currencies/0","title":"Plausible.Cldr.known_currencies/0","type":"function"},{"doc":"Returns either the Gettext locale_name in Cldr format or false based upon whether the locale name is configured in Gettext . Arguments locale is any valid locale name returned by Plausible.Cldr.known_gettext_locale_names/0 Examples iex> Plausible.Cldr . known_gettext_locale_name "en" "en" iex> Plausible.Cldr . known_gettext_locale_name "en-SA" false","ref":"Plausible.Cldr.html#known_gettext_locale_name/1","title":"Plausible.Cldr.known_gettext_locale_name/1","type":"function"},{"doc":"Returns a boolean indicating if the specified locale name is configured and available in Gettext. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 Examples iex> Plausible.Cldr . known_gettext_locale_name? ( "en" ) true iex> Plausible.Cldr . known_gettext_locale_name? ( "!!" ) false","ref":"Plausible.Cldr.html#known_gettext_locale_name?/1","title":"Plausible.Cldr.known_gettext_locale_name?/1","type":"function"},{"doc":"Returns a list of Gettext locale names but in CLDR format with underscore replaced by hyphen in order to facilitate comparisons with Cldr locale names.","ref":"Plausible.Cldr.html#known_gettext_locale_names/0","title":"Plausible.Cldr.known_gettext_locale_names/0","type":"function"},{"doc":"Returns either the locale_name or false based upon whether the locale name is configured in Cldr . This is helpful when building a list of or expressions to return the first known locale name from a list. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 Examples iex> Plausible.Cldr . known_locale_name :"en-AU" :"en-AU" iex> Plausible.Cldr . known_locale_name :"en-SA" false","ref":"Plausible.Cldr.html#known_locale_name/1","title":"Plausible.Cldr.known_locale_name/1","type":"function"},{"doc":"Returns a boolean indicating if the specified locale name is configured and available in Cldr. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 Examples iex> Plausible.Cldr . known_locale_name? ( :en ) true iex> Plausible.Cldr . known_locale_name? ( :"!!" ) false","ref":"Plausible.Cldr.html#known_locale_name?/1","title":"Plausible.Cldr.known_locale_name?/1","type":"function"},{"doc":"Returns a list of the known locale names. Known locales are those locales which are the subset of all CLDR locales that have been configured for use either in this module or in Gettext .","ref":"Plausible.Cldr.html#known_locale_names/0","title":"Plausible.Cldr.known_locale_names/0","type":"function"},{"doc":"Returns a list of atoms representing the number systems types known to Cldr . Example iex> Plausible.Cldr . known_number_system_types [ :default , :finance , :native , :traditional ]","ref":"Plausible.Cldr.html#known_number_system_types/0","title":"Plausible.Cldr.known_number_system_types/0","type":"function"},{"doc":"See Cldr.known_number_systems/0 .","ref":"Plausible.Cldr.html#known_number_systems/0","title":"Plausible.Cldr.known_number_systems/0","type":"function"},{"doc":"Returns either the RBNF locale_name or false based upon whether the locale name is configured in Cldr and has RBNF rules defined. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 Examples iex> Plausible.Cldr . known_rbnf_locale_name :en :en iex> Plausible.Cldr . known_rbnf_locale_name :"en-SA" false","ref":"Plausible.Cldr.html#known_rbnf_locale_name/1","title":"Plausible.Cldr.known_rbnf_locale_name/1","type":"function"},{"doc":"Returns a boolean indicating if the specified locale name is configured and available in Cldr and supports rules based number formats (RBNF). Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 Examples iex> Plausible.Cldr . known_rbnf_locale_name? ( :en ) true iex> Plausible.Cldr . known_rbnf_locale_name? ( :"!!" ) false","ref":"Plausible.Cldr.html#known_rbnf_locale_name?/1","title":"Plausible.Cldr.known_rbnf_locale_name?/1","type":"function"},{"doc":"Returns a list of locale names which have rules-based number formats (RBNF).","ref":"Plausible.Cldr.html#known_rbnf_locale_names/0","title":"Plausible.Cldr.known_rbnf_locale_names/0","type":"function"},{"doc":"See Cldr.known_territories/0 .","ref":"Plausible.Cldr.html#known_territories/0","title":"Plausible.Cldr.known_territories/0","type":"function"},{"doc":"Normalizes a string by applying transliteration of common symbols in numbers, currencies and dates","ref":"Plausible.Cldr.html#normalize_lenient_parse/3","title":"Plausible.Cldr.normalize_lenient_parse/3","type":"function"},{"doc":"Set the current locale to be used for Cldr functions that take an optional locale parameter for which a locale is not supplied. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a t:Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 See rfc5646 for the specification of a language tag. Examples iex> Plausible.Cldr . put_locale ( "en" ) { :ok , % Cldr.LanguageTag { backend : Plausible.Cldr , canonical_locale_name : "en" , cldr_locale_name : :en , language_subtags : [ ] , extensions : %{ } , gettext_locale_name : "en" , language : "en" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :en , requested_locale_name : "en" , script : :Latn , territory : :US , 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" } }","ref":"Plausible.Cldr.html#put_locale/1","title":"Plausible.Cldr.put_locale/1","type":"function"},{"doc":"Add locale-specific quotation marks around a string. Arguments string is any valid Elixir string options is a keyword list of options Options locale is any valid locale name returned by Cldr.known_locale_names/1 . The default is Cldr.get_locale/0 Examples iex> Plausible.Cldr . quote "Quoted String" "“Quoted String”" iex> Plausible.Cldr . quote "Quoted String" , locale : :ja "「Quoted String」"","ref":"Plausible.Cldr.html#quote/2","title":"Plausible.Cldr.quote/2","type":"function"},{"doc":"Returns a list of the locales names that are configured, but not known in CLDR. Since there is a compile-time exception raised if there are any unknown locales this function should always return an empty list.","ref":"Plausible.Cldr.html#unknown_locale_names/0","title":"Plausible.Cldr.unknown_locale_names/0","type":"function"},{"doc":"See Cldr.validate_calendar/1 .","ref":"Plausible.Cldr.html#validate_calendar/1","title":"Plausible.Cldr.validate_calendar/1","type":"function"},{"doc":"See Cldr.validate_currency/1 .","ref":"Plausible.Cldr.html#validate_currency/1","title":"Plausible.Cldr.validate_currency/1","type":"function"},{"doc":"Normalise and validate a locale name. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 Returns {:ok, language_tag} {:error, reason} Notes See rfc5646 for the specification of a language tag. Examples iex> Plausible.Cldr . validate_locale ( :en ) { :ok , % Cldr.LanguageTag { backend : Plausible.Cldr , canonical_locale_name : "en" , cldr_locale_name : :en , extensions : %{ } , gettext_locale_name : "en" , language : "en" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :en , requested_locale_name : "en" , script : :Latn , territory : :US , transform : %{ } , language_variants : [ ] } } 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 : %{ } , gettext_locale_name : "en" , language : "en" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :en , requested_locale_name : "en-001" , script : :Latn , territory : :"001" , transform : %{ } , language_variants : [ ] } } iex> Plausible.Cldr . validate_locale ( "zzz" ) { :error , { Cldr.InvalidLanguageError , "The language \\" zzz \\" is invalid" } }","ref":"Plausible.Cldr.html#validate_locale/1","title":"Plausible.Cldr.validate_locale/1","type":"function"},{"doc":"See Cldr.validate_number_system/1 .","ref":"Plausible.Cldr.html#validate_number_system/1","title":"Plausible.Cldr.validate_number_system/1","type":"function"},{"doc":"Normalise and validate a number system type. Arguments number_system_type is any number system type returned by Cldr.known_number_system_types/1 Returns {:ok, normalized_number_system_type} or {:error, {exception, message}} Examples 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 :latn { :error , { Cldr.UnknownNumberSystemTypeError , "The number system type :latn is unknown" } } iex> Plausible.Cldr . validate_number_system_type "bork" { :error , { Cldr.UnknownNumberSystemTypeError , "The number system type \\" bork \\" is invalid" } }","ref":"Plausible.Cldr.html#validate_number_system_type/1","title":"Plausible.Cldr.validate_number_system_type/1","type":"function"},{"doc":"See Cldr.validate_territory/1 .","ref":"Plausible.Cldr.html#validate_territory/1","title":"Plausible.Cldr.validate_territory/1","type":"function"},{"doc":"Execute a function with a locale ensuring that the current locale is restored after the function. Arguments locale is any valid locale name returned by Cldr.known_locale_names/1 . fun is any 0-arity function or function capture. Returns The value returned by the function fun/0 or {:error, {exception, reason}} if the locale is invalid or raises an exception if the current locale cannot be identified.","ref":"Plausible.Cldr.html#with_locale/2","title":"Plausible.Cldr.with_locale/2","type":"function"},{"doc":"Parses HTTP Accept-Language header values as defined in rfc2616 . The Accept-Language request-header field is similar to Accept, but restricts the set of natural languages that are preferred as a response to the request. Language tags function are provided in 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 * 8 ALPHA * ( "-" 1 * 8 ALPHA ) ) | "*" ) 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."","ref":"Plausible.Cldr.AcceptLanguage.html","title":"Plausible.Cldr.AcceptLanguage","type":"module"},{"doc":"Parse an Accept-Language string and return the best match for a configured Cldr locale. Arguments accept_langauge is a string representing an accept language header Returns {:ok, language_tag} or {:error, reason} Examples 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 : %{ } , gettext_locale_name : nil , language : "zh" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :"zh-Hant" , requested_locale_name : "zh-TW" , script : :Hant , territory : :TW , transform : %{ } , language_variants : [ ] } } 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 : %{ } , gettext_locale_name : nil , language : "zh" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :"zh-Hant" , requested_locale_name : "zh-TW" , script : :Hant , territory : :TW , 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 ( "invalid_tag" ) { :error , { Cldr.LanguageTag.ParseError , "Expected a BCP47 language tag. Could not parse the remaining \\" g \\" starting at position 11" } }","ref":"Plausible.Cldr.AcceptLanguage.html#best_match/1","title":"Plausible.Cldr.AcceptLanguage.best_match/1","type":"function"},{"doc":"Parses an Accept-Language header value in its string or tokenized form to return a tuple of the form {:ok, [{quality, %Cldr.LanguageTag{}}, ...]} sorted by quality. Arguments accept-language is any string in the format defined by rfc2616 backend is any module that includes use Cldr and therefore is a Cldr backend module Returns {:ok, [{quality, language_tag}, ...]} or {:error, {Cldr.AcceptLanguageError, String.t}} If at least one valid language tag is found but errors are also detected on one more more tags, an {ok, list} tuple is returned 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 { backend : TestBackend.Cldr , canonical_locale_name : "da" , cldr_locale_name : :da , language_subtags : [ ] , extensions : %{ } , gettext_locale_name : nil , language : "da" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :da , requested_locale_name : "da" , script : :Latn , territory : :DK , transform : %{ } , language_variants : [ ] } } , { 0.3 , % Cldr.LanguageTag { backend : TestBackend.Cldr , canonical_locale_name : "zh-TW" , cldr_locale_name : :"zh-Hant" , language_subtags : [ ] , extensions : %{ } , gettext_locale_name : nil , language : "zh" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :"zh-Hant" , requested_locale_name : "zh-TW" , script : :Hant , territory : :TW , 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 ( "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 : %{ } , gettext_locale_name : nil , language : "da" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :da , requested_locale_name : "da" , script : :Latn , territory : :DK , transform : %{ } , language_variants : [ ] } } , { 0.3 , % Cldr.LanguageTag { backend : TestBackend.Cldr , canonical_locale_name : "zh-TW" , cldr_locale_name : :"zh-Hant" , language_subtags : [ ] , extensions : %{ } , gettext_locale_name : nil , language : "zh" , 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" } } ] }","ref":"Plausible.Cldr.AcceptLanguage.html#parse/1","title":"Plausible.Cldr.AcceptLanguage.parse/1","type":"function"},{"doc":"Parses an Accept-Language header value in its string or tokenized form to produce a list of tuples of the form [{quality, %Cldr.LanguageTag{}}, ...] sorted by quality in descending order. Arguments accept-language is any string in the format defined by rfc2616 Returns {:ok, [{quality, language_tag}, ...]} or raises a Cldr.AcceptLanguageError exception If at least one valid language tag is found but errors are also detected on one more more tags, an {ok, list} tuple is returned 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 { backend : TestBackend.Cldr , canonical_locale_name : "da" , cldr_locale_name : :da , language_subtags : [ ] , extensions : %{ } , gettext_locale_name : nil , language : "da" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :da , requested_locale_name : "da" , script : :Latn , territory : :DK , transform : %{ } , language_variants : [ ] } } , { 0.3 , % Cldr.LanguageTag { backend : TestBackend.Cldr , canonical_locale_name : "zh-TW" , cldr_locale_name : :"zh-Hant" , language_subtags : [ ] , extensions : %{ } , gettext_locale_name : nil , language : "zh" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :"zh-Hant" , requested_locale_name : "zh-TW" , script : :Hant , territory : :TW , 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 { backend : TestBackend.Cldr , canonical_locale_name : "da" , cldr_locale_name : :da , language_subtags : [ ] , extensions : %{ } , gettext_locale_name : nil , language : "da" , locale : %{ } , private_use : [ ] , rbnf_locale_name : :da , requested_locale_name : "da" , script : :Latn , territory : :DK , transform : %{ } , language_variants : [ ] } } , { 0.3 , % Cldr.LanguageTag { backend : TestBackend.Cldr , canonical_locale_name : "zh-TW" , cldr_locale_name : :"zh-Hant" , language_subtags : [ ] , extensions : %{ } , gettext_locale_name : nil , language : "zh" , 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" } } ]","ref":"Plausible.Cldr.AcceptLanguage.html#parse!/1","title":"Plausible.Cldr.AcceptLanguage.parse!/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Currency.html","title":"Plausible.Cldr.Currency","type":"module"},{"doc":"Returns a map of the metadata for all currencies for a given locale. Arguments locale is any valid locale name returned by MyApp.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1 currency_status is :all , :current , :historic , unannotated or :tender ; or a list of one or more status. The default is :all . See Cldr.Currency.currency_filter/2 . Returns {:ok, currency_map} or {:error, {exception, reason}} Example MyApp.Cldr.Currency.currencies_for_locale "en" => {:ok, %{ FJD : % Cldr.Currency { cash_digits : 2 , cash_rounding : 0 , code : "FJD" , count : %{ one : "Fijian dollar" , other : "Fijian dollars" } , digits : 2 , from : nil , iso_digits : 2 , name : "Fijian Dollar" , narrow_symbol : "$" , rounding : 0 , symbol : "FJD" , tender : true , to : nil } , SUR : % Cldr.Currency { cash_digits : 2 , cash_rounding : 0 , code : "SUR" , count : %{ one : "Soviet rouble" , other : "Soviet roubles" } , digits : 2 , from : nil , iso_digits : nil , name : "Soviet Rouble" , narrow_symbol : nil , rounding : 0 , symbol : "SUR" , tender : true , to : nil } , ... } }","ref":"Plausible.Cldr.Currency.html#currencies_for_locale/3","title":"Plausible.Cldr.Currency.currencies_for_locale/3","type":"function"},{"doc":"Returns a map of the metadata for all currencies for a given locale and raises on error. Arguments locale is any valid locale name returned by MyApp.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1 currency_status is :all , :current , :historic , unannotated or :tender ; or a list of one or more status. The default is :all . See Cldr.Currency.currency_filter/2 . Returns {:ok, currency_map} or raises an exception Example MyApp.Cldr.Currency.currencies_for_locale! "en" => %{ FJD : % Cldr.Currency { cash_digits : 2 , cash_rounding : 0 , code : "FJD" , count : %{ one : "Fijian dollar" , other : "Fijian dollars" } , digits : 2 , from : nil , iso_digits : 2 , name : "Fijian Dollar" , narrow_symbol : "$" , rounding : 0 , symbol : "FJD" , tender : true , to : nil } , SUR : % Cldr.Currency { cash_digits : 2 , cash_rounding : 0 , code : "SUR" , count : %{ one : "Soviet rouble" , other : "Soviet roubles" } , digits : 2 , from : nil , iso_digits : nil , name : "Soviet Rouble" , narrow_symbol : nil , rounding : 0 , symbol : "SUR" , tender : true , to : nil } , ... }","ref":"Plausible.Cldr.Currency.html#currencies_for_locale!/3","title":"Plausible.Cldr.Currency.currencies_for_locale!/3","type":"function"},{"doc":"Returns the currency metadata for the requested currency code. Arguments currency_or_currency_code is a binary or atom representation of an ISO 4217 currency code, or a %Cldr.Currency{} struct. Options :locale is any valid locale name returned by Cldr.known_locale_names/1 or a Cldr.LanguageTag struct returned by Cldr.Locale.new!/2 Returns A {:ok, currency} or {:error, {exception, reason}} Examples 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" } , digits : 2 , iso_digits : 2 , name : "Australian Dollar" , narrow_symbol : "$" , rounding : 0 , symbol : "A$" , tender : true } } 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" } , digits : 2 , iso_digits : 2 , name : "Thai Baht" , narrow_symbol : "฿" , rounding : 0 , symbol : "THB" , tender : true } }","ref":"Plausible.Cldr.Currency.html#currency_for_code/2","title":"Plausible.Cldr.Currency.currency_for_code/2","type":"function"},{"doc":"Returns the currency metadata for the requested currency code. Arguments currency_or_currency_code is a binary or atom representation of an ISO 4217 currency code, or a %Cldr.Currency{} struct. Options :locale is any valid locale name returned by Cldr.known_locale_names/1 or a Cldr.LanguageTag struct returned by Cldr.Locale.new!/2 Returns A t:Cldr.Current.t/0 or raises an exception Examples 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" } , digits : 2 , iso_digits : 2 , name : "Australian Dollar" , narrow_symbol : "$" , rounding : 0 , symbol : "A$" , tender : true } 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" } , digits : 2 , iso_digits : 2 , name : "Thai Baht" , narrow_symbol : "฿" , rounding : 0 , symbol : "THB" , tender : true }","ref":"Plausible.Cldr.Currency.html#currency_for_code!/2","title":"Plausible.Cldr.Currency.currency_for_code!/2","type":"function"},{"doc":"Returns the effective currency for a given locale Arguments locale is a Cldr.LanguageTag struct returned by Cldr.Locale.new!/2 Returns A ISO 4217 currency code as an upcased atom Examples 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> Plausible.Cldr.Currency . currency_from_locale locale :AUD iex> Plausible.Cldr.Currency . currency_from_locale "en-GB" :GBP","ref":"Plausible.Cldr.Currency.html#currency_from_locale/1","title":"Plausible.Cldr.Currency.currency_from_locale/1","type":"function"},{"doc":"Returns a list of historic and the current currency for a given locale. Arguments locale is any valid locale name returned by MyApp.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1 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] } } }","ref":"Plausible.Cldr.Currency.html#currency_history_for_locale/1","title":"Plausible.Cldr.Currency.currency_history_for_locale/1","type":"function"},{"doc":"Returns a map that matches a currency string to a currency code. A currency string is a localised name or symbol representing a currency in a locale-specific manner. Arguments locale is any valid locale name returned by MyApp.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1 currency_status is :all , :current , :historic , unannotated or :tender ; or a list of one or more status. The default is :all . See Cldr.Currency.currency_filter/2 . Returns {:ok, currency_string_map} or {:error, {exception, reason}} Example MyApp.Cldr.Currency . currency_strings "en" => { :ok , %{ "mexican silver pesos" => :MXP , "sudanese dinar" => :SDD , "bad" => :BAD , "rsd" => :RSD , "swazi lilangeni" => :SZL , "zairean new zaire" => :ZRN , "guyanaese dollars" => :GYD , "equatorial guinean ekwele" => :GQE , ... } }","ref":"Plausible.Cldr.Currency.html#currency_strings/3","title":"Plausible.Cldr.Currency.currency_strings/3","type":"function"},{"doc":"Returns a map that matches a currency string to a currency code or raises an exception. A currency string is a localised name or symbol representing a currency in a locale-specific manner. Arguments locale is any valid locale name returned by MyApp.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1 currency_status is :all , :current , :historic , unannotated or :tender ; or a list of one or more status. The default is :all . See Cldr.Currency.currency_filter/2 . Returns {:ok, currency_string_map} or raises an exception Example MyApp.Cldr.Currency . currency_strings! "en" => %{ "mexican silver pesos" => :MXP , "sudanese dinar" => :SDD , "bad" => :BAD , "rsd" => :RSD , "swazi lilangeni" => :SZL , "zairean new zaire" => :ZRN , "guyanaese dollars" => :GYD , "equatorial guinean ekwele" => :GQE , ... }","ref":"Plausible.Cldr.Currency.html#currency_strings!/3","title":"Plausible.Cldr.Currency.currency_strings!/3","type":"function"},{"doc":"Returns the current currency for a given locale. This function does not consider the U extenion parameters cu or rg . It is recommended to us Cldr.Currency.currency_from_locale/1 in most circumstances. Arguments locale is any valid locale name returned by MyApp.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1 Example iex> MyApp.Cldr.Currency . current_currency_from_locale "en" :USD iex> MyApp.Cldr.Currency . current_currency_from_locale "en-AU" :AUD","ref":"Plausible.Cldr.Currency.html#current_currency_from_locale/1","title":"Plausible.Cldr.Currency.current_currency_from_locale/1","type":"function"},{"doc":"Returns a mapping from a territory code to its current currency code. If a territory has no current currency (like Antartica, territory code :AQ ) then no mapping is returned for that territory. Returns A map of {territory_code => Cldr.Currency.t} Example iex> Plausible.Cldr.Currency . current_territory_currencies ( )","ref":"Plausible.Cldr.Currency.html#current_territory_currencies/0","title":"Plausible.Cldr.Currency.current_territory_currencies/0","type":"function"},{"doc":"See Plausible.Cldr.Currency.known_currency_codes/0 .","ref":"Plausible.Cldr.Currency.html#known_currencies/0","title":"Plausible.Cldr.Currency.known_currencies/0","type":"function"},{"doc":"See Plausible.Cldr.Currency.known_currency_code?/1 .","ref":"Plausible.Cldr.Currency.html#known_currency?/1","title":"Plausible.Cldr.Currency.known_currency?/1","type":"function"},{"doc":"Returns a 2-tuple indicating if the supplied currency code is known. Arguments currency_code is a binary or atom representing an ISO4217 currency code Returns {:ok, currency_code} or {:error, {exception, reason}} Examples 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" } }","ref":"Plausible.Cldr.Currency.html#known_currency_code/1","title":"Plausible.Cldr.Currency.known_currency_code/1","type":"function"},{"doc":"Returns a boolean indicating if the supplied currency code is known. Arguments currency_code is a binary or atom representing an ISO4217 currency code Returns true or false Examples iex> Plausible.Cldr.Currency . known_currency_code? "AUD" true iex> Plausible.Cldr.Currency . known_currency_code? "GGG" false iex> Plausible.Cldr.Currency . known_currency_code? :XCV false","ref":"Plausible.Cldr.Currency.html#known_currency_code?/1","title":"Plausible.Cldr.Currency.known_currency_code?/1","type":"function"},{"doc":"Returns a list of all known currency codes. Example iex> Plausible.Cldr.Currency . known_currency_codes","ref":"Plausible.Cldr.Currency.html#known_currency_codes/0","title":"Plausible.Cldr.Currency.known_currency_codes/0","type":"function"},{"doc":"Returns a Currency struct created from the arguments. Arguments currency is a private use currency code in a format defined by ISO4217 which is X followed by two alphanumeric characters. options is a map of options representing the optional elements of the Cldr.Currency.t struct. Options :name is the name of the currency. Required. :digits is the precision of the currency. Required. :symbol is the currency symbol. Optional. :narrow_symbol is an alternative narrow symbol. Optional. :round_nearest is the rounding precision such as 0.05 . Optional. :alt_code is an alternative currency code for application use. :cash_digits is the precision of the currency when used as cash. Optional. :cash_rounding_nearest is the rounding precision when used as cash such as 0.05 . Optional. Returns {:ok, Cldr.Currency.t} or {:error, {exception, message}} Example 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" } , digits : 0 , from : nil , iso_digits : 0 , name : "Custom Name" , narrow_symbol : nil , rounding : 0 , 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." } }","ref":"Plausible.Cldr.Currency.html#new/2","title":"Plausible.Cldr.Currency.new/2","type":"function"},{"doc":"Returns the appropriate currency display name for the currency , based on the plural rules in effect for the locale . Arguments number is an integer, float or Decimal currency is any currency returned by Cldr.Currency.known_currencies/0 options is a keyword list of options Options locale is any valid locale name returned by MyApp.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1 . The default is Plausible.Cldr.get_locale/0 Returns {:ok, plural_string} or {:error, {exception, message}} Examples 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 12 , :USD , locale : "zh" { :ok , "美元" } 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" }","ref":"Plausible.Cldr.Currency.html#pluralize/3","title":"Plausible.Cldr.Currency.pluralize/3","type":"function"},{"doc":"Returns the strings associated with a currency in a given locale. Arguments currency is an ISO4217 currency code locale is any valid locale name returned by MyApp.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by MyApp.Cldr.Locale.new!/1 Returns A list of strings or {:error, {exception, reason}} Example iex> MyApp.Cldr.Currency . strings_for_currency :AUD , "en" [ "a$" , "australian dollars" , "aud" , "australian dollar" ]","ref":"Plausible.Cldr.Currency.html#strings_for_currency/2","title":"Plausible.Cldr.Currency.strings_for_currency/2","type":"function"},{"doc":"Backend module that provides functions to define new locales and display human-readable locale names for presentation purposes.","ref":"Plausible.Cldr.Locale.html","title":"Plausible.Cldr.Locale","type":"module"},{"doc":"Returns the list of fallback locale names, starting with the provided locale name. Fallbacks are a list of locate names which can be used to resolve translation or other localization data if such localised data does not exist for this specific locale.. Arguments locale_name is any locale name returned by Plausible.Cldr.known_locale_names/0 Returns {:ok, list_of_locale_names} or {:error, {exception, reason}} Examples 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 ] }","ref":"Plausible.Cldr.Locale.html#fallback_locale_names/1","title":"Plausible.Cldr.Locale.fallback_locale_names/1","type":"function"},{"doc":"Returns the list of fallback locales, starting with the provided locale name. Fallbacks are a list of locate names which can be used to resolve translation or other localization data if such localised data does not exist for this specific locale. Arguments locale_name is any locale name returned by Plausible.Cldr.known_locale_names/0 Returns {:ok, list_of_locales} or {:error, {exception, reason}} Examples 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 ] > ] }","ref":"Plausible.Cldr.Locale.html#fallback_locales/1","title":"Plausible.Cldr.Locale.fallback_locales/1","type":"function"},{"doc":"Returns the "best fit" locale for a given territory. Using the population percentage data from CLDR, the language most commonly spoken in the given territory is used to form a locale name which is then validated against the given backend. First a territory-specific locale is validated and if that fails, the base language only is validate. For example, if the territory is AU then then the language most spoken is "en". First, the locale "en-AU" is validated and if that fails, "en" is validated. Arguments territory is any ISO 3166 Alpha-2 territory code that can be validated by Cldr.validate_territory/1 Returns {:ok, language_tag} or {:error, {exception, reason}} Examples iex> Plausible.Cldr.Locale.locale_for_territory(:AU) Elixir.Plausible.Cldr.validate_locale(:"en-AU") iex> Plausible.Cldr.Locale.locale_for_territory(:US) Elixir.Plausible.Cldr.validate_locale(:"en-US") iex> Plausible.Cldr.Locale.locale_for_territory(:ZZ) {:error, {Cldr.UnknownTerritoryError, "The territory :ZZ is unknown"}}","ref":"Plausible.Cldr.Locale.html#locale_for_territory/1","title":"Plausible.Cldr.Locale.locale_for_territory/1","type":"function"},{"doc":"Returns a "best fit" locale for a host name. Arguments host is any valid host name options is a keyword list of options. The default is [] . Options :tlds is a list of territory codes as upper-cased atoms that are to be considered as top-level domains. See Cldr.Locale.locale_from_host/2 for the default list. Returns {:ok, langauge_tag} or {:error, {exception, reason}} Notes Certain top-level domains have become associated with content underlated to the territory for who the domain is registered. Therefore Google (and perhaps others) do not associate these TLDs as belonging to the territory but rather are considered generic top-level domain names. Examples iex> Plausible.Cldr.Locale . locale_from_host "a.b.com.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" ) { :error , { Cldr.UnknownLocaleError , "No locale was identified for territory \\" com \\" " } }","ref":"Plausible.Cldr.Locale.html#locale_from_host/2","title":"Plausible.Cldr.Locale.locale_from_host/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Locale.html#new/1","title":"Plausible.Cldr.Locale.new/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Locale.html#new!/1","title":"Plausible.Cldr.Locale.new!/1","type":"function"},{"doc":"Returns the script direction for a locale. Arguments language_tag is any language tag returned by Cldr.Locale.new/2 or any locale_name returned by Cldr.known_locale_names/1 . Returns The script direction which is either :ltr (for left-to-right scripts) or :rtl (for right-to-left scripts). Examples iex> Plausible.Cldr.Locale . script_direction_from_locale "en-US" :ltr iex> Plausible.Cldr.Locale . script_direction_from_locale :ar :rtl","ref":"Plausible.Cldr.Locale.html#script_direction_from_locale/1","title":"Plausible.Cldr.Locale.script_direction_from_locale/1","type":"function"},{"doc":"Returns the last segment of a host that might be a territory. Arguments host is any valid host name Returns {:ok, territory} or {:error, {exception, reason}} Examples 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 \\" " } }","ref":"Plausible.Cldr.Locale.html#territory_from_host/1","title":"Plausible.Cldr.Locale.territory_from_host/1","type":"function"},{"doc":"Returns the territory from a language tag or locale name. Arguments locale is any language tag returned by Plausible.Cldr.Locale.new/1 or a locale name in the list returned by Plausible.Cldr.known_locale_names/0 Returns A territory code as an atom Examples iex> Plausible.Cldr.Locale . territory_from_locale "en-US" :US iex> Plausible.Cldr.Locale . territory_from_locale "en-US-u-rg-GBzzzz" :GB","ref":"Plausible.Cldr.Locale.html#territory_from_locale/1","title":"Plausible.Cldr.Locale.territory_from_locale/1","type":"function"},{"doc":"Returns the time zone from a language tag or locale name. Arguments locale is any language tag returned by Plausible.Cldr.Locale.new/1 or a locale name in the list returned by Plausible.Cldr.known_locale_names/0 Returns A time zone ID as a string or :error if no time zone can be determined Examples iex> Plausible.Cldr.Locale . timezone_from_locale "en-US-u-tz-ausyd" "Australia/Sydney"","ref":"Plausible.Cldr.Locale.html#timezone_from_locale/1","title":"Plausible.Cldr.Locale.timezone_from_locale/1","type":"function"},{"doc":"Formats numbers and currencies based upon CLDR's decimal formats specification. The format specification is documentated in Unicode TR35 . There are several classes of formatting including non-scientific, scientific, rules based (for spelling and ordinal formats), compact formats that display 1k rather than 1,000 and so on. See Cldr.Number.to_string/2 for specific formatting options. Non-Scientific Notation Formatting The following description applies to formats that do not use scientific notation or significant digits: If the number of actual integer digits exceeds the maximum integer digits, then only the least significant digits are shown. For example, 1997 is formatted as "97" if the maximum integer digits is set to 2. If the number of actual integer digits is less than the minimum integer digits, then leading zeros are added. For example, 1997 is formatted as "01997" if the minimum integer digits is set to 5. If the number of actual fraction digits exceeds the maximum fraction digits, then half-even rounding it performed to the maximum fraction digits. For example, 0.125 is formatted as "0.12" if the maximum fraction digits is 2. This behavior can be changed by specifying a rounding increment and a rounding mode. If the number of actual fraction digits is less than the minimum fraction digits, then trailing zeros are added. For example, 0.125 is formatted as "0.1250" if the minimum fraction digits is set to 4. Trailing fractional zeros are not displayed if they occur j positions after the decimal, where j is less than the maximum fraction digits. For example, 0.10004 is formatted as "0.1" if the maximum fraction digits is four or less. Scientific Notation Formatting Numbers in scientific notation are expressed as the product of a mantissa and a power of ten, for example, 1234 can be expressed as 1.234 x 10^3. The mantissa is typically in the half-open interval [1.0, 10.0) or sometimes [0.0, 1.0), but it need not be. In a pattern, the exponent character immediately followed by one or more digit characters indicates scientific notation. Example: "0.###E0" formats the number 1234 as "1.234E3". The number of digit characters after the exponent character gives the minimum exponent digit count. There is no maximum. Negative exponents are formatted using the localized minus sign, not the prefix and suffix from the pattern. This allows patterns such as "0.###E0 m/s". To prefix positive exponents with a localized plus sign, specify '+' between the exponent and the digits: "0.###E+0" will produce formats "1E+1", "1E+0", "1E-1", and so on. (In localized patterns, use the localized plus sign rather than '+'.) The minimum number of integer digits is achieved by adjusting the exponent. Example: 0.00123 formatted with "00.###E0" yields "12.3E-4". This only happens if there is no maximum number of integer digits. If there is a maximum, then the minimum number of integer digits is fixed at one. The maximum number of integer digits, if present, specifies the exponent grouping. The most common use of this is to generate engineering notation, in which the exponent is a multiple of three, for example, "##0.###E0". The number 12345 is formatted using "##0.####E0" as "12.345E3". When using scientific notation, the formatter controls the digit counts using significant digits logic. The maximum number of significant digits limits the total number of integer and fraction digits that will be shown in the mantissa; it does not affect parsing. For example, 12345 formatted with "##0.##E0" is "12.3E3". Exponential patterns may not contain grouping separators. Significant Digits There are two ways of controlling how many digits are shows: (a) significant digits counts, or (b) integer and fraction digit counts. Integer and fraction digit counts are described above. When a formatter is using significant digits counts, it uses however many integer and fraction digits are required to display the specified number of significant digits. It may ignore min/max integer/fraction digits, or it may use them to the extent possible.","ref":"Plausible.Cldr.Number.html","title":"Plausible.Cldr.Number","type":"module"},{"doc":"Parse a string locale-aware manner and return a number. Arguments string is any String.t options is a keyword list of options Options :number is one of :integer , :float , :decimal or nil . The default is nil meaning that the type auto-detected as either an integer or a float . :locale is any locale returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag.t . The default is Plausible.Cldr.get_locale/0 . Returns A number of the requested or default type or {:error, {exception, error}} if no number could be determined Notes This function parses a string to return a number but in a locale-aware manner. It will normalise grouping characters and decimal separators, different forms of the + and - symbols that appear in Unicode and strips any _ characters that might be used for formatting in a string. It then parses the number 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_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,34" , locale : "de" , number : :integer ) { :error , { Cldr.Number.ParseError , "The string \\" +1.000,34 \\" could not be parsed as a number" } }","ref":"Plausible.Cldr.Number.html#parse/2","title":"Plausible.Cldr.Number.parse/2","type":"function"},{"doc":"Resolve curencies from strings within a list. Arguments list is any list in which currency names and symbols are expected options is a keyword list of options Options :locale is any valid locale returned by Cldr.known_locale_names/1 or a Cldr.LanguageTag struct returned by Cldr.Locale.new!/2 The default is Plausible.Cldr.get_locale() :only is an atom or list of atoms representing the currencies or currency types to be considered for a match. The equates to a list of acceptable currencies for parsing. See the notes below for currency types. :except is an atom or list of atoms representing the currencies or currency types to be not considered for a match. This equates to a list of unacceptable currencies for parsing. See the notes below for currency types. :fuzzy is a float greater than 0.0 and less than or equal to 1.0 which is used as input to String.jaro_distance/2 to determine is the provided currency string is close enough to a known currency string for it to identify definitively a currency code. It is recommended to use numbers greater than 0.8 in order to reduce false positives. Notes The :only and :except options accept a list of currency codes and/or currency types. The following types are recognised. If both :only and :except are specified, the :except entries take priority - that means any entries in :except are removed from the :only entries. :all , the default, considers all currencies :current considers those currencies that have a :to date of nil and which also is a known ISO4217 currency :historic is the opposite of :current :tender considers currencies that are legal tender :unannotated considers currencies that don't have "(some string)" in their names. These are usually financial instruments. Examples iex> Plausible.Cldr.Number . scan ( "100 US dollars" ) ...> |> Plausible.Cldr.Number . resolve_currencies [ 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 dollars des États-Unis" ) ...> |> Plausible.Cldr.Number . resolve_currencies ( locale : "fr" ) [ 100 , :USD ]","ref":"Plausible.Cldr.Number.html#resolve_currencies/2","title":"Plausible.Cldr.Number.resolve_currencies/2","type":"function"},{"doc":"Resolve a currency from a string Arguments list is any list in which currency names and symbols are expected options is a keyword list of options Options :locale is any valid locale returned by Cldr.known_locale_names/1 or a Cldr.LanguageTag struct returned by Cldr.Locale.new!/2 The default is Plausible.Cldr.get_locale() :only is an atom or list of atoms representing the currencies or currency types to be considered for a match. The equates to a list of acceptable currencies for parsing. See the notes below for currency types. :except is an atom or list of atoms representing the currencies or currency types to be not considered for a match. This equates to a list of unacceptable currencies for parsing. See the notes below for currency types. :fuzzy is a float greater than 0.0 and less than or equal to 1.0 which is used as input to String.jaro_distance/2 to determine is the provided currency string is close enough to a known currency string for it to identify definitively a currency code. It is recommended to use numbers greater than 0.8 in order to reduce false positives. Returns An ISO4217 currency code as an atom or {:error, {exception, message}} Notes The :only and :except options accept a list of currency codes and/or currency types. The following types are recognised. If both :only and :except are specified, the :except entries take priority - that means any entries in :except are removed from the :only entries. :all , the default, considers all currencies :current considers those currencies that have a :to date of nil and which also is a known ISO4217 currency :historic is the opposite of :current :tender considers currencies that are legal tender :unannotated considers currencies that don't have "(some string)" in their names. These are usually financial instruments. Examples 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 ( "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" } }","ref":"Plausible.Cldr.Number.html#resolve_currency/2","title":"Plausible.Cldr.Number.resolve_currency/2","type":"function"},{"doc":"Resolve and tokenize percent or permille from the beginning and/or the end of a string Arguments list is any list in which percent and permille symbols are expected options is a keyword list of options Options :locale is any valid locale returned by Cldr.known_locale_names/1 or a Cldr.LanguageTag struct returned by Cldr.Locale.new!/2 The default is options[:backend].get_locale() Returns An :percent or permille or {:error, {exception, message}} Examples iex> Plausible.Cldr.Number . resolve_per "11%" [ "11" , :percent ] iex> Plausible.Cldr.Number . resolve_per "% of linguists" [ :percent , " of linguists" ] iex> Plausible.Cldr.Number . resolve_per "% of linguists %" [ :percent , " of linguists " , :percent ]","ref":"Plausible.Cldr.Number.html#resolve_per/2","title":"Plausible.Cldr.Number.resolve_per/2","type":"function"},{"doc":"Resolve and tokenize percent and permille sybols from strings within a list. Percent and permille symbols can be identified at the beginning and/or the end of a string. Arguments list is any list in which percent and permille symbols are expected options is a keyword list of options Options :locale is any valid locale returned by Cldr.known_locale_names/1 or a t:Cldr.LanguageTag struct returned by Cldr.Locale.new!/2 The default is options[:backend].get_locale() Examples iex> Plausible.Cldr.Number . scan ( "100%" ) ...> |> Plausible.Cldr.Number . resolve_pers ( ) [ 100 , :percent ]","ref":"Plausible.Cldr.Number.html#resolve_pers/2","title":"Plausible.Cldr.Number.resolve_pers/2","type":"function"},{"doc":"Scans a string locale-aware manner and returns a list of strings and numbers. Arguments string is any String.t options is a keyword list of options Options :number is one of :integer , :float , :decimal or nil . The default is nil meaning that the type auto-detected as either an integer or a float . :locale is any locale returned by Cldr.known_locale_names/1 or a Cldr.LanguageTag.t . The default is Plausible.Cldr.get_locale/0 . Returns A list of strings and numbers Notes Number parsing is performed by Cldr.Number.Parser.parse/2 and any options provided are passed to that function. Examples 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 ( "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 loss is -1.000 euros" , locale : "de" , number : :integer ) [ "The loss is " , - 1000 , " euros" ]","ref":"Plausible.Cldr.Number.html#scan/2","title":"Plausible.Cldr.Number.scan/2","type":"function"},{"doc":"Formats a number and applies the :approximately format for a locale and number system. Arguments number is an integer, float or Decimal to be formatted options is a keyword list defining how the number is to be formatted. See Cldr.Number.to_string/3 for a description of the available options. Example iex> Plausible.Cldr.Number . to_approx_string 1234 { :ok , "~1,234" }","ref":"Plausible.Cldr.Number.html#to_approx_string/2","title":"Plausible.Cldr.Number.to_approx_string/2","type":"function"},{"doc":"Formats a number and applies the :at_least format for a locale and number system. Arguments number is an integer, float or Decimal to be formatted options is a keyword list defining how the number is to be formatted. See Plausible.Cldr.Number.to_string/2 for a description of the available options. Example iex> Plausible.Cldr.Number . to_at_least_string 1234 { :ok , "1,234+" }","ref":"Plausible.Cldr.Number.html#to_at_least_string/2","title":"Plausible.Cldr.Number.to_at_least_string/2","type":"function"},{"doc":"Formats a number and applies the :at_most format for a locale and number system. Arguments number is an integer, float or Decimal to be formatted options is a keyword list defining how the number is to be formatted. See Cldr.Number.to_string/3 for a description of the available options. Example iex> Plausible.Cldr.Number . to_at_most_string 1234 { :ok , "≤1,234" }","ref":"Plausible.Cldr.Number.html#to_at_most_string/2","title":"Plausible.Cldr.Number.to_at_most_string/2","type":"function"},{"doc":"Formats the first and last numbers of a range and applies the :range format for a locale and number system. Arguments number is an integer, float or Decimal to be formatted options is a keyword list defining how the number is to be formatted. See Cldr.Number.to_string/3 for a description of the available options. Example iex> Plausible.Cldr.Number . to_range_string 1234 .. 5678 { :ok , "1,234–5,678" }","ref":"Plausible.Cldr.Number.html#to_range_string/2","title":"Plausible.Cldr.Number.to_range_string/2","type":"function"},{"doc":"Returns a number formatted into a string according to a format pattern and options. Arguments number is an integer, float or Decimal to be formatted options is a keyword list defining how the number is to be formatted. Options format : the format style or a format string defining how the number is formatted. See Cldr.Number.Format for how format strings can be constructed. See Cldr.Number.Format.format_styles_for/3 to return available format styles for a locale. The default format is :standard . If :format is set to :long or :short then the formatting depends on whether :currency is specified. If not specified then the number is formatted as :decimal_long or :decimal_short . If :currency is specified the number is formatted as :currency_long or :currency_short and :fractional_digits is set to 0 as a default. :format may also be a format defined by CLDR's Rules Based Number Formats (RBNF). Further information is found in the module Cldr.Rbnf . The most commonly used formats in this category are to spell out the number in a the locales language. The applicable formats are :spellout , :spellout_year , :ordinal . A number can also be formatted as roman numbers by using the format :roman or :roman_lower . currency : is the currency for which the number is formatted. For available currencies see Cldr.Currency.known_currencies/0 . This option is required if :format is set to :currency . If currency is set and no :format is set, :format will be set to :currency as well. currency_symbol : Allows overriding a currency symbol. The alternatives are: :iso the ISO currency code will be used instead of the default currency symbol. :narrow uses the narrow symbol defined for the locale. The same narrow symbol can be defined for more than one currency and therefore this should be used with care. If no narrow symbol is defined, the standard symbol is used. :symbol uses the standard symbol defined in CLDR. A symbol is unique for each currency and can be safely used. "string" uses string as the currency symbol :standard (the default and recommended) uses the CLDR-defined symbol based upon the currency format for the locale. :cash : a boolean which indicates whether a number being formatted as a :currency is to be considered a cash value or not. Currencies can be rounded differently depending on whether :cash is true or false . *This option is deprecated in favour of currency_digits: :cash . :currency_digits indicates which of the rounding and digits should be used. The options are :accounting which is the default, :cash or :iso :rounding_mode : determines how a number is rounded to meet the precision of the format requested. The available rounding modes are :down , :half_up, :half_even, :ceiling, :floor, :half_down, :up. The default is :half_even . :number_system : determines which of the number systems for a locale should be used to define the separators and digits for the formatted number. If number_system is an atom then number_system is interpreted as a number system. If the :number_system is binary then it is interpreted as a number system name. See Cldr.Number.System.number_system_names_for/2 . The default is :default . :locale : determines the locale in which the number is formatted. See Cldr.known_locale_names/0 . The default is Cldr.get_locale/0 which is the locale currently in affect for this Process and which is set by Cldr.put_locale/1 . If :fractional_digits is set to a positive integer value then the number will be rounded to that number of digits and displayed accordingly - overriding settings that would be applied by default. For example, currencies have fractional digits defined reflecting each currencies minor unit. Setting :fractional_digits will override that setting. If :maximum_integer_digits is set to a positive integer value then the number is left truncated before formatting. For example if the number 1234 is formatted with the option maximum_integer_digits: 2 , the number is truncated to 34 and formatted. If :round_nearest is set to a positive integer value then the number will be rounded to nearest increment of that value - overriding settings that would be applied by default. :minimum_grouping_digits overrides the CLDR definition of minimum grouping digits. For example in the locale es the number 1234 is formatted by default as 1345 because the locale defines the minimium_grouping_digits as 2 . If minimum_grouping_digits: 1 is set as an option the number is formatting as 1.345 . The :minimum_grouping_digits is added to the grouping defined by the number format. If the sum of these two digits is greater than the number of digits in the integer (or fractional) part of the number then no grouping is performed. :wrapper is a 2-arity function that will be called for each number component with parameters string and tag where tag is one of :number , :currency_symbol , :currency_space , :literal , :quote , :percent , :permille , :minus or :plus . The function must return a string. The function can be used to wrap format elements in HTML or other tags. Locale extensions affecting formatting A locale identifier can specify options that affect number formatting. These options are: nu : defines the number system to be used if none is specified by the :number_system option to to_string/2 This key is part of the u extension and that document should be consulted for details on how to construct a locale identifier with these extensions. Wrapping format elements Wrapping elements is particularly useful when formatting a number with a currency symbol and the requirement is to have different HTML formatting applied to the symbol than the number. For example: 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 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 ) ...> 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 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. This can be achieved by specifying a :wrapper option. This option takes a 2-arity function as an argument. For each element of the format the wrapper function is called with two parameters: the format element as a string and an atom representing the element type. The wrapper function is required to return a string that is then inserted in the final formatted number. Returns {:ok, string} or {:error, {exception, message}} Examples iex> Plausible.Cldr.Number . to_string 12345 { :ok , "12,345" } iex> Plausible.Cldr.Number . to_string 12345 , locale : "fr" { :ok , "12 345" } iex> Plausible.Cldr.Number . to_string 1345.32 , currency : :EUR , locale : "es" , minimum_grouping_digits : 1 { :ok , "1.345,32 €" } iex> Plausible.Cldr.Number . to_string 1345.32 , currency : :EUR , locale : "es" { :ok , "1345,32 €" } iex> Plausible.Cldr.Number . to_string 12345 , locale : "fr" , currency : "USD" { :ok , "12 345,00 $US" } iex> Plausible.Cldr.Number . to_string 12345 , format : "#E0" { :ok , "1.2345E4" } iex> Plausible.Cldr.Number . to_string 12345 , format : :accounting , currency : "THB" { :ok , "THB 12,345.00" } iex> Plausible.Cldr.Number . to_string - 12345 , format : :accounting , currency : "THB" { :ok , "(THB 12,345.00)" } iex> Plausible.Cldr.Number . to_string 12345 , format : :accounting , currency : "THB" , ...> locale : "th" { :ok , "฿12,345.00" } iex> Plausible.Cldr.Number . to_string 12345 , format : :accounting , currency : "THB" , ...> locale : "th" , number_system : :native { :ok , "฿๑๒,๓๔๕.๐๐" } iex> Plausible.Cldr.Number . to_string 1244.30 , format : :long { :ok , "1 thousand" } iex> Plausible.Cldr.Number . to_string 1244.30 , format : :long , currency : "USD" { :ok , "1,244 US dollars" } iex> Plausible.Cldr.Number . to_string 1244.30 , format : :short { :ok , "1K" } iex> Plausible.Cldr.Number . to_string 1244.30 , format : :short , currency : "EUR" { :ok , "€1K" } iex> Plausible.Cldr.Number . to_string 1234 , format : :spellout { :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" } iex> Plausible.Cldr.Number . to_string 1989 , format : :spellout_year { :ok , "nineteen eighty-nine" } iex> Plausible.Cldr.Number . to_string 123 , format : :ordinal { :ok , "123rd" } iex> Plausible.Cldr.Number . to_string 123 , format : :roman { :ok , "CXXIII" } iex> Plausible.Cldr.Number . to_string 123 , locale : "th-u-nu-thai" { :ok , "๑๒๓" } Errors An error tuple {:error, reason} will be returned if an error is detected. The two most likely causes of an error return are: A format cannot be compiled. In this case the error tuple will look like: iex> Plausible.Cldr.Number . to_string ( 12345 , format : "0#" ) { :error , { Cldr.FormatCompileError , "Decimal format compiler: syntax error before: \\" # \\" " } } The format style requested is not defined for the 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" ) { :error , { Cldr.UnknownFormatError , "The locale :he with number system :hebr does not define a format :standard" } }","ref":"Plausible.Cldr.Number.html#to_string/2","title":"Plausible.Cldr.Number.to_string/2","type":"function"},{"doc":"Same as the execution of to_string/2 but raises an exception if an error would be returned. Arguments number is an integer, float or Decimal to be formatted options is a keyword list defining how the number is to be formatted. See Plausible.Cldr.Number.to_string/2 Returns a formatted number as a string or raises an exception Examples iex> Plausible.Cldr.Number . to_string! 12345 "12,345" iex> Plausible.Cldr.Number . to_string! 12345 , locale : "fr" "12 345"","ref":"Plausible.Cldr.Number.html#to_string!/2","title":"Plausible.Cldr.Number.to_string!/2","type":"function"},{"doc":"Return a valid number system from a provided locale and number system name or type. The number system or number system type must be valid for the given locale. If a number system type is provided, the underlying number system is returned. Arguments locale is any valid locale name returned by Cldr.known_locale_names/1 or a Cldr.LanguageTag struct returned by Cldr.Locale.new!/2 system_name is any number system name returned by Cldr.known_number_systems/0 or a number system type returned by Cldr.known_number_system_types/0 Examples iex> Plausible.Cldr.Number . validate_number_system "en" , :latn { :ok , :latn } iex> Plausible.Cldr.Number . validate_number_system "en" , :default { :ok , :latn } iex> Plausible.Cldr.Number . validate_number_system "en" , :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" } }","ref":"Plausible.Cldr.Number.html#validate_number_system/2","title":"Plausible.Cldr.Number.validate_number_system/2","type":"function"},{"doc":"Implements cardinal plural rules for numbers.","ref":"Plausible.Cldr.Number.Cardinal.html","title":"Plausible.Cldr.Number.Cardinal","type":"module"},{"doc":"The locale names for which plural rules are defined.","ref":"Plausible.Cldr.Number.Cardinal.html#available_locale_names/0","title":"Plausible.Cldr.Number.Cardinal.available_locale_names/0","type":"function"},{"doc":"The configured locales for which plural rules are defined. Returns the intersection of Plausible.Cldr.known_locale_names/0 and the locales for which Cardinal plural rules are defined. There are many Cldr locales which don't have their own plural rules so this list is the intersection of Cldr 's configured locales and those that have rules.","ref":"Plausible.Cldr.Number.Cardinal.html#known_locale_names/0","title":"Plausible.Cldr.Number.Cardinal.known_locale_names/0","type":"function"},{"doc":"Return the plural key for a given number in a given locale Returns which plural key ( :zero , :one , :two , :few , :many or :other ) a given number fits into within the context of a given locale. Note that these key names should not be interpreted literally. For example, the key returned from Cldr.Number.Ordinal.plural_rule(0, "en") is actually :other , not :zero . This key can then be used to format a number, date, time, unit, list or other content in a plural-sensitive way. Arguments number is any integer , float or Decimal locale is any locale returned by Cldr.Locale.new!/2 or any locale_name returned by Plausible.Cldr.known_locale_names/0 rounding is one of [:down, :up, :ceiling, :floor, :half_even, :half_up, :half_down] . The default is :half_even . Examples iex> Plausible.Cldr.Number.Cardinal . plural_rule 0 , "fr" :one iex> Plausible.Cldr.Number.Cardinal . plural_rule 0 , "en" :other","ref":"Plausible.Cldr.Number.Cardinal.html#plural_rule/3","title":"Plausible.Cldr.Number.Cardinal.plural_rule/3","type":"function"},{"doc":"Returns all the plural rules defined in CLDR.","ref":"Plausible.Cldr.Number.Cardinal.html#plural_rules/0","title":"Plausible.Cldr.Number.Cardinal.plural_rules/0","type":"function"},{"doc":"Return the plural rules for a locale. Arguments locale is any locale returned by Plausible.Cldr.Locale.new!/1 or any locale_name returned by Plausible.Cldr.known_locale_names/0 The rules are returned in AST form after parsing.","ref":"Plausible.Cldr.Number.Cardinal.html#plural_rules_for/1","title":"Plausible.Cldr.Number.Cardinal.plural_rules_for/1","type":"function"},{"doc":"Pluralize a number using cardinal plural rules and a substitution map. Arguments number is an integer, float or Decimal locale is any locale returned by Plausible.Cldr.Locale.new!/1 or any locale_name returned by Plausible.Cldr.known_locale_names/0 substitutions is a map that maps plural keys to a string. The valid substitution keys are :zero , :one , :two , :few , :many and :other . See also Plausible.Cldr.Number.Cardinal.Cardinal.plural_rule/3 . Examples iex> Plausible.Cldr.Number.Cardinal . pluralize 1 , "en" , %{ one : "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" } "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" } "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" } nil 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" } "other"","ref":"Plausible.Cldr.Number.Cardinal.html#pluralize/3","title":"Plausible.Cldr.Number.Cardinal.pluralize/3","type":"function"},{"doc":"Functions to manage the collection of number patterns defined in Cldr. Number patterns affect how numbers are interpreted in a localized context. Here are some examples, based on the French locale. The "." shows where the decimal point should go. The "," shows where the thousands separator should go. A "0" indicates zero-padding: if the number is too short, a zero (in the locale's numeric set) will go there. A "#" indicates no padding: if the number is too short, nothing goes there. A "¤" shows where the currency sign will go. The following illustrates the effects of different patterns for the French locale, with the number "1234.567". Notice how the pattern characters ',' and '.' are replaced by the characters appropriate for the locale. Number Pattern Examples Pattern Currency Text #,##0.## n/a 1 234,57 #,##0.### n/a 1 234,567 ###0.##### n/a 1234,567 ###0.0000# n/a 1234,5670 00000.0000 n/a 01234,5670 #,##0.00 ¤ EUR 1 234,57 € The number of # placeholder characters before the decimal do not matter, since no limit is placed on the maximum number of digits. There should, however, be at least one zero some place in the pattern. In currency formats, the number of digits after the decimal also do not matter, since the information in the supplemental data (see Supplemental Currency Data) is used to override the number of decimal places — and the rounding — according to the currency that is being formatted. That can be seen in the above chart, with the difference between Yen and Euro formatting. Details of the number formats are described in the Unicode documentation","ref":"Plausible.Cldr.Number.Format.html","title":"Plausible.Cldr.Number.Format","type":"module"},{"doc":"Returns the decimal formats defined for a given locale. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 . The default is Plausible.Cldr.get_locale/0 . Returns {:ok, map} where map is a map of decimal formats keyed by number system or {:error, {exception, message}}","ref":"Plausible.Cldr.Number.Format.html#all_formats_for/1","title":"Plausible.Cldr.Number.Format.all_formats_for/1","type":"function"},{"doc":"Returns the decimal formats defined for a given locale. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 . The default is Plausible.Cldr.get_locale/0 . Returns {:ok, map} where map is a map of decimal formats keyed by number system or raises an exception See Plausible.Cldr.Number.Format.Number.Format.all_formats_for/1 for further information.","ref":"Plausible.Cldr.Number.Format.html#all_formats_for!/1","title":"Plausible.Cldr.Number.Format.all_formats_for!/1","type":"function"},{"doc":"Returns the currency space for a given locale and number system.","ref":"Plausible.Cldr.Number.Format.html#currency_spacing/2","title":"Plausible.Cldr.Number.Format.currency_spacing/2","type":"function"},{"doc":"Returns the list of decimal formats in the configured locales including the list of locales configured for precompilation in config.exs . This function exists to allow the decimal formatter to precompile all the known formats at compile time. Example #=> Plausible.Cldr.Number.Format.Format.decimal_format_list [ "#" , "#,##,##0%" , "#,##,##0.###" , "#,##,##0.00¤" , "#,##,##0.00¤;(#,##,##0.00¤)" , "#,##,##0 %" , "#,##0%" , "#,##0.###" , "#,##0.00 ¤" , "#,##0.00 ¤;(#,##0.00 ¤)" , "#,##0.00¤" , "#,##0.00¤;(#,##0.00¤)" , "#,##0 %" , "#0%" , "#0.######" , "#0.00 ¤" , "#E0" , "%#,##0" , "% #,##0" , "0" , "0.000000E+000" , "0000 M ¤" , "0000¤" , "000G ¤" , "000K ¤" , "000M ¤" , "000T ¤" , "000mM ¤" , "000m ¤" , "000 Bio'.' ¤" , "000 Bln ¤" , "000 Bn ¤" , "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 ¤" , ... ]","ref":"Plausible.Cldr.Number.Format.html#decimal_format_list/0","title":"Plausible.Cldr.Number.Format.decimal_format_list/0","type":"function"},{"doc":"Returns the list of decimal formats for a configured locale. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 . The default is Plausible.Cldr.get_locale/0 . This function exists to allow the decimal formatter to precompile all the known formats at compile time. Its use is not otherwise recommended. Example 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" , "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" , "¤ #,##0.00" , "¤ #,##0.00;(¤ #,##0.00)" , "¤ 000B" , "¤ 000K" , "¤ 000M" , "¤ 000T" , "¤ 00B" , "¤ 00K" , "¤ 00M" , "¤ 00T" , "¤ 0B" , "¤ 0K" , "¤ 0M" , "¤ 0T" ] }","ref":"Plausible.Cldr.Number.Format.html#decimal_format_list_for/1","title":"Plausible.Cldr.Number.Format.decimal_format_list_for/1","type":"function"},{"doc":"Returns the default grouping for a locale as a map. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 . The default is Plausible.Cldr.get_locale/0 . Returns {:ok, grouping} or {:error, {exception, message}} Examples iex> Plausible.Cldr.Number.Format . default_grouping_for ( :en ) { :ok , %{ fraction : %{ first : 0 , rest : 0 } , integer : %{ first : 3 , rest : 3 } } }","ref":"Plausible.Cldr.Number.Format.html#default_grouping_for/1","title":"Plausible.Cldr.Number.Format.default_grouping_for/1","type":"function"},{"doc":"Returns the default grouping for a locale or raises on error. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 . The default is Plausible.Cldr.get_locale/0 . Returns grouping as a map or raises an exception Examples iex> Plausible.Cldr.Number.Format . default_grouping_for! ( :en ) %{ fraction : %{ first : 0 , rest : 0 } , integer : %{ first : 3 , rest : 3 } }","ref":"Plausible.Cldr.Number.Format.html#default_grouping_for!/1","title":"Plausible.Cldr.Number.Format.default_grouping_for!/1","type":"function"},{"doc":"Return the predfined formats for a given locale and number_system . Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 . The default is Plausible.Cldr.get_locale/0 . number_system is any valid number system or number system type returned by Plausible.Cldr.Number.System.number_systems_for/1 . Example Plausible.Cldr.Number.Format . formats_for :fr , :native #=> %Cldr.Number.Format{ accounting : "#,##0.00 ¤;(#,##0.00 ¤)" , currency : "#,##0.00 ¤" , 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 ¤" ] } ] , ... }","ref":"Plausible.Cldr.Number.Format.html#formats_for/2","title":"Plausible.Cldr.Number.Format.formats_for/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Number.Format.html#formats_for!/2","title":"Plausible.Cldr.Number.Format.formats_for!/2","type":"function"},{"doc":"Returns the minimum grouping digits for a locale. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 . The default is Plausible.Cldr.get_locale/0 . Returns {:ok, minumum_digits} or {:error, {exception, message}} Examples iex> Plausible.Cldr.Number.Format . minimum_grouping_digits_for ( "en" ) { :ok , 1 }","ref":"Plausible.Cldr.Number.Format.html#minimum_grouping_digits_for/1","title":"Plausible.Cldr.Number.Format.minimum_grouping_digits_for/1","type":"function"},{"doc":"Returns the minimum grouping digits for a locale or raises on error. Arguments locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 . The default is Plausible.Cldr.get_locale/0 . Returns minumum_digits or raises an exception Examples iex> Plausible.Cldr.Number.Format . minimum_grouping_digits_for! ( "en" ) 1","ref":"Plausible.Cldr.Number.Format.html#minimum_grouping_digits_for!/1","title":"Plausible.Cldr.Number.Format.minimum_grouping_digits_for!/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Number.Formatter.Decimal.html","title":"Plausible.Cldr.Number.Formatter.Decimal","type":"module"},{"doc":"","ref":"Plausible.Cldr.Number.Formatter.Decimal.html#metadata!/1","title":"Plausible.Cldr.Number.Formatter.Decimal.metadata!/1","type":"function"},{"doc":"Formats a number according to a decimal format string. Arguments number is an integer, float or Decimal format is a format string. See Plausible.Cldr.Number for further information. options is a map of options. See Plausible.Cldr.Number.to_string/2 for further information.","ref":"Plausible.Cldr.Number.Formatter.Decimal.html#to_string/3","title":"Plausible.Cldr.Number.Formatter.Decimal.to_string/3","type":"function"},{"doc":"Implements ordinal plural rules for numbers.","ref":"Plausible.Cldr.Number.Ordinal.html","title":"Plausible.Cldr.Number.Ordinal","type":"module"},{"doc":"The locale names for which plural rules are defined.","ref":"Plausible.Cldr.Number.Ordinal.html#available_locale_names/0","title":"Plausible.Cldr.Number.Ordinal.available_locale_names/0","type":"function"},{"doc":"The configured locales for which plural rules are defined. Returns the intersection of Plausible.Cldr.known_locale_names/0 and the locales for which Ordinal plural rules are defined. There are many Cldr locales which don't have their own plural rules so this list is the intersection of Cldr 's configured locales and those that have rules.","ref":"Plausible.Cldr.Number.Ordinal.html#known_locale_names/0","title":"Plausible.Cldr.Number.Ordinal.known_locale_names/0","type":"function"},{"doc":"Return the plural key for a given number in a given locale Returns which plural key ( :zero , :one , :two , :few , :many or :other ) a given number fits into within the context of a given locale. Note that these key names should not be interpreted literally. For example, the key returned from Cldr.Number.Ordinal.plural_rule(0, "en") is actually :other , not :zero . This key can then be used to format a number, date, time, unit, list or other content in a plural-sensitive way. Arguments number is any integer , float or Decimal locale is any locale returned by Cldr.Locale.new!/2 or any locale_name returned by Plausible.Cldr.known_locale_names/0 rounding is one of [:down, :up, :ceiling, :floor, :half_even, :half_up, :half_down] . The default is :half_even . Examples iex> Plausible.Cldr.Number.Ordinal . plural_rule 0 , "fr" :other iex> Plausible.Cldr.Number.Ordinal . plural_rule 1 , "en" :one","ref":"Plausible.Cldr.Number.Ordinal.html#plural_rule/3","title":"Plausible.Cldr.Number.Ordinal.plural_rule/3","type":"function"},{"doc":"Returns all the plural rules defined in CLDR.","ref":"Plausible.Cldr.Number.Ordinal.html#plural_rules/0","title":"Plausible.Cldr.Number.Ordinal.plural_rules/0","type":"function"},{"doc":"Return the plural rules for a locale. Arguments locale is any locale returned by Plausible.Cldr.Locale.new!/1 or any locale_name returned by Plausible.Cldr.known_locale_names/0 The rules are returned in AST form after parsing.","ref":"Plausible.Cldr.Number.Ordinal.html#plural_rules_for/1","title":"Plausible.Cldr.Number.Ordinal.plural_rules_for/1","type":"function"},{"doc":"Pluralize a number using ordinal plural rules and a substitution map. Arguments number is an integer, float or Decimal or a Range.t{} . When a range, The is that in any usage, the start value is strictly less than the end value, and that no values are negative. Results for any cases that do not meet these criteria are undefined. locale is any locale returned by Plausible.Cldr.Locale.new!/1 or any locale_name returned by Plausible.Cldr.known_locale_names/0 substitutions is a map that maps plural keys to a string. The valid substitution keys are :zero , :one , :two , :few , :many and :other . See also Plausible.Cldr.Number.Ordinal.Ordinal.plural_rule/3 . Examples iex> Plausible.Cldr.Number.Ordinal . pluralize 1 , :en , %{ one : "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" } "two" 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" } "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" } "two" 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" } "other"","ref":"Plausible.Cldr.Number.Ordinal.html#pluralize/3","title":"Plausible.Cldr.Number.Ordinal.pluralize/3","type":"function"},{"doc":"Implements plural rules for ranges","ref":"Plausible.Cldr.Number.PluralRule.Range.html","title":"Plausible.Cldr.Number.PluralRule.Range","type":"module"},{"doc":"Returns a final plural type for a start-of-range plural type, an end-of-range plural type and a locale. Arguments first is a plural type for the start of a range last is a plural type for the end of a range locale is any Cldr.LanguageTag.t or a language name (not locale name) Example iex> Plausible.Cldr.Number.PluralRule.Range . plural_rule :other , :few , "ar" :few","ref":"Plausible.Cldr.Number.PluralRule.Range.html#plural_rule/3","title":"Plausible.Cldr.Number.PluralRule.Range.plural_rule/3","type":"function"},{"doc":"","ref":"Plausible.Cldr.Number.Symbol.html","title":"Plausible.Cldr.Number.Symbol","type":"module"},{"doc":"Returns a list of all decimal symbols defined by the locales configured in this backend as a list.","ref":"Plausible.Cldr.Number.Symbol.html#all_decimal_symbols/0","title":"Plausible.Cldr.Number.Symbol.all_decimal_symbols/0","type":"function"},{"doc":"Returns a list of all decimal symbols defined by the locales configured in this backend as a string. This string can be used as a character class when builing a regular expression.","ref":"Plausible.Cldr.Number.Symbol.html#all_decimal_symbols_class/0","title":"Plausible.Cldr.Number.Symbol.all_decimal_symbols_class/0","type":"function"},{"doc":"Returns a list of all grouping symbols defined by the locales configured in this backend as a list.","ref":"Plausible.Cldr.Number.Symbol.html#all_grouping_symbols/0","title":"Plausible.Cldr.Number.Symbol.all_grouping_symbols/0","type":"function"},{"doc":"Returns a list of all grouping symbols defined by the locales configured in this backend as a string. This string can be used as a character class when builing a regular expression.","ref":"Plausible.Cldr.Number.Symbol.html#all_grouping_symbols_class/0","title":"Plausible.Cldr.Number.Symbol.all_grouping_symbols_class/0","type":"function"},{"doc":"Returns a map of Cldr.Number.Symbol.t structs of the number symbols for each of the number systems of a locale. Options locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 . The default is Plausible.Cldr.get_locale/0 . Example: iex> Plausible.Cldr.Number.Symbol . number_symbols_for ( :th ) { :ok , %{ latn : % Cldr.Number.Symbol { decimal : "." , exponential : "E" , group : "," , infinity : "∞" , list : ";" , minus_sign : "-" , nan : "NaN" , per_mille : "‰" , percent_sign : "%" , plus_sign : "+" , superscripting_exponent : "×" , time_separator : ":" } , thai : % Cldr.Number.Symbol { decimal : "." , exponential : "E" , group : "," , infinity : "∞" , list : ";" , minus_sign : "-" , nan : "NaN" , per_mille : "‰" , percent_sign : "%" , plus_sign : "+" , superscripting_exponent : "×" , time_separator : ":" } } }","ref":"Plausible.Cldr.Number.Symbol.html#number_symbols_for/1","title":"Plausible.Cldr.Number.Symbol.number_symbols_for/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Number.Symbol.html#number_symbols_for/2","title":"Plausible.Cldr.Number.Symbol.number_symbols_for/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Number.System.html","title":"Plausible.Cldr.Number.System","type":"module"},{"doc":"Returns the actual number system from a number system type. locale is any valid locale name returned by Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Cldr.Locale.new!/2 system_name is any number system name returned by Cldr.known_number_systems/0 or a number system type returned by Cldr.known_number_system_types/0 This function will decode a number system type into the actual number system. If the number system provided can't be decoded it is returned as is. Examples iex> Plausible.Cldr.Number.System . number_system_for "th" , :latn { :ok , %{ digits : "0123456789" , type : :numeric } } iex> Plausible.Cldr.Number.System . number_system_for "en" , :default { :ok , %{ digits : "0123456789" , type : :numeric } } iex> Plausible.Cldr.Number.System . number_system_for "he" , :traditional { :ok , %{ rules : "hebrew" , type : :algorithmic } } iex> Plausible.Cldr.Number.System . number_system_for "en" , :native { :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}" } }","ref":"Plausible.Cldr.Number.System.html#number_system_for/2","title":"Plausible.Cldr.Number.System.number_system_for/2","type":"function"},{"doc":"Returns the number system from a language tag or locale name. Arguments locale is any language tag returned be Cldr.Locale.new/2 or a locale name in the list returned by Cldr.known_locale_names/1 Returns A number system name as an atom Examples iex> Plausible.Cldr.Number.System . number_system_from_locale "en-US-u-nu-thai" :thai iex> Plausible.Cldr.Number.System . number_system_from_locale "en-US" :latn","ref":"Plausible.Cldr.Number.System.html#number_system_from_locale/1","title":"Plausible.Cldr.Number.System.number_system_from_locale/1","type":"function"},{"doc":"Returns the number systems available for a locale or {:error, message} if the locale is not known. locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 Examples iex> Plausible.Cldr.Number.System . number_system_names_for "en" { :ok , [ :latn ] } iex> Plausible.Cldr.Number.System . number_system_names_for "zz" { :error , { Cldr.InvalidLanguageError , "The language \\" zz \\" is invalid" } }","ref":"Plausible.Cldr.Number.System.html#number_system_names_for/1","title":"Plausible.Cldr.Number.System.number_system_names_for/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Number.System.html#number_system_names_for!/1","title":"Plausible.Cldr.Number.System.number_system_names_for!/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Number.System.html#number_system_types_for/1","title":"Plausible.Cldr.Number.System.number_system_types_for/1","type":"function"},{"doc":"Returns the number systems available for a locale or {:error, message} if the locale is not known. locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 Examples iex> Plausible.Cldr.Number.System . number_systems_for "en" { :ok , %{ default : :latn , native : :latn } } iex> Plausible.Cldr.Number.System . number_systems_for "th" { :ok , %{ default : :latn , native : :thai } } iex> Plausible.Cldr.Number.System . number_systems_for "zz" { :error , { Cldr.InvalidLanguageError , "The language \\" zz \\" is invalid" } }","ref":"Plausible.Cldr.Number.System.html#number_systems_for/1","title":"Plausible.Cldr.Number.System.number_systems_for/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Number.System.html#number_systems_for!/1","title":"Plausible.Cldr.Number.System.number_systems_for!/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Number.System.html#number_systems_like/2","title":"Plausible.Cldr.Number.System.number_systems_like/2","type":"function"},{"doc":"Returns a number system name for a given locale and number system reference. system_name is any number system name returned by Plausible.Cldr.known_number_systems/0 or a number system type returned by Plausible.Cldr.known_number_system_types/0 locale is any valid locale name returned by Plausible.Cldr.known_locale_names/0 or a Cldr.LanguageTag struct returned by Plausible.Cldr.Locale.new!/1 Number systems can be references in one of two ways: As a number system type such as :default, :native, :traditional and :finance. This allows references to a number system for a locale in a consistent fashion for a given use WIth the number system name directly, such as :latn, :arab or any of the other 70 or so This function dereferences the supplied system_name and returns the actual system name. Examples 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 ( :native , "en" ) { :ok , :latn } 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 number system for the given locale as demonstrated in the third example.","ref":"Plausible.Cldr.Number.System.html#system_name_from/2","title":"Plausible.Cldr.Number.System.system_name_from/2","type":"function"},{"doc":"Converts a number into the representation of a non-latin number system. This function converts numbers to a known number system only, it does not provide number formatting. number is a float , integer or Decimal system_name is any number system name returned by Cldr.known_number_systems/0 or a number system type returned by Cldr.known_number_system_types/0 There are two types of number systems in CLDR: :numeric in which the number system defines a direct mapping between the latin digits 0..9 into a the number system equivalent. In this case, to_system/2 invokes Cldr.Number.Transliterate.transliterate_digits/3 for the given number. :algorithmic in which the number system does not have the same structure as the :latn number system and therefore the conversion is done algorithmically. For CLDR the algorithm is implemented through Cldr.Rbnf rulesets. These rulesets are considered by CLDR to be less rigorous than the :numeric number systems and caution and testing for a specific use case is recommended. Examples iex> Plausible.Cldr.Number.System . to_system 123456 , :hebr { :ok , "קכ״ג׳תנ״ו" } iex> Plausible.Cldr.Number.System . to_system 123 , :hans { :ok , "一百二十三" } iex> Plausible.Cldr.Number.System . to_system 123 , :hant { :ok , "一百二十三" } iex> Plausible.Cldr.Number.System . to_system 123 , :hansfin { :ok , "壹佰贰拾叁" }","ref":"Plausible.Cldr.Number.System.html#to_system/2","title":"Plausible.Cldr.Number.System.to_system/2","type":"function"},{"doc":"Converts a number into the representation of a non-latin number system. Returns a converted string or raises on error. number is a float , integer or Decimal system_name is any number system name returned by Plausible.Cldr.known_number_systems/0 or a number system type returned by Plausible.Cldr.known_number_system_types/0 See Plausible.Cldr.Number.System.to_system/2 for further information. Examples iex> Plausible.Cldr.Number.System . to_system! 123 , :hans "一百二十三" iex> Plausible.Cldr.Number.System . to_system! 123 , :hant "一百二十三" iex> Plausible.Cldr.Number.System . to_system! 123 , :hansfin "壹佰贰拾叁"","ref":"Plausible.Cldr.Number.System.html#to_system!/2","title":"Plausible.Cldr.Number.System.to_system!/2","type":"function"},{"doc":"Transliteration for digits and separators. Transliterating a string is an expensive business. First the string has to be exploded into its component graphemes. Then for each grapheme we have to map to the equivalent in the other {locale, number_system} . Then we have to reassemble the string. Effort is made to short circuit where possible. Transliteration is not required for any {locale, number_system} that is the same as {"en", "latn"} since the implementation uses this combination for the placeholders during formatting already. When short circuiting is possible (typically the en-* locales with "latn" number_system - the total number of short circuited locales is 211 of the 537 in CLDR) the overall number formatting is twice as fast than when formal transliteration is required. Configuring precompilation of digit transliterations This module includes Cldr.Number.Transliterate.transliterate_digits/3 which transliterates digits between number systems. For example from :arabic to :latn. Since generating a transliteration map is slow, pairs of transliterations can be configured so that the transliteration map is created at compile time and therefore speeding up transliteration at run time. To configure these transliteration pairs, add the to the use Cldr configuration in a backend module: defmodule MyApp.Cldr do use Cldr , 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 configured: from :latn to :thai and from :arab to :thai . A list of configurable number systems is returned by Cldr.Number.System.systems_with_digits/0 . If a transliteration is requested between two number pairs that have not been configured for precompilation, a warning is logged.","ref":"Plausible.Cldr.Number.Transliterate.html","title":"Plausible.Cldr.Number.Transliterate","type":"module"},{"doc":"Transliterates from latin digits to another number system's digits. Transliterates the latin digits 0..9 to their equivalents in another number system. Also transliterates the decimal and grouping separators as well as the plus, minus and exponent symbols. Any other character in the string will be returned "as is". Arguments sequence is the string to be transliterated. locale is any known locale, defaulting to Plausible.Cldr.get_locale/0 . number_system is any known number system. If expressed as a string it is the actual name of a known number system. If epressed as an atom it is used as a key to look up a number system for the locale (the usual keys are :default and :native but :traditional and :finance are also part of the standard). See Plausible.Cldr.Number.System.number_systems_for/1 for a locale to see what number system types are defined. The default is :default . For available number systems see Cldr.Number.System.number_systems/0 and Plausible.Cldr.Number.System.number_systems_for/1 . Also see Plausible.Cldr.Number.Symbol.number_symbols_for/1 . Examples iex> Plausible.Cldr.Number.Transliterate . transliterate ( "123556" ) "123556" iex> Plausible.Cldr.Number.Transliterate . transliterate ( "123,556.000" , "fr" , :default ) "123 556,000" 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" , :native ) "๑๒๓๕๕๖" iex> Plausible.Cldr.Number.Transliterate . transliterate ( "Some number is: 123556" , "th" , "thai" ) "Some number is: ๑๒๓๕๕๖"","ref":"Plausible.Cldr.Number.Transliterate.html#transliterate/3","title":"Plausible.Cldr.Number.Transliterate.transliterate/3","type":"function"},{"doc":"","ref":"Plausible.Cldr.Number.Transliterate.html#transliterate!/3","title":"Plausible.Cldr.Number.Transliterate.transliterate!/3","type":"function"},{"doc":"Transliterates digits from one number system to another number system digits is binary representation of a number from_system and to_system are number system names in atom form. See Cldr.Number.System.systems_with_digits/0 for available number systems. Example iex> Plausible.Cldr.Number.Transliterate . transliterate_digits "٠١٢٣٤٥٦٧٨٩" , :arab , :latn "0123456789"","ref":"Plausible.Cldr.Number.Transliterate.html#transliterate_digits/3","title":"Plausible.Cldr.Number.Transliterate.transliterate_digits/3","type":"function"},{"doc":"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 ( ) [ :armenian_lower , :armenian_upper , :cyrillic_lower , :ethiopic , :georgian , :greek_lower , :greek_upper , :hebrew , :hebrew_item , :roman_lower , :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" }","ref":"Plausible.Cldr.Rbnf.NumberSystem.html","title":"Plausible.Cldr.Rbnf.NumberSystem","type":"module"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#all_rule_sets/0","title":"Plausible.Cldr.Rbnf.NumberSystem.all_rule_sets/0","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#armenian_lower/1","title":"Plausible.Cldr.Rbnf.NumberSystem.armenian_lower/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#armenian_lower/2","title":"Plausible.Cldr.Rbnf.NumberSystem.armenian_lower/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#armenian_upper/1","title":"Plausible.Cldr.Rbnf.NumberSystem.armenian_upper/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#armenian_upper/2","title":"Plausible.Cldr.Rbnf.NumberSystem.armenian_upper/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower/1","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower/2","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_1_10/2","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower_1_10/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_final/2","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower_final/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_post/2","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower_post/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_thousands/2","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower_thousands/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic/1","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic/2","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic_p1/2","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic_p1/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic_p2/2","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic_p2/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic_p3/2","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic_p3/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic_p/2","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic_p/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#georgian/1","title":"Plausible.Cldr.Rbnf.NumberSystem.georgian/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#georgian/2","title":"Plausible.Cldr.Rbnf.NumberSystem.georgian/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_lower/1","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_lower/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_lower/2","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_lower/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_numeral_majuscules/2","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_numeral_majuscules/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_numeral_minuscules/2","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_numeral_minuscules/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_upper/1","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_upper/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_upper/2","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_upper/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew/1","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew/2","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew_0_99/2","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew_0_99/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew_item/1","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew_item/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew_item/2","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew_item/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew_item_hundreds/2","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew_item_hundreds/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew_thousands/2","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew_thousands/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#roman_lower/1","title":"Plausible.Cldr.Rbnf.NumberSystem.roman_lower/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#roman_lower/2","title":"Plausible.Cldr.Rbnf.NumberSystem.roman_lower/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#roman_upper/1","title":"Plausible.Cldr.Rbnf.NumberSystem.roman_upper/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#roman_upper/2","title":"Plausible.Cldr.Rbnf.NumberSystem.roman_upper/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#rule_sets/0","title":"Plausible.Cldr.Rbnf.NumberSystem.rule_sets/0","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#rule_sets/1","title":"Plausible.Cldr.Rbnf.NumberSystem.rule_sets/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#tamil/1","title":"Plausible.Cldr.Rbnf.NumberSystem.tamil/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#tamil/2","title":"Plausible.Cldr.Rbnf.NumberSystem.tamil/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#tamil_thousands/2","title":"Plausible.Cldr.Rbnf.NumberSystem.tamil_thousands/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#zz_default/1","title":"Plausible.Cldr.Rbnf.NumberSystem.zz_default/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#zz_default/2","title":"Plausible.Cldr.Rbnf.NumberSystem.zz_default/2","type":"function"},{"doc":"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 ] 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" }","ref":"Plausible.Cldr.Rbnf.Ordinal.html","title":"Plausible.Cldr.Rbnf.Ordinal","type":"module"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Ordinal.html#all_rule_sets/0","title":"Plausible.Cldr.Rbnf.Ordinal.all_rule_sets/0","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Ordinal.html#digits_ordinal/2","title":"Plausible.Cldr.Rbnf.Ordinal.digits_ordinal/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Ordinal.html#rule_sets/0","title":"Plausible.Cldr.Rbnf.Ordinal.rule_sets/0","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Ordinal.html#rule_sets/1","title":"Plausible.Cldr.Rbnf.Ordinal.rule_sets/1","type":"function"},{"doc":"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 ( ) [ :spellout_cardinal , :spellout_cardinal_verbose , :spellout_numbering , :spellout_numbering_verbose , :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" }","ref":"Plausible.Cldr.Rbnf.Spellout.html","title":"Plausible.Cldr.Rbnf.Spellout","type":"module"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#all_rule_sets/0","title":"Plausible.Cldr.Rbnf.Spellout.all_rule_sets/0","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#and/2","title":"Plausible.Cldr.Rbnf.Spellout.and/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#and_o/2","title":"Plausible.Cldr.Rbnf.Spellout.and_o/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#commas/2","title":"Plausible.Cldr.Rbnf.Spellout.commas/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#commas_o/2","title":"Plausible.Cldr.Rbnf.Spellout.commas_o/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#r2d_year/2","title":"Plausible.Cldr.Rbnf.Spellout.r2d_year/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#rule_sets/0","title":"Plausible.Cldr.Rbnf.Spellout.rule_sets/0","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#rule_sets/1","title":"Plausible.Cldr.Rbnf.Spellout.rule_sets/1","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_cardinal/2","title":"Plausible.Cldr.Rbnf.Spellout.spellout_cardinal/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_cardinal_verbose/2","title":"Plausible.Cldr.Rbnf.Spellout.spellout_cardinal_verbose/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_numbering/2","title":"Plausible.Cldr.Rbnf.Spellout.spellout_numbering/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_numbering_verbose/2","title":"Plausible.Cldr.Rbnf.Spellout.spellout_numbering_verbose/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_numbering_year/2","title":"Plausible.Cldr.Rbnf.Spellout.spellout_numbering_year/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_ordinal/2","title":"Plausible.Cldr.Rbnf.Spellout.spellout_ordinal/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_ordinal_verbose/2","title":"Plausible.Cldr.Rbnf.Spellout.spellout_ordinal_verbose/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#th/2","title":"Plausible.Cldr.Rbnf.Spellout.th/2","type":"function"},{"doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#tieth/2","title":"Plausible.Cldr.Rbnf.Spellout.tieth/2","type":"function"},{"doc":"Event schema for when NumericIDs migration is complete","ref":"Plausible.ClickhouseEventV2.html","title":"Plausible.ClickhouseEventV2","type":"module"},{"doc":"","ref":"Plausible.ClickhouseEventV2.html#new/1","title":"Plausible.ClickhouseEventV2.new/1","type":"function"},{"doc":"","ref":"Plausible.ClickhouseRepo.html","title":"Plausible.ClickhouseRepo","type":"module"},{"doc":"Callback implementation for Ecto.Repo.aggregate/3 .","ref":"Plausible.ClickhouseRepo.html#aggregate/3","title":"Plausible.ClickhouseRepo.aggregate/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.aggregate/4 .","ref":"Plausible.ClickhouseRepo.html#aggregate/4","title":"Plausible.ClickhouseRepo.aggregate/4","type":"function"},{"doc":"Callback implementation for Ecto.Repo.all/2 .","ref":"Plausible.ClickhouseRepo.html#all/2","title":"Plausible.ClickhouseRepo.all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checked_out?/0 .","ref":"Plausible.ClickhouseRepo.html#checked_out?/0","title":"Plausible.ClickhouseRepo.checked_out?/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checkout/2 .","ref":"Plausible.ClickhouseRepo.html#checkout/2","title":"Plausible.ClickhouseRepo.checkout/2","type":"function"},{"doc":"","ref":"Plausible.ClickhouseRepo.html#child_spec/1","title":"Plausible.ClickhouseRepo.child_spec/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.config/0 .","ref":"Plausible.ClickhouseRepo.html#config/0","title":"Plausible.ClickhouseRepo.config/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.default_options/1 .","ref":"Plausible.ClickhouseRepo.html#default_options/1","title":"Plausible.ClickhouseRepo.default_options/1","type":"function"},{"doc":"A convenience function for SQL-based repositories that forces all connections in the pool to disconnect within the given interval. See Ecto.Adapters.SQL.disconnect_all/3 for more information.","ref":"Plausible.ClickhouseRepo.html#disconnect_all/2","title":"Plausible.ClickhouseRepo.disconnect_all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.exists?/2 .","ref":"Plausible.ClickhouseRepo.html#exists?/2","title":"Plausible.ClickhouseRepo.exists?/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get/3 .","ref":"Plausible.ClickhouseRepo.html#get/3","title":"Plausible.ClickhouseRepo.get/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get!/3 .","ref":"Plausible.ClickhouseRepo.html#get!/3","title":"Plausible.ClickhouseRepo.get!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by/3 .","ref":"Plausible.ClickhouseRepo.html#get_by/3","title":"Plausible.ClickhouseRepo.get_by/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by!/3 .","ref":"Plausible.ClickhouseRepo.html#get_by!/3","title":"Plausible.ClickhouseRepo.get_by!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_dynamic_repo/0 .","ref":"Plausible.ClickhouseRepo.html#get_dynamic_repo/0","title":"Plausible.ClickhouseRepo.get_dynamic_repo/0","type":"function"},{"doc":"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 use Ecto.Schema @primary_key false schema "ecto_ch_demo" do field :a , Ch , type : "UInt64" field :b , :string 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 ) # schemaless { 100_000 , nil } = Repo . insert_stream ( "ecto_ch_demo" , rows , types : [ a : Ch.Types . u64 ( ) , b : :string ] )","ref":"Plausible.ClickhouseRepo.html#insert_stream/3","title":"Plausible.ClickhouseRepo.insert_stream/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.load/2 .","ref":"Plausible.ClickhouseRepo.html#load/2","title":"Plausible.ClickhouseRepo.load/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one/2 .","ref":"Plausible.ClickhouseRepo.html#one/2","title":"Plausible.ClickhouseRepo.one/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one!/2 .","ref":"Plausible.ClickhouseRepo.html#one!/2","title":"Plausible.ClickhouseRepo.one!/2","type":"function"},{"doc":"","ref":"Plausible.ClickhouseRepo.html#parallel_tasks/1","title":"Plausible.ClickhouseRepo.parallel_tasks/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.preload/3 .","ref":"Plausible.ClickhouseRepo.html#preload/3","title":"Plausible.ClickhouseRepo.preload/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.prepare_query/3 .","ref":"Plausible.ClickhouseRepo.html#prepare_query/3","title":"Plausible.ClickhouseRepo.prepare_query/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.put_dynamic_repo/1 .","ref":"Plausible.ClickhouseRepo.html#put_dynamic_repo/1","title":"Plausible.ClickhouseRepo.put_dynamic_repo/1","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query/4 for more information.","ref":"Plausible.ClickhouseRepo.html#query/3","title":"Plausible.ClickhouseRepo.query/3","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query!/4 for more information.","ref":"Plausible.ClickhouseRepo.html#query!/3","title":"Plausible.ClickhouseRepo.query!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload/2 .","ref":"Plausible.ClickhouseRepo.html#reload/2","title":"Plausible.ClickhouseRepo.reload/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload!/2 .","ref":"Plausible.ClickhouseRepo.html#reload!/2","title":"Plausible.ClickhouseRepo.reload!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.start_link/1 .","ref":"Plausible.ClickhouseRepo.html#start_link/1","title":"Plausible.ClickhouseRepo.start_link/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stop/1 .","ref":"Plausible.ClickhouseRepo.html#stop/1","title":"Plausible.ClickhouseRepo.stop/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stream/2 .","ref":"Plausible.ClickhouseRepo.html#stream/2","title":"Plausible.ClickhouseRepo.stream/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that translates the given query to SQL. See Ecto.Adapters.SQL.to_sql/3 for more information.","ref":"Plausible.ClickhouseRepo.html#to_sql/2","title":"Plausible.ClickhouseRepo.to_sql/2","type":"function"},{"doc":"Session schema for when NumericIDs migration is complete","ref":"Plausible.ClickhouseSessionV2.html","title":"Plausible.ClickhouseSessionV2","type":"module"},{"doc":"","ref":"Plausible.ClickhouseSessionV2.html#random_uint64/0","title":"Plausible.ClickhouseSessionV2.random_uint64/0","type":"function"},{"doc":"Custom type to cast Bool as UInt8","ref":"Plausible.ClickhouseSessionV2.BoolUInt8.html","title":"Plausible.ClickhouseSessionV2.BoolUInt8","type":"module"},{"doc":"Callback implementation for Ecto.Type.embed_as/1 .","ref":"Plausible.ClickhouseSessionV2.BoolUInt8.html#embed_as/1","title":"Plausible.ClickhouseSessionV2.BoolUInt8.embed_as/1","type":"function"},{"doc":"Callback implementation for Ecto.Type.equal?/2 .","ref":"Plausible.ClickhouseSessionV2.BoolUInt8.html#equal?/2","title":"Plausible.ClickhouseSessionV2.BoolUInt8.equal?/2","type":"function"},{"doc":"","ref":"Plausible.ConfigHelpers.html","title":"Plausible.ConfigHelpers","type":"module"},{"doc":"","ref":"Plausible.ConfigHelpers.html#get_int_from_path_or_env/3","title":"Plausible.ConfigHelpers.get_int_from_path_or_env/3","type":"function"},{"doc":"","ref":"Plausible.ConfigHelpers.html#get_var_from_path_or_env/3","title":"Plausible.ConfigHelpers.get_var_from_path_or_env/3","type":"function"},{"doc":"This module defines the setup for tests requiring access to the application's data layer. You may define functions here to be used as helpers in your tests. Finally, if the test case interacts with the database, it cannot be async. For this reason, every test runs inside a transaction which is reset at the beginning of the test unless the test case is marked as async.","ref":"Plausible.DataCase.html","title":"Plausible.DataCase","type":"module"},{"doc":"Base module for coordinated Clickhouse data migrations run via remote shell or otherwise (TBD).","ref":"Plausible.DataMigration.html","title":"Plausible.DataMigration","type":"module"},{"doc":"Numeric IDs migration, SQL files available at: priv/data_migrations/NumericIDs/sql","ref":"Plausible.DataMigration.NumericIDs.html","title":"Plausible.DataMigration.NumericIDs","type":"module"},{"doc":"","ref":"Plausible.DataMigration.NumericIDs.html#confirm/3","title":"Plausible.DataMigration.NumericIDs.confirm/3","type":"function"},{"doc":"","ref":"Plausible.DataMigration.NumericIDs.html#run/1","title":"Plausible.DataMigration.NumericIDs.run/1","type":"function"},{"doc":"","ref":"Plausible.DataMigration.NumericIDs.html#run_sql/2","title":"Plausible.DataMigration.NumericIDs.run_sql/2","type":"function"},{"doc":"","ref":"Plausible.DataMigration.NumericIDs.html#run_sql_confirm/2","title":"Plausible.DataMigration.NumericIDs.run_sql_confirm/2","type":"function"},{"doc":"Ecto.Repo for Clickhouse data migrations, to be started manually, outside of the main application supervision tree.","ref":"Plausible.DataMigration.Repo.html","title":"Plausible.DataMigration.Repo","type":"module"},{"doc":"Callback implementation for Ecto.Repo.aggregate/3 .","ref":"Plausible.DataMigration.Repo.html#aggregate/3","title":"Plausible.DataMigration.Repo.aggregate/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.aggregate/4 .","ref":"Plausible.DataMigration.Repo.html#aggregate/4","title":"Plausible.DataMigration.Repo.aggregate/4","type":"function"},{"doc":"Callback implementation for Ecto.Repo.all/2 .","ref":"Plausible.DataMigration.Repo.html#all/2","title":"Plausible.DataMigration.Repo.all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checked_out?/0 .","ref":"Plausible.DataMigration.Repo.html#checked_out?/0","title":"Plausible.DataMigration.Repo.checked_out?/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checkout/2 .","ref":"Plausible.DataMigration.Repo.html#checkout/2","title":"Plausible.DataMigration.Repo.checkout/2","type":"function"},{"doc":"","ref":"Plausible.DataMigration.Repo.html#child_spec/1","title":"Plausible.DataMigration.Repo.child_spec/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.config/0 .","ref":"Plausible.DataMigration.Repo.html#config/0","title":"Plausible.DataMigration.Repo.config/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.default_options/1 .","ref":"Plausible.DataMigration.Repo.html#default_options/1","title":"Plausible.DataMigration.Repo.default_options/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete/2 .","ref":"Plausible.DataMigration.Repo.html#delete/2","title":"Plausible.DataMigration.Repo.delete/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete!/2 .","ref":"Plausible.DataMigration.Repo.html#delete!/2","title":"Plausible.DataMigration.Repo.delete!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete_all/2 .","ref":"Plausible.DataMigration.Repo.html#delete_all/2","title":"Plausible.DataMigration.Repo.delete_all/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that forces all connections in the pool to disconnect within the given interval. See Ecto.Adapters.SQL.disconnect_all/3 for more information.","ref":"Plausible.DataMigration.Repo.html#disconnect_all/2","title":"Plausible.DataMigration.Repo.disconnect_all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.exists?/2 .","ref":"Plausible.DataMigration.Repo.html#exists?/2","title":"Plausible.DataMigration.Repo.exists?/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get/3 .","ref":"Plausible.DataMigration.Repo.html#get/3","title":"Plausible.DataMigration.Repo.get/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get!/3 .","ref":"Plausible.DataMigration.Repo.html#get!/3","title":"Plausible.DataMigration.Repo.get!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by/3 .","ref":"Plausible.DataMigration.Repo.html#get_by/3","title":"Plausible.DataMigration.Repo.get_by/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by!/3 .","ref":"Plausible.DataMigration.Repo.html#get_by!/3","title":"Plausible.DataMigration.Repo.get_by!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_dynamic_repo/0 .","ref":"Plausible.DataMigration.Repo.html#get_dynamic_repo/0","title":"Plausible.DataMigration.Repo.get_dynamic_repo/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert/2 .","ref":"Plausible.DataMigration.Repo.html#insert/2","title":"Plausible.DataMigration.Repo.insert/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert!/2 .","ref":"Plausible.DataMigration.Repo.html#insert!/2","title":"Plausible.DataMigration.Repo.insert!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_all/3 .","ref":"Plausible.DataMigration.Repo.html#insert_all/3","title":"Plausible.DataMigration.Repo.insert_all/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_or_update/2 .","ref":"Plausible.DataMigration.Repo.html#insert_or_update/2","title":"Plausible.DataMigration.Repo.insert_or_update/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_or_update!/2 .","ref":"Plausible.DataMigration.Repo.html#insert_or_update!/2","title":"Plausible.DataMigration.Repo.insert_or_update!/2","type":"function"},{"doc":"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 use Ecto.Schema @primary_key false schema "ecto_ch_demo" do field :a , Ch , type : "UInt64" field :b , :string 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 ) # schemaless { 100_000 , nil } = Repo . insert_stream ( "ecto_ch_demo" , rows , types : [ a : Ch.Types . u64 ( ) , b : :string ] )","ref":"Plausible.DataMigration.Repo.html#insert_stream/3","title":"Plausible.DataMigration.Repo.insert_stream/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.load/2 .","ref":"Plausible.DataMigration.Repo.html#load/2","title":"Plausible.DataMigration.Repo.load/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one/2 .","ref":"Plausible.DataMigration.Repo.html#one/2","title":"Plausible.DataMigration.Repo.one/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one!/2 .","ref":"Plausible.DataMigration.Repo.html#one!/2","title":"Plausible.DataMigration.Repo.one!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.preload/3 .","ref":"Plausible.DataMigration.Repo.html#preload/3","title":"Plausible.DataMigration.Repo.preload/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.prepare_query/3 .","ref":"Plausible.DataMigration.Repo.html#prepare_query/3","title":"Plausible.DataMigration.Repo.prepare_query/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.put_dynamic_repo/1 .","ref":"Plausible.DataMigration.Repo.html#put_dynamic_repo/1","title":"Plausible.DataMigration.Repo.put_dynamic_repo/1","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query/4 for more information.","ref":"Plausible.DataMigration.Repo.html#query/3","title":"Plausible.DataMigration.Repo.query/3","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query!/4 for more information.","ref":"Plausible.DataMigration.Repo.html#query!/3","title":"Plausible.DataMigration.Repo.query!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload/2 .","ref":"Plausible.DataMigration.Repo.html#reload/2","title":"Plausible.DataMigration.Repo.reload/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload!/2 .","ref":"Plausible.DataMigration.Repo.html#reload!/2","title":"Plausible.DataMigration.Repo.reload!/2","type":"function"},{"doc":"","ref":"Plausible.DataMigration.Repo.html#start/2","title":"Plausible.DataMigration.Repo.start/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.start_link/1 .","ref":"Plausible.DataMigration.Repo.html#start_link/1","title":"Plausible.DataMigration.Repo.start_link/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stop/1 .","ref":"Plausible.DataMigration.Repo.html#stop/1","title":"Plausible.DataMigration.Repo.stop/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stream/2 .","ref":"Plausible.DataMigration.Repo.html#stream/2","title":"Plausible.DataMigration.Repo.stream/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that translates the given query to SQL. See Ecto.Adapters.SQL.to_sql/3 for more information.","ref":"Plausible.DataMigration.Repo.html#to_sql/2","title":"Plausible.DataMigration.Repo.to_sql/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update/2 .","ref":"Plausible.DataMigration.Repo.html#update/2","title":"Plausible.DataMigration.Repo.update/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update!/2 .","ref":"Plausible.DataMigration.Repo.html#update!/2","title":"Plausible.DataMigration.Repo.update!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update_all/3 .","ref":"Plausible.DataMigration.Repo.html#update_all/3","title":"Plausible.DataMigration.Repo.update_all/3","type":"function"},{"doc":"Custom type for event name. Accepts Strings and Integers and stores them as String. Returns cast error if any other type is provided. Accepting integers is important for 404 tracking.","ref":"Plausible.Ecto.EventName.html","title":"Plausible.Ecto.EventName","type":"module"},{"doc":"Callback implementation for Ecto.Type.cast/1 .","ref":"Plausible.Ecto.EventName.html#cast/1","title":"Plausible.Ecto.EventName.cast/1","type":"function"},{"doc":"Callback implementation for Ecto.Type.dump/1 .","ref":"Plausible.Ecto.EventName.html#dump/1","title":"Plausible.Ecto.EventName.dump/1","type":"function"},{"doc":"Callback implementation for Ecto.Type.embed_as/1 .","ref":"Plausible.Ecto.EventName.html#embed_as/1","title":"Plausible.Ecto.EventName.embed_as/1","type":"function"},{"doc":"Callback implementation for Ecto.Type.equal?/2 .","ref":"Plausible.Ecto.EventName.html#equal?/2","title":"Plausible.Ecto.EventName.equal?/2","type":"function"},{"doc":"Callback implementation for Ecto.Type.load/1 .","ref":"Plausible.Ecto.EventName.html#load/1","title":"Plausible.Ecto.EventName.load/1","type":"function"},{"doc":"Callback implementation for Ecto.Type.type/0 .","ref":"Plausible.Ecto.EventName.html#type/0","title":"Plausible.Ecto.EventName.type/0","type":"function"},{"doc":"","ref":"Plausible.Event.WriteBuffer.html","title":"Plausible.Event.WriteBuffer","type":"module"},{"doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Plausible.Event.WriteBuffer.html#child_spec/1","title":"Plausible.Event.WriteBuffer.child_spec/1","type":"function"},{"doc":"","ref":"Plausible.Event.WriteBuffer.html#flush/0","title":"Plausible.Event.WriteBuffer.flush/0","type":"function"},{"doc":"Callback implementation for GenServer.init/1 .","ref":"Plausible.Event.WriteBuffer.html#init/1","title":"Plausible.Event.WriteBuffer.init/1","type":"function"},{"doc":"","ref":"Plausible.Event.WriteBuffer.html#insert/1","title":"Plausible.Event.WriteBuffer.insert/1","type":"function"},{"doc":"","ref":"Plausible.Event.WriteBuffer.html#start_link/1","title":"Plausible.Event.WriteBuffer.start_link/1","type":"function"},{"doc":"","ref":"Plausible.Factory.html","title":"Plausible.Factory","type":"module"},{"doc":"","ref":"Plausible.Factory.html#api_key_factory/0","title":"Plausible.Factory.api_key_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#build/2","title":"Plausible.Factory.build/2","type":"function"},{"doc":"","ref":"Plausible.Factory.html#build_list/3","title":"Plausible.Factory.build_list/3","type":"function"},{"doc":"","ref":"Plausible.Factory.html#build_pair/2","title":"Plausible.Factory.build_pair/2","type":"function"},{"doc":"","ref":"Plausible.Factory.html#ch_session_factory/0","title":"Plausible.Factory.ch_session_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#create/1","title":"Plausible.Factory.create/1","type":"function"},{"doc":"","ref":"Plausible.Factory.html#create/2","title":"Plausible.Factory.create/2","type":"function"},{"doc":"","ref":"Plausible.Factory.html#create_list/3","title":"Plausible.Factory.create_list/3","type":"function"},{"doc":"","ref":"Plausible.Factory.html#create_pair/2","title":"Plausible.Factory.create_pair/2","type":"function"},{"doc":"","ref":"Plausible.Factory.html#custom_domain_factory/0","title":"Plausible.Factory.custom_domain_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#enterprise_plan_factory/0","title":"Plausible.Factory.enterprise_plan_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#event_factory/0","title":"Plausible.Factory.event_factory/0","type":"function"},{"doc":"Raises a helpful error if no factory is defined.","ref":"Plausible.Factory.html#factory/1","title":"Plausible.Factory.factory/1","type":"function"},{"doc":"","ref":"Plausible.Factory.html#goal_factory/0","title":"Plausible.Factory.goal_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#google_auth_factory/0","title":"Plausible.Factory.google_auth_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#imported_browsers_factory/0","title":"Plausible.Factory.imported_browsers_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#imported_devices_factory/0","title":"Plausible.Factory.imported_devices_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#imported_entry_pages_factory/0","title":"Plausible.Factory.imported_entry_pages_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#imported_exit_pages_factory/0","title":"Plausible.Factory.imported_exit_pages_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#imported_locations_factory/0","title":"Plausible.Factory.imported_locations_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#imported_operating_systems_factory/0","title":"Plausible.Factory.imported_operating_systems_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#imported_pages_factory/0","title":"Plausible.Factory.imported_pages_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#imported_sources_factory/0","title":"Plausible.Factory.imported_sources_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#imported_visitors_factory/0","title":"Plausible.Factory.imported_visitors_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#insert/1","title":"Plausible.Factory.insert/1","type":"function"},{"doc":"","ref":"Plausible.Factory.html#insert/2","title":"Plausible.Factory.insert/2","type":"function"},{"doc":"","ref":"Plausible.Factory.html#insert/3","title":"Plausible.Factory.insert/3","type":"function"},{"doc":"","ref":"Plausible.Factory.html#insert_list/3","title":"Plausible.Factory.insert_list/3","type":"function"},{"doc":"","ref":"Plausible.Factory.html#insert_list/4","title":"Plausible.Factory.insert_list/4","type":"function"},{"doc":"","ref":"Plausible.Factory.html#insert_pair/2","title":"Plausible.Factory.insert_pair/2","type":"function"},{"doc":"","ref":"Plausible.Factory.html#insert_pair/3","title":"Plausible.Factory.insert_pair/3","type":"function"},{"doc":"","ref":"Plausible.Factory.html#invitation_factory/0","title":"Plausible.Factory.invitation_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#monthly_report_factory/0","title":"Plausible.Factory.monthly_report_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#pageview_factory/0","title":"Plausible.Factory.pageview_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#params_for/2","title":"Plausible.Factory.params_for/2","type":"function"},{"doc":"","ref":"Plausible.Factory.html#params_with_assocs/2","title":"Plausible.Factory.params_with_assocs/2","type":"function"},{"doc":"","ref":"Plausible.Factory.html#shared_link_factory/0","title":"Plausible.Factory.shared_link_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#site_factory/0","title":"Plausible.Factory.site_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#site_membership_factory/0","title":"Plausible.Factory.site_membership_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#spike_notification_factory/0","title":"Plausible.Factory.spike_notification_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#string_params_for/2","title":"Plausible.Factory.string_params_for/2","type":"function"},{"doc":"","ref":"Plausible.Factory.html#string_params_with_assocs/2","title":"Plausible.Factory.string_params_with_assocs/2","type":"function"},{"doc":"","ref":"Plausible.Factory.html#subscription_factory/0","title":"Plausible.Factory.subscription_factory/0","type":"function"},{"doc":"","ref":"Plausible.Factory.html#user_factory/1","title":"Plausible.Factory.user_factory/1","type":"function"},{"doc":"","ref":"Plausible.Factory.html#weekly_report_factory/0","title":"Plausible.Factory.weekly_report_factory/0","type":"function"},{"doc":"A funnel is a marketing term used to capture and describe the journey that users go through, from initial step to conversion. A funnel consists of several steps (here: 2..8). This module defines the database schema for storing funnels and changeset helpers for enumerating the steps within. Each step references a goal (either a Custom Event or Visit) see: Plausible.Goal .","ref":"Plausible.Funnel.html","title":"Plausible.Funnel","type":"module"},{"doc":"","ref":"Plausible.Funnel.html#changeset/2","title":"Plausible.Funnel.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Funnel.html#max_steps/0","title":"Plausible.Funnel.max_steps/0","type":"macro"},{"doc":"","ref":"Plausible.Funnel.html#min_steps/0","title":"Plausible.Funnel.min_steps/0","type":"macro"},{"doc":"","ref":"Plausible.Funnel.html#put_step_orders/1","title":"Plausible.Funnel.put_step_orders/1","type":"function"},{"doc":"","ref":"Plausible.Funnel.html#t:t/0","title":"Plausible.Funnel.t/0","type":"type"},{"doc":"This module defines the database schema for a single Funnel step. See: Plausible.Funnel for more information.","ref":"Plausible.Funnel.Step.html","title":"Plausible.Funnel.Step","type":"module"},{"doc":"","ref":"Plausible.Funnel.Step.html#changeset/2","title":"Plausible.Funnel.Step.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Funnel.Step.html#t:t/0","title":"Plausible.Funnel.Step.t/0","type":"type"},{"doc":"This module implements contextual Funnel interface, allowing listing, creating and deleting funnel definitions. For brief explanation of what a Funnel is, please see Plausible.Funnel schema. See Plausible.Stats.Funnel for the evaluation logic.","ref":"Plausible.Funnels.html","title":"Plausible.Funnels","type":"module"},{"doc":"","ref":"Plausible.Funnels.html#create/3","title":"Plausible.Funnels.create/3","type":"function"},{"doc":"","ref":"Plausible.Funnels.html#create_changeset/3","title":"Plausible.Funnels.create_changeset/3","type":"function"},{"doc":"","ref":"Plausible.Funnels.html#delete/2","title":"Plausible.Funnels.delete/2","type":"function"},{"doc":"","ref":"Plausible.Funnels.html#enabled_for?/1","title":"Plausible.Funnels.enabled_for?/1","type":"function"},{"doc":"","ref":"Plausible.Funnels.html#ephemeral_definition/3","title":"Plausible.Funnels.ephemeral_definition/3","type":"function"},{"doc":"","ref":"Plausible.Funnels.html#get/2","title":"Plausible.Funnels.get/2","type":"function"},{"doc":"","ref":"Plausible.Funnels.html#list/1","title":"Plausible.Funnels.list/1","type":"function"},{"doc":"This module provides an API for fetching IP geolocation.","ref":"Plausible.Geo.html","title":"Plausible.Geo","type":"module"},{"doc":"Waits for the database to start after calling load_db/1 with the async option.","ref":"Plausible.Geo.html#await_loader/0","title":"Plausible.Geo.await_loader/0","type":"function"},{"doc":"Returns geodatabase type. Used for deciding whether to show the DB-IP disclaimer or not. 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 ( ) "GeoLite2-City"","ref":"Plausible.Geo.html#database_type/0","title":"Plausible.Geo.database_type/0","type":"function"},{"doc":"Starts the geodatabase loading process. Two modes are supported: local file and MaxMind license key. Options :path - the path to the .mmdb database local file. When present, :license_key and :edition are not required. :license_key - the license key from MaxMind to authenticate requests to MaxMind. :edition - the name of the MaxMind database to be downloaded from MaxMind servers. Defaults to GeoLite2-City . :async - when used, configures the database loading to run 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 ) :ok","ref":"Plausible.Geo.html#load_db/1","title":"Plausible.Geo.load_db/1","type":"function"},{"doc":"Looks up geo info about an IP address. Examples iex> lookup ( "8.7.6.5" ) %{ "city" => %{ "geoname_id" => 5349755 , "names" => %{ "de" => "Fontana" , "en" => "Fontana" , "ja" => "フォンタナ" , "ru" => "Фонтана" } } , "continent" => %{ "code" => "NA" , "geoname_id" => 6255149 , "names" => %{ "de" => "Nordamerika" , "en" => "North America" , "es" => "Norteamérica" , "fr" => "Amérique du Nord" , "ja" => "北アメリカ" , "pt-BR" => "América do Norte" , "ru" => "Северная Америка" , "zh-CN" => "北美洲" } } , "country" => %{ "geoname_id" => 6252001 , "iso_code" => "US" , "names" => %{ "de" => "Vereinigte Staaten" , "en" => "United States" , "es" => "Estados Unidos" , "fr" => "États Unis" , "ja" => "アメリカ" , "pt-BR" => "EUA" , "ru" => "США" , "zh-CN" => "美国" } } , "location" => %{ "accuracy_radius" => 50 , "latitude" => 34.1211 , "longitude" => - 117.4362 , "metro_code" => 803 , "time_zone" => "America/Los_Angeles" } , "postal" => %{ "code" => "92336" } , "registered_country" => %{ "geoname_id" => 6252001 , "iso_code" => "US" , "names" => %{ "de" => "Vereinigte Staaten" , "en" => "United States" , "es" => "Estados Unidos" , "fr" => "États Unis" , "ja" => "アメリカ" , "pt-BR" => "EUA" , "ru" => "США" , "zh-CN" => "美国" } } , "subdivisions" => [ %{ "geoname_id" => 5332921 , "iso_code" => "CA" , "names" => %{ "de" => "Kalifornien" , "en" => "California" , "es" => "California" , "fr" => "Californie" , "ja" => "カリフォルニア州" , "pt-BR" => "Califórnia" , "ru" => "Калифорния" , "zh-CN" => "加州" } } ] }","ref":"Plausible.Geo.html#lookup/1","title":"Plausible.Geo.lookup/1","type":"function"},{"doc":"","ref":"Plausible.Goal.html","title":"Plausible.Goal","type":"module"},{"doc":"","ref":"Plausible.Goal.html#changeset/2","title":"Plausible.Goal.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Goal.html#currency_options/0","title":"Plausible.Goal.currency_options/0","type":"function"},{"doc":"","ref":"Plausible.Goal.html#revenue?/1","title":"Plausible.Goal.revenue?/1","type":"function"},{"doc":"","ref":"Plausible.Goal.html#valid_currencies/0","title":"Plausible.Goal.valid_currencies/0","type":"function"},{"doc":"","ref":"Plausible.Goal.html#t:t/0","title":"Plausible.Goal.t/0","type":"type"},{"doc":"","ref":"Plausible.Goals.html","title":"Plausible.Goals","type":"module"},{"doc":"","ref":"Plausible.Goals.html#count/1","title":"Plausible.Goals.count/1","type":"function"},{"doc":"Creates a Goal for a site. If the created goal is a revenue goal, it sets site.updated_at to be refreshed by the sites cache, as revenue goals are used during ingestion.","ref":"Plausible.Goals.html#create/3","title":"Plausible.Goals.create/3","type":"function"},{"doc":"If a goal belongs to funnel(s), we need to inspect their number of steps. If it exceeds the minimum allowed (defined via Plausible.Funnel.min_steps/0 ), the funnel will be reduced (i.e. a step associated with the goal to be deleted is removed), so that the minimum number of steps is preserved. This is done implicitly, by postgres, as per on_delete: :delete_all. Otherwise, for associated funnel(s) consisting of minimum number steps only, funnel record(s) are removed completely along with the targeted goal.","ref":"Plausible.Goals.html#delete/2","title":"Plausible.Goals.delete/2","type":"function"},{"doc":"","ref":"Plausible.Goals.html#find_or_create/2","title":"Plausible.Goals.find_or_create/2","type":"function"},{"doc":"","ref":"Plausible.Goals.html#for_site/2","title":"Plausible.Goals.for_site/2","type":"function"},{"doc":"","ref":"Plausible.Google.Api.html","title":"Plausible.Google.Api","type":"module"},{"doc":"","ref":"Plausible.Google.Api.html#fetch_and_persist/3","title":"Plausible.Google.Api.fetch_and_persist/3","type":"function"},{"doc":"","ref":"Plausible.Google.Api.html#fetch_stats/3","title":"Plausible.Google.Api.fetch_stats/3","type":"function"},{"doc":"","ref":"Plausible.Google.Api.html#fetch_verified_properties/1","title":"Plausible.Google.Api.fetch_verified_properties/1","type":"function"},{"doc":"Returns a single Google Analytics view if the user has access to it.","ref":"Plausible.Google.Api.html#get_view/2","title":"Plausible.Google.Api.get_view/2","type":"function"},{"doc":"Imports stats from a Google Analytics UA view to a Plausible site. This function fetches Google Analytics reports in batches of 7500 per request. The batches are then buffered to Clickhouse by the Plausible.Google.Buffer process. Requests to Google Analytics can fail, and are retried at most 5 times with an exponential backoff. Returns :ok when importing has finished or {:error, term()} when a request to GA failed too many times. Useful links: Feature documentation GA API reference GA Dimensions reference","ref":"Plausible.Google.Api.html#import_analytics/4","title":"Plausible.Google.Api.import_analytics/4","type":"function"},{"doc":"","ref":"Plausible.Google.Api.html#import_authorize_url/2","title":"Plausible.Google.Api.import_authorize_url/2","type":"function"},{"doc":"Lists Google Analytics views grouped by hostname.","ref":"Plausible.Google.Api.html#list_views/1","title":"Plausible.Google.Api.list_views/1","type":"function"},{"doc":"","ref":"Plausible.Google.Api.html#search_console_authorize_url/2","title":"Plausible.Google.Api.search_console_authorize_url/2","type":"function"},{"doc":"","ref":"Plausible.Google.Api.html#t:google_analytics_view/0","title":"Plausible.Google.Api.google_analytics_view/0","type":"type"},{"doc":"","ref":"Plausible.Google.Api.html#t:import_auth/0","title":"Plausible.Google.Api.import_auth/0","type":"type"},{"doc":"","ref":"Plausible.Google.Api.Mock.html","title":"Plausible.Google.Api.Mock","type":"module"},{"doc":"","ref":"Plausible.Google.Api.Mock.html#fetch_stats/3","title":"Plausible.Google.Api.Mock.fetch_stats/3","type":"function"},{"doc":"This GenServer inserts records into Clickhouse imported_* tables. Multiple buffers are automatically created for each table. Records are flushed when the table buffer reaches the maximum size, defined by max_buffer_size/0 .","ref":"Plausible.Google.Buffer.html","title":"Plausible.Google.Buffer","type":"module"},{"doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Plausible.Google.Buffer.html#child_spec/1","title":"Plausible.Google.Buffer.child_spec/1","type":"function"},{"doc":"Flushes all table buffers to Clickhouse.","ref":"Plausible.Google.Buffer.html#flush/2","title":"Plausible.Google.Buffer.flush/2","type":"function"},{"doc":"Callback implementation for GenServer.handle_continue/2 .","ref":"Plausible.Google.Buffer.html#handle_continue/2","title":"Plausible.Google.Buffer.handle_continue/2","type":"function"},{"doc":"Callback implementation for GenServer.init/1 .","ref":"Plausible.Google.Buffer.html#init/1","title":"Plausible.Google.Buffer.init/1","type":"function"},{"doc":"Puts the given records into the table buffer.","ref":"Plausible.Google.Buffer.html#insert_many/3","title":"Plausible.Google.Buffer.insert_many/3","type":"function"},{"doc":"Returns the total count of items in the given table buffer.","ref":"Plausible.Google.Buffer.html#size/2","title":"Plausible.Google.Buffer.size/2","type":"function"},{"doc":"","ref":"Plausible.Google.Buffer.html#start_link/0","title":"Plausible.Google.Buffer.start_link/0","type":"function"},{"doc":"","ref":"Plausible.Google.Buffer.html#stop/1","title":"Plausible.Google.Buffer.stop/1","type":"function"},{"doc":"","ref":"Plausible.Google.HTTP.html","title":"Plausible.Google.HTTP","type":"module"},{"doc":"","ref":"Plausible.Google.HTTP.html#fetch_access_token/1","title":"Plausible.Google.HTTP.fetch_access_token/1","type":"function"},{"doc":"","ref":"Plausible.Google.HTTP.html#get_analytics_start_date/2","title":"Plausible.Google.HTTP.get_analytics_start_date/2","type":"function"},{"doc":"","ref":"Plausible.Google.HTTP.html#get_report/1","title":"Plausible.Google.HTTP.get_report/1","type":"function"},{"doc":"","ref":"Plausible.Google.HTTP.html#list_sites/1","title":"Plausible.Google.HTTP.list_sites/1","type":"function"},{"doc":"","ref":"Plausible.Google.HTTP.html#list_stats/5","title":"Plausible.Google.HTTP.list_stats/5","type":"function"},{"doc":"","ref":"Plausible.Google.HTTP.html#list_views_for_user/1","title":"Plausible.Google.HTTP.list_views_for_user/1","type":"function"},{"doc":"","ref":"Plausible.Google.HTTP.html#refresh_auth_token/1","title":"Plausible.Google.HTTP.refresh_auth_token/1","type":"function"},{"doc":"","ref":"Plausible.Google.ReportRequest.html","title":"Plausible.Google.ReportRequest","type":"module"},{"doc":"","ref":"Plausible.Google.ReportRequest.html#full_report/0","title":"Plausible.Google.ReportRequest.full_report/0","type":"function"},{"doc":"","ref":"Plausible.Google.ReportRequest.html#t:t/0","title":"Plausible.Google.ReportRequest.t/0","type":"type"},{"doc":"HTTP Client built on top of Finch. By default, request parameters are json-encoded. If a raw binary value is supplied, no encoding is performed. If x-www-form-urlencoded content-type is set in headers, URL encoding is invoked.","ref":"Plausible.HTTPClient.html","title":"Plausible.HTTPClient","type":"module"},{"doc":"Make a GET request","ref":"Plausible.HTTPClient.html#get/2","title":"Plausible.HTTPClient.get/2","type":"function"},{"doc":"","ref":"Plausible.HTTPClient.html#impl/0","title":"Plausible.HTTPClient.impl/0","type":"function"},{"doc":"Make a POST request","ref":"Plausible.HTTPClient.html#post/4","title":"Plausible.HTTPClient.post/4","type":"function"},{"doc":"","ref":"Plausible.HTTPClient.Interface.html","title":"Plausible.HTTPClient.Interface","type":"behaviour"},{"doc":"","ref":"Plausible.HTTPClient.Interface.html#c:get/1","title":"Plausible.HTTPClient.Interface.get/1","type":"callback"},{"doc":"","ref":"Plausible.HTTPClient.Interface.html#c:get/2","title":"Plausible.HTTPClient.Interface.get/2","type":"callback"},{"doc":"","ref":"Plausible.HTTPClient.Interface.html#c:post/3","title":"Plausible.HTTPClient.Interface.post/3","type":"callback"},{"doc":"","ref":"Plausible.HTTPClient.Interface.html#c:post/4","title":"Plausible.HTTPClient.Interface.post/4","type":"callback"},{"doc":"","ref":"Plausible.HTTPClient.Interface.html#t:finch_request_opts/0","title":"Plausible.HTTPClient.Interface.finch_request_opts/0","type":"type"},{"doc":"","ref":"Plausible.HTTPClient.Interface.html#t:headers/0","title":"Plausible.HTTPClient.Interface.headers/0","type":"type"},{"doc":"","ref":"Plausible.HTTPClient.Interface.html#t:params/0","title":"Plausible.HTTPClient.Interface.params/0","type":"type"},{"doc":"","ref":"Plausible.HTTPClient.Interface.html#t:response/0","title":"Plausible.HTTPClient.Interface.response/0","type":"type"},{"doc":"","ref":"Plausible.HTTPClient.Interface.html#t:url/0","title":"Plausible.HTTPClient.Interface.url/0","type":"type"},{"doc":"","ref":"Plausible.HTTPClient.Non200Error.html","title":"Plausible.HTTPClient.Non200Error","type":"module"},{"doc":"","ref":"Plausible.HTTPClient.Non200Error.html#new/1","title":"Plausible.HTTPClient.Non200Error.new/1","type":"function"},{"doc":"","ref":"Plausible.HTTPClient.Non200Error.html#t:t/0","title":"Plausible.HTTPClient.Non200Error.t/0","type":"type"},{"doc":"A dedicated repo for import related mutations","ref":"Plausible.ImportDeletionRepo.html","title":"Plausible.ImportDeletionRepo","type":"module"},{"doc":"Callback implementation for Ecto.Repo.aggregate/3 .","ref":"Plausible.ImportDeletionRepo.html#aggregate/3","title":"Plausible.ImportDeletionRepo.aggregate/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.aggregate/4 .","ref":"Plausible.ImportDeletionRepo.html#aggregate/4","title":"Plausible.ImportDeletionRepo.aggregate/4","type":"function"},{"doc":"Callback implementation for Ecto.Repo.all/2 .","ref":"Plausible.ImportDeletionRepo.html#all/2","title":"Plausible.ImportDeletionRepo.all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checked_out?/0 .","ref":"Plausible.ImportDeletionRepo.html#checked_out?/0","title":"Plausible.ImportDeletionRepo.checked_out?/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checkout/2 .","ref":"Plausible.ImportDeletionRepo.html#checkout/2","title":"Plausible.ImportDeletionRepo.checkout/2","type":"function"},{"doc":"","ref":"Plausible.ImportDeletionRepo.html#child_spec/1","title":"Plausible.ImportDeletionRepo.child_spec/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.config/0 .","ref":"Plausible.ImportDeletionRepo.html#config/0","title":"Plausible.ImportDeletionRepo.config/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.default_options/1 .","ref":"Plausible.ImportDeletionRepo.html#default_options/1","title":"Plausible.ImportDeletionRepo.default_options/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete/2 .","ref":"Plausible.ImportDeletionRepo.html#delete/2","title":"Plausible.ImportDeletionRepo.delete/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete!/2 .","ref":"Plausible.ImportDeletionRepo.html#delete!/2","title":"Plausible.ImportDeletionRepo.delete!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete_all/2 .","ref":"Plausible.ImportDeletionRepo.html#delete_all/2","title":"Plausible.ImportDeletionRepo.delete_all/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that forces all connections in the pool to disconnect within the given interval. See Ecto.Adapters.SQL.disconnect_all/3 for more information.","ref":"Plausible.ImportDeletionRepo.html#disconnect_all/2","title":"Plausible.ImportDeletionRepo.disconnect_all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.exists?/2 .","ref":"Plausible.ImportDeletionRepo.html#exists?/2","title":"Plausible.ImportDeletionRepo.exists?/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get/3 .","ref":"Plausible.ImportDeletionRepo.html#get/3","title":"Plausible.ImportDeletionRepo.get/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get!/3 .","ref":"Plausible.ImportDeletionRepo.html#get!/3","title":"Plausible.ImportDeletionRepo.get!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by/3 .","ref":"Plausible.ImportDeletionRepo.html#get_by/3","title":"Plausible.ImportDeletionRepo.get_by/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by!/3 .","ref":"Plausible.ImportDeletionRepo.html#get_by!/3","title":"Plausible.ImportDeletionRepo.get_by!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_dynamic_repo/0 .","ref":"Plausible.ImportDeletionRepo.html#get_dynamic_repo/0","title":"Plausible.ImportDeletionRepo.get_dynamic_repo/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert/2 .","ref":"Plausible.ImportDeletionRepo.html#insert/2","title":"Plausible.ImportDeletionRepo.insert/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert!/2 .","ref":"Plausible.ImportDeletionRepo.html#insert!/2","title":"Plausible.ImportDeletionRepo.insert!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_all/3 .","ref":"Plausible.ImportDeletionRepo.html#insert_all/3","title":"Plausible.ImportDeletionRepo.insert_all/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_or_update/2 .","ref":"Plausible.ImportDeletionRepo.html#insert_or_update/2","title":"Plausible.ImportDeletionRepo.insert_or_update/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_or_update!/2 .","ref":"Plausible.ImportDeletionRepo.html#insert_or_update!/2","title":"Plausible.ImportDeletionRepo.insert_or_update!/2","type":"function"},{"doc":"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 use Ecto.Schema @primary_key false schema "ecto_ch_demo" do field :a , Ch , type : "UInt64" field :b , :string 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 ) # schemaless { 100_000 , nil } = Repo . insert_stream ( "ecto_ch_demo" , rows , types : [ a : Ch.Types . u64 ( ) , b : :string ] )","ref":"Plausible.ImportDeletionRepo.html#insert_stream/3","title":"Plausible.ImportDeletionRepo.insert_stream/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.load/2 .","ref":"Plausible.ImportDeletionRepo.html#load/2","title":"Plausible.ImportDeletionRepo.load/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one/2 .","ref":"Plausible.ImportDeletionRepo.html#one/2","title":"Plausible.ImportDeletionRepo.one/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one!/2 .","ref":"Plausible.ImportDeletionRepo.html#one!/2","title":"Plausible.ImportDeletionRepo.one!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.preload/3 .","ref":"Plausible.ImportDeletionRepo.html#preload/3","title":"Plausible.ImportDeletionRepo.preload/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.prepare_query/3 .","ref":"Plausible.ImportDeletionRepo.html#prepare_query/3","title":"Plausible.ImportDeletionRepo.prepare_query/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.put_dynamic_repo/1 .","ref":"Plausible.ImportDeletionRepo.html#put_dynamic_repo/1","title":"Plausible.ImportDeletionRepo.put_dynamic_repo/1","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query/4 for more information.","ref":"Plausible.ImportDeletionRepo.html#query/3","title":"Plausible.ImportDeletionRepo.query/3","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query!/4 for more information.","ref":"Plausible.ImportDeletionRepo.html#query!/3","title":"Plausible.ImportDeletionRepo.query!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload/2 .","ref":"Plausible.ImportDeletionRepo.html#reload/2","title":"Plausible.ImportDeletionRepo.reload/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload!/2 .","ref":"Plausible.ImportDeletionRepo.html#reload!/2","title":"Plausible.ImportDeletionRepo.reload!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.start_link/1 .","ref":"Plausible.ImportDeletionRepo.html#start_link/1","title":"Plausible.ImportDeletionRepo.start_link/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stop/1 .","ref":"Plausible.ImportDeletionRepo.html#stop/1","title":"Plausible.ImportDeletionRepo.stop/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stream/2 .","ref":"Plausible.ImportDeletionRepo.html#stream/2","title":"Plausible.ImportDeletionRepo.stream/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that translates the given query to SQL. See Ecto.Adapters.SQL.to_sql/3 for more information.","ref":"Plausible.ImportDeletionRepo.html#to_sql/2","title":"Plausible.ImportDeletionRepo.to_sql/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update/2 .","ref":"Plausible.ImportDeletionRepo.html#update/2","title":"Plausible.ImportDeletionRepo.update/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update!/2 .","ref":"Plausible.ImportDeletionRepo.html#update!/2","title":"Plausible.ImportDeletionRepo.update!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update_all/3 .","ref":"Plausible.ImportDeletionRepo.html#update_all/3","title":"Plausible.ImportDeletionRepo.update_all/3","type":"function"},{"doc":"","ref":"Plausible.Imported.html","title":"Plausible.Imported","type":"module"},{"doc":"","ref":"Plausible.Imported.html#forget/1","title":"Plausible.Imported.forget/1","type":"function"},{"doc":"","ref":"Plausible.Imported.html#from_google_analytics/3","title":"Plausible.Imported.from_google_analytics/3","type":"function"},{"doc":"","ref":"Plausible.Imported.html#tables/0","title":"Plausible.Imported.tables/0","type":"function"},{"doc":"Write-centric Clickhouse access interface","ref":"Plausible.IngestRepo.html","title":"Plausible.IngestRepo","type":"module"},{"doc":"Callback implementation for Ecto.Repo.aggregate/3 .","ref":"Plausible.IngestRepo.html#aggregate/3","title":"Plausible.IngestRepo.aggregate/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.aggregate/4 .","ref":"Plausible.IngestRepo.html#aggregate/4","title":"Plausible.IngestRepo.aggregate/4","type":"function"},{"doc":"Callback implementation for Ecto.Repo.all/2 .","ref":"Plausible.IngestRepo.html#all/2","title":"Plausible.IngestRepo.all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checked_out?/0 .","ref":"Plausible.IngestRepo.html#checked_out?/0","title":"Plausible.IngestRepo.checked_out?/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checkout/2 .","ref":"Plausible.IngestRepo.html#checkout/2","title":"Plausible.IngestRepo.checkout/2","type":"function"},{"doc":"","ref":"Plausible.IngestRepo.html#child_spec/1","title":"Plausible.IngestRepo.child_spec/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.config/0 .","ref":"Plausible.IngestRepo.html#config/0","title":"Plausible.IngestRepo.config/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.default_options/1 .","ref":"Plausible.IngestRepo.html#default_options/1","title":"Plausible.IngestRepo.default_options/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete/2 .","ref":"Plausible.IngestRepo.html#delete/2","title":"Plausible.IngestRepo.delete/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete!/2 .","ref":"Plausible.IngestRepo.html#delete!/2","title":"Plausible.IngestRepo.delete!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete_all/2 .","ref":"Plausible.IngestRepo.html#delete_all/2","title":"Plausible.IngestRepo.delete_all/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that forces all connections in the pool to disconnect within the given interval. See Ecto.Adapters.SQL.disconnect_all/3 for more information.","ref":"Plausible.IngestRepo.html#disconnect_all/2","title":"Plausible.IngestRepo.disconnect_all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.exists?/2 .","ref":"Plausible.IngestRepo.html#exists?/2","title":"Plausible.IngestRepo.exists?/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get/3 .","ref":"Plausible.IngestRepo.html#get/3","title":"Plausible.IngestRepo.get/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get!/3 .","ref":"Plausible.IngestRepo.html#get!/3","title":"Plausible.IngestRepo.get!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by/3 .","ref":"Plausible.IngestRepo.html#get_by/3","title":"Plausible.IngestRepo.get_by/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by!/3 .","ref":"Plausible.IngestRepo.html#get_by!/3","title":"Plausible.IngestRepo.get_by!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_dynamic_repo/0 .","ref":"Plausible.IngestRepo.html#get_dynamic_repo/0","title":"Plausible.IngestRepo.get_dynamic_repo/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert/2 .","ref":"Plausible.IngestRepo.html#insert/2","title":"Plausible.IngestRepo.insert/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert!/2 .","ref":"Plausible.IngestRepo.html#insert!/2","title":"Plausible.IngestRepo.insert!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_all/3 .","ref":"Plausible.IngestRepo.html#insert_all/3","title":"Plausible.IngestRepo.insert_all/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_or_update/2 .","ref":"Plausible.IngestRepo.html#insert_or_update/2","title":"Plausible.IngestRepo.insert_or_update/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_or_update!/2 .","ref":"Plausible.IngestRepo.html#insert_or_update!/2","title":"Plausible.IngestRepo.insert_or_update!/2","type":"function"},{"doc":"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 use Ecto.Schema @primary_key false schema "ecto_ch_demo" do field :a , Ch , type : "UInt64" field :b , :string 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 ) # schemaless { 100_000 , nil } = Repo . insert_stream ( "ecto_ch_demo" , rows , types : [ a : Ch.Types . u64 ( ) , b : :string ] )","ref":"Plausible.IngestRepo.html#insert_stream/3","title":"Plausible.IngestRepo.insert_stream/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.load/2 .","ref":"Plausible.IngestRepo.html#load/2","title":"Plausible.IngestRepo.load/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one/2 .","ref":"Plausible.IngestRepo.html#one/2","title":"Plausible.IngestRepo.one/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one!/2 .","ref":"Plausible.IngestRepo.html#one!/2","title":"Plausible.IngestRepo.one!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.preload/3 .","ref":"Plausible.IngestRepo.html#preload/3","title":"Plausible.IngestRepo.preload/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.prepare_query/3 .","ref":"Plausible.IngestRepo.html#prepare_query/3","title":"Plausible.IngestRepo.prepare_query/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.put_dynamic_repo/1 .","ref":"Plausible.IngestRepo.html#put_dynamic_repo/1","title":"Plausible.IngestRepo.put_dynamic_repo/1","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query/4 for more information.","ref":"Plausible.IngestRepo.html#query/3","title":"Plausible.IngestRepo.query/3","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query!/4 for more information.","ref":"Plausible.IngestRepo.html#query!/3","title":"Plausible.IngestRepo.query!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload/2 .","ref":"Plausible.IngestRepo.html#reload/2","title":"Plausible.IngestRepo.reload/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload!/2 .","ref":"Plausible.IngestRepo.html#reload!/2","title":"Plausible.IngestRepo.reload!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.start_link/1 .","ref":"Plausible.IngestRepo.html#start_link/1","title":"Plausible.IngestRepo.start_link/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stop/1 .","ref":"Plausible.IngestRepo.html#stop/1","title":"Plausible.IngestRepo.stop/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stream/2 .","ref":"Plausible.IngestRepo.html#stream/2","title":"Plausible.IngestRepo.stream/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that translates the given query to SQL. See Ecto.Adapters.SQL.to_sql/3 for more information.","ref":"Plausible.IngestRepo.html#to_sql/2","title":"Plausible.IngestRepo.to_sql/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update/2 .","ref":"Plausible.IngestRepo.html#update/2","title":"Plausible.IngestRepo.update/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update!/2 .","ref":"Plausible.IngestRepo.html#update!/2","title":"Plausible.IngestRepo.update!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update_all/3 .","ref":"Plausible.IngestRepo.html#update_all/3","title":"Plausible.IngestRepo.update_all/3","type":"function"},{"doc":"This is instrumentation necessary for keeping track of per-domain internal metrics. Due to metric labels cardinality (domain x metric_name), these statistics are not suitable for prometheus/grafana exposure, hence an internal storage is used. The module installs Counters.TelemetryHandler and periodically flushes the internal counter aggregates via Counters.Buffer interface. The underlying database schema is running SummingMergeTree engine. To take advantage of automatic roll-ups it provides, upon dispatching the buffered records to Clickhouse this module transforms each event_timebucket aggregate into a 1-minute resolution. Clickhouse connection is set to insert counters asynchronously every time a pool checkout is made. Those properties are reverted once the insert is done (or naturally, if the connection crashes).","ref":"Plausible.Ingestion.Counters.html","title":"Plausible.Ingestion.Counters","type":"module"},{"doc":"","ref":"Plausible.Ingestion.Counters.html#child_spec/1","title":"Plausible.Ingestion.Counters.child_spec/1","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Counters.html#enabled?/0","title":"Plausible.Ingestion.Counters.enabled?/0","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Counters.html#stop/1","title":"Plausible.Ingestion.Counters.stop/1","type":"function"},{"doc":"A buffer aggregating counters for internal metrics, within 10 seconds time buckets. See Plausible.Ingestion.Counters for integration. Flushing is by default possible only once the 10s bucket is complete (its window has moved). This is to avoid race conditions when clearing up the buffer on dequeue - because there is no atomic "get and delete", and items are buffered concurrently, there is a gap between get and delete in which items written may disappear otherwise. aggregate_bucket_fn and flush_boundary_fn control that semantics and are configurable only for test purposes.","ref":"Plausible.Ingestion.Counters.Buffer.html","title":"Plausible.Ingestion.Counters.Buffer","type":"module"},{"doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#aggregate/4","title":"Plausible.Ingestion.Counters.Buffer.aggregate/4","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#bucket_10s/1","title":"Plausible.Ingestion.Counters.Buffer.bucket_10s/1","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#flush/2","title":"Plausible.Ingestion.Counters.Buffer.flush/2","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#new/2","title":"Plausible.Ingestion.Counters.Buffer.new/2","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#previous_10s/1","title":"Plausible.Ingestion.Counters.Buffer.previous_10s/1","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#t:bucket_fn_opt/0","title":"Plausible.Ingestion.Counters.Buffer.bucket_fn_opt/0","type":"type"},{"doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#t:t/0","title":"Plausible.Ingestion.Counters.Buffer.t/0","type":"type"},{"doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#t:unix_timestamp/0","title":"Plausible.Ingestion.Counters.Buffer.unix_timestamp/0","type":"type"},{"doc":"Clickhouse schema for storing ingest counter metrics","ref":"Plausible.Ingestion.Counters.Record.html","title":"Plausible.Ingestion.Counters.Record","type":"module"},{"doc":"","ref":"Plausible.Ingestion.Counters.Record.html#t:t/0","title":"Plausible.Ingestion.Counters.Record.t/0","type":"type"},{"doc":"Susbcribes to telemetry events emitted by Plausible.Ingestion.Event . Every time a request derived event is either dispatched to clickhouse or dropped, a telemetry event is emitted respectively. That event is captured here, its metadata is extracted and sent for internal stats aggregation via Counters.Buffer interface.","ref":"Plausible.Ingestion.Counters.TelemetryHandler.html","title":"Plausible.Ingestion.Counters.TelemetryHandler","type":"module"},{"doc":"","ref":"Plausible.Ingestion.Counters.TelemetryHandler.html#handle_event/4","title":"Plausible.Ingestion.Counters.TelemetryHandler.handle_event/4","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Counters.TelemetryHandler.html#install/1","title":"Plausible.Ingestion.Counters.TelemetryHandler.install/1","type":"function"},{"doc":"This module exposes the build_and_buffer/1 function capable of turning %Plausible.Ingestion.Request{} into a series of events that in turn are uniformly either buffered in batches (to Clickhouse) or dropped (e.g. due to spam blocklist) from the processing pipeline.","ref":"Plausible.Ingestion.Event.html","title":"Plausible.Ingestion.Event","type":"module"},{"doc":"","ref":"Plausible.Ingestion.Event.html#build_and_buffer/1","title":"Plausible.Ingestion.Event.build_and_buffer/1","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Event.html#emit_telemetry_buffered/1","title":"Plausible.Ingestion.Event.emit_telemetry_buffered/1","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Event.html#emit_telemetry_dropped/2","title":"Plausible.Ingestion.Event.emit_telemetry_dropped/2","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Event.html#telemetry_event_buffered/0","title":"Plausible.Ingestion.Event.telemetry_event_buffered/0","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Event.html#telemetry_event_dropped/0","title":"Plausible.Ingestion.Event.telemetry_event_dropped/0","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Event.html#t:drop_reason/0","title":"Plausible.Ingestion.Event.drop_reason/0","type":"type"},{"doc":"","ref":"Plausible.Ingestion.Event.html#t:t/0","title":"Plausible.Ingestion.Event.t/0","type":"type"},{"doc":"The %Plausible.Ingestion.Request{} struct stores all needed fields to create an event downstream. Pre-eliminary validation is made to detect user errors early.","ref":"Plausible.Ingestion.Request.html","title":"Plausible.Ingestion.Request","type":"module"},{"doc":"Builds and initially validates %Plausible.Ingestion.Request{} struct from %Plug.Conn{}.","ref":"Plausible.Ingestion.Request.html#build/2","title":"Plausible.Ingestion.Request.build/2","type":"function"},{"doc":"Removes the "www" part of a hostname.","ref":"Plausible.Ingestion.Request.html#sanitize_hostname/1","title":"Plausible.Ingestion.Request.sanitize_hostname/1","type":"function"},{"doc":"","ref":"Plausible.Ingestion.Request.html#t:t/0","title":"Plausible.Ingestion.Request.t/0","type":"type"},{"doc":"","ref":"Plausible.Mailer.html","title":"Plausible.Mailer","type":"module"},{"doc":"","ref":"Plausible.Mailer.html#deliver/1","title":"Plausible.Mailer.deliver/1","type":"function"},{"doc":"","ref":"Plausible.Mailer.html#deliver_later/2","title":"Plausible.Mailer.deliver_later/2","type":"function"},{"doc":"","ref":"Plausible.Mailer.html#deliver_later!/2","title":"Plausible.Mailer.deliver_later!/2","type":"function"},{"doc":"","ref":"Plausible.Mailer.html#deliver_now/2","title":"Plausible.Mailer.deliver_now/2","type":"function"},{"doc":"","ref":"Plausible.Mailer.html#deliver_now!/2","title":"Plausible.Mailer.deliver_now!/2","type":"function"},{"doc":"","ref":"Plausible.Mailer.html#send/1","title":"Plausible.Mailer.send/1","type":"function"},{"doc":"Custom OpenTelemetry sampler implementation that ignores particular traces to reduce noise. Ingestion HTTP requests and queries to Oban tables are ignored, for example.","ref":"Plausible.OpenTelemetry.Sampler.html","title":"Plausible.OpenTelemetry.Sampler","type":"module"},{"doc":"","ref":"Plausible.PaddleApi.Mock.html","title":"Plausible.PaddleApi.Mock","type":"module"},{"doc":"","ref":"Plausible.PaddleApi.Mock.html#get_invoices/1","title":"Plausible.PaddleApi.Mock.get_invoices/1","type":"function"},{"doc":"","ref":"Plausible.PaddleApi.Mock.html#get_subscription/1","title":"Plausible.PaddleApi.Mock.get_subscription/1","type":"function"},{"doc":"","ref":"Plausible.PaddleApi.Mock.html#update_subscription/2","title":"Plausible.PaddleApi.Mock.update_subscription/2","type":"function"},{"doc":"","ref":"Plausible.PromEx.html","title":"Plausible.PromEx","type":"module"},{"doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Plausible.PromEx.html#child_spec/1","title":"Plausible.PromEx.child_spec/1","type":"function"},{"doc":"Custom PromEx plugin for instrumenting code within Plausible app.","ref":"Plausible.PromEx.Plugins.PlausibleMetrics.html","title":"Plausible.PromEx.Plugins.PlausibleMetrics","type":"module"},{"doc":"Add telemetry events for Cachex user agents and sessions","ref":"Plausible.PromEx.Plugins.PlausibleMetrics.html#execute_cache_metrics/0","title":"Plausible.PromEx.Plugins.PlausibleMetrics.execute_cache_metrics/0","type":"function"},{"doc":"Add telemetry events for Session and Event write buffers","ref":"Plausible.PromEx.Plugins.PlausibleMetrics.html#execute_write_buffer_metrics/0","title":"Plausible.PromEx.Plugins.PlausibleMetrics.execute_write_buffer_metrics/0","type":"function"},{"doc":"Deletes data from a site. Stats are stored on Clickhouse, and unlike other databases data deletion is done asynchronously. Clickhouse ALTER TABLE ... DELETE Statement Synchronicity of ALTER Queries","ref":"Plausible.Purge.html","title":"Plausible.Purge","type":"module"},{"doc":"Deletes imported stats from Google Analytics, and clears the stats_start_date field.","ref":"Plausible.Purge.html#delete_imported_stats!/1","title":"Plausible.Purge.delete_imported_stats!/1","type":"function"},{"doc":"Move stats pointers so that no historical stats are available.","ref":"Plausible.Purge.html#delete_native_stats!/1","title":"Plausible.Purge.delete_native_stats!/1","type":"function"},{"doc":"","ref":"Plausible.Purge.html#reset!/1","title":"Plausible.Purge.reset!/1","type":"function"},{"doc":"","ref":"Plausible.Release.html","title":"Plausible.Release","type":"module"},{"doc":"","ref":"Plausible.Release.html#configure_ref_inspector/0","title":"Plausible.Release.configure_ref_inspector/0","type":"function"},{"doc":"","ref":"Plausible.Release.html#configure_ua_inspector/0","title":"Plausible.Release.configure_ua_inspector/0","type":"function"},{"doc":"","ref":"Plausible.Release.html#createdb/0","title":"Plausible.Release.createdb/0","type":"function"},{"doc":"","ref":"Plausible.Release.html#migrate/0","title":"Plausible.Release.migrate/0","type":"function"},{"doc":"","ref":"Plausible.Release.html#rollback/0","title":"Plausible.Release.rollback/0","type":"function"},{"doc":"","ref":"Plausible.Release.html#seed/0","title":"Plausible.Release.seed/0","type":"function"},{"doc":"","ref":"Plausible.Release.html#selfhost?/0","title":"Plausible.Release.selfhost?/0","type":"function"},{"doc":"","ref":"Plausible.Release.html#should_be_first_launch?/0","title":"Plausible.Release.should_be_first_launch?/0","type":"function"},{"doc":"","ref":"Plausible.Repo.html","title":"Plausible.Repo","type":"module"},{"doc":"Callback implementation for Ecto.Repo.aggregate/3 .","ref":"Plausible.Repo.html#aggregate/3","title":"Plausible.Repo.aggregate/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.aggregate/4 .","ref":"Plausible.Repo.html#aggregate/4","title":"Plausible.Repo.aggregate/4","type":"function"},{"doc":"Callback implementation for Ecto.Repo.all/2 .","ref":"Plausible.Repo.html#all/2","title":"Plausible.Repo.all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checked_out?/0 .","ref":"Plausible.Repo.html#checked_out?/0","title":"Plausible.Repo.checked_out?/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.checkout/2 .","ref":"Plausible.Repo.html#checkout/2","title":"Plausible.Repo.checkout/2","type":"function"},{"doc":"","ref":"Plausible.Repo.html#child_spec/1","title":"Plausible.Repo.child_spec/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.config/0 .","ref":"Plausible.Repo.html#config/0","title":"Plausible.Repo.config/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.default_options/1 .","ref":"Plausible.Repo.html#default_options/1","title":"Plausible.Repo.default_options/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete/2 .","ref":"Plausible.Repo.html#delete/2","title":"Plausible.Repo.delete/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete!/2 .","ref":"Plausible.Repo.html#delete!/2","title":"Plausible.Repo.delete!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.delete_all/2 .","ref":"Plausible.Repo.html#delete_all/2","title":"Plausible.Repo.delete_all/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that forces all connections in the pool to disconnect within the given interval. See Ecto.Adapters.SQL.disconnect_all/3 for more information.","ref":"Plausible.Repo.html#disconnect_all/2","title":"Plausible.Repo.disconnect_all/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.exists?/2 .","ref":"Plausible.Repo.html#exists?/2","title":"Plausible.Repo.exists?/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes an EXPLAIN statement or similar depending on the adapter to obtain statistics for the given query. See Ecto.Adapters.SQL.explain/4 for more information.","ref":"Plausible.Repo.html#explain/3","title":"Plausible.Repo.explain/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get/3 .","ref":"Plausible.Repo.html#get/3","title":"Plausible.Repo.get/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get!/3 .","ref":"Plausible.Repo.html#get!/3","title":"Plausible.Repo.get!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by/3 .","ref":"Plausible.Repo.html#get_by/3","title":"Plausible.Repo.get_by/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_by!/3 .","ref":"Plausible.Repo.html#get_by!/3","title":"Plausible.Repo.get_by!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.get_dynamic_repo/0 .","ref":"Plausible.Repo.html#get_dynamic_repo/0","title":"Plausible.Repo.get_dynamic_repo/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.in_transaction?/0 .","ref":"Plausible.Repo.html#in_transaction?/0","title":"Plausible.Repo.in_transaction?/0","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert/2 .","ref":"Plausible.Repo.html#insert/2","title":"Plausible.Repo.insert/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert!/2 .","ref":"Plausible.Repo.html#insert!/2","title":"Plausible.Repo.insert!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_all/3 .","ref":"Plausible.Repo.html#insert_all/3","title":"Plausible.Repo.insert_all/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_or_update/2 .","ref":"Plausible.Repo.html#insert_or_update/2","title":"Plausible.Repo.insert_or_update/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.insert_or_update!/2 .","ref":"Plausible.Repo.html#insert_or_update!/2","title":"Plausible.Repo.insert_or_update!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.load/2 .","ref":"Plausible.Repo.html#load/2","title":"Plausible.Repo.load/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one/2 .","ref":"Plausible.Repo.html#one/2","title":"Plausible.Repo.one/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.one!/2 .","ref":"Plausible.Repo.html#one!/2","title":"Plausible.Repo.one!/2","type":"function"},{"doc":"","ref":"Plausible.Repo.html#paginate/3","title":"Plausible.Repo.paginate/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.preload/3 .","ref":"Plausible.Repo.html#preload/3","title":"Plausible.Repo.preload/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.prepare_query/3 .","ref":"Plausible.Repo.html#prepare_query/3","title":"Plausible.Repo.prepare_query/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.put_dynamic_repo/1 .","ref":"Plausible.Repo.html#put_dynamic_repo/1","title":"Plausible.Repo.put_dynamic_repo/1","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query/4 for more information.","ref":"Plausible.Repo.html#query/3","title":"Plausible.Repo.query/3","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given query. See Ecto.Adapters.SQL.query!/4 for more information.","ref":"Plausible.Repo.html#query!/3","title":"Plausible.Repo.query!/3","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given multi-result query. See Ecto.Adapters.SQL.query_many/4 for more information.","ref":"Plausible.Repo.html#query_many/3","title":"Plausible.Repo.query_many/3","type":"function"},{"doc":"A convenience function for SQL-based repositories that executes the given multi-result query. See Ecto.Adapters.SQL.query_many!/4 for more information.","ref":"Plausible.Repo.html#query_many!/3","title":"Plausible.Repo.query_many!/3","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload/2 .","ref":"Plausible.Repo.html#reload/2","title":"Plausible.Repo.reload/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.reload!/2 .","ref":"Plausible.Repo.html#reload!/2","title":"Plausible.Repo.reload!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.rollback/1 .","ref":"Plausible.Repo.html#rollback/1","title":"Plausible.Repo.rollback/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.start_link/1 .","ref":"Plausible.Repo.html#start_link/1","title":"Plausible.Repo.start_link/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stop/1 .","ref":"Plausible.Repo.html#stop/1","title":"Plausible.Repo.stop/1","type":"function"},{"doc":"Callback implementation for Ecto.Repo.stream/2 .","ref":"Plausible.Repo.html#stream/2","title":"Plausible.Repo.stream/2","type":"function"},{"doc":"A convenience function for SQL-based repositories that translates the given query to SQL. See Ecto.Adapters.SQL.to_sql/3 for more information.","ref":"Plausible.Repo.html#to_sql/2","title":"Plausible.Repo.to_sql/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.transaction/2 .","ref":"Plausible.Repo.html#transaction/2","title":"Plausible.Repo.transaction/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update/2 .","ref":"Plausible.Repo.html#update/2","title":"Plausible.Repo.update/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update!/2 .","ref":"Plausible.Repo.html#update!/2","title":"Plausible.Repo.update!/2","type":"function"},{"doc":"Callback implementation for Ecto.Repo.update_all/3 .","ref":"Plausible.Repo.html#update_all/3","title":"Plausible.Repo.update_all/3","type":"function"},{"doc":"","ref":"Plausible.Sentry.Client.html","title":"Plausible.Sentry.Client","type":"module"},{"doc":"The Sentry.HTTPClient behaviour requires a child spec to be supplied. In this case we don't want Sentry to manage our Finch instances, hence it's fed with a dummy module for the sake of the contract. XXX: Submit a Sentry PR making the child spec callback optional.","ref":"Plausible.Sentry.Client.html#child_spec/0","title":"Plausible.Sentry.Client.child_spec/0","type":"function"},{"doc":"Callback implementation for Sentry.HTTPClient.post/3 .","ref":"Plausible.Sentry.Client.html#post/3","title":"Plausible.Sentry.Client.post/3","type":"function"},{"doc":"Sentry callbacks for filtering and grouping events","ref":"Plausible.SentryFilter.html","title":"Plausible.SentryFilter","type":"module"},{"doc":"","ref":"Plausible.SentryFilter.html#before_send/1","title":"Plausible.SentryFilter.before_send/1","type":"function"},{"doc":"Callback implementation for Sentry.EventFilter.exclude_exception?/2 .","ref":"Plausible.SentryFilter.html#exclude_exception?/2","title":"Plausible.SentryFilter.exclude_exception?/2","type":"function"},{"doc":"","ref":"Plausible.Session.CacheStore.html","title":"Plausible.Session.CacheStore","type":"module"},{"doc":"","ref":"Plausible.Session.CacheStore.html#on_event/3","title":"Plausible.Session.CacheStore.on_event/3","type":"function"},{"doc":"","ref":"Plausible.Session.Salts.html","title":"Plausible.Session.Salts","type":"module"},{"doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Plausible.Session.Salts.html#child_spec/1","title":"Plausible.Session.Salts.child_spec/1","type":"function"},{"doc":"","ref":"Plausible.Session.Salts.html#fetch/0","title":"Plausible.Session.Salts.fetch/0","type":"function"},{"doc":"","ref":"Plausible.Session.Salts.html#rotate/0","title":"Plausible.Session.Salts.rotate/0","type":"function"},{"doc":"","ref":"Plausible.Session.Salts.html#start_link/1","title":"Plausible.Session.Salts.start_link/1","type":"function"},{"doc":"","ref":"Plausible.Session.WriteBuffer.html","title":"Plausible.Session.WriteBuffer","type":"module"},{"doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"Plausible.Session.WriteBuffer.html#child_spec/1","title":"Plausible.Session.WriteBuffer.child_spec/1","type":"function"},{"doc":"","ref":"Plausible.Session.WriteBuffer.html#flush/0","title":"Plausible.Session.WriteBuffer.flush/0","type":"function"},{"doc":"Callback implementation for GenServer.init/1 .","ref":"Plausible.Session.WriteBuffer.html#init/1","title":"Plausible.Session.WriteBuffer.init/1","type":"function"},{"doc":"","ref":"Plausible.Session.WriteBuffer.html#insert/1","title":"Plausible.Session.WriteBuffer.insert/1","type":"function"},{"doc":"","ref":"Plausible.Session.WriteBuffer.html#start_link/1","title":"Plausible.Session.WriteBuffer.start_link/1","type":"function"},{"doc":"Site schema","ref":"Plausible.Site.html","title":"Plausible.Site","type":"module"},{"doc":"","ref":"Plausible.Site.html#changeset/2","title":"Plausible.Site.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Site.html#crm_changeset/2","title":"Plausible.Site.crm_changeset/2","type":"function"},{"doc":"","ref":"Plausible.Site.html#feature_toggle_change/3","title":"Plausible.Site.feature_toggle_change/3","type":"function"},{"doc":"","ref":"Plausible.Site.html#import_failure/1","title":"Plausible.Site.import_failure/1","type":"function"},{"doc":"","ref":"Plausible.Site.html#import_success/1","title":"Plausible.Site.import_success/1","type":"function"},{"doc":"Returns the date of the first recorded stat in the timezone configured by the user. This function does 2 transformations: UTC %NaiveDateTime{} -> Local %DateTime{} -> Local %Date Examples iex> Plausible.Site.local_start_date(%Plausible.Site{stats_start_date: nil}) nil iex> utc_start = ~N[2022-09-28 00:00:00] iex> tz = "Europe/Helsinki" iex> site = %Plausible.Site{stats_start_date: utc_start, timezone: tz} iex> Plausible.Site.local_start_date(site) ~D[2022-09-28] iex> utc_start = ~N[2022-09-28 00:00:00] iex> tz = "America/Los_Angeles" iex> site = %Plausible.Site{stats_start_date: utc_start, timezone: tz} iex> Plausible.Site.local_start_date(site) ~D[2022-09-27]","ref":"Plausible.Site.html#local_start_date/1","title":"Plausible.Site.local_start_date/1","type":"function"},{"doc":"","ref":"Plausible.Site.html#make_private/1","title":"Plausible.Site.make_private/1","type":"function"},{"doc":"","ref":"Plausible.Site.html#make_public/1","title":"Plausible.Site.make_public/1","type":"function"},{"doc":"","ref":"Plausible.Site.html#remove_imported_data/1","title":"Plausible.Site.remove_imported_data/1","type":"function"},{"doc":"","ref":"Plausible.Site.html#set_allowed_event_props/2","title":"Plausible.Site.set_allowed_event_props/2","type":"function"},{"doc":"","ref":"Plausible.Site.html#set_imported_source/2","title":"Plausible.Site.set_imported_source/2","type":"function"},{"doc":"","ref":"Plausible.Site.html#set_native_stats_start_at/2","title":"Plausible.Site.set_native_stats_start_at/2","type":"function"},{"doc":"","ref":"Plausible.Site.html#set_stats_start_date/2","title":"Plausible.Site.set_stats_start_date/2","type":"function"},{"doc":"","ref":"Plausible.Site.html#start_import/5","title":"Plausible.Site.start_import/5","type":"function"},{"doc":"","ref":"Plausible.Site.html#tz_offset/2","title":"Plausible.Site.tz_offset/2","type":"function"},{"doc":"","ref":"Plausible.Site.html#update_changeset/3","title":"Plausible.Site.update_changeset/3","type":"function"},{"doc":"","ref":"Plausible.Site.html#t:t/0","title":"Plausible.Site.t/0","type":"type"},{"doc":"A "sites by domain" caching interface. Serves as a thin wrapper around Cachex, but the underlying implementation can be transparently swapped. Even though the Cachex process is started, cache access is disabled during tests via the :sites_by_domain_cache_enabled application env key. This can be overridden on case by case basis, using the child specs options. NOTE: the cache allows lookups by both domain and domain_changed_from fields - this is to allow traffic from sites whose domains changed within a certain grace period (see: Plausible.Site.Transfer ). When Cache is disabled via application env, the get/1 function falls back to pure database lookups. This should help with introducing cached lookups in existing code, so that no existing tests should break. To differentiate cached Site structs from those retrieved directly from the database, a virtual schema field from_cache?: true is set. This indicates the Plausible.Site struct is incomplete in comparison to its database counterpart -- to spare bandwidth and query execution time, only selected database columns are retrieved and cached. There are two modes of refreshing the cache: :all and :updated_recently . :all means querying the database for all Site entries and should be done periodically (via Cache.Warmer ). All stale Cache entries are cleared upon persisting the new batch. :updated_recently attempts to re-query sites updated within the last 15 minutes only, to account for most recent changes. This refresh is lighter on the database and is meant to be executed more frequently (via Cache.Warmer.RecentlyUpdated ). Refreshing the cache emits telemetry event defined as per telemetry_event_refresh/2 . The @cached_schema_fields attribute defines the list of DB columns queried on each cache refresh. Also see tests for more comprehensive examples.","ref":"Plausible.Site.Cache.html","title":"Plausible.Site.Cache","type":"module"},{"doc":"","ref":"Plausible.Site.Cache.html#child_spec/1","title":"Plausible.Site.Cache.child_spec/1","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.html#enabled?/0","title":"Plausible.Site.Cache.enabled?/0","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.html#get/2","title":"Plausible.Site.Cache.get/2","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.html#get_site_id/2","title":"Plausible.Site.Cache.get_site_id/2","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.html#hit_rate/1","title":"Plausible.Site.Cache.hit_rate/1","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.html#merge/2","title":"Plausible.Site.Cache.merge/2","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.html#name/0","title":"Plausible.Site.Cache.name/0","type":"function"},{"doc":"Ensures the cache has non-zero size unless no sites exist. Useful for orchestrating app startup to prevent the service going up asynchronously with an empty cache.","ref":"Plausible.Site.Cache.html#ready?/1","title":"Plausible.Site.Cache.ready?/1","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.html#refresh_all/1","title":"Plausible.Site.Cache.refresh_all/1","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.html#refresh_updated_recently/1","title":"Plausible.Site.Cache.refresh_updated_recently/1","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.html#size/1","title":"Plausible.Site.Cache.size/1","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.html#telemetry_event_refresh/2","title":"Plausible.Site.Cache.telemetry_event_refresh/2","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.html#t:t/0","title":"Plausible.Site.Cache.t/0","type":"type"},{"doc":"A periodic cache warmer. Queries all Sites from Postgres, every interval and pre-populates the cache. After each run the process is hibernated, triggering garbage collection. Currently Cachex is used, but the underlying implementation can be transparently swapped. Child specification options available: interval - the number of milliseconds for each warm-up cycle, defaults to :sites_by_domain_cache_refresh_interval application env value with random jitter added, for which the maximum is stored under :sites_by_domain_cache_refresh_interval_max_jitter key. cache_name - defaults to Cache.name() but can be overriden for testing force_start? - enforcess process startup for testing, even if it's barred by Cache.enabled? . This is useful for avoiding issues with DB ownership and async tests. warmer_fn - used for testing, a custom function to retrieve the items meant to be cached during the warm-up cycle. See tests for more comprehensive examples.","ref":"Plausible.Site.Cache.Warmer.html","title":"Plausible.Site.Cache.Warmer","type":"module"},{"doc":"","ref":"Plausible.Site.Cache.Warmer.html#child_spec/1","title":"Plausible.Site.Cache.Warmer.child_spec/1","type":"function"},{"doc":"","ref":"Plausible.Site.Cache.Warmer.html#interval/0","title":"Plausible.Site.Cache.Warmer.interval/0","type":"function"},{"doc":"A Cache.Warmer adapter that refreshes the Sites Cache fully. This module exists only to make it explicit what the warmer refreshes, to be used in the supervisor tree.","ref":"Plausible.Site.Cache.Warmer.All.html","title":"Plausible.Site.Cache.Warmer.All","type":"module"},{"doc":"See Plausible.Site.Cache.Warmer.child_spec/1 .","ref":"Plausible.Site.Cache.Warmer.All.html#child_spec/1","title":"Plausible.Site.Cache.Warmer.All.child_spec/1","type":"function"},{"doc":"A Cache.Warmer adapter that only refreshes the Cache with recently updated sites every 30 seconds.","ref":"Plausible.Site.Cache.Warmer.RecentlyUpdated.html","title":"Plausible.Site.Cache.Warmer.RecentlyUpdated","type":"module"},{"doc":"","ref":"Plausible.Site.Cache.Warmer.RecentlyUpdated.html#child_spec/1","title":"Plausible.Site.Cache.Warmer.RecentlyUpdated.child_spec/1","type":"function"},{"doc":"","ref":"Plausible.Site.CustomDomain.html","title":"Plausible.Site.CustomDomain","type":"module"},{"doc":"Basic interface for domain changes. Once Plausible.DataMigration.NumericIDs schema migration is ready, domain change operation will be enabled, accessible to the users. We will set a transition period of 72 hours during which, both old and new domains, will be accepted as traffic identifiers to the same site. A periodic worker will call the expire/0 function to end it where applicable. See: Plausible.Workers.ExpireDomainChangeTransitions . The underlying changeset for domain change (see: Plausible.Site ) relies on database trigger installed via Plausible.Repo.Migrations.AllowDomainChange Postgres migration. The trigger checks if either domain or domain_changed_from exist to ensure unicity.","ref":"Plausible.Site.Domain.html","title":"Plausible.Site.Domain","type":"module"},{"doc":"","ref":"Plausible.Site.Domain.html#change/3","title":"Plausible.Site.Domain.change/3","type":"function"},{"doc":"","ref":"Plausible.Site.Domain.html#expire_change_transitions/1","title":"Plausible.Site.Domain.expire_change_transitions/1","type":"function"},{"doc":"Thin wrapper around Hammer for gate keeping domain-specific events during the ingestion phase. When the site is allowed, gate keeping check returns :allow , otherwise a :deny tagged tuple is returned with one of the following policy markers: :not_found (indicates site not found in cache) :block (indicates disabled sites) :throttle (indicates rate limiting) Rate Limiting buckets are configured per site (externally via the CRM). See: Plausible.Site To look up each site's configuration, the RateLimiter fetches a Site by domain using Plausible.Cache interface. The module defines two policies outside the regular bucket inspection: when the the site is not found in cache: not_found when the underlying rate limiting mechanism returns an internal error: :allow","ref":"Plausible.Site.GateKeeper.html","title":"Plausible.Site.GateKeeper","type":"module"},{"doc":"","ref":"Plausible.Site.GateKeeper.html#check/2","title":"Plausible.Site.GateKeeper.check/2","type":"function"},{"doc":"","ref":"Plausible.Site.GateKeeper.html#key/1","title":"Plausible.Site.GateKeeper.key/1","type":"function"},{"doc":"","ref":"Plausible.Site.GateKeeper.html#t:policy/0","title":"Plausible.Site.GateKeeper.policy/0","type":"type"},{"doc":"","ref":"Plausible.Site.GateKeeper.html#t:t/0","title":"Plausible.Site.GateKeeper.t/0","type":"type"},{"doc":"","ref":"Plausible.Site.GoogleAuth.html","title":"Plausible.Site.GoogleAuth","type":"module"},{"doc":"","ref":"Plausible.Site.GoogleAuth.html#changeset/2","title":"Plausible.Site.GoogleAuth.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Site.GoogleAuth.html#set_property/2","title":"Plausible.Site.GoogleAuth.set_property/2","type":"function"},{"doc":"Embedded schema for Google Analytics imports","ref":"Plausible.Site.ImportedData.html","title":"Plausible.Site.ImportedData","type":"module"},{"doc":"","ref":"Plausible.Site.Membership.html","title":"Plausible.Site.Membership","type":"module"},{"doc":"","ref":"Plausible.Site.Membership.html#changeset/2","title":"Plausible.Site.Membership.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Site.MonthlyReport.html","title":"Plausible.Site.MonthlyReport","type":"module"},{"doc":"","ref":"Plausible.Site.MonthlyReport.html#add_recipient/2","title":"Plausible.Site.MonthlyReport.add_recipient/2","type":"function"},{"doc":"","ref":"Plausible.Site.MonthlyReport.html#changeset/2","title":"Plausible.Site.MonthlyReport.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Site.MonthlyReport.html#remove_recipient/2","title":"Plausible.Site.MonthlyReport.remove_recipient/2","type":"function"},{"doc":"A site deletion service stub.","ref":"Plausible.Site.Removal.html","title":"Plausible.Site.Removal","type":"module"},{"doc":"","ref":"Plausible.Site.Removal.html#run/1","title":"Plausible.Site.Removal.run/1","type":"function"},{"doc":"","ref":"Plausible.Site.SharedLink.html","title":"Plausible.Site.SharedLink","type":"module"},{"doc":"","ref":"Plausible.Site.SharedLink.html#changeset/2","title":"Plausible.Site.SharedLink.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Site.SpikeNotification.html","title":"Plausible.Site.SpikeNotification","type":"module"},{"doc":"","ref":"Plausible.Site.SpikeNotification.html#add_recipient/2","title":"Plausible.Site.SpikeNotification.add_recipient/2","type":"function"},{"doc":"","ref":"Plausible.Site.SpikeNotification.html#changeset/2","title":"Plausible.Site.SpikeNotification.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Site.SpikeNotification.html#remove_recipient/2","title":"Plausible.Site.SpikeNotification.remove_recipient/2","type":"function"},{"doc":"","ref":"Plausible.Site.SpikeNotification.html#was_sent/1","title":"Plausible.Site.SpikeNotification.was_sent/1","type":"function"},{"doc":"","ref":"Plausible.Site.WeeklyReport.html","title":"Plausible.Site.WeeklyReport","type":"module"},{"doc":"","ref":"Plausible.Site.WeeklyReport.html#add_recipient/2","title":"Plausible.Site.WeeklyReport.add_recipient/2","type":"function"},{"doc":"","ref":"Plausible.Site.WeeklyReport.html#changeset/2","title":"Plausible.Site.WeeklyReport.changeset/2","type":"function"},{"doc":"","ref":"Plausible.Site.WeeklyReport.html#remove_recipient/2","title":"Plausible.Site.WeeklyReport.remove_recipient/2","type":"function"},{"doc":"","ref":"Plausible.SiteAdmin.html","title":"Plausible.SiteAdmin","type":"module"},{"doc":"","ref":"Plausible.SiteAdmin.html#create_changeset/2","title":"Plausible.SiteAdmin.create_changeset/2","type":"function"},{"doc":"","ref":"Plausible.SiteAdmin.html#custom_index_query/3","title":"Plausible.SiteAdmin.custom_index_query/3","type":"function"},{"doc":"","ref":"Plausible.SiteAdmin.html#form_fields/1","title":"Plausible.SiteAdmin.form_fields/1","type":"function"},{"doc":"","ref":"Plausible.SiteAdmin.html#get_struct_fields/1","title":"Plausible.SiteAdmin.get_struct_fields/1","type":"function"},{"doc":"","ref":"Plausible.SiteAdmin.html#index/1","title":"Plausible.SiteAdmin.index/1","type":"function"},{"doc":"","ref":"Plausible.SiteAdmin.html#list_actions/1","title":"Plausible.SiteAdmin.list_actions/1","type":"function"},{"doc":"","ref":"Plausible.SiteAdmin.html#ordering/1","title":"Plausible.SiteAdmin.ordering/1","type":"function"},{"doc":"","ref":"Plausible.SiteAdmin.html#search_fields/1","title":"Plausible.SiteAdmin.search_fields/1","type":"function"},{"doc":"","ref":"Plausible.SiteAdmin.html#set_allowed_props_for_site/3","title":"Plausible.SiteAdmin.set_allowed_props_for_site/3","type":"function"},{"doc":"","ref":"Plausible.SiteAdmin.html#update_changeset/2","title":"Plausible.SiteAdmin.update_changeset/2","type":"function"},{"doc":"","ref":"Plausible.Sites.html","title":"Plausible.Sites","type":"module"},{"doc":"","ref":"Plausible.Sites.html#create/2","title":"Plausible.Sites.create/2","type":"function"},{"doc":"","ref":"Plausible.Sites.html#create_shared_link/3","title":"Plausible.Sites.create_shared_link/3","type":"function"},{"doc":"","ref":"Plausible.Sites.html#get_by_domain/1","title":"Plausible.Sites.get_by_domain/1","type":"function"},{"doc":"","ref":"Plausible.Sites.html#get_for_user/3","title":"Plausible.Sites.get_for_user/3","type":"function"},{"doc":"","ref":"Plausible.Sites.html#get_for_user!/3","title":"Plausible.Sites.get_for_user!/3","type":"function"},{"doc":"","ref":"Plausible.Sites.html#has_admin_access?/2","title":"Plausible.Sites.has_admin_access?/2","type":"function"},{"doc":"","ref":"Plausible.Sites.html#has_goals?/1","title":"Plausible.Sites.has_goals?/1","type":"function"},{"doc":"","ref":"Plausible.Sites.html#has_stats?/1","title":"Plausible.Sites.has_stats?/1","type":"function"},{"doc":"","ref":"Plausible.Sites.html#is_member?/2","title":"Plausible.Sites.is_member?/2","type":"function"},{"doc":"","ref":"Plausible.Sites.html#locked?/1","title":"Plausible.Sites.locked?/1","type":"function"},{"doc":"","ref":"Plausible.Sites.html#owned_site_ids/1","title":"Plausible.Sites.owned_site_ids/1","type":"function"},{"doc":"","ref":"Plausible.Sites.html#owned_sites_count/1","title":"Plausible.Sites.owned_sites_count/1","type":"function"},{"doc":"","ref":"Plausible.Sites.html#owned_sites_domains/1","title":"Plausible.Sites.owned_sites_domains/1","type":"function"},{"doc":"","ref":"Plausible.Sites.html#owner_for/1","title":"Plausible.Sites.owner_for/1","type":"function"},{"doc":"","ref":"Plausible.Sites.html#role/2","title":"Plausible.Sites.role/2","type":"function"},{"doc":"","ref":"Plausible.Sites.html#shared_link_url/2","title":"Plausible.Sites.shared_link_url/2","type":"function"},{"doc":"Returns the date of the first event of the given site, or nil if the site does not have stats yet. If this is the first time the function is called for the site, it queries Clickhouse and saves the date in the sites table.","ref":"Plausible.Sites.html#stats_start_date/1","title":"Plausible.Sites.stats_start_date/1","type":"function"},{"doc":"","ref":"Plausible.Stats.html","title":"Plausible.Stats","type":"module"},{"doc":"See Plausible.Stats.Aggregate.aggregate/3 .","ref":"Plausible.Stats.html#aggregate/3","title":"Plausible.Stats.aggregate/3","type":"function"},{"doc":"See Plausible.Stats.Breakdown.breakdown/5 .","ref":"Plausible.Stats.html#breakdown/5","title":"Plausible.Stats.breakdown/5","type":"function"},{"doc":"See Plausible.Stats.CurrentVisitors.current_visitors/1 .","ref":"Plausible.Stats.html#current_visitors/1","title":"Plausible.Stats.current_visitors/1","type":"function"},{"doc":"See Plausible.Stats.FilterSuggestions.filter_suggestions/4 .","ref":"Plausible.Stats.html#filter_suggestions/4","title":"Plausible.Stats.filter_suggestions/4","type":"function"},{"doc":"See Plausible.Stats.Funnel.funnel/3 .","ref":"Plausible.Stats.html#funnel/3","title":"Plausible.Stats.funnel/3","type":"function"},{"doc":"See Plausible.Stats.Timeseries.timeseries/3 .","ref":"Plausible.Stats.html#timeseries/3","title":"Plausible.Stats.timeseries/3","type":"function"},{"doc":"","ref":"Plausible.Stats.Aggregate.html","title":"Plausible.Stats.Aggregate","type":"module"},{"doc":"","ref":"Plausible.Stats.Aggregate.html#aggregate/3","title":"Plausible.Stats.Aggregate.aggregate/3","type":"function"},{"doc":"","ref":"Plausible.Stats.Base.html","title":"Plausible.Stats.Base","type":"module"},{"doc":"","ref":"Plausible.Stats.Base.html#apply_entry_prop_filter/3","title":"Plausible.Stats.Base.apply_entry_prop_filter/3","type":"function"},{"doc":"","ref":"Plausible.Stats.Base.html#base_event_query/2","title":"Plausible.Stats.Base.base_event_query/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Base.html#filter_by_entry_props/2","title":"Plausible.Stats.Base.filter_by_entry_props/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Base.html#filter_converted_sessions/3","title":"Plausible.Stats.Base.filter_converted_sessions/3","type":"function"},{"doc":"","ref":"Plausible.Stats.Base.html#page_regex/1","title":"Plausible.Stats.Base.page_regex/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Base.html#query_events/2","title":"Plausible.Stats.Base.query_events/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Base.html#query_sessions/2","title":"Plausible.Stats.Base.query_sessions/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Base.html#select_event_metrics/2","title":"Plausible.Stats.Base.select_event_metrics/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Base.html#select_session_metrics/3","title":"Plausible.Stats.Base.select_session_metrics/3","type":"function"},{"doc":"","ref":"Plausible.Stats.Base.html#utc_boundaries/2","title":"Plausible.Stats.Base.utc_boundaries/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Breakdown.html","title":"Plausible.Stats.Breakdown","type":"module"},{"doc":"","ref":"Plausible.Stats.Breakdown.html#breakdown/5","title":"Plausible.Stats.Breakdown.breakdown/5","type":"function"},{"doc":"","ref":"Plausible.Stats.Clickhouse.html","title":"Plausible.Stats.Clickhouse","type":"module"},{"doc":"","ref":"Plausible.Stats.Clickhouse.html#current_visitors/2","title":"Plausible.Stats.Clickhouse.current_visitors/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Clickhouse.html#has_pageviews?/1","title":"Plausible.Stats.Clickhouse.has_pageviews?/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Clickhouse.html#imported_pageview_count/1","title":"Plausible.Stats.Clickhouse.imported_pageview_count/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Clickhouse.html#last_24h_visitors/1","title":"Plausible.Stats.Clickhouse.last_24h_visitors/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Clickhouse.html#pageview_start_date_local/1","title":"Plausible.Stats.Clickhouse.pageview_start_date_local/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Clickhouse.html#top_sources/6","title":"Plausible.Stats.Clickhouse.top_sources/6","type":"function"},{"doc":"","ref":"Plausible.Stats.Clickhouse.html#usage_breakdown/1","title":"Plausible.Stats.Clickhouse.usage_breakdown/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Clickhouse.html#usage_breakdown/2","title":"Plausible.Stats.Clickhouse.usage_breakdown/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Compare.html","title":"Plausible.Stats.Compare","type":"module"},{"doc":"","ref":"Plausible.Stats.Compare.html#calculate_change/3","title":"Plausible.Stats.Compare.calculate_change/3","type":"function"},{"doc":"This module provides functions for comparing query periods. It allows you to compare a given period with a previous period or with the same period from the previous year. For example, you can compare this month's main graph with last month or with the same month from last year.","ref":"Plausible.Stats.Comparisons.html","title":"Plausible.Stats.Comparisons","type":"module"},{"doc":"Generates a comparison query based on the source query and comparison mode. The mode parameter specifies the type of comparison and can be one of the following: "previous_period" - shifts back the query by the same number of days the source query has. "year_over_year" - shifts back the query by 1 year. "custom" - compares the query using a custom date range. See options for more details. The comparison query returned by the function has its end date restricted to the current day. This can be overriden by the now option, described below. Options :now - a NaiveDateTime struct with the current date and time. This is optional and used for testing purposes. :from - a ISO-8601 date string used when mode is "custom" . :to - a ISO-8601 date string used when mode is "custom" . Must be after from . :match_day_of_week? - determines whether the comparison query should be adjusted to match the day of the week of the source query. When this option is set to true, the comparison query is shifted to start on the same day of the week as the source query, rather than on the exact same date. For example, if the source query starts on Sunday, January 1st, 2023 and the year_over_year comparison query is configured to match_day_of_week? , it will be shifted to start on Sunday, January 2nd, 2022 instead of January 1st. Defaults to false.","ref":"Plausible.Stats.Comparisons.html#compare/4","title":"Plausible.Stats.Comparisons.compare/4","type":"function"},{"doc":"","ref":"Plausible.Stats.Comparisons.html#t:mode/0","title":"Plausible.Stats.Comparisons.mode/0","type":"type"},{"doc":"","ref":"Plausible.Stats.CurrentVisitors.html","title":"Plausible.Stats.CurrentVisitors","type":"module"},{"doc":"","ref":"Plausible.Stats.CurrentVisitors.html#current_visitors/1","title":"Plausible.Stats.CurrentVisitors.current_visitors/1","type":"function"},{"doc":"Module for querying user defined 'custom properties'.","ref":"Plausible.Stats.CustomProps.html","title":"Plausible.Stats.CustomProps","type":"module"},{"doc":"","ref":"Plausible.Stats.CustomProps.html#maybe_allowed_props_only/2","title":"Plausible.Stats.CustomProps.maybe_allowed_props_only/2","type":"function"},{"doc":"Returns a breakdown of event names with all existing custom properties for each event name.","ref":"Plausible.Stats.CustomProps.html#props_for_all_event_names/2","title":"Plausible.Stats.CustomProps.props_for_all_event_names/2","type":"function"},{"doc":"Expects a single goal filter in the query. Returns a list of custom props for that goal. Works for both custom event and pageview goals.","ref":"Plausible.Stats.CustomProps.html#props_for_goal/2","title":"Plausible.Stats.CustomProps.props_for_goal/2","type":"function"},{"doc":"A module for parsing filters used in stat queries.","ref":"Plausible.Stats.FilterParser.html","title":"Plausible.Stats.FilterParser","type":"module"},{"doc":"Parses different filter formats. Depending on the format and type of the filters argument, returns: a decoded map, when filters is encoded JSON a parsed filter map, when filters is a filter expression string the same map, when filters is a map Returns an empty map when argument type is unexpected (e.g. nil ). Examples: iex> FilterParser . parse_filters ( "{ \\" page \\" : \\" /blog/** \\" }" ) %{ "page" => "/blog/**" } iex> FilterParser . parse_filters ( "visit:browser!=Chrome" ) %{ "visit:browser" => { :is_not , "Chrome" } } iex> FilterParser . parse_filters ( nil ) %{ }","ref":"Plausible.Stats.FilterParser.html#parse_filters/1","title":"Plausible.Stats.FilterParser.parse_filters/1","type":"function"},{"doc":"","ref":"Plausible.Stats.FilterSuggestions.html","title":"Plausible.Stats.FilterSuggestions","type":"module"},{"doc":"","ref":"Plausible.Stats.FilterSuggestions.html#filter_suggestions/4","title":"Plausible.Stats.FilterSuggestions.filter_suggestions/4","type":"function"},{"doc":"","ref":"Plausible.Stats.Filters.html","title":"Plausible.Stats.Filters","type":"module"},{"doc":"","ref":"Plausible.Stats.Filters.html#add_prefix/1","title":"Plausible.Stats.Filters.add_prefix/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Filters.html#visit_props/0","title":"Plausible.Stats.Filters.visit_props/0","type":"function"},{"doc":"","ref":"Plausible.Stats.Fragments.html","title":"Plausible.Stats.Fragments","type":"module"},{"doc":"","ref":"Plausible.Stats.Fragments.html#bounce_rate/0","title":"Plausible.Stats.Fragments.bounce_rate/0","type":"macro"},{"doc":"","ref":"Plausible.Stats.Fragments.html#coalesce_string/2","title":"Plausible.Stats.Fragments.coalesce_string/2","type":"macro"},{"doc":"","ref":"Plausible.Stats.Fragments.html#sample_percent/0","title":"Plausible.Stats.Fragments.sample_percent/0","type":"macro"},{"doc":"Converts time or date and time to the specified timezone. Reference: https://clickhouse.com/docs/en/sql-reference/functions/date-time-functions/#totimezone","ref":"Plausible.Stats.Fragments.html#to_timezone/2","title":"Plausible.Stats.Fragments.to_timezone/2","type":"macro"},{"doc":"","ref":"Plausible.Stats.Fragments.html#total/0","title":"Plausible.Stats.Fragments.total/0","type":"macro"},{"doc":"","ref":"Plausible.Stats.Fragments.html#uniq/1","title":"Plausible.Stats.Fragments.uniq/1","type":"macro"},{"doc":"","ref":"Plausible.Stats.Fragments.html#visit_duration/0","title":"Plausible.Stats.Fragments.visit_duration/0","type":"macro"},{"doc":"Returns the weekstart for date . If the weekstart is before the not_before boundary, not_before is returned. Examples In this pseudo-code example, the fragment returns the weekstart. The not_before boundary is set to the past Saturday, which is before the weekstart, therefore the cap does not apply. iex> this_wednesday = ~D[2022-11-09] ...> past_saturday = ~D[2022-11-05] ...> weekstart_not_before(this_wednesday, past_saturday) ~D[2022-11-07] In this other example, the fragment returns Tuesday and not the weekstart. The not_before boundary is set to Tuesday, which is past the weekstart, therefore the cap applies. iex> this_wednesday = ~D[2022-11-09] ...> this_tuesday = ~D[2022-11-08] ...> weekstart_not_before(this_wednesday, this_tuesday) ~D[2022-11-08]","ref":"Plausible.Stats.Fragments.html#weekstart_not_before/2","title":"Plausible.Stats.Fragments.weekstart_not_before/2","type":"macro"},{"doc":"Same as Plausible.Stats.Fragments.weekstart_not_before/2 but converts dates to the specified timezone.","ref":"Plausible.Stats.Fragments.html#weekstart_not_before/3","title":"Plausible.Stats.Fragments.weekstart_not_before/3","type":"macro"},{"doc":"Module responsible for funnel evaluation, i.e. building and executing ClickHouse funnel query based on Plausible.Funnel definition.","ref":"Plausible.Stats.Funnel.html","title":"Plausible.Stats.Funnel","type":"module"},{"doc":"","ref":"Plausible.Stats.Funnel.html#funnel/3","title":"Plausible.Stats.Funnel.funnel/3","type":"function"},{"doc":"","ref":"Plausible.Stats.Imported.html","title":"Plausible.Stats.Imported","type":"module"},{"doc":"","ref":"Plausible.Stats.Imported.html#merge_imported/5","title":"Plausible.Stats.Imported.merge_imported/5","type":"function"},{"doc":"","ref":"Plausible.Stats.Imported.html#merge_imported_timeseries/4","title":"Plausible.Stats.Imported.merge_imported_timeseries/4","type":"function"},{"doc":"Collection of functions to work with intervals. The interval of a query defines the granularity of the data. You can think of it as a GROUP BY clause. Possible values are minute , hour , date , week , and month .","ref":"Plausible.Stats.Interval.html","title":"Plausible.Stats.Interval","type":"module"},{"doc":"Returns the suggested interval for the given Date.Range struct. Examples iex> Plausible.Stats.Interval.default_for_date_range(Date.range(~D[2022-01-01], ~D[2023-01-01])) "month" iex> Plausible.Stats.Interval.default_for_date_range(Date.range(~D[2022-01-01], ~D[2022-01-15])) "date" iex> Plausible.Stats.Interval.default_for_date_range(Date.range(~D[2022-01-01], ~D[2022-01-01])) "hour"","ref":"Plausible.Stats.Interval.html#default_for_date_range/1","title":"Plausible.Stats.Interval.default_for_date_range/1","type":"function"},{"doc":"Returns the suggested interval for the given time period. Examples iex> Plausible.Stats.Interval.default_for_period("7d") "date"","ref":"Plausible.Stats.Interval.html#default_for_period/1","title":"Plausible.Stats.Interval.default_for_period/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Interval.html#list/0","title":"Plausible.Stats.Interval.list/0","type":"function"},{"doc":"","ref":"Plausible.Stats.Interval.html#valid?/1","title":"Plausible.Stats.Interval.valid?/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Interval.html#valid_by_period/0","title":"Plausible.Stats.Interval.valid_by_period/0","type":"function"},{"doc":"Returns whether the given interval is valid for a time period. Intervals longer than periods are not supported, e.g. current month stats with a month interval, or today stats with a week interval. Examples iex> Plausible.Stats.Interval.valid_for_period?("month", "date") true iex> Plausible.Stats.Interval.valid_for_period?("30d", "month") false iex> Plausible.Stats.Interval.valid_for_period?("realtime", "week") false","ref":"Plausible.Stats.Interval.html#valid_for_period?/2","title":"Plausible.Stats.Interval.valid_for_period?/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Interval.html#t:t/0","title":"Plausible.Stats.Interval.t/0","type":"type"},{"doc":"","ref":"Plausible.Stats.Props.html","title":"Plausible.Stats.Props","type":"module"},{"doc":"","ref":"Plausible.Stats.Props.html#event_props/0","title":"Plausible.Stats.Props.event_props/0","type":"function"},{"doc":"","ref":"Plausible.Stats.Props.html#valid_prop?/1","title":"Plausible.Stats.Props.valid_prop?/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Query.html","title":"Plausible.Stats.Query","type":"module"},{"doc":"","ref":"Plausible.Stats.Query.html#from/2","title":"Plausible.Stats.Query.from/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Query.html#get_filter_by_prefix/2","title":"Plausible.Stats.Query.get_filter_by_prefix/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Query.html#has_event_filters?/1","title":"Plausible.Stats.Query.has_event_filters?/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Query.html#include_imported?/3","title":"Plausible.Stats.Query.include_imported?/3","type":"function"},{"doc":"","ref":"Plausible.Stats.Query.html#put_filter/3","title":"Plausible.Stats.Query.put_filter/3","type":"function"},{"doc":"","ref":"Plausible.Stats.Query.html#remove_event_filters/2","title":"Plausible.Stats.Query.remove_event_filters/2","type":"function"},{"doc":"","ref":"Plausible.Stats.Query.html#trace/1","title":"Plausible.Stats.Query.trace/1","type":"function"},{"doc":"","ref":"Plausible.Stats.Query.html#t:t/0","title":"Plausible.Stats.Query.t/0","type":"type"},{"doc":"","ref":"Plausible.Stats.Timeseries.html","title":"Plausible.Stats.Timeseries","type":"module"},{"doc":"","ref":"Plausible.Stats.Timeseries.html#timeseries/3","title":"Plausible.Stats.Timeseries.timeseries/3","type":"function"},{"doc":"","ref":"Plausible.Stats.Timeseries.html#t:results/0","title":"Plausible.Stats.Timeseries.results/0","type":"type"},{"doc":"Utilities for modifying stat results","ref":"Plausible.Stats.Util.html","title":"Plausible.Stats.Util","type":"module"},{"doc":"","ref":"Plausible.Stats.Util.html#cast_revenue_metrics_to_money/2","title":"Plausible.Stats.Util.cast_revenue_metrics_to_money/2","type":"function"},{"doc":"Returns the common currency for the goal filters in a query. If there are no goal filters, or multiple currencies, nil is returned and revenue metrics are dropped. Aggregating revenue data works only for same currency goals. If the query is filtered by goals with different currencies, for example, one USD and other EUR, revenue metrics are dropped.","ref":"Plausible.Stats.Util.html#get_revenue_tracking_currency/3","title":"Plausible.Stats.Util.get_revenue_tracking_currency/3","type":"function"},{"doc":"","ref":"Plausible.Stats.Util.html#remove_internal_visits_metric/1","title":"Plausible.Stats.Util.remove_internal_visits_metric/1","type":"function"},{"doc":"__internal_visits is fetched when querying bounce rate and visit duration, as it is needed to calculate these from imported data. This function removes that metric from all entries in the results list.","ref":"Plausible.Stats.Util.html#remove_internal_visits_metric/2","title":"Plausible.Stats.Util.remove_internal_visits_metric/2","type":"function"},{"doc":"Floki wrappers to help make assertions about HTML/DOM structures","ref":"Plausible.Test.Support.HTML.html","title":"Plausible.Test.Support.HTML","type":"module"},{"doc":"","ref":"Plausible.Test.Support.HTML.html#element_exists?/2","title":"Plausible.Test.Support.HTML.element_exists?/2","type":"function"},{"doc":"","ref":"Plausible.Test.Support.HTML.html#find/2","title":"Plausible.Test.Support.HTML.find/2","type":"function"},{"doc":"","ref":"Plausible.Test.Support.HTML.html#form_exists?/2","title":"Plausible.Test.Support.HTML.form_exists?/2","type":"function"},{"doc":"","ref":"Plausible.Test.Support.HTML.html#submit_button/2","title":"Plausible.Test.Support.HTML.submit_button/2","type":"function"},{"doc":"","ref":"Plausible.Test.Support.HTML.html#text_of_attr/2","title":"Plausible.Test.Support.HTML.text_of_attr/2","type":"function"},{"doc":"","ref":"Plausible.Test.Support.HTML.html#text_of_element/2","title":"Plausible.Test.Support.HTML.text_of_element/2","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html","title":"Plausible.TestUtils","type":"module"},{"doc":"","ref":"Plausible.TestUtils.html#add_imported_data/1","title":"Plausible.TestUtils.add_imported_data/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#await_clickhouse_count/2","title":"Plausible.TestUtils.await_clickhouse_count/2","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#create_api_key/1","title":"Plausible.TestUtils.create_api_key/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#create_events/1","title":"Plausible.TestUtils.create_events/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#create_new_site/1","title":"Plausible.TestUtils.create_new_site/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#create_pageviews/1","title":"Plausible.TestUtils.create_pageviews/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#create_sessions/1","title":"Plausible.TestUtils.create_sessions/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#create_site/1","title":"Plausible.TestUtils.create_site/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#create_user/1","title":"Plausible.TestUtils.create_user/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#eventually/3","title":"Plausible.TestUtils.eventually/3","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#init_session/1","title":"Plausible.TestUtils.init_session/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#log_in/1","title":"Plausible.TestUtils.log_in/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#patch_env/2","title":"Plausible.TestUtils.patch_env/2","type":"macro"},{"doc":"","ref":"Plausible.TestUtils.html#populate_stats/1","title":"Plausible.TestUtils.populate_stats/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#populate_stats/2","title":"Plausible.TestUtils.populate_stats/2","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#relative_time/1","title":"Plausible.TestUtils.relative_time/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#setup_patch_env/2","title":"Plausible.TestUtils.setup_patch_env/2","type":"macro"},{"doc":"","ref":"Plausible.TestUtils.html#to_naive_truncate/1","title":"Plausible.TestUtils.to_naive_truncate/1","type":"function"},{"doc":"","ref":"Plausible.TestUtils.html#use_api_key/1","title":"Plausible.TestUtils.use_api_key/1","type":"function"},{"doc":"","ref":"Plausible.Themes.html","title":"Plausible.Themes","type":"module"},{"doc":"","ref":"Plausible.Themes.html#options/0","title":"Plausible.Themes.options/0","type":"function"},{"doc":"","ref":"Plausible.Timezones.html","title":"Plausible.Timezones","type":"module"},{"doc":"","ref":"Plausible.Timezones.html#options/1","title":"Plausible.Timezones.options/1","type":"function"},{"doc":"","ref":"Plausible.Workers.CheckUsage.html","title":"Plausible.Workers.CheckUsage","type":"module"},{"doc":"","ref":"Plausible.Workers.CheckUsage.html#check_enterprise_subscriber/2","title":"Plausible.Workers.CheckUsage.check_enterprise_subscriber/2","type":"function"},{"doc":"","ref":"Plausible.Workers.CheckUsage.html#day_of_month/1","title":"Plausible.Workers.CheckUsage.day_of_month/1","type":"macro"},{"doc":"","ref":"Plausible.Workers.CheckUsage.html#last_day_of_month/1","title":"Plausible.Workers.CheckUsage.last_day_of_month/1","type":"macro"},{"doc":"","ref":"Plausible.Workers.CheckUsage.html#least/2","title":"Plausible.Workers.CheckUsage.least/2","type":"macro"},{"doc":"","ref":"Plausible.Workers.CheckUsage.html#yesterday/0","title":"Plausible.Workers.CheckUsage.yesterday/0","type":"macro"},{"doc":"","ref":"Plausible.Workers.CleanEmailVerificationCodes.html","title":"Plausible.Workers.CleanEmailVerificationCodes","type":"module"},{"doc":"","ref":"Plausible.Workers.CleanInvitations.html","title":"Plausible.Workers.CleanInvitations","type":"module"},{"doc":"Periodic worker that expires domain change transition period. Old domains are frozen for a given time, so users can still access them before redeploying their scripts and integrations.","ref":"Plausible.Workers.ExpireDomainChangeTransitions.html","title":"Plausible.Workers.ExpireDomainChangeTransitions","type":"module"},{"doc":"","ref":"Plausible.Workers.ImportGoogleAnalytics.html","title":"Plausible.Workers.ImportGoogleAnalytics","type":"module"},{"doc":"","ref":"Plausible.Workers.ImportGoogleAnalytics.html#import_failed/1","title":"Plausible.Workers.ImportGoogleAnalytics.import_failed/1","type":"function"},{"doc":"","ref":"Plausible.Workers.LockSites.html","title":"Plausible.Workers.LockSites","type":"module"},{"doc":"","ref":"Plausible.Workers.NotifyAnnualRenewal.html","title":"Plausible.Workers.NotifyAnnualRenewal","type":"module"},{"doc":"Sends a notification at most 7 days and at least 1 day before the renewal of an annual subscription","ref":"Plausible.Workers.NotifyAnnualRenewal.html#perform/1","title":"Plausible.Workers.NotifyAnnualRenewal.perform/1","type":"function"},{"doc":"","ref":"Plausible.Workers.RotateSalts.html","title":"Plausible.Workers.RotateSalts","type":"module"},{"doc":"","ref":"Plausible.Workers.ScheduleEmailReports.html","title":"Plausible.Workers.ScheduleEmailReports","type":"module"},{"doc":"","ref":"Plausible.Workers.ScheduleEmailReports.html#first_of_month_9am/1","title":"Plausible.Workers.ScheduleEmailReports.first_of_month_9am/1","type":"function"},{"doc":"","ref":"Plausible.Workers.ScheduleEmailReports.html#monday_9am/1","title":"Plausible.Workers.ScheduleEmailReports.monday_9am/1","type":"function"},{"doc":"Email reports should be sent on Monday at 9am according to the timezone of a site. This job runs every day at midnight to ensure that all sites have a scheduled job for email reports.","ref":"Plausible.Workers.ScheduleEmailReports.html#perform/1","title":"Plausible.Workers.ScheduleEmailReports.perform/1","type":"function"},{"doc":"","ref":"Plausible.Workers.SendCheckStatsEmails.html","title":"Plausible.Workers.SendCheckStatsEmails","type":"module"},{"doc":"","ref":"Plausible.Workers.SendEmailReport.html","title":"Plausible.Workers.SendEmailReport","type":"module"},{"doc":"","ref":"Plausible.Workers.SendSiteSetupEmails.html","title":"Plausible.Workers.SendSiteSetupEmails","type":"module"},{"doc":"","ref":"Plausible.Workers.SendTrialNotifications.html","title":"Plausible.Workers.SendTrialNotifications","type":"module"},{"doc":"","ref":"Plausible.Workers.SpikeNotifier.html","title":"Plausible.Workers.SpikeNotifier","type":"module"},{"doc":"","ref":"PlausibleWeb.html","title":"PlausibleWeb","type":"module"},{"doc":"When used, dispatch to the appropriate controller/view/etc.","ref":"PlausibleWeb.html#__using__/1","title":"PlausibleWeb.__using__/1","type":"macro"},{"doc":"","ref":"PlausibleWeb.html#channel/0","title":"PlausibleWeb.channel/0","type":"function"},{"doc":"","ref":"PlausibleWeb.html#controller/0","title":"PlausibleWeb.controller/0","type":"function"},{"doc":"","ref":"PlausibleWeb.html#router/0","title":"PlausibleWeb.router/0","type":"function"},{"doc":"","ref":"PlausibleWeb.html#view/0","title":"PlausibleWeb.view/0","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalController.html","title":"PlausibleWeb.Api.ExternalController","type":"module"},{"doc":"","ref":"PlausibleWeb.Api.ExternalController.html#error/2","title":"PlausibleWeb.Api.ExternalController.error/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalController.html#event/2","title":"PlausibleWeb.Api.ExternalController.event/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalController.html#health/2","title":"PlausibleWeb.Api.ExternalController.health/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalController.html#info/2","title":"PlausibleWeb.Api.ExternalController.info/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html","title":"PlausibleWeb.Api.ExternalSitesController","type":"module"},{"doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#create_site/2","title":"PlausibleWeb.Api.ExternalSitesController.create_site/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#delete_goal/2","title":"PlausibleWeb.Api.ExternalSitesController.delete_goal/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#delete_site/2","title":"PlausibleWeb.Api.ExternalSitesController.delete_site/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#find_or_create_goal/2","title":"PlausibleWeb.Api.ExternalSitesController.find_or_create_goal/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#find_or_create_shared_link/2","title":"PlausibleWeb.Api.ExternalSitesController.find_or_create_shared_link/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#get_site/2","title":"PlausibleWeb.Api.ExternalSitesController.get_site/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#update_site/2","title":"PlausibleWeb.Api.ExternalSitesController.update_site/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalStatsController.html","title":"PlausibleWeb.Api.ExternalStatsController","type":"module"},{"doc":"","ref":"PlausibleWeb.Api.ExternalStatsController.html#aggregate/2","title":"PlausibleWeb.Api.ExternalStatsController.aggregate/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalStatsController.html#breakdown/2","title":"PlausibleWeb.Api.ExternalStatsController.breakdown/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalStatsController.html#realtime_visitors/2","title":"PlausibleWeb.Api.ExternalStatsController.realtime_visitors/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.ExternalStatsController.html#timeseries/2","title":"PlausibleWeb.Api.ExternalStatsController.timeseries/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.Helpers.html","title":"PlausibleWeb.Api.Helpers","type":"module"},{"doc":"","ref":"PlausibleWeb.Api.Helpers.html#bad_request/2","title":"PlausibleWeb.Api.Helpers.bad_request/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.Helpers.html#not_found/2","title":"PlausibleWeb.Api.Helpers.not_found/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.Helpers.html#payment_required/2","title":"PlausibleWeb.Api.Helpers.payment_required/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.Helpers.html#too_many_requests/2","title":"PlausibleWeb.Api.Helpers.too_many_requests/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.Helpers.html#unauthorized/2","title":"PlausibleWeb.Api.Helpers.unauthorized/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.InternalController.html","title":"PlausibleWeb.Api.InternalController","type":"module"},{"doc":"","ref":"PlausibleWeb.Api.InternalController.html#disable_feature/2","title":"PlausibleWeb.Api.InternalController.disable_feature/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.InternalController.html#domain_status/2","title":"PlausibleWeb.Api.InternalController.domain_status/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.InternalController.html#sites/2","title":"PlausibleWeb.Api.InternalController.sites/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.PaddleController.html","title":"PlausibleWeb.Api.PaddleController","type":"module"},{"doc":"","ref":"PlausibleWeb.Api.PaddleController.html#verified_signature?/1","title":"PlausibleWeb.Api.PaddleController.verified_signature?/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.PaddleController.html#verify_signature/2","title":"PlausibleWeb.Api.PaddleController.verify_signature/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.PaddleController.html#webhook/2","title":"PlausibleWeb.Api.PaddleController.webhook/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html","title":"PlausibleWeb.Api.StatsController","type":"module"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#all_props_breakdown/2","title":"PlausibleWeb.Api.StatsController.all_props_breakdown/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#browser_versions/2","title":"PlausibleWeb.Api.StatsController.browser_versions/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#browsers/2","title":"PlausibleWeb.Api.StatsController.browsers/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#cities/2","title":"PlausibleWeb.Api.StatsController.cities/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#conversions/2","title":"PlausibleWeb.Api.StatsController.conversions/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#countries/2","title":"PlausibleWeb.Api.StatsController.countries/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#current_visitors/2","title":"PlausibleWeb.Api.StatsController.current_visitors/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#custom_prop_values/2","title":"PlausibleWeb.Api.StatsController.custom_prop_values/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#entry_pages/2","title":"PlausibleWeb.Api.StatsController.entry_pages/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#exit_pages/2","title":"PlausibleWeb.Api.StatsController.exit_pages/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#filter_suggestions/2","title":"PlausibleWeb.Api.StatsController.filter_suggestions/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#funnel/2","title":"PlausibleWeb.Api.StatsController.funnel/2","type":"function"},{"doc":"Returns a time-series based on given parameters. Parameters This API accepts the following parameters: period - x-axis of the graph, e.g. 12mo , day , custom . metric - y-axis of the graph, e.g. visits , visitors , pageviews . See the Stats API "Metrics" section for more details. Defaults to visitors . interval - granularity of the time-series data. You can think of it as a GROUP BY clause. Possible values are minute , hour , date , week , and month . The default depends on the period parameter. Check Plausible.Query.from/2 for each default. filters - optional filters to drill down data. See the Stats API "Filtering" section for more details. with_imported - boolean indicating whether to include Google Analytics imported data or not. Defaults to false . Full example: %{ "from" => "2021-09-06" , "interval" => "month" , "metric" => "visitors" , "period" => "custom" , "to" => "2021-12-13" } Response Returns a map with the following keys: plot - list of values for the requested metric representing the y-axis of the graph. labels - list of date times representing the x-axis of the graph. present_index - index of the element representing the current date in labels and plot lists. interval - the interval used for querying. with_imported - boolean indicating whether the Google Analytics data was queried or not. imported_source - the source of the imported data, when applicable. Currently only Google Analytics is supported. full_intervals - map of dates indicating whether the interval has been cut off by the requested date range or not. For example, if looking at a month week-by-week, some weeks may be cut off by the month boundaries. It's useful to adjust the graph display slightly in case the interval is not 'full' so that the user understands why the numbers might be lower for those partial periods. Full example: %{ "full_intervals" => %{ "2021-09-01" => false , "2021-10-01" => true , "2021-11-01" => true , "2021-12-01" => false } , "imported_source" => nil , "interval" => "month" , "labels" => [ "2021-09-01" , "2021-10-01" , "2021-11-01" , "2021-12-01" ] , "plot" => [ 0 , 0 , 0 , 0 ] , "present_index" => nil , "with_imported" => false }","ref":"PlausibleWeb.Api.StatsController.html#main_graph/2","title":"PlausibleWeb.Api.StatsController.main_graph/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#operating_system_versions/2","title":"PlausibleWeb.Api.StatsController.operating_system_versions/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#operating_systems/2","title":"PlausibleWeb.Api.StatsController.operating_systems/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#pages/2","title":"PlausibleWeb.Api.StatsController.pages/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#prop_breakdown/2","title":"PlausibleWeb.Api.StatsController.prop_breakdown/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#referrer_drilldown/2","title":"PlausibleWeb.Api.StatsController.referrer_drilldown/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#regions/2","title":"PlausibleWeb.Api.StatsController.regions/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#screen_sizes/2","title":"PlausibleWeb.Api.StatsController.screen_sizes/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#sources/2","title":"PlausibleWeb.Api.StatsController.sources/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#top_stats/2","title":"PlausibleWeb.Api.StatsController.top_stats/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#utm_campaigns/2","title":"PlausibleWeb.Api.StatsController.utm_campaigns/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#utm_contents/2","title":"PlausibleWeb.Api.StatsController.utm_contents/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#utm_mediums/2","title":"PlausibleWeb.Api.StatsController.utm_mediums/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#utm_sources/2","title":"PlausibleWeb.Api.StatsController.utm_sources/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Api.StatsController.html#utm_terms/2","title":"PlausibleWeb.Api.StatsController.utm_terms/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html","title":"PlausibleWeb.AuthController","type":"module"},{"doc":"","ref":"PlausibleWeb.AuthController.html#activate/2","title":"PlausibleWeb.AuthController.activate/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#activate_form/2","title":"PlausibleWeb.AuthController.activate_form/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#create_api_key/2","title":"PlausibleWeb.AuthController.create_api_key/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#delete_api_key/2","title":"PlausibleWeb.AuthController.delete_api_key/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#delete_me/2","title":"PlausibleWeb.AuthController.delete_me/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#google_auth_callback/2","title":"PlausibleWeb.AuthController.google_auth_callback/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#login/2","title":"PlausibleWeb.AuthController.login/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#login_form/2","title":"PlausibleWeb.AuthController.login_form/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#logout/2","title":"PlausibleWeb.AuthController.logout/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#new_api_key/2","title":"PlausibleWeb.AuthController.new_api_key/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#password_form/2","title":"PlausibleWeb.AuthController.password_form/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#password_reset/2","title":"PlausibleWeb.AuthController.password_reset/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#password_reset_form/2","title":"PlausibleWeb.AuthController.password_reset_form/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#password_reset_request/2","title":"PlausibleWeb.AuthController.password_reset_request/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#password_reset_request_form/2","title":"PlausibleWeb.AuthController.password_reset_request_form/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#register/2","title":"PlausibleWeb.AuthController.register/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#register_form/2","title":"PlausibleWeb.AuthController.register_form/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#register_from_invitation/2","title":"PlausibleWeb.AuthController.register_from_invitation/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#register_from_invitation_form/2","title":"PlausibleWeb.AuthController.register_from_invitation_form/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#request_activation_code/2","title":"PlausibleWeb.AuthController.request_activation_code/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#save_settings/2","title":"PlausibleWeb.AuthController.save_settings/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#set_password/2","title":"PlausibleWeb.AuthController.set_password/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthController.html#user_settings/2","title":"PlausibleWeb.AuthController.user_settings/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthPlug.html","title":"PlausibleWeb.AuthPlug","type":"module"},{"doc":"","ref":"PlausibleWeb.AuthPlug.html#call/2","title":"PlausibleWeb.AuthPlug.call/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthPlug.html#init/1","title":"PlausibleWeb.AuthPlug.init/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html","title":"PlausibleWeb.AuthView","type":"module"},{"doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.AuthView.html#__resource__/0","title":"PlausibleWeb.AuthView.__resource__/0","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#activate.html/1","title":"PlausibleWeb.AuthView.activate.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#base_domain/0","title":"PlausibleWeb.AuthView.base_domain/0","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#delimit_integer/1","title":"PlausibleWeb.AuthView.delimit_integer/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#format_invoices/1","title":"PlausibleWeb.AuthView.format_invoices/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#invitation_expired.html/1","title":"PlausibleWeb.AuthView.invitation_expired.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#login_form.html/1","title":"PlausibleWeb.AuthView.login_form.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#new_api_key.html/1","title":"PlausibleWeb.AuthView.new_api_key.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#password_form.html/1","title":"PlausibleWeb.AuthView.password_form.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#password_reset_form.html/1","title":"PlausibleWeb.AuthView.password_reset_form.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#password_reset_request_form.html/1","title":"PlausibleWeb.AuthView.password_reset_request_form.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#password_reset_request_success.html/1","title":"PlausibleWeb.AuthView.password_reset_request_success.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#plausible_url/0","title":"PlausibleWeb.AuthView.plausible_url/0","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#present_subscription_status/1","title":"PlausibleWeb.AuthView.present_subscription_status/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#register_form.html/1","title":"PlausibleWeb.AuthView.register_form.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#register_from_invitation_form.html/1","title":"PlausibleWeb.AuthView.register_from_invitation_form.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#register_success.html/1","title":"PlausibleWeb.AuthView.register_success.html/1","type":"function"},{"doc":"Renders the given template locally.","ref":"PlausibleWeb.AuthView.html#render/2","title":"PlausibleWeb.AuthView.render/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#subscription_colors/1","title":"PlausibleWeb.AuthView.subscription_colors/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#subscription_interval/1","title":"PlausibleWeb.AuthView.subscription_interval/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#subscription_quota/1","title":"PlausibleWeb.AuthView.subscription_quota/1","type":"function"},{"doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"PlausibleWeb.AuthView.html#template_not_found/2","title":"PlausibleWeb.AuthView.template_not_found/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthView.html#user_settings.html/1","title":"PlausibleWeb.AuthView.user_settings.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthorizeSiteAccess.html","title":"PlausibleWeb.AuthorizeSiteAccess","type":"module"},{"doc":"","ref":"PlausibleWeb.AuthorizeSiteAccess.html#call/2","title":"PlausibleWeb.AuthorizeSiteAccess.call/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthorizeSiteAccess.html#init/1","title":"PlausibleWeb.AuthorizeSiteAccess.init/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthorizeSitesApiPlug.html","title":"PlausibleWeb.AuthorizeSitesApiPlug","type":"module"},{"doc":"","ref":"PlausibleWeb.AuthorizeSitesApiPlug.html#call/2","title":"PlausibleWeb.AuthorizeSitesApiPlug.call/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthorizeSitesApiPlug.html#init/1","title":"PlausibleWeb.AuthorizeSitesApiPlug.init/1","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthorizeStatsApiPlug.html","title":"PlausibleWeb.AuthorizeStatsApiPlug","type":"module"},{"doc":"","ref":"PlausibleWeb.AuthorizeStatsApiPlug.html#call/2","title":"PlausibleWeb.AuthorizeStatsApiPlug.call/2","type":"function"},{"doc":"","ref":"PlausibleWeb.AuthorizeStatsApiPlug.html#init/1","title":"PlausibleWeb.AuthorizeStatsApiPlug.init/1","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingController.html","title":"PlausibleWeb.BillingController","type":"module"},{"doc":"","ref":"PlausibleWeb.BillingController.html#change_enterprise_plan/2","title":"PlausibleWeb.BillingController.change_enterprise_plan/2","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingController.html#change_plan/2","title":"PlausibleWeb.BillingController.change_plan/2","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingController.html#change_plan_form/2","title":"PlausibleWeb.BillingController.change_plan_form/2","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingController.html#change_plan_preview/2","title":"PlausibleWeb.BillingController.change_plan_preview/2","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingController.html#ping_subscription/2","title":"PlausibleWeb.BillingController.ping_subscription/2","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingController.html#preview_susbcription/2","title":"PlausibleWeb.BillingController.preview_susbcription/2","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingController.html#upgrade/2","title":"PlausibleWeb.BillingController.upgrade/2","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingController.html#upgrade_enterprise_plan/2","title":"PlausibleWeb.BillingController.upgrade_enterprise_plan/2","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingController.html#upgrade_success/2","title":"PlausibleWeb.BillingController.upgrade_success/2","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html","title":"PlausibleWeb.BillingView","type":"module"},{"doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.BillingView.html#__resource__/0","title":"PlausibleWeb.BillingView.__resource__/0","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#base_domain/0","title":"PlausibleWeb.BillingView.base_domain/0","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#change_enterprise_plan.html/1","title":"PlausibleWeb.BillingView.change_enterprise_plan.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#change_enterprise_plan_contact_us.html/1","title":"PlausibleWeb.BillingView.change_enterprise_plan_contact_us.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#change_plan.html/1","title":"PlausibleWeb.BillingView.change_plan.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#change_plan_preview.html/1","title":"PlausibleWeb.BillingView.change_plan_preview.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#plausible_url/0","title":"PlausibleWeb.BillingView.plausible_url/0","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#present_currency/1","title":"PlausibleWeb.BillingView.present_currency/1","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#present_date/1","title":"PlausibleWeb.BillingView.present_date/1","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#reccommended_plan/1","title":"PlausibleWeb.BillingView.reccommended_plan/1","type":"function"},{"doc":"Renders the given template locally.","ref":"PlausibleWeb.BillingView.html#render/2","title":"PlausibleWeb.BillingView.render/2","type":"function"},{"doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"PlausibleWeb.BillingView.html#template_not_found/2","title":"PlausibleWeb.BillingView.template_not_found/2","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#upgrade.html/1","title":"PlausibleWeb.BillingView.upgrade.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#upgrade_success.html/1","title":"PlausibleWeb.BillingView.upgrade_success.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.BillingView.html#upgrade_to_plan.html/1","title":"PlausibleWeb.BillingView.upgrade_to_plan.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.CRMAuthPlug.html","title":"PlausibleWeb.CRMAuthPlug","type":"module"},{"doc":"","ref":"PlausibleWeb.CRMAuthPlug.html#call/2","title":"PlausibleWeb.CRMAuthPlug.call/2","type":"function"},{"doc":"","ref":"PlausibleWeb.CRMAuthPlug.html#init/1","title":"PlausibleWeb.CRMAuthPlug.init/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Captcha.html","title":"PlausibleWeb.Captcha","type":"module"},{"doc":"","ref":"PlausibleWeb.Captcha.html#enabled?/0","title":"PlausibleWeb.Captcha.enabled?/0","type":"function"},{"doc":"","ref":"PlausibleWeb.Captcha.html#sitekey/0","title":"PlausibleWeb.Captcha.sitekey/0","type":"function"},{"doc":"","ref":"PlausibleWeb.Captcha.html#verify/1","title":"PlausibleWeb.Captcha.verify/1","type":"function"},{"doc":"Generic reusable components","ref":"PlausibleWeb.Components.Generic.html","title":"PlausibleWeb.Components.Generic","type":"module"},{"doc":"Attributes title ( :string ) - Defaults to "Notice" . class ( :string ) - Defaults to "" . Slots inner_block","ref":"PlausibleWeb.Components.Generic.html#notice/1","title":"PlausibleWeb.Components.Generic.notice/1","type":"function"},{"doc":"Phoenix Component for rendering a user-facing feature toggle capable of flipping booleans in Plausible.Site via the toggle_feature controller action.","ref":"PlausibleWeb.Components.Site.Feature.html","title":"PlausibleWeb.Components.Site.Feature","type":"module"},{"doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.Components.Site.Feature.html#__resource__/0","title":"PlausibleWeb.Components.Site.Feature.__resource__/0","type":"function"},{"doc":"","ref":"PlausibleWeb.Components.Site.Feature.html#button_active/1","title":"PlausibleWeb.Components.Site.Feature.button_active/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Components.Site.Feature.html#button_inactive/1","title":"PlausibleWeb.Components.Site.Feature.button_inactive/1","type":"function"},{"doc":"Renders the given template locally.","ref":"PlausibleWeb.Components.Site.Feature.html#render/2","title":"PlausibleWeb.Components.Site.Feature.render/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Components.Site.Feature.html#target/4","title":"PlausibleWeb.Components.Site.Feature.target/4","type":"function"},{"doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"PlausibleWeb.Components.Site.Feature.html#template_not_found/2","title":"PlausibleWeb.Components.Site.Feature.template_not_found/2","type":"function"},{"doc":"Attributes site ( Plausible.Site ) (required) setting ( :atom ) (required) label ( :string ) (required) conn ( Plug.Conn ) (required) Slots inner_block","ref":"PlausibleWeb.Components.Site.Feature.html#toggle/1","title":"PlausibleWeb.Components.Site.Feature.toggle/1","type":"function"},{"doc":"This module defines the test case to be used by tests that require setting up a connection. Such tests rely on Phoenix.ConnTest and also import other functionality to make it easier to build common data structures and query the data layer. Finally, if the test case interacts with the database, it cannot be async. For this reason, every test runs inside a transaction which is reset at the beginning of the test unless the test case is marked as async.","ref":"PlausibleWeb.ConnCase.html","title":"PlausibleWeb.ConnCase","type":"module"},{"doc":"","ref":"PlausibleWeb.ControllerHelpers.html","title":"PlausibleWeb.ControllerHelpers","type":"module"},{"doc":"","ref":"PlausibleWeb.ControllerHelpers.html#render_error/2","title":"PlausibleWeb.ControllerHelpers.render_error/2","type":"function"},{"doc":"","ref":"PlausibleWeb.ControllerHelpers.html#render_error/3","title":"PlausibleWeb.ControllerHelpers.render_error/3","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html","title":"PlausibleWeb.Email","type":"module"},{"doc":"","ref":"PlausibleWeb.Email.html#activation_email/2","title":"PlausibleWeb.Email.activation_email/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#base_email/0","title":"PlausibleWeb.Email.base_email/0","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#base_email/1","title":"PlausibleWeb.Email.base_email/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#cancellation_email/1","title":"PlausibleWeb.Email.cancellation_email/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#check_stats_email/1","title":"PlausibleWeb.Email.check_stats_email/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#create_site_email/1","title":"PlausibleWeb.Email.create_site_email/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#dashboard_locked/4","title":"PlausibleWeb.Email.dashboard_locked/4","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#enterprise_over_limit_internal_email/5","title":"PlausibleWeb.Email.enterprise_over_limit_internal_email/5","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#error_report/3","title":"PlausibleWeb.Email.error_report/3","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#existing_user_invitation/1","title":"PlausibleWeb.Email.existing_user_invitation/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#import_failure/2","title":"PlausibleWeb.Email.import_failure/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#import_success/2","title":"PlausibleWeb.Email.import_success/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#invitation_accepted/1","title":"PlausibleWeb.Email.invitation_accepted/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#invitation_rejected/1","title":"PlausibleWeb.Email.invitation_rejected/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#mailer_email_from/0","title":"PlausibleWeb.Email.mailer_email_from/0","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#new_user_invitation/1","title":"PlausibleWeb.Email.new_user_invitation/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#over_limit_email/4","title":"PlausibleWeb.Email.over_limit_email/4","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#ownership_transfer_accepted/1","title":"PlausibleWeb.Email.ownership_transfer_accepted/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#ownership_transfer_rejected/1","title":"PlausibleWeb.Email.ownership_transfer_rejected/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#ownership_transfer_request/2","title":"PlausibleWeb.Email.ownership_transfer_request/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#password_reset_email/2","title":"PlausibleWeb.Email.password_reset_email/2","type":"function"},{"doc":"Render an Phoenix template and set the body on the email. Pass an atom as the template name (:welcome_email) to render HTML and plain text emails. Use a string if you only want to render one type, e.g. "welcome_email.text" or "welcome_email.html". Scroll to the top for more examples.","ref":"PlausibleWeb.Email.html#render/3","title":"PlausibleWeb.Email.render/3","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#site_member_removed/1","title":"PlausibleWeb.Email.site_member_removed/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#site_setup_help/2","title":"PlausibleWeb.Email.site_setup_help/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#site_setup_success/2","title":"PlausibleWeb.Email.site_setup_success/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#spike_notification/5","title":"PlausibleWeb.Email.spike_notification/5","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#trial_one_week_reminder/1","title":"PlausibleWeb.Email.trial_one_week_reminder/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#trial_over_email/1","title":"PlausibleWeb.Email.trial_over_email/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#trial_upgrade_email/3","title":"PlausibleWeb.Email.trial_upgrade_email/3","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#weekly_report/3","title":"PlausibleWeb.Email.weekly_report/3","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#welcome_email/1","title":"PlausibleWeb.Email.welcome_email/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#yearly_expiration_notification/1","title":"PlausibleWeb.Email.yearly_expiration_notification/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Email.html#yearly_renewal_notification/1","title":"PlausibleWeb.Email.yearly_renewal_notification/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html","title":"PlausibleWeb.EmailView","type":"module"},{"doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.EmailView.html#__resource__/0","title":"PlausibleWeb.EmailView.__resource__/0","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#activation_email.html/1","title":"PlausibleWeb.EmailView.activation_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#base_domain/0","title":"PlausibleWeb.EmailView.base_domain/0","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#cancellation_email.html/1","title":"PlausibleWeb.EmailView.cancellation_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#check_stats_email.html/1","title":"PlausibleWeb.EmailView.check_stats_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#create_site_email.html/1","title":"PlausibleWeb.EmailView.create_site_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#dashboard_locked.html/1","title":"PlausibleWeb.EmailView.dashboard_locked.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#date_format/1","title":"PlausibleWeb.EmailView.date_format/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#enterprise_over_limit_internal.html/1","title":"PlausibleWeb.EmailView.enterprise_over_limit_internal.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#error_report_email.html/1","title":"PlausibleWeb.EmailView.error_report_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#existing_user_invitation.html/1","title":"PlausibleWeb.EmailView.existing_user_invitation.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#google_analytics_import.html/1","title":"PlausibleWeb.EmailView.google_analytics_import.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#greet_recipient/1","title":"PlausibleWeb.EmailView.greet_recipient/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#invitation_accepted.html/1","title":"PlausibleWeb.EmailView.invitation_accepted.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#invitation_rejected.html/1","title":"PlausibleWeb.EmailView.invitation_rejected.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#new_user_invitation.html/1","title":"PlausibleWeb.EmailView.new_user_invitation.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#over_limit.html/1","title":"PlausibleWeb.EmailView.over_limit.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#ownership_transfer_accepted.html/1","title":"PlausibleWeb.EmailView.ownership_transfer_accepted.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#ownership_transfer_rejected.html/1","title":"PlausibleWeb.EmailView.ownership_transfer_rejected.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#ownership_transfer_request.html/1","title":"PlausibleWeb.EmailView.ownership_transfer_request.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#password_reset_email.html/1","title":"PlausibleWeb.EmailView.password_reset_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#plausible_url/0","title":"PlausibleWeb.EmailView.plausible_url/0","type":"function"},{"doc":"Renders the given template locally.","ref":"PlausibleWeb.EmailView.html#render/2","title":"PlausibleWeb.EmailView.render/2","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#sentry_link/2","title":"PlausibleWeb.EmailView.sentry_link/2","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#site_member_removed.html/1","title":"PlausibleWeb.EmailView.site_member_removed.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#site_setup_help_email.html/1","title":"PlausibleWeb.EmailView.site_setup_help_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#site_setup_success_email.html/1","title":"PlausibleWeb.EmailView.site_setup_success_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#spike_notification.html/1","title":"PlausibleWeb.EmailView.spike_notification.html/1","type":"function"},{"doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"PlausibleWeb.EmailView.html#template_not_found/2","title":"PlausibleWeb.EmailView.template_not_found/2","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#trial_one_week_reminder.html/1","title":"PlausibleWeb.EmailView.trial_one_week_reminder.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#trial_over_email.html/1","title":"PlausibleWeb.EmailView.trial_over_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#trial_upgrade_email.html/1","title":"PlausibleWeb.EmailView.trial_upgrade_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#welcome_email.html/1","title":"PlausibleWeb.EmailView.welcome_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#yearly_expiration_notification.html/1","title":"PlausibleWeb.EmailView.yearly_expiration_notification.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.EmailView.html#yearly_renewal_notification.html/1","title":"PlausibleWeb.EmailView.yearly_renewal_notification.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Endpoint.html","title":"PlausibleWeb.Endpoint","type":"module"},{"doc":"Callback implementation for Phoenix.Endpoint.broadcast/3 .","ref":"PlausibleWeb.Endpoint.html#broadcast/3","title":"PlausibleWeb.Endpoint.broadcast/3","type":"function"},{"doc":"Callback implementation for Phoenix.Endpoint.broadcast!/3 .","ref":"PlausibleWeb.Endpoint.html#broadcast!/3","title":"PlausibleWeb.Endpoint.broadcast!/3","type":"function"},{"doc":"Callback implementation for Phoenix.Endpoint.broadcast_from/4 .","ref":"PlausibleWeb.Endpoint.html#broadcast_from/4","title":"PlausibleWeb.Endpoint.broadcast_from/4","type":"function"},{"doc":"Callback implementation for Phoenix.Endpoint.broadcast_from!/4 .","ref":"PlausibleWeb.Endpoint.html#broadcast_from!/4","title":"PlausibleWeb.Endpoint.broadcast_from!/4","type":"function"},{"doc":"Callback implementation for Plug.call/2 .","ref":"PlausibleWeb.Endpoint.html#call/2","title":"PlausibleWeb.Endpoint.call/2","type":"function"},{"doc":"Returns the child specification to start the endpoint under a supervision tree.","ref":"PlausibleWeb.Endpoint.html#child_spec/1","title":"PlausibleWeb.Endpoint.child_spec/1","type":"function"},{"doc":"Returns the endpoint configuration for key Returns default if the key does not exist.","ref":"PlausibleWeb.Endpoint.html#config/2","title":"PlausibleWeb.Endpoint.config/2","type":"function"},{"doc":"Reloads the configuration given the application environment changes.","ref":"PlausibleWeb.Endpoint.html#config_change/2","title":"PlausibleWeb.Endpoint.config_change/2","type":"function"},{"doc":"Returns the host for the given endpoint.","ref":"PlausibleWeb.Endpoint.html#host/0","title":"PlausibleWeb.Endpoint.host/0","type":"function"},{"doc":"Callback implementation for Plug.init/1 .","ref":"PlausibleWeb.Endpoint.html#init/1","title":"PlausibleWeb.Endpoint.init/1","type":"function"},{"doc":"Callback implementation for Phoenix.Endpoint.local_broadcast/3 .","ref":"PlausibleWeb.Endpoint.html#local_broadcast/3","title":"PlausibleWeb.Endpoint.local_broadcast/3","type":"function"},{"doc":"Callback implementation for Phoenix.Endpoint.local_broadcast_from/4 .","ref":"PlausibleWeb.Endpoint.html#local_broadcast_from/4","title":"PlausibleWeb.Endpoint.local_broadcast_from/4","type":"function"},{"doc":"","ref":"PlausibleWeb.Endpoint.html#patch_session_opts/0","title":"PlausibleWeb.Endpoint.patch_session_opts/0","type":"function"},{"doc":"Generates the path information when routing to this endpoint.","ref":"PlausibleWeb.Endpoint.html#path/1","title":"PlausibleWeb.Endpoint.path/1","type":"function"},{"doc":"Generates the script name.","ref":"PlausibleWeb.Endpoint.html#script_name/0","title":"PlausibleWeb.Endpoint.script_name/0","type":"function"},{"doc":"Starts the endpoint supervision tree. All other options are merged into the endpoint configuration.","ref":"PlausibleWeb.Endpoint.html#start_link/1","title":"PlausibleWeb.Endpoint.start_link/1","type":"function"},{"doc":"Generates a base64-encoded cryptographic hash (sha512) to a static file in priv/static . Meant to be used for Subresource Integrity with CDNs.","ref":"PlausibleWeb.Endpoint.html#static_integrity/1","title":"PlausibleWeb.Endpoint.static_integrity/1","type":"function"},{"doc":"Returns a two item tuple with the first item being the static_path and the second item being the static_integrity .","ref":"PlausibleWeb.Endpoint.html#static_lookup/1","title":"PlausibleWeb.Endpoint.static_lookup/1","type":"function"},{"doc":"Generates a route to a static file in priv/static .","ref":"PlausibleWeb.Endpoint.html#static_path/1","title":"PlausibleWeb.Endpoint.static_path/1","type":"function"},{"doc":"Generates the static URL without any path information. It uses the configuration under :static_url to generate such. It falls back to :url if :static_url is not set.","ref":"PlausibleWeb.Endpoint.html#static_url/0","title":"PlausibleWeb.Endpoint.static_url/0","type":"function"},{"doc":"Generates the endpoint base URL but as a URI struct. It uses the configuration under :url to generate such. Useful for manipulating the URL data and passing it to URL helpers.","ref":"PlausibleWeb.Endpoint.html#struct_url/0","title":"PlausibleWeb.Endpoint.struct_url/0","type":"function"},{"doc":"Callback implementation for Phoenix.Endpoint.subscribe/2 .","ref":"PlausibleWeb.Endpoint.html#subscribe/2","title":"PlausibleWeb.Endpoint.subscribe/2","type":"function"},{"doc":"Callback implementation for Phoenix.Endpoint.unsubscribe/1 .","ref":"PlausibleWeb.Endpoint.html#unsubscribe/1","title":"PlausibleWeb.Endpoint.unsubscribe/1","type":"function"},{"doc":"Generates the endpoint base URL without any path information. It uses the configuration under :url to generate such.","ref":"PlausibleWeb.Endpoint.html#url/0","title":"PlausibleWeb.Endpoint.url/0","type":"function"},{"doc":"","ref":"PlausibleWeb.Endpoint.html#websocket_url/0","title":"PlausibleWeb.Endpoint.websocket_url/0","type":"function"},{"doc":"","ref":"PlausibleWeb.ErrorHelpers.html","title":"PlausibleWeb.ErrorHelpers","type":"module"},{"doc":"","ref":"PlausibleWeb.ErrorHelpers.html#error_tag/2","title":"PlausibleWeb.ErrorHelpers.error_tag/2","type":"function"},{"doc":"","ref":"PlausibleWeb.ErrorReportController.html","title":"PlausibleWeb.ErrorReportController","type":"module"},{"doc":"","ref":"PlausibleWeb.ErrorReportController.html#submit_error_report/2","title":"PlausibleWeb.ErrorReportController.submit_error_report/2","type":"function"},{"doc":"","ref":"PlausibleWeb.ErrorView.html","title":"PlausibleWeb.ErrorView","type":"module"},{"doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.ErrorView.html#__resource__/0","title":"PlausibleWeb.ErrorView.__resource__/0","type":"function"},{"doc":"","ref":"PlausibleWeb.ErrorView.html#generic_error.html/1","title":"PlausibleWeb.ErrorView.generic_error.html/1","type":"function"},{"doc":"Renders the given template locally.","ref":"PlausibleWeb.ErrorView.html#render/2","title":"PlausibleWeb.ErrorView.render/2","type":"function"},{"doc":"","ref":"PlausibleWeb.ErrorView.html#server_error.html/1","title":"PlausibleWeb.ErrorView.server_error.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.ErrorView.html#server_error_report_thanks.html/1","title":"PlausibleWeb.ErrorView.server_error_report_thanks.html/1","type":"function"},{"doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"PlausibleWeb.ErrorView.html#template_not_found/2","title":"PlausibleWeb.ErrorView.template_not_found/2","type":"function"},{"doc":"A Plug that fetches favicon images from DuckDuckGo and returns them to the Plausible frontend. The proxying is there so we can reduce the number of third-party domains that the browser clients need to connect to. Our goal is to have 0 third-party domain connections on the website for privacy reasons. This module also maps between categorized sources and their respective URLs for favicons. What does that mean exactly? During ingestion we use PlausibleWeb.RefInspector.parse/1 to categorize our referrer sources like so: google.com -> Google google.co.uk -> Google google.com.au -> Google So when we show Google as a source in the dashboard, the request to this plug will come as: https://plausible/io/favicon/sources/Google Now, when we want to show a favicon for Google, we need to convert Google -> google.com or some other hostname owned by Google: https://icons.duckduckgo.com/ip3/google.com.ico The mapping from source category -> source hostname is stored in "priv/referer_favicon_domains.json" and managed by Mix.Tasks.GenerateReferrerFavicons.run/1","ref":"PlausibleWeb.Favicon.html","title":"PlausibleWeb.Favicon","type":"module"},{"doc":"Proxies HTTP request to DuckDuckGo favicon service. Swallows hop-by-hop HTTP headers that should not be forwarded as defined in RFC 2616 Placeholder Cases where we show a placeholder icon instead: In case of network error to DuckDuckGo In case of non-2xx status code from DuckDuckGo In case of broken image response body from DuckDuckGo I'm not sure why DDG sometimes returns a broken PNG image in their response but we filter that out. When the icon request fails, we show a placeholder favicon instead. The placeholder is an emoji from https://favicon.io/emoji-favicons/ DuckDuckGo favicon service has some issues with SVG favicons . For some reason, they return them with content-type=image/x-icon whereas SVG icons should be returned with content-type=image/svg+xml . This Plug detects when the response body starts with <svg and will override the Content-Type to correct it. Preventing XSS vulnerabilities SVGs may contain <script> tags, and as these SVGs come from external sources, we need to prevent untrusted code from running on the browser. This Plug sets a strict Content-Security-Policy header telling the browser not to run scripts. This Plug sets Content-Disposition=attachment to prevent the SVG from rendering when navigating to /favicon/sources/:domain directly. Browsers do not execute scripts from <img> tags, therefore it is safe to use <img src="https://plausible.io/favicon/sources/dummy.site"></img>","ref":"PlausibleWeb.Favicon.html#call/2","title":"PlausibleWeb.Favicon.call/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Favicon.html#init/1","title":"PlausibleWeb.Favicon.init/1","type":"function"},{"doc":"Redirects first-launch users to registration page.","ref":"PlausibleWeb.FirstLaunchPlug.html","title":"PlausibleWeb.FirstLaunchPlug","type":"module"},{"doc":"","ref":"PlausibleWeb.FormHelpers.html","title":"PlausibleWeb.FormHelpers","type":"module"},{"doc":"","ref":"PlausibleWeb.FormHelpers.html#styled_error/1","title":"PlausibleWeb.FormHelpers.styled_error/1","type":"function"},{"doc":"","ref":"PlausibleWeb.FormHelpers.html#styled_label/4","title":"PlausibleWeb.FormHelpers.styled_label/4","type":"function"},{"doc":"","ref":"PlausibleWeb.FormHelpers.html#styled_select/4","title":"PlausibleWeb.FormHelpers.styled_select/4","type":"function"},{"doc":"","ref":"PlausibleWeb.FormHelpers.html#styled_text_input/3","title":"PlausibleWeb.FormHelpers.styled_text_input/3","type":"function"},{"doc":"","ref":"PlausibleWeb.InvitationController.html","title":"PlausibleWeb.InvitationController","type":"module"},{"doc":"","ref":"PlausibleWeb.InvitationController.html#accept_invitation/2","title":"PlausibleWeb.InvitationController.accept_invitation/2","type":"function"},{"doc":"","ref":"PlausibleWeb.InvitationController.html#reject_invitation/2","title":"PlausibleWeb.InvitationController.reject_invitation/2","type":"function"},{"doc":"","ref":"PlausibleWeb.InvitationController.html#remove_invitation/2","title":"PlausibleWeb.InvitationController.remove_invitation/2","type":"function"},{"doc":"","ref":"PlausibleWeb.LastSeenPlug.html","title":"PlausibleWeb.LastSeenPlug","type":"module"},{"doc":"","ref":"PlausibleWeb.LastSeenPlug.html#call/2","title":"PlausibleWeb.LastSeenPlug.call/2","type":"function"},{"doc":"","ref":"PlausibleWeb.LastSeenPlug.html#init/1","title":"PlausibleWeb.LastSeenPlug.init/1","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html","title":"PlausibleWeb.LayoutView","type":"module"},{"doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.LayoutView.html#__resource__/0","title":"PlausibleWeb.LayoutView.__resource__/0","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#app.html/1","title":"PlausibleWeb.LayoutView.app.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#base_domain/0","title":"PlausibleWeb.LayoutView.base_domain/0","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#base_email.html/1","title":"PlausibleWeb.LayoutView.base_email.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#base_error.html/1","title":"PlausibleWeb.LayoutView.base_error.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#embedded.html/1","title":"PlausibleWeb.LayoutView.embedded.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#focus.html/1","title":"PlausibleWeb.LayoutView.focus.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#grace_period_end/1","title":"PlausibleWeb.LayoutView.grace_period_end/1","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#home_dest/1","title":"PlausibleWeb.LayoutView.home_dest/1","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#is_current_tab/2","title":"PlausibleWeb.LayoutView.is_current_tab/2","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#plausible_url/0","title":"PlausibleWeb.LayoutView.plausible_url/0","type":"function"},{"doc":"Renders the given template locally.","ref":"PlausibleWeb.LayoutView.html#render/2","title":"PlausibleWeb.LayoutView.render/2","type":"function"},{"doc":"http://blog.plataformatec.com.br/2018/05/nested-layouts-with-phoenix/","ref":"PlausibleWeb.LayoutView.html#render_layout/3","title":"PlausibleWeb.LayoutView.render_layout/3","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#settings_tabs/1","title":"PlausibleWeb.LayoutView.settings_tabs/1","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#site_settings.html/1","title":"PlausibleWeb.LayoutView.site_settings.html/1","type":"function"},{"doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"PlausibleWeb.LayoutView.html#template_not_found/2","title":"PlausibleWeb.LayoutView.template_not_found/2","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#trial_notificaton/1","title":"PlausibleWeb.LayoutView.trial_notificaton/1","type":"function"},{"doc":"","ref":"PlausibleWeb.LayoutView.html#websocket_url/0","title":"PlausibleWeb.LayoutView.websocket_url/0","type":"function"},{"doc":"Phoenix LiveComponent for a combobox UI element with search and selection functionality. The component allows users to select an option from a list of options, which can be searched by typing in the input field. The component renders an input field with a dropdown anchor and a hidden input field for submitting the selected value. The number of options displayed in the dropdown is limited to 15 by default but can be customized. When a user types into the input field, the component searches the available options and provides suggestions based on the input. Any module exposing suggest/2 function can be supplied via suggest_mod attribute - see the provided ComboBox.StaticSearch .","ref":"PlausibleWeb.Live.Components.ComboBox.html","title":"PlausibleWeb.Live.Components.ComboBox","type":"module"},{"doc":"Attributes ref ( :string ) (required) suggestions ( :list ) - Defaults to [] . suggest_mod ( :atom ) (required) target ( :any ) creatable ( :boolean ) (required) display_value ( :string ) (required)","ref":"PlausibleWeb.Live.Components.ComboBox.html#dropdown/1","title":"PlausibleWeb.Live.Components.ComboBox.dropdown/1","type":"function"},{"doc":"Attributes id ( :any ) (required)","ref":"PlausibleWeb.Live.Components.ComboBox.html#dropdown_anchor/1","title":"PlausibleWeb.Live.Components.ComboBox.dropdown_anchor/1","type":"function"},{"doc":"Callback implementation for Phoenix.LiveComponent.handle_event/3 .","ref":"PlausibleWeb.Live.Components.ComboBox.html#handle_event/3","title":"PlausibleWeb.Live.Components.ComboBox.handle_event/3","type":"function"},{"doc":"Attributes display_value ( :string ) (required) submit_value ( :string ) (required) ref ( :string ) (required) target ( :any ) idx ( :integer ) (required) creatable ( :boolean ) - Defaults to false .","ref":"PlausibleWeb.Live.Components.ComboBox.html#option/1","title":"PlausibleWeb.Live.Components.ComboBox.option/1","type":"function"},{"doc":"Attributes placeholder ( :string ) - Defaults to "Select option or search by typing" . id ( :any ) (required) options ( :list ) (required) submit_name ( :string ) (required) display_value ( :string ) - Defaults to "" . submit_value ( :string ) - Defaults to "" . suggest_mod ( :atom ) (required) suggestions_limit ( :integer ) class ( :string ) - Defaults to "" . required ( :boolean ) - Defaults to false . creatable ( :boolean ) - Defaults to false .","ref":"PlausibleWeb.Live.Components.ComboBox.html#render/1","title":"PlausibleWeb.Live.Components.ComboBox.render/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Live.Components.ComboBox.html#select_option/4","title":"PlausibleWeb.Live.Components.ComboBox.select_option/4","type":"function"},{"doc":"Callback implementation for Phoenix.LiveComponent.update/2 .","ref":"PlausibleWeb.Live.Components.ComboBox.html#update/2","title":"PlausibleWeb.Live.Components.ComboBox.update/2","type":"function"},{"doc":"Default suggestion engine for the ComboBox component. Assumes, the user have already queried the database and the data set is small enough to be kept in state and filtered based on external input. Favours exact matches. Skips entries shorter than input. Allows fuzzy matching based on Jaro Distance.","ref":"PlausibleWeb.Live.Components.ComboBox.StaticSearch.html","title":"PlausibleWeb.Live.Components.ComboBox.StaticSearch","type":"module"},{"doc":"","ref":"PlausibleWeb.Live.Components.ComboBox.StaticSearch.html#suggest/2","title":"PlausibleWeb.Live.Components.ComboBox.StaticSearch.suggest/2","type":"function"},{"doc":"Flash component for LiveViews - works also when embedded within dead views","ref":"PlausibleWeb.Live.Flash.html","title":"PlausibleWeb.Live.Flash","type":"module"},{"doc":"","ref":"PlausibleWeb.Live.Flash.html#clear_flash_button/1","title":"PlausibleWeb.Live.Flash.clear_flash_button/1","type":"function"},{"doc":"Attributes on_close ( :any ) - Defaults to "lv:clear-flash" . Slots icon (required) title message (required)","ref":"PlausibleWeb.Live.Flash.html#flash/1","title":"PlausibleWeb.Live.Flash.flash/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Live.Flash.html#icon_error/1","title":"PlausibleWeb.Live.Flash.icon_error/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Live.Flash.html#icon_success/1","title":"PlausibleWeb.Live.Flash.icon_success/1","type":"function"},{"doc":"Callback implementation for Phoenix.LiveComponent.render/1 .","ref":"PlausibleWeb.Live.Flash.html#render/1","title":"PlausibleWeb.Live.Flash.render/1","type":"function"},{"doc":"LiveView allowing listing, creating and deleting funnels.","ref":"PlausibleWeb.Live.FunnelSettings.html","title":"PlausibleWeb.Live.FunnelSettings","type":"module"},{"doc":"Callback implementation for Phoenix.LiveView.handle_event/3 .","ref":"PlausibleWeb.Live.FunnelSettings.html#handle_event/3","title":"PlausibleWeb.Live.FunnelSettings.handle_event/3","type":"function"},{"doc":"Callback implementation for Phoenix.LiveView.handle_info/2 .","ref":"PlausibleWeb.Live.FunnelSettings.html#handle_info/2","title":"PlausibleWeb.Live.FunnelSettings.handle_info/2","type":"function"},{"doc":"Callback implementation for Phoenix.LiveView.mount/3 .","ref":"PlausibleWeb.Live.FunnelSettings.html#mount/3","title":"PlausibleWeb.Live.FunnelSettings.mount/3","type":"function"},{"doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"PlausibleWeb.Live.FunnelSettings.html#render/1","title":"PlausibleWeb.Live.FunnelSettings.render/1","type":"function"},{"doc":"Phoenix LiveComponent that renders a form used for setting up funnels. Makes use of dynamically placed PlausibleWeb.Live.FunnelSettings.ComboBox components to allow building searchable funnel definitions out of list of goals available.","ref":"PlausibleWeb.Live.FunnelSettings.Form.html","title":"PlausibleWeb.Live.FunnelSettings.Form","type":"module"},{"doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#add_step_button/1","title":"PlausibleWeb.Live.FunnelSettings.Form.add_step_button/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#cancel_button/1","title":"PlausibleWeb.Live.FunnelSettings.Form.cancel_button/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#error/1","title":"PlausibleWeb.Live.FunnelSettings.Form.error/1","type":"function"},{"doc":"Attributes at ( :integer ) (required) result ( :map ) (required)","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#evaluation/1","title":"PlausibleWeb.Live.FunnelSettings.Form.evaluation/1","type":"function"},{"doc":"Callback implementation for Phoenix.LiveView.handle_event/3 .","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#handle_event/3","title":"PlausibleWeb.Live.FunnelSettings.Form.handle_event/3","type":"function"},{"doc":"Callback implementation for Phoenix.LiveView.handle_info/2 .","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#handle_info/2","title":"PlausibleWeb.Live.FunnelSettings.Form.handle_info/2","type":"function"},{"doc":"Attributes field ( Phoenix.HTML.FormField )","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#input/1","title":"PlausibleWeb.Live.FunnelSettings.Form.input/1","type":"function"},{"doc":"Callback implementation for Phoenix.LiveView.mount/3 .","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#mount/3","title":"PlausibleWeb.Live.FunnelSettings.Form.mount/3","type":"function"},{"doc":"Attributes step_idx ( :integer ) (required)","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#remove_step_button/1","title":"PlausibleWeb.Live.FunnelSettings.Form.remove_step_button/1","type":"function"},{"doc":"Callback implementation for Phoenix.LiveView.render/1 .","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#render/1","title":"PlausibleWeb.Live.FunnelSettings.Form.render/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#submit_button/1","title":"PlausibleWeb.Live.FunnelSettings.Form.submit_button/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#submit_button_inactive/1","title":"PlausibleWeb.Live.FunnelSettings.Form.submit_button_inactive/1","type":"function"},{"doc":"Phoenix LiveComponent module that renders a list of funnels with their names and the number of steps they have. Each funnel is displayed with a delete button, which triggers a confirmation message before deleting the funnel from the UI. If there are no funnels configured for the site, a message is displayed indicating so.","ref":"PlausibleWeb.Live.FunnelSettings.List.html","title":"PlausibleWeb.Live.FunnelSettings.List","type":"module"},{"doc":"Callback implementation for Phoenix.LiveComponent.render/1 .","ref":"PlausibleWeb.Live.FunnelSettings.List.html#render/1","title":"PlausibleWeb.Live.FunnelSettings.List.render/1","type":"function"},{"doc":"MJML rendered for the weekly report e-mail","ref":"PlausibleWeb.MJML.WeeklyReport.html","title":"PlausibleWeb.MJML.WeeklyReport","type":"module"},{"doc":"Returns the raw MJML template. Useful for debugging rendering issues.","ref":"PlausibleWeb.MJML.WeeklyReport.html#debug_mjml_template/0","title":"PlausibleWeb.MJML.WeeklyReport.debug_mjml_template/0","type":"function"},{"doc":"Safely render the MJML template using Phoenix.HTML","ref":"PlausibleWeb.MJML.WeeklyReport.html#render/1","title":"PlausibleWeb.MJML.WeeklyReport.render/1","type":"function"},{"doc":"","ref":"PlausibleWeb.PageController.html","title":"PlausibleWeb.PageController","type":"module"},{"doc":"The root path is never accessible in Plausible.Cloud because it is handled by the upstream reverse proxy. This controller action is only ever triggered in self-hosted Plausible.","ref":"PlausibleWeb.PageController.html#index/2","title":"PlausibleWeb.PageController.index/2","type":"function"},{"doc":"","ref":"PlausibleWeb.PageView.html","title":"PlausibleWeb.PageView","type":"module"},{"doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.PageView.html#__resource__/0","title":"PlausibleWeb.PageView.__resource__/0","type":"function"},{"doc":"","ref":"PlausibleWeb.PageView.html#index.html/1","title":"PlausibleWeb.PageView.index.html/1","type":"function"},{"doc":"Renders the given template locally.","ref":"PlausibleWeb.PageView.html#render/2","title":"PlausibleWeb.PageView.render/2","type":"function"},{"doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"PlausibleWeb.PageView.html#template_not_found/2","title":"PlausibleWeb.PageView.template_not_found/2","type":"function"},{"doc":"Rejects bot requests by any means available. We're adding x-robots-tag to the response header and annotate the conn with "noindex, nofollow" under private.robots key. The only exception is, if the request is trying to access our live demo at plausible.io/plausible.io - in which case we'll allow indexing, but deny following links and skip the bot detection, in kind robots we trust.","ref":"PlausibleWeb.Plugs.NoRobots.html","title":"PlausibleWeb.Plugs.NoRobots","type":"module"},{"doc":"A Plug.Session adapter that allows configuration at runtime. Sadly, the plug being wrapped has no MFA option for dynamic configuration. This is currently used so we can dynamically pass the :domain and have cookies planted across one root domain.","ref":"PlausibleWeb.Plugs.RuntimeSessionAdapter.html","title":"PlausibleWeb.Plugs.RuntimeSessionAdapter","type":"module"},{"doc":"","ref":"PlausibleWeb.RefInspector.html","title":"PlausibleWeb.RefInspector","type":"module"},{"doc":"","ref":"PlausibleWeb.RefInspector.html#parse/1","title":"PlausibleWeb.RefInspector.parse/1","type":"function"},{"doc":"","ref":"PlausibleWeb.RefInspector.html#right_uri?/1","title":"PlausibleWeb.RefInspector.right_uri?/1","type":"function"},{"doc":"","ref":"PlausibleWeb.RemoteIp.html","title":"PlausibleWeb.RemoteIp","type":"module"},{"doc":"","ref":"PlausibleWeb.RemoteIp.html#get/1","title":"PlausibleWeb.RemoteIp.get/1","type":"function"},{"doc":"","ref":"PlausibleWeb.RequireAccountPlug.html","title":"PlausibleWeb.RequireAccountPlug","type":"module"},{"doc":"","ref":"PlausibleWeb.RequireAccountPlug.html#call/2","title":"PlausibleWeb.RequireAccountPlug.call/2","type":"function"},{"doc":"","ref":"PlausibleWeb.RequireAccountPlug.html#init/1","title":"PlausibleWeb.RequireAccountPlug.init/1","type":"function"},{"doc":"","ref":"PlausibleWeb.RequireLoggedOutPlug.html","title":"PlausibleWeb.RequireLoggedOutPlug","type":"module"},{"doc":"","ref":"PlausibleWeb.RequireLoggedOutPlug.html#call/2","title":"PlausibleWeb.RequireLoggedOutPlug.call/2","type":"function"},{"doc":"","ref":"PlausibleWeb.RequireLoggedOutPlug.html#init/1","title":"PlausibleWeb.RequireLoggedOutPlug.init/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Router.html","title":"PlausibleWeb.Router","type":"module"},{"doc":"","ref":"PlausibleWeb.Router.html#api/2","title":"PlausibleWeb.Router.api/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Router.html#browser/2","title":"PlausibleWeb.Router.browser/2","type":"function"},{"doc":"Callback invoked by Plug on every request.","ref":"PlausibleWeb.Router.html#call/2","title":"PlausibleWeb.Router.call/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Router.html#csrf/2","title":"PlausibleWeb.Router.csrf/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Router.html#flags/2","title":"PlausibleWeb.Router.flags/2","type":"function"},{"doc":"Callback required by Plug that initializes the router for serving web requests.","ref":"PlausibleWeb.Router.html#init/1","title":"PlausibleWeb.Router.init/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Router.html#internal_stats_api/2","title":"PlausibleWeb.Router.internal_stats_api/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Router.html#kaffy_browser/2","title":"PlausibleWeb.Router.kaffy_browser/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Router.html#public_api/2","title":"PlausibleWeb.Router.public_api/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Router.html#shared_link/2","title":"PlausibleWeb.Router.shared_link/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SessionTimeoutPlug.html","title":"PlausibleWeb.SessionTimeoutPlug","type":"module"},{"doc":"","ref":"PlausibleWeb.SessionTimeoutPlug.html#call/2","title":"PlausibleWeb.SessionTimeoutPlug.call/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SessionTimeoutPlug.html#init/1","title":"PlausibleWeb.SessionTimeoutPlug.init/1","type":"function"},{"doc":"This controller deals with user management via the UI in Site Settings -> People. It's important to enforce permissions in this controller. Owner - Can manage users, can trigger a 'transfer ownership' request Admin - Can manage users Viewer - Can not access user management settings Anyone - Can accept invitations Everything else should be explicitly disallowed.","ref":"PlausibleWeb.Site.MembershipController.html","title":"PlausibleWeb.Site.MembershipController","type":"module"},{"doc":"","ref":"PlausibleWeb.Site.MembershipController.html#invite_member/2","title":"PlausibleWeb.Site.MembershipController.invite_member/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Site.MembershipController.html#invite_member_form/2","title":"PlausibleWeb.Site.MembershipController.invite_member_form/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Site.MembershipController.html#remove_member/2","title":"PlausibleWeb.Site.MembershipController.remove_member/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Site.MembershipController.html#transfer_ownership/2","title":"PlausibleWeb.Site.MembershipController.transfer_ownership/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Site.MembershipController.html#transfer_ownership_form/2","title":"PlausibleWeb.Site.MembershipController.transfer_ownership_form/2","type":"function"},{"doc":"Updates the role of a user. The user being updated could be the same or different from the user taking the action. When updating the role, it's important to enforce permissions: Owner - Can update anyone's role except for themselves. If they want to change their own role, they have to use the 'transfer ownership' feature. Admin - Can update anyone's role except for owners. Can downgrade their own access to 'viewer'. Can promote a viewer to admin.","ref":"PlausibleWeb.Site.MembershipController.html#update_role/2","title":"PlausibleWeb.Site.MembershipController.update_role/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Site.MembershipView.html","title":"PlausibleWeb.Site.MembershipView","type":"module"},{"doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.Site.MembershipView.html#__resource__/0","title":"PlausibleWeb.Site.MembershipView.__resource__/0","type":"function"},{"doc":"","ref":"PlausibleWeb.Site.MembershipView.html#invite_member_form.html/1","title":"PlausibleWeb.Site.MembershipView.invite_member_form.html/1","type":"function"},{"doc":"Renders the given template locally.","ref":"PlausibleWeb.Site.MembershipView.html#render/2","title":"PlausibleWeb.Site.MembershipView.render/2","type":"function"},{"doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"PlausibleWeb.Site.MembershipView.html#template_not_found/2","title":"PlausibleWeb.Site.MembershipView.template_not_found/2","type":"function"},{"doc":"","ref":"PlausibleWeb.Site.MembershipView.html#transfer_ownership_form.html/1","title":"PlausibleWeb.Site.MembershipView.transfer_ownership_form.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html","title":"PlausibleWeb.SiteController","type":"module"},{"doc":"","ref":"PlausibleWeb.SiteController.html#add_monthly_report_recipient/2","title":"PlausibleWeb.SiteController.add_monthly_report_recipient/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#add_snippet/2","title":"PlausibleWeb.SiteController.add_snippet/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#add_snippet_after_domain_change/2","title":"PlausibleWeb.SiteController.add_snippet_after_domain_change/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#add_spike_notification_recipient/2","title":"PlausibleWeb.SiteController.add_spike_notification_recipient/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#add_weekly_report_recipient/2","title":"PlausibleWeb.SiteController.add_weekly_report_recipient/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#change_domain/2","title":"PlausibleWeb.SiteController.change_domain/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#change_domain_submit/2","title":"PlausibleWeb.SiteController.change_domain_submit/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#create_goal/2","title":"PlausibleWeb.SiteController.create_goal/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#create_shared_link/2","title":"PlausibleWeb.SiteController.create_shared_link/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#create_site/2","title":"PlausibleWeb.SiteController.create_site/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#delete_custom_domain/2","title":"PlausibleWeb.SiteController.delete_custom_domain/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#delete_goal/2","title":"PlausibleWeb.SiteController.delete_goal/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#delete_google_auth/2","title":"PlausibleWeb.SiteController.delete_google_auth/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#delete_shared_link/2","title":"PlausibleWeb.SiteController.delete_shared_link/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#delete_site/2","title":"PlausibleWeb.SiteController.delete_site/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#disable_monthly_report/2","title":"PlausibleWeb.SiteController.disable_monthly_report/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#disable_spike_notification/2","title":"PlausibleWeb.SiteController.disable_spike_notification/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#disable_weekly_report/2","title":"PlausibleWeb.SiteController.disable_weekly_report/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#edit_shared_link/2","title":"PlausibleWeb.SiteController.edit_shared_link/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#enable_monthly_report/2","title":"PlausibleWeb.SiteController.enable_monthly_report/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#enable_spike_notification/2","title":"PlausibleWeb.SiteController.enable_spike_notification/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#enable_weekly_report/2","title":"PlausibleWeb.SiteController.enable_weekly_report/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#forget_imported/2","title":"PlausibleWeb.SiteController.forget_imported/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#import_from_google/2","title":"PlausibleWeb.SiteController.import_from_google/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#import_from_google_confirm/2","title":"PlausibleWeb.SiteController.import_from_google_confirm/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#import_from_google_user_metric_notice/2","title":"PlausibleWeb.SiteController.import_from_google_user_metric_notice/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#import_from_google_view_id/2","title":"PlausibleWeb.SiteController.import_from_google_view_id/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#import_from_google_view_id_form/2","title":"PlausibleWeb.SiteController.import_from_google_view_id_form/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#index/2","title":"PlausibleWeb.SiteController.index/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#make_private/2","title":"PlausibleWeb.SiteController.make_private/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#make_public/2","title":"PlausibleWeb.SiteController.make_public/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#new/2","title":"PlausibleWeb.SiteController.new/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#new_goal/2","title":"PlausibleWeb.SiteController.new_goal/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#new_shared_link/2","title":"PlausibleWeb.SiteController.new_shared_link/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#remove_monthly_report_recipient/2","title":"PlausibleWeb.SiteController.remove_monthly_report_recipient/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#remove_spike_notification_recipient/2","title":"PlausibleWeb.SiteController.remove_spike_notification_recipient/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#remove_weekly_report_recipient/2","title":"PlausibleWeb.SiteController.remove_weekly_report_recipient/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#reset_stats/2","title":"PlausibleWeb.SiteController.reset_stats/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#settings/2","title":"PlausibleWeb.SiteController.settings/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#settings_custom_domain/2","title":"PlausibleWeb.SiteController.settings_custom_domain/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#settings_danger_zone/2","title":"PlausibleWeb.SiteController.settings_danger_zone/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#settings_email_reports/2","title":"PlausibleWeb.SiteController.settings_email_reports/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#settings_funnels/2","title":"PlausibleWeb.SiteController.settings_funnels/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#settings_general/2","title":"PlausibleWeb.SiteController.settings_general/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#settings_goals/2","title":"PlausibleWeb.SiteController.settings_goals/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#settings_people/2","title":"PlausibleWeb.SiteController.settings_people/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#settings_search_console/2","title":"PlausibleWeb.SiteController.settings_search_console/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#settings_visibility/2","title":"PlausibleWeb.SiteController.settings_visibility/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#update_feature_visibility/2","title":"PlausibleWeb.SiteController.update_feature_visibility/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#update_google_auth/2","title":"PlausibleWeb.SiteController.update_google_auth/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#update_settings/2","title":"PlausibleWeb.SiteController.update_settings/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#update_shared_link/2","title":"PlausibleWeb.SiteController.update_shared_link/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteController.html#update_spike_notification/2","title":"PlausibleWeb.SiteController.update_spike_notification/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html","title":"PlausibleWeb.SiteView","type":"module"},{"doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.SiteView.html#__resource__/0","title":"PlausibleWeb.SiteView.__resource__/0","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#base_domain/0","title":"PlausibleWeb.SiteView.base_domain/0","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#change_domain.html/1","title":"PlausibleWeb.SiteView.change_domain.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#edit_shared_link.html/1","title":"PlausibleWeb.SiteView.edit_shared_link.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#goal_name/1","title":"PlausibleWeb.SiteView.goal_name/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#google_logo/1","title":"PlausibleWeb.SiteView.google_logo/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#gravatar/2","title":"PlausibleWeb.SiteView.gravatar/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#import_from_google_confirm.html/1","title":"PlausibleWeb.SiteView.import_from_google_confirm.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#import_from_google_user_metric_form.html/1","title":"PlausibleWeb.SiteView.import_from_google_user_metric_form.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#import_from_google_view_id_form.html/1","title":"PlausibleWeb.SiteView.import_from_google_view_id_form.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#index.html/1","title":"PlausibleWeb.SiteView.index.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#new.html/1","title":"PlausibleWeb.SiteView.new.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#new_goal.html/1","title":"PlausibleWeb.SiteView.new_goal.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#new_shared_link.html/1","title":"PlausibleWeb.SiteView.new_shared_link.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#plausible_url/0","title":"PlausibleWeb.SiteView.plausible_url/0","type":"function"},{"doc":"Renders the given template locally.","ref":"PlausibleWeb.SiteView.html#render/2","title":"PlausibleWeb.SiteView.render/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#render_snippet/1","title":"PlausibleWeb.SiteView.render_snippet/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#settings_custom_domain.html/1","title":"PlausibleWeb.SiteView.settings_custom_domain.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#settings_danger_zone.html/1","title":"PlausibleWeb.SiteView.settings_danger_zone.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#settings_email_reports.html/1","title":"PlausibleWeb.SiteView.settings_email_reports.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#settings_funnels.html/1","title":"PlausibleWeb.SiteView.settings_funnels.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#settings_general.html/1","title":"PlausibleWeb.SiteView.settings_general.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#settings_goals.html/1","title":"PlausibleWeb.SiteView.settings_goals.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#settings_people.html/1","title":"PlausibleWeb.SiteView.settings_people.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#settings_search_console.html/1","title":"PlausibleWeb.SiteView.settings_search_console.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#settings_visibility.html/1","title":"PlausibleWeb.SiteView.settings_visibility.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#shared_link_dest/2","title":"PlausibleWeb.SiteView.shared_link_dest/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#snippet.html/1","title":"PlausibleWeb.SiteView.snippet.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#snippet_after_domain_change.html/1","title":"PlausibleWeb.SiteView.snippet_after_domain_change.html/1","type":"function"},{"doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"PlausibleWeb.SiteView.html#template_not_found/2","title":"PlausibleWeb.SiteView.template_not_found/2","type":"function"},{"doc":"","ref":"PlausibleWeb.SiteView.html#with_indefinite_article/1","title":"PlausibleWeb.SiteView.with_indefinite_article/1","type":"function"},{"doc":"This controller is responsible for rendering stats dashboards. The stats dashboards are currently the only part of the app that uses client-side rendering. Since the dashboards are heavily interactive, they are built with React which is an appropriate choice for highly interactive browser UIs. sequenceDiagram Browser->>StatsController: GET /mydomain.com StatsController-->>Browser: StatsView.render(\"stats.html\") Note left of Browser: ReactDom.render(Dashboard) Browser -) Api.StatsController: GET /api/stats/mydomain.com/top-stats Api.StatsController --) Browser: {\"top_stats\": [...]} Note left of Browser: TopStats.render() Browser -) Api.StatsController: GET /api/stats/mydomain.com/main-graph Api.StatsController --) Browser: [{\"plot\": [...], \"labels\": [...]}, ...] Note left of Browser: VisitorGraph.render() Browser -) Api.StatsController: GET /api/stats/mydomain.com/sources Api.StatsController --) Browser: [{\"name\": \"Google\", \"visitors\": 292150}, ...] Note left of Browser: Sources.render() Note over Browser,StatsController: And so on, for all reports in the viewport This reasoning for this sequence is as follows: First paint is fast because it doesn't do any data aggregation yet - good UX The basic structure of the dashboard is rendered with spinners before reports are ready - good UX Rendering on the frontend allows for maximum interactivity. Re-rendering and re-fetching can be as granular as needed. Routing on the frontend allows the user to navigate the dashboard without reloading the page and losing context Rendering on the frontend allows caching results in the browser to reduce pressure on backends and storage 3.1 No client-side caching has been implemented yet. This is still theoretical. See https://github.com/plausible/analytics/discussions/1278 3.2 This is a big potential opportunity, because analytics data is mostly immutable. Clients can cache all historical data. Since frontend rendering & navigation is harder to build and maintain than regular server-rendered HTML, we don't use SPA-style rendering anywhere else .The only place currently where the benefits outweigh the costs is the dashboard.","ref":"PlausibleWeb.StatsController.html","title":"PlausibleWeb.StatsController","type":"module"},{"doc":"","ref":"PlausibleWeb.StatsController.html#authenticate_shared_link/2","title":"PlausibleWeb.StatsController.authenticate_shared_link/2","type":"function"},{"doc":"The export is limited to 300 entries for other reports and 100 entries for pages because bigger result sets start causing failures. Since we request data like time on page or bounce_rate for pages in a separate query using the IN filter, it causes the requests to balloon in payload size.","ref":"PlausibleWeb.StatsController.html#csv_export/2","title":"PlausibleWeb.StatsController.csv_export/2","type":"function"},{"doc":"Authorizes and renders a shared link: Shared link with no password protection: needs to just make sure the shared link entry is still in our database. This check makes sure shared link access can be revoked by the site admins. If the shared link exists, render it directly. Shared link with password protection: Same checks as without the password, but an extra step is taken to protect the page with a password. When the user passes the password challenge, a cookie is set with Plausible.Auth.Token.sign_shared_link(). The cookie allows the user to access the dashboard for 24 hours without entering the password again. ### Backwards compatibility The URL format for shared links was changed in this pull request in order to make the URLs easier to bookmark. The old format is supported along with the new in order to not break old links. See: https://plausible.io/docs/shared-links","ref":"PlausibleWeb.StatsController.html#shared_link/2","title":"PlausibleWeb.StatsController.shared_link/2","type":"function"},{"doc":"","ref":"PlausibleWeb.StatsController.html#stats/2","title":"PlausibleWeb.StatsController.stats/2","type":"function"},{"doc":"","ref":"PlausibleWeb.StatsView.html","title":"PlausibleWeb.StatsView","type":"module"},{"doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.StatsView.html#__resource__/0","title":"PlausibleWeb.StatsView.__resource__/0","type":"function"},{"doc":"","ref":"PlausibleWeb.StatsView.html#base_domain/0","title":"PlausibleWeb.StatsView.base_domain/0","type":"function"},{"doc":"","ref":"PlausibleWeb.StatsView.html#large_number_format/1","title":"PlausibleWeb.StatsView.large_number_format/1","type":"function"},{"doc":"","ref":"PlausibleWeb.StatsView.html#plausible_url/0","title":"PlausibleWeb.StatsView.plausible_url/0","type":"function"},{"doc":"Returns a readable stats URL. Native Phoenix router functions percent-encode all diacritics, resulting in ugly URLs, e.g. https://plausible.io/café.com transforms into https://plausible.io/caf%C3%A9.com . This function encodes only the slash ( / ) character from the site's domain. Examples iex> PlausibleWeb.StatsView.pretty_stats_url(%Plausible.Site{domain: "user.gittea.io/repo"}) " http://localhost:8000/user.gittea.io%2Frepo" iex> PlausibleWeb.StatsView.pretty_stats_url(%Plausible.Site{domain: "anakin.test"}) " http://localhost:8000/anakin.test" iex> PlausibleWeb.StatsView.pretty_stats_url(%Plausible.Site{domain: "café.test"}) " http://localhost:8000/café.test"","ref":"PlausibleWeb.StatsView.html#pretty_stats_url/1","title":"PlausibleWeb.StatsView.pretty_stats_url/1","type":"function"},{"doc":"Renders the given template locally.","ref":"PlausibleWeb.StatsView.html#render/2","title":"PlausibleWeb.StatsView.render/2","type":"function"},{"doc":"","ref":"PlausibleWeb.StatsView.html#shared_link_password.html/1","title":"PlausibleWeb.StatsView.shared_link_password.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.StatsView.html#site_locked.html/1","title":"PlausibleWeb.StatsView.site_locked.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.StatsView.html#stats.html/1","title":"PlausibleWeb.StatsView.stats.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.StatsView.html#stats_container_class/1","title":"PlausibleWeb.StatsView.stats_container_class/1","type":"function"},{"doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"PlausibleWeb.StatsView.html#template_not_found/2","title":"PlausibleWeb.StatsView.template_not_found/2","type":"function"},{"doc":"","ref":"PlausibleWeb.StatsView.html#waiting_first_pageview.html/1","title":"PlausibleWeb.StatsView.waiting_first_pageview.html/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Tracker.html","title":"PlausibleWeb.Tracker","type":"module"},{"doc":"","ref":"PlausibleWeb.Tracker.html#call/2","title":"PlausibleWeb.Tracker.call/2","type":"function"},{"doc":"Returns a specification to start this module under a supervisor. See Supervisor .","ref":"PlausibleWeb.Tracker.html#child_spec/1","title":"PlausibleWeb.Tracker.child_spec/1","type":"function"},{"doc":"","ref":"PlausibleWeb.Tracker.html#init/1","title":"PlausibleWeb.Tracker.init/1","type":"function"},{"doc":"","ref":"PlausibleWeb.UnsubscribeController.html","title":"PlausibleWeb.UnsubscribeController","type":"module"},{"doc":"","ref":"PlausibleWeb.UnsubscribeController.html#monthly_report/2","title":"PlausibleWeb.UnsubscribeController.monthly_report/2","type":"function"},{"doc":"","ref":"PlausibleWeb.UnsubscribeController.html#weekly_report/2","title":"PlausibleWeb.UnsubscribeController.weekly_report/2","type":"function"},{"doc":"","ref":"PlausibleWeb.UnsubscribeView.html","title":"PlausibleWeb.UnsubscribeView","type":"module"},{"doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.UnsubscribeView.html#__resource__/0","title":"PlausibleWeb.UnsubscribeView.__resource__/0","type":"function"},{"doc":"Renders the given template locally.","ref":"PlausibleWeb.UnsubscribeView.html#render/2","title":"PlausibleWeb.UnsubscribeView.render/2","type":"function"},{"doc":"","ref":"PlausibleWeb.UnsubscribeView.html#success.html/1","title":"PlausibleWeb.UnsubscribeView.success.html/1","type":"function"},{"doc":"Callback invoked when no template is found. By default it raises but can be customized to render a particular template.","ref":"PlausibleWeb.UnsubscribeView.html#template_not_found/2","title":"PlausibleWeb.UnsubscribeView.template_not_found/2","type":"function"},{"doc":"Simple Metrics | Lightweight Script | Privacy Focused | Open Source | Docs | Contributing Plausible Analytics is a simple, lightweight (< 1 KB), open source and privacy-friendly alternative to Google Analytics. It doesn’t use cookies and is fully compliant with GDPR, CCPA and PECR. You can self-host or have us run Plausible for you in the cloud. Here's the live demo of our own website stats . Made and hosted in the EU 🇪🇺 We are dedicated to making web analytics more privacy-friendly. Our mission is to reduce corporate surveillance by providing an alternative web analytics tool which doesn’t come from the AdTech world. We are completely independent and solely funded by our subscribers.","ref":"readme.html","title":"Introduction","type":"extras"},{"doc":"Here's what makes Plausible a great Google Analytics alternative and why we're trusted by thousands of paying subscribers to deliver their website and business insights: Clutter Free : Plausible Analytics provides simple web analytics and it cuts through the noise. No layers of menus, no need for custom reports. Get all the important insights on one single page. No training necessary. GDPR/CCPA/PECR compliant : Measure traffic, not individuals. No personal data or IP addresses are ever stored in our database. We don't use cookies or any other persistent identifiers. Read more about our data policy Lightweight : Plausible Analytics works by loading a script on your website, like Google Analytics. Our script is 45x smaller , making your website quicker to load. Email or Slack reports : Keep an eye on your traffic with weekly and/or monthly email or Slack reports. You can also get traffic spike notifications. Open website stats : You have the option to be transparent and open your web analytics to everyone. Your website stats are private by default but you can choose to make them public so anyone with your custom link can view them. Define key goals and track conversions : Set custom events or page URLs as your goals and see how they convert over time to understand and identify the trends that matter. Includes easy ways to track outbound link clicks and 404 error pages. Search keywords : Integrate your dashboard with Google Search Console to get the most accurate reporting on your search keywords. SPA support : Plausible is built with modern web frameworks in mind and it works automatically with any pushState based router on the frontend. We also support frameworks that use the URL hash for routing. See our documentation . Interested to learn more? Read more on our website , learn more about the team and the goals of the project on our about page or explore the documentation .","ref":"readme.html#why-plausible","title":"Introduction - Why Plausible?","type":"extras"},{"doc":"Plausible Analytics is an independently owned and actively developed project. To keep the project development going, to stay in business, to continue putting effort into building a better product and to cover our costs, we need to charge a fee. Google Analytics is free because Google has built their company and their wealth by collecting and analyzing huge amounts of personal information from web users and using these personal and behavioral insights to sell advertisements. Plausible has no part in that business model. No personal data is being collected and analyzed either. With Plausible, you 100% own and control all of your website data. This data is not being shared with or sold to any third-parties. We choose the subscription business model rather than the business model of surveillance capitalism. See reasons why we believe you should stop using Google Analytics on your website .","ref":"readme.html#why-is-plausible-analytics-cloud-not-free-like-google-analytics","title":"Introduction - Why is Plausible Analytics Cloud not free like Google Analytics?","type":"extras"},{"doc":"The easiest way to get started with Plausible is with our official managed service in the cloud . It takes 2 minutes to start counting your stats with a worldwide CDN, high availability, backups, security and maintenance all done for you by us. In order to be compliant with the GDPR and the Schrems II ruling, all visitor data for our managed service in the cloud is exclusively processed on servers and cloud infrastructure owned and operated by European providers. Your website data never leaves the EU. Our managed hosting can save a substantial amount of developer time and resources. For most sites this ends up being the best value option and the revenue goes to funding the maintenance and further development of Plausible. So you’ll be supporting open source software and getting a great service! Can Plausible Analytics be self-hosted? Plausible is fully open source web analytics and we have a free as in beer Plausible Analytics Self-Hosted solution. It’s exactly the same product as our cloud solution with a less frequent release schedule (think of it as a long term support release). Bug fixes and new features are released to the cloud version several times per week. Features are battle-tested in the cloud which allows us to fix any bugs before the general self-hosted release. Every six months or so we combine all the changes into a new self-hosted release. The main difference between the two is that the self-hosted version you have to install, host and manage yourself on your own infrastructure while the cloud version we manage everything for your ease and convenience. Here's the overview of all the differences: Plausible Cloud Self-Hosting Hosting Easy and convenient. It takes 2 minutes to start counting your stats with a worldwide CDN, high availability, backups, security and maintenance all done for you by us. We manage everything so you don’t have to worry about anything and can focus on your stats. You do it all yourself. You need to get a server and you need to manage your infrastructure. You are responsible for installation, maintenance, upgrades, server capacity, uptime, backup, security, stability, consistency, loading time and so on. Storage All visitor data is exclusively processed on EU-owned cloud infrastructure. We keep your site data on a secure, encrypted and green energy powered server in Germany. This ensures that your site data is protected by the strict European Union data privacy laws and ensures compliance with GDPR. Your website data never leaves the EU. You have full control and can host your instance on any server in any country that you wish. Host it on a server in your basement or host it with any cloud provider wherever you want, even those that are not GDPR compliant. Releases Continuously developed and improved with new features and updates multiple times per week. It's a long term release published approximately twice per year so latest features won't be immediately available. You can see all the currently unreleased features in the changelog . Raw data You see all your site stats and metrics on our modern-looking, simple to use and fast loading dashboard. You can only see the stats aggregated in the dashboard. You can download the stats using the CSV export , stats API or tools such as the Data Studio Connector . Do you want access to the raw data? Self-hosting gives you that option. You can take the data directly from the ClickHouse database. Premium Support Real support delivered by real human beings who build and maintain Plausible. Premium support is not included. Self-hosting is community supported only. Costs There's a cost associated with providing an analytics service so we charge a subscription fee. We choose the subscription business model rather than the business model of surveillance capitalism. Your money funds further development of Plausible. You need to pay for your server, CDN, backups and whatever other cost there is associated with running the infrastructure. You never have to pay any fees to us. Your money goes to 3rd party companies with no connection to us. Interested in self-hosting Plausible on your server? Take a look at our self-hosting installation instructions . Plausible Self-Hosted is a community supported project and there are no guarantees that you will get support from the creators of Plausible to troubleshoot your self-hosting issues. There is a community supported forum where you can ask for help. Our only source of funding is our premium, managed service for running Plausible in the cloud. If you're looking for an alternative way to support the project, we've put together some sponsorship packages. If you choose to self-host Plausible you can become a sponsor which is a great way to give back to the community and to contribute to the long-term sustainability of the project.","ref":"readme.html#getting-started-with-plausible","title":"Introduction - Getting started with Plausible","type":"extras"},{"doc":"Plausible Analytics is a standard Elixir/Phoenix application backed by a PostgreSQL database for general data and a Clickhouse database for stats. On the frontend we use TailwindCSS for styling and React to make the dashboard interactive.","ref":"readme.html#technology","title":"Introduction - Technology","type":"extras"},{"doc":"For anyone wishing to contribute to Plausible, we recommend taking a look at our contributor guide .","ref":"readme.html#contributors","title":"Introduction - Contributors","type":"extras"},{"doc":"We welcome feedback from our community. We have a public roadmap driven by the features suggested by the community members. Take a look at our feedback board directly here on GitHub. Please let us know if you have any requests and vote on open issues so we can better prioritize. To stay up to date with all the latest news and product updates, make sure to follow us on Twitter , LinkedIn or Mastodon .","ref":"readme.html#feedback-roadmap","title":"Introduction - Feedback & Roadmap","type":"extras"},{"doc":"Plausible is open-source under the GNU Affero General Public License Version 3 (AGPLv3) or any later version. You can find it here . The only exception is our JavaScript tracker which gets included on your website. To avoid issues with AGPL virality, we've released the tracker under the MIT license. You can find it here .","ref":"readme.html#license","title":"Introduction - License","type":"extras"},{"doc":"We welcome everyone to contribute to Plausible. This document is to help you on setting up your environment, finding a task, and opening pull requests.","ref":"contributing.html","title":"Contributing","type":"extras"},{"doc":"The easiest way to get up and running is to install and use Docker for running both Postgres and Clickhouse. Make sure Docker, Elixir, Erlang and Node.js are all installed on your development machine. The .tool-versions file is available to use with asdf or similar tools. Start the environment Run both make postgres and make clickhouse . You can set up everything with make install , alternatively run each command separately: Run mix deps.get . This will download the required Elixir dependencies. Run mix ecto.create . This will create the required databases in both Postgres and Clickhouse. Run mix ecto.migrate to build the database schema. Run mix run priv/repo/seeds.exs to seed the database. Check the Seeds section for more. Run npm ci --prefix assets to install the required client-side dependencies. Run npm ci --prefix tracker to install the required tracker dependencies. Run npm run deploy --prefix tracker to generate tracker files in priv/tracker/js Run mix download_country_database to fetch geolocation database Run make server or mix phx.server to start the Phoenix server. The system is now available on localhost:8000 . Seeds You can optionally seed your database to automatically create an account and a site with stats: Run mix run priv/repo/seeds.exs to seed the database. Start the server with make server and navigate to http://localhost:8000/login . Log in with the following e-mail and password combination: user@plausible.test and plausible . You should now have a dummy.site site with generated stats. Alternatively, you can manually create a new account: Navigate to http://localhost:8000/register and fill in the form. Fill in the rest of the forms and for the domain use dummy.site Skip the JS snippet and click start collecting data. Run mix send_pageview from the terminal to generate a fake pageview event for the dummy site. You should now be all set! Stopping Docker containers Stop and remove the Postgres container with make postgres-stop . Stop and remove the Clickhouse container with make clickhouse-stop . Volumes are preserved. You'll find that the Postgres and Clickhouse state are retained when you bring them up again the next time: no need to re-register and so on. Note: Since we are deleting the containers, be careful when deleting volumes with docker volume prune . You might accidentally delete the database and would have to go through re-registration process. Pre-commit hooks pre-commit requires Python to be available locally and covers Elixir, JavaScript, and CSS. Set up with pip install --user pre-commit followed by pre-commit install . Conversely, if the prompts are far too bothersome, remove with pre-commit uninstall .","ref":"contributing.html#development-setup","title":"Contributing - Development setup","type":"extras"},{"doc":"Bugs can be found in our issue tracker . Issues are usually up for grabs. New features need to be discussed with the core team and the community first. If you're tackling a feature, please make sure it has been already discussed in the Discussions tab . We kindly ask contributors to use the discussion comment section to propose a solution before opening a pull request. Pull requests without an associated issue or discussion may still be merged, but we will focus on changes that have already been talked through.","ref":"contributing.html#finding-a-task","title":"Contributing - Finding a task","type":"extras"},{"doc":"This document explains the account locking feature from a technical perspective. Account locking happens when users have outgrown their accounts, and despite e-mail and dashboard alerts, don't upgrade after a grace period.","ref":"account-locking.html","title":"Account locking","type":"extras"},{"doc":"The Plausible.Workers.CheckUsage daily background job alerts users they have reached their subscription limits. This runs for outgrown users one day after their last billing date. When users reach the number of sites limit, or use >110% of their pageview limit for 2 consecutive billing cycles, the background job sends them an e-mail alert. The e-mail suggests a suitable subscription plan based on usage. For enterprise users, only an internal e-mail is sent to enterprise@plausible.io . The user is given 7 days to upgrade their account after the alert, and this is called grace period. The background starts this grace period by adding a users.grace_period JSON to the user record: // SELECT grace_period FROM users LIMIT 1 { "id": "1aa855bd-022d-4dfc-b572-6853442c3f19", "is_over": true, "end_date": "2022-03-09", "allowance_required": 100, "manual_lock": false } During this period, the following alert pops up on the dashboard for both standard and enterprise users: If the user upgrades to a suitable plan, the grace period is removed (check Plausible.Billing.subscription_updated/1 ), otherwise Account locking ) follows. For enterprise users, the grace period has a manual lock flag set to true, meaning enterprise accounts can only be locked/unlocked through the internal CRM.","ref":"account-locking.html#usage-alert-and-grace-period","title":"Account locking - Usage alert and grace period","type":"extras"},{"doc":"The grace period is checked daily by the Plausible.Workers.LockSites background job. For users that expired their grace period, sites.locked is is set to true , restricting access to dashboards. This does not stop event ingestion, so users can have their stats up to date when they finally upgrade.","ref":"account-locking.html#account-locking","title":"Account locking - Account locking","type":"extras"}] \ No newline at end of file diff --git a/dist/sidebar_items-625D214B.js b/dist/sidebar_items-625D214B.js deleted file mode 100644 index 74cae6aff..000000000 --- a/dist/sidebar_items-625D214B.js +++ /dev/null @@ -1 +0,0 @@ -sidebarNodes={"extras":[{"group":"","headers":[{"anchor":"modules","id":"Modules"},{"anchor":"mix-tasks","id":"Mix Tasks"}],"id":"api-reference","title":"API Reference"},{"group":"","headers":[{"anchor":"why-plausible","id":"Why Plausible?"},{"anchor":"why-is-plausible-analytics-cloud-not-free-like-google-analytics","id":"Why is Plausible Analytics Cloud not free like Google Analytics?"},{"anchor":"getting-started-with-plausible","id":"Getting started with Plausible"},{"anchor":"technology","id":"Technology"},{"anchor":"contributors","id":"Contributors"},{"anchor":"feedback-roadmap","id":"Feedback & Roadmap"},{"anchor":"license","id":"License"}],"id":"readme","title":"Introduction"},{"group":"","headers":[{"anchor":"development-setup","id":"Development setup"},{"anchor":"finding-a-task","id":"Finding a task"}],"id":"contributing","title":"Contributing"},{"group":"Features","headers":[{"anchor":"usage-alert-and-grace-period","id":"Usage alert and grace period"},{"anchor":"account-locking","id":"Account locking"}],"id":"account-locking","title":"Account locking"}],"modules":[{"group":"","id":"ObanErrorReporter","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"handle_event/4","id":"handle_event/4","title":"handle_event(list, measure, meta, _)"}]}],"sections":[],"title":"ObanErrorReporter"},{"group":"","id":"Plausible","sections":[],"title":"Plausible"},{"group":"","id":"Plausible.AsyncInsertRepo","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"aggregate/3","id":"aggregate/3","title":"aggregate(queryable, aggregate, opts \\\\ [])"},{"anchor":"aggregate/4","id":"aggregate/4","title":"aggregate(queryable, aggregate, field, opts)"},{"anchor":"all/2","id":"all/2","title":"all(queryable, opts \\\\ [])"},{"anchor":"checked_out?/0","id":"checked_out?/0","title":"checked_out?()"},{"anchor":"checkout/2","id":"checkout/2","title":"checkout(fun, opts \\\\ [])"},{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"},{"anchor":"config/0","id":"config/0","title":"config()"},{"anchor":"default_options/1","id":"default_options/1","title":"default_options(operation)"},{"anchor":"delete/2","id":"delete/2","title":"delete(struct, opts \\\\ [])"},{"anchor":"delete!/2","id":"delete!/2","title":"delete!(struct, opts \\\\ [])"},{"anchor":"delete_all/2","id":"delete_all/2","title":"delete_all(queryable, opts \\\\ [])"},{"anchor":"disconnect_all/2","id":"disconnect_all/2","title":"disconnect_all(interval, opts \\\\ [])"},{"anchor":"exists?/2","id":"exists?/2","title":"exists?(queryable, opts \\\\ [])"},{"anchor":"get/3","id":"get/3","title":"get(queryable, id, opts \\\\ [])"},{"anchor":"get!/3","id":"get!/3","title":"get!(queryable, id, opts \\\\ [])"},{"anchor":"get_by/3","id":"get_by/3","title":"get_by(queryable, clauses, opts \\\\ [])"},{"anchor":"get_by!/3","id":"get_by!/3","title":"get_by!(queryable, clauses, opts \\\\ [])"},{"anchor":"get_dynamic_repo/0","id":"get_dynamic_repo/0","title":"get_dynamic_repo()"},{"anchor":"insert/2","id":"insert/2","title":"insert(struct, opts \\\\ [])"},{"anchor":"insert!/2","id":"insert!/2","title":"insert!(struct, opts \\\\ [])"},{"anchor":"insert_all/3","id":"insert_all/3","title":"insert_all(schema_or_source, entries, opts \\\\ [])"},{"anchor":"insert_or_update/2","id":"insert_or_update/2","title":"insert_or_update(changeset, opts \\\\ [])"},{"anchor":"insert_or_update!/2","id":"insert_or_update!/2","title":"insert_or_update!(changeset, opts \\\\ [])"},{"anchor":"insert_stream/3","id":"insert_stream/3","title":"insert_stream(source_or_schema, rows, opts \\\\ [])"},{"anchor":"load/2","id":"load/2","title":"load(schema_or_types, data)"},{"anchor":"one/2","id":"one/2","title":"one(queryable, opts \\\\ [])"},{"anchor":"one!/2","id":"one!/2","title":"one!(queryable, opts \\\\ [])"},{"anchor":"preload/3","id":"preload/3","title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])"},{"anchor":"prepare_query/3","id":"prepare_query/3","title":"prepare_query(operation, query, opts)"},{"anchor":"put_dynamic_repo/1","id":"put_dynamic_repo/1","title":"put_dynamic_repo(dynamic)"},{"anchor":"query/3","id":"query/3","title":"query(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"query!/3","id":"query!/3","title":"query!(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"reload/2","id":"reload/2","title":"reload(queryable, opts \\\\ [])"},{"anchor":"reload!/2","id":"reload!/2","title":"reload!(queryable, opts \\\\ [])"},{"anchor":"start_link/1","id":"start_link/1","title":"start_link(opts \\\\ [])"},{"anchor":"stop/1","id":"stop/1","title":"stop(timeout \\\\ 5000)"},{"anchor":"stream/2","id":"stream/2","title":"stream(queryable, opts \\\\ [])"},{"anchor":"to_sql/2","id":"to_sql/2","title":"to_sql(operation, queryable)"},{"anchor":"update/2","id":"update/2","title":"update(struct, opts \\\\ [])"},{"anchor":"update!/2","id":"update!/2","title":"update!(struct, opts \\\\ [])"},{"anchor":"update_all/3","id":"update_all/3","title":"update_all(queryable, updates, opts \\\\ [])"}]}],"sections":[],"title":"Plausible.AsyncInsertRepo"},{"group":"","id":"Plausible.Auth","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"create_user/3","id":"create_user/3","title":"create_user(name, email, pwd)"},{"anchor":"delete_user/1","id":"delete_user/1","title":"delete_user(user)"},{"anchor":"enterprise?/1","id":"enterprise?/1","title":"enterprise?(user)"},{"anchor":"find_user_by/1","id":"find_user_by/1","title":"find_user_by(opts)"},{"anchor":"has_active_sites?/2","id":"has_active_sites?/2","title":"has_active_sites?(user, roles \\\\ [:owner, :admin, :viewer])"},{"anchor":"is_super_admin?/1","id":"is_super_admin?/1","title":"is_super_admin?(user_id)"},{"anchor":"issue_email_verification/1","id":"issue_email_verification/1","title":"issue_email_verification(user)"},{"anchor":"user_owns_sites?/1","id":"user_owns_sites?/1","title":"user_owns_sites?(user)"},{"anchor":"verify_email/2","id":"verify_email/2","title":"verify_email(user, code)"}]}],"sections":[],"title":"Plausible.Auth"},{"group":"","id":"Plausible.Auth.ApiKey","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"changeset/2","id":"changeset/2","title":"changeset(schema, attrs \\\\ %{})"},{"anchor":"do_hash/1","id":"do_hash/1","title":"do_hash(key)"},{"anchor":"process_key/1","id":"process_key/1","title":"process_key(changeset)"},{"anchor":"update/2","id":"update/2","title":"update(schema, attrs \\\\ %{})"}]}],"sections":[],"title":"Plausible.Auth.ApiKey"},{"group":"","id":"Plausible.Auth.ApiKeyAdmin","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"create_changeset/2","id":"create_changeset/2","title":"create_changeset(schema, attrs)"},{"anchor":"custom_index_query/3","id":"custom_index_query/3","title":"custom_index_query(conn, schema, query)"},{"anchor":"form_fields/1","id":"form_fields/1","title":"form_fields(_)"},{"anchor":"index/1","id":"index/1","title":"index(_)"},{"anchor":"search_fields/1","id":"search_fields/1","title":"search_fields(schema)"},{"anchor":"update_changeset/2","id":"update_changeset/2","title":"update_changeset(schema, attrs)"}]}],"sections":[],"title":"Plausible.Auth.ApiKeyAdmin"},{"group":"","id":"Plausible.Auth.GracePeriod","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"active?/1","id":"active?/1","title":"active?(user)"},{"anchor":"end_changeset/1","id":"end_changeset/1","title":"end_changeset(user)"},{"anchor":"expired?/1","id":"expired?/1","title":"expired?(user)"},{"anchor":"remove_changeset/1","id":"remove_changeset/1","title":"remove_changeset(user)"},{"anchor":"start_changeset/2","id":"start_changeset/2","title":"start_changeset(user, allowance_required)"},{"anchor":"start_manual_lock_changeset/2","id":"start_manual_lock_changeset/2","title":"start_manual_lock_changeset(user, allowance_required)"}]}],"sections":[],"title":"Plausible.Auth.GracePeriod"},{"group":"","id":"Plausible.Auth.Invitation","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"new/1","id":"new/1","title":"new(attrs \\\\ %{})"}]}],"sections":[],"title":"Plausible.Auth.Invitation"},{"group":"","id":"Plausible.Auth.Password","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"dummy_calculation/0","id":"dummy_calculation/0","title":"dummy_calculation()"},{"anchor":"hash/1","id":"hash/1","title":"hash(password)"},{"anchor":"match?/2","id":"match?/2","title":"match?(password, hash)"}]}],"sections":[],"title":"Plausible.Auth.Password"},{"group":"","id":"Plausible.Auth.Token","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"sign_password_reset/1","id":"sign_password_reset/1","title":"sign_password_reset(email)"},{"anchor":"sign_shared_link/1","id":"sign_shared_link/1","title":"sign_shared_link(slug)"},{"anchor":"verify_password_reset/1","id":"verify_password_reset/1","title":"verify_password_reset(token)"},{"anchor":"verify_shared_link/1","id":"verify_shared_link/1","title":"verify_shared_link(token)"}]}],"sections":[],"title":"Plausible.Auth.Token"},{"group":"","id":"Plausible.Auth.User","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"changeset/2","id":"changeset/2","title":"changeset(user, attrs \\\\ %{})"},{"anchor":"end_trial/1","id":"end_trial/1","title":"end_trial(user)"},{"anchor":"hash_password/1","id":"hash_password/1","title":"hash_password(changeset)"},{"anchor":"new/1","id":"new/1","title":"new(attrs \\\\ %{})"},{"anchor":"remove_trial_expiry/1","id":"remove_trial_expiry/1","title":"remove_trial_expiry(user)"},{"anchor":"set_password/2","id":"set_password/2","title":"set_password(user, password)"},{"anchor":"start_trial/1","id":"start_trial/1","title":"start_trial(user)"}]}],"sections":[],"title":"Plausible.Auth.User"},{"group":"","id":"Plausible.Auth.UserAdmin","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"custom_index_query/3","id":"custom_index_query/3","title":"custom_index_query(conn, schema, query)"},{"anchor":"form_fields/1","id":"form_fields/1","title":"form_fields(_)"},{"anchor":"index/1","id":"index/1","title":"index(_)"},{"anchor":"resource_actions/1","id":"resource_actions/1","title":"resource_actions(_)"}]}],"sections":[],"title":"Plausible.Auth.UserAdmin"},{"group":"","id":"Plausible.Billing","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"active_subscription_for/1","id":"active_subscription_for/1","title":"active_subscription_for(user_id)"},{"anchor":"change_plan/2","id":"change_plan/2","title":"change_plan(user, new_plan_id)"},{"anchor":"change_plan_preview/2","id":"change_plan_preview/2","title":"change_plan_preview(subscription, new_plan_id)"},{"anchor":"has_active_subscription?/1","id":"has_active_subscription?/1","title":"has_active_subscription?(user_id)"},{"anchor":"last_two_billing_cycles/2","id":"last_two_billing_cycles/2","title":"last_two_billing_cycles(user, today \\\\ Timex.today())"},{"anchor":"last_two_billing_months_usage/2","id":"last_two_billing_months_usage/2","title":"last_two_billing_months_usage(user, today \\\\ Timex.today())"},{"anchor":"needs_to_upgrade?/1","id":"needs_to_upgrade?/1","title":"needs_to_upgrade?(user)"},{"anchor":"on_trial?/1","id":"on_trial?/1","title":"on_trial?(user)"},{"anchor":"paddle_api/0","id":"paddle_api/0","title":"paddle_api()"},{"anchor":"sites_limit/1","id":"sites_limit/1","title":"sites_limit(user)"},{"anchor":"subscription_cancelled/1","id":"subscription_cancelled/1","title":"subscription_cancelled(params)"},{"anchor":"subscription_created/1","id":"subscription_created/1","title":"subscription_created(params)"},{"anchor":"subscription_payment_succeeded/1","id":"subscription_payment_succeeded/1","title":"subscription_payment_succeeded(params)"},{"anchor":"subscription_updated/1","id":"subscription_updated/1","title":"subscription_updated(params)"},{"anchor":"trial_days_left/1","id":"trial_days_left/1","title":"trial_days_left(user)"},{"anchor":"usage/1","id":"usage/1","title":"usage(user)"},{"anchor":"usage_breakdown/1","id":"usage_breakdown/1","title":"usage_breakdown(user)"}]}],"sections":[],"title":"Plausible.Billing"},{"group":"","id":"Plausible.Billing.EnterprisePlan","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"changeset/2","id":"changeset/2","title":"changeset(model, attrs \\\\ %{})"}]}],"sections":[],"title":"Plausible.Billing.EnterprisePlan"},{"group":"","id":"Plausible.Billing.EnterprisePlanAdmin","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"custom_index_query/3","id":"custom_index_query/3","title":"custom_index_query(conn, schema, query)"},{"anchor":"form_fields/1","id":"form_fields/1","title":"form_fields(_)"},{"anchor":"index/1","id":"index/1","title":"index(_)"},{"anchor":"search_fields/1","id":"search_fields/1","title":"search_fields(schema)"}]}],"sections":[],"title":"Plausible.Billing.EnterprisePlanAdmin"},{"group":"","id":"Plausible.Billing.PaddleApi","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"checkout_domain/0","id":"checkout_domain/0","title":"checkout_domain()"},{"anchor":"get_invoices/1","id":"get_invoices/1","title":"get_invoices(subscription)"},{"anchor":"get_subscription/1","id":"get_subscription/1","title":"get_subscription(paddle_subscription_id)"},{"anchor":"update_subscription/2","id":"update_subscription/2","title":"update_subscription(paddle_subscription_id, params)"},{"anchor":"update_subscription_preview/2","id":"update_subscription_preview/2","title":"update_subscription_preview(paddle_subscription_id, new_plan_id)"},{"anchor":"vendors_domain/0","id":"vendors_domain/0","title":"vendors_domain()"}]}],"sections":[],"title":"Plausible.Billing.PaddleApi"},{"group":"","id":"Plausible.Billing.Plans","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:plan/0","id":"plan/0","title":"plan()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"all_yearly_plan_ids/0","id":"all_yearly_plan_ids/0","title":"all_yearly_plan_ids()"},{"anchor":"allowance/1","id":"allowance/1","title":"allowance(subscription)"},{"anchor":"for_product_id/1","id":"for_product_id/1","title":"for_product_id(product_id)"},{"anchor":"plans_for/1","id":"plans_for/1","title":"plans_for(user)"},{"anchor":"subscription_interval/1","id":"subscription_interval/1","title":"subscription_interval(subscription)"},{"anchor":"suggested_plan/2","id":"suggested_plan/2","title":"suggested_plan(user, usage_during_cycle)"}]}],"sections":[],"title":"Plausible.Billing.Plans"},{"group":"","id":"Plausible.Billing.SiteLocker","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"check_sites_for/1","id":"check_sites_for/1","title":"check_sites_for(user)"},{"anchor":"set_lock_status_for/2","id":"set_lock_status_for/2","title":"set_lock_status_for(user, status)"}]}],"sections":[],"title":"Plausible.Billing.SiteLocker"},{"group":"","id":"Plausible.ChangesetHelpers","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"traverse_errors/1","id":"traverse_errors/1","title":"traverse_errors(changeset)"}]}],"sections":[],"title":"Plausible.ChangesetHelpers"},{"group":"","id":"Plausible.Cldr","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"available_locale_name?/1","id":"available_locale_name?/1","title":"available_locale_name?(locale_name)"},{"anchor":"default_locale/0","id":"default_locale/0","title":"default_locale()"},{"anchor":"default_territory/0","id":"default_territory/0","title":"default_territory()"},{"anchor":"ellipsis/2","id":"ellipsis/2","title":"ellipsis(string, options \\\\ [])"},{"anchor":"get_locale/0","id":"get_locale/0","title":"get_locale()"},{"anchor":"known_calendars/0","id":"known_calendars/0","title":"known_calendars()"},{"anchor":"known_currencies/0","id":"known_currencies/0","title":"known_currencies()"},{"anchor":"known_gettext_locale_name/1","id":"known_gettext_locale_name/1","title":"known_gettext_locale_name(locale_name)"},{"anchor":"known_gettext_locale_name?/1","id":"known_gettext_locale_name?/1","title":"known_gettext_locale_name?(locale_name)"},{"anchor":"known_gettext_locale_names/0","id":"known_gettext_locale_names/0","title":"known_gettext_locale_names()"},{"anchor":"known_locale_name/1","id":"known_locale_name/1","title":"known_locale_name(locale_name)"},{"anchor":"known_locale_name?/1","id":"known_locale_name?/1","title":"known_locale_name?(locale_name)"},{"anchor":"known_locale_names/0","id":"known_locale_names/0","title":"known_locale_names()"},{"anchor":"known_number_system_types/0","id":"known_number_system_types/0","title":"known_number_system_types()"},{"anchor":"known_number_systems/0","id":"known_number_systems/0","title":"known_number_systems()"},{"anchor":"known_rbnf_locale_name/1","id":"known_rbnf_locale_name/1","title":"known_rbnf_locale_name(locale_name)"},{"anchor":"known_rbnf_locale_name?/1","id":"known_rbnf_locale_name?/1","title":"known_rbnf_locale_name?(locale_name)"},{"anchor":"known_rbnf_locale_names/0","id":"known_rbnf_locale_names/0","title":"known_rbnf_locale_names()"},{"anchor":"known_territories/0","id":"known_territories/0","title":"known_territories()"},{"anchor":"normalize_lenient_parse/3","id":"normalize_lenient_parse/3","title":"normalize_lenient_parse(string, scope, locale \\\\ get_locale())"},{"anchor":"put_locale/1","id":"put_locale/1","title":"put_locale(locale_name)"},{"anchor":"quote/2","id":"quote/2","title":"quote(string, options \\\\ [])"},{"anchor":"unknown_locale_names/0","id":"unknown_locale_names/0","title":"unknown_locale_names()"},{"anchor":"validate_calendar/1","id":"validate_calendar/1","title":"validate_calendar(calendar)"},{"anchor":"validate_currency/1","id":"validate_currency/1","title":"validate_currency(currency)"},{"anchor":"validate_locale/1","id":"validate_locale/1","title":"validate_locale(locale)"},{"anchor":"validate_number_system/1","id":"validate_number_system/1","title":"validate_number_system(number_system)"},{"anchor":"validate_number_system_type/1","id":"validate_number_system_type/1","title":"validate_number_system_type(number_system_type)"},{"anchor":"validate_territory/1","id":"validate_territory/1","title":"validate_territory(territory)"},{"anchor":"with_locale/2","id":"with_locale/2","title":"with_locale(locale, fun)"}]}],"sections":[],"title":"Plausible.Cldr"},{"group":"","id":"Plausible.Cldr.AcceptLanguage","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"best_match/1","id":"best_match/1","title":"best_match(accept_language)"},{"anchor":"parse/1","id":"parse/1","title":"parse(tokens_or_string)"},{"anchor":"parse!/1","id":"parse!/1","title":"parse!(accept_language)"}]}],"sections":[],"title":"Plausible.Cldr.AcceptLanguage"},{"group":"","id":"Plausible.Cldr.Currency","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"currencies_for_locale/3","id":"currencies_for_locale/3","title":"currencies_for_locale(locale, only \\\\ :all, except \\\\ nil)"},{"anchor":"currencies_for_locale!/3","id":"currencies_for_locale!/3","title":"currencies_for_locale!(locale, only \\\\ :all, except \\\\ nil)"},{"anchor":"currency_for_code/2","id":"currency_for_code/2","title":"currency_for_code(currency_or_currency_code, options \\\\ [locale: Plausible.Cldr.default_locale()])"},{"anchor":"currency_for_code!/2","id":"currency_for_code!/2","title":"currency_for_code!(currency_or_currency_code, options \\\\ [locale: Plausible.Cldr.default_locale()])"},{"anchor":"currency_from_locale/1","id":"currency_from_locale/1","title":"currency_from_locale(locale)"},{"anchor":"currency_history_for_locale/1","id":"currency_history_for_locale/1","title":"currency_history_for_locale(language_tag)"},{"anchor":"currency_strings/3","id":"currency_strings/3","title":"currency_strings(locale, only \\\\ :all, except \\\\ nil)"},{"anchor":"currency_strings!/3","id":"currency_strings!/3","title":"currency_strings!(locale_name, only \\\\ :all, except \\\\ nil)"},{"anchor":"current_currency_from_locale/1","id":"current_currency_from_locale/1","title":"current_currency_from_locale(locale)"},{"anchor":"current_territory_currencies/0","id":"current_territory_currencies/0","title":"current_territory_currencies()"},{"anchor":"known_currencies/0","id":"known_currencies/0","title":"known_currencies()"},{"anchor":"known_currency?/1","id":"known_currency?/1","title":"known_currency?(code)"},{"anchor":"known_currency_code/1","id":"known_currency_code/1","title":"known_currency_code(currency_code)"},{"anchor":"known_currency_code?/1","id":"known_currency_code?/1","title":"known_currency_code?(currency_code)"},{"anchor":"known_currency_codes/0","id":"known_currency_codes/0","title":"known_currency_codes()"},{"anchor":"new/2","id":"new/2","title":"new(currency, options \\\\ [])"},{"anchor":"pluralize/3","id":"pluralize/3","title":"pluralize(number, currency, options \\\\ [])"},{"anchor":"strings_for_currency/2","id":"strings_for_currency/2","title":"strings_for_currency(currency, locale)"}]}],"sections":[],"title":"Plausible.Cldr.Currency"},{"group":"","id":"Plausible.Cldr.Locale","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"fallback_locale_names/1","id":"fallback_locale_names/1","title":"fallback_locale_names(locale)"},{"anchor":"fallback_locales/1","id":"fallback_locales/1","title":"fallback_locales(locale)"},{"anchor":"locale_for_territory/1","id":"locale_for_territory/1","title":"locale_for_territory(territory)"},{"anchor":"locale_from_host/2","id":"locale_from_host/2","title":"locale_from_host(host, options \\\\ [])"},{"anchor":"new/1","id":"new/1","title":"new(locale_name)"},{"anchor":"new!/1","id":"new!/1","title":"new!(locale_name)"},{"anchor":"territory_from_host/1","id":"territory_from_host/1","title":"territory_from_host(host)"},{"anchor":"territory_from_locale/1","id":"territory_from_locale/1","title":"territory_from_locale(locale)"},{"anchor":"timezone_from_locale/1","id":"timezone_from_locale/1","title":"timezone_from_locale(locale)"}]}],"sections":[],"title":"Plausible.Cldr.Locale"},{"group":"","id":"Plausible.Cldr.Number","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"parse/2","id":"parse/2","title":"parse(string, options \\\\ [])"},{"anchor":"resolve_currencies/2","id":"resolve_currencies/2","title":"resolve_currencies(list, options \\\\ [])"},{"anchor":"resolve_currency/2","id":"resolve_currency/2","title":"resolve_currency(string, options \\\\ [])"},{"anchor":"resolve_per/2","id":"resolve_per/2","title":"resolve_per(string, options \\\\ [])"},{"anchor":"resolve_pers/2","id":"resolve_pers/2","title":"resolve_pers(list, options \\\\ [])"},{"anchor":"scan/2","id":"scan/2","title":"scan(string, options \\\\ [])"},{"anchor":"to_approx_string/2","id":"to_approx_string/2","title":"to_approx_string(number, options \\\\ [])"},{"anchor":"to_at_least_string/2","id":"to_at_least_string/2","title":"to_at_least_string(number, options \\\\ [])"},{"anchor":"to_at_most_string/2","id":"to_at_most_string/2","title":"to_at_most_string(number, options \\\\ [])"},{"anchor":"to_range_string/2","id":"to_range_string/2","title":"to_range_string(range, options \\\\ [])"},{"anchor":"to_string/2","id":"to_string/2","title":"to_string(number, options \\\\ default_options())"},{"anchor":"to_string!/2","id":"to_string!/2","title":"to_string!(number, options \\\\ default_options())"},{"anchor":"validate_number_system/2","id":"validate_number_system/2","title":"validate_number_system(locale, number_system)"}]}],"sections":[],"title":"Plausible.Cldr.Number"},{"group":"","id":"Plausible.Cldr.Number.Cardinal","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"available_locale_names/0","id":"available_locale_names/0","title":"available_locale_names()"},{"anchor":"known_locale_names/0","id":"known_locale_names/0","title":"known_locale_names()"},{"anchor":"plural_rule/3","id":"plural_rule/3","title":"plural_rule(number, locale, rounding \\\\ Math.default_rounding())"},{"anchor":"plural_rules/0","id":"plural_rules/0","title":"plural_rules()"},{"anchor":"plural_rules_for/1","id":"plural_rules_for/1","title":"plural_rules_for(locale_name)"},{"anchor":"pluralize/3","id":"pluralize/3","title":"pluralize(number, locale_name, substitutions)"}]}],"sections":[],"title":"Plausible.Cldr.Number.Cardinal"},{"group":"","id":"Plausible.Cldr.Number.Format","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"all_formats_for/1","id":"all_formats_for/1","title":"all_formats_for(locale \\\\ Plausible.Cldr.get_locale())"},{"anchor":"all_formats_for!/1","id":"all_formats_for!/1","title":"all_formats_for!(locale \\\\ Plausible.Cldr.get_locale())"},{"anchor":"currency_spacing/2","id":"currency_spacing/2","title":"currency_spacing(locale, number_system)"},{"anchor":"decimal_format_list/0","id":"decimal_format_list/0","title":"decimal_format_list()"},{"anchor":"decimal_format_list_for/1","id":"decimal_format_list_for/1","title":"decimal_format_list_for(locale \\\\ Plausible.Cldr.get_locale())"},{"anchor":"default_grouping_for/1","id":"default_grouping_for/1","title":"default_grouping_for(locale \\\\ Plausible.Cldr.get_locale())"},{"anchor":"default_grouping_for!/1","id":"default_grouping_for!/1","title":"default_grouping_for!(locale)"},{"anchor":"formats_for/2","id":"formats_for/2","title":"formats_for(locale \\\\ Plausible.Cldr.default_locale(), number_system \\\\ Cldr.Number.System.default_number_system_type())"},{"anchor":"formats_for!/2","id":"formats_for!/2","title":"formats_for!(locale \\\\ Plausible.Cldr.default_locale(), number_system \\\\ Cldr.Number.System.default_number_system_type())"},{"anchor":"minimum_grouping_digits_for/1","id":"minimum_grouping_digits_for/1","title":"minimum_grouping_digits_for(locale \\\\ Plausible.Cldr.get_locale())"},{"anchor":"minimum_grouping_digits_for!/1","id":"minimum_grouping_digits_for!/1","title":"minimum_grouping_digits_for!(locale)"}]}],"sections":[{"anchor":"module-number-pattern-examples","id":"Number Pattern Examples"}],"title":"Plausible.Cldr.Number.Format"},{"group":"","id":"Plausible.Cldr.Number.Formatter.Decimal","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"metadata!/1","id":"metadata!/1","title":"metadata!(format)"},{"anchor":"to_string/3","id":"to_string/3","title":"to_string(number, format, options \\\\ [])"}]}],"sections":[],"title":"Plausible.Cldr.Number.Formatter.Decimal"},{"group":"","id":"Plausible.Cldr.Number.Ordinal","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"available_locale_names/0","id":"available_locale_names/0","title":"available_locale_names()"},{"anchor":"known_locale_names/0","id":"known_locale_names/0","title":"known_locale_names()"},{"anchor":"plural_rule/3","id":"plural_rule/3","title":"plural_rule(number, locale, rounding \\\\ Math.default_rounding())"},{"anchor":"plural_rules/0","id":"plural_rules/0","title":"plural_rules()"},{"anchor":"plural_rules_for/1","id":"plural_rules_for/1","title":"plural_rules_for(locale_name)"},{"anchor":"pluralize/3","id":"pluralize/3","title":"pluralize(number, locale_name, substitutions)"}]}],"sections":[],"title":"Plausible.Cldr.Number.Ordinal"},{"group":"","id":"Plausible.Cldr.Number.PluralRule.Range","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"plural_rule/3","id":"plural_rule/3","title":"plural_rule(first, last, locale)"}]}],"sections":[],"title":"Plausible.Cldr.Number.PluralRule.Range"},{"group":"","id":"Plausible.Cldr.Number.Symbol","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"all_decimal_symbols/0","id":"all_decimal_symbols/0","title":"all_decimal_symbols()"},{"anchor":"all_decimal_symbols_class/0","id":"all_decimal_symbols_class/0","title":"all_decimal_symbols_class()"},{"anchor":"all_grouping_symbols/0","id":"all_grouping_symbols/0","title":"all_grouping_symbols()"},{"anchor":"all_grouping_symbols_class/0","id":"all_grouping_symbols_class/0","title":"all_grouping_symbols_class()"},{"anchor":"number_symbols_for/1","id":"number_symbols_for/1","title":"number_symbols_for(locale \\\\ Plausible.Cldr.get_locale())"},{"anchor":"number_symbols_for/2","id":"number_symbols_for/2","title":"number_symbols_for(locale, number_system)"}]}],"sections":[],"title":"Plausible.Cldr.Number.Symbol"},{"group":"","id":"Plausible.Cldr.Number.System","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"number_system_for/2","id":"number_system_for/2","title":"number_system_for(locale, system_name)"},{"anchor":"number_system_from_locale/1","id":"number_system_from_locale/1","title":"number_system_from_locale(locale)"},{"anchor":"number_system_names_for/1","id":"number_system_names_for/1","title":"number_system_names_for(locale)"},{"anchor":"number_system_names_for!/1","id":"number_system_names_for!/1","title":"number_system_names_for!(locale)"},{"anchor":"number_system_types_for/1","id":"number_system_types_for/1","title":"number_system_types_for(locale)"},{"anchor":"number_systems_for/1","id":"number_systems_for/1","title":"number_systems_for(locale)"},{"anchor":"number_systems_for!/1","id":"number_systems_for!/1","title":"number_systems_for!(locale)"},{"anchor":"number_systems_like/2","id":"number_systems_like/2","title":"number_systems_like(locale, number_system)"},{"anchor":"system_name_from/2","id":"system_name_from/2","title":"system_name_from(system_name, locale)"},{"anchor":"to_system/2","id":"to_system/2","title":"to_system(number, system)"},{"anchor":"to_system!/2","id":"to_system!/2","title":"to_system!(number, system_name)"}]}],"sections":[],"title":"Plausible.Cldr.Number.System"},{"group":"","id":"Plausible.Cldr.Number.Transliterate","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"transliterate/3","id":"transliterate/3","title":"transliterate(sequence, locale \\\\ Plausible.Cldr.get_locale(), number_system \\\\ System.default_number_system_type())"},{"anchor":"transliterate!/3","id":"transliterate!/3","title":"transliterate!(sequence, locale, number_system)"},{"anchor":"transliterate_digits/3","id":"transliterate_digits/3","title":"transliterate_digits(digits, from_system, to_system)"}]}],"sections":[],"title":"Plausible.Cldr.Number.Transliterate"},{"group":"","id":"Plausible.Cldr.Rbnf.NumberSystem","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"all_rule_sets/0","id":"all_rule_sets/0","title":"all_rule_sets()"},{"anchor":"armenian_lower/1","id":"armenian_lower/1","title":"armenian_lower(number)"},{"anchor":"armenian_lower/2","id":"armenian_lower/2","title":"armenian_lower(number, locale)"},{"anchor":"armenian_upper/1","id":"armenian_upper/1","title":"armenian_upper(number)"},{"anchor":"armenian_upper/2","id":"armenian_upper/2","title":"armenian_upper(number, locale)"},{"anchor":"cyrillic_lower/1","id":"cyrillic_lower/1","title":"cyrillic_lower(number)"},{"anchor":"cyrillic_lower/2","id":"cyrillic_lower/2","title":"cyrillic_lower(number, locale)"},{"anchor":"cyrillic_lower_1_10/2","id":"cyrillic_lower_1_10/2","title":"cyrillic_lower_1_10(number, language_tag)"},{"anchor":"cyrillic_lower_final/2","id":"cyrillic_lower_final/2","title":"cyrillic_lower_final(number, language_tag)"},{"anchor":"cyrillic_lower_post/2","id":"cyrillic_lower_post/2","title":"cyrillic_lower_post(number, language_tag)"},{"anchor":"cyrillic_lower_thousands/2","id":"cyrillic_lower_thousands/2","title":"cyrillic_lower_thousands(number, language_tag)"},{"anchor":"ethiopic/1","id":"ethiopic/1","title":"ethiopic(number)"},{"anchor":"ethiopic/2","id":"ethiopic/2","title":"ethiopic(number, locale)"},{"anchor":"ethiopic_p1/2","id":"ethiopic_p1/2","title":"ethiopic_p1(number, language_tag)"},{"anchor":"ethiopic_p2/2","id":"ethiopic_p2/2","title":"ethiopic_p2(number, language_tag)"},{"anchor":"ethiopic_p3/2","id":"ethiopic_p3/2","title":"ethiopic_p3(number, language_tag)"},{"anchor":"ethiopic_p/2","id":"ethiopic_p/2","title":"ethiopic_p(number, language_tag)"},{"anchor":"georgian/1","id":"georgian/1","title":"georgian(number)"},{"anchor":"georgian/2","id":"georgian/2","title":"georgian(number, locale)"},{"anchor":"greek_lower/1","id":"greek_lower/1","title":"greek_lower(number)"},{"anchor":"greek_lower/2","id":"greek_lower/2","title":"greek_lower(number, locale)"},{"anchor":"greek_numeral_majuscules/2","id":"greek_numeral_majuscules/2","title":"greek_numeral_majuscules(number, language_tag)"},{"anchor":"greek_numeral_minuscules/2","id":"greek_numeral_minuscules/2","title":"greek_numeral_minuscules(number, language_tag)"},{"anchor":"greek_upper/1","id":"greek_upper/1","title":"greek_upper(number)"},{"anchor":"greek_upper/2","id":"greek_upper/2","title":"greek_upper(number, locale)"},{"anchor":"hebrew/1","id":"hebrew/1","title":"hebrew(number)"},{"anchor":"hebrew/2","id":"hebrew/2","title":"hebrew(number, locale)"},{"anchor":"hebrew_0_99/2","id":"hebrew_0_99/2","title":"hebrew_0_99(number, language_tag)"},{"anchor":"hebrew_item/1","id":"hebrew_item/1","title":"hebrew_item(number)"},{"anchor":"hebrew_item/2","id":"hebrew_item/2","title":"hebrew_item(number, locale)"},{"anchor":"hebrew_item_hundreds/2","id":"hebrew_item_hundreds/2","title":"hebrew_item_hundreds(number, language_tag)"},{"anchor":"hebrew_thousands/2","id":"hebrew_thousands/2","title":"hebrew_thousands(number, language_tag)"},{"anchor":"roman_lower/1","id":"roman_lower/1","title":"roman_lower(number)"},{"anchor":"roman_lower/2","id":"roman_lower/2","title":"roman_lower(number, locale)"},{"anchor":"roman_upper/1","id":"roman_upper/1","title":"roman_upper(number)"},{"anchor":"roman_upper/2","id":"roman_upper/2","title":"roman_upper(number, locale)"},{"anchor":"rule_sets/0","id":"rule_sets/0","title":"rule_sets()"},{"anchor":"rule_sets/1","id":"rule_sets/1","title":"rule_sets(rbnf_locale_name)"},{"anchor":"tamil/1","id":"tamil/1","title":"tamil(number)"},{"anchor":"tamil/2","id":"tamil/2","title":"tamil(number, locale)"},{"anchor":"tamil_thousands/2","id":"tamil_thousands/2","title":"tamil_thousands(number, language_tag)"},{"anchor":"zz_default/1","id":"zz_default/1","title":"zz_default(number)"},{"anchor":"zz_default/2","id":"zz_default/2","title":"zz_default(number, locale)"}]}],"sections":[],"title":"Plausible.Cldr.Rbnf.NumberSystem"},{"group":"","id":"Plausible.Cldr.Rbnf.Ordinal","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"all_rule_sets/0","id":"all_rule_sets/0","title":"all_rule_sets()"},{"anchor":"digits_ordinal/2","id":"digits_ordinal/2","title":"digits_ordinal(number, locale)"},{"anchor":"rule_sets/0","id":"rule_sets/0","title":"rule_sets()"},{"anchor":"rule_sets/1","id":"rule_sets/1","title":"rule_sets(rbnf_locale_name)"}]}],"sections":[],"title":"Plausible.Cldr.Rbnf.Ordinal"},{"group":"","id":"Plausible.Cldr.Rbnf.Spellout","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"2d_year/2","id":"2d_year/2","title":"2d_year(number, language_tag)"},{"anchor":"all_rule_sets/0","id":"all_rule_sets/0","title":"all_rule_sets()"},{"anchor":"and/2","id":"and/2","title":"number and language_tag"},{"anchor":"and_o/2","id":"and_o/2","title":"and_o(number, language_tag)"},{"anchor":"commas/2","id":"commas/2","title":"commas(number, language_tag)"},{"anchor":"commas_o/2","id":"commas_o/2","title":"commas_o(number, language_tag)"},{"anchor":"rule_sets/0","id":"rule_sets/0","title":"rule_sets()"},{"anchor":"rule_sets/1","id":"rule_sets/1","title":"rule_sets(rbnf_locale_name)"},{"anchor":"spellout_cardinal/2","id":"spellout_cardinal/2","title":"spellout_cardinal(number, locale)"},{"anchor":"spellout_cardinal_verbose/2","id":"spellout_cardinal_verbose/2","title":"spellout_cardinal_verbose(number, locale)"},{"anchor":"spellout_numbering/2","id":"spellout_numbering/2","title":"spellout_numbering(number, locale)"},{"anchor":"spellout_numbering_verbose/2","id":"spellout_numbering_verbose/2","title":"spellout_numbering_verbose(number, locale)"},{"anchor":"spellout_numbering_year/2","id":"spellout_numbering_year/2","title":"spellout_numbering_year(number, locale)"},{"anchor":"spellout_ordinal/2","id":"spellout_ordinal/2","title":"spellout_ordinal(number, locale)"},{"anchor":"spellout_ordinal_verbose/2","id":"spellout_ordinal_verbose/2","title":"spellout_ordinal_verbose(number, locale)"},{"anchor":"th/2","id":"th/2","title":"th(number, language_tag)"},{"anchor":"tieth/2","id":"tieth/2","title":"tieth(number, language_tag)"}]}],"sections":[],"title":"Plausible.Cldr.Rbnf.Spellout"},{"group":"","id":"Plausible.ClickhouseEventV2","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"new/1","id":"new/1","title":"new(attrs)"}]}],"sections":[],"title":"Plausible.ClickhouseEventV2"},{"group":"","id":"Plausible.ClickhouseRepo","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"aggregate/3","id":"aggregate/3","title":"aggregate(queryable, aggregate, opts \\\\ [])"},{"anchor":"aggregate/4","id":"aggregate/4","title":"aggregate(queryable, aggregate, field, opts)"},{"anchor":"all/2","id":"all/2","title":"all(queryable, opts \\\\ [])"},{"anchor":"checked_out?/0","id":"checked_out?/0","title":"checked_out?()"},{"anchor":"checkout/2","id":"checkout/2","title":"checkout(fun, opts \\\\ [])"},{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"},{"anchor":"config/0","id":"config/0","title":"config()"},{"anchor":"default_options/1","id":"default_options/1","title":"default_options(operation)"},{"anchor":"disconnect_all/2","id":"disconnect_all/2","title":"disconnect_all(interval, opts \\\\ [])"},{"anchor":"exists?/2","id":"exists?/2","title":"exists?(queryable, opts \\\\ [])"},{"anchor":"get/3","id":"get/3","title":"get(queryable, id, opts \\\\ [])"},{"anchor":"get!/3","id":"get!/3","title":"get!(queryable, id, opts \\\\ [])"},{"anchor":"get_by/3","id":"get_by/3","title":"get_by(queryable, clauses, opts \\\\ [])"},{"anchor":"get_by!/3","id":"get_by!/3","title":"get_by!(queryable, clauses, opts \\\\ [])"},{"anchor":"get_dynamic_repo/0","id":"get_dynamic_repo/0","title":"get_dynamic_repo()"},{"anchor":"insert_stream/3","id":"insert_stream/3","title":"insert_stream(source_or_schema, rows, opts \\\\ [])"},{"anchor":"load/2","id":"load/2","title":"load(schema_or_types, data)"},{"anchor":"one/2","id":"one/2","title":"one(queryable, opts \\\\ [])"},{"anchor":"one!/2","id":"one!/2","title":"one!(queryable, opts \\\\ [])"},{"anchor":"parallel_tasks/1","id":"parallel_tasks/1","title":"parallel_tasks(queries)"},{"anchor":"preload/3","id":"preload/3","title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])"},{"anchor":"prepare_query/3","id":"prepare_query/3","title":"prepare_query(operation, query, opts)"},{"anchor":"put_dynamic_repo/1","id":"put_dynamic_repo/1","title":"put_dynamic_repo(dynamic)"},{"anchor":"query/3","id":"query/3","title":"query(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"query!/3","id":"query!/3","title":"query!(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"reload/2","id":"reload/2","title":"reload(queryable, opts \\\\ [])"},{"anchor":"reload!/2","id":"reload!/2","title":"reload!(queryable, opts \\\\ [])"},{"anchor":"start_link/1","id":"start_link/1","title":"start_link(opts \\\\ [])"},{"anchor":"stop/1","id":"stop/1","title":"stop(timeout \\\\ 5000)"},{"anchor":"stream/2","id":"stream/2","title":"stream(queryable, opts \\\\ [])"},{"anchor":"to_sql/2","id":"to_sql/2","title":"to_sql(operation, queryable)"}]}],"sections":[],"title":"Plausible.ClickhouseRepo"},{"group":"","id":"Plausible.ClickhouseSessionV2","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"random_uint64/0","id":"random_uint64/0","title":"random_uint64()"}]}],"sections":[],"title":"Plausible.ClickhouseSessionV2"},{"group":"","id":"Plausible.ClickhouseSessionV2.BoolUInt8","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"embed_as/1","id":"embed_as/1","title":"embed_as(_)"},{"anchor":"equal?/2","id":"equal?/2","title":"equal?(term1, term2)"}]}],"sections":[],"title":"Plausible.ClickhouseSessionV2.BoolUInt8"},{"group":"","id":"Plausible.ConfigHelpers","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"get_int_from_path_or_env/3","id":"get_int_from_path_or_env/3","title":"get_int_from_path_or_env(config_dir, var_name, default \\\\ nil)"},{"anchor":"get_var_from_path_or_env/3","id":"get_var_from_path_or_env/3","title":"get_var_from_path_or_env(config_dir, var_name, default \\\\ nil)"}]}],"sections":[],"title":"Plausible.ConfigHelpers"},{"group":"","id":"Plausible.DataCase","sections":[],"title":"Plausible.DataCase"},{"group":"","id":"Plausible.DataMigration","sections":[],"title":"Plausible.DataMigration"},{"group":"","id":"Plausible.DataMigration.NumericIDs","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"confirm/3","id":"confirm/3","title":"confirm(message, func, default_choice \\\\ :yes)"},{"anchor":"run/1","id":"run/1","title":"run(opts \\\\ [])"},{"anchor":"run_sql/2","id":"run_sql/2","title":"run_sql(name, assigns \\\\ [])"},{"anchor":"run_sql_confirm/2","id":"run_sql_confirm/2","title":"run_sql_confirm(name, options \\\\ [])"}]}],"sections":[],"title":"Plausible.DataMigration.NumericIDs"},{"group":"","id":"Plausible.DataMigration.Repo","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"aggregate/3","id":"aggregate/3","title":"aggregate(queryable, aggregate, opts \\\\ [])"},{"anchor":"aggregate/4","id":"aggregate/4","title":"aggregate(queryable, aggregate, field, opts)"},{"anchor":"all/2","id":"all/2","title":"all(queryable, opts \\\\ [])"},{"anchor":"checked_out?/0","id":"checked_out?/0","title":"checked_out?()"},{"anchor":"checkout/2","id":"checkout/2","title":"checkout(fun, opts \\\\ [])"},{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"},{"anchor":"config/0","id":"config/0","title":"config()"},{"anchor":"default_options/1","id":"default_options/1","title":"default_options(operation)"},{"anchor":"delete/2","id":"delete/2","title":"delete(struct, opts \\\\ [])"},{"anchor":"delete!/2","id":"delete!/2","title":"delete!(struct, opts \\\\ [])"},{"anchor":"delete_all/2","id":"delete_all/2","title":"delete_all(queryable, opts \\\\ [])"},{"anchor":"disconnect_all/2","id":"disconnect_all/2","title":"disconnect_all(interval, opts \\\\ [])"},{"anchor":"exists?/2","id":"exists?/2","title":"exists?(queryable, opts \\\\ [])"},{"anchor":"get/3","id":"get/3","title":"get(queryable, id, opts \\\\ [])"},{"anchor":"get!/3","id":"get!/3","title":"get!(queryable, id, opts \\\\ [])"},{"anchor":"get_by/3","id":"get_by/3","title":"get_by(queryable, clauses, opts \\\\ [])"},{"anchor":"get_by!/3","id":"get_by!/3","title":"get_by!(queryable, clauses, opts \\\\ [])"},{"anchor":"get_dynamic_repo/0","id":"get_dynamic_repo/0","title":"get_dynamic_repo()"},{"anchor":"insert/2","id":"insert/2","title":"insert(struct, opts \\\\ [])"},{"anchor":"insert!/2","id":"insert!/2","title":"insert!(struct, opts \\\\ [])"},{"anchor":"insert_all/3","id":"insert_all/3","title":"insert_all(schema_or_source, entries, opts \\\\ [])"},{"anchor":"insert_or_update/2","id":"insert_or_update/2","title":"insert_or_update(changeset, opts \\\\ [])"},{"anchor":"insert_or_update!/2","id":"insert_or_update!/2","title":"insert_or_update!(changeset, opts \\\\ [])"},{"anchor":"insert_stream/3","id":"insert_stream/3","title":"insert_stream(source_or_schema, rows, opts \\\\ [])"},{"anchor":"load/2","id":"load/2","title":"load(schema_or_types, data)"},{"anchor":"one/2","id":"one/2","title":"one(queryable, opts \\\\ [])"},{"anchor":"one!/2","id":"one!/2","title":"one!(queryable, opts \\\\ [])"},{"anchor":"preload/3","id":"preload/3","title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])"},{"anchor":"prepare_query/3","id":"prepare_query/3","title":"prepare_query(operation, query, opts)"},{"anchor":"put_dynamic_repo/1","id":"put_dynamic_repo/1","title":"put_dynamic_repo(dynamic)"},{"anchor":"query/3","id":"query/3","title":"query(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"query!/3","id":"query!/3","title":"query!(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"reload/2","id":"reload/2","title":"reload(queryable, opts \\\\ [])"},{"anchor":"reload!/2","id":"reload!/2","title":"reload!(queryable, opts \\\\ [])"},{"anchor":"start/2","id":"start/2","title":"start(url, max_threads)"},{"anchor":"start_link/1","id":"start_link/1","title":"start_link(opts \\\\ [])"},{"anchor":"stop/1","id":"stop/1","title":"stop(timeout \\\\ 5000)"},{"anchor":"stream/2","id":"stream/2","title":"stream(queryable, opts \\\\ [])"},{"anchor":"to_sql/2","id":"to_sql/2","title":"to_sql(operation, queryable)"},{"anchor":"update/2","id":"update/2","title":"update(struct, opts \\\\ [])"},{"anchor":"update!/2","id":"update!/2","title":"update!(struct, opts \\\\ [])"},{"anchor":"update_all/3","id":"update_all/3","title":"update_all(queryable, updates, opts \\\\ [])"}]}],"sections":[],"title":"Plausible.DataMigration.Repo"},{"group":"","id":"Plausible.Ecto.EventName","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"cast/1","id":"cast/1","title":"cast(val)"},{"anchor":"dump/1","id":"dump/1","title":"dump(val)"},{"anchor":"embed_as/1","id":"embed_as/1","title":"embed_as(_)"},{"anchor":"equal?/2","id":"equal?/2","title":"equal?(term1, term2)"},{"anchor":"load/1","id":"load/1","title":"load(val)"},{"anchor":"type/0","id":"type/0","title":"type()"}]}],"sections":[],"title":"Plausible.Ecto.EventName"},{"group":"","id":"Plausible.Event.WriteBuffer","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(init_arg)"},{"anchor":"flush/0","id":"flush/0","title":"flush()"},{"anchor":"init/1","id":"init/1","title":"init(buffer)"},{"anchor":"insert/1","id":"insert/1","title":"insert(event)"},{"anchor":"start_link/1","id":"start_link/1","title":"start_link(opts)"}]}],"sections":[],"title":"Plausible.Event.WriteBuffer"},{"group":"","id":"Plausible.Factory","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"api_key_factory/0","id":"api_key_factory/0","title":"api_key_factory()"},{"anchor":"build/2","id":"build/2","title":"build(factory_name, attrs \\\\ %{})"},{"anchor":"build_list/3","id":"build_list/3","title":"build_list(number_of_records, factory_name, attrs \\\\ %{})"},{"anchor":"build_pair/2","id":"build_pair/2","title":"build_pair(factory_name, attrs \\\\ %{})"},{"anchor":"ch_session_factory/0","id":"ch_session_factory/0","title":"ch_session_factory()"},{"anchor":"create/1","id":"create/1","title":"create(_)"},{"anchor":"create/2","id":"create/2","title":"create(_, _)"},{"anchor":"create_list/3","id":"create_list/3","title":"create_list(_, _, _)"},{"anchor":"create_pair/2","id":"create_pair/2","title":"create_pair(_, _)"},{"anchor":"custom_domain_factory/0","id":"custom_domain_factory/0","title":"custom_domain_factory()"},{"anchor":"enterprise_plan_factory/0","id":"enterprise_plan_factory/0","title":"enterprise_plan_factory()"},{"anchor":"event_factory/0","id":"event_factory/0","title":"event_factory()"},{"anchor":"factory/1","id":"factory/1","title":"factory(factory_name)"},{"anchor":"goal_factory/0","id":"goal_factory/0","title":"goal_factory()"},{"anchor":"google_auth_factory/0","id":"google_auth_factory/0","title":"google_auth_factory()"},{"anchor":"imported_browsers_factory/0","id":"imported_browsers_factory/0","title":"imported_browsers_factory()"},{"anchor":"imported_devices_factory/0","id":"imported_devices_factory/0","title":"imported_devices_factory()"},{"anchor":"imported_entry_pages_factory/0","id":"imported_entry_pages_factory/0","title":"imported_entry_pages_factory()"},{"anchor":"imported_exit_pages_factory/0","id":"imported_exit_pages_factory/0","title":"imported_exit_pages_factory()"},{"anchor":"imported_locations_factory/0","id":"imported_locations_factory/0","title":"imported_locations_factory()"},{"anchor":"imported_operating_systems_factory/0","id":"imported_operating_systems_factory/0","title":"imported_operating_systems_factory()"},{"anchor":"imported_pages_factory/0","id":"imported_pages_factory/0","title":"imported_pages_factory()"},{"anchor":"imported_sources_factory/0","id":"imported_sources_factory/0","title":"imported_sources_factory()"},{"anchor":"imported_visitors_factory/0","id":"imported_visitors_factory/0","title":"imported_visitors_factory()"},{"anchor":"insert/1","id":"insert/1","title":"insert(already_built_record)"},{"anchor":"insert/2","id":"insert/2","title":"insert(already_built_record, function_opts)"},{"anchor":"insert/3","id":"insert/3","title":"insert(factory_name, attrs, opts)"},{"anchor":"insert_list/3","id":"insert_list/3","title":"insert_list(number_of_records, factory_name, attrs \\\\ %{})"},{"anchor":"insert_list/4","id":"insert_list/4","title":"insert_list(number_of_records, factory_name, attrs, opts)"},{"anchor":"insert_pair/2","id":"insert_pair/2","title":"insert_pair(factory_name, attrs \\\\ %{})"},{"anchor":"insert_pair/3","id":"insert_pair/3","title":"insert_pair(factory_name, attrs, opts)"},{"anchor":"invitation_factory/0","id":"invitation_factory/0","title":"invitation_factory()"},{"anchor":"monthly_report_factory/0","id":"monthly_report_factory/0","title":"monthly_report_factory()"},{"anchor":"pageview_factory/0","id":"pageview_factory/0","title":"pageview_factory()"},{"anchor":"params_for/2","id":"params_for/2","title":"params_for(factory_name, attrs \\\\ %{})"},{"anchor":"params_with_assocs/2","id":"params_with_assocs/2","title":"params_with_assocs(factory_name, attrs \\\\ %{})"},{"anchor":"shared_link_factory/0","id":"shared_link_factory/0","title":"shared_link_factory()"},{"anchor":"site_factory/0","id":"site_factory/0","title":"site_factory()"},{"anchor":"site_membership_factory/0","id":"site_membership_factory/0","title":"site_membership_factory()"},{"anchor":"spike_notification_factory/0","id":"spike_notification_factory/0","title":"spike_notification_factory()"},{"anchor":"string_params_for/2","id":"string_params_for/2","title":"string_params_for(factory_name, attrs \\\\ %{})"},{"anchor":"string_params_with_assocs/2","id":"string_params_with_assocs/2","title":"string_params_with_assocs(factory_name, attrs \\\\ %{})"},{"anchor":"subscription_factory/0","id":"subscription_factory/0","title":"subscription_factory()"},{"anchor":"user_factory/1","id":"user_factory/1","title":"user_factory(attrs)"},{"anchor":"weekly_report_factory/0","id":"weekly_report_factory/0","title":"weekly_report_factory()"}]}],"sections":[],"title":"Plausible.Factory"},{"group":"","id":"Plausible.Funnel","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"changeset/2","id":"changeset/2","title":"changeset(funnel \\\\ %__MODULE__{}, attrs \\\\ %{})"},{"anchor":"max_steps/0","id":"max_steps/0","title":"max_steps()"},{"anchor":"min_steps/0","id":"min_steps/0","title":"min_steps()"},{"anchor":"put_step_orders/1","id":"put_step_orders/1","title":"put_step_orders(changeset)"}]}],"sections":[],"title":"Plausible.Funnel"},{"group":"","id":"Plausible.Funnel.Step","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"changeset/2","id":"changeset/2","title":"changeset(step, attrs \\\\ %{})"}]}],"sections":[],"title":"Plausible.Funnel.Step"},{"group":"","id":"Plausible.Funnels","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"create/3","id":"create/3","title":"create(site, name, steps)"},{"anchor":"create_changeset/3","id":"create_changeset/3","title":"create_changeset(site, name, steps)"},{"anchor":"delete/2","id":"delete/2","title":"delete(site, funnel_id)"},{"anchor":"enabled_for?/1","id":"enabled_for?/1","title":"enabled_for?(actor)"},{"anchor":"ephemeral_definition/3","id":"ephemeral_definition/3","title":"ephemeral_definition(site, name, steps)"},{"anchor":"get/2","id":"get/2","title":"get(site_id, by)"},{"anchor":"list/1","id":"list/1","title":"list(site)"}]}],"sections":[],"title":"Plausible.Funnels"},{"group":"","id":"Plausible.Geo","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"await_loader/0","id":"await_loader/0","title":"await_loader()"},{"anchor":"database_type/0","id":"database_type/0","title":"database_type()"},{"anchor":"load_db/1","id":"load_db/1","title":"load_db(opts)"},{"anchor":"lookup/1","id":"lookup/1","title":"lookup(ip_address)"}]}],"sections":[],"title":"Plausible.Geo"},{"group":"","id":"Plausible.Goal","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"changeset/2","id":"changeset/2","title":"changeset(goal, attrs \\\\ %{})"},{"anchor":"currency_options/0","id":"currency_options/0","title":"currency_options()"},{"anchor":"revenue?/1","id":"revenue?/1","title":"revenue?(goal)"},{"anchor":"valid_currencies/0","id":"valid_currencies/0","title":"valid_currencies()"}]}],"sections":[],"title":"Plausible.Goal"},{"group":"","id":"Plausible.Goals","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"count/1","id":"count/1","title":"count(site)"},{"anchor":"create/3","id":"create/3","title":"create(site, params, now \\\\ DateTime.utc_now())"},{"anchor":"delete/2","id":"delete/2","title":"delete(id, site)"},{"anchor":"find_or_create/2","id":"find_or_create/2","title":"find_or_create(site, map)"},{"anchor":"for_site/2","id":"for_site/2","title":"for_site(site, opts \\\\ [])"}]}],"sections":[],"title":"Plausible.Goals"},{"group":"","id":"Plausible.Google.Api","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:google_analytics_view/0","id":"google_analytics_view/0","title":"google_analytics_view()"},{"anchor":"t:import_auth/0","id":"import_auth/0","title":"import_auth()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"fetch_and_persist/3","id":"fetch_and_persist/3","title":"fetch_and_persist(site, report_request, opts \\\\ [])"},{"anchor":"fetch_stats/3","id":"fetch_stats/3","title":"fetch_stats(site, map, limit)"},{"anchor":"fetch_verified_properties/1","id":"fetch_verified_properties/1","title":"fetch_verified_properties(auth)"},{"anchor":"get_view/2","id":"get_view/2","title":"get_view(access_token, lookup_id)"},{"anchor":"import_analytics/4","id":"import_analytics/4","title":"import_analytics(site, date_range, view_id, auth)"},{"anchor":"import_authorize_url/2","id":"import_authorize_url/2","title":"import_authorize_url(site_id, redirect_to)"},{"anchor":"list_views/1","id":"list_views/1","title":"list_views(access_token)"},{"anchor":"search_console_authorize_url/2","id":"search_console_authorize_url/2","title":"search_console_authorize_url(site_id, redirect_to)"}]}],"sections":[],"title":"Plausible.Google.Api"},{"group":"","id":"Plausible.Google.Api.Mock","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"fetch_stats/3","id":"fetch_stats/3","title":"fetch_stats(auth, query, limit)"}]}],"sections":[],"title":"Plausible.Google.Api.Mock"},{"group":"","id":"Plausible.Google.Buffer","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(init_arg)"},{"anchor":"flush/2","id":"flush/2","title":"flush(pid, timeout \\\\ :infinity)"},{"anchor":"handle_continue/2","id":"handle_continue/2","title":"handle_continue(arg, state)"},{"anchor":"init/1","id":"init/1","title":"init(opts)"},{"anchor":"insert_many/3","id":"insert_many/3","title":"insert_many(pid, table_name, records)"},{"anchor":"size/2","id":"size/2","title":"size(pid, table_name)"},{"anchor":"start_link/0","id":"start_link/0","title":"start_link()"},{"anchor":"stop/1","id":"stop/1","title":"stop(pid)"}]}],"sections":[],"title":"Plausible.Google.Buffer"},{"group":"","id":"Plausible.Google.HTTP","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"fetch_access_token/1","id":"fetch_access_token/1","title":"fetch_access_token(code)"},{"anchor":"get_analytics_start_date/2","id":"get_analytics_start_date/2","title":"get_analytics_start_date(view_id, access_token)"},{"anchor":"get_report/1","id":"get_report/1","title":"get_report(report_request)"},{"anchor":"list_sites/1","id":"list_sites/1","title":"list_sites(access_token)"},{"anchor":"list_stats/5","id":"list_stats/5","title":"list_stats(access_token, property, date_range, limit, page \\\\ nil)"},{"anchor":"list_views_for_user/1","id":"list_views_for_user/1","title":"list_views_for_user(access_token)"},{"anchor":"refresh_auth_token/1","id":"refresh_auth_token/1","title":"refresh_auth_token(refresh_token)"}]}],"sections":[],"title":"Plausible.Google.HTTP"},{"group":"","id":"Plausible.Google.ReportRequest","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"full_report/0","id":"full_report/0","title":"full_report()"}]}],"sections":[],"title":"Plausible.Google.ReportRequest"},{"group":"","id":"Plausible.HTTPClient","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"get/2","id":"get/2","title":"get(url, headers \\\\ [])"},{"anchor":"impl/0","id":"impl/0","title":"impl()"},{"anchor":"post/4","id":"post/4","title":"post(url, headers \\\\ [], params \\\\ nil, finch_req_opts \\\\ [])"}]}],"sections":[],"title":"Plausible.HTTPClient"},{"group":"","id":"Plausible.HTTPClient.Interface","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:finch_request_opts/0","id":"finch_request_opts/0","title":"finch_request_opts()"},{"anchor":"t:headers/0","id":"headers/0","title":"headers()"},{"anchor":"t:params/0","id":"params/0","title":"params()"},{"anchor":"t:response/0","id":"response/0","title":"response()"},{"anchor":"t:url/0","id":"url/0","title":"url()"}]},{"key":"callbacks","name":"Callbacks","nodes":[{"anchor":"c:get/1","id":"get/1","title":"get(url)"},{"anchor":"c:get/2","id":"get/2","title":"get(url, headers)"},{"anchor":"c:post/3","id":"post/3","title":"post(url, headers, params)"},{"anchor":"c:post/4","id":"post/4","title":"post(url, headers, params, finch_request_opts)"}]}],"sections":[],"title":"Plausible.HTTPClient.Interface"},{"group":"","id":"Plausible.HTTPClient.Non200Error","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"new/1","id":"new/1","title":"new(response)"}]}],"sections":[],"title":"Plausible.HTTPClient.Non200Error"},{"group":"","id":"Plausible.ImportDeletionRepo","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"aggregate/3","id":"aggregate/3","title":"aggregate(queryable, aggregate, opts \\\\ [])"},{"anchor":"aggregate/4","id":"aggregate/4","title":"aggregate(queryable, aggregate, field, opts)"},{"anchor":"all/2","id":"all/2","title":"all(queryable, opts \\\\ [])"},{"anchor":"checked_out?/0","id":"checked_out?/0","title":"checked_out?()"},{"anchor":"checkout/2","id":"checkout/2","title":"checkout(fun, opts \\\\ [])"},{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"},{"anchor":"config/0","id":"config/0","title":"config()"},{"anchor":"default_options/1","id":"default_options/1","title":"default_options(operation)"},{"anchor":"delete/2","id":"delete/2","title":"delete(struct, opts \\\\ [])"},{"anchor":"delete!/2","id":"delete!/2","title":"delete!(struct, opts \\\\ [])"},{"anchor":"delete_all/2","id":"delete_all/2","title":"delete_all(queryable, opts \\\\ [])"},{"anchor":"disconnect_all/2","id":"disconnect_all/2","title":"disconnect_all(interval, opts \\\\ [])"},{"anchor":"exists?/2","id":"exists?/2","title":"exists?(queryable, opts \\\\ [])"},{"anchor":"get/3","id":"get/3","title":"get(queryable, id, opts \\\\ [])"},{"anchor":"get!/3","id":"get!/3","title":"get!(queryable, id, opts \\\\ [])"},{"anchor":"get_by/3","id":"get_by/3","title":"get_by(queryable, clauses, opts \\\\ [])"},{"anchor":"get_by!/3","id":"get_by!/3","title":"get_by!(queryable, clauses, opts \\\\ [])"},{"anchor":"get_dynamic_repo/0","id":"get_dynamic_repo/0","title":"get_dynamic_repo()"},{"anchor":"insert/2","id":"insert/2","title":"insert(struct, opts \\\\ [])"},{"anchor":"insert!/2","id":"insert!/2","title":"insert!(struct, opts \\\\ [])"},{"anchor":"insert_all/3","id":"insert_all/3","title":"insert_all(schema_or_source, entries, opts \\\\ [])"},{"anchor":"insert_or_update/2","id":"insert_or_update/2","title":"insert_or_update(changeset, opts \\\\ [])"},{"anchor":"insert_or_update!/2","id":"insert_or_update!/2","title":"insert_or_update!(changeset, opts \\\\ [])"},{"anchor":"insert_stream/3","id":"insert_stream/3","title":"insert_stream(source_or_schema, rows, opts \\\\ [])"},{"anchor":"load/2","id":"load/2","title":"load(schema_or_types, data)"},{"anchor":"one/2","id":"one/2","title":"one(queryable, opts \\\\ [])"},{"anchor":"one!/2","id":"one!/2","title":"one!(queryable, opts \\\\ [])"},{"anchor":"preload/3","id":"preload/3","title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])"},{"anchor":"prepare_query/3","id":"prepare_query/3","title":"prepare_query(operation, query, opts)"},{"anchor":"put_dynamic_repo/1","id":"put_dynamic_repo/1","title":"put_dynamic_repo(dynamic)"},{"anchor":"query/3","id":"query/3","title":"query(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"query!/3","id":"query!/3","title":"query!(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"reload/2","id":"reload/2","title":"reload(queryable, opts \\\\ [])"},{"anchor":"reload!/2","id":"reload!/2","title":"reload!(queryable, opts \\\\ [])"},{"anchor":"start_link/1","id":"start_link/1","title":"start_link(opts \\\\ [])"},{"anchor":"stop/1","id":"stop/1","title":"stop(timeout \\\\ 5000)"},{"anchor":"stream/2","id":"stream/2","title":"stream(queryable, opts \\\\ [])"},{"anchor":"to_sql/2","id":"to_sql/2","title":"to_sql(operation, queryable)"},{"anchor":"update/2","id":"update/2","title":"update(struct, opts \\\\ [])"},{"anchor":"update!/2","id":"update!/2","title":"update!(struct, opts \\\\ [])"},{"anchor":"update_all/3","id":"update_all/3","title":"update_all(queryable, updates, opts \\\\ [])"}]}],"sections":[],"title":"Plausible.ImportDeletionRepo"},{"group":"","id":"Plausible.Imported","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"forget/1","id":"forget/1","title":"forget(site)"},{"anchor":"from_google_analytics/3","id":"from_google_analytics/3","title":"from_google_analytics(data, site_id, table)"},{"anchor":"tables/0","id":"tables/0","title":"tables()"}]}],"sections":[],"title":"Plausible.Imported"},{"group":"","id":"Plausible.IngestRepo","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"aggregate/3","id":"aggregate/3","title":"aggregate(queryable, aggregate, opts \\\\ [])"},{"anchor":"aggregate/4","id":"aggregate/4","title":"aggregate(queryable, aggregate, field, opts)"},{"anchor":"all/2","id":"all/2","title":"all(queryable, opts \\\\ [])"},{"anchor":"checked_out?/0","id":"checked_out?/0","title":"checked_out?()"},{"anchor":"checkout/2","id":"checkout/2","title":"checkout(fun, opts \\\\ [])"},{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"},{"anchor":"config/0","id":"config/0","title":"config()"},{"anchor":"default_options/1","id":"default_options/1","title":"default_options(operation)"},{"anchor":"delete/2","id":"delete/2","title":"delete(struct, opts \\\\ [])"},{"anchor":"delete!/2","id":"delete!/2","title":"delete!(struct, opts \\\\ [])"},{"anchor":"delete_all/2","id":"delete_all/2","title":"delete_all(queryable, opts \\\\ [])"},{"anchor":"disconnect_all/2","id":"disconnect_all/2","title":"disconnect_all(interval, opts \\\\ [])"},{"anchor":"exists?/2","id":"exists?/2","title":"exists?(queryable, opts \\\\ [])"},{"anchor":"get/3","id":"get/3","title":"get(queryable, id, opts \\\\ [])"},{"anchor":"get!/3","id":"get!/3","title":"get!(queryable, id, opts \\\\ [])"},{"anchor":"get_by/3","id":"get_by/3","title":"get_by(queryable, clauses, opts \\\\ [])"},{"anchor":"get_by!/3","id":"get_by!/3","title":"get_by!(queryable, clauses, opts \\\\ [])"},{"anchor":"get_dynamic_repo/0","id":"get_dynamic_repo/0","title":"get_dynamic_repo()"},{"anchor":"insert/2","id":"insert/2","title":"insert(struct, opts \\\\ [])"},{"anchor":"insert!/2","id":"insert!/2","title":"insert!(struct, opts \\\\ [])"},{"anchor":"insert_all/3","id":"insert_all/3","title":"insert_all(schema_or_source, entries, opts \\\\ [])"},{"anchor":"insert_or_update/2","id":"insert_or_update/2","title":"insert_or_update(changeset, opts \\\\ [])"},{"anchor":"insert_or_update!/2","id":"insert_or_update!/2","title":"insert_or_update!(changeset, opts \\\\ [])"},{"anchor":"insert_stream/3","id":"insert_stream/3","title":"insert_stream(source_or_schema, rows, opts \\\\ [])"},{"anchor":"load/2","id":"load/2","title":"load(schema_or_types, data)"},{"anchor":"one/2","id":"one/2","title":"one(queryable, opts \\\\ [])"},{"anchor":"one!/2","id":"one!/2","title":"one!(queryable, opts \\\\ [])"},{"anchor":"preload/3","id":"preload/3","title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])"},{"anchor":"prepare_query/3","id":"prepare_query/3","title":"prepare_query(operation, query, opts)"},{"anchor":"put_dynamic_repo/1","id":"put_dynamic_repo/1","title":"put_dynamic_repo(dynamic)"},{"anchor":"query/3","id":"query/3","title":"query(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"query!/3","id":"query!/3","title":"query!(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"reload/2","id":"reload/2","title":"reload(queryable, opts \\\\ [])"},{"anchor":"reload!/2","id":"reload!/2","title":"reload!(queryable, opts \\\\ [])"},{"anchor":"start_link/1","id":"start_link/1","title":"start_link(opts \\\\ [])"},{"anchor":"stop/1","id":"stop/1","title":"stop(timeout \\\\ 5000)"},{"anchor":"stream/2","id":"stream/2","title":"stream(queryable, opts \\\\ [])"},{"anchor":"to_sql/2","id":"to_sql/2","title":"to_sql(operation, queryable)"},{"anchor":"update/2","id":"update/2","title":"update(struct, opts \\\\ [])"},{"anchor":"update!/2","id":"update!/2","title":"update!(struct, opts \\\\ [])"},{"anchor":"update_all/3","id":"update_all/3","title":"update_all(queryable, updates, opts \\\\ [])"}]}],"sections":[],"title":"Plausible.IngestRepo"},{"group":"","id":"Plausible.Ingestion.Counters","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"},{"anchor":"enabled?/0","id":"enabled?/0","title":"enabled?()"},{"anchor":"stop/1","id":"stop/1","title":"stop(pid)"}]}],"sections":[],"title":"Plausible.Ingestion.Counters"},{"group":"","id":"Plausible.Ingestion.Counters.Buffer","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:bucket_fn_opt/0","id":"bucket_fn_opt/0","title":"bucket_fn_opt()"},{"anchor":"t:t/0","id":"t/0","title":"t()"},{"anchor":"t:unix_timestamp/0","id":"unix_timestamp/0","title":"unix_timestamp()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"aggregate/4","id":"aggregate/4","title":"aggregate(buffer, metric, domain, timestamp)"},{"anchor":"bucket_10s/1","id":"bucket_10s/1","title":"bucket_10s(datetime)"},{"anchor":"flush/2","id":"flush/2","title":"flush(buffer, now \\\\ DateTime.utc_now())"},{"anchor":"new/2","id":"new/2","title":"new(buffer_name, opts \\\\ [])"},{"anchor":"previous_10s/1","id":"previous_10s/1","title":"previous_10s(datetime)"}]}],"sections":[],"title":"Plausible.Ingestion.Counters.Buffer"},{"group":"","id":"Plausible.Ingestion.Counters.Record","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]}],"sections":[],"title":"Plausible.Ingestion.Counters.Record"},{"group":"","id":"Plausible.Ingestion.Counters.TelemetryHandler","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"handle_event/4","id":"handle_event/4","title":"handle_event(list, measurements, map, buffer)"},{"anchor":"install/1","id":"install/1","title":"install(buffer)"}]}],"sections":[],"title":"Plausible.Ingestion.Counters.TelemetryHandler"},{"group":"","id":"Plausible.Ingestion.Event","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:drop_reason/0","id":"drop_reason/0","title":"drop_reason()"},{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"build_and_buffer/1","id":"build_and_buffer/1","title":"build_and_buffer(request)"},{"anchor":"emit_telemetry_buffered/1","id":"emit_telemetry_buffered/1","title":"emit_telemetry_buffered(event)"},{"anchor":"emit_telemetry_dropped/2","id":"emit_telemetry_dropped/2","title":"emit_telemetry_dropped(event, reason)"},{"anchor":"telemetry_event_buffered/0","id":"telemetry_event_buffered/0","title":"telemetry_event_buffered()"},{"anchor":"telemetry_event_dropped/0","id":"telemetry_event_dropped/0","title":"telemetry_event_dropped()"}]}],"sections":[],"title":"Plausible.Ingestion.Event"},{"group":"","id":"Plausible.Ingestion.Request","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"build/2","id":"build/2","title":"build(conn, now \\\\ NaiveDateTime.utc_now())"},{"anchor":"sanitize_hostname/1","id":"sanitize_hostname/1","title":"sanitize_hostname(hostname)"}]}],"sections":[],"title":"Plausible.Ingestion.Request"},{"group":"","id":"Plausible.Mailer","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"deliver/1","id":"deliver/1","title":"deliver(email)"},{"anchor":"deliver_later/2","id":"deliver_later/2","title":"deliver_later(email, opts \\\\ [])"},{"anchor":"deliver_later!/2","id":"deliver_later!/2","title":"deliver_later!(email, opts \\\\ [])"},{"anchor":"deliver_now/2","id":"deliver_now/2","title":"deliver_now(email, opts \\\\ [])"},{"anchor":"deliver_now!/2","id":"deliver_now!/2","title":"deliver_now!(email, opts \\\\ [])"},{"anchor":"send/1","id":"send/1","title":"send(email)"}]}],"sections":[],"title":"Plausible.Mailer"},{"group":"","id":"Plausible.OpenTelemetry.Sampler","sections":[],"title":"Plausible.OpenTelemetry.Sampler"},{"group":"","id":"Plausible.PaddleApi.Mock","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"get_invoices/1","id":"get_invoices/1","title":"get_invoices(subscription)"},{"anchor":"get_subscription/1","id":"get_subscription/1","title":"get_subscription(_)"},{"anchor":"update_subscription/2","id":"update_subscription/2","title":"update_subscription(_, map)"}]}],"sections":[],"title":"Plausible.PaddleApi.Mock"},{"group":"","id":"Plausible.PromEx","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(init_arg)"}]}],"sections":[],"title":"Plausible.PromEx"},{"group":"","id":"Plausible.PromEx.Plugins.PlausibleMetrics","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"execute_cache_metrics/0","id":"execute_cache_metrics/0","title":"execute_cache_metrics()"},{"anchor":"execute_write_buffer_metrics/0","id":"execute_write_buffer_metrics/0","title":"execute_write_buffer_metrics()"}]}],"sections":[],"title":"Plausible.PromEx.Plugins.PlausibleMetrics"},{"group":"","id":"Plausible.Purge","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"delete_imported_stats!/1","id":"delete_imported_stats!/1","title":"delete_imported_stats!(site)"},{"anchor":"delete_native_stats!/1","id":"delete_native_stats!/1","title":"delete_native_stats!(site)"},{"anchor":"reset!/1","id":"reset!/1","title":"reset!(site)"}]}],"sections":[],"title":"Plausible.Purge"},{"group":"","id":"Plausible.Release","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"configure_ref_inspector/0","id":"configure_ref_inspector/0","title":"configure_ref_inspector()"},{"anchor":"configure_ua_inspector/0","id":"configure_ua_inspector/0","title":"configure_ua_inspector()"},{"anchor":"createdb/0","id":"createdb/0","title":"createdb()"},{"anchor":"migrate/0","id":"migrate/0","title":"migrate()"},{"anchor":"rollback/0","id":"rollback/0","title":"rollback()"},{"anchor":"seed/0","id":"seed/0","title":"seed()"},{"anchor":"selfhost?/0","id":"selfhost?/0","title":"selfhost?()"},{"anchor":"should_be_first_launch?/0","id":"should_be_first_launch?/0","title":"should_be_first_launch?()"}]}],"sections":[],"title":"Plausible.Release"},{"group":"","id":"Plausible.Repo","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"aggregate/3","id":"aggregate/3","title":"aggregate(queryable, aggregate, opts \\\\ [])"},{"anchor":"aggregate/4","id":"aggregate/4","title":"aggregate(queryable, aggregate, field, opts)"},{"anchor":"all/2","id":"all/2","title":"all(queryable, opts \\\\ [])"},{"anchor":"checked_out?/0","id":"checked_out?/0","title":"checked_out?()"},{"anchor":"checkout/2","id":"checkout/2","title":"checkout(fun, opts \\\\ [])"},{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"},{"anchor":"config/0","id":"config/0","title":"config()"},{"anchor":"default_options/1","id":"default_options/1","title":"default_options(operation)"},{"anchor":"delete/2","id":"delete/2","title":"delete(struct, opts \\\\ [])"},{"anchor":"delete!/2","id":"delete!/2","title":"delete!(struct, opts \\\\ [])"},{"anchor":"delete_all/2","id":"delete_all/2","title":"delete_all(queryable, opts \\\\ [])"},{"anchor":"disconnect_all/2","id":"disconnect_all/2","title":"disconnect_all(interval, opts \\\\ [])"},{"anchor":"exists?/2","id":"exists?/2","title":"exists?(queryable, opts \\\\ [])"},{"anchor":"explain/3","id":"explain/3","title":"explain(operation, queryable, opts \\\\ [])"},{"anchor":"get/3","id":"get/3","title":"get(queryable, id, opts \\\\ [])"},{"anchor":"get!/3","id":"get!/3","title":"get!(queryable, id, opts \\\\ [])"},{"anchor":"get_by/3","id":"get_by/3","title":"get_by(queryable, clauses, opts \\\\ [])"},{"anchor":"get_by!/3","id":"get_by!/3","title":"get_by!(queryable, clauses, opts \\\\ [])"},{"anchor":"get_dynamic_repo/0","id":"get_dynamic_repo/0","title":"get_dynamic_repo()"},{"anchor":"in_transaction?/0","id":"in_transaction?/0","title":"in_transaction?()"},{"anchor":"insert/2","id":"insert/2","title":"insert(struct, opts \\\\ [])"},{"anchor":"insert!/2","id":"insert!/2","title":"insert!(struct, opts \\\\ [])"},{"anchor":"insert_all/3","id":"insert_all/3","title":"insert_all(schema_or_source, entries, opts \\\\ [])"},{"anchor":"insert_or_update/2","id":"insert_or_update/2","title":"insert_or_update(changeset, opts \\\\ [])"},{"anchor":"insert_or_update!/2","id":"insert_or_update!/2","title":"insert_or_update!(changeset, opts \\\\ [])"},{"anchor":"load/2","id":"load/2","title":"load(schema_or_types, data)"},{"anchor":"one/2","id":"one/2","title":"one(queryable, opts \\\\ [])"},{"anchor":"one!/2","id":"one!/2","title":"one!(queryable, opts \\\\ [])"},{"anchor":"paginate/3","id":"paginate/3","title":"paginate(query, params \\\\ %{}, options \\\\ [])"},{"anchor":"preload/3","id":"preload/3","title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])"},{"anchor":"prepare_query/3","id":"prepare_query/3","title":"prepare_query(operation, query, opts)"},{"anchor":"put_dynamic_repo/1","id":"put_dynamic_repo/1","title":"put_dynamic_repo(dynamic)"},{"anchor":"query/3","id":"query/3","title":"query(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"query!/3","id":"query!/3","title":"query!(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"query_many/3","id":"query_many/3","title":"query_many(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"query_many!/3","id":"query_many!/3","title":"query_many!(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"reload/2","id":"reload/2","title":"reload(queryable, opts \\\\ [])"},{"anchor":"reload!/2","id":"reload!/2","title":"reload!(queryable, opts \\\\ [])"},{"anchor":"rollback/1","id":"rollback/1","title":"rollback(value)"},{"anchor":"start_link/1","id":"start_link/1","title":"start_link(opts \\\\ [])"},{"anchor":"stop/1","id":"stop/1","title":"stop(timeout \\\\ 5000)"},{"anchor":"stream/2","id":"stream/2","title":"stream(queryable, opts \\\\ [])"},{"anchor":"to_sql/2","id":"to_sql/2","title":"to_sql(operation, queryable)"},{"anchor":"transaction/2","id":"transaction/2","title":"transaction(fun_or_multi, opts \\\\ [])"},{"anchor":"update/2","id":"update/2","title":"update(struct, opts \\\\ [])"},{"anchor":"update!/2","id":"update!/2","title":"update!(struct, opts \\\\ [])"},{"anchor":"update_all/3","id":"update_all/3","title":"update_all(queryable, updates, opts \\\\ [])"}]}],"sections":[],"title":"Plausible.Repo"},{"group":"","id":"Plausible.Sentry.Client","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"child_spec/0","id":"child_spec/0","title":"child_spec()"},{"anchor":"post/3","id":"post/3","title":"post(url, headers, body)"}]}],"sections":[],"title":"Plausible.Sentry.Client"},{"group":"","id":"Plausible.SentryFilter","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"before_send/1","id":"before_send/1","title":"before_send(event)"},{"anchor":"exclude_exception?/2","id":"exclude_exception?/2","title":"exclude_exception?(exception, source)"}]}],"sections":[],"title":"Plausible.SentryFilter"},{"group":"","id":"Plausible.Session.CacheStore","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"on_event/3","id":"on_event/3","title":"on_event(event, prev_user_id, buffer \\\\ WriteBuffer)"}]}],"sections":[],"title":"Plausible.Session.CacheStore"},{"group":"","id":"Plausible.Session.Salts","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(arg)"},{"anchor":"fetch/0","id":"fetch/0","title":"fetch()"},{"anchor":"rotate/0","id":"rotate/0","title":"rotate()"},{"anchor":"start_link/1","id":"start_link/1","title":"start_link(opts)"}]}],"sections":[],"title":"Plausible.Session.Salts"},{"group":"","id":"Plausible.Session.WriteBuffer","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(init_arg)"},{"anchor":"flush/0","id":"flush/0","title":"flush()"},{"anchor":"init/1","id":"init/1","title":"init(buffer)"},{"anchor":"insert/1","id":"insert/1","title":"insert(sessions)"},{"anchor":"start_link/1","id":"start_link/1","title":"start_link(opts)"}]}],"sections":[],"title":"Plausible.Session.WriteBuffer"},{"group":"","id":"Plausible.Site","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"changeset/2","id":"changeset/2","title":"changeset(site, attrs \\\\ %{})"},{"anchor":"crm_changeset/2","id":"crm_changeset/2","title":"crm_changeset(site, attrs)"},{"anchor":"feature_toggle_change/3","id":"feature_toggle_change/3","title":"feature_toggle_change(site, property, opts \\\\ [])"},{"anchor":"import_failure/1","id":"import_failure/1","title":"import_failure(site)"},{"anchor":"import_success/1","id":"import_success/1","title":"import_success(site)"},{"anchor":"local_start_date/1","id":"local_start_date/1","title":"local_start_date(site)"},{"anchor":"make_private/1","id":"make_private/1","title":"make_private(site)"},{"anchor":"make_public/1","id":"make_public/1","title":"make_public(site)"},{"anchor":"remove_imported_data/1","id":"remove_imported_data/1","title":"remove_imported_data(site)"},{"anchor":"set_allowed_event_props/2","id":"set_allowed_event_props/2","title":"set_allowed_event_props(site, list)"},{"anchor":"set_imported_source/2","id":"set_imported_source/2","title":"set_imported_source(site, imported_source)"},{"anchor":"set_native_stats_start_at/2","id":"set_native_stats_start_at/2","title":"set_native_stats_start_at(site, val)"},{"anchor":"set_stats_start_date/2","id":"set_stats_start_date/2","title":"set_stats_start_date(site, val)"},{"anchor":"start_import/5","id":"start_import/5","title":"start_import(site, start_date, end_date, imported_source, status \\\\ \"importing\")"},{"anchor":"tz_offset/2","id":"tz_offset/2","title":"tz_offset(site, utc_now \\\\ DateTime.utc_now())"},{"anchor":"update_changeset/3","id":"update_changeset/3","title":"update_changeset(site, attrs \\\\ %{}, opts \\\\ [])"}]}],"sections":[],"title":"Plausible.Site"},{"group":"","id":"Plausible.Site.Cache","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"},{"anchor":"enabled?/0","id":"enabled?/0","title":"enabled?()"},{"anchor":"get/2","id":"get/2","title":"get(domain, opts \\\\ [])"},{"anchor":"get_site_id/2","id":"get_site_id/2","title":"get_site_id(domain, opts \\\\ [])"},{"anchor":"hit_rate/1","id":"hit_rate/1","title":"hit_rate(cache_name \\\\ :sites_by_domain)"},{"anchor":"merge/2","id":"merge/2","title":"merge(new_items, opts \\\\ [])"},{"anchor":"name/0","id":"name/0","title":"name()"},{"anchor":"ready?/1","id":"ready?/1","title":"ready?(cache_name \\\\ :sites_by_domain)"},{"anchor":"refresh_all/1","id":"refresh_all/1","title":"refresh_all(opts \\\\ [])"},{"anchor":"refresh_updated_recently/1","id":"refresh_updated_recently/1","title":"refresh_updated_recently(opts \\\\ [])"},{"anchor":"size/1","id":"size/1","title":"size(cache_name \\\\ :sites_by_domain)"},{"anchor":"telemetry_event_refresh/2","id":"telemetry_event_refresh/2","title":"telemetry_event_refresh(cache_name \\\\ :sites_by_domain, mode)"}]}],"sections":[],"title":"Plausible.Site.Cache"},{"group":"","id":"Plausible.Site.Cache.Warmer","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"},{"anchor":"interval/0","id":"interval/0","title":"interval()"}]}],"sections":[],"title":"Plausible.Site.Cache.Warmer"},{"group":"","id":"Plausible.Site.Cache.Warmer.All","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"}]}],"sections":[],"title":"Plausible.Site.Cache.Warmer.All"},{"group":"","id":"Plausible.Site.Cache.Warmer.RecentlyUpdated","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"}]}],"sections":[],"title":"Plausible.Site.Cache.Warmer.RecentlyUpdated"},{"group":"","id":"Plausible.Site.CustomDomain","sections":[],"title":"Plausible.Site.CustomDomain"},{"group":"","id":"Plausible.Site.Domain","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"change/3","id":"change/3","title":"change(site, new_domain, opts \\\\ [])"},{"anchor":"expire_change_transitions/1","id":"expire_change_transitions/1","title":"expire_change_transitions(expire_threshold_hours \\\\ 72)"}]}],"sections":[],"title":"Plausible.Site.Domain"},{"group":"","id":"Plausible.Site.GateKeeper","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:policy/0","id":"policy/0","title":"policy()"},{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"check/2","id":"check/2","title":"check(domain, opts \\\\ [])"},{"anchor":"key/1","id":"key/1","title":"key(domain)"}]}],"sections":[],"title":"Plausible.Site.GateKeeper"},{"group":"","id":"Plausible.Site.GoogleAuth","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"changeset/2","id":"changeset/2","title":"changeset(auth, attrs \\\\ %{})"},{"anchor":"set_property/2","id":"set_property/2","title":"set_property(auth, attrs \\\\ %{})"}]}],"sections":[],"title":"Plausible.Site.GoogleAuth"},{"group":"","id":"Plausible.Site.ImportedData","sections":[],"title":"Plausible.Site.ImportedData"},{"group":"","id":"Plausible.Site.Membership","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"changeset/2","id":"changeset/2","title":"changeset(schema, attrs)"}]}],"sections":[],"title":"Plausible.Site.Membership"},{"group":"","id":"Plausible.Site.MonthlyReport","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"add_recipient/2","id":"add_recipient/2","title":"add_recipient(report, recipient)"},{"anchor":"changeset/2","id":"changeset/2","title":"changeset(settings, attrs \\\\ %{})"},{"anchor":"remove_recipient/2","id":"remove_recipient/2","title":"remove_recipient(report, recipient)"}]}],"sections":[],"title":"Plausible.Site.MonthlyReport"},{"group":"","id":"Plausible.Site.Removal","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"run/1","id":"run/1","title":"run(domain)"}]}],"sections":[],"title":"Plausible.Site.Removal"},{"group":"","id":"Plausible.Site.SharedLink","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"changeset/2","id":"changeset/2","title":"changeset(link, attrs \\\\ %{})"}]}],"sections":[],"title":"Plausible.Site.SharedLink"},{"group":"","id":"Plausible.Site.SpikeNotification","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"add_recipient/2","id":"add_recipient/2","title":"add_recipient(schema, recipient)"},{"anchor":"changeset/2","id":"changeset/2","title":"changeset(schema, attrs)"},{"anchor":"remove_recipient/2","id":"remove_recipient/2","title":"remove_recipient(schema, recipient)"},{"anchor":"was_sent/1","id":"was_sent/1","title":"was_sent(schema)"}]}],"sections":[],"title":"Plausible.Site.SpikeNotification"},{"group":"","id":"Plausible.Site.WeeklyReport","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"add_recipient/2","id":"add_recipient/2","title":"add_recipient(report, recipient)"},{"anchor":"changeset/2","id":"changeset/2","title":"changeset(settings, attrs \\\\ %{})"},{"anchor":"remove_recipient/2","id":"remove_recipient/2","title":"remove_recipient(report, recipient)"}]}],"sections":[],"title":"Plausible.Site.WeeklyReport"},{"group":"","id":"Plausible.SiteAdmin","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"create_changeset/2","id":"create_changeset/2","title":"create_changeset(schema, attrs)"},{"anchor":"custom_index_query/3","id":"custom_index_query/3","title":"custom_index_query(conn, schema, query)"},{"anchor":"form_fields/1","id":"form_fields/1","title":"form_fields(_)"},{"anchor":"get_struct_fields/1","id":"get_struct_fields/1","title":"get_struct_fields(module)"},{"anchor":"index/1","id":"index/1","title":"index(_)"},{"anchor":"list_actions/1","id":"list_actions/1","title":"list_actions(conn)"},{"anchor":"ordering/1","id":"ordering/1","title":"ordering(schema)"},{"anchor":"search_fields/1","id":"search_fields/1","title":"search_fields(schema)"},{"anchor":"set_allowed_props_for_site/3","id":"set_allowed_props_for_site/3","title":"set_allowed_props_for_site(arg1, arg2, params)"},{"anchor":"update_changeset/2","id":"update_changeset/2","title":"update_changeset(schema, attrs)"}]}],"sections":[],"title":"Plausible.SiteAdmin"},{"group":"","id":"Plausible.Sites","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"create/2","id":"create/2","title":"create(user, params)"},{"anchor":"create_shared_link/3","id":"create_shared_link/3","title":"create_shared_link(site, name, password \\\\ nil)"},{"anchor":"get_by_domain/1","id":"get_by_domain/1","title":"get_by_domain(domain)"},{"anchor":"get_for_user/3","id":"get_for_user/3","title":"get_for_user(user_id, domain, roles \\\\ [:owner, :admin, :viewer])"},{"anchor":"get_for_user!/3","id":"get_for_user!/3","title":"get_for_user!(user_id, domain, roles \\\\ [:owner, :admin, :viewer])"},{"anchor":"has_admin_access?/2","id":"has_admin_access?/2","title":"has_admin_access?(user_id, site)"},{"anchor":"has_goals?/1","id":"has_goals?/1","title":"has_goals?(site)"},{"anchor":"has_stats?/1","id":"has_stats?/1","title":"has_stats?(site)"},{"anchor":"is_member?/2","id":"is_member?/2","title":"is_member?(user_id, site)"},{"anchor":"locked?/1","id":"locked?/1","title":"locked?(site)"},{"anchor":"owned_site_ids/1","id":"owned_site_ids/1","title":"owned_site_ids(user)"},{"anchor":"owned_sites_count/1","id":"owned_sites_count/1","title":"owned_sites_count(user)"},{"anchor":"owned_sites_domains/1","id":"owned_sites_domains/1","title":"owned_sites_domains(user)"},{"anchor":"owner_for/1","id":"owner_for/1","title":"owner_for(site)"},{"anchor":"role/2","id":"role/2","title":"role(user_id, site)"},{"anchor":"shared_link_url/2","id":"shared_link_url/2","title":"shared_link_url(site, link)"},{"anchor":"stats_start_date/1","id":"stats_start_date/1","title":"stats_start_date(site)"}]}],"sections":[],"title":"Plausible.Sites"},{"group":"","id":"Plausible.Stats","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"aggregate/3","id":"aggregate/3","title":"aggregate(site, query, metrics)"},{"anchor":"breakdown/5","id":"breakdown/5","title":"breakdown(site, query, prop, metrics, pagination)"},{"anchor":"current_visitors/1","id":"current_visitors/1","title":"current_visitors(site)"},{"anchor":"filter_suggestions/4","id":"filter_suggestions/4","title":"filter_suggestions(site, query, filter_name, filter_search)"},{"anchor":"funnel/3","id":"funnel/3","title":"funnel(site, query, funnel)"},{"anchor":"timeseries/3","id":"timeseries/3","title":"timeseries(site, query, metrics)"}]}],"sections":[],"title":"Plausible.Stats"},{"group":"","id":"Plausible.Stats.Aggregate","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"aggregate/3","id":"aggregate/3","title":"aggregate(site, query, metrics)"}]}],"sections":[],"title":"Plausible.Stats.Aggregate"},{"group":"","id":"Plausible.Stats.Base","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"apply_entry_prop_filter/3","id":"apply_entry_prop_filter/3","title":"apply_entry_prop_filter(sessions_q, prop_name, arg3)"},{"anchor":"base_event_query/2","id":"base_event_query/2","title":"base_event_query(site, query)"},{"anchor":"filter_by_entry_props/2","id":"filter_by_entry_props/2","title":"filter_by_entry_props(sessions_q, query)"},{"anchor":"filter_converted_sessions/3","id":"filter_converted_sessions/3","title":"filter_converted_sessions(db_query, site, query)"},{"anchor":"page_regex/1","id":"page_regex/1","title":"page_regex(expr)"},{"anchor":"query_events/2","id":"query_events/2","title":"query_events(site, query)"},{"anchor":"query_sessions/2","id":"query_sessions/2","title":"query_sessions(site, query)"},{"anchor":"select_event_metrics/2","id":"select_event_metrics/2","title":"select_event_metrics(q, list)"},{"anchor":"select_session_metrics/3","id":"select_session_metrics/3","title":"select_session_metrics(q, list, query)"},{"anchor":"utc_boundaries/2","id":"utc_boundaries/2","title":"utc_boundaries(query, site)"}]}],"sections":[],"title":"Plausible.Stats.Base"},{"group":"","id":"Plausible.Stats.Breakdown","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"breakdown/5","id":"breakdown/5","title":"breakdown(site, query, property, metrics, pagination)"}]}],"sections":[],"title":"Plausible.Stats.Breakdown"},{"group":"","id":"Plausible.Stats.Clickhouse","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"current_visitors/2","id":"current_visitors/2","title":"current_visitors(site, query)"},{"anchor":"has_pageviews?/1","id":"has_pageviews?/1","title":"has_pageviews?(site)"},{"anchor":"imported_pageview_count/1","id":"imported_pageview_count/1","title":"imported_pageview_count(site)"},{"anchor":"last_24h_visitors/1","id":"last_24h_visitors/1","title":"last_24h_visitors(sites)"},{"anchor":"pageview_start_date_local/1","id":"pageview_start_date_local/1","title":"pageview_start_date_local(site)"},{"anchor":"top_sources/6","id":"top_sources/6","title":"top_sources(site, query, limit, page, show_noref \\\\ false, include_details)"},{"anchor":"usage_breakdown/1","id":"usage_breakdown/1","title":"usage_breakdown(domains_or_site_ids)"},{"anchor":"usage_breakdown/2","id":"usage_breakdown/2","title":"usage_breakdown(domains, date_range)"}]}],"sections":[],"title":"Plausible.Stats.Clickhouse"},{"group":"","id":"Plausible.Stats.Compare","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"calculate_change/3","id":"calculate_change/3","title":"calculate_change(metric, old_stats, new_stats)"}]}],"sections":[],"title":"Plausible.Stats.Compare"},{"group":"","id":"Plausible.Stats.Comparisons","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:mode/0","id":"mode/0","title":"mode()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"compare/4","id":"compare/4","title":"compare(site, source_query, mode, opts \\\\ [])"}]}],"sections":[],"title":"Plausible.Stats.Comparisons"},{"group":"","id":"Plausible.Stats.CurrentVisitors","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"current_visitors/1","id":"current_visitors/1","title":"current_visitors(site)"}]}],"sections":[],"title":"Plausible.Stats.CurrentVisitors"},{"group":"","id":"Plausible.Stats.CustomProps","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"maybe_allowed_props_only/2","id":"maybe_allowed_props_only/2","title":"maybe_allowed_props_only(q, allowed_props)"},{"anchor":"props_for_all_event_names/2","id":"props_for_all_event_names/2","title":"props_for_all_event_names(site, query)"},{"anchor":"props_for_goal/2","id":"props_for_goal/2","title":"props_for_goal(site, query)"}]}],"sections":[],"title":"Plausible.Stats.CustomProps"},{"group":"","id":"Plausible.Stats.FilterParser","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"parse_filters/1","id":"parse_filters/1","title":"parse_filters(filters)"}]}],"sections":[],"title":"Plausible.Stats.FilterParser"},{"group":"","id":"Plausible.Stats.FilterSuggestions","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"filter_suggestions/4","id":"filter_suggestions/4","title":"filter_suggestions(site, query, filter_name, filter_search)"}]}],"sections":[],"title":"Plausible.Stats.FilterSuggestions"},{"group":"","id":"Plausible.Stats.Filters","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"add_prefix/1","id":"add_prefix/1","title":"add_prefix(query)"},{"anchor":"visit_props/0","id":"visit_props/0","title":"visit_props()"}]}],"sections":[],"title":"Plausible.Stats.Filters"},{"group":"","id":"Plausible.Stats.Fragments","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"bounce_rate/0","id":"bounce_rate/0","title":"bounce_rate()"},{"anchor":"coalesce_string/2","id":"coalesce_string/2","title":"coalesce_string(fieldA, fieldB)"},{"anchor":"sample_percent/0","id":"sample_percent/0","title":"sample_percent()"},{"anchor":"to_timezone/2","id":"to_timezone/2","title":"to_timezone(date, timezone)"},{"anchor":"total/0","id":"total/0","title":"total()"},{"anchor":"uniq/1","id":"uniq/1","title":"uniq(user_id)"},{"anchor":"visit_duration/0","id":"visit_duration/0","title":"visit_duration()"},{"anchor":"weekstart_not_before/2","id":"weekstart_not_before/2","title":"weekstart_not_before(date, not_before)"},{"anchor":"weekstart_not_before/3","id":"weekstart_not_before/3","title":"weekstart_not_before(date, not_before, timezone)"}]}],"sections":[],"title":"Plausible.Stats.Fragments"},{"group":"","id":"Plausible.Stats.Funnel","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"funnel/3","id":"funnel/3","title":"funnel(site, query, funnel_id)"}]}],"sections":[],"title":"Plausible.Stats.Funnel"},{"group":"","id":"Plausible.Stats.Imported","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"merge_imported/5","id":"merge_imported/5","title":"merge_imported(q, site, query, property, metrics)"},{"anchor":"merge_imported_timeseries/4","id":"merge_imported_timeseries/4","title":"merge_imported_timeseries(native_q, site, query, metrics)"}]}],"sections":[],"title":"Plausible.Stats.Imported"},{"group":"","id":"Plausible.Stats.Interval","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"default_for_date_range/1","id":"default_for_date_range/1","title":"default_for_date_range(range)"},{"anchor":"default_for_period/1","id":"default_for_period/1","title":"default_for_period(period)"},{"anchor":"list/0","id":"list/0","title":"list()"},{"anchor":"valid?/1","id":"valid?/1","title":"valid?(interval)"},{"anchor":"valid_by_period/0","id":"valid_by_period/0","title":"valid_by_period()"},{"anchor":"valid_for_period?/2","id":"valid_for_period?/2","title":"valid_for_period?(period, interval)"}]}],"sections":[],"title":"Plausible.Stats.Interval"},{"group":"","id":"Plausible.Stats.Props","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"event_props/0","id":"event_props/0","title":"event_props()"},{"anchor":"valid_prop?/1","id":"valid_prop?/1","title":"valid_prop?(prop)"}]}],"sections":[],"title":"Plausible.Stats.Props"},{"group":"","id":"Plausible.Stats.Query","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"from/2","id":"from/2","title":"from(site, params)"},{"anchor":"get_filter_by_prefix/2","id":"get_filter_by_prefix/2","title":"get_filter_by_prefix(query, prefix)"},{"anchor":"has_event_filters?/1","id":"has_event_filters?/1","title":"has_event_filters?(query)"},{"anchor":"include_imported?/3","id":"include_imported?/3","title":"include_imported?(query, site, requested?)"},{"anchor":"put_filter/3","id":"put_filter/3","title":"put_filter(query, key, val)"},{"anchor":"remove_event_filters/2","id":"remove_event_filters/2","title":"remove_event_filters(query, opts)"},{"anchor":"trace/1","id":"trace/1","title":"trace(query)"}]}],"sections":[],"title":"Plausible.Stats.Query"},{"group":"","id":"Plausible.Stats.Timeseries","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:results/0","id":"results/0","title":"results()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"timeseries/3","id":"timeseries/3","title":"timeseries(site, query, metrics)"}]}],"sections":[],"title":"Plausible.Stats.Timeseries"},{"group":"","id":"Plausible.Stats.Util","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"cast_revenue_metrics_to_money/2","id":"cast_revenue_metrics_to_money/2","title":"cast_revenue_metrics_to_money(results, revenue_goals)"},{"anchor":"get_revenue_tracking_currency/3","id":"get_revenue_tracking_currency/3","title":"get_revenue_tracking_currency(site, query, metrics)"},{"anchor":"remove_internal_visits_metric/1","id":"remove_internal_visits_metric/1","title":"remove_internal_visits_metric(result)"},{"anchor":"remove_internal_visits_metric/2","id":"remove_internal_visits_metric/2","title":"remove_internal_visits_metric(results, metrics)"}]}],"sections":[],"title":"Plausible.Stats.Util"},{"group":"","id":"Plausible.Test.Support.HTML","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"element_exists?/2","id":"element_exists?/2","title":"element_exists?(html, selector)"},{"anchor":"find/2","id":"find/2","title":"find(html, value)"},{"anchor":"form_exists?/2","id":"form_exists?/2","title":"form_exists?(html, action_path)"},{"anchor":"submit_button/2","id":"submit_button/2","title":"submit_button(html, form)"},{"anchor":"text_of_attr/2","id":"text_of_attr/2","title":"text_of_attr(element, attr)"},{"anchor":"text_of_element/2","id":"text_of_element/2","title":"text_of_element(html, element)"}]}],"sections":[],"title":"Plausible.Test.Support.HTML"},{"group":"","id":"Plausible.TestUtils","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"add_imported_data/1","id":"add_imported_data/1","title":"add_imported_data(map)"},{"anchor":"await_clickhouse_count/2","id":"await_clickhouse_count/2","title":"await_clickhouse_count(query, expected)"},{"anchor":"create_api_key/1","id":"create_api_key/1","title":"create_api_key(map)"},{"anchor":"create_events/1","id":"create_events/1","title":"create_events(events)"},{"anchor":"create_new_site/1","id":"create_new_site/1","title":"create_new_site(map)"},{"anchor":"create_pageviews/1","id":"create_pageviews/1","title":"create_pageviews(pageviews)"},{"anchor":"create_sessions/1","id":"create_sessions/1","title":"create_sessions(sessions)"},{"anchor":"create_site/1","id":"create_site/1","title":"create_site(map)"},{"anchor":"create_user/1","id":"create_user/1","title":"create_user(_)"},{"anchor":"eventually/3","id":"eventually/3","title":"eventually(expectation, wait_time_ms \\\\ 50, retries \\\\ 10)"},{"anchor":"init_session/1","id":"init_session/1","title":"init_session(conn)"},{"anchor":"log_in/1","id":"log_in/1","title":"log_in(map)"},{"anchor":"patch_env/2","id":"patch_env/2","title":"patch_env(env_key, value)"},{"anchor":"populate_stats/1","id":"populate_stats/1","title":"populate_stats(events)"},{"anchor":"populate_stats/2","id":"populate_stats/2","title":"populate_stats(site, events)"},{"anchor":"relative_time/1","id":"relative_time/1","title":"relative_time(shifts)"},{"anchor":"setup_patch_env/2","id":"setup_patch_env/2","title":"setup_patch_env(env_key, value)"},{"anchor":"to_naive_truncate/1","id":"to_naive_truncate/1","title":"to_naive_truncate(dt)"},{"anchor":"use_api_key/1","id":"use_api_key/1","title":"use_api_key(map)"}]}],"sections":[],"title":"Plausible.TestUtils"},{"group":"","id":"Plausible.Themes","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"options/0","id":"options/0","title":"options()"}]}],"sections":[],"title":"Plausible.Themes"},{"group":"","id":"Plausible.Timezones","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"options/1","id":"options/1","title":"options(now \\\\ DateTime.utc_now())"}]}],"sections":[],"title":"Plausible.Timezones"},{"group":"","id":"Plausible.Workers.CheckUsage","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"check_enterprise_subscriber/2","id":"check_enterprise_subscriber/2","title":"check_enterprise_subscriber(subscriber, billing_mod)"},{"anchor":"day_of_month/1","id":"day_of_month/1","title":"day_of_month(date)"},{"anchor":"last_day_of_month/1","id":"last_day_of_month/1","title":"last_day_of_month(day)"},{"anchor":"least/2","id":"least/2","title":"least(left, right)"},{"anchor":"yesterday/0","id":"yesterday/0","title":"yesterday()"}]}],"sections":[],"title":"Plausible.Workers.CheckUsage"},{"group":"","id":"Plausible.Workers.CleanEmailVerificationCodes","sections":[],"title":"Plausible.Workers.CleanEmailVerificationCodes"},{"group":"","id":"Plausible.Workers.CleanInvitations","sections":[],"title":"Plausible.Workers.CleanInvitations"},{"group":"","id":"Plausible.Workers.ExpireDomainChangeTransitions","sections":[],"title":"Plausible.Workers.ExpireDomainChangeTransitions"},{"group":"","id":"Plausible.Workers.ImportGoogleAnalytics","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"import_failed/1","id":"import_failed/1","title":"import_failed(site)"}]}],"sections":[],"title":"Plausible.Workers.ImportGoogleAnalytics"},{"group":"","id":"Plausible.Workers.LockSites","sections":[],"title":"Plausible.Workers.LockSites"},{"group":"","id":"Plausible.Workers.NotifyAnnualRenewal","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"perform/1","id":"perform/1","title":"perform(job)"}]}],"sections":[],"title":"Plausible.Workers.NotifyAnnualRenewal"},{"group":"","id":"Plausible.Workers.RotateSalts","sections":[],"title":"Plausible.Workers.RotateSalts"},{"group":"","id":"Plausible.Workers.ScheduleEmailReports","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"first_of_month_9am/1","id":"first_of_month_9am/1","title":"first_of_month_9am(timezone)"},{"anchor":"monday_9am/1","id":"monday_9am/1","title":"monday_9am(timezone)"},{"anchor":"perform/1","id":"perform/1","title":"perform(job)"}]}],"sections":[],"title":"Plausible.Workers.ScheduleEmailReports"},{"group":"","id":"Plausible.Workers.SendCheckStatsEmails","sections":[],"title":"Plausible.Workers.SendCheckStatsEmails"},{"group":"","id":"Plausible.Workers.SendEmailReport","sections":[],"title":"Plausible.Workers.SendEmailReport"},{"group":"","id":"Plausible.Workers.SendSiteSetupEmails","sections":[],"title":"Plausible.Workers.SendSiteSetupEmails"},{"group":"","id":"Plausible.Workers.SendTrialNotifications","sections":[],"title":"Plausible.Workers.SendTrialNotifications"},{"group":"","id":"Plausible.Workers.SpikeNotifier","sections":[],"title":"Plausible.Workers.SpikeNotifier"},{"group":"","id":"PlausibleWeb","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__using__/1","id":"__using__/1","title":"__using__(which)"},{"anchor":"channel/0","id":"channel/0","title":"channel()"},{"anchor":"controller/0","id":"controller/0","title":"controller()"},{"anchor":"router/0","id":"router/0","title":"router()"},{"anchor":"view/0","id":"view/0","title":"view()"}]}],"sections":[],"title":"PlausibleWeb"},{"group":"","id":"PlausibleWeb.Api.ExternalController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"error/2","id":"error/2","title":"error(conn, params)"},{"anchor":"event/2","id":"event/2","title":"event(conn, params)"},{"anchor":"health/2","id":"health/2","title":"health(conn, params)"},{"anchor":"info/2","id":"info/2","title":"info(conn, params)"}]}],"sections":[],"title":"PlausibleWeb.Api.ExternalController"},{"group":"","id":"PlausibleWeb.Api.ExternalSitesController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"create_site/2","id":"create_site/2","title":"create_site(conn, params)"},{"anchor":"delete_goal/2","id":"delete_goal/2","title":"delete_goal(conn, params)"},{"anchor":"delete_site/2","id":"delete_site/2","title":"delete_site(conn, map)"},{"anchor":"find_or_create_goal/2","id":"find_or_create_goal/2","title":"find_or_create_goal(conn, params)"},{"anchor":"find_or_create_shared_link/2","id":"find_or_create_shared_link/2","title":"find_or_create_shared_link(conn, params)"},{"anchor":"get_site/2","id":"get_site/2","title":"get_site(conn, map)"},{"anchor":"update_site/2","id":"update_site/2","title":"update_site(conn, params)"}]}],"sections":[],"title":"PlausibleWeb.Api.ExternalSitesController"},{"group":"","id":"PlausibleWeb.Api.ExternalStatsController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"aggregate/2","id":"aggregate/2","title":"aggregate(conn, params)"},{"anchor":"breakdown/2","id":"breakdown/2","title":"breakdown(conn, params)"},{"anchor":"realtime_visitors/2","id":"realtime_visitors/2","title":"realtime_visitors(conn, params)"},{"anchor":"timeseries/2","id":"timeseries/2","title":"timeseries(conn, params)"}]}],"sections":[],"title":"PlausibleWeb.Api.ExternalStatsController"},{"group":"","id":"PlausibleWeb.Api.Helpers","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"bad_request/2","id":"bad_request/2","title":"bad_request(conn, msg)"},{"anchor":"not_found/2","id":"not_found/2","title":"not_found(conn, msg)"},{"anchor":"payment_required/2","id":"payment_required/2","title":"payment_required(conn, msg)"},{"anchor":"too_many_requests/2","id":"too_many_requests/2","title":"too_many_requests(conn, msg)"},{"anchor":"unauthorized/2","id":"unauthorized/2","title":"unauthorized(conn, msg)"}]}],"sections":[],"title":"PlausibleWeb.Api.Helpers"},{"group":"","id":"PlausibleWeb.Api.InternalController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"disable_feature/2","id":"disable_feature/2","title":"disable_feature(conn, map)"},{"anchor":"domain_status/2","id":"domain_status/2","title":"domain_status(conn, map)"},{"anchor":"sites/2","id":"sites/2","title":"sites(conn, params)"}]}],"sections":[],"title":"PlausibleWeb.Api.InternalController"},{"group":"","id":"PlausibleWeb.Api.PaddleController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"verified_signature?/1","id":"verified_signature?/1","title":"verified_signature?(params)"},{"anchor":"verify_signature/2","id":"verify_signature/2","title":"verify_signature(conn, opts)"},{"anchor":"webhook/2","id":"webhook/2","title":"webhook(conn, params)"}]}],"sections":[],"title":"PlausibleWeb.Api.PaddleController"},{"group":"","id":"PlausibleWeb.Api.StatsController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"all_props_breakdown/2","id":"all_props_breakdown/2","title":"all_props_breakdown(conn, params)"},{"anchor":"browser_versions/2","id":"browser_versions/2","title":"browser_versions(conn, params)"},{"anchor":"browsers/2","id":"browsers/2","title":"browsers(conn, params)"},{"anchor":"cities/2","id":"cities/2","title":"cities(conn, params)"},{"anchor":"conversions/2","id":"conversions/2","title":"conversions(conn, params)"},{"anchor":"countries/2","id":"countries/2","title":"countries(conn, params)"},{"anchor":"current_visitors/2","id":"current_visitors/2","title":"current_visitors(conn, _)"},{"anchor":"custom_prop_values/2","id":"custom_prop_values/2","title":"custom_prop_values(conn, params)"},{"anchor":"entry_pages/2","id":"entry_pages/2","title":"entry_pages(conn, params)"},{"anchor":"exit_pages/2","id":"exit_pages/2","title":"exit_pages(conn, params)"},{"anchor":"filter_suggestions/2","id":"filter_suggestions/2","title":"filter_suggestions(conn, params)"},{"anchor":"funnel/2","id":"funnel/2","title":"funnel(conn, params)"},{"anchor":"main_graph/2","id":"main_graph/2","title":"main_graph(conn, params)"},{"anchor":"operating_system_versions/2","id":"operating_system_versions/2","title":"operating_system_versions(conn, params)"},{"anchor":"operating_systems/2","id":"operating_systems/2","title":"operating_systems(conn, params)"},{"anchor":"pages/2","id":"pages/2","title":"pages(conn, params)"},{"anchor":"prop_breakdown/2","id":"prop_breakdown/2","title":"prop_breakdown(conn, params)"},{"anchor":"referrer_drilldown/2","id":"referrer_drilldown/2","title":"referrer_drilldown(conn, params)"},{"anchor":"regions/2","id":"regions/2","title":"regions(conn, params)"},{"anchor":"screen_sizes/2","id":"screen_sizes/2","title":"screen_sizes(conn, params)"},{"anchor":"sources/2","id":"sources/2","title":"sources(conn, params)"},{"anchor":"top_stats/2","id":"top_stats/2","title":"top_stats(conn, params)"},{"anchor":"utm_campaigns/2","id":"utm_campaigns/2","title":"utm_campaigns(conn, params)"},{"anchor":"utm_contents/2","id":"utm_contents/2","title":"utm_contents(conn, params)"},{"anchor":"utm_mediums/2","id":"utm_mediums/2","title":"utm_mediums(conn, params)"},{"anchor":"utm_sources/2","id":"utm_sources/2","title":"utm_sources(conn, params)"},{"anchor":"utm_terms/2","id":"utm_terms/2","title":"utm_terms(conn, params)"}]}],"sections":[],"title":"PlausibleWeb.Api.StatsController"},{"group":"","id":"PlausibleWeb.AuthController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"activate/2","id":"activate/2","title":"activate(conn, map)"},{"anchor":"activate_form/2","id":"activate_form/2","title":"activate_form(conn, params)"},{"anchor":"create_api_key/2","id":"create_api_key/2","title":"create_api_key(conn, map)"},{"anchor":"delete_api_key/2","id":"delete_api_key/2","title":"delete_api_key(conn, map)"},{"anchor":"delete_me/2","id":"delete_me/2","title":"delete_me(conn, params)"},{"anchor":"google_auth_callback/2","id":"google_auth_callback/2","title":"google_auth_callback(conn, params)"},{"anchor":"login/2","id":"login/2","title":"login(conn, map)"},{"anchor":"login_form/2","id":"login_form/2","title":"login_form(conn, params)"},{"anchor":"logout/2","id":"logout/2","title":"logout(conn, params)"},{"anchor":"new_api_key/2","id":"new_api_key/2","title":"new_api_key(conn, params)"},{"anchor":"password_form/2","id":"password_form/2","title":"password_form(conn, params)"},{"anchor":"password_reset/2","id":"password_reset/2","title":"password_reset(conn, map)"},{"anchor":"password_reset_form/2","id":"password_reset_form/2","title":"password_reset_form(conn, map)"},{"anchor":"password_reset_request/2","id":"password_reset_request/2","title":"password_reset_request(conn, params)"},{"anchor":"password_reset_request_form/2","id":"password_reset_request_form/2","title":"password_reset_request_form(conn, _)"},{"anchor":"register/2","id":"register/2","title":"register(conn, params)"},{"anchor":"register_form/2","id":"register_form/2","title":"register_form(conn, params)"},{"anchor":"register_from_invitation/2","id":"register_from_invitation/2","title":"register_from_invitation(conn, params)"},{"anchor":"register_from_invitation_form/2","id":"register_from_invitation_form/2","title":"register_from_invitation_form(conn, map)"},{"anchor":"request_activation_code/2","id":"request_activation_code/2","title":"request_activation_code(conn, params)"},{"anchor":"save_settings/2","id":"save_settings/2","title":"save_settings(conn, map)"},{"anchor":"set_password/2","id":"set_password/2","title":"set_password(conn, map)"},{"anchor":"user_settings/2","id":"user_settings/2","title":"user_settings(conn, params)"}]}],"sections":[],"title":"PlausibleWeb.AuthController"},{"group":"","id":"PlausibleWeb.AuthPlug","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"call/2","id":"call/2","title":"call(conn, opts)"},{"anchor":"init/1","id":"init/1","title":"init(options)"}]}],"sections":[],"title":"PlausibleWeb.AuthPlug"},{"group":"","id":"PlausibleWeb.AuthView","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__resource__/0","id":"__resource__/0","title":"__resource__()"},{"anchor":"activate.html/1","id":"activate.html/1","title":"activate.html(assigns)"},{"anchor":"base_domain/0","id":"base_domain/0","title":"base_domain()"},{"anchor":"delimit_integer/1","id":"delimit_integer/1","title":"delimit_integer(number)"},{"anchor":"format_invoices/1","id":"format_invoices/1","title":"format_invoices(invoice_list)"},{"anchor":"invitation_expired.html/1","id":"invitation_expired.html/1","title":"invitation_expired.html(assigns)"},{"anchor":"login_form.html/1","id":"login_form.html/1","title":"login_form.html(assigns)"},{"anchor":"new_api_key.html/1","id":"new_api_key.html/1","title":"new_api_key.html(assigns)"},{"anchor":"password_form.html/1","id":"password_form.html/1","title":"password_form.html(assigns)"},{"anchor":"password_reset_form.html/1","id":"password_reset_form.html/1","title":"password_reset_form.html(assigns)"},{"anchor":"password_reset_request_form.html/1","id":"password_reset_request_form.html/1","title":"password_reset_request_form.html(assigns)"},{"anchor":"password_reset_request_success.html/1","id":"password_reset_request_success.html/1","title":"password_reset_request_success.html(assigns)"},{"anchor":"plausible_url/0","id":"plausible_url/0","title":"plausible_url()"},{"anchor":"present_subscription_status/1","id":"present_subscription_status/1","title":"present_subscription_status(status)"},{"anchor":"register_form.html/1","id":"register_form.html/1","title":"register_form.html(assigns)"},{"anchor":"register_from_invitation_form.html/1","id":"register_from_invitation_form.html/1","title":"register_from_invitation_form.html(assigns)"},{"anchor":"register_success.html/1","id":"register_success.html/1","title":"register_success.html(assigns)"},{"anchor":"render/2","id":"render/2","title":"render(template, assigns \\\\ %{})"},{"anchor":"subscription_colors/1","id":"subscription_colors/1","title":"subscription_colors(_)"},{"anchor":"subscription_interval/1","id":"subscription_interval/1","title":"subscription_interval(subscription)"},{"anchor":"subscription_quota/1","id":"subscription_quota/1","title":"subscription_quota(subscription)"},{"anchor":"template_not_found/2","id":"template_not_found/2","title":"template_not_found(template, assigns)"},{"anchor":"user_settings.html/1","id":"user_settings.html/1","title":"user_settings.html(assigns)"}]}],"sections":[],"title":"PlausibleWeb.AuthView"},{"group":"","id":"PlausibleWeb.AuthorizeSiteAccess","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"call/2","id":"call/2","title":"call(conn, allowed_roles)"},{"anchor":"init/1","id":"init/1","title":"init(allowed_roles)"}]}],"sections":[],"title":"PlausibleWeb.AuthorizeSiteAccess"},{"group":"","id":"PlausibleWeb.AuthorizeSitesApiPlug","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"call/2","id":"call/2","title":"call(conn, opts)"},{"anchor":"init/1","id":"init/1","title":"init(options)"}]}],"sections":[],"title":"PlausibleWeb.AuthorizeSitesApiPlug"},{"group":"","id":"PlausibleWeb.AuthorizeStatsApiPlug","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"call/2","id":"call/2","title":"call(conn, opts)"},{"anchor":"init/1","id":"init/1","title":"init(options)"}]}],"sections":[],"title":"PlausibleWeb.AuthorizeStatsApiPlug"},{"group":"","id":"PlausibleWeb.BillingController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"change_enterprise_plan/2","id":"change_enterprise_plan/2","title":"change_enterprise_plan(conn, map)"},{"anchor":"change_plan/2","id":"change_plan/2","title":"change_plan(conn, map)"},{"anchor":"change_plan_form/2","id":"change_plan_form/2","title":"change_plan_form(conn, params)"},{"anchor":"change_plan_preview/2","id":"change_plan_preview/2","title":"change_plan_preview(conn, map)"},{"anchor":"ping_subscription/2","id":"ping_subscription/2","title":"ping_subscription(conn, params)"},{"anchor":"preview_susbcription/2","id":"preview_susbcription/2","title":"preview_susbcription(_, _)"},{"anchor":"upgrade/2","id":"upgrade/2","title":"upgrade(conn, params)"},{"anchor":"upgrade_enterprise_plan/2","id":"upgrade_enterprise_plan/2","title":"upgrade_enterprise_plan(conn, map)"},{"anchor":"upgrade_success/2","id":"upgrade_success/2","title":"upgrade_success(conn, params)"}]}],"sections":[],"title":"PlausibleWeb.BillingController"},{"group":"","id":"PlausibleWeb.BillingView","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__resource__/0","id":"__resource__/0","title":"__resource__()"},{"anchor":"base_domain/0","id":"base_domain/0","title":"base_domain()"},{"anchor":"change_enterprise_plan.html/1","id":"change_enterprise_plan.html/1","title":"change_enterprise_plan.html(assigns)"},{"anchor":"change_enterprise_plan_contact_us.html/1","id":"change_enterprise_plan_contact_us.html/1","title":"change_enterprise_plan_contact_us.html(assigns)"},{"anchor":"change_plan.html/1","id":"change_plan.html/1","title":"change_plan.html(assigns)"},{"anchor":"change_plan_preview.html/1","id":"change_plan_preview.html/1","title":"change_plan_preview.html(assigns)"},{"anchor":"plausible_url/0","id":"plausible_url/0","title":"plausible_url()"},{"anchor":"present_currency/1","id":"present_currency/1","title":"present_currency(arg)"},{"anchor":"present_date/1","id":"present_date/1","title":"present_date(date)"},{"anchor":"reccommended_plan/1","id":"reccommended_plan/1","title":"reccommended_plan(usage)"},{"anchor":"render/2","id":"render/2","title":"render(template, assigns \\\\ %{})"},{"anchor":"template_not_found/2","id":"template_not_found/2","title":"template_not_found(template, assigns)"},{"anchor":"upgrade.html/1","id":"upgrade.html/1","title":"upgrade.html(assigns)"},{"anchor":"upgrade_success.html/1","id":"upgrade_success.html/1","title":"upgrade_success.html(assigns)"},{"anchor":"upgrade_to_plan.html/1","id":"upgrade_to_plan.html/1","title":"upgrade_to_plan.html(assigns)"}]}],"sections":[],"title":"PlausibleWeb.BillingView"},{"group":"","id":"PlausibleWeb.CRMAuthPlug","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"call/2","id":"call/2","title":"call(conn, opts)"},{"anchor":"init/1","id":"init/1","title":"init(options)"}]}],"sections":[],"title":"PlausibleWeb.CRMAuthPlug"},{"group":"","id":"PlausibleWeb.Captcha","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"enabled?/0","id":"enabled?/0","title":"enabled?()"},{"anchor":"sitekey/0","id":"sitekey/0","title":"sitekey()"},{"anchor":"verify/1","id":"verify/1","title":"verify(token)"}]}],"sections":[],"title":"PlausibleWeb.Captcha"},{"group":"","id":"PlausibleWeb.Components.Generic","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"notice/1","id":"notice/1","title":"notice(assigns)"}]}],"sections":[],"title":"PlausibleWeb.Components.Generic"},{"group":"","id":"PlausibleWeb.Components.Site.Feature","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__resource__/0","id":"__resource__/0","title":"__resource__()"},{"anchor":"button_active/1","id":"button_active/1","title":"button_active(assigns)"},{"anchor":"button_inactive/1","id":"button_inactive/1","title":"button_inactive(assigns)"},{"anchor":"render/2","id":"render/2","title":"render(template, assigns \\\\ %{})"},{"anchor":"target/4","id":"target/4","title":"target(site, setting, conn, set_to)"},{"anchor":"template_not_found/2","id":"template_not_found/2","title":"template_not_found(template, assigns)"},{"anchor":"toggle/1","id":"toggle/1","title":"toggle(assigns)"}]}],"sections":[],"title":"PlausibleWeb.Components.Site.Feature"},{"group":"","id":"PlausibleWeb.ConnCase","sections":[],"title":"PlausibleWeb.ConnCase"},{"group":"","id":"PlausibleWeb.ControllerHelpers","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"render_error/2","id":"render_error/2","title":"render_error(conn, status)"},{"anchor":"render_error/3","id":"render_error/3","title":"render_error(conn, status, message)"}]}],"sections":[],"title":"PlausibleWeb.ControllerHelpers"},{"group":"","id":"PlausibleWeb.Email","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"activation_email/2","id":"activation_email/2","title":"activation_email(user, code)"},{"anchor":"base_email/0","id":"base_email/0","title":"base_email()"},{"anchor":"base_email/1","id":"base_email/1","title":"base_email(map)"},{"anchor":"cancellation_email/1","id":"cancellation_email/1","title":"cancellation_email(user)"},{"anchor":"check_stats_email/1","id":"check_stats_email/1","title":"check_stats_email(user)"},{"anchor":"create_site_email/1","id":"create_site_email/1","title":"create_site_email(user)"},{"anchor":"dashboard_locked/4","id":"dashboard_locked/4","title":"dashboard_locked(user, usage, last_cycle, suggested_plan)"},{"anchor":"enterprise_over_limit_internal_email/5","id":"enterprise_over_limit_internal_email/5","title":"enterprise_over_limit_internal_email(user, usage, last_cycle, site_usage, site_allowance)"},{"anchor":"error_report/3","id":"error_report/3","title":"error_report(reported_by, trace_id, feedback)"},{"anchor":"existing_user_invitation/1","id":"existing_user_invitation/1","title":"existing_user_invitation(invitation)"},{"anchor":"import_failure/2","id":"import_failure/2","title":"import_failure(user, site)"},{"anchor":"import_success/2","id":"import_success/2","title":"import_success(user, site)"},{"anchor":"invitation_accepted/1","id":"invitation_accepted/1","title":"invitation_accepted(invitation)"},{"anchor":"invitation_rejected/1","id":"invitation_rejected/1","title":"invitation_rejected(invitation)"},{"anchor":"mailer_email_from/0","id":"mailer_email_from/0","title":"mailer_email_from()"},{"anchor":"new_user_invitation/1","id":"new_user_invitation/1","title":"new_user_invitation(invitation)"},{"anchor":"over_limit_email/4","id":"over_limit_email/4","title":"over_limit_email(user, usage, last_cycle, suggested_plan)"},{"anchor":"ownership_transfer_accepted/1","id":"ownership_transfer_accepted/1","title":"ownership_transfer_accepted(invitation)"},{"anchor":"ownership_transfer_rejected/1","id":"ownership_transfer_rejected/1","title":"ownership_transfer_rejected(invitation)"},{"anchor":"ownership_transfer_request/2","id":"ownership_transfer_request/2","title":"ownership_transfer_request(invitation, new_owner_account)"},{"anchor":"password_reset_email/2","id":"password_reset_email/2","title":"password_reset_email(email, reset_link)"},{"anchor":"render/3","id":"render/3","title":"render(email, template, assigns \\\\ [])"},{"anchor":"site_member_removed/1","id":"site_member_removed/1","title":"site_member_removed(membership)"},{"anchor":"site_setup_help/2","id":"site_setup_help/2","title":"site_setup_help(user, site)"},{"anchor":"site_setup_success/2","id":"site_setup_success/2","title":"site_setup_success(user, site)"},{"anchor":"spike_notification/5","id":"spike_notification/5","title":"spike_notification(email, site, current_visitors, sources, dashboard_link)"},{"anchor":"trial_one_week_reminder/1","id":"trial_one_week_reminder/1","title":"trial_one_week_reminder(user)"},{"anchor":"trial_over_email/1","id":"trial_over_email/1","title":"trial_over_email(user)"},{"anchor":"trial_upgrade_email/3","id":"trial_upgrade_email/3","title":"trial_upgrade_email(user, day, arg)"},{"anchor":"weekly_report/3","id":"weekly_report/3","title":"weekly_report(email, site, assigns)"},{"anchor":"welcome_email/1","id":"welcome_email/1","title":"welcome_email(user)"},{"anchor":"yearly_expiration_notification/1","id":"yearly_expiration_notification/1","title":"yearly_expiration_notification(user)"},{"anchor":"yearly_renewal_notification/1","id":"yearly_renewal_notification/1","title":"yearly_renewal_notification(user)"}]}],"sections":[],"title":"PlausibleWeb.Email"},{"group":"","id":"PlausibleWeb.EmailView","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__resource__/0","id":"__resource__/0","title":"__resource__()"},{"anchor":"activation_email.html/1","id":"activation_email.html/1","title":"activation_email.html(assigns)"},{"anchor":"base_domain/0","id":"base_domain/0","title":"base_domain()"},{"anchor":"cancellation_email.html/1","id":"cancellation_email.html/1","title":"cancellation_email.html(assigns)"},{"anchor":"check_stats_email.html/1","id":"check_stats_email.html/1","title":"check_stats_email.html(assigns)"},{"anchor":"create_site_email.html/1","id":"create_site_email.html/1","title":"create_site_email.html(assigns)"},{"anchor":"dashboard_locked.html/1","id":"dashboard_locked.html/1","title":"dashboard_locked.html(assigns)"},{"anchor":"date_format/1","id":"date_format/1","title":"date_format(date)"},{"anchor":"enterprise_over_limit_internal.html/1","id":"enterprise_over_limit_internal.html/1","title":"enterprise_over_limit_internal.html(assigns)"},{"anchor":"error_report_email.html/1","id":"error_report_email.html/1","title":"error_report_email.html(assigns)"},{"anchor":"existing_user_invitation.html/1","id":"existing_user_invitation.html/1","title":"existing_user_invitation.html(assigns)"},{"anchor":"google_analytics_import.html/1","id":"google_analytics_import.html/1","title":"google_analytics_import.html(assigns)"},{"anchor":"greet_recipient/1","id":"greet_recipient/1","title":"greet_recipient(_)"},{"anchor":"invitation_accepted.html/1","id":"invitation_accepted.html/1","title":"invitation_accepted.html(assigns)"},{"anchor":"invitation_rejected.html/1","id":"invitation_rejected.html/1","title":"invitation_rejected.html(assigns)"},{"anchor":"new_user_invitation.html/1","id":"new_user_invitation.html/1","title":"new_user_invitation.html(assigns)"},{"anchor":"over_limit.html/1","id":"over_limit.html/1","title":"over_limit.html(assigns)"},{"anchor":"ownership_transfer_accepted.html/1","id":"ownership_transfer_accepted.html/1","title":"ownership_transfer_accepted.html(assigns)"},{"anchor":"ownership_transfer_rejected.html/1","id":"ownership_transfer_rejected.html/1","title":"ownership_transfer_rejected.html(assigns)"},{"anchor":"ownership_transfer_request.html/1","id":"ownership_transfer_request.html/1","title":"ownership_transfer_request.html(assigns)"},{"anchor":"password_reset_email.html/1","id":"password_reset_email.html/1","title":"password_reset_email.html(assigns)"},{"anchor":"plausible_url/0","id":"plausible_url/0","title":"plausible_url()"},{"anchor":"render/2","id":"render/2","title":"render(template, assigns \\\\ %{})"},{"anchor":"sentry_link/2","id":"sentry_link/2","title":"sentry_link(trace_id, dsn \\\\ Sentry.Config.dsn())"},{"anchor":"site_member_removed.html/1","id":"site_member_removed.html/1","title":"site_member_removed.html(assigns)"},{"anchor":"site_setup_help_email.html/1","id":"site_setup_help_email.html/1","title":"site_setup_help_email.html(assigns)"},{"anchor":"site_setup_success_email.html/1","id":"site_setup_success_email.html/1","title":"site_setup_success_email.html(assigns)"},{"anchor":"spike_notification.html/1","id":"spike_notification.html/1","title":"spike_notification.html(assigns)"},{"anchor":"template_not_found/2","id":"template_not_found/2","title":"template_not_found(template, assigns)"},{"anchor":"trial_one_week_reminder.html/1","id":"trial_one_week_reminder.html/1","title":"trial_one_week_reminder.html(assigns)"},{"anchor":"trial_over_email.html/1","id":"trial_over_email.html/1","title":"trial_over_email.html(assigns)"},{"anchor":"trial_upgrade_email.html/1","id":"trial_upgrade_email.html/1","title":"trial_upgrade_email.html(assigns)"},{"anchor":"welcome_email.html/1","id":"welcome_email.html/1","title":"welcome_email.html(assigns)"},{"anchor":"yearly_expiration_notification.html/1","id":"yearly_expiration_notification.html/1","title":"yearly_expiration_notification.html(assigns)"},{"anchor":"yearly_renewal_notification.html/1","id":"yearly_renewal_notification.html/1","title":"yearly_renewal_notification.html(assigns)"}]}],"sections":[],"title":"PlausibleWeb.EmailView"},{"group":"","id":"PlausibleWeb.Endpoint","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"broadcast/3","id":"broadcast/3","title":"broadcast(topic, event, msg)"},{"anchor":"broadcast!/3","id":"broadcast!/3","title":"broadcast!(topic, event, msg)"},{"anchor":"broadcast_from/4","id":"broadcast_from/4","title":"broadcast_from(from, topic, event, msg)"},{"anchor":"broadcast_from!/4","id":"broadcast_from!/4","title":"broadcast_from!(from, topic, event, msg)"},{"anchor":"call/2","id":"call/2","title":"call(conn, opts)"},{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"},{"anchor":"config/2","id":"config/2","title":"config(key, default \\\\ nil)"},{"anchor":"config_change/2","id":"config_change/2","title":"config_change(changed, removed)"},{"anchor":"host/0","id":"host/0","title":"host()"},{"anchor":"init/1","id":"init/1","title":"init(opts)"},{"anchor":"local_broadcast/3","id":"local_broadcast/3","title":"local_broadcast(topic, event, msg)"},{"anchor":"local_broadcast_from/4","id":"local_broadcast_from/4","title":"local_broadcast_from(from, topic, event, msg)"},{"anchor":"patch_session_opts/0","id":"patch_session_opts/0","title":"patch_session_opts()"},{"anchor":"path/1","id":"path/1","title":"path(path)"},{"anchor":"script_name/0","id":"script_name/0","title":"script_name()"},{"anchor":"start_link/1","id":"start_link/1","title":"start_link(opts \\\\ [])"},{"anchor":"static_integrity/1","id":"static_integrity/1","title":"static_integrity(path)"},{"anchor":"static_lookup/1","id":"static_lookup/1","title":"static_lookup(path)"},{"anchor":"static_path/1","id":"static_path/1","title":"static_path(path)"},{"anchor":"static_url/0","id":"static_url/0","title":"static_url()"},{"anchor":"struct_url/0","id":"struct_url/0","title":"struct_url()"},{"anchor":"subscribe/2","id":"subscribe/2","title":"subscribe(topic, opts \\\\ [])"},{"anchor":"unsubscribe/1","id":"unsubscribe/1","title":"unsubscribe(topic)"},{"anchor":"url/0","id":"url/0","title":"url()"},{"anchor":"websocket_url/0","id":"websocket_url/0","title":"websocket_url()"}]}],"sections":[],"title":"PlausibleWeb.Endpoint"},{"group":"","id":"PlausibleWeb.ErrorHelpers","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"error_tag/2","id":"error_tag/2","title":"error_tag(form, field)"}]}],"sections":[],"title":"PlausibleWeb.ErrorHelpers"},{"group":"","id":"PlausibleWeb.ErrorReportController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"submit_error_report/2","id":"submit_error_report/2","title":"submit_error_report(conn, arg2)"}]}],"sections":[],"title":"PlausibleWeb.ErrorReportController"},{"group":"","id":"PlausibleWeb.ErrorView","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__resource__/0","id":"__resource__/0","title":"__resource__()"},{"anchor":"generic_error.html/1","id":"generic_error.html/1","title":"generic_error.html(assigns)"},{"anchor":"render/2","id":"render/2","title":"render(template, assigns \\\\ %{})"},{"anchor":"server_error.html/1","id":"server_error.html/1","title":"server_error.html(assigns)"},{"anchor":"server_error_report_thanks.html/1","id":"server_error_report_thanks.html/1","title":"server_error_report_thanks.html(assigns)"},{"anchor":"template_not_found/2","id":"template_not_found/2","title":"template_not_found(template, assigns)"}]}],"sections":[],"title":"PlausibleWeb.ErrorView"},{"group":"","id":"PlausibleWeb.Favicon","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"call/2","id":"call/2","title":"call(conn, list)"},{"anchor":"init/1","id":"init/1","title":"init(_)"}]}],"sections":[],"title":"PlausibleWeb.Favicon"},{"group":"","id":"PlausibleWeb.FirstLaunchPlug","sections":[],"title":"PlausibleWeb.FirstLaunchPlug"},{"group":"","id":"PlausibleWeb.FormHelpers","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"styled_error/1","id":"styled_error/1","title":"styled_error(error)"},{"anchor":"styled_label/4","id":"styled_label/4","title":"styled_label(form, field, text, opts \\\\ [])"},{"anchor":"styled_select/4","id":"styled_select/4","title":"styled_select(form, field, options, opts \\\\ [])"},{"anchor":"styled_text_input/3","id":"styled_text_input/3","title":"styled_text_input(form, field, opts \\\\ [])"}]}],"sections":[],"title":"PlausibleWeb.FormHelpers"},{"group":"","id":"PlausibleWeb.InvitationController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"accept_invitation/2","id":"accept_invitation/2","title":"accept_invitation(conn, map)"},{"anchor":"reject_invitation/2","id":"reject_invitation/2","title":"reject_invitation(conn, map)"},{"anchor":"remove_invitation/2","id":"remove_invitation/2","title":"remove_invitation(conn, map)"}]}],"sections":[],"title":"PlausibleWeb.InvitationController"},{"group":"","id":"PlausibleWeb.LastSeenPlug","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"call/2","id":"call/2","title":"call(conn, opts)"},{"anchor":"init/1","id":"init/1","title":"init(opts)"}]}],"sections":[],"title":"PlausibleWeb.LastSeenPlug"},{"group":"","id":"PlausibleWeb.LayoutView","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__resource__/0","id":"__resource__/0","title":"__resource__()"},{"anchor":"app.html/1","id":"app.html/1","title":"app.html(assigns)"},{"anchor":"base_domain/0","id":"base_domain/0","title":"base_domain()"},{"anchor":"base_email.html/1","id":"base_email.html/1","title":"base_email.html(assigns)"},{"anchor":"base_error.html/1","id":"base_error.html/1","title":"base_error.html(assigns)"},{"anchor":"embedded.html/1","id":"embedded.html/1","title":"embedded.html(assigns)"},{"anchor":"focus.html/1","id":"focus.html/1","title":"focus.html(assigns)"},{"anchor":"grace_period_end/1","id":"grace_period_end/1","title":"grace_period_end(user)"},{"anchor":"home_dest/1","id":"home_dest/1","title":"home_dest(conn)"},{"anchor":"is_current_tab/2","id":"is_current_tab/2","title":"is_current_tab(conn, tab)"},{"anchor":"plausible_url/0","id":"plausible_url/0","title":"plausible_url()"},{"anchor":"render/2","id":"render/2","title":"render(template, assigns \\\\ %{})"},{"anchor":"render_layout/3","id":"render_layout/3","title":"render_layout(layout, assigns, list)"},{"anchor":"settings_tabs/1","id":"settings_tabs/1","title":"settings_tabs(conn)"},{"anchor":"site_settings.html/1","id":"site_settings.html/1","title":"site_settings.html(assigns)"},{"anchor":"template_not_found/2","id":"template_not_found/2","title":"template_not_found(template, assigns)"},{"anchor":"trial_notificaton/1","id":"trial_notificaton/1","title":"trial_notificaton(user)"},{"anchor":"websocket_url/0","id":"websocket_url/0","title":"websocket_url()"}]}],"sections":[],"title":"PlausibleWeb.LayoutView"},{"group":"","id":"PlausibleWeb.Live.Components.ComboBox","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"dropdown/1","id":"dropdown/1","title":"dropdown(assigns)"},{"anchor":"dropdown_anchor/1","id":"dropdown_anchor/1","title":"dropdown_anchor(assigns)"},{"anchor":"handle_event/3","id":"handle_event/3","title":"handle_event(binary, params, socket)"},{"anchor":"option/1","id":"option/1","title":"option(assigns)"},{"anchor":"render/1","id":"render/1","title":"render(assigns)"},{"anchor":"select_option/4","id":"select_option/4","title":"select_option(js \\\\ %JS{}, id, submit_value, display_value)"},{"anchor":"update/2","id":"update/2","title":"update(assigns, socket)"}]}],"sections":[],"title":"PlausibleWeb.Live.Components.ComboBox"},{"group":"","id":"PlausibleWeb.Live.Components.ComboBox.StaticSearch","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"suggest/2","id":"suggest/2","title":"suggest(input, options)"}]}],"sections":[],"title":"PlausibleWeb.Live.Components.ComboBox.StaticSearch"},{"group":"","id":"PlausibleWeb.Live.Flash","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"clear_flash_button/1","id":"clear_flash_button/1","title":"clear_flash_button(assigns)"},{"anchor":"flash/1","id":"flash/1","title":"flash(assigns)"},{"anchor":"icon_error/1","id":"icon_error/1","title":"icon_error(assigns)"},{"anchor":"icon_success/1","id":"icon_success/1","title":"icon_success(assigns)"},{"anchor":"render/1","id":"render/1","title":"render(assigns)"}]}],"sections":[],"title":"PlausibleWeb.Live.Flash"},{"group":"","id":"PlausibleWeb.Live.FunnelSettings","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"handle_event/3","id":"handle_event/3","title":"handle_event(binary, arg2, socket)"},{"anchor":"handle_info/2","id":"handle_info/2","title":"handle_info(arg1, socket)"},{"anchor":"mount/3","id":"mount/3","title":"mount(params, map, socket)"},{"anchor":"render/1","id":"render/1","title":"render(assigns)"}]}],"sections":[],"title":"PlausibleWeb.Live.FunnelSettings"},{"group":"","id":"PlausibleWeb.Live.FunnelSettings.Form","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"add_step_button/1","id":"add_step_button/1","title":"add_step_button(assigns)"},{"anchor":"cancel_button/1","id":"cancel_button/1","title":"cancel_button(assigns)"},{"anchor":"error/1","id":"error/1","title":"error(assigns)"},{"anchor":"evaluation/1","id":"evaluation/1","title":"evaluation(assigns)"},{"anchor":"handle_event/3","id":"handle_event/3","title":"handle_event(binary, arg2, socket)"},{"anchor":"handle_info/2","id":"handle_info/2","title":"handle_info(arg1, socket)"},{"anchor":"input/1","id":"input/1","title":"input(assigns)"},{"anchor":"mount/3","id":"mount/3","title":"mount(params, map, socket)"},{"anchor":"remove_step_button/1","id":"remove_step_button/1","title":"remove_step_button(assigns)"},{"anchor":"render/1","id":"render/1","title":"render(assigns)"},{"anchor":"submit_button/1","id":"submit_button/1","title":"submit_button(assigns)"},{"anchor":"submit_button_inactive/1","id":"submit_button_inactive/1","title":"submit_button_inactive(assigns)"}]}],"sections":[],"title":"PlausibleWeb.Live.FunnelSettings.Form"},{"group":"","id":"PlausibleWeb.Live.FunnelSettings.List","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"render/1","id":"render/1","title":"render(assigns)"}]}],"sections":[],"title":"PlausibleWeb.Live.FunnelSettings.List"},{"group":"","id":"PlausibleWeb.MJML.WeeklyReport","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"debug_mjml_template/0","id":"debug_mjml_template/0","title":"debug_mjml_template()"},{"anchor":"render/1","id":"render/1","title":"render(assigns)"}]}],"sections":[],"title":"PlausibleWeb.MJML.WeeklyReport"},{"group":"","id":"PlausibleWeb.PageController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"index/2","id":"index/2","title":"index(conn, params)"}]}],"sections":[],"title":"PlausibleWeb.PageController"},{"group":"","id":"PlausibleWeb.PageView","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__resource__/0","id":"__resource__/0","title":"__resource__()"},{"anchor":"index.html/1","id":"index.html/1","title":"index.html(assigns)"},{"anchor":"render/2","id":"render/2","title":"render(template, assigns \\\\ %{})"},{"anchor":"template_not_found/2","id":"template_not_found/2","title":"template_not_found(template, assigns)"}]}],"sections":[],"title":"PlausibleWeb.PageView"},{"group":"","id":"PlausibleWeb.Plugs.NoRobots","sections":[],"title":"PlausibleWeb.Plugs.NoRobots"},{"group":"","id":"PlausibleWeb.Plugs.RuntimeSessionAdapter","sections":[],"title":"PlausibleWeb.Plugs.RuntimeSessionAdapter"},{"group":"","id":"PlausibleWeb.RefInspector","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"parse/1","id":"parse/1","title":"parse(ref)"},{"anchor":"right_uri?/1","id":"right_uri?/1","title":"right_uri?(arg1)"}]}],"sections":[],"title":"PlausibleWeb.RefInspector"},{"group":"","id":"PlausibleWeb.RemoteIp","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"get/1","id":"get/1","title":"get(conn)"}]}],"sections":[],"title":"PlausibleWeb.RemoteIp"},{"group":"","id":"PlausibleWeb.RequireAccountPlug","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"call/2","id":"call/2","title":"call(conn, opts)"},{"anchor":"init/1","id":"init/1","title":"init(options)"}]}],"sections":[],"title":"PlausibleWeb.RequireAccountPlug"},{"group":"","id":"PlausibleWeb.RequireLoggedOutPlug","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"call/2","id":"call/2","title":"call(conn, opts)"},{"anchor":"init/1","id":"init/1","title":"init(options)"}]}],"sections":[],"title":"PlausibleWeb.RequireLoggedOutPlug"},{"group":"","id":"PlausibleWeb.Router","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"api/2","id":"api/2","title":"api(conn, _)"},{"anchor":"browser/2","id":"browser/2","title":"browser(conn, _)"},{"anchor":"call/2","id":"call/2","title":"call(conn, opts)"},{"anchor":"csrf/2","id":"csrf/2","title":"csrf(conn, _)"},{"anchor":"flags/2","id":"flags/2","title":"flags(conn, _)"},{"anchor":"init/1","id":"init/1","title":"init(opts)"},{"anchor":"internal_stats_api/2","id":"internal_stats_api/2","title":"internal_stats_api(conn, _)"},{"anchor":"kaffy_browser/2","id":"kaffy_browser/2","title":"kaffy_browser(conn, _)"},{"anchor":"public_api/2","id":"public_api/2","title":"public_api(conn, _)"},{"anchor":"shared_link/2","id":"shared_link/2","title":"shared_link(conn, _)"}]}],"sections":[],"title":"PlausibleWeb.Router"},{"group":"","id":"PlausibleWeb.SessionTimeoutPlug","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"call/2","id":"call/2","title":"call(conn, opts)"},{"anchor":"init/1","id":"init/1","title":"init(opts \\\\ [])"}]}],"sections":[],"title":"PlausibleWeb.SessionTimeoutPlug"},{"group":"","id":"PlausibleWeb.Site.MembershipController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"invite_member/2","id":"invite_member/2","title":"invite_member(conn, map)"},{"anchor":"invite_member_form/2","id":"invite_member_form/2","title":"invite_member_form(conn, params)"},{"anchor":"remove_member/2","id":"remove_member/2","title":"remove_member(conn, map)"},{"anchor":"transfer_ownership/2","id":"transfer_ownership/2","title":"transfer_ownership(conn, map)"},{"anchor":"transfer_ownership_form/2","id":"transfer_ownership_form/2","title":"transfer_ownership_form(conn, params)"},{"anchor":"update_role/2","id":"update_role/2","title":"update_role(conn, map)"}]}],"sections":[],"title":"PlausibleWeb.Site.MembershipController"},{"group":"","id":"PlausibleWeb.Site.MembershipView","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__resource__/0","id":"__resource__/0","title":"__resource__()"},{"anchor":"invite_member_form.html/1","id":"invite_member_form.html/1","title":"invite_member_form.html(assigns)"},{"anchor":"render/2","id":"render/2","title":"render(template, assigns \\\\ %{})"},{"anchor":"template_not_found/2","id":"template_not_found/2","title":"template_not_found(template, assigns)"},{"anchor":"transfer_ownership_form.html/1","id":"transfer_ownership_form.html/1","title":"transfer_ownership_form.html(assigns)"}]}],"sections":[],"title":"PlausibleWeb.Site.MembershipView"},{"group":"","id":"PlausibleWeb.SiteController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"add_monthly_report_recipient/2","id":"add_monthly_report_recipient/2","title":"add_monthly_report_recipient(conn, map)"},{"anchor":"add_snippet/2","id":"add_snippet/2","title":"add_snippet(conn, params)"},{"anchor":"add_snippet_after_domain_change/2","id":"add_snippet_after_domain_change/2","title":"add_snippet_after_domain_change(conn, params)"},{"anchor":"add_spike_notification_recipient/2","id":"add_spike_notification_recipient/2","title":"add_spike_notification_recipient(conn, map)"},{"anchor":"add_weekly_report_recipient/2","id":"add_weekly_report_recipient/2","title":"add_weekly_report_recipient(conn, map)"},{"anchor":"change_domain/2","id":"change_domain/2","title":"change_domain(conn, params)"},{"anchor":"change_domain_submit/2","id":"change_domain_submit/2","title":"change_domain_submit(conn, map)"},{"anchor":"create_goal/2","id":"create_goal/2","title":"create_goal(conn, map)"},{"anchor":"create_shared_link/2","id":"create_shared_link/2","title":"create_shared_link(conn, map)"},{"anchor":"create_site/2","id":"create_site/2","title":"create_site(conn, map)"},{"anchor":"delete_custom_domain/2","id":"delete_custom_domain/2","title":"delete_custom_domain(conn, map)"},{"anchor":"delete_goal/2","id":"delete_goal/2","title":"delete_goal(conn, map)"},{"anchor":"delete_google_auth/2","id":"delete_google_auth/2","title":"delete_google_auth(conn, params)"},{"anchor":"delete_shared_link/2","id":"delete_shared_link/2","title":"delete_shared_link(conn, map)"},{"anchor":"delete_site/2","id":"delete_site/2","title":"delete_site(conn, params)"},{"anchor":"disable_monthly_report/2","id":"disable_monthly_report/2","title":"disable_monthly_report(conn, params)"},{"anchor":"disable_spike_notification/2","id":"disable_spike_notification/2","title":"disable_spike_notification(conn, params)"},{"anchor":"disable_weekly_report/2","id":"disable_weekly_report/2","title":"disable_weekly_report(conn, params)"},{"anchor":"edit_shared_link/2","id":"edit_shared_link/2","title":"edit_shared_link(conn, map)"},{"anchor":"enable_monthly_report/2","id":"enable_monthly_report/2","title":"enable_monthly_report(conn, params)"},{"anchor":"enable_spike_notification/2","id":"enable_spike_notification/2","title":"enable_spike_notification(conn, params)"},{"anchor":"enable_weekly_report/2","id":"enable_weekly_report/2","title":"enable_weekly_report(conn, params)"},{"anchor":"forget_imported/2","id":"forget_imported/2","title":"forget_imported(conn, params)"},{"anchor":"import_from_google/2","id":"import_from_google/2","title":"import_from_google(conn, map)"},{"anchor":"import_from_google_confirm/2","id":"import_from_google_confirm/2","title":"import_from_google_confirm(conn, map)"},{"anchor":"import_from_google_user_metric_notice/2","id":"import_from_google_user_metric_notice/2","title":"import_from_google_user_metric_notice(conn, map)"},{"anchor":"import_from_google_view_id/2","id":"import_from_google_view_id/2","title":"import_from_google_view_id(conn, map)"},{"anchor":"import_from_google_view_id_form/2","id":"import_from_google_view_id_form/2","title":"import_from_google_view_id_form(conn, map)"},{"anchor":"index/2","id":"index/2","title":"index(conn, params)"},{"anchor":"make_private/2","id":"make_private/2","title":"make_private(conn, params)"},{"anchor":"make_public/2","id":"make_public/2","title":"make_public(conn, params)"},{"anchor":"new/2","id":"new/2","title":"new(conn, params)"},{"anchor":"new_goal/2","id":"new_goal/2","title":"new_goal(conn, params)"},{"anchor":"new_shared_link/2","id":"new_shared_link/2","title":"new_shared_link(conn, params)"},{"anchor":"remove_monthly_report_recipient/2","id":"remove_monthly_report_recipient/2","title":"remove_monthly_report_recipient(conn, map)"},{"anchor":"remove_spike_notification_recipient/2","id":"remove_spike_notification_recipient/2","title":"remove_spike_notification_recipient(conn, map)"},{"anchor":"remove_weekly_report_recipient/2","id":"remove_weekly_report_recipient/2","title":"remove_weekly_report_recipient(conn, map)"},{"anchor":"reset_stats/2","id":"reset_stats/2","title":"reset_stats(conn, params)"},{"anchor":"settings/2","id":"settings/2","title":"settings(conn, map)"},{"anchor":"settings_custom_domain/2","id":"settings_custom_domain/2","title":"settings_custom_domain(conn, params)"},{"anchor":"settings_danger_zone/2","id":"settings_danger_zone/2","title":"settings_danger_zone(conn, params)"},{"anchor":"settings_email_reports/2","id":"settings_email_reports/2","title":"settings_email_reports(conn, params)"},{"anchor":"settings_funnels/2","id":"settings_funnels/2","title":"settings_funnels(conn, params)"},{"anchor":"settings_general/2","id":"settings_general/2","title":"settings_general(conn, params)"},{"anchor":"settings_goals/2","id":"settings_goals/2","title":"settings_goals(conn, params)"},{"anchor":"settings_people/2","id":"settings_people/2","title":"settings_people(conn, params)"},{"anchor":"settings_search_console/2","id":"settings_search_console/2","title":"settings_search_console(conn, params)"},{"anchor":"settings_visibility/2","id":"settings_visibility/2","title":"settings_visibility(conn, params)"},{"anchor":"update_feature_visibility/2","id":"update_feature_visibility/2","title":"update_feature_visibility(conn, map)"},{"anchor":"update_google_auth/2","id":"update_google_auth/2","title":"update_google_auth(conn, map)"},{"anchor":"update_settings/2","id":"update_settings/2","title":"update_settings(conn, map)"},{"anchor":"update_shared_link/2","id":"update_shared_link/2","title":"update_shared_link(conn, map)"},{"anchor":"update_spike_notification/2","id":"update_spike_notification/2","title":"update_spike_notification(conn, map)"}]}],"sections":[],"title":"PlausibleWeb.SiteController"},{"group":"","id":"PlausibleWeb.SiteView","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__resource__/0","id":"__resource__/0","title":"__resource__()"},{"anchor":"base_domain/0","id":"base_domain/0","title":"base_domain()"},{"anchor":"change_domain.html/1","id":"change_domain.html/1","title":"change_domain.html(assigns)"},{"anchor":"edit_shared_link.html/1","id":"edit_shared_link.html/1","title":"edit_shared_link.html(assigns)"},{"anchor":"goal_name/1","id":"goal_name/1","title":"goal_name(arg)"},{"anchor":"google_logo/1","id":"google_logo/1","title":"google_logo(assigns \\\\ %{})"},{"anchor":"gravatar/2","id":"gravatar/2","title":"gravatar(email, opts)"},{"anchor":"import_from_google_confirm.html/1","id":"import_from_google_confirm.html/1","title":"import_from_google_confirm.html(assigns)"},{"anchor":"import_from_google_user_metric_form.html/1","id":"import_from_google_user_metric_form.html/1","title":"import_from_google_user_metric_form.html(assigns)"},{"anchor":"import_from_google_view_id_form.html/1","id":"import_from_google_view_id_form.html/1","title":"import_from_google_view_id_form.html(assigns)"},{"anchor":"index.html/1","id":"index.html/1","title":"index.html(assigns)"},{"anchor":"new.html/1","id":"new.html/1","title":"new.html(assigns)"},{"anchor":"new_goal.html/1","id":"new_goal.html/1","title":"new_goal.html(assigns)"},{"anchor":"new_shared_link.html/1","id":"new_shared_link.html/1","title":"new_shared_link.html(assigns)"},{"anchor":"plausible_url/0","id":"plausible_url/0","title":"plausible_url()"},{"anchor":"render/2","id":"render/2","title":"render(template, assigns \\\\ %{})"},{"anchor":"render_snippet/1","id":"render_snippet/1","title":"render_snippet(site)"},{"anchor":"settings_custom_domain.html/1","id":"settings_custom_domain.html/1","title":"settings_custom_domain.html(assigns)"},{"anchor":"settings_danger_zone.html/1","id":"settings_danger_zone.html/1","title":"settings_danger_zone.html(assigns)"},{"anchor":"settings_email_reports.html/1","id":"settings_email_reports.html/1","title":"settings_email_reports.html(assigns)"},{"anchor":"settings_funnels.html/1","id":"settings_funnels.html/1","title":"settings_funnels.html(assigns)"},{"anchor":"settings_general.html/1","id":"settings_general.html/1","title":"settings_general.html(assigns)"},{"anchor":"settings_goals.html/1","id":"settings_goals.html/1","title":"settings_goals.html(assigns)"},{"anchor":"settings_people.html/1","id":"settings_people.html/1","title":"settings_people.html(assigns)"},{"anchor":"settings_search_console.html/1","id":"settings_search_console.html/1","title":"settings_search_console.html(assigns)"},{"anchor":"settings_visibility.html/1","id":"settings_visibility.html/1","title":"settings_visibility.html(assigns)"},{"anchor":"shared_link_dest/2","id":"shared_link_dest/2","title":"shared_link_dest(site, link)"},{"anchor":"snippet.html/1","id":"snippet.html/1","title":"snippet.html(assigns)"},{"anchor":"snippet_after_domain_change.html/1","id":"snippet_after_domain_change.html/1","title":"snippet_after_domain_change.html(assigns)"},{"anchor":"template_not_found/2","id":"template_not_found/2","title":"template_not_found(template, assigns)"},{"anchor":"with_indefinite_article/1","id":"with_indefinite_article/1","title":"with_indefinite_article(word)"}]}],"sections":[],"title":"PlausibleWeb.SiteView"},{"group":"","id":"PlausibleWeb.StatsController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"authenticate_shared_link/2","id":"authenticate_shared_link/2","title":"authenticate_shared_link(conn, map)"},{"anchor":"csv_export/2","id":"csv_export/2","title":"csv_export(conn, params)"},{"anchor":"shared_link/2","id":"shared_link/2","title":"shared_link(conn, arg2)"},{"anchor":"stats/2","id":"stats/2","title":"stats(conn, params)"}]}],"sections":[],"title":"PlausibleWeb.StatsController"},{"group":"","id":"PlausibleWeb.StatsView","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__resource__/0","id":"__resource__/0","title":"__resource__()"},{"anchor":"base_domain/0","id":"base_domain/0","title":"base_domain()"},{"anchor":"large_number_format/1","id":"large_number_format/1","title":"large_number_format(n)"},{"anchor":"plausible_url/0","id":"plausible_url/0","title":"plausible_url()"},{"anchor":"pretty_stats_url/1","id":"pretty_stats_url/1","title":"pretty_stats_url(arg)"},{"anchor":"render/2","id":"render/2","title":"render(template, assigns \\\\ %{})"},{"anchor":"shared_link_password.html/1","id":"shared_link_password.html/1","title":"shared_link_password.html(assigns)"},{"anchor":"site_locked.html/1","id":"site_locked.html/1","title":"site_locked.html(assigns)"},{"anchor":"stats.html/1","id":"stats.html/1","title":"stats.html(assigns)"},{"anchor":"stats_container_class/1","id":"stats_container_class/1","title":"stats_container_class(conn)"},{"anchor":"template_not_found/2","id":"template_not_found/2","title":"template_not_found(template, assigns)"},{"anchor":"waiting_first_pageview.html/1","id":"waiting_first_pageview.html/1","title":"waiting_first_pageview.html(assigns)"}]}],"sections":[],"title":"PlausibleWeb.StatsView"},{"group":"","id":"PlausibleWeb.Tracker","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"call/2","id":"call/2","title":"call(conn, list)"},{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(arg)"},{"anchor":"init/1","id":"init/1","title":"init(opts)"}]}],"sections":[],"title":"PlausibleWeb.Tracker"},{"group":"","id":"PlausibleWeb.UnsubscribeController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"monthly_report/2","id":"monthly_report/2","title":"monthly_report(conn, map)"},{"anchor":"weekly_report/2","id":"weekly_report/2","title":"weekly_report(conn, map)"}]}],"sections":[],"title":"PlausibleWeb.UnsubscribeController"},{"group":"","id":"PlausibleWeb.UnsubscribeView","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__resource__/0","id":"__resource__/0","title":"__resource__()"},{"anchor":"render/2","id":"render/2","title":"render(template, assigns \\\\ %{})"},{"anchor":"success.html/1","id":"success.html/1","title":"success.html(assigns)"},{"anchor":"template_not_found/2","id":"template_not_found/2","title":"template_not_found(template, assigns)"}]}],"sections":[],"title":"PlausibleWeb.UnsubscribeView"}],"tasks":[{"group":"","id":"Mix.Tasks.AnalyzePlans","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"run/1","id":"run/1","title":"run(_)"}]}],"sections":[],"title":"mix analyze_plans"},{"group":"","id":"Mix.Tasks.CleanClickhouse","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"run/1","id":"run/1","title":"run(_)"}]}],"sections":[],"title":"mix clean_clickhouse"},{"group":"","id":"Mix.Tasks.CreateFreeSubscription","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"execute/1","id":"execute/1","title":"execute(user_id)"},{"anchor":"run/1","id":"run/1","title":"run(arg1)"}]}],"sections":[],"title":"mix create_free_subscription"},{"group":"","id":"Mix.Tasks.DownloadCountryDatabase","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"run/1","id":"run/1","title":"run(_)"}]}],"sections":[],"title":"mix download_country_database"},{"group":"","id":"Mix.Tasks.GenerateReferrerFavicons","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"run/1","id":"run/1","title":"run(_)"}]}],"sections":[],"title":"mix generate_referrer_favicons"},{"group":"","id":"Mix.Tasks.PullSandboxSubscription","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"run/1","id":"run/1","title":"run(list)"}]}],"sections":[],"title":"mix pull_sandbox_subscription"},{"group":"","id":"Mix.Tasks.SendPageview","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"run/1","id":"run/1","title":"run(opts)"}]}],"sections":[],"title":"mix send_pageview"}]} \ No newline at end of file diff --git a/dist/sidebar_items-D1A5539C.js b/dist/sidebar_items-D1A5539C.js new file mode 100644 index 000000000..16eafb0af --- /dev/null +++ b/dist/sidebar_items-D1A5539C.js @@ -0,0 +1 @@ +sidebarNodes={"extras":[{"group":"","headers":[{"anchor":"modules","id":"Modules"},{"anchor":"mix-tasks","id":"Mix Tasks"}],"id":"api-reference","title":"API Reference"},{"group":"","headers":[{"anchor":"why-plausible","id":"Why Plausible?"},{"anchor":"why-is-plausible-analytics-cloud-not-free-like-google-analytics","id":"Why is Plausible Analytics Cloud not free like Google Analytics?"},{"anchor":"getting-started-with-plausible","id":"Getting started with Plausible"},{"anchor":"technology","id":"Technology"},{"anchor":"contributors","id":"Contributors"},{"anchor":"feedback-roadmap","id":"Feedback & Roadmap"},{"anchor":"license","id":"License"}],"id":"readme","title":"Introduction"},{"group":"","headers":[{"anchor":"development-setup","id":"Development setup"},{"anchor":"finding-a-task","id":"Finding a task"}],"id":"contributing","title":"Contributing"},{"group":"Features","headers":[{"anchor":"usage-alert-and-grace-period","id":"Usage alert and grace period"},{"anchor":"account-locking","id":"Account locking"}],"id":"account-locking","title":"Account locking"}],"modules":[{"group":"","id":"ObanErrorReporter","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"handle_event/4","id":"handle_event/4","title":"handle_event(list, measure, meta, _)"}]}],"sections":[],"title":"ObanErrorReporter"},{"group":"","id":"Plausible","sections":[],"title":"Plausible"},{"group":"","id":"Plausible.AsyncInsertRepo","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"aggregate/3","id":"aggregate/3","title":"aggregate(queryable, aggregate, opts \\\\ [])"},{"anchor":"aggregate/4","id":"aggregate/4","title":"aggregate(queryable, aggregate, field, opts)"},{"anchor":"all/2","id":"all/2","title":"all(queryable, opts \\\\ [])"},{"anchor":"checked_out?/0","id":"checked_out?/0","title":"checked_out?()"},{"anchor":"checkout/2","id":"checkout/2","title":"checkout(fun, opts \\\\ [])"},{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"},{"anchor":"config/0","id":"config/0","title":"config()"},{"anchor":"default_options/1","id":"default_options/1","title":"default_options(operation)"},{"anchor":"delete/2","id":"delete/2","title":"delete(struct, opts \\\\ [])"},{"anchor":"delete!/2","id":"delete!/2","title":"delete!(struct, opts \\\\ [])"},{"anchor":"delete_all/2","id":"delete_all/2","title":"delete_all(queryable, opts \\\\ [])"},{"anchor":"disconnect_all/2","id":"disconnect_all/2","title":"disconnect_all(interval, opts \\\\ [])"},{"anchor":"exists?/2","id":"exists?/2","title":"exists?(queryable, opts \\\\ [])"},{"anchor":"get/3","id":"get/3","title":"get(queryable, id, opts \\\\ [])"},{"anchor":"get!/3","id":"get!/3","title":"get!(queryable, id, opts \\\\ [])"},{"anchor":"get_by/3","id":"get_by/3","title":"get_by(queryable, clauses, opts \\\\ [])"},{"anchor":"get_by!/3","id":"get_by!/3","title":"get_by!(queryable, clauses, opts \\\\ [])"},{"anchor":"get_dynamic_repo/0","id":"get_dynamic_repo/0","title":"get_dynamic_repo()"},{"anchor":"insert/2","id":"insert/2","title":"insert(struct, opts \\\\ [])"},{"anchor":"insert!/2","id":"insert!/2","title":"insert!(struct, opts \\\\ [])"},{"anchor":"insert_all/3","id":"insert_all/3","title":"insert_all(schema_or_source, entries, opts \\\\ [])"},{"anchor":"insert_or_update/2","id":"insert_or_update/2","title":"insert_or_update(changeset, opts \\\\ [])"},{"anchor":"insert_or_update!/2","id":"insert_or_update!/2","title":"insert_or_update!(changeset, opts \\\\ [])"},{"anchor":"insert_stream/3","id":"insert_stream/3","title":"insert_stream(source_or_schema, rows, opts \\\\ [])"},{"anchor":"load/2","id":"load/2","title":"load(schema_or_types, data)"},{"anchor":"one/2","id":"one/2","title":"one(queryable, opts \\\\ [])"},{"anchor":"one!/2","id":"one!/2","title":"one!(queryable, opts \\\\ [])"},{"anchor":"preload/3","id":"preload/3","title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])"},{"anchor":"prepare_query/3","id":"prepare_query/3","title":"prepare_query(operation, query, opts)"},{"anchor":"put_dynamic_repo/1","id":"put_dynamic_repo/1","title":"put_dynamic_repo(dynamic)"},{"anchor":"query/3","id":"query/3","title":"query(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"query!/3","id":"query!/3","title":"query!(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"reload/2","id":"reload/2","title":"reload(queryable, opts \\\\ [])"},{"anchor":"reload!/2","id":"reload!/2","title":"reload!(queryable, opts \\\\ [])"},{"anchor":"start_link/1","id":"start_link/1","title":"start_link(opts \\\\ [])"},{"anchor":"stop/1","id":"stop/1","title":"stop(timeout \\\\ 5000)"},{"anchor":"stream/2","id":"stream/2","title":"stream(queryable, opts \\\\ [])"},{"anchor":"to_sql/2","id":"to_sql/2","title":"to_sql(operation, queryable)"},{"anchor":"update/2","id":"update/2","title":"update(struct, opts \\\\ [])"},{"anchor":"update!/2","id":"update!/2","title":"update!(struct, opts \\\\ [])"},{"anchor":"update_all/3","id":"update_all/3","title":"update_all(queryable, updates, opts \\\\ [])"}]}],"sections":[],"title":"Plausible.AsyncInsertRepo"},{"group":"","id":"Plausible.Auth","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"create_user/3","id":"create_user/3","title":"create_user(name, email, pwd)"},{"anchor":"delete_user/1","id":"delete_user/1","title":"delete_user(user)"},{"anchor":"enterprise?/1","id":"enterprise?/1","title":"enterprise?(user)"},{"anchor":"find_user_by/1","id":"find_user_by/1","title":"find_user_by(opts)"},{"anchor":"has_active_sites?/2","id":"has_active_sites?/2","title":"has_active_sites?(user, roles \\\\ [:owner, :admin, :viewer])"},{"anchor":"is_super_admin?/1","id":"is_super_admin?/1","title":"is_super_admin?(user_id)"},{"anchor":"issue_email_verification/1","id":"issue_email_verification/1","title":"issue_email_verification(user)"},{"anchor":"user_owns_sites?/1","id":"user_owns_sites?/1","title":"user_owns_sites?(user)"},{"anchor":"verify_email/2","id":"verify_email/2","title":"verify_email(user, code)"}]}],"sections":[],"title":"Plausible.Auth"},{"group":"","id":"Plausible.Auth.ApiKey","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"changeset/2","id":"changeset/2","title":"changeset(schema, attrs \\\\ %{})"},{"anchor":"do_hash/1","id":"do_hash/1","title":"do_hash(key)"},{"anchor":"process_key/1","id":"process_key/1","title":"process_key(changeset)"},{"anchor":"update/2","id":"update/2","title":"update(schema, attrs \\\\ %{})"}]}],"sections":[],"title":"Plausible.Auth.ApiKey"},{"group":"","id":"Plausible.Auth.ApiKeyAdmin","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"create_changeset/2","id":"create_changeset/2","title":"create_changeset(schema, attrs)"},{"anchor":"custom_index_query/3","id":"custom_index_query/3","title":"custom_index_query(conn, schema, query)"},{"anchor":"form_fields/1","id":"form_fields/1","title":"form_fields(_)"},{"anchor":"index/1","id":"index/1","title":"index(_)"},{"anchor":"search_fields/1","id":"search_fields/1","title":"search_fields(schema)"},{"anchor":"update_changeset/2","id":"update_changeset/2","title":"update_changeset(schema, attrs)"}]}],"sections":[],"title":"Plausible.Auth.ApiKeyAdmin"},{"group":"","id":"Plausible.Auth.GracePeriod","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"active?/1","id":"active?/1","title":"active?(user)"},{"anchor":"end_changeset/1","id":"end_changeset/1","title":"end_changeset(user)"},{"anchor":"expired?/1","id":"expired?/1","title":"expired?(user)"},{"anchor":"remove_changeset/1","id":"remove_changeset/1","title":"remove_changeset(user)"},{"anchor":"start_changeset/2","id":"start_changeset/2","title":"start_changeset(user, allowance_required)"},{"anchor":"start_manual_lock_changeset/2","id":"start_manual_lock_changeset/2","title":"start_manual_lock_changeset(user, allowance_required)"}]}],"sections":[],"title":"Plausible.Auth.GracePeriod"},{"group":"","id":"Plausible.Auth.Invitation","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"new/1","id":"new/1","title":"new(attrs \\\\ %{})"}]}],"sections":[],"title":"Plausible.Auth.Invitation"},{"group":"","id":"Plausible.Auth.Password","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"dummy_calculation/0","id":"dummy_calculation/0","title":"dummy_calculation()"},{"anchor":"hash/1","id":"hash/1","title":"hash(password)"},{"anchor":"match?/2","id":"match?/2","title":"match?(password, hash)"}]}],"sections":[],"title":"Plausible.Auth.Password"},{"group":"","id":"Plausible.Auth.Token","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"sign_password_reset/1","id":"sign_password_reset/1","title":"sign_password_reset(email)"},{"anchor":"sign_shared_link/1","id":"sign_shared_link/1","title":"sign_shared_link(slug)"},{"anchor":"verify_password_reset/1","id":"verify_password_reset/1","title":"verify_password_reset(token)"},{"anchor":"verify_shared_link/1","id":"verify_shared_link/1","title":"verify_shared_link(token)"}]}],"sections":[],"title":"Plausible.Auth.Token"},{"group":"","id":"Plausible.Auth.User","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"changeset/2","id":"changeset/2","title":"changeset(user, attrs \\\\ %{})"},{"anchor":"end_trial/1","id":"end_trial/1","title":"end_trial(user)"},{"anchor":"hash_password/1","id":"hash_password/1","title":"hash_password(changeset)"},{"anchor":"new/1","id":"new/1","title":"new(attrs \\\\ %{})"},{"anchor":"remove_trial_expiry/1","id":"remove_trial_expiry/1","title":"remove_trial_expiry(user)"},{"anchor":"set_password/2","id":"set_password/2","title":"set_password(user, password)"},{"anchor":"start_trial/1","id":"start_trial/1","title":"start_trial(user)"}]}],"sections":[],"title":"Plausible.Auth.User"},{"group":"","id":"Plausible.Auth.UserAdmin","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"custom_index_query/3","id":"custom_index_query/3","title":"custom_index_query(conn, schema, query)"},{"anchor":"form_fields/1","id":"form_fields/1","title":"form_fields(_)"},{"anchor":"index/1","id":"index/1","title":"index(_)"},{"anchor":"resource_actions/1","id":"resource_actions/1","title":"resource_actions(_)"}]}],"sections":[],"title":"Plausible.Auth.UserAdmin"},{"group":"","id":"Plausible.Billing","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"active_subscription_for/1","id":"active_subscription_for/1","title":"active_subscription_for(user_id)"},{"anchor":"change_plan/2","id":"change_plan/2","title":"change_plan(user, new_plan_id)"},{"anchor":"change_plan_preview/2","id":"change_plan_preview/2","title":"change_plan_preview(subscription, new_plan_id)"},{"anchor":"has_active_subscription?/1","id":"has_active_subscription?/1","title":"has_active_subscription?(user_id)"},{"anchor":"last_two_billing_cycles/2","id":"last_two_billing_cycles/2","title":"last_two_billing_cycles(user, today \\\\ Timex.today())"},{"anchor":"last_two_billing_months_usage/2","id":"last_two_billing_months_usage/2","title":"last_two_billing_months_usage(user, today \\\\ Timex.today())"},{"anchor":"needs_to_upgrade?/1","id":"needs_to_upgrade?/1","title":"needs_to_upgrade?(user)"},{"anchor":"on_trial?/1","id":"on_trial?/1","title":"on_trial?(user)"},{"anchor":"paddle_api/0","id":"paddle_api/0","title":"paddle_api()"},{"anchor":"sites_limit/1","id":"sites_limit/1","title":"sites_limit(user)"},{"anchor":"subscription_cancelled/1","id":"subscription_cancelled/1","title":"subscription_cancelled(params)"},{"anchor":"subscription_created/1","id":"subscription_created/1","title":"subscription_created(params)"},{"anchor":"subscription_payment_succeeded/1","id":"subscription_payment_succeeded/1","title":"subscription_payment_succeeded(params)"},{"anchor":"subscription_updated/1","id":"subscription_updated/1","title":"subscription_updated(params)"},{"anchor":"trial_days_left/1","id":"trial_days_left/1","title":"trial_days_left(user)"},{"anchor":"usage/1","id":"usage/1","title":"usage(user)"},{"anchor":"usage_breakdown/1","id":"usage_breakdown/1","title":"usage_breakdown(user)"}]}],"sections":[],"title":"Plausible.Billing"},{"group":"","id":"Plausible.Billing.EnterprisePlan","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"changeset/2","id":"changeset/2","title":"changeset(model, attrs \\\\ %{})"}]}],"sections":[],"title":"Plausible.Billing.EnterprisePlan"},{"group":"","id":"Plausible.Billing.EnterprisePlanAdmin","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"custom_index_query/3","id":"custom_index_query/3","title":"custom_index_query(conn, schema, query)"},{"anchor":"form_fields/1","id":"form_fields/1","title":"form_fields(_)"},{"anchor":"index/1","id":"index/1","title":"index(_)"},{"anchor":"search_fields/1","id":"search_fields/1","title":"search_fields(schema)"}]}],"sections":[],"title":"Plausible.Billing.EnterprisePlanAdmin"},{"group":"","id":"Plausible.Billing.PaddleApi","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"checkout_domain/0","id":"checkout_domain/0","title":"checkout_domain()"},{"anchor":"get_invoices/1","id":"get_invoices/1","title":"get_invoices(subscription)"},{"anchor":"get_subscription/1","id":"get_subscription/1","title":"get_subscription(paddle_subscription_id)"},{"anchor":"update_subscription/2","id":"update_subscription/2","title":"update_subscription(paddle_subscription_id, params)"},{"anchor":"update_subscription_preview/2","id":"update_subscription_preview/2","title":"update_subscription_preview(paddle_subscription_id, new_plan_id)"},{"anchor":"vendors_domain/0","id":"vendors_domain/0","title":"vendors_domain()"}]}],"sections":[],"title":"Plausible.Billing.PaddleApi"},{"group":"","id":"Plausible.Billing.Plans","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:plan/0","id":"plan/0","title":"plan()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"all_yearly_plan_ids/0","id":"all_yearly_plan_ids/0","title":"all_yearly_plan_ids()"},{"anchor":"allowance/1","id":"allowance/1","title":"allowance(subscription)"},{"anchor":"for_product_id/1","id":"for_product_id/1","title":"for_product_id(product_id)"},{"anchor":"plans_for/1","id":"plans_for/1","title":"plans_for(user)"},{"anchor":"subscription_interval/1","id":"subscription_interval/1","title":"subscription_interval(subscription)"},{"anchor":"suggested_plan/2","id":"suggested_plan/2","title":"suggested_plan(user, usage_during_cycle)"}]}],"sections":[],"title":"Plausible.Billing.Plans"},{"group":"","id":"Plausible.Billing.SiteLocker","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"check_sites_for/1","id":"check_sites_for/1","title":"check_sites_for(user)"},{"anchor":"set_lock_status_for/2","id":"set_lock_status_for/2","title":"set_lock_status_for(user, status)"}]}],"sections":[],"title":"Plausible.Billing.SiteLocker"},{"group":"","id":"Plausible.ChangesetHelpers","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"traverse_errors/1","id":"traverse_errors/1","title":"traverse_errors(changeset)"}]}],"sections":[],"title":"Plausible.ChangesetHelpers"},{"group":"","id":"Plausible.Cldr","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"available_locale_name?/1","id":"available_locale_name?/1","title":"available_locale_name?(locale_name)"},{"anchor":"default_locale/0","id":"default_locale/0","title":"default_locale()"},{"anchor":"default_territory/0","id":"default_territory/0","title":"default_territory()"},{"anchor":"ellipsis/2","id":"ellipsis/2","title":"ellipsis(string, options \\\\ [])"},{"anchor":"get_locale/0","id":"get_locale/0","title":"get_locale()"},{"anchor":"known_calendars/0","id":"known_calendars/0","title":"known_calendars()"},{"anchor":"known_currencies/0","id":"known_currencies/0","title":"known_currencies()"},{"anchor":"known_gettext_locale_name/1","id":"known_gettext_locale_name/1","title":"known_gettext_locale_name(locale_name)"},{"anchor":"known_gettext_locale_name?/1","id":"known_gettext_locale_name?/1","title":"known_gettext_locale_name?(locale_name)"},{"anchor":"known_gettext_locale_names/0","id":"known_gettext_locale_names/0","title":"known_gettext_locale_names()"},{"anchor":"known_locale_name/1","id":"known_locale_name/1","title":"known_locale_name(locale_name)"},{"anchor":"known_locale_name?/1","id":"known_locale_name?/1","title":"known_locale_name?(locale_name)"},{"anchor":"known_locale_names/0","id":"known_locale_names/0","title":"known_locale_names()"},{"anchor":"known_number_system_types/0","id":"known_number_system_types/0","title":"known_number_system_types()"},{"anchor":"known_number_systems/0","id":"known_number_systems/0","title":"known_number_systems()"},{"anchor":"known_rbnf_locale_name/1","id":"known_rbnf_locale_name/1","title":"known_rbnf_locale_name(locale_name)"},{"anchor":"known_rbnf_locale_name?/1","id":"known_rbnf_locale_name?/1","title":"known_rbnf_locale_name?(locale_name)"},{"anchor":"known_rbnf_locale_names/0","id":"known_rbnf_locale_names/0","title":"known_rbnf_locale_names()"},{"anchor":"known_territories/0","id":"known_territories/0","title":"known_territories()"},{"anchor":"normalize_lenient_parse/3","id":"normalize_lenient_parse/3","title":"normalize_lenient_parse(string, scope, locale \\\\ get_locale())"},{"anchor":"put_locale/1","id":"put_locale/1","title":"put_locale(locale_name)"},{"anchor":"quote/2","id":"quote/2","title":"quote(string, options \\\\ [])"},{"anchor":"unknown_locale_names/0","id":"unknown_locale_names/0","title":"unknown_locale_names()"},{"anchor":"validate_calendar/1","id":"validate_calendar/1","title":"validate_calendar(calendar)"},{"anchor":"validate_currency/1","id":"validate_currency/1","title":"validate_currency(currency)"},{"anchor":"validate_locale/1","id":"validate_locale/1","title":"validate_locale(locale)"},{"anchor":"validate_number_system/1","id":"validate_number_system/1","title":"validate_number_system(number_system)"},{"anchor":"validate_number_system_type/1","id":"validate_number_system_type/1","title":"validate_number_system_type(number_system_type)"},{"anchor":"validate_territory/1","id":"validate_territory/1","title":"validate_territory(territory)"},{"anchor":"with_locale/2","id":"with_locale/2","title":"with_locale(locale, fun)"}]}],"sections":[],"title":"Plausible.Cldr"},{"group":"","id":"Plausible.Cldr.AcceptLanguage","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"best_match/1","id":"best_match/1","title":"best_match(accept_language)"},{"anchor":"parse/1","id":"parse/1","title":"parse(tokens_or_string)"},{"anchor":"parse!/1","id":"parse!/1","title":"parse!(accept_language)"}]}],"sections":[],"title":"Plausible.Cldr.AcceptLanguage"},{"group":"","id":"Plausible.Cldr.Currency","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"currencies_for_locale/3","id":"currencies_for_locale/3","title":"currencies_for_locale(locale, only \\\\ :all, except \\\\ nil)"},{"anchor":"currencies_for_locale!/3","id":"currencies_for_locale!/3","title":"currencies_for_locale!(locale, only \\\\ :all, except \\\\ nil)"},{"anchor":"currency_for_code/2","id":"currency_for_code/2","title":"currency_for_code(currency_or_currency_code, options \\\\ [locale: Plausible.Cldr.default_locale()])"},{"anchor":"currency_for_code!/2","id":"currency_for_code!/2","title":"currency_for_code!(currency_or_currency_code, options \\\\ [locale: Plausible.Cldr.default_locale()])"},{"anchor":"currency_from_locale/1","id":"currency_from_locale/1","title":"currency_from_locale(locale)"},{"anchor":"currency_history_for_locale/1","id":"currency_history_for_locale/1","title":"currency_history_for_locale(language_tag)"},{"anchor":"currency_strings/3","id":"currency_strings/3","title":"currency_strings(locale, only \\\\ :all, except \\\\ nil)"},{"anchor":"currency_strings!/3","id":"currency_strings!/3","title":"currency_strings!(locale_name, only \\\\ :all, except \\\\ nil)"},{"anchor":"current_currency_from_locale/1","id":"current_currency_from_locale/1","title":"current_currency_from_locale(locale)"},{"anchor":"current_territory_currencies/0","id":"current_territory_currencies/0","title":"current_territory_currencies()"},{"anchor":"known_currencies/0","id":"known_currencies/0","title":"known_currencies()"},{"anchor":"known_currency?/1","id":"known_currency?/1","title":"known_currency?(code)"},{"anchor":"known_currency_code/1","id":"known_currency_code/1","title":"known_currency_code(currency_code)"},{"anchor":"known_currency_code?/1","id":"known_currency_code?/1","title":"known_currency_code?(currency_code)"},{"anchor":"known_currency_codes/0","id":"known_currency_codes/0","title":"known_currency_codes()"},{"anchor":"new/2","id":"new/2","title":"new(currency, options \\\\ [])"},{"anchor":"pluralize/3","id":"pluralize/3","title":"pluralize(number, currency, options \\\\ [])"},{"anchor":"strings_for_currency/2","id":"strings_for_currency/2","title":"strings_for_currency(currency, locale)"}]}],"sections":[],"title":"Plausible.Cldr.Currency"},{"group":"","id":"Plausible.Cldr.Locale","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"fallback_locale_names/1","id":"fallback_locale_names/1","title":"fallback_locale_names(locale)"},{"anchor":"fallback_locales/1","id":"fallback_locales/1","title":"fallback_locales(locale)"},{"anchor":"locale_for_territory/1","id":"locale_for_territory/1","title":"locale_for_territory(territory)"},{"anchor":"locale_from_host/2","id":"locale_from_host/2","title":"locale_from_host(host, options \\\\ [])"},{"anchor":"new/1","id":"new/1","title":"new(locale_name)"},{"anchor":"new!/1","id":"new!/1","title":"new!(locale_name)"},{"anchor":"script_direction_from_locale/1","id":"script_direction_from_locale/1","title":"script_direction_from_locale(locale)"},{"anchor":"territory_from_host/1","id":"territory_from_host/1","title":"territory_from_host(host)"},{"anchor":"territory_from_locale/1","id":"territory_from_locale/1","title":"territory_from_locale(locale)"},{"anchor":"timezone_from_locale/1","id":"timezone_from_locale/1","title":"timezone_from_locale(locale)"}]}],"sections":[],"title":"Plausible.Cldr.Locale"},{"group":"","id":"Plausible.Cldr.Number","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"parse/2","id":"parse/2","title":"parse(string, options \\\\ [])"},{"anchor":"resolve_currencies/2","id":"resolve_currencies/2","title":"resolve_currencies(list, options \\\\ [])"},{"anchor":"resolve_currency/2","id":"resolve_currency/2","title":"resolve_currency(string, options \\\\ [])"},{"anchor":"resolve_per/2","id":"resolve_per/2","title":"resolve_per(string, options \\\\ [])"},{"anchor":"resolve_pers/2","id":"resolve_pers/2","title":"resolve_pers(list, options \\\\ [])"},{"anchor":"scan/2","id":"scan/2","title":"scan(string, options \\\\ [])"},{"anchor":"to_approx_string/2","id":"to_approx_string/2","title":"to_approx_string(number, options \\\\ [])"},{"anchor":"to_at_least_string/2","id":"to_at_least_string/2","title":"to_at_least_string(number, options \\\\ [])"},{"anchor":"to_at_most_string/2","id":"to_at_most_string/2","title":"to_at_most_string(number, options \\\\ [])"},{"anchor":"to_range_string/2","id":"to_range_string/2","title":"to_range_string(range, options \\\\ [])"},{"anchor":"to_string/2","id":"to_string/2","title":"to_string(number, options \\\\ default_options())"},{"anchor":"to_string!/2","id":"to_string!/2","title":"to_string!(number, options \\\\ default_options())"},{"anchor":"validate_number_system/2","id":"validate_number_system/2","title":"validate_number_system(locale, number_system)"}]}],"sections":[],"title":"Plausible.Cldr.Number"},{"group":"","id":"Plausible.Cldr.Number.Cardinal","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"available_locale_names/0","id":"available_locale_names/0","title":"available_locale_names()"},{"anchor":"known_locale_names/0","id":"known_locale_names/0","title":"known_locale_names()"},{"anchor":"plural_rule/3","id":"plural_rule/3","title":"plural_rule(number, locale, rounding \\\\ Math.default_rounding())"},{"anchor":"plural_rules/0","id":"plural_rules/0","title":"plural_rules()"},{"anchor":"plural_rules_for/1","id":"plural_rules_for/1","title":"plural_rules_for(locale_name)"},{"anchor":"pluralize/3","id":"pluralize/3","title":"pluralize(number, locale_name, substitutions)"}]}],"sections":[],"title":"Plausible.Cldr.Number.Cardinal"},{"group":"","id":"Plausible.Cldr.Number.Format","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"all_formats_for/1","id":"all_formats_for/1","title":"all_formats_for(locale \\\\ Plausible.Cldr.get_locale())"},{"anchor":"all_formats_for!/1","id":"all_formats_for!/1","title":"all_formats_for!(locale \\\\ Plausible.Cldr.get_locale())"},{"anchor":"currency_spacing/2","id":"currency_spacing/2","title":"currency_spacing(locale, number_system)"},{"anchor":"decimal_format_list/0","id":"decimal_format_list/0","title":"decimal_format_list()"},{"anchor":"decimal_format_list_for/1","id":"decimal_format_list_for/1","title":"decimal_format_list_for(locale \\\\ Plausible.Cldr.get_locale())"},{"anchor":"default_grouping_for/1","id":"default_grouping_for/1","title":"default_grouping_for(locale \\\\ Plausible.Cldr.get_locale())"},{"anchor":"default_grouping_for!/1","id":"default_grouping_for!/1","title":"default_grouping_for!(locale)"},{"anchor":"formats_for/2","id":"formats_for/2","title":"formats_for(locale \\\\ Plausible.Cldr.default_locale(), number_system \\\\ Cldr.Number.System.default_number_system_type())"},{"anchor":"formats_for!/2","id":"formats_for!/2","title":"formats_for!(locale \\\\ Plausible.Cldr.default_locale(), number_system \\\\ Cldr.Number.System.default_number_system_type())"},{"anchor":"minimum_grouping_digits_for/1","id":"minimum_grouping_digits_for/1","title":"minimum_grouping_digits_for(locale \\\\ Plausible.Cldr.get_locale())"},{"anchor":"minimum_grouping_digits_for!/1","id":"minimum_grouping_digits_for!/1","title":"minimum_grouping_digits_for!(locale)"}]}],"sections":[{"anchor":"module-number-pattern-examples","id":"Number Pattern Examples"}],"title":"Plausible.Cldr.Number.Format"},{"group":"","id":"Plausible.Cldr.Number.Formatter.Decimal","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"metadata!/1","id":"metadata!/1","title":"metadata!(format)"},{"anchor":"to_string/3","id":"to_string/3","title":"to_string(number, format, options \\\\ [])"}]}],"sections":[],"title":"Plausible.Cldr.Number.Formatter.Decimal"},{"group":"","id":"Plausible.Cldr.Number.Ordinal","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"available_locale_names/0","id":"available_locale_names/0","title":"available_locale_names()"},{"anchor":"known_locale_names/0","id":"known_locale_names/0","title":"known_locale_names()"},{"anchor":"plural_rule/3","id":"plural_rule/3","title":"plural_rule(number, locale, rounding \\\\ Math.default_rounding())"},{"anchor":"plural_rules/0","id":"plural_rules/0","title":"plural_rules()"},{"anchor":"plural_rules_for/1","id":"plural_rules_for/1","title":"plural_rules_for(locale_name)"},{"anchor":"pluralize/3","id":"pluralize/3","title":"pluralize(number, locale_name, substitutions)"}]}],"sections":[],"title":"Plausible.Cldr.Number.Ordinal"},{"group":"","id":"Plausible.Cldr.Number.PluralRule.Range","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"plural_rule/3","id":"plural_rule/3","title":"plural_rule(first, last, locale)"}]}],"sections":[],"title":"Plausible.Cldr.Number.PluralRule.Range"},{"group":"","id":"Plausible.Cldr.Number.Symbol","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"all_decimal_symbols/0","id":"all_decimal_symbols/0","title":"all_decimal_symbols()"},{"anchor":"all_decimal_symbols_class/0","id":"all_decimal_symbols_class/0","title":"all_decimal_symbols_class()"},{"anchor":"all_grouping_symbols/0","id":"all_grouping_symbols/0","title":"all_grouping_symbols()"},{"anchor":"all_grouping_symbols_class/0","id":"all_grouping_symbols_class/0","title":"all_grouping_symbols_class()"},{"anchor":"number_symbols_for/1","id":"number_symbols_for/1","title":"number_symbols_for(locale \\\\ Plausible.Cldr.get_locale())"},{"anchor":"number_symbols_for/2","id":"number_symbols_for/2","title":"number_symbols_for(locale, number_system)"}]}],"sections":[],"title":"Plausible.Cldr.Number.Symbol"},{"group":"","id":"Plausible.Cldr.Number.System","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"number_system_for/2","id":"number_system_for/2","title":"number_system_for(locale, system_name)"},{"anchor":"number_system_from_locale/1","id":"number_system_from_locale/1","title":"number_system_from_locale(locale)"},{"anchor":"number_system_names_for/1","id":"number_system_names_for/1","title":"number_system_names_for(locale)"},{"anchor":"number_system_names_for!/1","id":"number_system_names_for!/1","title":"number_system_names_for!(locale)"},{"anchor":"number_system_types_for/1","id":"number_system_types_for/1","title":"number_system_types_for(locale)"},{"anchor":"number_systems_for/1","id":"number_systems_for/1","title":"number_systems_for(locale)"},{"anchor":"number_systems_for!/1","id":"number_systems_for!/1","title":"number_systems_for!(locale)"},{"anchor":"number_systems_like/2","id":"number_systems_like/2","title":"number_systems_like(locale, number_system)"},{"anchor":"system_name_from/2","id":"system_name_from/2","title":"system_name_from(system_name, locale)"},{"anchor":"to_system/2","id":"to_system/2","title":"to_system(number, system)"},{"anchor":"to_system!/2","id":"to_system!/2","title":"to_system!(number, system_name)"}]}],"sections":[],"title":"Plausible.Cldr.Number.System"},{"group":"","id":"Plausible.Cldr.Number.Transliterate","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"transliterate/3","id":"transliterate/3","title":"transliterate(sequence, locale \\\\ Plausible.Cldr.get_locale(), number_system \\\\ System.default_number_system_type())"},{"anchor":"transliterate!/3","id":"transliterate!/3","title":"transliterate!(sequence, locale, number_system)"},{"anchor":"transliterate_digits/3","id":"transliterate_digits/3","title":"transliterate_digits(digits, from_system, to_system)"}]}],"sections":[],"title":"Plausible.Cldr.Number.Transliterate"},{"group":"","id":"Plausible.Cldr.Rbnf.NumberSystem","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"all_rule_sets/0","id":"all_rule_sets/0","title":"all_rule_sets()"},{"anchor":"armenian_lower/1","id":"armenian_lower/1","title":"armenian_lower(number)"},{"anchor":"armenian_lower/2","id":"armenian_lower/2","title":"armenian_lower(number, locale)"},{"anchor":"armenian_upper/1","id":"armenian_upper/1","title":"armenian_upper(number)"},{"anchor":"armenian_upper/2","id":"armenian_upper/2","title":"armenian_upper(number, locale)"},{"anchor":"cyrillic_lower/1","id":"cyrillic_lower/1","title":"cyrillic_lower(number)"},{"anchor":"cyrillic_lower/2","id":"cyrillic_lower/2","title":"cyrillic_lower(number, locale)"},{"anchor":"cyrillic_lower_1_10/2","id":"cyrillic_lower_1_10/2","title":"cyrillic_lower_1_10(number, language_tag)"},{"anchor":"cyrillic_lower_final/2","id":"cyrillic_lower_final/2","title":"cyrillic_lower_final(number, language_tag)"},{"anchor":"cyrillic_lower_post/2","id":"cyrillic_lower_post/2","title":"cyrillic_lower_post(number, language_tag)"},{"anchor":"cyrillic_lower_thousands/2","id":"cyrillic_lower_thousands/2","title":"cyrillic_lower_thousands(number, language_tag)"},{"anchor":"ethiopic/1","id":"ethiopic/1","title":"ethiopic(number)"},{"anchor":"ethiopic/2","id":"ethiopic/2","title":"ethiopic(number, locale)"},{"anchor":"ethiopic_p1/2","id":"ethiopic_p1/2","title":"ethiopic_p1(number, language_tag)"},{"anchor":"ethiopic_p2/2","id":"ethiopic_p2/2","title":"ethiopic_p2(number, language_tag)"},{"anchor":"ethiopic_p3/2","id":"ethiopic_p3/2","title":"ethiopic_p3(number, language_tag)"},{"anchor":"ethiopic_p/2","id":"ethiopic_p/2","title":"ethiopic_p(number, language_tag)"},{"anchor":"georgian/1","id":"georgian/1","title":"georgian(number)"},{"anchor":"georgian/2","id":"georgian/2","title":"georgian(number, locale)"},{"anchor":"greek_lower/1","id":"greek_lower/1","title":"greek_lower(number)"},{"anchor":"greek_lower/2","id":"greek_lower/2","title":"greek_lower(number, locale)"},{"anchor":"greek_numeral_majuscules/2","id":"greek_numeral_majuscules/2","title":"greek_numeral_majuscules(number, language_tag)"},{"anchor":"greek_numeral_minuscules/2","id":"greek_numeral_minuscules/2","title":"greek_numeral_minuscules(number, language_tag)"},{"anchor":"greek_upper/1","id":"greek_upper/1","title":"greek_upper(number)"},{"anchor":"greek_upper/2","id":"greek_upper/2","title":"greek_upper(number, locale)"},{"anchor":"hebrew/1","id":"hebrew/1","title":"hebrew(number)"},{"anchor":"hebrew/2","id":"hebrew/2","title":"hebrew(number, locale)"},{"anchor":"hebrew_0_99/2","id":"hebrew_0_99/2","title":"hebrew_0_99(number, language_tag)"},{"anchor":"hebrew_item/1","id":"hebrew_item/1","title":"hebrew_item(number)"},{"anchor":"hebrew_item/2","id":"hebrew_item/2","title":"hebrew_item(number, locale)"},{"anchor":"hebrew_item_hundreds/2","id":"hebrew_item_hundreds/2","title":"hebrew_item_hundreds(number, language_tag)"},{"anchor":"hebrew_thousands/2","id":"hebrew_thousands/2","title":"hebrew_thousands(number, language_tag)"},{"anchor":"roman_lower/1","id":"roman_lower/1","title":"roman_lower(number)"},{"anchor":"roman_lower/2","id":"roman_lower/2","title":"roman_lower(number, locale)"},{"anchor":"roman_upper/1","id":"roman_upper/1","title":"roman_upper(number)"},{"anchor":"roman_upper/2","id":"roman_upper/2","title":"roman_upper(number, locale)"},{"anchor":"rule_sets/0","id":"rule_sets/0","title":"rule_sets()"},{"anchor":"rule_sets/1","id":"rule_sets/1","title":"rule_sets(rbnf_locale_name)"},{"anchor":"tamil/1","id":"tamil/1","title":"tamil(number)"},{"anchor":"tamil/2","id":"tamil/2","title":"tamil(number, locale)"},{"anchor":"tamil_thousands/2","id":"tamil_thousands/2","title":"tamil_thousands(number, language_tag)"},{"anchor":"zz_default/1","id":"zz_default/1","title":"zz_default(number)"},{"anchor":"zz_default/2","id":"zz_default/2","title":"zz_default(number, locale)"}]}],"sections":[],"title":"Plausible.Cldr.Rbnf.NumberSystem"},{"group":"","id":"Plausible.Cldr.Rbnf.Ordinal","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"all_rule_sets/0","id":"all_rule_sets/0","title":"all_rule_sets()"},{"anchor":"digits_ordinal/2","id":"digits_ordinal/2","title":"digits_ordinal(number, locale)"},{"anchor":"rule_sets/0","id":"rule_sets/0","title":"rule_sets()"},{"anchor":"rule_sets/1","id":"rule_sets/1","title":"rule_sets(rbnf_locale_name)"}]}],"sections":[],"title":"Plausible.Cldr.Rbnf.Ordinal"},{"group":"","id":"Plausible.Cldr.Rbnf.Spellout","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"all_rule_sets/0","id":"all_rule_sets/0","title":"all_rule_sets()"},{"anchor":"and/2","id":"and/2","title":"number and language_tag"},{"anchor":"and_o/2","id":"and_o/2","title":"and_o(number, language_tag)"},{"anchor":"commas/2","id":"commas/2","title":"commas(number, language_tag)"},{"anchor":"commas_o/2","id":"commas_o/2","title":"commas_o(number, language_tag)"},{"anchor":"r2d_year/2","id":"r2d_year/2","title":"r2d_year(number, language_tag)"},{"anchor":"rule_sets/0","id":"rule_sets/0","title":"rule_sets()"},{"anchor":"rule_sets/1","id":"rule_sets/1","title":"rule_sets(rbnf_locale_name)"},{"anchor":"spellout_cardinal/2","id":"spellout_cardinal/2","title":"spellout_cardinal(number, locale)"},{"anchor":"spellout_cardinal_verbose/2","id":"spellout_cardinal_verbose/2","title":"spellout_cardinal_verbose(number, locale)"},{"anchor":"spellout_numbering/2","id":"spellout_numbering/2","title":"spellout_numbering(number, locale)"},{"anchor":"spellout_numbering_verbose/2","id":"spellout_numbering_verbose/2","title":"spellout_numbering_verbose(number, locale)"},{"anchor":"spellout_numbering_year/2","id":"spellout_numbering_year/2","title":"spellout_numbering_year(number, locale)"},{"anchor":"spellout_ordinal/2","id":"spellout_ordinal/2","title":"spellout_ordinal(number, locale)"},{"anchor":"spellout_ordinal_verbose/2","id":"spellout_ordinal_verbose/2","title":"spellout_ordinal_verbose(number, locale)"},{"anchor":"th/2","id":"th/2","title":"th(number, language_tag)"},{"anchor":"tieth/2","id":"tieth/2","title":"tieth(number, language_tag)"}]}],"sections":[],"title":"Plausible.Cldr.Rbnf.Spellout"},{"group":"","id":"Plausible.ClickhouseEventV2","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"new/1","id":"new/1","title":"new(attrs)"}]}],"sections":[],"title":"Plausible.ClickhouseEventV2"},{"group":"","id":"Plausible.ClickhouseRepo","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"aggregate/3","id":"aggregate/3","title":"aggregate(queryable, aggregate, opts \\\\ [])"},{"anchor":"aggregate/4","id":"aggregate/4","title":"aggregate(queryable, aggregate, field, opts)"},{"anchor":"all/2","id":"all/2","title":"all(queryable, opts \\\\ [])"},{"anchor":"checked_out?/0","id":"checked_out?/0","title":"checked_out?()"},{"anchor":"checkout/2","id":"checkout/2","title":"checkout(fun, opts \\\\ [])"},{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"},{"anchor":"config/0","id":"config/0","title":"config()"},{"anchor":"default_options/1","id":"default_options/1","title":"default_options(operation)"},{"anchor":"disconnect_all/2","id":"disconnect_all/2","title":"disconnect_all(interval, opts \\\\ [])"},{"anchor":"exists?/2","id":"exists?/2","title":"exists?(queryable, opts \\\\ [])"},{"anchor":"get/3","id":"get/3","title":"get(queryable, id, opts \\\\ [])"},{"anchor":"get!/3","id":"get!/3","title":"get!(queryable, id, opts \\\\ [])"},{"anchor":"get_by/3","id":"get_by/3","title":"get_by(queryable, clauses, opts \\\\ [])"},{"anchor":"get_by!/3","id":"get_by!/3","title":"get_by!(queryable, clauses, opts \\\\ [])"},{"anchor":"get_dynamic_repo/0","id":"get_dynamic_repo/0","title":"get_dynamic_repo()"},{"anchor":"insert_stream/3","id":"insert_stream/3","title":"insert_stream(source_or_schema, rows, opts \\\\ [])"},{"anchor":"load/2","id":"load/2","title":"load(schema_or_types, data)"},{"anchor":"one/2","id":"one/2","title":"one(queryable, opts \\\\ [])"},{"anchor":"one!/2","id":"one!/2","title":"one!(queryable, opts \\\\ [])"},{"anchor":"parallel_tasks/1","id":"parallel_tasks/1","title":"parallel_tasks(queries)"},{"anchor":"preload/3","id":"preload/3","title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])"},{"anchor":"prepare_query/3","id":"prepare_query/3","title":"prepare_query(operation, query, opts)"},{"anchor":"put_dynamic_repo/1","id":"put_dynamic_repo/1","title":"put_dynamic_repo(dynamic)"},{"anchor":"query/3","id":"query/3","title":"query(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"query!/3","id":"query!/3","title":"query!(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"reload/2","id":"reload/2","title":"reload(queryable, opts \\\\ [])"},{"anchor":"reload!/2","id":"reload!/2","title":"reload!(queryable, opts \\\\ [])"},{"anchor":"start_link/1","id":"start_link/1","title":"start_link(opts \\\\ [])"},{"anchor":"stop/1","id":"stop/1","title":"stop(timeout \\\\ 5000)"},{"anchor":"stream/2","id":"stream/2","title":"stream(queryable, opts \\\\ [])"},{"anchor":"to_sql/2","id":"to_sql/2","title":"to_sql(operation, queryable)"}]}],"sections":[],"title":"Plausible.ClickhouseRepo"},{"group":"","id":"Plausible.ClickhouseSessionV2","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"random_uint64/0","id":"random_uint64/0","title":"random_uint64()"}]}],"sections":[],"title":"Plausible.ClickhouseSessionV2"},{"group":"","id":"Plausible.ClickhouseSessionV2.BoolUInt8","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"embed_as/1","id":"embed_as/1","title":"embed_as(_)"},{"anchor":"equal?/2","id":"equal?/2","title":"equal?(term1, term2)"}]}],"sections":[],"title":"Plausible.ClickhouseSessionV2.BoolUInt8"},{"group":"","id":"Plausible.ConfigHelpers","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"get_int_from_path_or_env/3","id":"get_int_from_path_or_env/3","title":"get_int_from_path_or_env(config_dir, var_name, default \\\\ nil)"},{"anchor":"get_var_from_path_or_env/3","id":"get_var_from_path_or_env/3","title":"get_var_from_path_or_env(config_dir, var_name, default \\\\ nil)"}]}],"sections":[],"title":"Plausible.ConfigHelpers"},{"group":"","id":"Plausible.DataCase","sections":[],"title":"Plausible.DataCase"},{"group":"","id":"Plausible.DataMigration","sections":[],"title":"Plausible.DataMigration"},{"group":"","id":"Plausible.DataMigration.NumericIDs","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"confirm/3","id":"confirm/3","title":"confirm(message, func, default_choice \\\\ :yes)"},{"anchor":"run/1","id":"run/1","title":"run(opts \\\\ [])"},{"anchor":"run_sql/2","id":"run_sql/2","title":"run_sql(name, assigns \\\\ [])"},{"anchor":"run_sql_confirm/2","id":"run_sql_confirm/2","title":"run_sql_confirm(name, options \\\\ [])"}]}],"sections":[],"title":"Plausible.DataMigration.NumericIDs"},{"group":"","id":"Plausible.DataMigration.Repo","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"aggregate/3","id":"aggregate/3","title":"aggregate(queryable, aggregate, opts \\\\ [])"},{"anchor":"aggregate/4","id":"aggregate/4","title":"aggregate(queryable, aggregate, field, opts)"},{"anchor":"all/2","id":"all/2","title":"all(queryable, opts \\\\ [])"},{"anchor":"checked_out?/0","id":"checked_out?/0","title":"checked_out?()"},{"anchor":"checkout/2","id":"checkout/2","title":"checkout(fun, opts \\\\ [])"},{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"},{"anchor":"config/0","id":"config/0","title":"config()"},{"anchor":"default_options/1","id":"default_options/1","title":"default_options(operation)"},{"anchor":"delete/2","id":"delete/2","title":"delete(struct, opts \\\\ [])"},{"anchor":"delete!/2","id":"delete!/2","title":"delete!(struct, opts \\\\ [])"},{"anchor":"delete_all/2","id":"delete_all/2","title":"delete_all(queryable, opts \\\\ [])"},{"anchor":"disconnect_all/2","id":"disconnect_all/2","title":"disconnect_all(interval, opts \\\\ [])"},{"anchor":"exists?/2","id":"exists?/2","title":"exists?(queryable, opts \\\\ [])"},{"anchor":"get/3","id":"get/3","title":"get(queryable, id, opts \\\\ [])"},{"anchor":"get!/3","id":"get!/3","title":"get!(queryable, id, opts \\\\ [])"},{"anchor":"get_by/3","id":"get_by/3","title":"get_by(queryable, clauses, opts \\\\ [])"},{"anchor":"get_by!/3","id":"get_by!/3","title":"get_by!(queryable, clauses, opts \\\\ [])"},{"anchor":"get_dynamic_repo/0","id":"get_dynamic_repo/0","title":"get_dynamic_repo()"},{"anchor":"insert/2","id":"insert/2","title":"insert(struct, opts \\\\ [])"},{"anchor":"insert!/2","id":"insert!/2","title":"insert!(struct, opts \\\\ [])"},{"anchor":"insert_all/3","id":"insert_all/3","title":"insert_all(schema_or_source, entries, opts \\\\ [])"},{"anchor":"insert_or_update/2","id":"insert_or_update/2","title":"insert_or_update(changeset, opts \\\\ [])"},{"anchor":"insert_or_update!/2","id":"insert_or_update!/2","title":"insert_or_update!(changeset, opts \\\\ [])"},{"anchor":"insert_stream/3","id":"insert_stream/3","title":"insert_stream(source_or_schema, rows, opts \\\\ [])"},{"anchor":"load/2","id":"load/2","title":"load(schema_or_types, data)"},{"anchor":"one/2","id":"one/2","title":"one(queryable, opts \\\\ [])"},{"anchor":"one!/2","id":"one!/2","title":"one!(queryable, opts \\\\ [])"},{"anchor":"preload/3","id":"preload/3","title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])"},{"anchor":"prepare_query/3","id":"prepare_query/3","title":"prepare_query(operation, query, opts)"},{"anchor":"put_dynamic_repo/1","id":"put_dynamic_repo/1","title":"put_dynamic_repo(dynamic)"},{"anchor":"query/3","id":"query/3","title":"query(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"query!/3","id":"query!/3","title":"query!(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"reload/2","id":"reload/2","title":"reload(queryable, opts \\\\ [])"},{"anchor":"reload!/2","id":"reload!/2","title":"reload!(queryable, opts \\\\ [])"},{"anchor":"start/2","id":"start/2","title":"start(url, max_threads)"},{"anchor":"start_link/1","id":"start_link/1","title":"start_link(opts \\\\ [])"},{"anchor":"stop/1","id":"stop/1","title":"stop(timeout \\\\ 5000)"},{"anchor":"stream/2","id":"stream/2","title":"stream(queryable, opts \\\\ [])"},{"anchor":"to_sql/2","id":"to_sql/2","title":"to_sql(operation, queryable)"},{"anchor":"update/2","id":"update/2","title":"update(struct, opts \\\\ [])"},{"anchor":"update!/2","id":"update!/2","title":"update!(struct, opts \\\\ [])"},{"anchor":"update_all/3","id":"update_all/3","title":"update_all(queryable, updates, opts \\\\ [])"}]}],"sections":[],"title":"Plausible.DataMigration.Repo"},{"group":"","id":"Plausible.Ecto.EventName","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"cast/1","id":"cast/1","title":"cast(val)"},{"anchor":"dump/1","id":"dump/1","title":"dump(val)"},{"anchor":"embed_as/1","id":"embed_as/1","title":"embed_as(_)"},{"anchor":"equal?/2","id":"equal?/2","title":"equal?(term1, term2)"},{"anchor":"load/1","id":"load/1","title":"load(val)"},{"anchor":"type/0","id":"type/0","title":"type()"}]}],"sections":[],"title":"Plausible.Ecto.EventName"},{"group":"","id":"Plausible.Event.WriteBuffer","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(init_arg)"},{"anchor":"flush/0","id":"flush/0","title":"flush()"},{"anchor":"init/1","id":"init/1","title":"init(buffer)"},{"anchor":"insert/1","id":"insert/1","title":"insert(event)"},{"anchor":"start_link/1","id":"start_link/1","title":"start_link(opts)"}]}],"sections":[],"title":"Plausible.Event.WriteBuffer"},{"group":"","id":"Plausible.Factory","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"api_key_factory/0","id":"api_key_factory/0","title":"api_key_factory()"},{"anchor":"build/2","id":"build/2","title":"build(factory_name, attrs \\\\ %{})"},{"anchor":"build_list/3","id":"build_list/3","title":"build_list(number_of_records, factory_name, attrs \\\\ %{})"},{"anchor":"build_pair/2","id":"build_pair/2","title":"build_pair(factory_name, attrs \\\\ %{})"},{"anchor":"ch_session_factory/0","id":"ch_session_factory/0","title":"ch_session_factory()"},{"anchor":"create/1","id":"create/1","title":"create(_)"},{"anchor":"create/2","id":"create/2","title":"create(_, _)"},{"anchor":"create_list/3","id":"create_list/3","title":"create_list(_, _, _)"},{"anchor":"create_pair/2","id":"create_pair/2","title":"create_pair(_, _)"},{"anchor":"custom_domain_factory/0","id":"custom_domain_factory/0","title":"custom_domain_factory()"},{"anchor":"enterprise_plan_factory/0","id":"enterprise_plan_factory/0","title":"enterprise_plan_factory()"},{"anchor":"event_factory/0","id":"event_factory/0","title":"event_factory()"},{"anchor":"factory/1","id":"factory/1","title":"factory(factory_name)"},{"anchor":"goal_factory/0","id":"goal_factory/0","title":"goal_factory()"},{"anchor":"google_auth_factory/0","id":"google_auth_factory/0","title":"google_auth_factory()"},{"anchor":"imported_browsers_factory/0","id":"imported_browsers_factory/0","title":"imported_browsers_factory()"},{"anchor":"imported_devices_factory/0","id":"imported_devices_factory/0","title":"imported_devices_factory()"},{"anchor":"imported_entry_pages_factory/0","id":"imported_entry_pages_factory/0","title":"imported_entry_pages_factory()"},{"anchor":"imported_exit_pages_factory/0","id":"imported_exit_pages_factory/0","title":"imported_exit_pages_factory()"},{"anchor":"imported_locations_factory/0","id":"imported_locations_factory/0","title":"imported_locations_factory()"},{"anchor":"imported_operating_systems_factory/0","id":"imported_operating_systems_factory/0","title":"imported_operating_systems_factory()"},{"anchor":"imported_pages_factory/0","id":"imported_pages_factory/0","title":"imported_pages_factory()"},{"anchor":"imported_sources_factory/0","id":"imported_sources_factory/0","title":"imported_sources_factory()"},{"anchor":"imported_visitors_factory/0","id":"imported_visitors_factory/0","title":"imported_visitors_factory()"},{"anchor":"insert/1","id":"insert/1","title":"insert(already_built_record)"},{"anchor":"insert/2","id":"insert/2","title":"insert(already_built_record, function_opts)"},{"anchor":"insert/3","id":"insert/3","title":"insert(factory_name, attrs, opts)"},{"anchor":"insert_list/3","id":"insert_list/3","title":"insert_list(number_of_records, factory_name, attrs \\\\ %{})"},{"anchor":"insert_list/4","id":"insert_list/4","title":"insert_list(number_of_records, factory_name, attrs, opts)"},{"anchor":"insert_pair/2","id":"insert_pair/2","title":"insert_pair(factory_name, attrs \\\\ %{})"},{"anchor":"insert_pair/3","id":"insert_pair/3","title":"insert_pair(factory_name, attrs, opts)"},{"anchor":"invitation_factory/0","id":"invitation_factory/0","title":"invitation_factory()"},{"anchor":"monthly_report_factory/0","id":"monthly_report_factory/0","title":"monthly_report_factory()"},{"anchor":"pageview_factory/0","id":"pageview_factory/0","title":"pageview_factory()"},{"anchor":"params_for/2","id":"params_for/2","title":"params_for(factory_name, attrs \\\\ %{})"},{"anchor":"params_with_assocs/2","id":"params_with_assocs/2","title":"params_with_assocs(factory_name, attrs \\\\ %{})"},{"anchor":"shared_link_factory/0","id":"shared_link_factory/0","title":"shared_link_factory()"},{"anchor":"site_factory/0","id":"site_factory/0","title":"site_factory()"},{"anchor":"site_membership_factory/0","id":"site_membership_factory/0","title":"site_membership_factory()"},{"anchor":"spike_notification_factory/0","id":"spike_notification_factory/0","title":"spike_notification_factory()"},{"anchor":"string_params_for/2","id":"string_params_for/2","title":"string_params_for(factory_name, attrs \\\\ %{})"},{"anchor":"string_params_with_assocs/2","id":"string_params_with_assocs/2","title":"string_params_with_assocs(factory_name, attrs \\\\ %{})"},{"anchor":"subscription_factory/0","id":"subscription_factory/0","title":"subscription_factory()"},{"anchor":"user_factory/1","id":"user_factory/1","title":"user_factory(attrs)"},{"anchor":"weekly_report_factory/0","id":"weekly_report_factory/0","title":"weekly_report_factory()"}]}],"sections":[],"title":"Plausible.Factory"},{"group":"","id":"Plausible.Funnel","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"changeset/2","id":"changeset/2","title":"changeset(funnel \\\\ %__MODULE__{}, attrs \\\\ %{})"},{"anchor":"max_steps/0","id":"max_steps/0","title":"max_steps()"},{"anchor":"min_steps/0","id":"min_steps/0","title":"min_steps()"},{"anchor":"put_step_orders/1","id":"put_step_orders/1","title":"put_step_orders(changeset)"}]}],"sections":[],"title":"Plausible.Funnel"},{"group":"","id":"Plausible.Funnel.Step","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"changeset/2","id":"changeset/2","title":"changeset(step, attrs \\\\ %{})"}]}],"sections":[],"title":"Plausible.Funnel.Step"},{"group":"","id":"Plausible.Funnels","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"create/3","id":"create/3","title":"create(site, name, steps)"},{"anchor":"create_changeset/3","id":"create_changeset/3","title":"create_changeset(site, name, steps)"},{"anchor":"delete/2","id":"delete/2","title":"delete(site, funnel_id)"},{"anchor":"enabled_for?/1","id":"enabled_for?/1","title":"enabled_for?(actor)"},{"anchor":"ephemeral_definition/3","id":"ephemeral_definition/3","title":"ephemeral_definition(site, name, steps)"},{"anchor":"get/2","id":"get/2","title":"get(site_id, by)"},{"anchor":"list/1","id":"list/1","title":"list(site)"}]}],"sections":[],"title":"Plausible.Funnels"},{"group":"","id":"Plausible.Geo","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"await_loader/0","id":"await_loader/0","title":"await_loader()"},{"anchor":"database_type/0","id":"database_type/0","title":"database_type()"},{"anchor":"load_db/1","id":"load_db/1","title":"load_db(opts)"},{"anchor":"lookup/1","id":"lookup/1","title":"lookup(ip_address)"}]}],"sections":[],"title":"Plausible.Geo"},{"group":"","id":"Plausible.Goal","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"changeset/2","id":"changeset/2","title":"changeset(goal, attrs \\\\ %{})"},{"anchor":"currency_options/0","id":"currency_options/0","title":"currency_options()"},{"anchor":"revenue?/1","id":"revenue?/1","title":"revenue?(goal)"},{"anchor":"valid_currencies/0","id":"valid_currencies/0","title":"valid_currencies()"}]}],"sections":[],"title":"Plausible.Goal"},{"group":"","id":"Plausible.Goals","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"count/1","id":"count/1","title":"count(site)"},{"anchor":"create/3","id":"create/3","title":"create(site, params, now \\\\ DateTime.utc_now())"},{"anchor":"delete/2","id":"delete/2","title":"delete(id, site)"},{"anchor":"find_or_create/2","id":"find_or_create/2","title":"find_or_create(site, map)"},{"anchor":"for_site/2","id":"for_site/2","title":"for_site(site, opts \\\\ [])"}]}],"sections":[],"title":"Plausible.Goals"},{"group":"","id":"Plausible.Google.Api","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:google_analytics_view/0","id":"google_analytics_view/0","title":"google_analytics_view()"},{"anchor":"t:import_auth/0","id":"import_auth/0","title":"import_auth()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"fetch_and_persist/3","id":"fetch_and_persist/3","title":"fetch_and_persist(site, report_request, opts \\\\ [])"},{"anchor":"fetch_stats/3","id":"fetch_stats/3","title":"fetch_stats(site, map, limit)"},{"anchor":"fetch_verified_properties/1","id":"fetch_verified_properties/1","title":"fetch_verified_properties(auth)"},{"anchor":"get_view/2","id":"get_view/2","title":"get_view(access_token, lookup_id)"},{"anchor":"import_analytics/4","id":"import_analytics/4","title":"import_analytics(site, date_range, view_id, auth)"},{"anchor":"import_authorize_url/2","id":"import_authorize_url/2","title":"import_authorize_url(site_id, redirect_to)"},{"anchor":"list_views/1","id":"list_views/1","title":"list_views(access_token)"},{"anchor":"search_console_authorize_url/2","id":"search_console_authorize_url/2","title":"search_console_authorize_url(site_id, redirect_to)"}]}],"sections":[],"title":"Plausible.Google.Api"},{"group":"","id":"Plausible.Google.Api.Mock","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"fetch_stats/3","id":"fetch_stats/3","title":"fetch_stats(auth, query, limit)"}]}],"sections":[],"title":"Plausible.Google.Api.Mock"},{"group":"","id":"Plausible.Google.Buffer","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(init_arg)"},{"anchor":"flush/2","id":"flush/2","title":"flush(pid, timeout \\\\ :infinity)"},{"anchor":"handle_continue/2","id":"handle_continue/2","title":"handle_continue(arg, state)"},{"anchor":"init/1","id":"init/1","title":"init(opts)"},{"anchor":"insert_many/3","id":"insert_many/3","title":"insert_many(pid, table_name, records)"},{"anchor":"size/2","id":"size/2","title":"size(pid, table_name)"},{"anchor":"start_link/0","id":"start_link/0","title":"start_link()"},{"anchor":"stop/1","id":"stop/1","title":"stop(pid)"}]}],"sections":[],"title":"Plausible.Google.Buffer"},{"group":"","id":"Plausible.Google.HTTP","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"fetch_access_token/1","id":"fetch_access_token/1","title":"fetch_access_token(code)"},{"anchor":"get_analytics_start_date/2","id":"get_analytics_start_date/2","title":"get_analytics_start_date(view_id, access_token)"},{"anchor":"get_report/1","id":"get_report/1","title":"get_report(report_request)"},{"anchor":"list_sites/1","id":"list_sites/1","title":"list_sites(access_token)"},{"anchor":"list_stats/5","id":"list_stats/5","title":"list_stats(access_token, property, date_range, limit, page \\\\ nil)"},{"anchor":"list_views_for_user/1","id":"list_views_for_user/1","title":"list_views_for_user(access_token)"},{"anchor":"refresh_auth_token/1","id":"refresh_auth_token/1","title":"refresh_auth_token(refresh_token)"}]}],"sections":[],"title":"Plausible.Google.HTTP"},{"group":"","id":"Plausible.Google.ReportRequest","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"full_report/0","id":"full_report/0","title":"full_report()"}]}],"sections":[],"title":"Plausible.Google.ReportRequest"},{"group":"","id":"Plausible.HTTPClient","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"get/2","id":"get/2","title":"get(url, headers \\\\ [])"},{"anchor":"impl/0","id":"impl/0","title":"impl()"},{"anchor":"post/4","id":"post/4","title":"post(url, headers \\\\ [], params \\\\ nil, finch_req_opts \\\\ [])"}]}],"sections":[],"title":"Plausible.HTTPClient"},{"group":"","id":"Plausible.HTTPClient.Interface","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:finch_request_opts/0","id":"finch_request_opts/0","title":"finch_request_opts()"},{"anchor":"t:headers/0","id":"headers/0","title":"headers()"},{"anchor":"t:params/0","id":"params/0","title":"params()"},{"anchor":"t:response/0","id":"response/0","title":"response()"},{"anchor":"t:url/0","id":"url/0","title":"url()"}]},{"key":"callbacks","name":"Callbacks","nodes":[{"anchor":"c:get/1","id":"get/1","title":"get(url)"},{"anchor":"c:get/2","id":"get/2","title":"get(url, headers)"},{"anchor":"c:post/3","id":"post/3","title":"post(url, headers, params)"},{"anchor":"c:post/4","id":"post/4","title":"post(url, headers, params, finch_request_opts)"}]}],"sections":[],"title":"Plausible.HTTPClient.Interface"},{"group":"","id":"Plausible.HTTPClient.Non200Error","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"new/1","id":"new/1","title":"new(response)"}]}],"sections":[],"title":"Plausible.HTTPClient.Non200Error"},{"group":"","id":"Plausible.ImportDeletionRepo","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"aggregate/3","id":"aggregate/3","title":"aggregate(queryable, aggregate, opts \\\\ [])"},{"anchor":"aggregate/4","id":"aggregate/4","title":"aggregate(queryable, aggregate, field, opts)"},{"anchor":"all/2","id":"all/2","title":"all(queryable, opts \\\\ [])"},{"anchor":"checked_out?/0","id":"checked_out?/0","title":"checked_out?()"},{"anchor":"checkout/2","id":"checkout/2","title":"checkout(fun, opts \\\\ [])"},{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"},{"anchor":"config/0","id":"config/0","title":"config()"},{"anchor":"default_options/1","id":"default_options/1","title":"default_options(operation)"},{"anchor":"delete/2","id":"delete/2","title":"delete(struct, opts \\\\ [])"},{"anchor":"delete!/2","id":"delete!/2","title":"delete!(struct, opts \\\\ [])"},{"anchor":"delete_all/2","id":"delete_all/2","title":"delete_all(queryable, opts \\\\ [])"},{"anchor":"disconnect_all/2","id":"disconnect_all/2","title":"disconnect_all(interval, opts \\\\ [])"},{"anchor":"exists?/2","id":"exists?/2","title":"exists?(queryable, opts \\\\ [])"},{"anchor":"get/3","id":"get/3","title":"get(queryable, id, opts \\\\ [])"},{"anchor":"get!/3","id":"get!/3","title":"get!(queryable, id, opts \\\\ [])"},{"anchor":"get_by/3","id":"get_by/3","title":"get_by(queryable, clauses, opts \\\\ [])"},{"anchor":"get_by!/3","id":"get_by!/3","title":"get_by!(queryable, clauses, opts \\\\ [])"},{"anchor":"get_dynamic_repo/0","id":"get_dynamic_repo/0","title":"get_dynamic_repo()"},{"anchor":"insert/2","id":"insert/2","title":"insert(struct, opts \\\\ [])"},{"anchor":"insert!/2","id":"insert!/2","title":"insert!(struct, opts \\\\ [])"},{"anchor":"insert_all/3","id":"insert_all/3","title":"insert_all(schema_or_source, entries, opts \\\\ [])"},{"anchor":"insert_or_update/2","id":"insert_or_update/2","title":"insert_or_update(changeset, opts \\\\ [])"},{"anchor":"insert_or_update!/2","id":"insert_or_update!/2","title":"insert_or_update!(changeset, opts \\\\ [])"},{"anchor":"insert_stream/3","id":"insert_stream/3","title":"insert_stream(source_or_schema, rows, opts \\\\ [])"},{"anchor":"load/2","id":"load/2","title":"load(schema_or_types, data)"},{"anchor":"one/2","id":"one/2","title":"one(queryable, opts \\\\ [])"},{"anchor":"one!/2","id":"one!/2","title":"one!(queryable, opts \\\\ [])"},{"anchor":"preload/3","id":"preload/3","title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])"},{"anchor":"prepare_query/3","id":"prepare_query/3","title":"prepare_query(operation, query, opts)"},{"anchor":"put_dynamic_repo/1","id":"put_dynamic_repo/1","title":"put_dynamic_repo(dynamic)"},{"anchor":"query/3","id":"query/3","title":"query(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"query!/3","id":"query!/3","title":"query!(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"reload/2","id":"reload/2","title":"reload(queryable, opts \\\\ [])"},{"anchor":"reload!/2","id":"reload!/2","title":"reload!(queryable, opts \\\\ [])"},{"anchor":"start_link/1","id":"start_link/1","title":"start_link(opts \\\\ [])"},{"anchor":"stop/1","id":"stop/1","title":"stop(timeout \\\\ 5000)"},{"anchor":"stream/2","id":"stream/2","title":"stream(queryable, opts \\\\ [])"},{"anchor":"to_sql/2","id":"to_sql/2","title":"to_sql(operation, queryable)"},{"anchor":"update/2","id":"update/2","title":"update(struct, opts \\\\ [])"},{"anchor":"update!/2","id":"update!/2","title":"update!(struct, opts \\\\ [])"},{"anchor":"update_all/3","id":"update_all/3","title":"update_all(queryable, updates, opts \\\\ [])"}]}],"sections":[],"title":"Plausible.ImportDeletionRepo"},{"group":"","id":"Plausible.Imported","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"forget/1","id":"forget/1","title":"forget(site)"},{"anchor":"from_google_analytics/3","id":"from_google_analytics/3","title":"from_google_analytics(data, site_id, table)"},{"anchor":"tables/0","id":"tables/0","title":"tables()"}]}],"sections":[],"title":"Plausible.Imported"},{"group":"","id":"Plausible.IngestRepo","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"aggregate/3","id":"aggregate/3","title":"aggregate(queryable, aggregate, opts \\\\ [])"},{"anchor":"aggregate/4","id":"aggregate/4","title":"aggregate(queryable, aggregate, field, opts)"},{"anchor":"all/2","id":"all/2","title":"all(queryable, opts \\\\ [])"},{"anchor":"checked_out?/0","id":"checked_out?/0","title":"checked_out?()"},{"anchor":"checkout/2","id":"checkout/2","title":"checkout(fun, opts \\\\ [])"},{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"},{"anchor":"config/0","id":"config/0","title":"config()"},{"anchor":"default_options/1","id":"default_options/1","title":"default_options(operation)"},{"anchor":"delete/2","id":"delete/2","title":"delete(struct, opts \\\\ [])"},{"anchor":"delete!/2","id":"delete!/2","title":"delete!(struct, opts \\\\ [])"},{"anchor":"delete_all/2","id":"delete_all/2","title":"delete_all(queryable, opts \\\\ [])"},{"anchor":"disconnect_all/2","id":"disconnect_all/2","title":"disconnect_all(interval, opts \\\\ [])"},{"anchor":"exists?/2","id":"exists?/2","title":"exists?(queryable, opts \\\\ [])"},{"anchor":"get/3","id":"get/3","title":"get(queryable, id, opts \\\\ [])"},{"anchor":"get!/3","id":"get!/3","title":"get!(queryable, id, opts \\\\ [])"},{"anchor":"get_by/3","id":"get_by/3","title":"get_by(queryable, clauses, opts \\\\ [])"},{"anchor":"get_by!/3","id":"get_by!/3","title":"get_by!(queryable, clauses, opts \\\\ [])"},{"anchor":"get_dynamic_repo/0","id":"get_dynamic_repo/0","title":"get_dynamic_repo()"},{"anchor":"insert/2","id":"insert/2","title":"insert(struct, opts \\\\ [])"},{"anchor":"insert!/2","id":"insert!/2","title":"insert!(struct, opts \\\\ [])"},{"anchor":"insert_all/3","id":"insert_all/3","title":"insert_all(schema_or_source, entries, opts \\\\ [])"},{"anchor":"insert_or_update/2","id":"insert_or_update/2","title":"insert_or_update(changeset, opts \\\\ [])"},{"anchor":"insert_or_update!/2","id":"insert_or_update!/2","title":"insert_or_update!(changeset, opts \\\\ [])"},{"anchor":"insert_stream/3","id":"insert_stream/3","title":"insert_stream(source_or_schema, rows, opts \\\\ [])"},{"anchor":"load/2","id":"load/2","title":"load(schema_or_types, data)"},{"anchor":"one/2","id":"one/2","title":"one(queryable, opts \\\\ [])"},{"anchor":"one!/2","id":"one!/2","title":"one!(queryable, opts \\\\ [])"},{"anchor":"preload/3","id":"preload/3","title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])"},{"anchor":"prepare_query/3","id":"prepare_query/3","title":"prepare_query(operation, query, opts)"},{"anchor":"put_dynamic_repo/1","id":"put_dynamic_repo/1","title":"put_dynamic_repo(dynamic)"},{"anchor":"query/3","id":"query/3","title":"query(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"query!/3","id":"query!/3","title":"query!(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"reload/2","id":"reload/2","title":"reload(queryable, opts \\\\ [])"},{"anchor":"reload!/2","id":"reload!/2","title":"reload!(queryable, opts \\\\ [])"},{"anchor":"start_link/1","id":"start_link/1","title":"start_link(opts \\\\ [])"},{"anchor":"stop/1","id":"stop/1","title":"stop(timeout \\\\ 5000)"},{"anchor":"stream/2","id":"stream/2","title":"stream(queryable, opts \\\\ [])"},{"anchor":"to_sql/2","id":"to_sql/2","title":"to_sql(operation, queryable)"},{"anchor":"update/2","id":"update/2","title":"update(struct, opts \\\\ [])"},{"anchor":"update!/2","id":"update!/2","title":"update!(struct, opts \\\\ [])"},{"anchor":"update_all/3","id":"update_all/3","title":"update_all(queryable, updates, opts \\\\ [])"}]}],"sections":[],"title":"Plausible.IngestRepo"},{"group":"","id":"Plausible.Ingestion.Counters","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"},{"anchor":"enabled?/0","id":"enabled?/0","title":"enabled?()"},{"anchor":"stop/1","id":"stop/1","title":"stop(pid)"}]}],"sections":[],"title":"Plausible.Ingestion.Counters"},{"group":"","id":"Plausible.Ingestion.Counters.Buffer","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:bucket_fn_opt/0","id":"bucket_fn_opt/0","title":"bucket_fn_opt()"},{"anchor":"t:t/0","id":"t/0","title":"t()"},{"anchor":"t:unix_timestamp/0","id":"unix_timestamp/0","title":"unix_timestamp()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"aggregate/4","id":"aggregate/4","title":"aggregate(buffer, metric, domain, timestamp)"},{"anchor":"bucket_10s/1","id":"bucket_10s/1","title":"bucket_10s(datetime)"},{"anchor":"flush/2","id":"flush/2","title":"flush(buffer, now \\\\ DateTime.utc_now())"},{"anchor":"new/2","id":"new/2","title":"new(buffer_name, opts \\\\ [])"},{"anchor":"previous_10s/1","id":"previous_10s/1","title":"previous_10s(datetime)"}]}],"sections":[],"title":"Plausible.Ingestion.Counters.Buffer"},{"group":"","id":"Plausible.Ingestion.Counters.Record","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]}],"sections":[],"title":"Plausible.Ingestion.Counters.Record"},{"group":"","id":"Plausible.Ingestion.Counters.TelemetryHandler","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"handle_event/4","id":"handle_event/4","title":"handle_event(list, measurements, map, buffer)"},{"anchor":"install/1","id":"install/1","title":"install(buffer)"}]}],"sections":[],"title":"Plausible.Ingestion.Counters.TelemetryHandler"},{"group":"","id":"Plausible.Ingestion.Event","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:drop_reason/0","id":"drop_reason/0","title":"drop_reason()"},{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"build_and_buffer/1","id":"build_and_buffer/1","title":"build_and_buffer(request)"},{"anchor":"emit_telemetry_buffered/1","id":"emit_telemetry_buffered/1","title":"emit_telemetry_buffered(event)"},{"anchor":"emit_telemetry_dropped/2","id":"emit_telemetry_dropped/2","title":"emit_telemetry_dropped(event, reason)"},{"anchor":"telemetry_event_buffered/0","id":"telemetry_event_buffered/0","title":"telemetry_event_buffered()"},{"anchor":"telemetry_event_dropped/0","id":"telemetry_event_dropped/0","title":"telemetry_event_dropped()"}]}],"sections":[],"title":"Plausible.Ingestion.Event"},{"group":"","id":"Plausible.Ingestion.Request","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"build/2","id":"build/2","title":"build(conn, now \\\\ NaiveDateTime.utc_now())"},{"anchor":"sanitize_hostname/1","id":"sanitize_hostname/1","title":"sanitize_hostname(hostname)"}]}],"sections":[],"title":"Plausible.Ingestion.Request"},{"group":"","id":"Plausible.Mailer","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"deliver/1","id":"deliver/1","title":"deliver(email)"},{"anchor":"deliver_later/2","id":"deliver_later/2","title":"deliver_later(email, opts \\\\ [])"},{"anchor":"deliver_later!/2","id":"deliver_later!/2","title":"deliver_later!(email, opts \\\\ [])"},{"anchor":"deliver_now/2","id":"deliver_now/2","title":"deliver_now(email, opts \\\\ [])"},{"anchor":"deliver_now!/2","id":"deliver_now!/2","title":"deliver_now!(email, opts \\\\ [])"},{"anchor":"send/1","id":"send/1","title":"send(email)"}]}],"sections":[],"title":"Plausible.Mailer"},{"group":"","id":"Plausible.OpenTelemetry.Sampler","sections":[],"title":"Plausible.OpenTelemetry.Sampler"},{"group":"","id":"Plausible.PaddleApi.Mock","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"get_invoices/1","id":"get_invoices/1","title":"get_invoices(subscription)"},{"anchor":"get_subscription/1","id":"get_subscription/1","title":"get_subscription(_)"},{"anchor":"update_subscription/2","id":"update_subscription/2","title":"update_subscription(_, map)"}]}],"sections":[],"title":"Plausible.PaddleApi.Mock"},{"group":"","id":"Plausible.PromEx","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(init_arg)"}]}],"sections":[],"title":"Plausible.PromEx"},{"group":"","id":"Plausible.PromEx.Plugins.PlausibleMetrics","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"execute_cache_metrics/0","id":"execute_cache_metrics/0","title":"execute_cache_metrics()"},{"anchor":"execute_write_buffer_metrics/0","id":"execute_write_buffer_metrics/0","title":"execute_write_buffer_metrics()"}]}],"sections":[],"title":"Plausible.PromEx.Plugins.PlausibleMetrics"},{"group":"","id":"Plausible.Purge","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"delete_imported_stats!/1","id":"delete_imported_stats!/1","title":"delete_imported_stats!(site)"},{"anchor":"delete_native_stats!/1","id":"delete_native_stats!/1","title":"delete_native_stats!(site)"},{"anchor":"reset!/1","id":"reset!/1","title":"reset!(site)"}]}],"sections":[],"title":"Plausible.Purge"},{"group":"","id":"Plausible.Release","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"configure_ref_inspector/0","id":"configure_ref_inspector/0","title":"configure_ref_inspector()"},{"anchor":"configure_ua_inspector/0","id":"configure_ua_inspector/0","title":"configure_ua_inspector()"},{"anchor":"createdb/0","id":"createdb/0","title":"createdb()"},{"anchor":"migrate/0","id":"migrate/0","title":"migrate()"},{"anchor":"rollback/0","id":"rollback/0","title":"rollback()"},{"anchor":"seed/0","id":"seed/0","title":"seed()"},{"anchor":"selfhost?/0","id":"selfhost?/0","title":"selfhost?()"},{"anchor":"should_be_first_launch?/0","id":"should_be_first_launch?/0","title":"should_be_first_launch?()"}]}],"sections":[],"title":"Plausible.Release"},{"group":"","id":"Plausible.Repo","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"aggregate/3","id":"aggregate/3","title":"aggregate(queryable, aggregate, opts \\\\ [])"},{"anchor":"aggregate/4","id":"aggregate/4","title":"aggregate(queryable, aggregate, field, opts)"},{"anchor":"all/2","id":"all/2","title":"all(queryable, opts \\\\ [])"},{"anchor":"checked_out?/0","id":"checked_out?/0","title":"checked_out?()"},{"anchor":"checkout/2","id":"checkout/2","title":"checkout(fun, opts \\\\ [])"},{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"},{"anchor":"config/0","id":"config/0","title":"config()"},{"anchor":"default_options/1","id":"default_options/1","title":"default_options(operation)"},{"anchor":"delete/2","id":"delete/2","title":"delete(struct, opts \\\\ [])"},{"anchor":"delete!/2","id":"delete!/2","title":"delete!(struct, opts \\\\ [])"},{"anchor":"delete_all/2","id":"delete_all/2","title":"delete_all(queryable, opts \\\\ [])"},{"anchor":"disconnect_all/2","id":"disconnect_all/2","title":"disconnect_all(interval, opts \\\\ [])"},{"anchor":"exists?/2","id":"exists?/2","title":"exists?(queryable, opts \\\\ [])"},{"anchor":"explain/3","id":"explain/3","title":"explain(operation, queryable, opts \\\\ [])"},{"anchor":"get/3","id":"get/3","title":"get(queryable, id, opts \\\\ [])"},{"anchor":"get!/3","id":"get!/3","title":"get!(queryable, id, opts \\\\ [])"},{"anchor":"get_by/3","id":"get_by/3","title":"get_by(queryable, clauses, opts \\\\ [])"},{"anchor":"get_by!/3","id":"get_by!/3","title":"get_by!(queryable, clauses, opts \\\\ [])"},{"anchor":"get_dynamic_repo/0","id":"get_dynamic_repo/0","title":"get_dynamic_repo()"},{"anchor":"in_transaction?/0","id":"in_transaction?/0","title":"in_transaction?()"},{"anchor":"insert/2","id":"insert/2","title":"insert(struct, opts \\\\ [])"},{"anchor":"insert!/2","id":"insert!/2","title":"insert!(struct, opts \\\\ [])"},{"anchor":"insert_all/3","id":"insert_all/3","title":"insert_all(schema_or_source, entries, opts \\\\ [])"},{"anchor":"insert_or_update/2","id":"insert_or_update/2","title":"insert_or_update(changeset, opts \\\\ [])"},{"anchor":"insert_or_update!/2","id":"insert_or_update!/2","title":"insert_or_update!(changeset, opts \\\\ [])"},{"anchor":"load/2","id":"load/2","title":"load(schema_or_types, data)"},{"anchor":"one/2","id":"one/2","title":"one(queryable, opts \\\\ [])"},{"anchor":"one!/2","id":"one!/2","title":"one!(queryable, opts \\\\ [])"},{"anchor":"paginate/3","id":"paginate/3","title":"paginate(query, params \\\\ %{}, options \\\\ [])"},{"anchor":"preload/3","id":"preload/3","title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])"},{"anchor":"prepare_query/3","id":"prepare_query/3","title":"prepare_query(operation, query, opts)"},{"anchor":"put_dynamic_repo/1","id":"put_dynamic_repo/1","title":"put_dynamic_repo(dynamic)"},{"anchor":"query/3","id":"query/3","title":"query(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"query!/3","id":"query!/3","title":"query!(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"query_many/3","id":"query_many/3","title":"query_many(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"query_many!/3","id":"query_many!/3","title":"query_many!(sql, params \\\\ [], opts \\\\ [])"},{"anchor":"reload/2","id":"reload/2","title":"reload(queryable, opts \\\\ [])"},{"anchor":"reload!/2","id":"reload!/2","title":"reload!(queryable, opts \\\\ [])"},{"anchor":"rollback/1","id":"rollback/1","title":"rollback(value)"},{"anchor":"start_link/1","id":"start_link/1","title":"start_link(opts \\\\ [])"},{"anchor":"stop/1","id":"stop/1","title":"stop(timeout \\\\ 5000)"},{"anchor":"stream/2","id":"stream/2","title":"stream(queryable, opts \\\\ [])"},{"anchor":"to_sql/2","id":"to_sql/2","title":"to_sql(operation, queryable)"},{"anchor":"transaction/2","id":"transaction/2","title":"transaction(fun_or_multi, opts \\\\ [])"},{"anchor":"update/2","id":"update/2","title":"update(struct, opts \\\\ [])"},{"anchor":"update!/2","id":"update!/2","title":"update!(struct, opts \\\\ [])"},{"anchor":"update_all/3","id":"update_all/3","title":"update_all(queryable, updates, opts \\\\ [])"}]}],"sections":[],"title":"Plausible.Repo"},{"group":"","id":"Plausible.Sentry.Client","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"child_spec/0","id":"child_spec/0","title":"child_spec()"},{"anchor":"post/3","id":"post/3","title":"post(url, headers, body)"}]}],"sections":[],"title":"Plausible.Sentry.Client"},{"group":"","id":"Plausible.SentryFilter","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"before_send/1","id":"before_send/1","title":"before_send(event)"},{"anchor":"exclude_exception?/2","id":"exclude_exception?/2","title":"exclude_exception?(exception, source)"}]}],"sections":[],"title":"Plausible.SentryFilter"},{"group":"","id":"Plausible.Session.CacheStore","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"on_event/3","id":"on_event/3","title":"on_event(event, prev_user_id, buffer \\\\ WriteBuffer)"}]}],"sections":[],"title":"Plausible.Session.CacheStore"},{"group":"","id":"Plausible.Session.Salts","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(arg)"},{"anchor":"fetch/0","id":"fetch/0","title":"fetch()"},{"anchor":"rotate/0","id":"rotate/0","title":"rotate()"},{"anchor":"start_link/1","id":"start_link/1","title":"start_link(opts)"}]}],"sections":[],"title":"Plausible.Session.Salts"},{"group":"","id":"Plausible.Session.WriteBuffer","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(init_arg)"},{"anchor":"flush/0","id":"flush/0","title":"flush()"},{"anchor":"init/1","id":"init/1","title":"init(buffer)"},{"anchor":"insert/1","id":"insert/1","title":"insert(sessions)"},{"anchor":"start_link/1","id":"start_link/1","title":"start_link(opts)"}]}],"sections":[],"title":"Plausible.Session.WriteBuffer"},{"group":"","id":"Plausible.Site","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"changeset/2","id":"changeset/2","title":"changeset(site, attrs \\\\ %{})"},{"anchor":"crm_changeset/2","id":"crm_changeset/2","title":"crm_changeset(site, attrs)"},{"anchor":"feature_toggle_change/3","id":"feature_toggle_change/3","title":"feature_toggle_change(site, property, opts \\\\ [])"},{"anchor":"import_failure/1","id":"import_failure/1","title":"import_failure(site)"},{"anchor":"import_success/1","id":"import_success/1","title":"import_success(site)"},{"anchor":"local_start_date/1","id":"local_start_date/1","title":"local_start_date(site)"},{"anchor":"make_private/1","id":"make_private/1","title":"make_private(site)"},{"anchor":"make_public/1","id":"make_public/1","title":"make_public(site)"},{"anchor":"remove_imported_data/1","id":"remove_imported_data/1","title":"remove_imported_data(site)"},{"anchor":"set_allowed_event_props/2","id":"set_allowed_event_props/2","title":"set_allowed_event_props(site, list)"},{"anchor":"set_imported_source/2","id":"set_imported_source/2","title":"set_imported_source(site, imported_source)"},{"anchor":"set_native_stats_start_at/2","id":"set_native_stats_start_at/2","title":"set_native_stats_start_at(site, val)"},{"anchor":"set_stats_start_date/2","id":"set_stats_start_date/2","title":"set_stats_start_date(site, val)"},{"anchor":"start_import/5","id":"start_import/5","title":"start_import(site, start_date, end_date, imported_source, status \\\\ \"importing\")"},{"anchor":"tz_offset/2","id":"tz_offset/2","title":"tz_offset(site, utc_now \\\\ DateTime.utc_now())"},{"anchor":"update_changeset/3","id":"update_changeset/3","title":"update_changeset(site, attrs \\\\ %{}, opts \\\\ [])"}]}],"sections":[],"title":"Plausible.Site"},{"group":"","id":"Plausible.Site.Cache","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"},{"anchor":"enabled?/0","id":"enabled?/0","title":"enabled?()"},{"anchor":"get/2","id":"get/2","title":"get(domain, opts \\\\ [])"},{"anchor":"get_site_id/2","id":"get_site_id/2","title":"get_site_id(domain, opts \\\\ [])"},{"anchor":"hit_rate/1","id":"hit_rate/1","title":"hit_rate(cache_name \\\\ :sites_by_domain)"},{"anchor":"merge/2","id":"merge/2","title":"merge(new_items, opts \\\\ [])"},{"anchor":"name/0","id":"name/0","title":"name()"},{"anchor":"ready?/1","id":"ready?/1","title":"ready?(cache_name \\\\ :sites_by_domain)"},{"anchor":"refresh_all/1","id":"refresh_all/1","title":"refresh_all(opts \\\\ [])"},{"anchor":"refresh_updated_recently/1","id":"refresh_updated_recently/1","title":"refresh_updated_recently(opts \\\\ [])"},{"anchor":"size/1","id":"size/1","title":"size(cache_name \\\\ :sites_by_domain)"},{"anchor":"telemetry_event_refresh/2","id":"telemetry_event_refresh/2","title":"telemetry_event_refresh(cache_name \\\\ :sites_by_domain, mode)"}]}],"sections":[],"title":"Plausible.Site.Cache"},{"group":"","id":"Plausible.Site.Cache.Warmer","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"},{"anchor":"interval/0","id":"interval/0","title":"interval()"}]}],"sections":[],"title":"Plausible.Site.Cache.Warmer"},{"group":"","id":"Plausible.Site.Cache.Warmer.All","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"}]}],"sections":[],"title":"Plausible.Site.Cache.Warmer.All"},{"group":"","id":"Plausible.Site.Cache.Warmer.RecentlyUpdated","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"}]}],"sections":[],"title":"Plausible.Site.Cache.Warmer.RecentlyUpdated"},{"group":"","id":"Plausible.Site.CustomDomain","sections":[],"title":"Plausible.Site.CustomDomain"},{"group":"","id":"Plausible.Site.Domain","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"change/3","id":"change/3","title":"change(site, new_domain, opts \\\\ [])"},{"anchor":"expire_change_transitions/1","id":"expire_change_transitions/1","title":"expire_change_transitions(expire_threshold_hours \\\\ 72)"}]}],"sections":[],"title":"Plausible.Site.Domain"},{"group":"","id":"Plausible.Site.GateKeeper","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:policy/0","id":"policy/0","title":"policy()"},{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"check/2","id":"check/2","title":"check(domain, opts \\\\ [])"},{"anchor":"key/1","id":"key/1","title":"key(domain)"}]}],"sections":[],"title":"Plausible.Site.GateKeeper"},{"group":"","id":"Plausible.Site.GoogleAuth","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"changeset/2","id":"changeset/2","title":"changeset(auth, attrs \\\\ %{})"},{"anchor":"set_property/2","id":"set_property/2","title":"set_property(auth, attrs \\\\ %{})"}]}],"sections":[],"title":"Plausible.Site.GoogleAuth"},{"group":"","id":"Plausible.Site.ImportedData","sections":[],"title":"Plausible.Site.ImportedData"},{"group":"","id":"Plausible.Site.Membership","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"changeset/2","id":"changeset/2","title":"changeset(schema, attrs)"}]}],"sections":[],"title":"Plausible.Site.Membership"},{"group":"","id":"Plausible.Site.MonthlyReport","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"add_recipient/2","id":"add_recipient/2","title":"add_recipient(report, recipient)"},{"anchor":"changeset/2","id":"changeset/2","title":"changeset(settings, attrs \\\\ %{})"},{"anchor":"remove_recipient/2","id":"remove_recipient/2","title":"remove_recipient(report, recipient)"}]}],"sections":[],"title":"Plausible.Site.MonthlyReport"},{"group":"","id":"Plausible.Site.Removal","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"run/1","id":"run/1","title":"run(domain)"}]}],"sections":[],"title":"Plausible.Site.Removal"},{"group":"","id":"Plausible.Site.SharedLink","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"changeset/2","id":"changeset/2","title":"changeset(link, attrs \\\\ %{})"}]}],"sections":[],"title":"Plausible.Site.SharedLink"},{"group":"","id":"Plausible.Site.SpikeNotification","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"add_recipient/2","id":"add_recipient/2","title":"add_recipient(schema, recipient)"},{"anchor":"changeset/2","id":"changeset/2","title":"changeset(schema, attrs)"},{"anchor":"remove_recipient/2","id":"remove_recipient/2","title":"remove_recipient(schema, recipient)"},{"anchor":"was_sent/1","id":"was_sent/1","title":"was_sent(schema)"}]}],"sections":[],"title":"Plausible.Site.SpikeNotification"},{"group":"","id":"Plausible.Site.WeeklyReport","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"add_recipient/2","id":"add_recipient/2","title":"add_recipient(report, recipient)"},{"anchor":"changeset/2","id":"changeset/2","title":"changeset(settings, attrs \\\\ %{})"},{"anchor":"remove_recipient/2","id":"remove_recipient/2","title":"remove_recipient(report, recipient)"}]}],"sections":[],"title":"Plausible.Site.WeeklyReport"},{"group":"","id":"Plausible.SiteAdmin","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"create_changeset/2","id":"create_changeset/2","title":"create_changeset(schema, attrs)"},{"anchor":"custom_index_query/3","id":"custom_index_query/3","title":"custom_index_query(conn, schema, query)"},{"anchor":"form_fields/1","id":"form_fields/1","title":"form_fields(_)"},{"anchor":"get_struct_fields/1","id":"get_struct_fields/1","title":"get_struct_fields(module)"},{"anchor":"index/1","id":"index/1","title":"index(_)"},{"anchor":"list_actions/1","id":"list_actions/1","title":"list_actions(conn)"},{"anchor":"ordering/1","id":"ordering/1","title":"ordering(schema)"},{"anchor":"search_fields/1","id":"search_fields/1","title":"search_fields(schema)"},{"anchor":"set_allowed_props_for_site/3","id":"set_allowed_props_for_site/3","title":"set_allowed_props_for_site(arg1, arg2, params)"},{"anchor":"update_changeset/2","id":"update_changeset/2","title":"update_changeset(schema, attrs)"}]}],"sections":[],"title":"Plausible.SiteAdmin"},{"group":"","id":"Plausible.Sites","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"create/2","id":"create/2","title":"create(user, params)"},{"anchor":"create_shared_link/3","id":"create_shared_link/3","title":"create_shared_link(site, name, password \\\\ nil)"},{"anchor":"get_by_domain/1","id":"get_by_domain/1","title":"get_by_domain(domain)"},{"anchor":"get_for_user/3","id":"get_for_user/3","title":"get_for_user(user_id, domain, roles \\\\ [:owner, :admin, :viewer])"},{"anchor":"get_for_user!/3","id":"get_for_user!/3","title":"get_for_user!(user_id, domain, roles \\\\ [:owner, :admin, :viewer])"},{"anchor":"has_admin_access?/2","id":"has_admin_access?/2","title":"has_admin_access?(user_id, site)"},{"anchor":"has_goals?/1","id":"has_goals?/1","title":"has_goals?(site)"},{"anchor":"has_stats?/1","id":"has_stats?/1","title":"has_stats?(site)"},{"anchor":"is_member?/2","id":"is_member?/2","title":"is_member?(user_id, site)"},{"anchor":"locked?/1","id":"locked?/1","title":"locked?(site)"},{"anchor":"owned_site_ids/1","id":"owned_site_ids/1","title":"owned_site_ids(user)"},{"anchor":"owned_sites_count/1","id":"owned_sites_count/1","title":"owned_sites_count(user)"},{"anchor":"owned_sites_domains/1","id":"owned_sites_domains/1","title":"owned_sites_domains(user)"},{"anchor":"owner_for/1","id":"owner_for/1","title":"owner_for(site)"},{"anchor":"role/2","id":"role/2","title":"role(user_id, site)"},{"anchor":"shared_link_url/2","id":"shared_link_url/2","title":"shared_link_url(site, link)"},{"anchor":"stats_start_date/1","id":"stats_start_date/1","title":"stats_start_date(site)"}]}],"sections":[],"title":"Plausible.Sites"},{"group":"","id":"Plausible.Stats","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"aggregate/3","id":"aggregate/3","title":"aggregate(site, query, metrics)"},{"anchor":"breakdown/5","id":"breakdown/5","title":"breakdown(site, query, prop, metrics, pagination)"},{"anchor":"current_visitors/1","id":"current_visitors/1","title":"current_visitors(site)"},{"anchor":"filter_suggestions/4","id":"filter_suggestions/4","title":"filter_suggestions(site, query, filter_name, filter_search)"},{"anchor":"funnel/3","id":"funnel/3","title":"funnel(site, query, funnel)"},{"anchor":"timeseries/3","id":"timeseries/3","title":"timeseries(site, query, metrics)"}]}],"sections":[],"title":"Plausible.Stats"},{"group":"","id":"Plausible.Stats.Aggregate","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"aggregate/3","id":"aggregate/3","title":"aggregate(site, query, metrics)"}]}],"sections":[],"title":"Plausible.Stats.Aggregate"},{"group":"","id":"Plausible.Stats.Base","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"apply_entry_prop_filter/3","id":"apply_entry_prop_filter/3","title":"apply_entry_prop_filter(sessions_q, prop_name, arg3)"},{"anchor":"base_event_query/2","id":"base_event_query/2","title":"base_event_query(site, query)"},{"anchor":"filter_by_entry_props/2","id":"filter_by_entry_props/2","title":"filter_by_entry_props(sessions_q, query)"},{"anchor":"filter_converted_sessions/3","id":"filter_converted_sessions/3","title":"filter_converted_sessions(db_query, site, query)"},{"anchor":"page_regex/1","id":"page_regex/1","title":"page_regex(expr)"},{"anchor":"query_events/2","id":"query_events/2","title":"query_events(site, query)"},{"anchor":"query_sessions/2","id":"query_sessions/2","title":"query_sessions(site, query)"},{"anchor":"select_event_metrics/2","id":"select_event_metrics/2","title":"select_event_metrics(q, list)"},{"anchor":"select_session_metrics/3","id":"select_session_metrics/3","title":"select_session_metrics(q, list, query)"},{"anchor":"utc_boundaries/2","id":"utc_boundaries/2","title":"utc_boundaries(query, site)"}]}],"sections":[],"title":"Plausible.Stats.Base"},{"group":"","id":"Plausible.Stats.Breakdown","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"breakdown/5","id":"breakdown/5","title":"breakdown(site, query, property, metrics, pagination)"}]}],"sections":[],"title":"Plausible.Stats.Breakdown"},{"group":"","id":"Plausible.Stats.Clickhouse","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"current_visitors/2","id":"current_visitors/2","title":"current_visitors(site, query)"},{"anchor":"has_pageviews?/1","id":"has_pageviews?/1","title":"has_pageviews?(site)"},{"anchor":"imported_pageview_count/1","id":"imported_pageview_count/1","title":"imported_pageview_count(site)"},{"anchor":"last_24h_visitors/1","id":"last_24h_visitors/1","title":"last_24h_visitors(sites)"},{"anchor":"pageview_start_date_local/1","id":"pageview_start_date_local/1","title":"pageview_start_date_local(site)"},{"anchor":"top_sources/6","id":"top_sources/6","title":"top_sources(site, query, limit, page, show_noref \\\\ false, include_details)"},{"anchor":"usage_breakdown/1","id":"usage_breakdown/1","title":"usage_breakdown(domains_or_site_ids)"},{"anchor":"usage_breakdown/2","id":"usage_breakdown/2","title":"usage_breakdown(domains, date_range)"}]}],"sections":[],"title":"Plausible.Stats.Clickhouse"},{"group":"","id":"Plausible.Stats.Compare","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"calculate_change/3","id":"calculate_change/3","title":"calculate_change(metric, old_stats, new_stats)"}]}],"sections":[],"title":"Plausible.Stats.Compare"},{"group":"","id":"Plausible.Stats.Comparisons","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:mode/0","id":"mode/0","title":"mode()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"compare/4","id":"compare/4","title":"compare(site, source_query, mode, opts \\\\ [])"}]}],"sections":[],"title":"Plausible.Stats.Comparisons"},{"group":"","id":"Plausible.Stats.CurrentVisitors","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"current_visitors/1","id":"current_visitors/1","title":"current_visitors(site)"}]}],"sections":[],"title":"Plausible.Stats.CurrentVisitors"},{"group":"","id":"Plausible.Stats.CustomProps","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"maybe_allowed_props_only/2","id":"maybe_allowed_props_only/2","title":"maybe_allowed_props_only(q, allowed_props)"},{"anchor":"props_for_all_event_names/2","id":"props_for_all_event_names/2","title":"props_for_all_event_names(site, query)"},{"anchor":"props_for_goal/2","id":"props_for_goal/2","title":"props_for_goal(site, query)"}]}],"sections":[],"title":"Plausible.Stats.CustomProps"},{"group":"","id":"Plausible.Stats.FilterParser","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"parse_filters/1","id":"parse_filters/1","title":"parse_filters(filters)"}]}],"sections":[],"title":"Plausible.Stats.FilterParser"},{"group":"","id":"Plausible.Stats.FilterSuggestions","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"filter_suggestions/4","id":"filter_suggestions/4","title":"filter_suggestions(site, query, filter_name, filter_search)"}]}],"sections":[],"title":"Plausible.Stats.FilterSuggestions"},{"group":"","id":"Plausible.Stats.Filters","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"add_prefix/1","id":"add_prefix/1","title":"add_prefix(query)"},{"anchor":"visit_props/0","id":"visit_props/0","title":"visit_props()"}]}],"sections":[],"title":"Plausible.Stats.Filters"},{"group":"","id":"Plausible.Stats.Fragments","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"bounce_rate/0","id":"bounce_rate/0","title":"bounce_rate()"},{"anchor":"coalesce_string/2","id":"coalesce_string/2","title":"coalesce_string(fieldA, fieldB)"},{"anchor":"sample_percent/0","id":"sample_percent/0","title":"sample_percent()"},{"anchor":"to_timezone/2","id":"to_timezone/2","title":"to_timezone(date, timezone)"},{"anchor":"total/0","id":"total/0","title":"total()"},{"anchor":"uniq/1","id":"uniq/1","title":"uniq(user_id)"},{"anchor":"visit_duration/0","id":"visit_duration/0","title":"visit_duration()"},{"anchor":"weekstart_not_before/2","id":"weekstart_not_before/2","title":"weekstart_not_before(date, not_before)"},{"anchor":"weekstart_not_before/3","id":"weekstart_not_before/3","title":"weekstart_not_before(date, not_before, timezone)"}]}],"sections":[],"title":"Plausible.Stats.Fragments"},{"group":"","id":"Plausible.Stats.Funnel","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"funnel/3","id":"funnel/3","title":"funnel(site, query, funnel_id)"}]}],"sections":[],"title":"Plausible.Stats.Funnel"},{"group":"","id":"Plausible.Stats.Imported","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"merge_imported/5","id":"merge_imported/5","title":"merge_imported(q, site, query, property, metrics)"},{"anchor":"merge_imported_timeseries/4","id":"merge_imported_timeseries/4","title":"merge_imported_timeseries(native_q, site, query, metrics)"}]}],"sections":[],"title":"Plausible.Stats.Imported"},{"group":"","id":"Plausible.Stats.Interval","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"default_for_date_range/1","id":"default_for_date_range/1","title":"default_for_date_range(range)"},{"anchor":"default_for_period/1","id":"default_for_period/1","title":"default_for_period(period)"},{"anchor":"list/0","id":"list/0","title":"list()"},{"anchor":"valid?/1","id":"valid?/1","title":"valid?(interval)"},{"anchor":"valid_by_period/0","id":"valid_by_period/0","title":"valid_by_period()"},{"anchor":"valid_for_period?/2","id":"valid_for_period?/2","title":"valid_for_period?(period, interval)"}]}],"sections":[],"title":"Plausible.Stats.Interval"},{"group":"","id":"Plausible.Stats.Props","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"event_props/0","id":"event_props/0","title":"event_props()"},{"anchor":"valid_prop?/1","id":"valid_prop?/1","title":"valid_prop?(prop)"}]}],"sections":[],"title":"Plausible.Stats.Props"},{"group":"","id":"Plausible.Stats.Query","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:t/0","id":"t/0","title":"t()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"from/2","id":"from/2","title":"from(site, params)"},{"anchor":"get_filter_by_prefix/2","id":"get_filter_by_prefix/2","title":"get_filter_by_prefix(query, prefix)"},{"anchor":"has_event_filters?/1","id":"has_event_filters?/1","title":"has_event_filters?(query)"},{"anchor":"include_imported?/3","id":"include_imported?/3","title":"include_imported?(query, site, requested?)"},{"anchor":"put_filter/3","id":"put_filter/3","title":"put_filter(query, key, val)"},{"anchor":"remove_event_filters/2","id":"remove_event_filters/2","title":"remove_event_filters(query, opts)"},{"anchor":"trace/1","id":"trace/1","title":"trace(query)"}]}],"sections":[],"title":"Plausible.Stats.Query"},{"group":"","id":"Plausible.Stats.Timeseries","nodeGroups":[{"key":"types","name":"Types","nodes":[{"anchor":"t:results/0","id":"results/0","title":"results()"}]},{"key":"functions","name":"Functions","nodes":[{"anchor":"timeseries/3","id":"timeseries/3","title":"timeseries(site, query, metrics)"}]}],"sections":[],"title":"Plausible.Stats.Timeseries"},{"group":"","id":"Plausible.Stats.Util","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"cast_revenue_metrics_to_money/2","id":"cast_revenue_metrics_to_money/2","title":"cast_revenue_metrics_to_money(results, revenue_goals)"},{"anchor":"get_revenue_tracking_currency/3","id":"get_revenue_tracking_currency/3","title":"get_revenue_tracking_currency(site, query, metrics)"},{"anchor":"remove_internal_visits_metric/1","id":"remove_internal_visits_metric/1","title":"remove_internal_visits_metric(result)"},{"anchor":"remove_internal_visits_metric/2","id":"remove_internal_visits_metric/2","title":"remove_internal_visits_metric(results, metrics)"}]}],"sections":[],"title":"Plausible.Stats.Util"},{"group":"","id":"Plausible.Test.Support.HTML","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"element_exists?/2","id":"element_exists?/2","title":"element_exists?(html, selector)"},{"anchor":"find/2","id":"find/2","title":"find(html, value)"},{"anchor":"form_exists?/2","id":"form_exists?/2","title":"form_exists?(html, action_path)"},{"anchor":"submit_button/2","id":"submit_button/2","title":"submit_button(html, form)"},{"anchor":"text_of_attr/2","id":"text_of_attr/2","title":"text_of_attr(element, attr)"},{"anchor":"text_of_element/2","id":"text_of_element/2","title":"text_of_element(html, element)"}]}],"sections":[],"title":"Plausible.Test.Support.HTML"},{"group":"","id":"Plausible.TestUtils","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"add_imported_data/1","id":"add_imported_data/1","title":"add_imported_data(map)"},{"anchor":"await_clickhouse_count/2","id":"await_clickhouse_count/2","title":"await_clickhouse_count(query, expected)"},{"anchor":"create_api_key/1","id":"create_api_key/1","title":"create_api_key(map)"},{"anchor":"create_events/1","id":"create_events/1","title":"create_events(events)"},{"anchor":"create_new_site/1","id":"create_new_site/1","title":"create_new_site(map)"},{"anchor":"create_pageviews/1","id":"create_pageviews/1","title":"create_pageviews(pageviews)"},{"anchor":"create_sessions/1","id":"create_sessions/1","title":"create_sessions(sessions)"},{"anchor":"create_site/1","id":"create_site/1","title":"create_site(map)"},{"anchor":"create_user/1","id":"create_user/1","title":"create_user(_)"},{"anchor":"eventually/3","id":"eventually/3","title":"eventually(expectation, wait_time_ms \\\\ 50, retries \\\\ 10)"},{"anchor":"init_session/1","id":"init_session/1","title":"init_session(conn)"},{"anchor":"log_in/1","id":"log_in/1","title":"log_in(map)"},{"anchor":"patch_env/2","id":"patch_env/2","title":"patch_env(env_key, value)"},{"anchor":"populate_stats/1","id":"populate_stats/1","title":"populate_stats(events)"},{"anchor":"populate_stats/2","id":"populate_stats/2","title":"populate_stats(site, events)"},{"anchor":"relative_time/1","id":"relative_time/1","title":"relative_time(shifts)"},{"anchor":"setup_patch_env/2","id":"setup_patch_env/2","title":"setup_patch_env(env_key, value)"},{"anchor":"to_naive_truncate/1","id":"to_naive_truncate/1","title":"to_naive_truncate(dt)"},{"anchor":"use_api_key/1","id":"use_api_key/1","title":"use_api_key(map)"}]}],"sections":[],"title":"Plausible.TestUtils"},{"group":"","id":"Plausible.Themes","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"options/0","id":"options/0","title":"options()"}]}],"sections":[],"title":"Plausible.Themes"},{"group":"","id":"Plausible.Timezones","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"options/1","id":"options/1","title":"options(now \\\\ DateTime.utc_now())"}]}],"sections":[],"title":"Plausible.Timezones"},{"group":"","id":"Plausible.Workers.CheckUsage","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"check_enterprise_subscriber/2","id":"check_enterprise_subscriber/2","title":"check_enterprise_subscriber(subscriber, billing_mod)"},{"anchor":"day_of_month/1","id":"day_of_month/1","title":"day_of_month(date)"},{"anchor":"last_day_of_month/1","id":"last_day_of_month/1","title":"last_day_of_month(day)"},{"anchor":"least/2","id":"least/2","title":"least(left, right)"},{"anchor":"yesterday/0","id":"yesterday/0","title":"yesterday()"}]}],"sections":[],"title":"Plausible.Workers.CheckUsage"},{"group":"","id":"Plausible.Workers.CleanEmailVerificationCodes","sections":[],"title":"Plausible.Workers.CleanEmailVerificationCodes"},{"group":"","id":"Plausible.Workers.CleanInvitations","sections":[],"title":"Plausible.Workers.CleanInvitations"},{"group":"","id":"Plausible.Workers.ExpireDomainChangeTransitions","sections":[],"title":"Plausible.Workers.ExpireDomainChangeTransitions"},{"group":"","id":"Plausible.Workers.ImportGoogleAnalytics","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"import_failed/1","id":"import_failed/1","title":"import_failed(site)"}]}],"sections":[],"title":"Plausible.Workers.ImportGoogleAnalytics"},{"group":"","id":"Plausible.Workers.LockSites","sections":[],"title":"Plausible.Workers.LockSites"},{"group":"","id":"Plausible.Workers.NotifyAnnualRenewal","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"perform/1","id":"perform/1","title":"perform(job)"}]}],"sections":[],"title":"Plausible.Workers.NotifyAnnualRenewal"},{"group":"","id":"Plausible.Workers.RotateSalts","sections":[],"title":"Plausible.Workers.RotateSalts"},{"group":"","id":"Plausible.Workers.ScheduleEmailReports","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"first_of_month_9am/1","id":"first_of_month_9am/1","title":"first_of_month_9am(timezone)"},{"anchor":"monday_9am/1","id":"monday_9am/1","title":"monday_9am(timezone)"},{"anchor":"perform/1","id":"perform/1","title":"perform(job)"}]}],"sections":[],"title":"Plausible.Workers.ScheduleEmailReports"},{"group":"","id":"Plausible.Workers.SendCheckStatsEmails","sections":[],"title":"Plausible.Workers.SendCheckStatsEmails"},{"group":"","id":"Plausible.Workers.SendEmailReport","sections":[],"title":"Plausible.Workers.SendEmailReport"},{"group":"","id":"Plausible.Workers.SendSiteSetupEmails","sections":[],"title":"Plausible.Workers.SendSiteSetupEmails"},{"group":"","id":"Plausible.Workers.SendTrialNotifications","sections":[],"title":"Plausible.Workers.SendTrialNotifications"},{"group":"","id":"Plausible.Workers.SpikeNotifier","sections":[],"title":"Plausible.Workers.SpikeNotifier"},{"group":"","id":"PlausibleWeb","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__using__/1","id":"__using__/1","title":"__using__(which)"},{"anchor":"channel/0","id":"channel/0","title":"channel()"},{"anchor":"controller/0","id":"controller/0","title":"controller()"},{"anchor":"router/0","id":"router/0","title":"router()"},{"anchor":"view/0","id":"view/0","title":"view()"}]}],"sections":[],"title":"PlausibleWeb"},{"group":"","id":"PlausibleWeb.Api.ExternalController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"error/2","id":"error/2","title":"error(conn, params)"},{"anchor":"event/2","id":"event/2","title":"event(conn, params)"},{"anchor":"health/2","id":"health/2","title":"health(conn, params)"},{"anchor":"info/2","id":"info/2","title":"info(conn, params)"}]}],"sections":[],"title":"PlausibleWeb.Api.ExternalController"},{"group":"","id":"PlausibleWeb.Api.ExternalSitesController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"create_site/2","id":"create_site/2","title":"create_site(conn, params)"},{"anchor":"delete_goal/2","id":"delete_goal/2","title":"delete_goal(conn, params)"},{"anchor":"delete_site/2","id":"delete_site/2","title":"delete_site(conn, map)"},{"anchor":"find_or_create_goal/2","id":"find_or_create_goal/2","title":"find_or_create_goal(conn, params)"},{"anchor":"find_or_create_shared_link/2","id":"find_or_create_shared_link/2","title":"find_or_create_shared_link(conn, params)"},{"anchor":"get_site/2","id":"get_site/2","title":"get_site(conn, map)"},{"anchor":"update_site/2","id":"update_site/2","title":"update_site(conn, params)"}]}],"sections":[],"title":"PlausibleWeb.Api.ExternalSitesController"},{"group":"","id":"PlausibleWeb.Api.ExternalStatsController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"aggregate/2","id":"aggregate/2","title":"aggregate(conn, params)"},{"anchor":"breakdown/2","id":"breakdown/2","title":"breakdown(conn, params)"},{"anchor":"realtime_visitors/2","id":"realtime_visitors/2","title":"realtime_visitors(conn, params)"},{"anchor":"timeseries/2","id":"timeseries/2","title":"timeseries(conn, params)"}]}],"sections":[],"title":"PlausibleWeb.Api.ExternalStatsController"},{"group":"","id":"PlausibleWeb.Api.Helpers","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"bad_request/2","id":"bad_request/2","title":"bad_request(conn, msg)"},{"anchor":"not_found/2","id":"not_found/2","title":"not_found(conn, msg)"},{"anchor":"payment_required/2","id":"payment_required/2","title":"payment_required(conn, msg)"},{"anchor":"too_many_requests/2","id":"too_many_requests/2","title":"too_many_requests(conn, msg)"},{"anchor":"unauthorized/2","id":"unauthorized/2","title":"unauthorized(conn, msg)"}]}],"sections":[],"title":"PlausibleWeb.Api.Helpers"},{"group":"","id":"PlausibleWeb.Api.InternalController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"disable_feature/2","id":"disable_feature/2","title":"disable_feature(conn, map)"},{"anchor":"domain_status/2","id":"domain_status/2","title":"domain_status(conn, map)"},{"anchor":"sites/2","id":"sites/2","title":"sites(conn, params)"}]}],"sections":[],"title":"PlausibleWeb.Api.InternalController"},{"group":"","id":"PlausibleWeb.Api.PaddleController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"verified_signature?/1","id":"verified_signature?/1","title":"verified_signature?(params)"},{"anchor":"verify_signature/2","id":"verify_signature/2","title":"verify_signature(conn, opts)"},{"anchor":"webhook/2","id":"webhook/2","title":"webhook(conn, params)"}]}],"sections":[],"title":"PlausibleWeb.Api.PaddleController"},{"group":"","id":"PlausibleWeb.Api.StatsController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"all_props_breakdown/2","id":"all_props_breakdown/2","title":"all_props_breakdown(conn, params)"},{"anchor":"browser_versions/2","id":"browser_versions/2","title":"browser_versions(conn, params)"},{"anchor":"browsers/2","id":"browsers/2","title":"browsers(conn, params)"},{"anchor":"cities/2","id":"cities/2","title":"cities(conn, params)"},{"anchor":"conversions/2","id":"conversions/2","title":"conversions(conn, params)"},{"anchor":"countries/2","id":"countries/2","title":"countries(conn, params)"},{"anchor":"current_visitors/2","id":"current_visitors/2","title":"current_visitors(conn, _)"},{"anchor":"custom_prop_values/2","id":"custom_prop_values/2","title":"custom_prop_values(conn, params)"},{"anchor":"entry_pages/2","id":"entry_pages/2","title":"entry_pages(conn, params)"},{"anchor":"exit_pages/2","id":"exit_pages/2","title":"exit_pages(conn, params)"},{"anchor":"filter_suggestions/2","id":"filter_suggestions/2","title":"filter_suggestions(conn, params)"},{"anchor":"funnel/2","id":"funnel/2","title":"funnel(conn, params)"},{"anchor":"main_graph/2","id":"main_graph/2","title":"main_graph(conn, params)"},{"anchor":"operating_system_versions/2","id":"operating_system_versions/2","title":"operating_system_versions(conn, params)"},{"anchor":"operating_systems/2","id":"operating_systems/2","title":"operating_systems(conn, params)"},{"anchor":"pages/2","id":"pages/2","title":"pages(conn, params)"},{"anchor":"prop_breakdown/2","id":"prop_breakdown/2","title":"prop_breakdown(conn, params)"},{"anchor":"referrer_drilldown/2","id":"referrer_drilldown/2","title":"referrer_drilldown(conn, params)"},{"anchor":"regions/2","id":"regions/2","title":"regions(conn, params)"},{"anchor":"screen_sizes/2","id":"screen_sizes/2","title":"screen_sizes(conn, params)"},{"anchor":"sources/2","id":"sources/2","title":"sources(conn, params)"},{"anchor":"top_stats/2","id":"top_stats/2","title":"top_stats(conn, params)"},{"anchor":"utm_campaigns/2","id":"utm_campaigns/2","title":"utm_campaigns(conn, params)"},{"anchor":"utm_contents/2","id":"utm_contents/2","title":"utm_contents(conn, params)"},{"anchor":"utm_mediums/2","id":"utm_mediums/2","title":"utm_mediums(conn, params)"},{"anchor":"utm_sources/2","id":"utm_sources/2","title":"utm_sources(conn, params)"},{"anchor":"utm_terms/2","id":"utm_terms/2","title":"utm_terms(conn, params)"}]}],"sections":[],"title":"PlausibleWeb.Api.StatsController"},{"group":"","id":"PlausibleWeb.AuthController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"activate/2","id":"activate/2","title":"activate(conn, map)"},{"anchor":"activate_form/2","id":"activate_form/2","title":"activate_form(conn, params)"},{"anchor":"create_api_key/2","id":"create_api_key/2","title":"create_api_key(conn, map)"},{"anchor":"delete_api_key/2","id":"delete_api_key/2","title":"delete_api_key(conn, map)"},{"anchor":"delete_me/2","id":"delete_me/2","title":"delete_me(conn, params)"},{"anchor":"google_auth_callback/2","id":"google_auth_callback/2","title":"google_auth_callback(conn, params)"},{"anchor":"login/2","id":"login/2","title":"login(conn, map)"},{"anchor":"login_form/2","id":"login_form/2","title":"login_form(conn, params)"},{"anchor":"logout/2","id":"logout/2","title":"logout(conn, params)"},{"anchor":"new_api_key/2","id":"new_api_key/2","title":"new_api_key(conn, params)"},{"anchor":"password_form/2","id":"password_form/2","title":"password_form(conn, params)"},{"anchor":"password_reset/2","id":"password_reset/2","title":"password_reset(conn, map)"},{"anchor":"password_reset_form/2","id":"password_reset_form/2","title":"password_reset_form(conn, map)"},{"anchor":"password_reset_request/2","id":"password_reset_request/2","title":"password_reset_request(conn, params)"},{"anchor":"password_reset_request_form/2","id":"password_reset_request_form/2","title":"password_reset_request_form(conn, _)"},{"anchor":"register/2","id":"register/2","title":"register(conn, params)"},{"anchor":"register_form/2","id":"register_form/2","title":"register_form(conn, params)"},{"anchor":"register_from_invitation/2","id":"register_from_invitation/2","title":"register_from_invitation(conn, params)"},{"anchor":"register_from_invitation_form/2","id":"register_from_invitation_form/2","title":"register_from_invitation_form(conn, map)"},{"anchor":"request_activation_code/2","id":"request_activation_code/2","title":"request_activation_code(conn, params)"},{"anchor":"save_settings/2","id":"save_settings/2","title":"save_settings(conn, map)"},{"anchor":"set_password/2","id":"set_password/2","title":"set_password(conn, map)"},{"anchor":"user_settings/2","id":"user_settings/2","title":"user_settings(conn, params)"}]}],"sections":[],"title":"PlausibleWeb.AuthController"},{"group":"","id":"PlausibleWeb.AuthPlug","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"call/2","id":"call/2","title":"call(conn, opts)"},{"anchor":"init/1","id":"init/1","title":"init(options)"}]}],"sections":[],"title":"PlausibleWeb.AuthPlug"},{"group":"","id":"PlausibleWeb.AuthView","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__resource__/0","id":"__resource__/0","title":"__resource__()"},{"anchor":"activate.html/1","id":"activate.html/1","title":"activate.html(assigns)"},{"anchor":"base_domain/0","id":"base_domain/0","title":"base_domain()"},{"anchor":"delimit_integer/1","id":"delimit_integer/1","title":"delimit_integer(number)"},{"anchor":"format_invoices/1","id":"format_invoices/1","title":"format_invoices(invoice_list)"},{"anchor":"invitation_expired.html/1","id":"invitation_expired.html/1","title":"invitation_expired.html(assigns)"},{"anchor":"login_form.html/1","id":"login_form.html/1","title":"login_form.html(assigns)"},{"anchor":"new_api_key.html/1","id":"new_api_key.html/1","title":"new_api_key.html(assigns)"},{"anchor":"password_form.html/1","id":"password_form.html/1","title":"password_form.html(assigns)"},{"anchor":"password_reset_form.html/1","id":"password_reset_form.html/1","title":"password_reset_form.html(assigns)"},{"anchor":"password_reset_request_form.html/1","id":"password_reset_request_form.html/1","title":"password_reset_request_form.html(assigns)"},{"anchor":"password_reset_request_success.html/1","id":"password_reset_request_success.html/1","title":"password_reset_request_success.html(assigns)"},{"anchor":"plausible_url/0","id":"plausible_url/0","title":"plausible_url()"},{"anchor":"present_subscription_status/1","id":"present_subscription_status/1","title":"present_subscription_status(status)"},{"anchor":"register_form.html/1","id":"register_form.html/1","title":"register_form.html(assigns)"},{"anchor":"register_from_invitation_form.html/1","id":"register_from_invitation_form.html/1","title":"register_from_invitation_form.html(assigns)"},{"anchor":"register_success.html/1","id":"register_success.html/1","title":"register_success.html(assigns)"},{"anchor":"render/2","id":"render/2","title":"render(template, assigns \\\\ %{})"},{"anchor":"subscription_colors/1","id":"subscription_colors/1","title":"subscription_colors(_)"},{"anchor":"subscription_interval/1","id":"subscription_interval/1","title":"subscription_interval(subscription)"},{"anchor":"subscription_quota/1","id":"subscription_quota/1","title":"subscription_quota(subscription)"},{"anchor":"template_not_found/2","id":"template_not_found/2","title":"template_not_found(template, assigns)"},{"anchor":"user_settings.html/1","id":"user_settings.html/1","title":"user_settings.html(assigns)"}]}],"sections":[],"title":"PlausibleWeb.AuthView"},{"group":"","id":"PlausibleWeb.AuthorizeSiteAccess","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"call/2","id":"call/2","title":"call(conn, allowed_roles)"},{"anchor":"init/1","id":"init/1","title":"init(allowed_roles)"}]}],"sections":[],"title":"PlausibleWeb.AuthorizeSiteAccess"},{"group":"","id":"PlausibleWeb.AuthorizeSitesApiPlug","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"call/2","id":"call/2","title":"call(conn, opts)"},{"anchor":"init/1","id":"init/1","title":"init(options)"}]}],"sections":[],"title":"PlausibleWeb.AuthorizeSitesApiPlug"},{"group":"","id":"PlausibleWeb.AuthorizeStatsApiPlug","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"call/2","id":"call/2","title":"call(conn, opts)"},{"anchor":"init/1","id":"init/1","title":"init(options)"}]}],"sections":[],"title":"PlausibleWeb.AuthorizeStatsApiPlug"},{"group":"","id":"PlausibleWeb.BillingController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"change_enterprise_plan/2","id":"change_enterprise_plan/2","title":"change_enterprise_plan(conn, map)"},{"anchor":"change_plan/2","id":"change_plan/2","title":"change_plan(conn, map)"},{"anchor":"change_plan_form/2","id":"change_plan_form/2","title":"change_plan_form(conn, params)"},{"anchor":"change_plan_preview/2","id":"change_plan_preview/2","title":"change_plan_preview(conn, map)"},{"anchor":"ping_subscription/2","id":"ping_subscription/2","title":"ping_subscription(conn, params)"},{"anchor":"preview_susbcription/2","id":"preview_susbcription/2","title":"preview_susbcription(_, _)"},{"anchor":"upgrade/2","id":"upgrade/2","title":"upgrade(conn, params)"},{"anchor":"upgrade_enterprise_plan/2","id":"upgrade_enterprise_plan/2","title":"upgrade_enterprise_plan(conn, map)"},{"anchor":"upgrade_success/2","id":"upgrade_success/2","title":"upgrade_success(conn, params)"}]}],"sections":[],"title":"PlausibleWeb.BillingController"},{"group":"","id":"PlausibleWeb.BillingView","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__resource__/0","id":"__resource__/0","title":"__resource__()"},{"anchor":"base_domain/0","id":"base_domain/0","title":"base_domain()"},{"anchor":"change_enterprise_plan.html/1","id":"change_enterprise_plan.html/1","title":"change_enterprise_plan.html(assigns)"},{"anchor":"change_enterprise_plan_contact_us.html/1","id":"change_enterprise_plan_contact_us.html/1","title":"change_enterprise_plan_contact_us.html(assigns)"},{"anchor":"change_plan.html/1","id":"change_plan.html/1","title":"change_plan.html(assigns)"},{"anchor":"change_plan_preview.html/1","id":"change_plan_preview.html/1","title":"change_plan_preview.html(assigns)"},{"anchor":"plausible_url/0","id":"plausible_url/0","title":"plausible_url()"},{"anchor":"present_currency/1","id":"present_currency/1","title":"present_currency(arg)"},{"anchor":"present_date/1","id":"present_date/1","title":"present_date(date)"},{"anchor":"reccommended_plan/1","id":"reccommended_plan/1","title":"reccommended_plan(usage)"},{"anchor":"render/2","id":"render/2","title":"render(template, assigns \\\\ %{})"},{"anchor":"template_not_found/2","id":"template_not_found/2","title":"template_not_found(template, assigns)"},{"anchor":"upgrade.html/1","id":"upgrade.html/1","title":"upgrade.html(assigns)"},{"anchor":"upgrade_success.html/1","id":"upgrade_success.html/1","title":"upgrade_success.html(assigns)"},{"anchor":"upgrade_to_plan.html/1","id":"upgrade_to_plan.html/1","title":"upgrade_to_plan.html(assigns)"}]}],"sections":[],"title":"PlausibleWeb.BillingView"},{"group":"","id":"PlausibleWeb.CRMAuthPlug","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"call/2","id":"call/2","title":"call(conn, opts)"},{"anchor":"init/1","id":"init/1","title":"init(options)"}]}],"sections":[],"title":"PlausibleWeb.CRMAuthPlug"},{"group":"","id":"PlausibleWeb.Captcha","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"enabled?/0","id":"enabled?/0","title":"enabled?()"},{"anchor":"sitekey/0","id":"sitekey/0","title":"sitekey()"},{"anchor":"verify/1","id":"verify/1","title":"verify(token)"}]}],"sections":[],"title":"PlausibleWeb.Captcha"},{"group":"","id":"PlausibleWeb.Components.Generic","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"notice/1","id":"notice/1","title":"notice(assigns)"}]}],"sections":[],"title":"PlausibleWeb.Components.Generic"},{"group":"","id":"PlausibleWeb.Components.Site.Feature","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__resource__/0","id":"__resource__/0","title":"__resource__()"},{"anchor":"button_active/1","id":"button_active/1","title":"button_active(assigns)"},{"anchor":"button_inactive/1","id":"button_inactive/1","title":"button_inactive(assigns)"},{"anchor":"render/2","id":"render/2","title":"render(template, assigns \\\\ %{})"},{"anchor":"target/4","id":"target/4","title":"target(site, setting, conn, set_to)"},{"anchor":"template_not_found/2","id":"template_not_found/2","title":"template_not_found(template, assigns)"},{"anchor":"toggle/1","id":"toggle/1","title":"toggle(assigns)"}]}],"sections":[],"title":"PlausibleWeb.Components.Site.Feature"},{"group":"","id":"PlausibleWeb.ConnCase","sections":[],"title":"PlausibleWeb.ConnCase"},{"group":"","id":"PlausibleWeb.ControllerHelpers","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"render_error/2","id":"render_error/2","title":"render_error(conn, status)"},{"anchor":"render_error/3","id":"render_error/3","title":"render_error(conn, status, message)"}]}],"sections":[],"title":"PlausibleWeb.ControllerHelpers"},{"group":"","id":"PlausibleWeb.Email","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"activation_email/2","id":"activation_email/2","title":"activation_email(user, code)"},{"anchor":"base_email/0","id":"base_email/0","title":"base_email()"},{"anchor":"base_email/1","id":"base_email/1","title":"base_email(map)"},{"anchor":"cancellation_email/1","id":"cancellation_email/1","title":"cancellation_email(user)"},{"anchor":"check_stats_email/1","id":"check_stats_email/1","title":"check_stats_email(user)"},{"anchor":"create_site_email/1","id":"create_site_email/1","title":"create_site_email(user)"},{"anchor":"dashboard_locked/4","id":"dashboard_locked/4","title":"dashboard_locked(user, usage, last_cycle, suggested_plan)"},{"anchor":"enterprise_over_limit_internal_email/5","id":"enterprise_over_limit_internal_email/5","title":"enterprise_over_limit_internal_email(user, usage, last_cycle, site_usage, site_allowance)"},{"anchor":"error_report/3","id":"error_report/3","title":"error_report(reported_by, trace_id, feedback)"},{"anchor":"existing_user_invitation/1","id":"existing_user_invitation/1","title":"existing_user_invitation(invitation)"},{"anchor":"import_failure/2","id":"import_failure/2","title":"import_failure(user, site)"},{"anchor":"import_success/2","id":"import_success/2","title":"import_success(user, site)"},{"anchor":"invitation_accepted/1","id":"invitation_accepted/1","title":"invitation_accepted(invitation)"},{"anchor":"invitation_rejected/1","id":"invitation_rejected/1","title":"invitation_rejected(invitation)"},{"anchor":"mailer_email_from/0","id":"mailer_email_from/0","title":"mailer_email_from()"},{"anchor":"new_user_invitation/1","id":"new_user_invitation/1","title":"new_user_invitation(invitation)"},{"anchor":"over_limit_email/4","id":"over_limit_email/4","title":"over_limit_email(user, usage, last_cycle, suggested_plan)"},{"anchor":"ownership_transfer_accepted/1","id":"ownership_transfer_accepted/1","title":"ownership_transfer_accepted(invitation)"},{"anchor":"ownership_transfer_rejected/1","id":"ownership_transfer_rejected/1","title":"ownership_transfer_rejected(invitation)"},{"anchor":"ownership_transfer_request/2","id":"ownership_transfer_request/2","title":"ownership_transfer_request(invitation, new_owner_account)"},{"anchor":"password_reset_email/2","id":"password_reset_email/2","title":"password_reset_email(email, reset_link)"},{"anchor":"render/3","id":"render/3","title":"render(email, template, assigns \\\\ [])"},{"anchor":"site_member_removed/1","id":"site_member_removed/1","title":"site_member_removed(membership)"},{"anchor":"site_setup_help/2","id":"site_setup_help/2","title":"site_setup_help(user, site)"},{"anchor":"site_setup_success/2","id":"site_setup_success/2","title":"site_setup_success(user, site)"},{"anchor":"spike_notification/5","id":"spike_notification/5","title":"spike_notification(email, site, current_visitors, sources, dashboard_link)"},{"anchor":"trial_one_week_reminder/1","id":"trial_one_week_reminder/1","title":"trial_one_week_reminder(user)"},{"anchor":"trial_over_email/1","id":"trial_over_email/1","title":"trial_over_email(user)"},{"anchor":"trial_upgrade_email/3","id":"trial_upgrade_email/3","title":"trial_upgrade_email(user, day, arg)"},{"anchor":"weekly_report/3","id":"weekly_report/3","title":"weekly_report(email, site, assigns)"},{"anchor":"welcome_email/1","id":"welcome_email/1","title":"welcome_email(user)"},{"anchor":"yearly_expiration_notification/1","id":"yearly_expiration_notification/1","title":"yearly_expiration_notification(user)"},{"anchor":"yearly_renewal_notification/1","id":"yearly_renewal_notification/1","title":"yearly_renewal_notification(user)"}]}],"sections":[],"title":"PlausibleWeb.Email"},{"group":"","id":"PlausibleWeb.EmailView","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__resource__/0","id":"__resource__/0","title":"__resource__()"},{"anchor":"activation_email.html/1","id":"activation_email.html/1","title":"activation_email.html(assigns)"},{"anchor":"base_domain/0","id":"base_domain/0","title":"base_domain()"},{"anchor":"cancellation_email.html/1","id":"cancellation_email.html/1","title":"cancellation_email.html(assigns)"},{"anchor":"check_stats_email.html/1","id":"check_stats_email.html/1","title":"check_stats_email.html(assigns)"},{"anchor":"create_site_email.html/1","id":"create_site_email.html/1","title":"create_site_email.html(assigns)"},{"anchor":"dashboard_locked.html/1","id":"dashboard_locked.html/1","title":"dashboard_locked.html(assigns)"},{"anchor":"date_format/1","id":"date_format/1","title":"date_format(date)"},{"anchor":"enterprise_over_limit_internal.html/1","id":"enterprise_over_limit_internal.html/1","title":"enterprise_over_limit_internal.html(assigns)"},{"anchor":"error_report_email.html/1","id":"error_report_email.html/1","title":"error_report_email.html(assigns)"},{"anchor":"existing_user_invitation.html/1","id":"existing_user_invitation.html/1","title":"existing_user_invitation.html(assigns)"},{"anchor":"google_analytics_import.html/1","id":"google_analytics_import.html/1","title":"google_analytics_import.html(assigns)"},{"anchor":"greet_recipient/1","id":"greet_recipient/1","title":"greet_recipient(_)"},{"anchor":"invitation_accepted.html/1","id":"invitation_accepted.html/1","title":"invitation_accepted.html(assigns)"},{"anchor":"invitation_rejected.html/1","id":"invitation_rejected.html/1","title":"invitation_rejected.html(assigns)"},{"anchor":"new_user_invitation.html/1","id":"new_user_invitation.html/1","title":"new_user_invitation.html(assigns)"},{"anchor":"over_limit.html/1","id":"over_limit.html/1","title":"over_limit.html(assigns)"},{"anchor":"ownership_transfer_accepted.html/1","id":"ownership_transfer_accepted.html/1","title":"ownership_transfer_accepted.html(assigns)"},{"anchor":"ownership_transfer_rejected.html/1","id":"ownership_transfer_rejected.html/1","title":"ownership_transfer_rejected.html(assigns)"},{"anchor":"ownership_transfer_request.html/1","id":"ownership_transfer_request.html/1","title":"ownership_transfer_request.html(assigns)"},{"anchor":"password_reset_email.html/1","id":"password_reset_email.html/1","title":"password_reset_email.html(assigns)"},{"anchor":"plausible_url/0","id":"plausible_url/0","title":"plausible_url()"},{"anchor":"render/2","id":"render/2","title":"render(template, assigns \\\\ %{})"},{"anchor":"sentry_link/2","id":"sentry_link/2","title":"sentry_link(trace_id, dsn \\\\ Sentry.Config.dsn())"},{"anchor":"site_member_removed.html/1","id":"site_member_removed.html/1","title":"site_member_removed.html(assigns)"},{"anchor":"site_setup_help_email.html/1","id":"site_setup_help_email.html/1","title":"site_setup_help_email.html(assigns)"},{"anchor":"site_setup_success_email.html/1","id":"site_setup_success_email.html/1","title":"site_setup_success_email.html(assigns)"},{"anchor":"spike_notification.html/1","id":"spike_notification.html/1","title":"spike_notification.html(assigns)"},{"anchor":"template_not_found/2","id":"template_not_found/2","title":"template_not_found(template, assigns)"},{"anchor":"trial_one_week_reminder.html/1","id":"trial_one_week_reminder.html/1","title":"trial_one_week_reminder.html(assigns)"},{"anchor":"trial_over_email.html/1","id":"trial_over_email.html/1","title":"trial_over_email.html(assigns)"},{"anchor":"trial_upgrade_email.html/1","id":"trial_upgrade_email.html/1","title":"trial_upgrade_email.html(assigns)"},{"anchor":"welcome_email.html/1","id":"welcome_email.html/1","title":"welcome_email.html(assigns)"},{"anchor":"yearly_expiration_notification.html/1","id":"yearly_expiration_notification.html/1","title":"yearly_expiration_notification.html(assigns)"},{"anchor":"yearly_renewal_notification.html/1","id":"yearly_renewal_notification.html/1","title":"yearly_renewal_notification.html(assigns)"}]}],"sections":[],"title":"PlausibleWeb.EmailView"},{"group":"","id":"PlausibleWeb.Endpoint","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"broadcast/3","id":"broadcast/3","title":"broadcast(topic, event, msg)"},{"anchor":"broadcast!/3","id":"broadcast!/3","title":"broadcast!(topic, event, msg)"},{"anchor":"broadcast_from/4","id":"broadcast_from/4","title":"broadcast_from(from, topic, event, msg)"},{"anchor":"broadcast_from!/4","id":"broadcast_from!/4","title":"broadcast_from!(from, topic, event, msg)"},{"anchor":"call/2","id":"call/2","title":"call(conn, opts)"},{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(opts)"},{"anchor":"config/2","id":"config/2","title":"config(key, default \\\\ nil)"},{"anchor":"config_change/2","id":"config_change/2","title":"config_change(changed, removed)"},{"anchor":"host/0","id":"host/0","title":"host()"},{"anchor":"init/1","id":"init/1","title":"init(opts)"},{"anchor":"local_broadcast/3","id":"local_broadcast/3","title":"local_broadcast(topic, event, msg)"},{"anchor":"local_broadcast_from/4","id":"local_broadcast_from/4","title":"local_broadcast_from(from, topic, event, msg)"},{"anchor":"patch_session_opts/0","id":"patch_session_opts/0","title":"patch_session_opts()"},{"anchor":"path/1","id":"path/1","title":"path(path)"},{"anchor":"script_name/0","id":"script_name/0","title":"script_name()"},{"anchor":"start_link/1","id":"start_link/1","title":"start_link(opts \\\\ [])"},{"anchor":"static_integrity/1","id":"static_integrity/1","title":"static_integrity(path)"},{"anchor":"static_lookup/1","id":"static_lookup/1","title":"static_lookup(path)"},{"anchor":"static_path/1","id":"static_path/1","title":"static_path(path)"},{"anchor":"static_url/0","id":"static_url/0","title":"static_url()"},{"anchor":"struct_url/0","id":"struct_url/0","title":"struct_url()"},{"anchor":"subscribe/2","id":"subscribe/2","title":"subscribe(topic, opts \\\\ [])"},{"anchor":"unsubscribe/1","id":"unsubscribe/1","title":"unsubscribe(topic)"},{"anchor":"url/0","id":"url/0","title":"url()"},{"anchor":"websocket_url/0","id":"websocket_url/0","title":"websocket_url()"}]}],"sections":[],"title":"PlausibleWeb.Endpoint"},{"group":"","id":"PlausibleWeb.ErrorHelpers","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"error_tag/2","id":"error_tag/2","title":"error_tag(form, field)"}]}],"sections":[],"title":"PlausibleWeb.ErrorHelpers"},{"group":"","id":"PlausibleWeb.ErrorReportController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"submit_error_report/2","id":"submit_error_report/2","title":"submit_error_report(conn, arg2)"}]}],"sections":[],"title":"PlausibleWeb.ErrorReportController"},{"group":"","id":"PlausibleWeb.ErrorView","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__resource__/0","id":"__resource__/0","title":"__resource__()"},{"anchor":"generic_error.html/1","id":"generic_error.html/1","title":"generic_error.html(assigns)"},{"anchor":"render/2","id":"render/2","title":"render(template, assigns \\\\ %{})"},{"anchor":"server_error.html/1","id":"server_error.html/1","title":"server_error.html(assigns)"},{"anchor":"server_error_report_thanks.html/1","id":"server_error_report_thanks.html/1","title":"server_error_report_thanks.html(assigns)"},{"anchor":"template_not_found/2","id":"template_not_found/2","title":"template_not_found(template, assigns)"}]}],"sections":[],"title":"PlausibleWeb.ErrorView"},{"group":"","id":"PlausibleWeb.Favicon","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"call/2","id":"call/2","title":"call(conn, list)"},{"anchor":"init/1","id":"init/1","title":"init(_)"}]}],"sections":[],"title":"PlausibleWeb.Favicon"},{"group":"","id":"PlausibleWeb.FirstLaunchPlug","sections":[],"title":"PlausibleWeb.FirstLaunchPlug"},{"group":"","id":"PlausibleWeb.FormHelpers","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"styled_error/1","id":"styled_error/1","title":"styled_error(error)"},{"anchor":"styled_label/4","id":"styled_label/4","title":"styled_label(form, field, text, opts \\\\ [])"},{"anchor":"styled_select/4","id":"styled_select/4","title":"styled_select(form, field, options, opts \\\\ [])"},{"anchor":"styled_text_input/3","id":"styled_text_input/3","title":"styled_text_input(form, field, opts \\\\ [])"}]}],"sections":[],"title":"PlausibleWeb.FormHelpers"},{"group":"","id":"PlausibleWeb.InvitationController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"accept_invitation/2","id":"accept_invitation/2","title":"accept_invitation(conn, map)"},{"anchor":"reject_invitation/2","id":"reject_invitation/2","title":"reject_invitation(conn, map)"},{"anchor":"remove_invitation/2","id":"remove_invitation/2","title":"remove_invitation(conn, map)"}]}],"sections":[],"title":"PlausibleWeb.InvitationController"},{"group":"","id":"PlausibleWeb.LastSeenPlug","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"call/2","id":"call/2","title":"call(conn, opts)"},{"anchor":"init/1","id":"init/1","title":"init(opts)"}]}],"sections":[],"title":"PlausibleWeb.LastSeenPlug"},{"group":"","id":"PlausibleWeb.LayoutView","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__resource__/0","id":"__resource__/0","title":"__resource__()"},{"anchor":"app.html/1","id":"app.html/1","title":"app.html(assigns)"},{"anchor":"base_domain/0","id":"base_domain/0","title":"base_domain()"},{"anchor":"base_email.html/1","id":"base_email.html/1","title":"base_email.html(assigns)"},{"anchor":"base_error.html/1","id":"base_error.html/1","title":"base_error.html(assigns)"},{"anchor":"embedded.html/1","id":"embedded.html/1","title":"embedded.html(assigns)"},{"anchor":"focus.html/1","id":"focus.html/1","title":"focus.html(assigns)"},{"anchor":"grace_period_end/1","id":"grace_period_end/1","title":"grace_period_end(user)"},{"anchor":"home_dest/1","id":"home_dest/1","title":"home_dest(conn)"},{"anchor":"is_current_tab/2","id":"is_current_tab/2","title":"is_current_tab(conn, tab)"},{"anchor":"plausible_url/0","id":"plausible_url/0","title":"plausible_url()"},{"anchor":"render/2","id":"render/2","title":"render(template, assigns \\\\ %{})"},{"anchor":"render_layout/3","id":"render_layout/3","title":"render_layout(layout, assigns, list)"},{"anchor":"settings_tabs/1","id":"settings_tabs/1","title":"settings_tabs(conn)"},{"anchor":"site_settings.html/1","id":"site_settings.html/1","title":"site_settings.html(assigns)"},{"anchor":"template_not_found/2","id":"template_not_found/2","title":"template_not_found(template, assigns)"},{"anchor":"trial_notificaton/1","id":"trial_notificaton/1","title":"trial_notificaton(user)"},{"anchor":"websocket_url/0","id":"websocket_url/0","title":"websocket_url()"}]}],"sections":[],"title":"PlausibleWeb.LayoutView"},{"group":"","id":"PlausibleWeb.Live.Components.ComboBox","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"dropdown/1","id":"dropdown/1","title":"dropdown(assigns)"},{"anchor":"dropdown_anchor/1","id":"dropdown_anchor/1","title":"dropdown_anchor(assigns)"},{"anchor":"handle_event/3","id":"handle_event/3","title":"handle_event(binary, params, socket)"},{"anchor":"option/1","id":"option/1","title":"option(assigns)"},{"anchor":"render/1","id":"render/1","title":"render(assigns)"},{"anchor":"select_option/4","id":"select_option/4","title":"select_option(js \\\\ %JS{}, id, submit_value, display_value)"},{"anchor":"update/2","id":"update/2","title":"update(assigns, socket)"}]}],"sections":[],"title":"PlausibleWeb.Live.Components.ComboBox"},{"group":"","id":"PlausibleWeb.Live.Components.ComboBox.StaticSearch","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"suggest/2","id":"suggest/2","title":"suggest(input, options)"}]}],"sections":[],"title":"PlausibleWeb.Live.Components.ComboBox.StaticSearch"},{"group":"","id":"PlausibleWeb.Live.Flash","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"clear_flash_button/1","id":"clear_flash_button/1","title":"clear_flash_button(assigns)"},{"anchor":"flash/1","id":"flash/1","title":"flash(assigns)"},{"anchor":"icon_error/1","id":"icon_error/1","title":"icon_error(assigns)"},{"anchor":"icon_success/1","id":"icon_success/1","title":"icon_success(assigns)"},{"anchor":"render/1","id":"render/1","title":"render(assigns)"}]}],"sections":[],"title":"PlausibleWeb.Live.Flash"},{"group":"","id":"PlausibleWeb.Live.FunnelSettings","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"handle_event/3","id":"handle_event/3","title":"handle_event(binary, arg2, socket)"},{"anchor":"handle_info/2","id":"handle_info/2","title":"handle_info(arg1, socket)"},{"anchor":"mount/3","id":"mount/3","title":"mount(params, map, socket)"},{"anchor":"render/1","id":"render/1","title":"render(assigns)"}]}],"sections":[],"title":"PlausibleWeb.Live.FunnelSettings"},{"group":"","id":"PlausibleWeb.Live.FunnelSettings.Form","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"add_step_button/1","id":"add_step_button/1","title":"add_step_button(assigns)"},{"anchor":"cancel_button/1","id":"cancel_button/1","title":"cancel_button(assigns)"},{"anchor":"error/1","id":"error/1","title":"error(assigns)"},{"anchor":"evaluation/1","id":"evaluation/1","title":"evaluation(assigns)"},{"anchor":"handle_event/3","id":"handle_event/3","title":"handle_event(binary, arg2, socket)"},{"anchor":"handle_info/2","id":"handle_info/2","title":"handle_info(arg1, socket)"},{"anchor":"input/1","id":"input/1","title":"input(assigns)"},{"anchor":"mount/3","id":"mount/3","title":"mount(params, map, socket)"},{"anchor":"remove_step_button/1","id":"remove_step_button/1","title":"remove_step_button(assigns)"},{"anchor":"render/1","id":"render/1","title":"render(assigns)"},{"anchor":"submit_button/1","id":"submit_button/1","title":"submit_button(assigns)"},{"anchor":"submit_button_inactive/1","id":"submit_button_inactive/1","title":"submit_button_inactive(assigns)"}]}],"sections":[],"title":"PlausibleWeb.Live.FunnelSettings.Form"},{"group":"","id":"PlausibleWeb.Live.FunnelSettings.List","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"render/1","id":"render/1","title":"render(assigns)"}]}],"sections":[],"title":"PlausibleWeb.Live.FunnelSettings.List"},{"group":"","id":"PlausibleWeb.MJML.WeeklyReport","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"debug_mjml_template/0","id":"debug_mjml_template/0","title":"debug_mjml_template()"},{"anchor":"render/1","id":"render/1","title":"render(assigns)"}]}],"sections":[],"title":"PlausibleWeb.MJML.WeeklyReport"},{"group":"","id":"PlausibleWeb.PageController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"index/2","id":"index/2","title":"index(conn, params)"}]}],"sections":[],"title":"PlausibleWeb.PageController"},{"group":"","id":"PlausibleWeb.PageView","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__resource__/0","id":"__resource__/0","title":"__resource__()"},{"anchor":"index.html/1","id":"index.html/1","title":"index.html(assigns)"},{"anchor":"render/2","id":"render/2","title":"render(template, assigns \\\\ %{})"},{"anchor":"template_not_found/2","id":"template_not_found/2","title":"template_not_found(template, assigns)"}]}],"sections":[],"title":"PlausibleWeb.PageView"},{"group":"","id":"PlausibleWeb.Plugs.NoRobots","sections":[],"title":"PlausibleWeb.Plugs.NoRobots"},{"group":"","id":"PlausibleWeb.Plugs.RuntimeSessionAdapter","sections":[],"title":"PlausibleWeb.Plugs.RuntimeSessionAdapter"},{"group":"","id":"PlausibleWeb.RefInspector","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"parse/1","id":"parse/1","title":"parse(ref)"},{"anchor":"right_uri?/1","id":"right_uri?/1","title":"right_uri?(arg1)"}]}],"sections":[],"title":"PlausibleWeb.RefInspector"},{"group":"","id":"PlausibleWeb.RemoteIp","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"get/1","id":"get/1","title":"get(conn)"}]}],"sections":[],"title":"PlausibleWeb.RemoteIp"},{"group":"","id":"PlausibleWeb.RequireAccountPlug","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"call/2","id":"call/2","title":"call(conn, opts)"},{"anchor":"init/1","id":"init/1","title":"init(options)"}]}],"sections":[],"title":"PlausibleWeb.RequireAccountPlug"},{"group":"","id":"PlausibleWeb.RequireLoggedOutPlug","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"call/2","id":"call/2","title":"call(conn, opts)"},{"anchor":"init/1","id":"init/1","title":"init(options)"}]}],"sections":[],"title":"PlausibleWeb.RequireLoggedOutPlug"},{"group":"","id":"PlausibleWeb.Router","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"api/2","id":"api/2","title":"api(conn, _)"},{"anchor":"browser/2","id":"browser/2","title":"browser(conn, _)"},{"anchor":"call/2","id":"call/2","title":"call(conn, opts)"},{"anchor":"csrf/2","id":"csrf/2","title":"csrf(conn, _)"},{"anchor":"flags/2","id":"flags/2","title":"flags(conn, _)"},{"anchor":"init/1","id":"init/1","title":"init(opts)"},{"anchor":"internal_stats_api/2","id":"internal_stats_api/2","title":"internal_stats_api(conn, _)"},{"anchor":"kaffy_browser/2","id":"kaffy_browser/2","title":"kaffy_browser(conn, _)"},{"anchor":"public_api/2","id":"public_api/2","title":"public_api(conn, _)"},{"anchor":"shared_link/2","id":"shared_link/2","title":"shared_link(conn, _)"}]}],"sections":[],"title":"PlausibleWeb.Router"},{"group":"","id":"PlausibleWeb.SessionTimeoutPlug","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"call/2","id":"call/2","title":"call(conn, opts)"},{"anchor":"init/1","id":"init/1","title":"init(opts \\\\ [])"}]}],"sections":[],"title":"PlausibleWeb.SessionTimeoutPlug"},{"group":"","id":"PlausibleWeb.Site.MembershipController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"invite_member/2","id":"invite_member/2","title":"invite_member(conn, map)"},{"anchor":"invite_member_form/2","id":"invite_member_form/2","title":"invite_member_form(conn, params)"},{"anchor":"remove_member/2","id":"remove_member/2","title":"remove_member(conn, map)"},{"anchor":"transfer_ownership/2","id":"transfer_ownership/2","title":"transfer_ownership(conn, map)"},{"anchor":"transfer_ownership_form/2","id":"transfer_ownership_form/2","title":"transfer_ownership_form(conn, params)"},{"anchor":"update_role/2","id":"update_role/2","title":"update_role(conn, map)"}]}],"sections":[],"title":"PlausibleWeb.Site.MembershipController"},{"group":"","id":"PlausibleWeb.Site.MembershipView","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__resource__/0","id":"__resource__/0","title":"__resource__()"},{"anchor":"invite_member_form.html/1","id":"invite_member_form.html/1","title":"invite_member_form.html(assigns)"},{"anchor":"render/2","id":"render/2","title":"render(template, assigns \\\\ %{})"},{"anchor":"template_not_found/2","id":"template_not_found/2","title":"template_not_found(template, assigns)"},{"anchor":"transfer_ownership_form.html/1","id":"transfer_ownership_form.html/1","title":"transfer_ownership_form.html(assigns)"}]}],"sections":[],"title":"PlausibleWeb.Site.MembershipView"},{"group":"","id":"PlausibleWeb.SiteController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"add_monthly_report_recipient/2","id":"add_monthly_report_recipient/2","title":"add_monthly_report_recipient(conn, map)"},{"anchor":"add_snippet/2","id":"add_snippet/2","title":"add_snippet(conn, params)"},{"anchor":"add_snippet_after_domain_change/2","id":"add_snippet_after_domain_change/2","title":"add_snippet_after_domain_change(conn, params)"},{"anchor":"add_spike_notification_recipient/2","id":"add_spike_notification_recipient/2","title":"add_spike_notification_recipient(conn, map)"},{"anchor":"add_weekly_report_recipient/2","id":"add_weekly_report_recipient/2","title":"add_weekly_report_recipient(conn, map)"},{"anchor":"change_domain/2","id":"change_domain/2","title":"change_domain(conn, params)"},{"anchor":"change_domain_submit/2","id":"change_domain_submit/2","title":"change_domain_submit(conn, map)"},{"anchor":"create_goal/2","id":"create_goal/2","title":"create_goal(conn, map)"},{"anchor":"create_shared_link/2","id":"create_shared_link/2","title":"create_shared_link(conn, map)"},{"anchor":"create_site/2","id":"create_site/2","title":"create_site(conn, map)"},{"anchor":"delete_custom_domain/2","id":"delete_custom_domain/2","title":"delete_custom_domain(conn, map)"},{"anchor":"delete_goal/2","id":"delete_goal/2","title":"delete_goal(conn, map)"},{"anchor":"delete_google_auth/2","id":"delete_google_auth/2","title":"delete_google_auth(conn, params)"},{"anchor":"delete_shared_link/2","id":"delete_shared_link/2","title":"delete_shared_link(conn, map)"},{"anchor":"delete_site/2","id":"delete_site/2","title":"delete_site(conn, params)"},{"anchor":"disable_monthly_report/2","id":"disable_monthly_report/2","title":"disable_monthly_report(conn, params)"},{"anchor":"disable_spike_notification/2","id":"disable_spike_notification/2","title":"disable_spike_notification(conn, params)"},{"anchor":"disable_weekly_report/2","id":"disable_weekly_report/2","title":"disable_weekly_report(conn, params)"},{"anchor":"edit_shared_link/2","id":"edit_shared_link/2","title":"edit_shared_link(conn, map)"},{"anchor":"enable_monthly_report/2","id":"enable_monthly_report/2","title":"enable_monthly_report(conn, params)"},{"anchor":"enable_spike_notification/2","id":"enable_spike_notification/2","title":"enable_spike_notification(conn, params)"},{"anchor":"enable_weekly_report/2","id":"enable_weekly_report/2","title":"enable_weekly_report(conn, params)"},{"anchor":"forget_imported/2","id":"forget_imported/2","title":"forget_imported(conn, params)"},{"anchor":"import_from_google/2","id":"import_from_google/2","title":"import_from_google(conn, map)"},{"anchor":"import_from_google_confirm/2","id":"import_from_google_confirm/2","title":"import_from_google_confirm(conn, map)"},{"anchor":"import_from_google_user_metric_notice/2","id":"import_from_google_user_metric_notice/2","title":"import_from_google_user_metric_notice(conn, map)"},{"anchor":"import_from_google_view_id/2","id":"import_from_google_view_id/2","title":"import_from_google_view_id(conn, map)"},{"anchor":"import_from_google_view_id_form/2","id":"import_from_google_view_id_form/2","title":"import_from_google_view_id_form(conn, map)"},{"anchor":"index/2","id":"index/2","title":"index(conn, params)"},{"anchor":"make_private/2","id":"make_private/2","title":"make_private(conn, params)"},{"anchor":"make_public/2","id":"make_public/2","title":"make_public(conn, params)"},{"anchor":"new/2","id":"new/2","title":"new(conn, params)"},{"anchor":"new_goal/2","id":"new_goal/2","title":"new_goal(conn, params)"},{"anchor":"new_shared_link/2","id":"new_shared_link/2","title":"new_shared_link(conn, params)"},{"anchor":"remove_monthly_report_recipient/2","id":"remove_monthly_report_recipient/2","title":"remove_monthly_report_recipient(conn, map)"},{"anchor":"remove_spike_notification_recipient/2","id":"remove_spike_notification_recipient/2","title":"remove_spike_notification_recipient(conn, map)"},{"anchor":"remove_weekly_report_recipient/2","id":"remove_weekly_report_recipient/2","title":"remove_weekly_report_recipient(conn, map)"},{"anchor":"reset_stats/2","id":"reset_stats/2","title":"reset_stats(conn, params)"},{"anchor":"settings/2","id":"settings/2","title":"settings(conn, map)"},{"anchor":"settings_custom_domain/2","id":"settings_custom_domain/2","title":"settings_custom_domain(conn, params)"},{"anchor":"settings_danger_zone/2","id":"settings_danger_zone/2","title":"settings_danger_zone(conn, params)"},{"anchor":"settings_email_reports/2","id":"settings_email_reports/2","title":"settings_email_reports(conn, params)"},{"anchor":"settings_funnels/2","id":"settings_funnels/2","title":"settings_funnels(conn, params)"},{"anchor":"settings_general/2","id":"settings_general/2","title":"settings_general(conn, params)"},{"anchor":"settings_goals/2","id":"settings_goals/2","title":"settings_goals(conn, params)"},{"anchor":"settings_people/2","id":"settings_people/2","title":"settings_people(conn, params)"},{"anchor":"settings_search_console/2","id":"settings_search_console/2","title":"settings_search_console(conn, params)"},{"anchor":"settings_visibility/2","id":"settings_visibility/2","title":"settings_visibility(conn, params)"},{"anchor":"update_feature_visibility/2","id":"update_feature_visibility/2","title":"update_feature_visibility(conn, map)"},{"anchor":"update_google_auth/2","id":"update_google_auth/2","title":"update_google_auth(conn, map)"},{"anchor":"update_settings/2","id":"update_settings/2","title":"update_settings(conn, map)"},{"anchor":"update_shared_link/2","id":"update_shared_link/2","title":"update_shared_link(conn, map)"},{"anchor":"update_spike_notification/2","id":"update_spike_notification/2","title":"update_spike_notification(conn, map)"}]}],"sections":[],"title":"PlausibleWeb.SiteController"},{"group":"","id":"PlausibleWeb.SiteView","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__resource__/0","id":"__resource__/0","title":"__resource__()"},{"anchor":"base_domain/0","id":"base_domain/0","title":"base_domain()"},{"anchor":"change_domain.html/1","id":"change_domain.html/1","title":"change_domain.html(assigns)"},{"anchor":"edit_shared_link.html/1","id":"edit_shared_link.html/1","title":"edit_shared_link.html(assigns)"},{"anchor":"goal_name/1","id":"goal_name/1","title":"goal_name(arg)"},{"anchor":"google_logo/1","id":"google_logo/1","title":"google_logo(assigns \\\\ %{})"},{"anchor":"gravatar/2","id":"gravatar/2","title":"gravatar(email, opts)"},{"anchor":"import_from_google_confirm.html/1","id":"import_from_google_confirm.html/1","title":"import_from_google_confirm.html(assigns)"},{"anchor":"import_from_google_user_metric_form.html/1","id":"import_from_google_user_metric_form.html/1","title":"import_from_google_user_metric_form.html(assigns)"},{"anchor":"import_from_google_view_id_form.html/1","id":"import_from_google_view_id_form.html/1","title":"import_from_google_view_id_form.html(assigns)"},{"anchor":"index.html/1","id":"index.html/1","title":"index.html(assigns)"},{"anchor":"new.html/1","id":"new.html/1","title":"new.html(assigns)"},{"anchor":"new_goal.html/1","id":"new_goal.html/1","title":"new_goal.html(assigns)"},{"anchor":"new_shared_link.html/1","id":"new_shared_link.html/1","title":"new_shared_link.html(assigns)"},{"anchor":"plausible_url/0","id":"plausible_url/0","title":"plausible_url()"},{"anchor":"render/2","id":"render/2","title":"render(template, assigns \\\\ %{})"},{"anchor":"render_snippet/1","id":"render_snippet/1","title":"render_snippet(site)"},{"anchor":"settings_custom_domain.html/1","id":"settings_custom_domain.html/1","title":"settings_custom_domain.html(assigns)"},{"anchor":"settings_danger_zone.html/1","id":"settings_danger_zone.html/1","title":"settings_danger_zone.html(assigns)"},{"anchor":"settings_email_reports.html/1","id":"settings_email_reports.html/1","title":"settings_email_reports.html(assigns)"},{"anchor":"settings_funnels.html/1","id":"settings_funnels.html/1","title":"settings_funnels.html(assigns)"},{"anchor":"settings_general.html/1","id":"settings_general.html/1","title":"settings_general.html(assigns)"},{"anchor":"settings_goals.html/1","id":"settings_goals.html/1","title":"settings_goals.html(assigns)"},{"anchor":"settings_people.html/1","id":"settings_people.html/1","title":"settings_people.html(assigns)"},{"anchor":"settings_search_console.html/1","id":"settings_search_console.html/1","title":"settings_search_console.html(assigns)"},{"anchor":"settings_visibility.html/1","id":"settings_visibility.html/1","title":"settings_visibility.html(assigns)"},{"anchor":"shared_link_dest/2","id":"shared_link_dest/2","title":"shared_link_dest(site, link)"},{"anchor":"snippet.html/1","id":"snippet.html/1","title":"snippet.html(assigns)"},{"anchor":"snippet_after_domain_change.html/1","id":"snippet_after_domain_change.html/1","title":"snippet_after_domain_change.html(assigns)"},{"anchor":"template_not_found/2","id":"template_not_found/2","title":"template_not_found(template, assigns)"},{"anchor":"with_indefinite_article/1","id":"with_indefinite_article/1","title":"with_indefinite_article(word)"}]}],"sections":[],"title":"PlausibleWeb.SiteView"},{"group":"","id":"PlausibleWeb.StatsController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"authenticate_shared_link/2","id":"authenticate_shared_link/2","title":"authenticate_shared_link(conn, map)"},{"anchor":"csv_export/2","id":"csv_export/2","title":"csv_export(conn, params)"},{"anchor":"shared_link/2","id":"shared_link/2","title":"shared_link(conn, arg2)"},{"anchor":"stats/2","id":"stats/2","title":"stats(conn, params)"}]}],"sections":[],"title":"PlausibleWeb.StatsController"},{"group":"","id":"PlausibleWeb.StatsView","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__resource__/0","id":"__resource__/0","title":"__resource__()"},{"anchor":"base_domain/0","id":"base_domain/0","title":"base_domain()"},{"anchor":"large_number_format/1","id":"large_number_format/1","title":"large_number_format(n)"},{"anchor":"plausible_url/0","id":"plausible_url/0","title":"plausible_url()"},{"anchor":"pretty_stats_url/1","id":"pretty_stats_url/1","title":"pretty_stats_url(arg)"},{"anchor":"render/2","id":"render/2","title":"render(template, assigns \\\\ %{})"},{"anchor":"shared_link_password.html/1","id":"shared_link_password.html/1","title":"shared_link_password.html(assigns)"},{"anchor":"site_locked.html/1","id":"site_locked.html/1","title":"site_locked.html(assigns)"},{"anchor":"stats.html/1","id":"stats.html/1","title":"stats.html(assigns)"},{"anchor":"stats_container_class/1","id":"stats_container_class/1","title":"stats_container_class(conn)"},{"anchor":"template_not_found/2","id":"template_not_found/2","title":"template_not_found(template, assigns)"},{"anchor":"waiting_first_pageview.html/1","id":"waiting_first_pageview.html/1","title":"waiting_first_pageview.html(assigns)"}]}],"sections":[],"title":"PlausibleWeb.StatsView"},{"group":"","id":"PlausibleWeb.Tracker","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"call/2","id":"call/2","title":"call(conn, list)"},{"anchor":"child_spec/1","id":"child_spec/1","title":"child_spec(arg)"},{"anchor":"init/1","id":"init/1","title":"init(opts)"}]}],"sections":[],"title":"PlausibleWeb.Tracker"},{"group":"","id":"PlausibleWeb.UnsubscribeController","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"monthly_report/2","id":"monthly_report/2","title":"monthly_report(conn, map)"},{"anchor":"weekly_report/2","id":"weekly_report/2","title":"weekly_report(conn, map)"}]}],"sections":[],"title":"PlausibleWeb.UnsubscribeController"},{"group":"","id":"PlausibleWeb.UnsubscribeView","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"__resource__/0","id":"__resource__/0","title":"__resource__()"},{"anchor":"render/2","id":"render/2","title":"render(template, assigns \\\\ %{})"},{"anchor":"success.html/1","id":"success.html/1","title":"success.html(assigns)"},{"anchor":"template_not_found/2","id":"template_not_found/2","title":"template_not_found(template, assigns)"}]}],"sections":[],"title":"PlausibleWeb.UnsubscribeView"}],"tasks":[{"group":"","id":"Mix.Tasks.AnalyzePlans","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"run/1","id":"run/1","title":"run(_)"}]}],"sections":[],"title":"mix analyze_plans"},{"group":"","id":"Mix.Tasks.CleanClickhouse","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"run/1","id":"run/1","title":"run(_)"}]}],"sections":[],"title":"mix clean_clickhouse"},{"group":"","id":"Mix.Tasks.CreateFreeSubscription","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"execute/1","id":"execute/1","title":"execute(user_id)"},{"anchor":"run/1","id":"run/1","title":"run(arg1)"}]}],"sections":[],"title":"mix create_free_subscription"},{"group":"","id":"Mix.Tasks.DownloadCountryDatabase","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"run/1","id":"run/1","title":"run(_)"}]}],"sections":[],"title":"mix download_country_database"},{"group":"","id":"Mix.Tasks.GenerateReferrerFavicons","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"run/1","id":"run/1","title":"run(_)"}]}],"sections":[],"title":"mix generate_referrer_favicons"},{"group":"","id":"Mix.Tasks.PullSandboxSubscription","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"run/1","id":"run/1","title":"run(list)"}]}],"sections":[],"title":"mix pull_sandbox_subscription"},{"group":"","id":"Mix.Tasks.SendPageview","nodeGroups":[{"key":"functions","name":"Functions","nodes":[{"anchor":"run/1","id":"run/1","title":"run(opts)"}]}],"sections":[],"title":"mix send_pageview"}]} \ No newline at end of file diff --git a/readme.html b/readme.html index 7b4238fa2..edf0bc2c9 100644 --- a/readme.html +++ b/readme.html @@ -13,7 +13,7 @@ - + diff --git a/search.html b/search.html index 405188590..3b32c7527 100644 --- a/search.html +++ b/search.html @@ -13,7 +13,7 @@ - + @@ -107,7 +107,7 @@ Plausible
    - +