From 21e01fadb66503f5af2422776cfb2fd5e11217e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonatan=20K=C5=82osko?= Date: Thu, 21 Nov 2024 11:46:33 +0100 Subject: [PATCH] Simplify static assets handling (#2866) --- .dockerignore | 2 + .gitignore | 4 + Dockerfile | 1 + assets/js/lib/utils.js | 2 +- lib/livebook/config.ex | 12 ++ lib/livebook_cli.ex | 50 ++++++ lib/livebook_web.ex | 2 +- .../components/layouts/root.html.heex | 4 +- lib/livebook_web/controllers/error_html.ex | 4 +- lib/livebook_web/endpoint.ex | 62 ++++--- lib/livebook_web/iframe_endpoint.ex | 19 +-- .../plugs/file_system_provider.ex | 36 ---- lib/livebook_web/plugs/memory_provider.ex | 71 -------- lib/livebook_web/plugs/static_plug.ex | 160 ------------------ lib/mix/tasks/livebook.gen_priv.ex | 37 ++++ mix.exs | 10 +- priv/.gitkeep | 0 static/assets/app.js | 2 +- static/{ => favicons}/favicon-errored.svg | 0 static/{ => favicons}/favicon-evaluating.svg | 0 static/{ => favicons}/favicon-stale.svg | 0 static/{ => favicons}/favicon.png | Bin static/{ => favicons}/favicon.svg | 0 .../plugs/file_system_provider_test.exs | 21 --- .../plugs/memory_provider_test.exs | 22 --- test/livebook_web/plugs/static_plug_test.exs | 66 -------- 26 files changed, 164 insertions(+), 423 deletions(-) delete mode 100644 lib/livebook_web/plugs/file_system_provider.ex delete mode 100644 lib/livebook_web/plugs/memory_provider.ex delete mode 100644 lib/livebook_web/plugs/static_plug.ex create mode 100644 lib/mix/tasks/livebook.gen_priv.ex create mode 100644 priv/.gitkeep rename static/{ => favicons}/favicon-errored.svg (100%) rename static/{ => favicons}/favicon-evaluating.svg (100%) rename static/{ => favicons}/favicon-stale.svg (100%) rename static/{ => favicons}/favicon.png (100%) rename static/{ => favicons}/favicon.svg (100%) delete mode 100644 test/livebook_web/plugs/file_system_provider_test.exs delete mode 100644 test/livebook_web/plugs/memory_provider_test.exs delete mode 100644 test/livebook_web/plugs/static_plug_test.exs diff --git a/.dockerignore b/.dockerignore index 938280e5c..9b870c8b5 100644 --- a/.dockerignore +++ b/.dockerignore @@ -12,5 +12,7 @@ npm-debug.log /assets/node_modules/ /tmp/ /livebook +/priv/static +/priv/iframe_static # Ignore app release files, including build artifacts /rel/app diff --git a/.gitignore b/.gitignore index 8bdd34dd8..9282e3123 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,7 @@ npm-debug.log # The built Escript /livebook + +# We generate priv when building release or escript +/priv/static +/priv/iframe_static diff --git a/Dockerfile b/Dockerfile index 737143ca2..d550e535a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -57,6 +57,7 @@ COPY config config RUN mix do deps.get, deps.compile # Compile and build the release +COPY priv/.gitkeep priv/.gitkeep COPY rel rel COPY static static COPY iframe/priv/static/iframe iframe/priv/static/iframe diff --git a/assets/js/lib/utils.js b/assets/js/lib/utils.js index 7022d013c..116e4d322 100644 --- a/assets/js/lib/utils.js +++ b/assets/js/lib/utils.js @@ -226,7 +226,7 @@ export function setFavicon(name) { document.head.appendChild(link); } - link.href = `/${name}.svg`; + link.href = `/favicons/${name}.svg`; } export function findChildOrThrow(element, selector) { diff --git a/lib/livebook/config.ex b/lib/livebook/config.ex index 793e32dc2..9a8b9e97c 100644 --- a/lib/livebook/config.ex +++ b/lib/livebook/config.ex @@ -8,6 +8,18 @@ defmodule Livebook.Config do | %{mode: :token, secret: String.t()} | %{mode: :disabled} + @doc """ + Returns path to Livebook priv directory. + + This returns the usual priv directory, however in case of Escript, + the priv files are extracted into a temporary directory and that is + the path returned. + """ + @spec priv_path() :: String.t() + def priv_path() do + Application.get_env(:livebook, :priv_dir) || Application.app_dir(:livebook, "priv") + end + @doc """ Returns docker images to be used when generating sample Dockerfiles. """ diff --git a/lib/livebook_cli.ex b/lib/livebook_cli.ex index bada47b9b..28892320b 100644 --- a/lib/livebook_cli.ex +++ b/lib/livebook_cli.ex @@ -13,6 +13,9 @@ defmodule LivebookCLI do def main(args) do {:ok, _} = Application.ensure_all_started(:elixir) + + extract_priv!() + :ok = Application.load(:livebook) if unix?() do @@ -76,4 +79,51 @@ defmodule LivebookCLI do version = Livebook.Config.app_version() IO.puts("\nLivebook #{version}") end + + import Record + defrecord(:zip_file, extract(:zip_file, from_lib: "stdlib/include/zip.hrl")) + + defp extract_priv!() do + archive_dir = Path.join(Livebook.Config.tmp_path(), "escript") + extracted_path = Path.join(archive_dir, ".extracted") + in_archive_priv_path = ~c"livebook/priv" + + # In dev we want to extract fresh directory on every boot + if Livebook.Config.app_version() =~ "-dev" do + File.rm_rf!(archive_dir) + end + + # When temporary directory is cleaned by the OS, the directories + # may be left in place, so we use a regular file (.extracted) to + # check if the extracted archive is already available + if not File.exists?(extracted_path) do + {:ok, sections} = :escript.extract(:escript.script_name(), []) + archive = Keyword.fetch!(sections, :archive) + + file_filter = fn zip_file(name: name) -> + List.starts_with?(name, in_archive_priv_path) + end + + case :zip.extract(archive, cwd: String.to_charlist(archive_dir), file_filter: file_filter) do + {:ok, _} -> + :ok + + {:error, error} -> + print_error_and_exit( + "Livebook failed to extract archive files, reason: #{inspect(error)}" + ) + end + + File.touch!(extracted_path) + end + + priv_dir = Path.join(archive_dir, in_archive_priv_path) + Application.put_env(:livebook, :priv_dir, priv_dir, persistent: true) + end + + @spec print_error_and_exit(String.t()) :: no_return() + defp print_error_and_exit(message) do + IO.ANSI.format([:red, message]) |> IO.puts() + System.halt(1) + end end diff --git a/lib/livebook_web.ex b/lib/livebook_web.ex index 4d4fd4b09..f52afd574 100644 --- a/lib/livebook_web.ex +++ b/lib/livebook_web.ex @@ -1,5 +1,5 @@ defmodule LivebookWeb do - def static_paths, do: ~w(assets images favicon.svg favicon.png robots.txt) + def static_paths, do: ~w(assets images favicons robots.txt) def controller do quote do diff --git a/lib/livebook_web/components/layouts/root.html.heex b/lib/livebook_web/components/layouts/root.html.heex index fbd5fbb73..feca2b57e 100644 --- a/lib/livebook_web/components/layouts/root.html.heex +++ b/lib/livebook_web/components/layouts/root.html.heex @@ -5,8 +5,8 @@ - - + + <.live_title> <%= assigns[:page_title] || "Livebook" %> diff --git a/lib/livebook_web/controllers/error_html.ex b/lib/livebook_web/controllers/error_html.ex index 82146fd55..96454c688 100644 --- a/lib/livebook_web/controllers/error_html.ex +++ b/lib/livebook_web/controllers/error_html.ex @@ -41,8 +41,8 @@ defmodule LivebookWeb.ErrorHTML do - - + + <%= @status %> - Livebook diff --git a/lib/livebook_web/endpoint.ex b/lib/livebook_web/endpoint.ex index b3c2f53fd..fc0a90240 100644 --- a/lib/livebook_web/endpoint.ex +++ b/lib/livebook_web/endpoint.ex @@ -21,37 +21,49 @@ defmodule LivebookWeb.Endpoint do socket "/live", Phoenix.LiveView.Socket, websocket: @websocket_options socket "/socket", LivebookWeb.Socket, websocket: @websocket_options - # We use Escript for distributing Livebook, so we don't have access to the static - # files at runtime in the prod environment. To overcome this we load contents of - # those files at compilation time, so that they become a part of the executable - # and can be served from memory. - defmodule AssetsMemoryProvider do - use LivebookWeb.MemoryProvider, - from: Path.expand("../../static", __DIR__), - gzip: true - end - - defmodule AssetsFileSystemProvider do - use LivebookWeb.FileSystemProvider, - from: "tmp/static_dev" - end - - # Serve static files at "/" + # Serve static files at "/". + # + # In usual Phoenix applications, we serve static files from priv/static, + # however Livebook can also be run as escript, in which case it is + # packaged into a single file and priv/ is not accessible directly. + # In that case, we include priv/ in the escript archive by setting + # the :include_priv_for option. Then, on escript boot, we extract + # the priv files into a temporary directory. + # + # To account for both cases, we configure Plug.Static :from as MFA + # and return the accessible priv/ location in both scenarios. + # + # The priv/ static files are generated by the livebook.gen_priv task + # before building the escript or the release. We gzip the static + # files in priv/, since we want to serve them gzipped, and we don't + # include the non-gzipped ones to minimize app size. Note that we + # still have a separate static/ directory with the CI-precompiled + # assets, which we keep in Git so that people can install escript + # from GitHub or run MIX_ENV=prod phx.server, without Node and NPM. + # Storing minified assets is already not ideal, but we definitely + # want to avoid storing the gzipped variants in Git. That's why we + # store the assets uncompressed and then generate priv/static with + # their compressed variants as part of the build process. if code_reloading? do - # In development we use assets from tmp/static_dev (rebuilt dynamically on every change). - # Note that this directory doesn't contain predefined files (e.g. images), so we also - # use `AssetsMemoryProvider` to serve those from static/. - plug LivebookWeb.StaticPlug, + # In development, we use assets from tmp/static_dev, which are + # rebuilt on every change. We build to a different directory than + # priv/static, to make sure it can be built concurrently. + plug Plug.Static, at: "/", - file_provider: AssetsFileSystemProvider, - gzip: false + from: "tmp/static_dev", + gzip: false, + only: ["assets"] end - plug LivebookWeb.StaticPlug, + plug Plug.Static, at: "/", - file_provider: AssetsMemoryProvider, - gzip: true + from: {__MODULE__, :static_from, []}, + gzip: true, + only: LivebookWeb.static_paths() + + @doc false + def static_from(), do: Path.join(Livebook.Config.priv_path(), "static") plug :force_ssl diff --git a/lib/livebook_web/iframe_endpoint.ex b/lib/livebook_web/iframe_endpoint.ex index 727b35c9b..c822e141e 100644 --- a/lib/livebook_web/iframe_endpoint.ex +++ b/lib/livebook_web/iframe_endpoint.ex @@ -1,25 +1,20 @@ defmodule LivebookWeb.IframeEndpoint do use Plug.Builder - defmodule AssetsMemoryProvider do - use LivebookWeb.MemoryProvider, - from: Path.expand("../../iframe/priv/static/iframe", __DIR__), - gzip: true - end - - plug LivebookWeb.StaticPlug, + plug Plug.Static, at: "/iframe", - file_provider: AssetsMemoryProvider, - gzip: true, + from: {__MODULE__, :static_from, []}, + # Iframes are versioned, so we cache them for long + cache_control_for_etags: "public, max-age=31536000", headers: [ # Enable CORS to allow Livebook fetch the content and verify its integrity {"access-control-allow-origin", "*"}, - # Iframes are versioned, so we cache them for long - {"cache-control", "public, max-age=31536000"}, - # Specify the charset {"content-type", "text/html; charset=utf-8"} ] + @doc false + def static_from(), do: Path.join(Livebook.Config.priv_path(), "static_iframe") + plug :not_found defp not_found(conn, _) do diff --git a/lib/livebook_web/plugs/file_system_provider.ex b/lib/livebook_web/plugs/file_system_provider.ex deleted file mode 100644 index 2d6e097cd..000000000 --- a/lib/livebook_web/plugs/file_system_provider.ex +++ /dev/null @@ -1,36 +0,0 @@ -defmodule LivebookWeb.FileSystemProvider do - # Configurable implementation of `LivebookWeb.StaticPlug.Provider` behaviour, - # that loads files directly from the file system. - # - # ## `use` options - # - # * `:from` (**required**) - where to read the static files from. See `Plug.Static` for more details. - - defmacro __using__(opts) do - quote bind_quoted: [opts: opts] do - @behaviour LivebookWeb.StaticPlug.Provider - - from = Keyword.fetch!(opts, :from) - static_path = LivebookWeb.StaticPlug.Provider.static_path(from) - - @impl true - def get_file(segments, compression) do - LivebookWeb.FileSystemProvider.__get_file__(unquote(static_path), segments, compression) - end - end - end - - def __get_file__(static_path, segments, nil) do - abs_path = Path.join([static_path | segments]) - - if File.regular?(abs_path) do - content = File.read!(abs_path) - digest = content |> :erlang.md5() |> Base.encode16(case: :lower) - %LivebookWeb.StaticPlug.File{content: content, digest: digest} - else - nil - end - end - - def __get_file__(_static_path, _segments, _compression), do: nil -end diff --git a/lib/livebook_web/plugs/memory_provider.ex b/lib/livebook_web/plugs/memory_provider.ex deleted file mode 100644 index 4895d3144..000000000 --- a/lib/livebook_web/plugs/memory_provider.ex +++ /dev/null @@ -1,71 +0,0 @@ -defmodule LivebookWeb.MemoryProvider do - @gzippable_exts ~w(.js .css .txt .text .html .json .svg .eot .ttf) - - # Configurable implementation of `LivebookWeb.StaticPlug.Provider` behaviour, - # that bundles the files into the module compiled source. - # - # ## `use` options - # - # * `:from` (**required**) - where to read the static files from. See `Plug.Static` for more details. - # - # * `:gzip` - whether to bundle gzipped version of the files, - # in which case the uncompressed files are not included. Defaults to `false`. - - defmacro __using__(opts) do - quote bind_quoted: [opts: opts] do - @behaviour LivebookWeb.StaticPlug.Provider - - from = Keyword.fetch!(opts, :from) - static_path = LivebookWeb.StaticPlug.Provider.static_path(from) - paths = LivebookWeb.MemoryProvider.__paths__(static_path) - files = LivebookWeb.MemoryProvider.__preload_files__!(static_path, paths, opts) - - for path <- paths do - abs_path = Path.join(static_path, path) - @external_resource Path.relative_to_cwd(abs_path) - end - - @impl true - def get_file(segments, compression) - - for {segments, compression, file} <- files do - def get_file(unquote(segments), unquote(compression)), do: unquote(Macro.escape(file)) - end - - def get_file(_, _), do: nil - - # Force recompilation if the static files change. - def __mix_recompile__? do - current_paths = LivebookWeb.MemoryProvider.__paths__(unquote(static_path)) - :erlang.md5(current_paths) != unquote(:erlang.md5(paths)) - end - end - end - - def __preload_files__!(static_path, paths, opts) do - gzip? = Keyword.get(opts, :gzip, false) - - Enum.map(paths, fn path -> - segments = Path.split(path) - abs_path = Path.join(static_path, path) - content = File.read!(abs_path) - digest = content |> :erlang.md5() |> Base.encode16(case: :lower) - - if gzip? and Path.extname(path) in @gzippable_exts do - gzipped_content = :zlib.gzip(content) - - {segments, :gzip, %LivebookWeb.StaticPlug.File{content: gzipped_content, digest: digest}} - else - {segments, nil, %LivebookWeb.StaticPlug.File{content: content, digest: digest}} - end - end) - end - - def __paths__(static_path) do - Path.join(static_path, "**") - |> Path.wildcard() - |> Enum.reject(&File.dir?/1) - |> Enum.map(&String.replace_leading(&1, static_path <> "/", "")) - |> Enum.sort() - end -end diff --git a/lib/livebook_web/plugs/static_plug.ex b/lib/livebook_web/plugs/static_plug.ex deleted file mode 100644 index 14528b5a8..000000000 --- a/lib/livebook_web/plugs/static_plug.ex +++ /dev/null @@ -1,160 +0,0 @@ -defmodule LivebookWeb.StaticPlug.File do - defstruct [:content, :digest] - - @type t :: %__MODULE__{content: binary(), digest: String.t()} -end - -defmodule LivebookWeb.StaticPlug.Provider do - @type segments :: list(String.t()) - @type compression :: :gzip | nil - - @doc """ - Returns file data for the given path (given as list of segments) and compression type. - """ - @callback get_file(segments(), compression()) :: LivebookWeb.StaticPlug.File.t() | nil - - @doc """ - Parses static files location usually passed as the `:from` option - when configuring provider. - - See `Plug.Static` for more details. - """ - @spec static_path({atom(), binary()} | atom() | binary()) :: binary() - def static_path(from) - - def static_path({app, path}) when is_atom(app) and is_binary(path) do - Path.join(Application.app_dir(app), path) - end - - def static_path(path) when is_binary(path), do: path - def static_path(app) when is_atom(app), do: static_path({app, "priv/static"}) -end - -defmodule LivebookWeb.StaticPlug do - # This is a simplified version of `Plug.Static` meant - # to serve static files using the given provider. - # - # ## Options - # - # * `:file_provider` (**required**) - a module implementing `LivebookWeb.StaticPlug.Provider` - # behaviour, responsible for resolving file requests - # - # * `:at`, `:gzip`, `:headers` - same as `Plug.Static` - - @behaviour Plug - - import Plug.Conn - - @allowed_methods ~w(GET HEAD) - - @impl true - def init(opts) do - file_provider = Keyword.fetch!(opts, :file_provider) - - %{ - file_provider: file_provider, - at: opts |> Keyword.fetch!(:at) |> Plug.Router.Utils.split(), - gzip?: Keyword.get(opts, :gzip, false), - headers: Keyword.get(opts, :headers, []) - } - end - - @impl true - def call( - %Plug.Conn{method: method} = conn, - %{file_provider: file_provider, at: at, gzip?: gzip?} = options - ) - when method in @allowed_methods do - segments = subset(at, conn.path_info) - - case encoding_with_file(conn, file_provider, segments, gzip?) do - {encoding, file} -> - serve_static(conn, encoding, file, segments, options) - - :error -> - conn - end - end - - def call(conn, _options) do - conn - end - - defp serve_static(conn, content_encoding, file, segments, options) do - case put_cache_header(conn, file) do - {:stale, conn} -> - filename = List.last(segments) - content_type = MIME.from_path(filename) - - conn - |> put_resp_header("content-type", content_type) - |> maybe_add_encoding(content_encoding) - |> maybe_add_vary(options) - |> merge_resp_headers(options.headers) - |> send_resp(200, file.content) - |> halt() - - {:fresh, conn} -> - conn - |> maybe_add_vary(options) - |> send_resp(304, "") - |> halt() - end - end - - defp maybe_add_encoding(conn, nil), do: conn - defp maybe_add_encoding(conn, ce), do: put_resp_header(conn, "content-encoding", ce) - - # If we serve gzip at any moment, we need to set the proper vary - # header regardless of whether we are serving gzip content right now. - # See: http://www.fastly.com/blog/best-practices-for-using-the-vary-header/ - defp maybe_add_vary(conn, %{gzip?: true}) do - update_in(conn.resp_headers, &[{"vary", "Accept-Encoding"} | &1]) - end - - defp maybe_add_vary(conn, _options), do: conn - - defp put_cache_header(conn, file) do - etag = etag_for_file(file) - - conn = - conn - |> put_resp_header("cache-control", "public") - |> put_resp_header("etag", etag) - - if etag in get_req_header(conn, "if-none-match") do - {:fresh, conn} - else - {:stale, conn} - end - end - - defp etag_for_file(file) do - <> - end - - defp encoding_with_file(conn, file_provider, segments, gzip?) do - cond do - file = gzip? and accept_encoding?(conn, "gzip") && file_provider.get_file(segments, :gzip) -> - {"gzip", file} - - file = file_provider.get_file(segments, nil) -> - {nil, file} - - true -> - :error - end - end - - defp accept_encoding?(conn, encoding) do - encoding? = &String.contains?(&1, [encoding, "*"]) - - Enum.any?(get_req_header(conn, "accept-encoding"), fn accept -> - accept |> Plug.Conn.Utils.list() |> Enum.any?(encoding?) - end) - end - - defp subset([h | expected], [h | actual]), do: subset(expected, actual) - defp subset([], actual), do: actual - defp subset(_, _), do: [] -end diff --git a/lib/mix/tasks/livebook.gen_priv.ex b/lib/mix/tasks/livebook.gen_priv.ex new file mode 100644 index 000000000..5b995caff --- /dev/null +++ b/lib/mix/tasks/livebook.gen_priv.ex @@ -0,0 +1,37 @@ +defmodule Mix.Tasks.Livebook.GenPriv do + @moduledoc false + + # Note that we need to include priv/.gitkeep in Dockerfile and Hex + # package files, so that priv/ is symlinked within _build/, before + # we generate the actual files. + + use Mix.Task + + @gzippable_exts ~w(.js .css .txt .text .html .json .svg .eot .ttf) + + @impl true + def run([]) do + compress_and_copy("static", "priv/static") + compress_and_copy("iframe/priv/static/iframe", "priv/iframe_static") + end + + defp compress_and_copy(source_dir, target_dir) do + File.rm_rf!(target_dir) + + source_paths = Path.wildcard(Path.join(source_dir, "**/*")) + + for source_path <- source_paths, File.regular?(source_path) do + target_path = Path.join(target_dir, Path.relative_to(source_path, source_dir)) + File.mkdir_p!(Path.dirname(target_path)) + + if Path.extname(source_path) in @gzippable_exts do + content = source_path |> File.read!() |> :zlib.gzip() + File.write!(target_path <> ".gz", content) + else + File.cp!(source_path, target_path) + end + end + + Mix.shell().info("Generated #{target_dir} with compressed files from #{source_dir}") + end +end diff --git a/mix.exs b/mix.exs index 5e808fbc9..660765555 100644 --- a/mix.exs +++ b/mix.exs @@ -59,7 +59,7 @@ defmodule Livebook.MixProject do "GitHub" => "https://github.com/livebook-dev/livebook" }, files: - ~w(lib static config mix.exs mix.lock README.md LICENSE CHANGELOG.md iframe/priv/static/iframe proto/lib) + ~w(lib static priv/.gitkeep config mix.exs mix.lock README.md LICENSE CHANGELOG.md iframe/priv/static/iframe proto/lib) ] end @@ -68,7 +68,10 @@ defmodule Livebook.MixProject do setup: ["deps.get", "cmd --cd assets npm install"], "assets.deploy": ["cmd npm run deploy --prefix assets"], "format.all": ["format", "cmd --cd assets npm run format"], - "protobuf.generate": ["cmd --cd proto mix protobuf.generate"] + "protobuf.generate": ["cmd --cd proto mix protobuf.generate"], + "phx.server": ["livebook.gen_priv", "phx.server"], + "escript.build": ["livebook.gen_priv", "escript.build"], + release: ["livebook.gen_priv", "release"] ] end @@ -76,7 +79,8 @@ defmodule Livebook.MixProject do [ main_module: LivebookCLI, app: nil, - emu_args: "-epmd_module Elixir.Livebook.EPMD" + emu_args: "-epmd_module Elixir.Livebook.EPMD", + include_priv_for: [:livebook] ] end diff --git a/priv/.gitkeep b/priv/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/static/assets/app.js b/static/assets/app.js index 61dc75524..2df4a633a 100644 --- a/static/assets/app.js +++ b/static/assets/app.js @@ -85,7 +85,7 @@ removing illegal node: "${(r.outerHTML||r.nodeValue).trim()}" `,{label:"if",detail:"block",type:"keyword"}),mt("if ${}:\n ${}\nelse:\n ${}",{label:"if",detail:"/ else block",type:"keyword"}),mt("class ${name}:\n def __init__(self, ${params}):\n ${}",{label:"class",detail:"definition",type:"keyword"}),mt("import ${module}",{label:"import",detail:"statement",type:"keyword"}),mt("from ${module} import ${names}",{label:"from",detail:"import",type:"keyword"})],FK=Sl(WA,Ks(BK.concat(YK)));function NA(t){let{node:e,pos:i}=t,r=t.lineIndent(i,-1),n=null;for(;;){let o=e.childBefore(i);if(o)if(o.name=="Comment")i=o.from;else if(o.name=="Body")t.baseIndentFor(o)+t.unit<=r&&(n=o),e=o;else if(o.type.is("Statement"))e=o;else break;else break}return n}function MA(t,e){let i=t.baseIndentFor(e),r=t.lineAt(t.pos,-1),n=r.from+r.text.length;return/^\s*($|#)/.test(r.text)&&t.node.toi?null:i+t.unit}var Jv=qt.define({name:"python",parser:zA.configure({props:[jt.add({Body:t=>{var e;let i=NA(t);return(e=MA(t,i||t.node))!==null&&e!==void 0?e:t.continue()},IfStatement:t=>/^\s*(else:|elif )/.test(t.textAfter)?t.baseIndent:t.continue(),"ForStatement WhileStatement":t=>/^\s*else:/.test(t.textAfter)?t.baseIndent:t.continue(),TryStatement:t=>/^\s*(except |finally:|else:)/.test(t.textAfter)?t.baseIndent:t.continue(),"TupleExpression ComprehensionExpression ParamList ArgList ParenthesizedExpression":fi({closing:")"}),"DictionaryExpression DictionaryComprehensionExpression SetExpression SetComprehensionExpression":fi({closing:"}"}),"ArrayExpression ArrayComprehensionExpression":fi({closing:"]"}),"String FormatString":()=>null,Script:t=>{var e;let i=NA(t);return(e=i&&MA(t,i))!==null&&e!==void 0?e:t.continue()}}),zt.add({"ArrayExpression DictionaryExpression SetExpression TupleExpression":vr,Body:(t,e)=>({from:t.from+1,to:t.to-(t.to==e.doc.length?0:1)})})]}),languageData:{closeBrackets:{brackets:["(","[","{","'",'"',"'''",'"""'],stringPrefixes:["f","fr","rf","r","u","b","br","rb","F","FR","RF","R","U","B","BR","RB"]},commentTokens:{line:"#"},indentOnInput:/^\s*([\}\]\)]|else:|elif |except |finally:)$/}});function VA(){return new vt(Jv,[Jv.data.of({autocomplete:ZK}),Jv.data.of({autocomplete:FK})])}var $l=63,ZA=64,HK=1,GK=2,FA=3,KK=4,HA=5,JK=6,eJ=7,GA=65,tJ=66,iJ=8,rJ=9,nJ=10,oJ=11,sJ=12,KA=13,aJ=19,lJ=20,cJ=29,uJ=33,fJ=34,hJ=47,dJ=0,ow=1,tw=2,yf=3,iw=4,no=class{constructor(e,i,r){this.parent=e,this.depth=i,this.type=r,this.hash=(e?e.hash+e.hash<<8:0)+i+(i<<4)+r}};no.top=new no(null,-1,dJ);function bf(t,e){for(let i=0,r=e-t.pos-1;;r--,i++){let n=t.peek(r);if(oo(n)||n==-1)return i}}function rw(t){return t==32||t==9}function oo(t){return t==10||t==13}function JA(t){return rw(t)||oo(t)}function aa(t){return t<0||JA(t)}var OJ=new kr({start:no.top,reduce(t,e){return t.type==yf&&(e==lJ||e==fJ)?t.parent:t},shift(t,e,i,r){if(e==FA)return new no(t,bf(r,r.pos),ow);if(e==GA||e==HA)return new no(t,bf(r,r.pos),tw);if(e==$l)return t.parent;if(e==aJ||e==uJ)return new no(t,0,yf);if(e==KA&&t.type==iw)return t.parent;if(e==hJ){let n=/[1-9]/.exec(r.read(r.pos,i.pos));if(n)return new no(t,t.depth+ +n[0],iw)}return t},hash(t){return t.hash}});function Al(t,e,i=0){return t.peek(i)==e&&t.peek(i+1)==e&&t.peek(i+2)==e&&aa(t.peek(i+3))}var pJ=new Ue((t,e)=>{if(t.next==-1&&e.canShift(ZA))return t.acceptToken(ZA);let i=t.peek(-1);if((oo(i)||i<0)&&e.context.type!=yf){if(Al(t,45))if(e.canShift($l))t.acceptToken($l);else return t.acceptToken(HK,3);if(Al(t,46))if(e.canShift($l))t.acceptToken($l);else return t.acceptToken(GK,3);let r=0;for(;t.next==32;)r++,t.advance();(r{if(e.context.type==yf){t.next==63&&(t.advance(),aa(t.next)&&t.acceptToken(eJ));return}if(t.next==45)t.advance(),aa(t.next)&&t.acceptToken(e.context.type==ow&&e.context.depth==bf(t,t.pos-1)?KK:FA);else if(t.next==63)t.advance(),aa(t.next)&&t.acceptToken(e.context.type==tw&&e.context.depth==bf(t,t.pos-1)?JK:HA);else{let i=t.pos;for(;;)if(rw(t.next)){if(t.pos==i)return;t.advance()}else if(t.next==33)eX(t);else if(t.next==38)nw(t);else if(t.next==42){nw(t);break}else if(t.next==39||t.next==34){if(sw(t,!0))break;return}else if(t.next==91||t.next==123){if(!bJ(t))return;break}else{tX(t,!0,!1,0);break}for(;rw(t.next);)t.advance();if(t.next==58){if(t.pos==i&&e.canShift(cJ))return;let r=t.peek(1);aa(r)&&t.acceptTokenTo(e.context.type==tw&&e.context.depth==bf(t,i)?tJ:GA,i)}}},{contextual:!0});function gJ(t){return t>32&&t<127&&t!=34&&t!=37&&t!=44&&t!=60&&t!=62&&t!=92&&t!=94&&t!=96&&t!=123&&t!=124&&t!=125}function BA(t){return t>=48&&t<=57||t>=97&&t<=102||t>=65&&t<=70}function YA(t,e){return t.next==37?(t.advance(),BA(t.next)&&t.advance(),BA(t.next)&&t.advance(),!0):gJ(t.next)||e&&t.next==44?(t.advance(),!0):!1}function eX(t){if(t.advance(),t.next==60){for(t.advance();;)if(!YA(t,!0)){t.next==62&&t.advance();break}}else for(;YA(t,!1););}function nw(t){for(t.advance();!aa(t.next)&&zp(t.tag)!="f";)t.advance()}function sw(t,e){let i=t.next,r=!1,n=t.pos;for(t.advance();;){let o=t.next;if(o<0)break;if(t.advance(),o==i)if(o==39)if(t.next==39)t.advance();else break;else break;else if(o==92&&i==34)t.next>=0&&t.advance();else if(oo(o)){if(e)return!1;r=!0}else if(e&&t.pos>=n+1024)return!1}return!r}function bJ(t){for(let e=[],i=t.pos+1024;;)if(t.next==91||t.next==123)e.push(t.next),t.advance();else if(t.next==39||t.next==34){if(!sw(t,!0))return!1}else if(t.next==93||t.next==125){if(e[e.length-1]!=t.next-2)return!1;if(e.pop(),t.advance(),!e.length)return!0}else{if(t.next<0||t.pos>i||oo(t.next))return!1;t.advance()}}var yJ="iiisiiissisfissssssssssssisssiiissssssssssssssssssssssssssfsfssissssssssssssssssssssssssssfif";function zp(t){return t<33?"u":t>125?"s":yJ[t-33]}function ew(t,e){let i=zp(t);return i!="u"&&!(e&&i=="f")}function tX(t,e,i,r){if(zp(t.next)=="s"||(t.next==63||t.next==58||t.next==45)&&ew(t.peek(1),i))t.advance();else return!1;let n=t.pos;for(;;){let o=t.next,s=0,a=r+1;for(;JA(o);){if(oo(o)){if(e)return!1;a=0}else a++;o=t.peek(++s)}if(!(o>=0&&(o==58?ew(t.peek(s+1),i):o==35?t.peek(s-1)!=32:ew(o,i)))||!i&&a<=r||a==0&&!i&&(Al(t,45,s)||Al(t,46,s)))break;if(e&&zp(o)=="f")return!1;for(let c=s;c>=0;c--)t.advance();if(e&&t.pos>n+1024)return!1}return!0}var xJ=new Ue((t,e)=>{if(t.next==33)eX(t),t.acceptToken(sJ);else if(t.next==38||t.next==42){let i=t.next==38?nJ:oJ;nw(t),t.acceptToken(i)}else t.next==39||t.next==34?(sw(t,!1),t.acceptToken(rJ)):tX(t,!1,e.context.type==yf,e.context.depth)&&t.acceptToken(iJ)}),vJ=new Ue((t,e)=>{let i=e.context.type==iw?e.context.depth:-1,r=t.pos;e:for(;;){let n=0,o=t.next;for(;o==32;)o=t.peek(++n);if(!n&&(Al(t,45,n)||Al(t,46,n))||!oo(o)&&(i<0&&(i=Math.max(e.context.depth+1,n)),nYAN>Y",stateData:";S~O!fOS!gOS^OS~OP_OQbORSOTUOWROXROYYOZZO[XOcPOqQO!PVO!V[O!cTO~O`cO~P]OVkOWROXROYeOZfO[dOcPOmhOqQO~OboO~P!bOVtOWROXROYeOZfO[dOcPOmrOqQO~OpwO~P#WORSOTUOWROXROYYOZZO[XOcPOqQO!PVO!cTO~OSvP!avP!bvP~P#|OWROXROYeOZfO[dOcPOqQO~OmzO~P%OOm!OOUzP!azP!bzP!dzP~P#|O^!SO!b!QO!f!TO!g!RO~ORSOTUOWROXROcPOqQO!PVO!cTO~OY!UOP!QXQ!QX!V!QX!`!QXS!QX!a!QX!b!QXU!QXm!QX!d!QX~P&aO[!WOP!SXQ!SX!V!SX!`!SXS!SX!a!SX!b!SXU!SXm!SX!d!SX~P&aO^!ZO!W![O!b!YO!f!]O!g!YO~OP!_O!V[OQaX!`aX~OPaXQaX!VaX!`aX~P#|OP!bOQ!cO!V[O~OP_O!V[O~P#|OWROXROY!fOcPOqQObfXmfXofXpfX~OWROXRO[!hOcPOqQObhXmhXohXphX~ObeXmlXoeX~ObkXokX~P%OOm!kO~Om!lObnPonP~P%OOb!pOo!oO~Ob!pO~P!bOm!sOosXpsX~OosXpsX~P%OOm!uOotPptP~P%OOo!xOp!yO~Op!yO~P#WOS!|O!a#OO!b#OO~OUyX!ayX!byX!dyX~P#|Om#QO~OU#SO!a#UO!b#UO!d#RO~Om#WOUzX!azX!bzX!dzX~O]#XO~O!b#XO!g#YO~O^#ZO!b#XO!g#YO~OP!RXQ!RX!V!RX!`!RXS!RX!a!RX!b!RXU!RXm!RX!d!RX~P&aOP!TXQ!TX!V!TX!`!TXS!TX!a!TX!b!TXU!TXm!TX!d!TX~P&aO!b#^O!g#^O~O^#_O!b#^O!f#`O!g#^O~O^#_O!W#aO!b#^O!g#^O~OPaaQaa!Vaa!`aa~P#|OP#cO!V[OQ!XX!`!XX~OP!XXQ!XX!V!XX!`!XX~P#|OP_O!V[OQ!_X!`!_X~P#|OWROXROcPOqQObgXmgXogXpgX~OWROXROcPOqQObiXmiXoiXpiX~Obkaoka~P%OObnXonX~P%OOm#kO~Ob#lOo!oO~Oosapsa~P%OOotXptX~P%OOm#pO~Oo!xOp#qO~OSwP!awP!bwP~P#|OS!|O!a#vO!b#vO~OUya!aya!bya!dya~P#|Om#xO~P%OOm#{OU}P!a}P!b}P!d}P~P#|OU#SO!a$OO!b$OO!d#RO~O]$QO~O!b$QO!g$RO~O!b$SO!g$SO~O^$TO!b$SO!g$SO~O^$TO!b$SO!f$UO!g$SO~OP!XaQ!Xa!V!Xa!`!Xa~P#|Obnaona~P%OOotapta~P%OOo!xO~OU|X!a|X!b|X!d|X~P#|Om$ZO~Om$]OU}X!a}X!b}X!d}X~O]$^O~O!b$_O!g$_O~O^$`O!b$_O!g$_O~OU|a!a|a!b|a!d|a~P#|O!b$cO!g$cO~O",goto:",]!mPPPPPPPPPPPPPPPPP!nPP!v#v#|$`#|$c$f$j$nP%VPPP!v%Y%^%a%{&O%a&R&U&X&_&b%aP&e&{&e'O'RPP']'a'g'm's'y(XPPPPPPPP(_)e*X+c,VUaObcR#e!c!{ROPQSTUXY_bcdehknrtvz!O!U!W!_!b!c!f!h!k!l!s!u!|#Q#R#S#W#c#k#p#x#{$Z$]QmPR!qnqfPQThknrtv!k!l!s!u#R#k#pR!gdR!ieTlPnTjPnSiPnSqQvQ{TQ!mkQ!trQ!vtR#y#RR!nkTsQvR!wt!RWOSUXY_bcz!O!U!W!_!b!c!|#Q#S#W#c#x#{$Z$]RySR#t!|R|TR|UQ!PUR#|#SR#z#RR#z#SyZOSU_bcz!O!_!b!c!|#Q#S#W#c#x#{$Z$]R!VXR!XYa]O^abc!a!c!eT!da!eQnPR!rnQvQR!{vQ!}yR#u!}Q#T|R#}#TW^Obc!cS!^^!aT!aa!eQ!eaR#f!eW`Obc!cQxSS}U#SQ!`_Q#PzQ#V!OQ#b!_Q#d!bQ#s!|Q#w#QQ$P#WQ$V#cQ$Y#xQ$[#{Q$a$ZR$b$]xZOSU_bcz!O!_!b!c!|#Q#S#W#c#x#{$Z$]Q!VXQ!XYQ#[!UR#]!W!QWOSUXY_bcz!O!U!W!_!b!c!|#Q#S#W#c#x#{$Z$]pfPQThknrtv!k!l!s!u#R#k#pQ!gdQ!ieQ#g!fR#h!hSgPn^pQTkrtv#RQ!jhQ#i!kQ#j!lQ#n!sQ#o!uQ$W#kR$X#pQuQR!zv",nodeNames:"\u26A0 DirectiveEnd DocEnd - - ? ? ? Literal QuotedLiteral Anchor Alias Tag BlockLiteralContent Comment Stream BOM Document ] [ FlowSequence Item Tagged Anchored Anchored Tagged FlowMapping Pair Key : Pair , } { FlowMapping Pair Pair BlockSequence Item Item BlockMapping Pair Pair Key Pair Pair BlockLiteral BlockLiteralHeader Tagged Anchored Anchored Tagged Directive DirectiveName DirectiveContent Document",maxTerm:74,context:OJ,nodeProps:[["isolate",-3,8,9,14,""],["openedBy",18,"[",32,"{"],["closedBy",19,"]",33,"}"]],propSources:[wJ],skippedNodes:[0],repeatNodeCount:6,tokenData:"-Y~RnOX#PXY$QYZ$]Z]#P]^$]^p#Ppq$Qqs#Pst$btu#Puv$yv|#P|}&e}![#P![!]'O!]!`#P!`!a'i!a!}#P!}#O*g#O#P#P#P#Q+Q#Q#o#P#o#p+k#p#q'i#q#r,U#r;'S#P;'S;=`#z<%l?HT#P?HT?HU,o?HUO#PQ#UU!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PQ#kTOY#PZs#Pt;'S#P;'S;=`#z<%lO#PQ#}P;=`<%l#P~$VQ!f~XY$Qpq$Q~$bO!g~~$gS^~OY$bZ;'S$b;'S;=`$s<%lO$b~$vP;=`<%l$bR%OX!WQOX%kXY#PZ]%k]^#P^p%kpq#hq;'S%k;'S;=`&_<%lO%kR%rX!WQ!VPOX%kXY#PZ]%k]^#P^p%kpq#hq;'S%k;'S;=`&_<%lO%kR&bP;=`<%l%kR&lUoP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR'VUmP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR'p[!PP!WQOY#PZp#Ppq#hq{#P{|(f|}#P}!O(f!O!R#P!R![)p![;'S#P;'S;=`#z<%lO#PR(mW!PP!WQOY#PZp#Ppq#hq!R#P!R![)V![;'S#P;'S;=`#z<%lO#PR)^U!PP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR)wY!PP!WQOY#PZp#Ppq#hq{#P{|)V|}#P}!O)V!O;'S#P;'S;=`#z<%lO#PR*nUcP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR+XUbP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR+rUqP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR,]UpP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR,vU`P!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#P",tokenizers:[pJ,mJ,xJ,vJ,0,1],topRules:{Stream:[0,15]},tokenPrec:0});var kJ=Dt.deserialize({version:14,states:"!vOQOPOOO]OPO'#C_OhOPO'#C^OOOO'#Cc'#CcOpOPO'#CaQOOOOOO{OPOOOOOO'#Cb'#CbO!WOPO'#C`O!`OPO,58xOOOO-E6a-E6aOOOO-E6`-E6`OOOO'#C_'#C_OOOO1G.d1G.d",stateData:"!h~OXPOYROWTP~OWVXXRXYRX~OYVOXSP~OXROYROWTX~OXROYROWTP~OYVOXSX~OX[O~OXY~",goto:"vWPPX[beioRUOQQOR]XRXQTTOUQWQRZWSSOURYS",nodeNames:"\u26A0 Document Frontmatter DashLine FrontmatterContent Body",maxTerm:10,skippedNodes:[0],repeatNodeCount:2,tokenData:"$z~RXOYnYZ!^Z]n]^!^^}n}!O!i!O;'Sn;'S;=`!c<%lOn~qXOYnYZ!^Z]n]^!^^;'Sn;'S;=`!c<%l~n~On~~!^~!cOY~~!fP;=`<%ln~!lZOYnYZ!^Z]n]^!^^}n}!O#_!O;'Sn;'S;=`!c<%l~n~On~~!^~#bZOYnYZ!^Z]n]^!^^}n}!O$T!O;'Sn;'S;=`!c<%l~n~On~~!^~$WXOYnYZ$sZ]n]^$s^;'Sn;'S;=`!c<%l~n~On~~$s~$zOX~Y~",tokenizers:[0],topRules:{Document:[0,1]},tokenPrec:67}),SJ=qt.define({name:"yaml",parser:iX.configure({props:[jt.add({Stream:t=>{for(let e=t.node.resolve(t.pos,-1);e&&e.to>=t.pos;e=e.parent){if(e.name=="BlockLiteralContent"&&e.fromt.pos)return null}}return null},FlowMapping:fi({closing:"}"}),FlowSequence:fi({closing:"]"})}),zt.add({"FlowMapping FlowSequence":vr,"BlockSequence Pair BlockLiteral":(t,e)=>({from:e.doc.lineAt(t.from).to,to:t.to})})]}),languageData:{commentTokens:{line:"#"},indentOnInput:/^\s*[\]\}]$/}});function rX(){return new vt(SJ)}var g2e=qt.define({name:"yaml-frontmatter",parser:kJ.configure({props:[St({DashLine:E.meta})]})});var TJ=["-type","-spec","-export_type","-opaque"],EJ=["after","begin","catch","case","cond","end","fun","if","let","of","query","receive","try","when"],PJ=/[\->,;]/,CJ=["->",";",","],QJ=["and","andalso","band","bnot","bor","bsl","bsr","bxor","div","not","or","orelse","rem","xor"],_J=/[\+\-\*\/<>=\|:!]/,$J=["=","+","-","*","/",">",">=","<","=<","=:=","==","=/=","/=","||","<-","!"],AJ=/[<\(\[\{]/,lw=["<<","(","[","{"],XJ=/[>\)\]\}]/,lX=["}","]",")",">>"],RJ=["is_atom","is_binary","is_bitstring","is_boolean","is_float","is_function","is_integer","is_list","is_number","is_pid","is_port","is_record","is_reference","is_tuple","atom","binary","bitstring","boolean","function","integer","list","number","pid","port","record","reference","tuple"],LJ=["abs","adler32","adler32_combine","alive","apply","atom_to_binary","atom_to_list","binary_to_atom","binary_to_existing_atom","binary_to_list","binary_to_term","bit_size","bitstring_to_list","byte_size","check_process_code","contact_binary","crc32","crc32_combine","date","decode_packet","delete_module","disconnect_node","element","erase","exit","float","float_to_list","garbage_collect","get","get_keys","group_leader","halt","hd","integer_to_list","internal_bif","iolist_size","iolist_to_binary","is_alive","is_atom","is_binary","is_bitstring","is_boolean","is_float","is_function","is_integer","is_list","is_number","is_pid","is_port","is_process_alive","is_record","is_reference","is_tuple","length","link","list_to_atom","list_to_binary","list_to_bitstring","list_to_existing_atom","list_to_float","list_to_integer","list_to_pid","list_to_tuple","load_module","make_ref","module_loaded","monitor_node","node","node_link","node_unlink","nodes","notalive","now","open_port","pid_to_list","port_close","port_command","port_connect","port_control","pre_loaded","process_flag","process_info","processes","purge_module","put","register","registered","round","self","setelement","size","spawn","spawn_link","spawn_monitor","spawn_opt","split_binary","statistics","term_to_binary","time","throw","tl","trunc","tuple_size","tuple_to_list","unlink","unregister","whereis"],Dp=/[\w@Ø-ÞÀ-Öß-öø-ÿ]/,IJ=/[0-7]{1,3}|[bdefnrstv\\"']|\^[a-zA-Z]|x[0-9a-zA-Z]{2}|x{[0-9a-zA-Z]+}/;function zJ(t,e){if(e.in_string)return e.in_string=!sX(t),it(e,t,"string");if(e.in_atom)return e.in_atom=!aX(t),it(e,t,"atom");if(t.eatSpace())return it(e,t,"whitespace");if(!xf(e)&&t.match(/-\s*[a-zß-öø-ÿ][\wØ-ÞÀ-Öß-öø-ÿ]*/))return ki(t.current(),TJ)?it(e,t,"type"):it(e,t,"attribute");var i=t.next();if(i=="%")return t.skipToEnd(),it(e,t,"comment");if(i==":")return it(e,t,"colon");if(i=="?")return t.eatSpace(),t.eatWhile(Dp),it(e,t,"macro");if(i=="#")return t.eatSpace(),t.eatWhile(Dp),it(e,t,"record");if(i=="$")return t.next()=="\\"&&!t.match(IJ)?it(e,t,"error"):it(e,t,"number");if(i==".")return it(e,t,"dot");if(i=="'"){if(!(e.in_atom=!aX(t))){if(t.match(/\s*\/\s*[0-9]/,!1))return t.match(/\s*\/\s*[0-9]/,!0),it(e,t,"fun");if(t.match(/\s*\(/,!1)||t.match(/\s*:/,!1))return it(e,t,"function")}return it(e,t,"atom")}if(i=='"')return e.in_string=!sX(t),it(e,t,"string");if(/[A-Z_Ø-ÞÀ-Ö]/.test(i))return t.eatWhile(Dp),it(e,t,"variable");if(/[a-z_ß-öø-ÿ]/.test(i)){if(t.eatWhile(Dp),t.match(/\s*\/\s*[0-9]/,!1))return t.match(/\s*\/\s*[0-9]/,!0),it(e,t,"fun");var r=t.current();return ki(r,EJ)?it(e,t,"keyword"):ki(r,QJ)?it(e,t,"operator"):t.match(/\s*\(/,!1)?ki(r,LJ)&&(xf(e).token!=":"||xf(e,2).token=="erlang")?it(e,t,"builtin"):ki(r,RJ)?it(e,t,"guard"):it(e,t,"function"):DJ(t)==":"?r=="erlang"?it(e,t,"builtin"):it(e,t,"function"):ki(r,["true","false"])?it(e,t,"boolean"):it(e,t,"atom")}var n=/[0-9]/,o=/[0-9a-zA-Z]/;return n.test(i)?(t.eatWhile(n),t.eat("#")?t.eatWhile(o)||t.backUp(1):t.eat(".")&&(t.eatWhile(n)?t.eat(/[eE]/)&&(t.eat(/[-+]/)?t.eatWhile(n)||t.backUp(2):t.eatWhile(n)||t.backUp(1)):t.backUp(1)),it(e,t,"number")):nX(t,AJ,lw)?it(e,t,"open_paren"):nX(t,XJ,lX)?it(e,t,"close_paren"):oX(t,PJ,CJ)?it(e,t,"separator"):oX(t,_J,$J)?it(e,t,"operator"):it(e,t,null)}function nX(t,e,i){if(t.current().length==1&&e.test(t.current())){for(t.backUp(1);e.test(t.peek());)if(t.next(),ki(t.current(),i))return!0;t.backUp(t.current().length-1)}return!1}function oX(t,e,i){if(t.current().length==1&&e.test(t.current())){for(;e.test(t.peek());)t.next();for(;01&&t[e].type==="fun"&&t[e-1].token==="fun")return t.slice(0,e-1);switch(t[e].token){case"}":return Wr(t,{g:["{"]});case"]":return Wr(t,{i:["["]});case")":return Wr(t,{i:["("]});case">>":return Wr(t,{i:["<<"]});case"end":return Wr(t,{i:["begin","case","fun","if","receive","try"]});case",":return Wr(t,{e:["begin","try","when","->",",","(","[","{","<<"]});case"->":return Wr(t,{r:["when"],m:["try","if","case","receive"]});case";":return Wr(t,{E:["case","fun","if","receive","try","when"]});case"catch":return Wr(t,{e:["try"]});case"of":return Wr(t,{e:["case"]});case"after":return Wr(t,{e:["receive","try"]});default:return t}}function Wr(t,e){for(var i in e)for(var r=t.length-1,n=e[i],o=r-1;-1"?ki(s.token,["receive","case","if","try"])?s.column+i.unit+i.unit:s.column+i.unit:ki(o.token,lw)?o.column+o.token.length:(r=BJ(t),la(r)?r.column+i.unit:0):0}function VJ(t){var e=t.match(/,|[a-z]+|\}|\]|\)|>>|\|+|\(/);return la(e)&&e.index===0?e[0]:""}function ZJ(t){var e=t.tokenStack.slice(0,-1),i=Up(e,"type",["open_paren"]);return la(e[i])?e[i]:!1}function BJ(t){var e=t.tokenStack,i=Up(e,"type",["open_paren","separator","keyword"]),r=Up(e,"type",["operator"]);return la(i)&&la(r)&&i2&&s.token&&typeof s.token!="string"){i.pending=[];for(var c=2;c-1)return null;var n=i.indent.length-1,o=t[i.state];e:for(;;){for(var s=0;s{let i=Bee.find(r=>e.canShift(r.token));Fee(t,i)&&t.acceptToken(i.token)});function Fee(t,e){let i=e.delimiterLength===3;for(let r=!1;;r=!0){let n=!1;if(DX(t.next))for(t.advance(),r=!0,n=!0;nr(t.next);)t.advance();if(t.next===e.endDelimiter){let o=1;for(;o{let i=0;for(;RX<=t.next&&t.next<=Zee||Iee<=t.next&&t.next<=zee||QX<=t.next&&t.next<=_X;)t.advance(),i++;i>0&&t.acceptToken($ee)}),Gee=new Ue((t,e)=>{nr(t.peek(-1))||(e.canShift(kX)&&t.next===CX?(t.advance(),t.acceptToken(kX)):e.canShift(SX)&&t.next===XX?(t.advance(),t.acceptToken(SX)):e.canShift(TX)&&t.next===so&&(t.advance(),nr(t.next)&&t.acceptToken(TX)))}),Kee=new Ue((t,e)=>{if(Sf(t.next)){for(t.advance();Sf(t.next);)t.advance();if(t.next===Rl){let i=t.peek(1);i!==Rl&&i!==so&&i!==yn&&!nr(i)&&t.acceptToken(yX)}else if(t.next===ns){let i=t.peek(1);i!==ns&&i!==Li&&i!==so&&i!==yn&&!nr(i)&&t.acceptToken(yX)}}}),IX=/[\p{ID_Start}_]/u,zX=/[\p{ID_Continue}@]/u,Jee=new Ue((t,e)=>{if(t.next===so){t.advance();let[i,r]=Ll(t);if(IX.test(i)){do t.advance(r),[i,r]=Ll(t);while(zX.test(i));(t.next===bw||t.next===Vp)&&t.advance(),t.acceptToken(cee)}}}),ete=new Ue((t,e)=>{let[i,r]=Ll(t);if(IX.test(i)){do t.advance(r),[i,r]=Ll(t);while(zX.test(i));(t.next===bw||t.next===Vp)&&t.advance(),t.next===so&&(t.advance(),nr(t.next)&&t.acceptToken(uee))}}),tte=/[_\p{Ll}\p{Lm}\p{Lo}\p{Nl}\u1885\u1886\u2118\u212E\u309B\u309C]/u,ite=/[\p{ID_Continue}]/u,rte=new Ue((t,e)=>{let[i,r]=Ll(t),o=i==="_"?Xee:Aee;if(tte.test(i)){do t.advance(r),[i,r]=Ll(t);while(ite.test(i));(t.next===bw||t.next===Vp)&&t.advance(),t.acceptToken(o)}else t.next===fa&&(t.advance(),t.next===fa&&(t.advance(),t.next===fa&&(t.advance(),rs(t.next)&&t.acceptToken(o))))}),nte=new Ue((t,e)=>{if(t.next===ca&&(t.advance(),t.next===os&&(t.advance(),t.next===yw))){for(t.advance();Sf(t.next);)t.advance();t.next===Ow&&(t.advance(),t.next===ca&&(t.advance(),rs(t.next)&&t.acceptToken(see)))}}),ote=new Ue((t,e)=>{t.next===yn&&(t.advance(),t.next===yn&&(t.advance(),t.acceptToken(aee)))}),ste=new Ue((t,e)=>{t.next===AX&&(t.advance(),(t.next===Xl&&t.peek(1)===os&&t.peek(2)===cw&&nr(t.peek(3))||t.next===Nee&&t.peek(1)===os&&t.peek(2)===Xl&&t.peek(3)===jee&&t.peek(4)===Uee&&t.peek(5)===dw&&t.peek(6)===Xl&&t.peek(7)===os&&t.peek(8)===cw&&nr(t.peek(9))||t.next===yw&&t.peek(1)===Vee&&t.peek(2)===Mee&&t.peek(3)===dw&&t.peek(4)===Xl&&t.peek(5)===os&&t.peek(6)===cw&&nr(t.peek(7)))&&t.acceptToken(lee))}),ate=new Ue((t,e)=>{if(t.next===mw&&t.advance(),t.next===Wp){t.advance();let i=0,r=!1;for(;nr(t.peek(i));)r=r||DX(t.peek(i)),i++;if(e.canShift(wX)&&t.peek(i)===Xl&&t.peek(i+1)===os&&rs(t.peek(i+2))){t.acceptToken(wX);return}if(e.canShift(vX)&<e(t,i)){t.acceptToken(vX);return}e.canShift(xX)&&t.peek(i)!==$X&&t.peek(i)!==gw&&!r&&t.acceptToken(xX)}});function lte(t,e=0){if(t.peek(e)===Np){if(e++,t.peek(e)===Np)return e++,t.peek(e)===Np,Ne(t,e)}else{if(t.peek(e)===is)return t.peek(e)===is?(e++,t.peek(e)===is&&e++,Ne(t,e)):t.peek(e)===kf?(e++,Ne(t,e)):(t.peek(1)===Li&&e++,Ne(t,e));if(t.peek(e)===so){if(e++,t.peek(e)===so)return e++,t.peek(e)===so?!1:Ne(t,e)}else if(t.peek(e)===Rl){if(e++,t.peek(e)===Rl)return e++,t.peek(e)===Rl&&e++,Ne(t,e)}else if(t.peek(e)===ns){if(e++,t.peek(e)===ns)return e++,t.peek(e)===ns&&e++,Ne(t,e);if(t.peek(e)===Li)return e++,Ne(t,e)}else if(t.peek(e)===Mp){if(e++,t.peek(e)===is||t.peek(e)===ns||t.peek(e)===Li)return e++,Ne(t,e);if(t.peek(e)===kf)return e++,t.peek(e)===Li&&e++,Ne(t,e);if(t.peek(e)===ua){if(e++,t.peek(e)===Li)return e++,Ne(t,e)}else if(t.peek(e)===Mp){if(e++,t.peek(e)===Mp||t.peek(e)===kf)return e++,Ne(t,e)}else return Ne(t,e)}else if(t.peek(e)===Li){if(e++,t.peek(e)===is)return e++,Ne(t,e);if(t.peek(e)===Li){if(e++,t.peek(e)===Li)return e++,Ne(t,e)}else return Ne(t,e)}else if(t.peek(e)===qp){if(e++,t.peek(e)===qp&&(e++,t.peek(e)===qp))return e++,Ne(t,e)}else if(t.peek(e)===Vp){if(e++,t.peek(e)===is)return e++,t.peek(e)===is&&e++,Ne(t,e)}else if(t.peek(e)===kf){if(e++,t.peek(e)===Li)return e++,t.peek(e)===Li&&e++,Ne(t,e)}else{if(t.peek(e)===ua)return e++,t.peek(e)===ua?(e++,t.peek(e)===ua&&e++,Ne(t,e)):(t.peek(e)===Li&&e++,Ne(t,e));if(t.peek(e)===fw)return e++,t.peek(e)===fw&&e++,Ne(t,e);if(t.peek(e)===yn)return e++,t.peek(e)===yn&&e++,Ne(t,e);if(t.peek(e)===fa)return e++,t.peek(e)===fa?(e++,t.peek(e)===fa?!1:Ne(t,e)):Ne(t,e);if(t.peek(e)===jp){if(e++,t.peek(e)===jp)return e++,Ne(t,e)}else if(t.peek(e)===Wee){if(e++,t.peek(e)===Dee&&(e++,t.peek(e)===dw&&(e++,t.peek(e)===ca)))return e++,rs(t.peek(e))&&Ne(t,e)}else if(t.peek(e)===RX){if(e++,t.peek(e)===ca&&(e++,t.peek(e)===Xl))return e++,rs(t.peek(e))&&Ne(t,e)}else if(t.peek(e)===os){if(e++,t.peek(e)===qee)return e++,rs(t.peek(e))&&Ne(t,e)}else if(t.peek(e)===Ow){if(e++,t.peek(e)===ca)return e++,rs(t.peek(e))&&Ne(t,e)}else if(t.peek(e)===ca&&(e++,t.peek(e)===os&&(e++,t.peek(e)===yw))){for(e++;Sf(t.peek(e));)e++;if(t.peek(e)===Ow&&(e++,t.peek(e)===ca))return e++,rs(t.peek(e))&&Ne(t,e)}}}}function Ne(t,e){if(t.peek(e)===so)return!nr(t.peek(e+1));for(;Sf(t.peek(e));)e++;if(t.peek(e)===yn){for(e++;nr(t.peek(e));)e++;if(cte(t.peek(e)))return!1}return!0}function Sf(t){return t===PX||t===EX}function nr(t){return t===PX||t===EX||t===Wp||t===mw}function DX(t){return t===Wp||t===mw}function cte(t){return QX<=t&&t<=_X}var ute=new Set([AX,fa,Rl,ns,qp,ns,fw,yn,Mp,Li,ua,kf,is,Np,jp,Ree,LX,pw,XX,hw,CX,uw,vf,wf,Lee,$X,gw]);function rs(t){return ute.has(t)?!0:nr(t)||t===-1}function Ll(t){let e=t.next;if(55296<=e&&e<=56319){let i=t.peek(1);if(56320<=i&&i<=57343)return[String.fromCharCode(e,i),2]}return[String.fromCharCode(e),1]}var fte=St({"Atom QuotedAtom QuotedAtom/QuotedContent Keyword QuotedKeyword QuotedKeyword/QuotedContent":E.atom,Alias:E.namespace,Boolean:E.bool,Nil:E.null,Integer:E.integer,Float:E.float,Char:E.character,Identifier:E.variableName,Comment:E.lineComment,SpecialIdentifier:E.special(E.variableName),UnderscoredIdentifier:E.comment,"String String/QuotedContent":E.string,"Charlist Charlist/QuotedContent":E.string,"StringSigil StringSigil/SigilName StringSigil/SigilModifiers StringSigil/QuotedContent StringSigil/{ StringSigil/} StringSigil/[ StringSigil/] StringSigil/( StringSigil/)":E.string,"Sigil Sigil/SigilName Sigil/SigilModifiers Sigil/QuotedContent Sigil/{ Sigil/} Sigil/[ Sigil/] Sigil/( Sigil/)":E.special(E.string),EscapeSequence:E.escape,"Interpolation/#{ Interpolation/}":E.special(E.brace),"( )":E.paren,"[ ]":E.squareBracket,"% { }":E.brace,", ;":E.separator,"<< >>":E.angleBracket,"fn do end catch rescue after else":E.keyword,Operator:E.operator,WordOperator:E.keyword,"CaptureOperand/Integer":E.operator,"AtOperator/Operator AtOperator/Identifier AtOperator/Boolean AtOperator/Nil AtOperator/Call/Identifier":E.attributeName,"DocAtOperator/Operator DocAtOperator/Identifier DocAtOperator/Call/Identifier DocAtOperator/Call/Arguments/Boolean DocAtOperator/Call/Arguments/String DocAtOperator/Call/Arguments/String/QuotedContent DocAtOperator/Call/Arguments/Charlist DocAtOperator/Call/Arguments/Charlist/QuotedContent DocAtOperator/Call/Arguments/StringSigil DocAtOperator/Call/Arguments/StringSigil/QuotedContent DocAtOperator/Call/Arguments/StringSigil/SigilName DocAtOperator/Call/Arguments/StringSigil/SigilModifiers DocAtOperator/Call/Arguments/StringSigil/{ DocAtOperator/Call/Arguments/StringSigil/} DocAtOperator/Call/Arguments/StringSigil/[ DocAtOperator/Call/Arguments/StringSigil/] DocAtOperator/Call/Arguments/StringSigil/( DocAtOperator/Call/Arguments/StringSigil/)":E.docString,"Call/Identifier Call/UnderscoredIdentifier":E.function(E.variableName),"Call/Dot/Right/Identifier Call/Dot/Right/SpecialIdentifier Call/Dot/Right/UnderscoredIdentifier":E.function(E.variableName),"Call/Dot/Atom":E.namespace,"PipeOperator/Right/Identifier":E.function(E.variableName),"FunctionDefinitionCall/Identifier":E.keyword,"FunctionDefinitionCall/Arguments/Identifier FunctionDefinitionCall/Arguments/UnderscoredIdentifier FunctionDefinitionCall/Arguments/SpecialIdentifier":E.definition(E.function(E.variableName)),"FunctionDefinitionCall/Arguments/Call/Identifier FunctionDefinitionCall/Arguments/Call/UnderscoredIdentifier FunctionDefinitionCall/Arguments/Call/SpecialIdentifier":E.definition(E.function(E.variableName)),"FunctionDefinitionCall/Arguments/WhenOperator/Identifier FunctionDefinitionCall/Arguments/WhenOperator/UnderscoredIdentifier FunctionDefinitionCall/Arguments/WhenOperator/SpecialIdentifier":E.definition(E.function(E.variableName)),"FunctionDefinitionCall/Arguments/WhenOperator/Call/Identifier FunctionDefinitionCall/Arguments/WhenOperator/Call/UnderscoredIdentifier FunctionDefinitionCall/Arguments/WhenOperator/Call/SpecialIdentifier":E.definition(E.function(E.variableName)),"FunctionDefinitionCall/Arguments/PipeOperator/Right/Identifier":E.variableName,"KernelCall/Identifier":E.keyword}),hte={__proto__:null,when:432,def:446,defdelegate:448,defguard:450,defguardp:452,defmacro:454,defmacrop:456,defn:458,defnp:460,defp:462,defexception:464,defimpl:466,defmodule:468,defoverridable:470,defprotocol:472,defstruct:474,alias:476,case:478,cond:480,for:482,if:484,import:486,quote:488,raise:490,receive:492,require:494,reraise:496,super:498,throw:500,try:502,unless:504,unquote:506,unquote_splicing:508,use:510,with:512,true:514,false:516,nil:518,not:588,do:600,after:604,rescue:608,catch:612,else:616,end:618,and:624,in:626,or:628,fn:630},dte={__proto__:null,__MODULE__:436,__DIR__:438,__ENV__:440,__CALLER__:442,__STACKTRACE__:444},UX=Dt.deserialize({version:14,states:"$CWQ'_Q!7uOOP'iOMhOOOOQYQ!6yOOO>dQ!;_O'#GsOOQ8a'#E]'#E]OEwQ!;_O'#GsOOQ8a'#Ej'#EjO>dQ!;_O'#GsOOQ8a'#Ek'#EkOOQ8a'#Iq'#IqO!&fQ!;_O'#FmO!&pQMxO'#FRO!&uQ!6yO'#IpOOQ8a'#Ip'#IpO!/aQ!7uO'#D{OOQ8a'#FW'#FWOOQ9]'#F_'#F_OOQ`'#Fa'#FaO!/kQMxO'#FYOOQ8a'#JU'#JUOOQ8a'#Fg'#FgOOQ8a'#Fi'#FiOOQ8a'#Fj'#FjOOQ8a'#JX'#JXOOQ8a'#J]'#J]OOQ8a'#JW'#JWOOQ8a'#JV'#JVOOQ8a'#Gs'#GsQcQ!7uOOOOQiOOQCg,5>i,5>iO#3nQ!LbO,5>iO#3yQ##|O'#FyO#4XQ!LbO,5>kOOQCg,5>k,5>kO#4XQ!LbO,5>kO#4dQ!LbO,5:VO#5UQ!LbO,5:VO#4dQ!LbO,5:^O#5UQ!LbO,5:^O#5vQMxO'#DvO#6XQ!6yO'#IkOOQ`'#Ik'#IkOOQ8a,5:a,5:aO#6iQMxO,5:aOOQ8a,5:c,5:cO#6nQMxO,5:cOOQ8a,5:d,5:dO#6sQMxO,5:dO#8uQ!6yO,5:iOcQ!7uO,5:iOOQ8a,5:m,5:mOOQ8a,5:o,5:oO([Q!:kO'#CvO#9uQ!6yO'#IoOOQ8a,5:q,5:qOOQ8a,5:s,5:sQcQ!7uO'#FwQ#&}QMxOOO#=nQ!6UO,5;nOOQ9]'#F`'#F`OcQ!7uO,5;tOcQ!7uO,5;tO/fQ!:kO,5;tOcQ!7uO,5;tOcQ!7uO,5;tOcQ!7uO,5;tOcQ!7uO,5;tOcQ!7uO,5;tOcQ!7uO,5;tOcQ!7uO,5;tOcQ!7uO,5;tOcQ!7uO,5;tOcQ!7uO,5;tOcQ!7uO,5;tOcQ!7uO,5;tOcQ!7uO,5;tOcQ!7uO,5;tO/fQ!:kO,5;|OcQ!7uO,5TQ!6yO1G.|O%9yQMxO1G.|OOQ9],59i,59iOOQ`,5[Q!LbO1G4TOOQ`,5gQ!LbO1G4VO%>rQ##|O'#IUO%?QQ##|O'#IVO%?`Q##|O'#IWO%?nQ##|O'#IXO%?|Q##|O'#I[O%@[Q##|O'#I^O%BjQ!BPO1G/qOOQCg'#IT'#ITO%CjQ##|O'#IaO%CxQ##|O'#IbO%DWQ##|O'#IcO%DfQ##|O'#IdO%DtQ##|O'#IeO%ESQ##|O'#IfO%EbQ##|O'#IgO%EpQ##|O'#IhO%FOQ##|O'#IiO%F^Q##|O'#IjOOQCg'#I`'#I`O%HlQ!BPO1G/xO%IlQ!!nO,5:bO%JWQMxO,5:bO%JiQ!:kO,5?VO%J|QMxO,5?VOOQ8a1G/{1G/{OOQ8a1G/}1G/}OOQ8a1G0O1G0OO%MXQ!6yO1G0TO%NXQ!6yO,59bO%N`Q!6yO,5pOOQCg,5>p,5>pO'5oQ!LbO,5>pO'5zQ##|O'#F{O'6YQ!LbO,5>qOOQCg,5>q,5>qO'6YQ!LbO,5>qO'6eQ##|O'#F|O'6sQ!LbO,5>rOOQCg,5>r,5>rO'6sQ!LbO,5>rO'7OQ##|O'#F}O'7^Q!LbO,5>sOOQCg,5>s,5>sO'7^Q!LbO,5>sO'7iQ##|O'#GOO'7wQ!LbO,5>vOOQCg,5>v,5>vO'7wQ!LbO,5>vO'8SQ##|O'#GPO'8bQ!LbO,5>xOOQCg,5>x,5>xO'8bQ!LbO,5>xOOQ8a7+%]7+%]O'8mQ##|O'#GQO'8{Q!LbO,5>{OOQCg,5>{,5>{O'8{Q!LbO,5>{O'9WQ##|O'#GRO'9fQ!LbO,5>|OOQCg,5>|,5>|O'9fQ!LbO,5>|O'9qQ##|O'#GSO':PQ!LbO,5>}OOQCg,5>},5>}O':PQ!LbO,5>}O':[Q##|O'#GTO':jQ!LbO,5?OOOQCg,5?O,5?OO':jQ!LbO,5?OO':uQ##|O'#GUO';TQ!LbO,5?POOQCg,5?P,5?PO';TQ!LbO,5?PO';`Q##|O'#GVO';nQ!LbO,5?QOOQCg,5?Q,5?QO';nQ!LbO,5?QO';yQ##|O'#GWO'RQ!!nO1G/|OOQ`-E:Z-E:ZO'>mQ!6yO,5RQ!;_O'#GsO)>]Q!;_O'#GsO)BlQ!;_O'#GsO)GkQ!;_O'#GsO)K}Q!;_O'#GsO* zQ!;_O'#GsO*&|Q!;_O'#GsO**pQ!;_O'#GsO*.jQ!;_O'#GsO)>RQ!;_O'#GsO*2vQ!;_O'#GsO*7SQ!;_O'#GsO)GkQ!;_O'#GsO*RQ!;_O'#GsO)>]Q!;_O'#GsO)BlQ!;_O'#GsO)GkQ!;_O'#GsO)K}Q!;_O'#GsO* zQ!;_O'#GsO*&|Q!;_O'#GsO**pQ!;_O'#GsO*G`Q!;_O'#FmO*KoQ!;_O'#FmO*KyQ!;_O'#FmO+!YQ!;_O'#FmO+&PQ!;_O'#FmO+)|Q!;_O'#FmO+.]Q!;_O'#FmO+2SQ!;_O'#FmO+5vQ!;_O'#FmO+9pQ!6yO'#IpOcQ!7uO'#C{O+9zQ!7uO'#C{O(LwQ!7uO'#C{O+=OQ!7uO'#C{O+@SQ!7uO'#C{O+@^Q!7uO'#C{O!6VQ!7uO'#C{O+CbQ!7uO'#C{O+FfQ!7uO'#CxO#4dQ!LbO,5:VO#5UQ!LbO,5:VO#4dQ!LbO,5:^O#5UQ!LbO,5:^O!=^Q!7uO,5:iO(LwQ!7uO,5:iO+9zQ!7uO,5:iO+@SQ!7uO,5:iO!6VQ!7uO,5:iO+@^Q!7uO,5:iO)+TQ!7uO,5:iO+CbQ!7uO,5:iO%3XQ!7uO,5:iO+=OQ!7uO,5:iO!=^Q!7uO,5;tO(LwQ!7uO,5;tO+9zQ!7uO,5;tO+@SQ!7uO,5;tO!6VQ!7uO,5;tO)+TQ!7uO,5;tO+@^Q!7uO,5;tO+CbQ!7uO,5;tO%3XQ!7uO,5;tO+=OQ!7uO,5;tO!=^Q!7uO,5;tO(LwQ!7uO,5;tO+9zQ!7uO,5;tO+@SQ!7uO,5;tO!6VQ!7uO,5;tO)+TQ!7uO,5;tO+@^Q!7uO,5;tO+CbQ!7uO,5;tO%3XQ!7uO,5;tO+=OQ!7uO,5;tO%6]Q!:kO,5;tO&@eQ!:kO,5;tO+JYQ!:kO,5;tO+MdQ!:kO,5;tO+MtQ!:kO,5;tO+NOQ!:kO,5;tO,#YQ!:kO,5;tO,&dQ!:kO,5;tO,)nQ!:kO,5;tO,,xQ!:kO,5;tO'%vQ!:kO,5;tO!=^Q!7uO,5;tO(LwQ!7uO,5;tO+9zQ!7uO,5;tO+@SQ!7uO,5;tO!6VQ!7uO,5;tO)+TQ!7uO,5;tO+@^Q!7uO,5;tO+CbQ!7uO,5;tO%3XQ!7uO,5;tO+=OQ!7uO,5;tO!=^Q!7uO,5;tO(LwQ!7uO,5;tO+9zQ!7uO,5;tO+@SQ!7uO,5;tO!6VQ!7uO,5;tO)+TQ!7uO,5;tO+@^Q!7uO,5;tO+CbQ!7uO,5;tO%3XQ!7uO,5;tO+=OQ!7uO,5;tO!=^Q!7uO,5;tO(LwQ!7uO,5;tO+9zQ!7uO,5;tO+@SQ!7uO,5;tO!6VQ!7uO,5;tO)+TQ!7uO,5;tO+@^Q!7uO,5;tO+CbQ!7uO,5;tO%3XQ!7uO,5;tO+=OQ!7uO,5;tO!=^Q!7uO,5;tO(LwQ!7uO,5;tO+9zQ!7uO,5;tO+@SQ!7uO,5;tO!6VQ!7uO,5;tO)+TQ!7uO,5;tO+@^Q!7uO,5;tO+CbQ!7uO,5;tO%3XQ!7uO,5;tO+=OQ!7uO,5;tO!=^Q!7uO,5;tO(LwQ!7uO,5;tO+9zQ!7uO,5;tO+@SQ!7uO,5;tO!6VQ!7uO,5;tO)+TQ!7uO,5;tO+@^Q!7uO,5;tO+CbQ!7uO,5;tO%3XQ!7uO,5;tO+=OQ!7uO,5;tO!=^Q!7uO,5;tO(LwQ!7uO,5;tO+9zQ!7uO,5;tO+@SQ!7uO,5;tO!6VQ!7uO,5;tO)+TQ!7uO,5;tO+@^Q!7uO,5;tO+CbQ!7uO,5;tO%3XQ!7uO,5;tO+=OQ!7uO,5;tO!=^Q!7uO,5;tO(LwQ!7uO,5;tO+9zQ!7uO,5;tO+@SQ!7uO,5;tO!6VQ!7uO,5;tO)+TQ!7uO,5;tO+@^Q!7uO,5;tO+CbQ!7uO,5;tO%3XQ!7uO,5;tO+=OQ!7uO,5;tO!=^Q!7uO,5;tO(LwQ!7uO,5;tO+9zQ!7uO,5;tO+@SQ!7uO,5;tO!6VQ!7uO,5;tO)+TQ!7uO,5;tO+@^Q!7uO,5;tO+CbQ!7uO,5;tO%3XQ!7uO,5;tO+=OQ!7uO,5;tO!=^Q!7uO,5;tO(LwQ!7uO,5;tO+9zQ!7uO,5;tO+@SQ!7uO,5;tO!6VQ!7uO,5;tO)+TQ!7uO,5;tO+@^Q!7uO,5;tO+CbQ!7uO,5;tO%3XQ!7uO,5;tO+=OQ!7uO,5;tO!=^Q!7uO,5;tO(LwQ!7uO,5;tO+9zQ!7uO,5;tO+@SQ!7uO,5;tO!6VQ!7uO,5;tO)+TQ!7uO,5;tO+@^Q!7uO,5;tO+CbQ!7uO,5;tO%3XQ!7uO,5;tO+=OQ!7uO,5;tO!=^Q!7uO,5;tO(LwQ!7uO,5;tO+9zQ!7uO,5;tO+@SQ!7uO,5;tO!6VQ!7uO,5;tO)+TQ!7uO,5;tO+@^Q!7uO,5;tO+CbQ!7uO,5;tO%3XQ!7uO,5;tO+=OQ!7uO,5;tO!=^Q!7uO,5;tO(LwQ!7uO,5;tO+9zQ!7uO,5;tO+@SQ!7uO,5;tO!6VQ!7uO,5;tO)+TQ!7uO,5;tO+@^Q!7uO,5;tO+CbQ!7uO,5;tO%3XQ!7uO,5;tO+=OQ!7uO,5;tO!=^Q!7uO,5;tO(LwQ!7uO,5;tO+9zQ!7uO,5;tO+@SQ!7uO,5;tO!6VQ!7uO,5;tO)+TQ!7uO,5;tO+@^Q!7uO,5;tO+CbQ!7uO,5;tO%3XQ!7uO,5;tO+=OQ!7uO,5;tO!=^Q!7uO,5;tO(LwQ!7uO,5;tO+9zQ!7uO,5;tO+@SQ!7uO,5;tO!6VQ!7uO,5;tO)+TQ!7uO,5;tO+@^Q!7uO,5;tO+CbQ!7uO,5;tO%3XQ!7uO,5;tO+=OQ!7uO,5;tO%6]Q!:kO,5;|O&@eQ!:kO,5;|O+JYQ!:kO,5;|O+MdQ!:kO,5;|O+MtQ!:kO,5;|O+NOQ!:kO,5;|O,#YQ!:kO,5;|O,&dQ!:kO,5;|O,)nQ!:kO,5;|O,,xQ!:kO,5;|O'%vQ!:kO,5;|O!=^Q!7uO,5xQ!6yO1G1`O-@sQ!6yO1G1`O-BtQ!6yO1G1`O-B{Q!6yO1G1`O-CSQ!6yO1G1`O-CZQ!6yO1G1`O-CbQ!6yO1G1`O-CiQ!6yO1G1`O-CpQ!6yO1G1`O-CwQ!6yO1G1`O-DOQ!6yO1G1`O-DVQ!6yO1G1`O-D^Q!6yO1G1`O-FtQ!6yO1G1`O-IkQ!6yO1G1`O-LOQ!6yO1G1`O-M|Q!6yO1G1`O. }Q!6yO1G1`O.$kQ!6yO1G1`O.&oQ!6yO1G1`O.)PQ!6yO1G1`O.*zQ!6yO1G1`O.,{Q!6yO1G1`O.-SQ!6yO1G1`O.-ZQ!6yO1G1`O.-bQ!6yO1G1`O.-iQ!6yO1G1`O.-pQ!6yO1G1`O.-wQ!6yO1G1`O..OQ!6yO1G1`O..VQ!6yO1G1`O..^Q!6yO1G1`O.0nQ!6yO1G1`O.3eQ!6yO1G1`O.5xQ!6yO1G1`O.7vQ!6yO1G1`O.9wQ!6yO1G1`O.iQ!6yO1G1`O.@dQ!6yO1G1`O.BeQ!6yO1G1`O.BrQ!6yO1G1`O.CPQ!6yO1G1`O.C^Q!6yO1G1`O.CkQ!6yO1G1`O.CxQ!6yO1G1`O.DVQ!6yO1G1`O.DdQ!6yO1G1`O.DqQ!6yO1G1`O.EOQ!6yO1G1`O.GlQ!6yO1G1`O.JcQ!6yO1G1`O.LvQ!6yO1G1`O.NtQ!6yO1G1`O/!uQ!6yO1G1`O/%cQ!6yO1G1`O/'gQ!6yO1G1`O/)bQ!6yO1G1`O/+cQ!6yO1G1`O/+jQ!6yO1G1`O/+qQ!6yO1G1`O/+xQ!6yO1G1`O/,PQ!6yO1G1`O/,WQ!6yO1G1`O/,_Q!6yO1G1`O/,fQ!6yO1G1`O/,mQ!6yO1G1`O/,tQ!6yO1G1`O//XQ!6yO1G1`O/2OQ!6yO1G1`O/4cQ!6yO1G1`O/6aQ!6yO1G1`O/8bQ!6yO1G1`O/;OQ!6yO1G1`O/=SQ!6yO1G1`O/>}Q!6yO1G1`O/AOQ!6yO1G1`O/AYQ!6yO1G1`O/AdQ!6yO1G1`O/AnQ!6yO1G1`O/AxQ!6yO1G1`O/BSQ!6yO1G1`O/B^Q!6yO1G1`O/BhQ!6yO1G1`O/BrQ!6yO1G1`O/B|Q!6yO1G1`O/EgQ!6yO1G1`O/H^Q!6yO1G1`O/JqQ!6yO1G1`O/LoQ!6yO1G1`O/NpQ!6yO1G1`O0#^Q!6yO1G1`O0%bQ!6yO1G1`O0']Q!6yO1G1`O0)^Q!6yO1G1`O0)eQ!6yO1G1`O0)lQ!6yO1G1`O0)sQ!6yO1G1`O0)zQ!6yO1G1`O0*RQ!6yO1G1`O0*YQ!6yO1G1`O0*aQ!6yO1G1`O0*hQ!6yO1G1`O0*oQ!6yO1G1`O0-VQ!6yO1G1`O0/|Q!6yO1G1`O02aQ!6yO1G1`O04_Q!6yO1G1`O06`Q!6yO1G1`O08|Q!6yO1G1`O0;QQ!6yO1G1`O0<{Q!6yO1G1`O0>|Q!6yO1G1`O0?TQ!6yO1G1`O0?[Q!6yO1G1`O0?cQ!6yO1G1`O0?jQ!6yO1G1`O0?qQ!6yO1G1`O0?xQ!6yO1G1`O0@PQ!6yO1G1`O0@WQ!6yO1G1`O0@_Q!6yO1G1`O0BrQ!6yO1G1`O0EiQ!6yO1G1`O0G|Q!6yO1G1`O0IzQ!6yO1G1`O0K{Q!6yO1G1`O0NiQ!6yO1G1`O1!mQ!6yO1G1`O1$hQ!6yO1G1`O1&iQ!6yO1G1`O1&sQ!6yO1G1`O1&}Q!6yO1G1`O1'UQ!6yO1G1`O1'`Q!6yO1G1`O1'jQ!6yO1G1`O1'tQ!6yO1G1`O1(OQ!6yO1G1`O1(YQ!6yO1G1`O1(dQ!6yO1G1`O1*_Q!6yO'#FcO1,xQ!6yO'#FcO1/rQ!6yO'#FcO12YQ!6yO'#FcO14ZQ!6yO'#FcO16_Q!6yO'#FcO19OQ!6yO'#FcO1;VQ!6yO'#FcO1=jQ!6yO'#FcO1?hQ!6yO'#FcO1AxQ!6yO'#FfO1BiQ!6yO'#FfO1EYQ!6yO'#FfO1G^Q!6yO'#FfO1IeQ!6yO'#FfO1JUQ!6yO'#FfO1J{Q!6yO'#FfO1MSQ!6yO'#FfO1MsQ!6yO'#FfO,#YQ!:kO,5WQ!6yO'#FfO4?WQ%2eO'#IoO4?hQ%2eO'#CzO4C_Q%2eO1G1`O4CfQ%2eO1G1`O4EjQ%2eO1G1`O4EqQ%2eO1G1`O4GoQ%2eO1G1`O4G|Q%2eO1G1`O4JWQ%2eO1G1`O4J_Q%2eO1G1`O4L`Q%2eO1G1`O4LjQ%2eO1G1`O4NqQ%2eO1G1`O4NxQ%2eO1G1`O5!|Q%2eO1G1`O5#TQ%2eO1G1`O5%UQ%2eO1G1`O5%`Q%2eO1G1`O5&eQ%2eO'#FcO5'nQ%2eO'#FfO5(eQ%2eO,59gO5(oQ%2eO,59fO5*iQ!6UO'#D}O5*tQ!7uO'#FaO5-xQ!6UO'#D}O5*tQ!7uO'#FaO2(YQ!7uO'#ET",stateData:"5.[~O%bOS%cOShOS%YOS%dPQ~OkTO|xO!T!SO!U!SO!V!SO!W!SO!a`O!c_O!maO!rbO!sbO!vdO!zgO#exO#fxO#gxO#hxO#ixO#jxO#kxO#lxO#mxO#nxO#oxO#pxO#qxO#rxO#{vO%TwO%VeO%WcO%]XO%_UO%`VO%mRO%oSO%p!UO%r!VO%s!VO%t!VO%u!VO%v!VO%w!WO%x!WO%y!WO%z!WO%{!WO%|!WO%}!WO&O!WO&P!WO&Q!XO&R!XO&S!XO&T!XO&U!XO&V!XO&W!XO&X!XO&Y!XO&Z!XO&[!XO&]!XO&^!XO&_!XO&`!XO&a!XO&b!XO&c!XO&d!XO&e!XO&f!XO&g!XO&h!XO&i!XO&j!XO&k!YO&l!YO&m!ZO&oXO&p![O&rZO&t[O&v]O'`uO'b!_O't!aO'u!bO'v!`O'w!cO~O%XQO%fQO~PcO%d!eO~OR!jOr!gOt!fO%m!iO~OS!nOr!kOt!fO%o!mO~Ok!sOv!{O|!yO!T!SO!U!SO!V!SO!W!SO!a`O!c_O!maO!r:`O!s:`O!v:sO!z;VO#exO#fxO#gxO#hxO#ixO#jxO#kxO#lxO#mxO#nxO#oxO#pxO#qxO#rxO#{vO%TwO%VeO%W:iO%XQO%]XO%^!oO%_UO%`VO%fQO%k!oO%mRO%oSO%p!UO%r!VO%s!VO%t!VO%u!VO%v!VO%w!WO%x!WO%y!WO%z!WO%{!WO%|!WO%}!WO&O!WO&P!WO&Q!XO&R!XO&S!XO&T!XO&U!XO&V!XO&W!XO&X!XO&Y!XO&Z!XO&[!XO&]!XO&^!XO&_!XO&`!XO&a!XO&b!XO&c!XO&d!XO&e!XO&f!XO&g!XO&h!XO&i!XO&j!XO&k!YO&l!YO&m!ZO&oXO&p![O&rZO&t[O&v]O'`uO'b!_O't!aO'u!bO'v!`O'w!cO~OT#TOr#QOt!fO&r#SO~OU#XOr#UOt!fO&t#WO~O!`#YO!e#ZO!g#[O!h#]O~O!d#aO%^!oO%k!oO~PcO!b#cO%^!oO%k!oO~PcO!n#eO%^!oO%k!oO~PcOkTO|xO!T!SO!U!SO!V!SO!W!SO!a`O!c_O!maO!rbO!sbO!vdO!zgO#exO#fxO#gxO#hxO#ixO#jxO#kxO#lxO#mxO#nxO#oxO#pxO#rxO#{vO%TwO%VeO%WcO%]XO%_UO%`VO%mRO%oSO%p!UO%r!VO%s!VO%t!VO%u!VO%v!VO%w!WO%x!WO%y!WO%z!WO%{!WO%|!WO%}!WO&O!WO&P!WO&Q!XO&R!XO&S!XO&T!XO&U!XO&V!XO&W!XO&X!XO&Y!XO&Z!XO&[!XO&]!XO&^!XO&_!XO&`!XO&a!XO&b!XO&c!XO&d!XO&e!XO&f!XO&g!XO&h!XO&i!XO&j!XO&k!YO&l!YO&m!ZO&oXO&p![O&rZO&t[O&v]O'`uO'b!_O't!aO'u!bO'v!`O'w!cO#q$TX~O!r#hO!s#hO'b!_O~O|xO!T!SO!V!SO!W!SO!a`O!c_O!maO!rbO!sbO!vdO!zgO#exO#fxO#gxO#hxO#ixO#jxO#kxO#lxO#mxO#nxO#oxO#pxO#qxO#rxO#{vO%TwO%VeO%WcO%]XO%_UO%`VO%mRO%oSO%p!UO%r!VO%s!VO%t!VO%u!VO%v!VO%w!WO%x!WO%y!WO%z!WO%{!WO%|!WO%}!WO&O!WO&P!WO&Q!XO&R!XO&S!XO&T!XO&U!XO&V!XO&W!XO&X!XO&Y!XO&Z!XO&[!XO&]!XO&^!XO&_!XO&`!XO&a!XO&b!XO&c!XO&d!XO&e!XO&f!XO&g!XO&h!XO&i!XO&j!XO&k!YO&l!YO&m!ZO&oXO&p![O&rZO&t[O&v]O'`uO'b!_O't!aO'u!bO'v!`O'w!cO~Ok#kO!U#nO#q$TX~P6cOQ$WO!r$RO!}#qO#e#sO#f#tO#g#uO#h#wO#i#xO#j#yO#k#zO#l#{O#m#|O#n$OO#o$PO#p$SO#q$SO#r$TO#{$QO#}#vO$X$VO%TwO%U#rO%p!UO't!aO'u!bO'v!`O~O%XQO%fQO~PvOQ$WO!r4mO!}#qO#j2yO#k3TO#l3_O#m3iO#n3}O#o4XO#p4wO#q4wO#r5RO#{4cO$X5hO%TwO%U#rO't!aO'u!bOv#|i|#|i#e#|i#f#|i#g#|i#}#|i%i#|i%p#|i~O#h2eO#i2oO'v!`O~P.@qO#h#|i#i#|i'v#|i~P..eO#h#|i#i#|i'v#|i~P.0{O#h#|i#i#|i'v#|i~P.3rO#h#|i#i#|i'v#|i~P.6VO#h#|i#i#|i'v#|i~P.8TO#h#|i#i#|i'v#|i~P.:UO#h#|i#i#|i'v#|i~P.vO#h#|i#i#|i'v#|i~P.@qOQ$WO!r4dO!}#qO#l3UO#m3`O#n3tO#o4OO#p4nO#q4nO#r4xO#{4YO$X5_O%TwO%U#rO'u!bOv#|i|#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#}#|i%X#|i%f#|i%i#|i%p#|i't#|i'v#|i'j#|i'l#|i'n#|i'p#|i'q#|i~O#k2zO~P.E]OQ$WO!r4eO!}#qO#l3VO#m3aO#n3uO#o4PO#p4oO#q4oO#r4yO#{4ZO$X5`O%TwO%U#rO'u!bO#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#}#|i%S#|i%X#|i%Z#|i%f#|i%i#|i%p#|i'h#|i't#|i'v#|i!d#|i!b#|i!n#|iv#|i'q#|i'j#|i'l#|i'n#|i'p#|i~O#k2{O~P.GsOQ$WO!r4fO!}#qO#l3WO#m3bO#n3vO#o4QO#p4pO#q4pO#r4zO#{4[O$X5aO%TwO%U#rO'u!bO#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#}#|i%i#|i%p#|i't#|i'v#|iv#|i%X#|i%f#|i'q#|i'j#|i'l#|i'n#|i'p#|i~O#k2|O~P.JjOQ$WO!r4gO!}#qO#l3XO#m3cO#n3wO#o4RO#p4qO#q4qO#r4{O#{4]O$X5bO%TwO%U#rO'u!bO!a#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#}#|i%p#|i't#|i'v#|i%i#|i~O#k2}O~P.L}OQ$WO!r4iO!}#qO#l3ZO#m3eO#n3yO#o4TO#p4sO#q4sO#r4}O#{4_O$X5dO%TwO%U#rO'u!bO#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#}#|i%p#|i't#|i'v#|iv#|i%X#|i%f#|i~O#k3PO~P.N{OQ$WO!r4jO!}#qO#l3[O#m3fO#n3zO#o4UO#p4tO#q4tO#r5OO#{4`O$X5eO%TwO%U#rO'u!bOv#|i|#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#}#|i%X#|i%Z#|i%f#|i%i#|i%p#|i'h#|i't#|i'v#|i'j#|i'l#|i'n#|i'p#|i'q#|i~O#k3QO~P/!|OQ$WO!r4kO!}#qO#l3]O#m3gO#n3{O#o4VO#p4uO#q4uO#r5PO#{4aO$X5fO%TwO%U#rO'u!bO!a#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#}#|i%Z#|i%i#|i%p#|i'h#|i't#|i'v#|i~O#k3RO~P/%jOQ$WO!r4lO!}#qO#l3^O#m3hO#n3|O#o4WO#p4vO#q4vO#r5QO#{4bO$X5gO%TwO%U#rO'u!bO|#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#}#|i%p#|i't#|i'v#|i~O#k3SO~P/'nOQ$WO!r4mO!}#qO#l3_O#m3iO#n3}O#o4XO#p4wO#q4wO#r5RO#{4cO$X5hO%TwO%U#rO'u!bOv#|i|#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#}#|i%i#|i%p#|i't#|i'v#|i~O#k3TO~P/)iO#k#|i~P.E]O#k#|i~P.GsO#k#|i~P.JjO#k#|i~P.L}O#k#|i~P.N{O#k#|i~P/!|O#k#|i~P/%jO#k#|i~P/'nO#k#|i~P/)iOQ$WO!r4dO!}#qO#n3tO#o4OO#p4nO#q4nO#r4xO#{4YO%TwO%U#rO'u!bOv#|i|#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#}#|i%X#|i%f#|i%i#|i%p#|i't#|i'v#|i'j#|i'l#|i'n#|i'p#|i'q#|i~O#m3`O$X5_O~P/,{OQ$WO!r4eO!}#qO#n3uO#o4PO#p4oO#q4oO#r4yO#{4ZO%TwO%U#rO'u!bO#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#}#|i%S#|i%X#|i%Z#|i%f#|i%i#|i%p#|i'h#|i't#|i'v#|i!d#|i!b#|i!n#|iv#|i'q#|i'j#|i'l#|i'n#|i'p#|i~O#m3aO$X5`O~P//cOQ$WO!r4fO!}#qO#n3vO#o4QO#p4pO#q4pO#r4zO#{4[O%TwO%U#rO'u!bO#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#}#|i%i#|i%p#|i't#|i'v#|iv#|i%X#|i%f#|i'q#|i'j#|i'l#|i'n#|i'p#|i~O#m3bO$X5aO~P/2YOQ$WO!r4gO!}#qO#n3wO#o4RO#p4qO#q4qO#r4{O#{4]O%TwO%U#rO'u!bO!a#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#}#|i%p#|i't#|i'v#|i%i#|i~O#m3cO$X5bO~P/4mOQ$WO!r4iO!}#qO#n3yO#o4TO#p4sO#q4sO#r4}O#{4_O%TwO%U#rO'u!bO#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#}#|i%p#|i't#|i'v#|iv#|i%X#|i%f#|i~O#m3eO$X5dO~P/6kOQ$WO!r4jO!}#qO#n3zO#o4UO#p4tO#q4tO#r5OO#{4`O%TwO%U#rO'u!bOv#|i|#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#}#|i%X#|i%Z#|i%f#|i%i#|i%p#|i'h#|i't#|i'v#|i'j#|i'l#|i'n#|i'p#|i'q#|i~O#m3fO$X5eO~P/8lOQ$WO!r4kO!}#qO#n3{O#o4VO#p4uO#q4uO#r5PO#{4aO%TwO%U#rO'u!bO!a#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#}#|i%Z#|i%i#|i%p#|i'h#|i't#|i'v#|i~O#m3gO$X5fO~P/;YOQ$WO!r4lO!}#qO#n3|O#o4WO#p4vO#q4vO#r5QO#{4bO%TwO%U#rO'u!bO|#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#}#|i%p#|i't#|i'v#|i~O#m3hO$X5gO~P/=^OQ$WO!r4mO!}#qO#n3}O#o4XO#p4wO#q4wO#r5RO#{4cO%TwO%U#rO'u!bOv#|i|#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#}#|i%i#|i%p#|i't#|i'v#|i~O#m3iO$X5hO~P/?XO#m#|i$X#|i~P/,{O#m#|i$X#|i~P//cO#m#|i$X#|i~P/2YO#m#|i$X#|i~P/4mO#m#|i$X#|i~P/6kO#m#|i$X#|i~P/8lO#m#|i$X#|i~P/;YO#m#|i$X#|i~P/=^O#m#|i$X#|i~P/?XOQ$WO!r4dO!}#qO#o4OO#p4nO#q4nO#r4xO#{4YO%U#rOv#|i|#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#}#|i$X#|i%T#|i%X#|i%f#|i%i#|i%p#|i't#|i'u#|i'v#|i'j#|i'l#|i'n#|i'p#|i'q#|i~O#n3tO~P/CWOQ$WO!r4eO!}#qO#o4PO#p4oO#q4oO#r4yO#{4ZO%U#rO#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#}#|i$X#|i%S#|i%T#|i%X#|i%Z#|i%f#|i%i#|i%p#|i'h#|i't#|i'u#|i'v#|i!d#|i!b#|i!n#|iv#|i'q#|i'j#|i'l#|i'n#|i'p#|i~O#n3uO~P/EnOQ$WO!r4fO!}#qO#o4QO#p4pO#q4pO#r4zO#{4[O%U#rO#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#}#|i$X#|i%T#|i%i#|i%p#|i't#|i'u#|i'v#|iv#|i%X#|i%f#|i'q#|i'j#|i'l#|i'n#|i'p#|i~O#n3vO~P/HeOQ$WO!r4gO!}#qO#o4RO#p4qO#q4qO#r4{O#{4]O%U#rO!a#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#}#|i$X#|i%T#|i%p#|i't#|i'u#|i'v#|i%i#|i~O#n3wO~P/JxOQ$WO!r4iO!}#qO#o4TO#p4sO#q4sO#r4}O#{4_O%U#rO#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#}#|i$X#|i%T#|i%p#|i't#|i'u#|i'v#|iv#|i%X#|i%f#|i~O#n3yO~P/LvOQ$WO!r4jO!}#qO#o4UO#p4tO#q4tO#r5OO#{4`O%U#rOv#|i|#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#}#|i$X#|i%T#|i%X#|i%Z#|i%f#|i%i#|i%p#|i'h#|i't#|i'u#|i'v#|i'j#|i'l#|i'n#|i'p#|i'q#|i~O#n3zO~P/NwOQ$WO!r4kO!}#qO#o4VO#p4uO#q4uO#r5PO#{4aO%U#rO!a#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#}#|i$X#|i%T#|i%Z#|i%i#|i%p#|i'h#|i't#|i'u#|i'v#|i~O#n3{O~P0#eOQ$WO!r4lO!}#qO#o4WO#p4vO#q4vO#r5QO#{4bO%U#rO|#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#}#|i$X#|i%T#|i%p#|i't#|i'u#|i'v#|i~O#n3|O~P0%iOQ$WO!r4mO!}#qO#o4XO#p4wO#q4wO#r5RO#{4cO%U#rOv#|i|#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#}#|i$X#|i%T#|i%i#|i%p#|i't#|i'u#|i'v#|i~O#n3}O~P0'dO#n#|i~P/CWO#n#|i~P/EnO#n#|i~P/HeO#n#|i~P/JxO#n#|i~P/LvO#n#|i~P/NwO#n#|i~P0#eO#n#|i~P0%iO#n#|i~P0'dOQ$WO!r4dO!}#qO#p4nO#q4nO#r4xO#{4YOv#|i|#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#n#|i#}#|i$X#|i%T#|i%U#|i%X#|i%f#|i%i#|i%p#|i't#|i'u#|i'v#|i'j#|i'l#|i'n#|i'p#|i'q#|i~O#o4OO~P0*vOQ$WO!r4eO!}#qO#p4oO#q4oO#r4yO#{4ZO#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#n#|i#}#|i$X#|i%S#|i%T#|i%U#|i%X#|i%Z#|i%f#|i%i#|i%p#|i'h#|i't#|i'u#|i'v#|i!d#|i!b#|i!n#|iv#|i'q#|i'j#|i'l#|i'n#|i'p#|i~O#o4PO~P0-^OQ$WO!r4fO!}#qO#p4pO#q4pO#r4zO#{4[O#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#n#|i#}#|i$X#|i%T#|i%U#|i%i#|i%p#|i't#|i'u#|i'v#|iv#|i%X#|i%f#|i'q#|i'j#|i'l#|i'n#|i'p#|i~O#o4QO~P00TOQ$WO!r4gO!}#qO#p4qO#q4qO#r4{O#{4]O!a#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#n#|i#}#|i$X#|i%T#|i%U#|i%p#|i't#|i'u#|i'v#|i%i#|i~O#o4RO~P02hOQ$WO!r4iO!}#qO#p4sO#q4sO#r4}O#{4_O#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#n#|i#}#|i$X#|i%T#|i%U#|i%p#|i't#|i'u#|i'v#|iv#|i%X#|i%f#|i~O#o4TO~P04fOQ$WO!r4jO!}#qO#p4tO#q4tO#r5OO#{4`Ov#|i|#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#n#|i#}#|i$X#|i%T#|i%U#|i%X#|i%Z#|i%f#|i%i#|i%p#|i'h#|i't#|i'u#|i'v#|i'j#|i'l#|i'n#|i'p#|i'q#|i~O#o4UO~P06gOQ$WO!r4kO!}#qO#p4uO#q4uO#r5PO#{4aO!a#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#n#|i#}#|i$X#|i%T#|i%U#|i%Z#|i%i#|i%p#|i'h#|i't#|i'u#|i'v#|i~O#o4VO~P09TOQ$WO!r4lO!}#qO#p4vO#q4vO#r5QO#{4bO|#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#n#|i#}#|i$X#|i%T#|i%U#|i%p#|i't#|i'u#|i'v#|i~O#o4WO~P0;XOQ$WO!r4mO!}#qO#p4wO#q4wO#r5RO#{4cOv#|i|#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#n#|i#}#|i$X#|i%T#|i%U#|i%i#|i%p#|i't#|i'u#|i'v#|i~O#o4XO~P0=SO#o#|i~P0*vO#o#|i~P0-^O#o#|i~P00TO#o#|i~P02hO#o#|i~P04fO#o#|i~P06gO#o#|i~P09TO#o#|i~P0;XO#o#|i~P0=SOQ$WO!}#qO#r4xOv#|i|#|i!r#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#n#|i#o#|i#{#|i#}#|i$X#|i%T#|i%U#|i%X#|i%f#|i%i#|i%p#|i't#|i'u#|i'v#|i'j#|i'l#|i'n#|i'p#|i'q#|i~O#p4nO#q4nO~P0@fOQ$WO!}#qO#r4yO!r#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#n#|i#o#|i#{#|i#}#|i$X#|i%S#|i%T#|i%U#|i%X#|i%Z#|i%f#|i%i#|i%p#|i'h#|i't#|i'u#|i'v#|i!d#|i!b#|i!n#|iv#|i'q#|i'j#|i'l#|i'n#|i'p#|i~O#p4oO#q4oO~P0B|OQ$WO!}#qO#r4zO!r#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#n#|i#o#|i#{#|i#}#|i$X#|i%T#|i%U#|i%i#|i%p#|i't#|i'u#|i'v#|iv#|i%X#|i%f#|i'q#|i'j#|i'l#|i'n#|i'p#|i~O#p4pO#q4pO~P0EsOQ$WO!}#qO#r4{O!a#|i!r#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#n#|i#o#|i#{#|i#}#|i$X#|i%T#|i%U#|i%p#|i't#|i'u#|i'v#|i%i#|i~O#p4qO#q4qO~P0HWOQ$WO!}#qO#r4}O!r#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#n#|i#o#|i#{#|i#}#|i$X#|i%T#|i%U#|i%p#|i't#|i'u#|i'v#|iv#|i%X#|i%f#|i~O#p4sO#q4sO~P0JUOQ$WO!}#qO#r5OOv#|i|#|i!r#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#n#|i#o#|i#{#|i#}#|i$X#|i%T#|i%U#|i%X#|i%Z#|i%f#|i%i#|i%p#|i'h#|i't#|i'u#|i'v#|i'j#|i'l#|i'n#|i'p#|i'q#|i~O#p4tO#q4tO~P0LVOQ$WO!}#qO#r5PO!a#|i!r#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#n#|i#o#|i#{#|i#}#|i$X#|i%T#|i%U#|i%Z#|i%i#|i%p#|i'h#|i't#|i'u#|i'v#|i~O#p4uO#q4uO~P0NsOQ$WO!}#qO#r5QO|#|i!r#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#n#|i#o#|i#{#|i#}#|i$X#|i%T#|i%U#|i%p#|i't#|i'u#|i'v#|i~O#p4vO#q4vO~P1!wOQ$WO!}#qO#r5ROv#|i|#|i!r#|i#e#|i#f#|i#g#|i#h#|i#i#|i#j#|i#k#|i#l#|i#m#|i#n#|i#o#|i#{#|i#}#|i$X#|i%T#|i%U#|i%i#|i%p#|i't#|i'u#|i'v#|i~O#p4wO#q4wO~P1$rO#p#|i#q#|i~P0@fO#r4yO~P&7vO#p#|i#q#|i~P0EsO#p#|i#q#|i~P0HWO#p#|i#q#|i~P0JUO#p#|i#q#|i~P0LVO#p#|i#q#|i~P0NsO#p#|i#q#|i~P1!wO#p#|i#q#|i~P1$rOQ$WO!r4dO!}#qO#f1kO#g1uO#h2[O#i2fO#j2pO#k2zO#l3UO#m3`O#n3tO#o4OO#p4nO#q4nO#r4xO#{4YO#}2QO$X5_O%TwO%U#rO%p!UO't!aO'u!bO'v!`O~Ov$VX|$VX#e$VX%X$VX%f$VX%i$VX%p$VX'j$VX'l$VX'n$VX'p$VX'q$VX~P1(nOQ$WO!r4eO!}#qO#f1lO#g1vO#h2]O#i2gO#j2qO#k2{O#l3VO#m3aO#n3uO#o4PO#p4oO#q4oO#r4yO#{4ZO#}2RO$X5`O%TwO%U#rO%p!UO't!aO'u!bO'v!`O~O#e$VX%S$VX%X$VX%Z$VX%f$VX%i$VX%p$VX'h$VX!d$VX!b$VX!n$VXv$VX'q$VX'j$VX'l$VX'n$VX'p$VX~P1+XOQ$WO!r4fO!}#qO#f1mO#g1wO#h2^O#i2hO#j2rO#k2|O#l3WO#m3bO#n3vO#o4QO#p4pO#q4pO#r4zO#{4[O#}2SO$X5aO%TwO%U#rO%p!UO't!aO'u!bO'v!`O~O#e$VX%i$VX%p$VXv$VX%X$VX%f$VX'q$VX'j$VX'l$VX'n$VX'p$VX~P1.ROQ$WO!r4gO!}#qO#f1nO#g1xO#h2_O#i2iO#j2sO#k2}O#l3XO#m3cO#n3wO#o4RO#p4qO#q4qO#r4{O#{4]O#}2TO$X5bO%TwO%U#rO%p!UO't!aO'u!bO'v!`O~O!a$VX#e$VX%p$VX%i$VX~P10iOQ$WO!r4iO!}#qO#f1pO#g1zO#h2aO#i2kO#j2uO#k3PO#l3ZO#m3eO#n3yO#o4TO#p4sO#q4sO#r4}O#{4_O#}2VO$X5dO%TwO%U#rO%p!UO't!aO'u!bO'v!`O~O#e$VX%p$VXv$VX%X$VX%f$VX~P12jOQ$WO!r4jO!}#qO#f1qO#g1{O#h2bO#i2lO#j2vO#k3QO#l3[O#m3fO#n3zO#o4UO#p4tO#q4tO#r5OO#{4`O#}2WO$X5eO%TwO%U#rO%p!UO't!aO'u!bO'v!`O~Ov$VX|$VX#e$VX%X$VX%Z$VX%f$VX%i$VX%p$VX'h$VX'j$VX'l$VX'n$VX'p$VX'q$VX~P14nOQ$WO!r4kO!}#qO#f1rO#g1|O#h2cO#i2mO#j2wO#k3RO#l3]O#m3gO#n3{O#o4VO#p4uO#q4uO#r5PO#{4aO#}2XO$X5fO%TwO%U#rO%p!UO't!aO'u!bO'v!`O~O!a$VX#e$VX%Z$VX%i$VX%p$VX'h$VX~P17_OQ$WO!roP)HyP(RP*%T)Hs)Hs)Hs)HsPP)HsP)HsP*%a*%m*%m*%m*%m*%m*%m*%m*%m*%m*%m*%sP#NeP*&Q*&a$> Map Struct UnaryOperator Operator Operator WordOperator AtOperator Operator DocAtOperator Operator CaptureOperator Operator CaptureOperand Dot Operator Right Call Arguments DoBlock do AfterBlock after RescueBlock rescue CatchBlock catch ElseBlock else end FunctionDefinitionCall KernelCall Call Dot Right Identifier OperatorIdentifier Operator Operator Operator Operator Operator Operator Operator Operator Operator Operator Operator Operator Operator Operator String Charlist Call Dot Arguments Call MapContent OperatorIdentifier Operator BinaryOperator Operator WordOperator WordOperator WordOperator WordOperator Operator OperatorIdentifier WhenOperator Right PipeOperator Operator Right Call Arguments FunctionDefinitionCall KernelCall Call KernelCall Call AccessCall AnonymousFunction fn",maxTerm:323,nodeProps:[["closedBy",36,"interpolationEnd",75,">>"],["openedBy",37,"interpolationStart",76,"<<"]],propSources:[fte],skippedNodes:[0,24],repeatNodeCount:29,tokenData:"Eu~RyXY#rYZ#}]^$Spq#rqr$Yrs%^st%quv'_vw'vwx(fxy(yyz)Oz{)T{|)h|}*W}!O*]!O!P+O!P!Q+o!Q!R+|!R![/n![!]1e!]!^8b!^!_8g!_!`:d!`!a:z!a!b;d!b!cu!v!}T#T#o>TT=bTXY=_YZ=_]^=_pq=_!O!P=qT=tTXY=qYZ=q]^=qpq=q!c!}>TT>YX!TTXY=_YZ=_]^=_pq=_!O!P=q!Q![>T!c!}>T#R#S>T#T#o>TV>|X!TT!hQXY=_YZ=_]^=_pq=_!O!P=q!Q![T#T#o>T~?nO!c~~?sX%d~O#O@`#O#P@e#P#i@`#i#j@o#j#l@`#l#mBa#m;'S@`;'S;=`CO<%lO@`Q@eOrQV@lPrQ#eT![!]$eQ@rS!Q![AO!c!iAO#T#ZAO#o#pAtQARR!Q![A[!c!iA[#T#ZA[QA_R!Q![Ah!c!iAh#T#ZAhQAkR!Q![@`!c!i@`#T#Z@`QAwR!Q![BQ!c!iBQ#T#ZBQQBTS!Q![BQ!c!iBQ#T#ZBQ#q#r@`QBdS!Q![Bp!c!iBp#T#ZBp#o#pAtQBuRrQ!Q![@`!c!i@`#T#Z@`QCRP;=`<%l@`~CZO!d~~C`Q!s~![!]$e#Q#RCf~CiP#Q#RCl~CqP#n~![!]$e~CyO!`~~DOO!g~~DTP!a~#q#r'pVD_R'PQ#gT![!]$e!`!aDh#p#qDpTDmP$XT![!]$eTDuQ#iT![!]$e#p#qD{TEQP#iT![!]$eVE[O!bRuS~EaQ&v~!`!a:X#r#sEg~EjP#r#sEm~ErP!s~![!]$e",tokenizers:[nte,ote,ste,Kee,ate,Gee,Jee,ete,Yee,Hee,rte,0,1,2],topRules:{Source:[0,25]},dynamicPrecedences:{43:1,79:-1,150:-1},specialized:[{term:199,get:t=>hte[t]||-1},{term:200,get:t=>dte[t]||-1}],tokenPrec:42923});var NX=qt.define({name:"elixir",parser:UX.configure({props:[jt.add({"DoBlock AfterBlock ElseBlock CatchBlock RescueBlock":xw(wi({except:/^\s*(after|else|catch|rescue|end)\b/})),AnonymousFunction:xw(fi({closing:"end",align:!1})),Block:xw(fi({closing:")",align:!1})),StabClause:wi(),List:fi({closing:"]",align:!1}),Tuple:fi({closing:"}",align:!1}),Bitstring:fi({closing:">>",align:!1}),Arguments:fi({closing:")",align:!1}),Map:fi({closing:"}",align:!1}),"String Charlist Sigil":ap,BinaryOperator:wi(),Pair:wi()}),zt.add({"DoBlock Block List Tuple Bitstring AnonymousFunction":vr,Map:Ote})]}),languageData:{commentTokens:{line:"#"},closeBrackets:{brackets:["(","[","{","'",'"',"'''",'"""'],stringPrefixes:["~s","~S","~r","~R","~c","~C","~D","~N"]},indentOnInput:/^\s*([\}\]\)]|>>|after|else|catch|rescue|end)|.*->$/}});function xw(t){return e=>{var i,r,n,o;let s=e.node.childBefore(e.pos);return((r=(i=e.node.lastChild)===null||i===void 0?void 0:i.type)===null||r===void 0?void 0:r.name)==="end"&&e.textAfter.endsWith("end")?e.baseIndentFor(e.node):((n=s==null?void 0:s.type)===null||n===void 0?void 0:n.name)==="StabClause"&&e.textAfter.endsWith("->")?e.baseIndentFor(s):((o=s==null?void 0:s.type)===null||o===void 0?void 0:o.name)==="StabClause"?e.baseIndentFor(s)+e.unit:t(e)}}function Ote(t){let e=t.getChild("{"),i=t.getChild("}");return e&&i?{from:e.to,to:i.from}:null}var pte=t=>{let{state:e,dispatch:i}=t,r=De(e),n=gn(e),o=!0,s=e.changeByRange(a=>{if(!a.empty||!NX.isActiveAt(e,a.from))return o=!1,{range:a};let l=r.resolve(a.from,-1),c=mte(l);if(c&&!gte(c)){let u=xl(e,c.from+1)||n,f=Fn(e,u),d=Fn(e,u-n),O=` ${f}`,m=` -${d}end`,x=a.from+O.length;return{range:K.cursor(x),changes:[{from:a.from,to:a.to,insert:O+m}]}}return o=!1,{range:a}});return o?(i(e.update(s,{scrollIntoView:!0,userEvent:"input"})),!0):!1};function mte(t){let e=t;return e&&e.type.name==="do"&&(e=e.parent),e&&e.type.name==="Operator"&&(e=e.parent),e&&(e.type.name==="StabClause"||e.type.name==="fn")&&(e=e.parent),e&&MX(e)?e:null}function MX(t){return t.type.name==="DoBlock"||t.type.name==="AnonymousFunction"}function gte(t){var e,i;let r=t;for(;r;){if(MX(r)&&((i=(e=r.lastChild)===null||e===void 0?void 0:e.type)===null||i===void 0?void 0:i.name)!=="end")return!1;r=r.parent}return!0}var bte=[{key:"Enter",run:pte}];function qX(){let t=[Lt.high(ci.of(bte))];return new vt(NX,t)}var jX=It.of({name:"Elixir",support:qX()}),WX=It.of({name:"Erlang",support:new vt(Fu.define(fX))}),VX=It.of({name:"SQL",support:fA()}),ZX=It.of({name:"Python",support:VA()}),BX=It.of({name:"YAML",support:rX()}),YX=It.of({name:"JSON",support:mA()}),FX=It.of({name:"XML",support:TA()}),HX=It.of({name:"CSS",support:Ep()}),GX=It.of({name:"HTML",support:Qp()}),KX=It.of({name:"JavaScript",support:Pp()}),JX=It.of({name:"Dockerfile",support:new vt(Fu.define(bX))}),yte=It.of({name:"Markdown",support:H$({base:_p,codeLanguages:[jX,WX,VX,ZX,BX,YX,FX,HX,GX,KX,JX]})}),Zp=[jX,WX,VX,ZX,BX,YX,FX,HX,GX,KX,JX,yte];function eR(t,{dark:e}){let i={sans:"Inter",mono:"JetBrains Mono, monospace"};return fe.theme({"&":{color:t.text,backgroundColor:t.background,borderRadius:"8px",fontSize:"14px",fontFamily:i.mono,display:"inline-flex !important",width:"100%"},"&.cm-focused":{outline:"none"},".cm-scroller":{fontFamily:"inherit",padding:"0.75rem 0"},".cm-content":{caretColor:t.cursor,padding:"0"},"*":{"&":{scrollbarWidth:"thin",scrollbarColor:`${t.backgroundLightest} transparent`},"&::-webkit-scrollbar":{width:"8px",height:"8px"},"&::-webkit-scrollbar-thumb":{background:t.backgroundLightest},"&::-webkit-scrollbar-track":{background:"transparent"}},".cm-activeLine":{backgroundColor:"transparent"},"&.cm-focused:not(.cm-selecting) .cm-activeLine":{backgroundColor:t.activeLine},".cm-cursor, .cm-dropCursor":{borderLeft:"1px solid",borderRight:"1px solid",marginLeft:"-1px",marginRight:"-1px",borderColor:t.cursor},".cm-selectionBackground":{backgroundColor:t.inactiveSelectionBackground},"&.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{backgroundColor:t.selectionBackground},".cm-selectionMatch":{backgroundColor:t.selectionMatchBackground},"&:not(.cm-focused) .cm-fat-cursor":{outline:"none !important"},".cm-gutters":{backgroundColor:t.background,color:t.gutterText,border:"none"},".cm-gutters .cm-activeLineGutter":{backgroundColor:"transparent"},"&.cm-focused:not(.cm-selecting) .cm-gutters .cm-activeLineGutter":{backgroundColor:t.activeLine},".cm-tooltip":{backgroundColor:t.backgroundLighter,boxShadow:"0 2px 6px 0 rgba(0, 0, 0, 0.2)",color:t.text,borderRadius:"8px",border:`1px solid ${t.border}`,"& .cm-tooltip-arrow::before":{borderTopColor:t.backgroundLighter,borderBottomColor:t.backgroundLighter}},".cm-panels":{backgroundColor:"transparent",color:t.text,"&.cm-panels-top":{borderBottom:`2px solid ${t.separator}`},"&.cm-panels-bottom":{borderTop:`2px solid ${t.separator}`}},".cm-gutter.cm-lineNumbers":{"& .cm-gutterElement":{color:t.lineNumber,whiteSpace:"pre","&.cm-activeLineGutter":{color:t.lineNumberActive}}},".cm-gutter.cm-foldGutter":{"& .cm-gutterElement":{cursor:"pointer"},"&:not(:hover) .cm-gutterElement > .cm-gutterFoldMarker-open":{visibility:"hidden"}},".cm-foldPlaceholder":{backgroundColor:"transparent",border:"none",color:"unset",borderRadius:"2px","&:hover":{backgroundColor:t.selectionBackground}},".cm-searchMatch":{backgroundColor:t.searchMatchBackground,"&.cm-searchMatch-selected":{backgroundColor:t.searchMatchActiveBackground}},"&.cm-focused .cm-matchingBracket, &.cm-focused .cm-nonmatchingBracket":{backgroundColor:t.selectionBackground},".cm-tooltip.cm-tooltip-autocomplete":{padding:"4px",backgroundColor:t.backgroundLighter,color:t.text,"& > ul":{fontFamily:"inherit","& > li":{padding:"4px",borderRadius:"4px",display:"flex",alignItems:"center","&[aria-selected]":{background:"none",backgroundColor:t.backgroundLightest,color:"unset"},"& .cm-completionIcon":{lineHeight:"1","&:after":{fontVariantLigatures:"normal"},"&.cm-completionIcon-function:after":{content:"'\u0192'"},"&.cm-completionIcon-module:after":{content:"'m'"},"&.cm-completionIcon-struct:after":{content:"'\u2B58'"},"&.cm-completionIcon-interface:after":{content:"'*'"},"&.cm-completionIcon-type:after":{content:"'t'"},"&.cm-completionIcon-variable:after":{content:"'\u{1D465}'"},"&.cm-completionIcon-field:after":{content:"'\u2022'"},"&.cm-completionIcon-keyword:after":{content:"'\u26A1'"}}}},"& .cm-completionMatchedText":{textDecoration:"none",color:t.matchingText}},".cm-tooltip.cm-completionInfo":{borderRadius:"8px",backgroundColor:t.backgroundLighter,color:t.text,top:"0 !important",padding:"0","&.cm-completionInfo-right":{marginLeft:"4px"},"&.cm-completionInfo-left":{marginRight:"4px"},"& .cm-completionInfoDocs":{padding:"6px"}},".cm-tooltip .cm-hoverDocs":{maxWidth:"800px",maxHeight:"300px",overflowY:"auto",display:"flex",flexDirection:"column","& .cm-hoverDocsDefinitionLink":{padding:"4px 8px",cursor:"pointer",fontSize:"0.875em",fontFamily:i.sans,opacity:.8,borderBottom:`1px solid ${t.separator}`,"& i":{marginRight:"2px"}},"& .cm-hoverDocsContents":{padding:"8px",display:"flex",flexDirection:"column",gap:"64px"}},".cm-hoverDocsSelection":{backgroundColor:t.selectionMatchBackground},".cm-tooltip.cm-signatureHint":{"& .cm-signatureHintStepper":{borderColor:t.separator},"& .cm-signatureHintActiveArgument":{color:t.matchingText}},".cm-tooltip-lint":{display:"flex",flexDirection:"column",gap:"8px",maxWidth:"600px","& .cm-diagnostic":{display:"flex",border:"none",margin:"0","&::before":{content:"'\u279C'",fontVariantLigatures:"common-ligatures",fontSize:"1.5em",lineHeight:"1",whiteSpace:"nowrap",marginRight:"6px"},"&.cm-diagnostic-error::before":{color:"#be5046"},"&.cm-diagnostic-warning::before":{color:"#d19a66"}}},".cm-panel.cm-search":{display:"flex",alignItems:"center",flexWrap:"wrap",padding:"8px",background:t.background,"& br":{content:'" "',display:"block",width:"100%"},"& .cm-textfield":{borderRadius:"4px",border:`1px solid ${t.border}`,"&:focus":{outline:"none"}},"& .cm-button":{borderRadius:"4px",background:t.backgroundLightest,border:"none","&:focus-visible":{outline:`1px solid ${t.text}`}},"& label:first-of-type":{marginLeft:"8px"},"& label":{display:"inline-flex",alignItems:"center",gap:"4px"},"& label input":{appearance:"none",border:`1px solid ${t.backgroundLightest}`,borderRadius:"4px",width:"18px",height:"18px","&:checked":{backgroundImage:`url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e")`,backgroundColor:t.backgroundLightest,borderColor:"transparent"},"&:focus-visible":{outline:`1px solid ${t.text}`}},'& button[name="close"]':{display:"none"}},".cm-markdown":{"&":{fontFamily:i.sans},"& p":{marginTop:"0.5rem",marginBottom:"0.5rem"},"& hr":{borderTop:`1px solid ${t.separator}`,marginTop:"0.5rem",marginBottom:"0.5rem",marginRight:"-6px",marginLeft:"-6px"},"& a":{borderBottom:`1px solid ${t.text}`},"& h2":{marginTop:"0.5rem",marginBottom:"0.5rem",fontSize:"1.125em",fontWeight:"600"},"& ul":{marginTop:"1rem",marginBottom:"1rem",marginLeft:"2rem",listStylePosition:"outside",listStyleType:"disc","& ul":{listStyleType:"circle","& ul":{listStyleType:"square"}}},"& li":{marginTop:"0.25rem",marginBottom:"0.25rem","& > ul, & > ol":{marginTop:"0",marginBottom:"0"}},"& ol":{marginTop:"1rem",marginBottom:"1rem",marginLeft:"2rem",listStylePosition:"outside",listStyleType:"decimal"},"& code":{background:t.selectionBackground,borderRadius:"3px"},"& pre":{marginTop:"0.5rem",marginBottom:"0.5rem","& code":{background:"transparent",whiteSpace:"pre-wrap"}},"& > :first-child":{marginTop:"0"},"& > :last-child":{marginBottom:"0"}}},{dark:e})}function tR({base:t,lightRed:e,blue:i,gray:r,green:n,purple:o,red:s,teal:a,peach:l,yellow:c}){return gl.define([{tag:E.keyword,color:o},{tag:E.null,color:i},{tag:E.bool,color:i},{tag:E.number,color:i},{tag:E.string,color:n},{tag:E.special(E.string),color:c},{tag:E.character,color:i},{tag:E.escape,color:i},{tag:E.atom,color:i},{tag:E.variableName,color:t},{tag:E.special(E.variableName),color:e},{tag:[E.function(E.variableName),E.function(E.propertyName)],color:i},{tag:E.namespace,color:a},{tag:E.operator,color:l},{tag:E.comment,color:r},{tag:[E.docString,E.docComment],color:r},{tag:[E.paren,E.squareBracket,E.brace,E.angleBracket,E.separator],color:t},{tag:E.special(E.brace),color:s},{tag:E.strong,fontWeight:"bold"},{tag:E.emphasis,fontStyle:"italic"},{tag:E.strikethrough,textDecoration:"line-through"},{tag:E.link,color:i},{tag:E.heading,color:e},{tag:E.monospace,color:n},{tag:E.propertyName,color:e},{tag:E.tagName,color:o},{tag:E.className,color:l}])}var xte=eR({text:"#c8ccd4",background:"#282c34",backgroundLighter:"#2f343e",backgroundLightest:"#454a56",border:"#363c46",cursor:"#73ade8",activeLine:"#2d323b",selectionBackground:"#394c5f",inactiveSelectionBackground:"#29333d",selectionMatchBackground:"#343f4d",gutterText:"#c8ccd4",lineNumber:"#60646c",lineNumberActive:"#c8ccd4",matchingText:"#73ade8",searchMatchBackground:"#4c6582",searchMatchActiveBackground:"#54789e",separator:"#464b57"},{dark:!0}),vw=tR({base:"#c8ccd4",lightRed:"#e06c75",blue:"#61afef",gray:"#8c92a3",green:"#98c379",purple:"#c678dd",red:"#be5046",teal:"#56b6c2",peach:"#d19a66",yellow:"#e5c07b"}),iR=[xte,mx(vw)],vte=eR({text:"#383a41",background:"#fafafa",backgroundLighter:"#ebebec",backgroundLightest:"#cacaca",border:"#dfdfe0",cursor:"#5c79e2",activeLine:"#efeff0",selectionBackground:"#d4dbf4",inactiveSelectionBackground:"#ebeef9",selectionMatchBackground:"#d3d5e1",gutterText:"#383a41",lineNumber:"#b6b7b9",lineNumberActive:"#383a41",matchingText:"#73ade8",searchMatchBackground:"#bbc6f1",searchMatchActiveBackground:"#9daeec",separator:"#c9c9ca"},{dark:!1}),ww=tR({base:"#304254",lightRed:"#e45649",blue:"#4078F2",gray:"#707177",green:"#50a14f",purple:"#a726a4",red:"#ca1243",teal:"#0084bc",peach:"#986801",yellow:"#c18401"}),rR=[vte,mx(ww)];var hR=Qa(aR()),dR=Qa(cR()),kw=Qa(fR());function Il(){return/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)}function ss(t){return t.matches&&t.matches("input, textarea, [contenteditable]")}function Sw(t,e=0){let i=t.getBoundingClientRect();return i.bottom>=-e&&i.top<=window.innerHeight+e}function xn(t){return t.offsetParent===null}function OR(t){let e=null;return new Promise((i,r)=>{xn(t)?(e=new ResizeObserver(n=>{xn(t)||(e.disconnect(),i())}),e.observe(t)):i()})}function Kp(t,{root:e=null,proximity:i=0}={}){let r=null;return{promise:new Promise((s,a)=>{wte(t,i)?s():(r=new IntersectionObserver(l=>{l[0].isIntersecting&&(r.disconnect(),r=null,s())},{root:e,rootMargin:`${i}px`}),r.observe(t))}),cancel:()=>{r&&r.disconnect()}}}function wte(t,e=0){return!xn(t)&&Sw(t,e)}function pR(t,e,i){return Math.min(Math.max(t,e),i)}function mR(t){let e=window.getComputedStyle(t),i=parseInt(e.lineHeight,10);if(Number.isNaN(i)){let r=t.cloneNode();r.innerHTML="
",t.appendChild(r);let n=r.clientHeight;r.innerHTML="

";let o=r.clientHeight;return t.removeChild(r),o-n}else return i}function gR(t){let e=window.getSelection(),i=document.createRange();i.selectNodeContents(t),e.removeAllRanges(),e.addRange(i)}function ha(t){let{height:e}=t.getBoundingClientRect();e":">",'"':""","'":"'"};function Ef(t){return(t||"").replace(/[&<>"']/g,e=>kte[e])}function TR(t){let e=atob(t),i=new Uint8Array(e.length),r=i.byteLength;for(let n=0;n{setTimeout(()=>e(),t)})}function PR(){return/^((?!chrome|android).)*safari/i.test(navigator.userAgent)}function CR(t,e,i){let r={};for(let n in e)r[n]=t.style[n],t.style[n]=e[n];i(),Object.assign(t.style,r)}var Gt=class{constructor(){this.callbacks=[]}get event(){return this.addListener.bind(this)}addListener(e){return this.callbacks.push(e),{destroy:()=>{this.removeListener(e)}}}removeListener(e){let i=this.callbacks.indexOf(e);i!==-1&&this.callbacks.splice(i,1)}dispatch(...e){this.callbacks.forEach(i=>{i(...e)})}};var QR="settings",Pf={normal:14,large:16},Ste={default:"default",emacs:"emacs",vim:"vim"},zl={default:"default",light:"light"},Tte={editor_auto_completion:!0,editor_auto_signature:!0,editor_auto_close_brackets:!0,editor_font_size:Pf.normal,editor_theme:zl.default,editor_ligatures:!1,editor_markdown_word_wrap:!0,editor_mode:Ste.default,custom_view_show_section:!0,custom_view_show_markdown:!0,custom_view_show_output:!0,custom_view_spotlight:!1},Tw=class{constructor(){at(this,"_onChange",new Gt);this.settings=Tte,this.loadSettings()}get(){return this.settings}update(e){let i=this.settings;this.settings=F(F({},this.settings),e),this._onChange.dispatch(this.settings,i),this.storeSettings()}getAndSubscribe(e){return e(this.settings),this._onChange.addListener(e)}loadSettings(){let e=vs(QR);e&&(Object.values(zl).includes(e.editor_theme)||delete e.editor_theme,this.settings=F(F({},this.settings),e))}storeSettings(){La(QR,this.settings)}},wt=new Tw;function rm(t,e){let i=It.matchLanguageName(Zp,e);if(!i)return Ef(t);let r=Ete();qi.mount(window.document,r.module);let n=i.support.language.parser.parse(t),o="";return iQ(t,n,r,(s,a)=>{o+=`${Ef(s)}`},()=>{o+="
"}),o}function Ete(){return wt.get().editor_theme==="light"?ww:vw}var Cf=class{constructor(e){this.size=e,this.cache=new Map}get(e){if(this.cache.has(e)){let i=this.cache.get(e);return this.cache.delete(e),this.cache.set(e,i),i}else return}set(e,i){if(this.cache.has(e))this.cache.delete(e);else if(this.cache.size===this.size){let r=this.cache.keys().next().value;this.cache.delete(r)}this.cache.set(e,i)}};var Pte=0,Cte=()=>`mermaid-graph-${Pte++}`,Qte="5.15.4",_R=new Cf(25);function $R(t,e){let i=Jp(t),r=_R.get(i);return r?Promise.resolve(r):_te().then(n=>($te(t),n.initialize(F({startOnLoad:!1},e)),n.render(Cte(),t).then(({svg:o})=>(_R.set(i,o),o)).catch(o=>`
Mermaid +${d}end`,x=a.from+O.length;return{range:K.cursor(x),changes:[{from:a.from,to:a.to,insert:O+m}]}}return o=!1,{range:a}});return o?(i(e.update(s,{scrollIntoView:!0,userEvent:"input"})),!0):!1};function mte(t){let e=t;return e&&e.type.name==="do"&&(e=e.parent),e&&e.type.name==="Operator"&&(e=e.parent),e&&(e.type.name==="StabClause"||e.type.name==="fn")&&(e=e.parent),e&&MX(e)?e:null}function MX(t){return t.type.name==="DoBlock"||t.type.name==="AnonymousFunction"}function gte(t){var e,i;let r=t;for(;r;){if(MX(r)&&((i=(e=r.lastChild)===null||e===void 0?void 0:e.type)===null||i===void 0?void 0:i.name)!=="end")return!1;r=r.parent}return!0}var bte=[{key:"Enter",run:pte}];function qX(){let t=[Lt.high(ci.of(bte))];return new vt(NX,t)}var jX=It.of({name:"Elixir",support:qX()}),WX=It.of({name:"Erlang",support:new vt(Fu.define(fX))}),VX=It.of({name:"SQL",support:fA()}),ZX=It.of({name:"Python",support:VA()}),BX=It.of({name:"YAML",support:rX()}),YX=It.of({name:"JSON",support:mA()}),FX=It.of({name:"XML",support:TA()}),HX=It.of({name:"CSS",support:Ep()}),GX=It.of({name:"HTML",support:Qp()}),KX=It.of({name:"JavaScript",support:Pp()}),JX=It.of({name:"Dockerfile",support:new vt(Fu.define(bX))}),yte=It.of({name:"Markdown",support:H$({base:_p,codeLanguages:[jX,WX,VX,ZX,BX,YX,FX,HX,GX,KX,JX]})}),Zp=[jX,WX,VX,ZX,BX,YX,FX,HX,GX,KX,JX,yte];function eR(t,{dark:e}){let i={sans:"Inter",mono:"JetBrains Mono, monospace"};return fe.theme({"&":{color:t.text,backgroundColor:t.background,borderRadius:"8px",fontSize:"14px",fontFamily:i.mono,display:"inline-flex !important",width:"100%"},"&.cm-focused":{outline:"none"},".cm-scroller":{fontFamily:"inherit",padding:"0.75rem 0"},".cm-content":{caretColor:t.cursor,padding:"0"},"*":{"&":{scrollbarWidth:"thin",scrollbarColor:`${t.backgroundLightest} transparent`},"&::-webkit-scrollbar":{width:"8px",height:"8px"},"&::-webkit-scrollbar-thumb":{background:t.backgroundLightest},"&::-webkit-scrollbar-track":{background:"transparent"}},".cm-activeLine":{backgroundColor:"transparent"},"&.cm-focused:not(.cm-selecting) .cm-activeLine":{backgroundColor:t.activeLine},".cm-cursor, .cm-dropCursor":{borderLeft:"1px solid",borderRight:"1px solid",marginLeft:"-1px",marginRight:"-1px",borderColor:t.cursor},".cm-selectionBackground":{backgroundColor:t.inactiveSelectionBackground},"&.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{backgroundColor:t.selectionBackground},".cm-selectionMatch":{backgroundColor:t.selectionMatchBackground},"&:not(.cm-focused) .cm-fat-cursor":{outline:"none !important"},".cm-gutters":{backgroundColor:t.background,color:t.gutterText,border:"none"},".cm-gutters .cm-activeLineGutter":{backgroundColor:"transparent"},"&.cm-focused:not(.cm-selecting) .cm-gutters .cm-activeLineGutter":{backgroundColor:t.activeLine},".cm-tooltip":{backgroundColor:t.backgroundLighter,boxShadow:"0 2px 6px 0 rgba(0, 0, 0, 0.2)",color:t.text,borderRadius:"8px",border:`1px solid ${t.border}`,"& .cm-tooltip-arrow::before":{borderTopColor:t.backgroundLighter,borderBottomColor:t.backgroundLighter}},".cm-panels":{backgroundColor:"transparent",color:t.text,"&.cm-panels-top":{borderBottom:`2px solid ${t.separator}`},"&.cm-panels-bottom":{borderTop:`2px solid ${t.separator}`}},".cm-gutter.cm-lineNumbers":{"& .cm-gutterElement":{color:t.lineNumber,whiteSpace:"pre","&.cm-activeLineGutter":{color:t.lineNumberActive}}},".cm-gutter.cm-foldGutter":{"& .cm-gutterElement":{cursor:"pointer"},"&:not(:hover) .cm-gutterElement > .cm-gutterFoldMarker-open":{visibility:"hidden"}},".cm-foldPlaceholder":{backgroundColor:"transparent",border:"none",color:"unset",borderRadius:"2px","&:hover":{backgroundColor:t.selectionBackground}},".cm-searchMatch":{backgroundColor:t.searchMatchBackground,"&.cm-searchMatch-selected":{backgroundColor:t.searchMatchActiveBackground}},"&.cm-focused .cm-matchingBracket, &.cm-focused .cm-nonmatchingBracket":{backgroundColor:t.selectionBackground},".cm-tooltip.cm-tooltip-autocomplete":{padding:"4px",backgroundColor:t.backgroundLighter,color:t.text,"& > ul":{fontFamily:"inherit","& > li":{padding:"4px",borderRadius:"4px",display:"flex",alignItems:"center","&[aria-selected]":{background:"none",backgroundColor:t.backgroundLightest,color:"unset"},"& .cm-completionIcon":{lineHeight:"1","&:after":{fontVariantLigatures:"normal"},"&.cm-completionIcon-function:after":{content:"'\u0192'"},"&.cm-completionIcon-module:after":{content:"'m'"},"&.cm-completionIcon-struct:after":{content:"'\u2B58'"},"&.cm-completionIcon-interface:after":{content:"'*'"},"&.cm-completionIcon-type:after":{content:"'t'"},"&.cm-completionIcon-variable:after":{content:"'\u{1D465}'"},"&.cm-completionIcon-field:after":{content:"'\u2022'"},"&.cm-completionIcon-keyword:after":{content:"'\u26A1'"}}}},"& .cm-completionMatchedText":{textDecoration:"none",color:t.matchingText}},".cm-tooltip.cm-completionInfo":{borderRadius:"8px",backgroundColor:t.backgroundLighter,color:t.text,top:"0 !important",padding:"0","&.cm-completionInfo-right":{marginLeft:"4px"},"&.cm-completionInfo-left":{marginRight:"4px"},"& .cm-completionInfoDocs":{padding:"6px"}},".cm-tooltip .cm-hoverDocs":{maxWidth:"800px",maxHeight:"300px",overflowY:"auto",display:"flex",flexDirection:"column","& .cm-hoverDocsDefinitionLink":{padding:"4px 8px",cursor:"pointer",fontSize:"0.875em",fontFamily:i.sans,opacity:.8,borderBottom:`1px solid ${t.separator}`,"& i":{marginRight:"2px"}},"& .cm-hoverDocsContents":{padding:"8px",display:"flex",flexDirection:"column",gap:"64px"}},".cm-hoverDocsSelection":{backgroundColor:t.selectionMatchBackground},".cm-tooltip.cm-signatureHint":{"& .cm-signatureHintStepper":{borderColor:t.separator},"& .cm-signatureHintActiveArgument":{color:t.matchingText}},".cm-tooltip-lint":{display:"flex",flexDirection:"column",gap:"8px",maxWidth:"600px","& .cm-diagnostic":{display:"flex",border:"none",margin:"0","&::before":{content:"'\u279C'",fontVariantLigatures:"common-ligatures",fontSize:"1.5em",lineHeight:"1",whiteSpace:"nowrap",marginRight:"6px"},"&.cm-diagnostic-error::before":{color:"#be5046"},"&.cm-diagnostic-warning::before":{color:"#d19a66"}}},".cm-panel.cm-search":{display:"flex",alignItems:"center",flexWrap:"wrap",padding:"8px",background:t.background,"& br":{content:'" "',display:"block",width:"100%"},"& .cm-textfield":{borderRadius:"4px",border:`1px solid ${t.border}`,"&:focus":{outline:"none"}},"& .cm-button":{borderRadius:"4px",background:t.backgroundLightest,border:"none","&:focus-visible":{outline:`1px solid ${t.text}`}},"& label:first-of-type":{marginLeft:"8px"},"& label":{display:"inline-flex",alignItems:"center",gap:"4px"},"& label input":{appearance:"none",border:`1px solid ${t.backgroundLightest}`,borderRadius:"4px",width:"18px",height:"18px","&:checked":{backgroundImage:`url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e")`,backgroundColor:t.backgroundLightest,borderColor:"transparent"},"&:focus-visible":{outline:`1px solid ${t.text}`}},'& button[name="close"]':{display:"none"}},".cm-markdown":{"&":{fontFamily:i.sans},"& p":{marginTop:"0.5rem",marginBottom:"0.5rem"},"& hr":{borderTop:`1px solid ${t.separator}`,marginTop:"0.5rem",marginBottom:"0.5rem",marginRight:"-6px",marginLeft:"-6px"},"& a":{borderBottom:`1px solid ${t.text}`},"& h2":{marginTop:"0.5rem",marginBottom:"0.5rem",fontSize:"1.125em",fontWeight:"600"},"& ul":{marginTop:"1rem",marginBottom:"1rem",marginLeft:"2rem",listStylePosition:"outside",listStyleType:"disc","& ul":{listStyleType:"circle","& ul":{listStyleType:"square"}}},"& li":{marginTop:"0.25rem",marginBottom:"0.25rem","& > ul, & > ol":{marginTop:"0",marginBottom:"0"}},"& ol":{marginTop:"1rem",marginBottom:"1rem",marginLeft:"2rem",listStylePosition:"outside",listStyleType:"decimal"},"& code":{background:t.selectionBackground,borderRadius:"3px"},"& pre":{marginTop:"0.5rem",marginBottom:"0.5rem","& code":{background:"transparent",whiteSpace:"pre-wrap"}},"& > :first-child":{marginTop:"0"},"& > :last-child":{marginBottom:"0"}}},{dark:e})}function tR({base:t,lightRed:e,blue:i,gray:r,green:n,purple:o,red:s,teal:a,peach:l,yellow:c}){return gl.define([{tag:E.keyword,color:o},{tag:E.null,color:i},{tag:E.bool,color:i},{tag:E.number,color:i},{tag:E.string,color:n},{tag:E.special(E.string),color:c},{tag:E.character,color:i},{tag:E.escape,color:i},{tag:E.atom,color:i},{tag:E.variableName,color:t},{tag:E.special(E.variableName),color:e},{tag:[E.function(E.variableName),E.function(E.propertyName)],color:i},{tag:E.namespace,color:a},{tag:E.operator,color:l},{tag:E.comment,color:r},{tag:[E.docString,E.docComment],color:r},{tag:[E.paren,E.squareBracket,E.brace,E.angleBracket,E.separator],color:t},{tag:E.special(E.brace),color:s},{tag:E.strong,fontWeight:"bold"},{tag:E.emphasis,fontStyle:"italic"},{tag:E.strikethrough,textDecoration:"line-through"},{tag:E.link,color:i},{tag:E.heading,color:e},{tag:E.monospace,color:n},{tag:E.propertyName,color:e},{tag:E.tagName,color:o},{tag:E.className,color:l}])}var xte=eR({text:"#c8ccd4",background:"#282c34",backgroundLighter:"#2f343e",backgroundLightest:"#454a56",border:"#363c46",cursor:"#73ade8",activeLine:"#2d323b",selectionBackground:"#394c5f",inactiveSelectionBackground:"#29333d",selectionMatchBackground:"#343f4d",gutterText:"#c8ccd4",lineNumber:"#60646c",lineNumberActive:"#c8ccd4",matchingText:"#73ade8",searchMatchBackground:"#4c6582",searchMatchActiveBackground:"#54789e",separator:"#464b57"},{dark:!0}),vw=tR({base:"#c8ccd4",lightRed:"#e06c75",blue:"#61afef",gray:"#8c92a3",green:"#98c379",purple:"#c678dd",red:"#be5046",teal:"#56b6c2",peach:"#d19a66",yellow:"#e5c07b"}),iR=[xte,mx(vw)],vte=eR({text:"#383a41",background:"#fafafa",backgroundLighter:"#ebebec",backgroundLightest:"#cacaca",border:"#dfdfe0",cursor:"#5c79e2",activeLine:"#efeff0",selectionBackground:"#d4dbf4",inactiveSelectionBackground:"#ebeef9",selectionMatchBackground:"#d3d5e1",gutterText:"#383a41",lineNumber:"#b6b7b9",lineNumberActive:"#383a41",matchingText:"#73ade8",searchMatchBackground:"#bbc6f1",searchMatchActiveBackground:"#9daeec",separator:"#c9c9ca"},{dark:!1}),ww=tR({base:"#304254",lightRed:"#e45649",blue:"#4078F2",gray:"#707177",green:"#50a14f",purple:"#a726a4",red:"#ca1243",teal:"#0084bc",peach:"#986801",yellow:"#c18401"}),rR=[vte,mx(ww)];var hR=Qa(aR()),dR=Qa(cR()),kw=Qa(fR());function Il(){return/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)}function ss(t){return t.matches&&t.matches("input, textarea, [contenteditable]")}function Sw(t,e=0){let i=t.getBoundingClientRect();return i.bottom>=-e&&i.top<=window.innerHeight+e}function xn(t){return t.offsetParent===null}function OR(t){let e=null;return new Promise((i,r)=>{xn(t)?(e=new ResizeObserver(n=>{xn(t)||(e.disconnect(),i())}),e.observe(t)):i()})}function Kp(t,{root:e=null,proximity:i=0}={}){let r=null;return{promise:new Promise((s,a)=>{wte(t,i)?s():(r=new IntersectionObserver(l=>{l[0].isIntersecting&&(r.disconnect(),r=null,s())},{root:e,rootMargin:`${i}px`}),r.observe(t))}),cancel:()=>{r&&r.disconnect()}}}function wte(t,e=0){return!xn(t)&&Sw(t,e)}function pR(t,e,i){return Math.min(Math.max(t,e),i)}function mR(t){let e=window.getComputedStyle(t),i=parseInt(e.lineHeight,10);if(Number.isNaN(i)){let r=t.cloneNode();r.innerHTML="
",t.appendChild(r);let n=r.clientHeight;r.innerHTML="

";let o=r.clientHeight;return t.removeChild(r),o-n}else return i}function gR(t){let e=window.getSelection(),i=document.createRange();i.selectNodeContents(t),e.removeAllRanges(),e.addRange(i)}function ha(t){let{height:e}=t.getBoundingClientRect();e":">",'"':""","'":"'"};function Ef(t){return(t||"").replace(/[&<>"']/g,e=>kte[e])}function TR(t){let e=atob(t),i=new Uint8Array(e.length),r=i.byteLength;for(let n=0;n{setTimeout(()=>e(),t)})}function PR(){return/^((?!chrome|android).)*safari/i.test(navigator.userAgent)}function CR(t,e,i){let r={};for(let n in e)r[n]=t.style[n],t.style[n]=e[n];i(),Object.assign(t.style,r)}var Gt=class{constructor(){this.callbacks=[]}get event(){return this.addListener.bind(this)}addListener(e){return this.callbacks.push(e),{destroy:()=>{this.removeListener(e)}}}removeListener(e){let i=this.callbacks.indexOf(e);i!==-1&&this.callbacks.splice(i,1)}dispatch(...e){this.callbacks.forEach(i=>{i(...e)})}};var QR="settings",Pf={normal:14,large:16},Ste={default:"default",emacs:"emacs",vim:"vim"},zl={default:"default",light:"light"},Tte={editor_auto_completion:!0,editor_auto_signature:!0,editor_auto_close_brackets:!0,editor_font_size:Pf.normal,editor_theme:zl.default,editor_ligatures:!1,editor_markdown_word_wrap:!0,editor_mode:Ste.default,custom_view_show_section:!0,custom_view_show_markdown:!0,custom_view_show_output:!0,custom_view_spotlight:!1},Tw=class{constructor(){at(this,"_onChange",new Gt);this.settings=Tte,this.loadSettings()}get(){return this.settings}update(e){let i=this.settings;this.settings=F(F({},this.settings),e),this._onChange.dispatch(this.settings,i),this.storeSettings()}getAndSubscribe(e){return e(this.settings),this._onChange.addListener(e)}loadSettings(){let e=vs(QR);e&&(Object.values(zl).includes(e.editor_theme)||delete e.editor_theme,this.settings=F(F({},this.settings),e))}storeSettings(){La(QR,this.settings)}},wt=new Tw;function rm(t,e){let i=It.matchLanguageName(Zp,e);if(!i)return Ef(t);let r=Ete();qi.mount(window.document,r.module);let n=i.support.language.parser.parse(t),o="";return iQ(t,n,r,(s,a)=>{o+=`${Ef(s)}`},()=>{o+="
"}),o}function Ete(){return wt.get().editor_theme==="light"?ww:vw}var Cf=class{constructor(e){this.size=e,this.cache=new Map}get(e){if(this.cache.has(e)){let i=this.cache.get(e);return this.cache.delete(e),this.cache.set(e,i),i}else return}set(e,i){if(this.cache.has(e))this.cache.delete(e);else if(this.cache.size===this.size){let r=this.cache.keys().next().value;this.cache.delete(r)}this.cache.set(e,i)}};var Pte=0,Cte=()=>`mermaid-graph-${Pte++}`,Qte="5.15.4",_R=new Cf(25);function $R(t,e){let i=Jp(t),r=_R.get(i);return r?Promise.resolve(r):_te().then(n=>($te(t),n.initialize(F({startOnLoad:!1},e)),n.render(Cte(),t).then(({svg:o})=>(_R.set(i,o),o)).catch(o=>`
Mermaid ${o.message}
`)))}function _te(){return import("./mermaid.core-VS3K6XUD.js").then(({default:t})=>t)}function $te(t){let e=`https://cdnjs.cloudflare.com/ajax/libs/font-awesome/${Qte}/css/all.min.css`;if(t.includes("fa:")&&!document.querySelector(`link[href="${e}"]`)){let i=document.createElement("link");i.rel="stylesheet",i.type="text/css",i.href=e,document.head.appendChild(i)}}var Ew=class{constructor(e,i,{baseUrl:r=null,defaultCodeLanguage:n=null,emptyText:o="",allowedUriSchemes:s=[],useDarkTheme:a=!1}={}){this.container=e,this.content=i,this.baseUrl=r,this.defaultCodeLanguage=n,this.emptyText=o,this.allowedUriSchemes=s,this.useDarkTheme=a,this.render()}setContent(e){this.content=e,this.render()}render(){this.getHtml().then(e=>{let i=`
${e}
`;iT(this.container,i,{childrenOnly:!0})})}getHtml(){return Mh().use(Kh).use(ld).use(cd).use(Ite).use(Xte,{highlight:rm,defaultLanguage:this.defaultCodeLanguage}).use(bd,{allowDangerousHtml:!0}).use(Wd).use(Rte,{baseUrl:this.baseUrl}).use(Yd,Ate(this.allowedUriSchemes)).use(Zd).use(zte,{useDarkTheme:this.useDarkTheme}).use(Dte,{baseUrl:this.baseUrl}).use(eO,{closeEmptyElements:!0}).process(this.content).then(e=>String(e)).catch(e=>{console.error(`Failed to render markdown, reason: ${e.message}`)}).then(e=>e||`
${this.emptyText} diff --git a/static/favicon-errored.svg b/static/favicons/favicon-errored.svg similarity index 100% rename from static/favicon-errored.svg rename to static/favicons/favicon-errored.svg diff --git a/static/favicon-evaluating.svg b/static/favicons/favicon-evaluating.svg similarity index 100% rename from static/favicon-evaluating.svg rename to static/favicons/favicon-evaluating.svg diff --git a/static/favicon-stale.svg b/static/favicons/favicon-stale.svg similarity index 100% rename from static/favicon-stale.svg rename to static/favicons/favicon-stale.svg diff --git a/static/favicon.png b/static/favicons/favicon.png similarity index 100% rename from static/favicon.png rename to static/favicons/favicon.png diff --git a/static/favicon.svg b/static/favicons/favicon.svg similarity index 100% rename from static/favicon.svg rename to static/favicons/favicon.svg diff --git a/test/livebook_web/plugs/file_system_provider_test.exs b/test/livebook_web/plugs/file_system_provider_test.exs deleted file mode 100644 index f57bf942d..000000000 --- a/test/livebook_web/plugs/file_system_provider_test.exs +++ /dev/null @@ -1,21 +0,0 @@ -defmodule LivebookWeb.FileSystemProviderTest do - use ExUnit.Case, async: true - - defmodule MyProvider do - use LivebookWeb.FileSystemProvider, - from: Path.expand("../../support/static", __DIR__) - end - - test "includes regular files" do - assert %{content: content} = MyProvider.get_file(["js", "app.js"], nil) - assert content =~ ~s{console.log("Hello");} - end - - test "ignores directories" do - assert nil == MyProvider.get_file(["js"], nil) - end - - test "ignores non-existent files" do - assert nil == MyProvider.get_file(["nonexistent.js"], nil) - end -end diff --git a/test/livebook_web/plugs/memory_provider_test.exs b/test/livebook_web/plugs/memory_provider_test.exs deleted file mode 100644 index 3be844f2f..000000000 --- a/test/livebook_web/plugs/memory_provider_test.exs +++ /dev/null @@ -1,22 +0,0 @@ -defmodule LivebookWeb.MemoryProviderTest do - use ExUnit.Case, async: true - - defmodule MyProvider do - use LivebookWeb.MemoryProvider, - from: Path.expand("../../support/static", __DIR__), - gzip: true - end - - test "includes uncompressed files that are not gzippable" do - assert %{content: ""} = MyProvider.get_file(["icon.ico"], nil) - end - - test "includes compressed files which are gzippable" do - assert %{content: content} = MyProvider.get_file(["js", "app.js"], :gzip) - assert :zlib.gunzip(content) =~ ~s{console.log("Hello");} - end - - test "does not include uncompressed files that are gzippable" do - assert nil == MyProvider.get_file(["js", "app.js"], nil) - end -end diff --git a/test/livebook_web/plugs/static_plug_test.exs b/test/livebook_web/plugs/static_plug_test.exs deleted file mode 100644 index e5b0ab12a..000000000 --- a/test/livebook_web/plugs/static_plug_test.exs +++ /dev/null @@ -1,66 +0,0 @@ -defmodule LivebookWeb.StaticPlugTest do - use ExUnit.Case, async: true - use Plug.Test - - defmodule MyProvider do - @behaviour LivebookWeb.StaticPlug.Provider - - @impl true - def get_file(["app.js"], :gzip) do - %LivebookWeb.StaticPlug.File{content: "content", digest: "digest"} - end - - def get_file(["icon.ico"], nil) do - %LivebookWeb.StaticPlug.File{content: "content", digest: "digest"} - end - - def get_file(_path, _compression), do: nil - end - - defmodule MyPlug do - use Plug.Builder - - plug LivebookWeb.StaticPlug, - at: "/", - file_provider: MyProvider, - gzip: true - - plug :passthrough - - defp passthrough(conn, _), do: Plug.Conn.send_resp(conn, 404, "Passthrough") - end - - defp call(conn), do: MyPlug.call(conn, []) - - test "serves uncompressed file if there is no compressed version" do - conn = - conn(:get, "/icon.ico") - |> put_req_header("accept-encoding", "gzip") - |> call() - - assert conn.status == 200 - assert conn.resp_body == "content" - assert get_resp_header(conn, "content-type") == ["image/vnd.microsoft.icon"] - assert get_resp_header(conn, "etag") == [~s{"digest"}] - end - - test "serves the compressed file if available" do - conn = - conn(:get, "/app.js") - |> put_req_header("accept-encoding", "gzip") - |> call() - - assert conn.status == 200 - assert get_resp_header(conn, "content-encoding") == ["gzip"] - assert get_resp_header(conn, "content-type") == ["text/javascript"] - assert get_resp_header(conn, "etag") == [~s{"digest"}] - end - - test "ignores unavailable paths" do - conn = - conn(:get, "/invalid.js") - |> call() - - assert conn.status == 404 - end -end