commit ae81c39db68b930709f0d96bbd6af925d34fa1f5 Author: Mikko Ahlroth Date: Sat Jan 30 09:54:51 2021 +0200 Initial commit diff --git a/.formatter.exs b/.formatter.exs new file mode 100644 index 0000000..4761678 --- /dev/null +++ b/.formatter.exs @@ -0,0 +1,4 @@ +[ + import_deps: [:phoenix], + inputs: ["*.{ex,exs}", "{config,lib,test}/**/*.{ex,exs}"] +] diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..55bebcc --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +# The directory Mix will write compiled artifacts to. +/_build/ + +# If you run "mix test --cover", coverage assets end up here. +/cover/ + +# The directory Mix downloads your dependencies sources to. +/deps/ + +# Where 3rd-party dependencies like ExDoc output generated docs. +/doc/ + +# Ignore .fetch files in case you like to edit your project deps locally. +/.fetch + +# If the VM crashes, it generates a dump, let's ignore it too. +erl_crash.dump + +# Also ignore archive artifacts (built via "mix archive.build"). +*.ez + +# Ignore package tarball (built via "mix hex.build"). +flag_quiz-*.tar + +# If NPM crashes, it generates a log, let's ignore it too. +npm-debug.log diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000..75babc3 --- /dev/null +++ b/.tool-versions @@ -0,0 +1,2 @@ +elixir 1.11.3-otp-23 +erlang 23.2.2 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ea03b4f --- /dev/null +++ b/LICENSE @@ -0,0 +1,63 @@ +priv/static/css/app.css contains water.css code under the following license: + +The MIT License + +Copyright © 2019 Kognise + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +------ + +priv/static/css/flag-icon.css and the priv/static/flags folder contain flag-icon-css files under the following license: + +The MIT License + +Copyright (c) 2013 Panayiotis Lipiridis + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +------ + +The rest of the program is under the following license: + +The MIT License + +Copyright (c) 2021 Mikko Ahlroth, Jenni Ahlroth + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..c05581c --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# FlagQuiz + +To start your Phoenix server: + + * Install dependencies with `mix deps.get` + * Start Phoenix endpoint with `mix phx.server` + +Now you can visit [`localhost:3759`](http://localhost:3759) from your browser. + +Ready to run in production? Please [check our deployment guides](https://hexdocs.pm/phoenix/deployment.html). + +## Learn more + + * Official website: https://www.phoenixframework.org/ + * Guides: https://hexdocs.pm/phoenix/overview.html + * Docs: https://hexdocs.pm/phoenix + * Forum: https://elixirforum.com/c/phoenix-forum + * Source: https://github.com/phoenixframework/phoenix diff --git a/config/config.exs b/config/config.exs new file mode 100644 index 0000000..bd1c7b1 --- /dev/null +++ b/config/config.exs @@ -0,0 +1,24 @@ +# This file is responsible for configuring your application +# and its dependencies with the aid of the Mix.Config module. +# +# This configuration file is loaded before any dependency and +# is restricted to this project. + +# General application configuration +use Mix.Config + +# Configures the endpoint +config :flag_quiz, FlagQuizWeb.Endpoint, + url: [host: "localhost"], + secret_key_base: "ZeKBbuN9UnxXPr3qvTIaK3qumLoHg9GblL9mkrjJYg3rEhlwgnV4ss5EQ65h5cqs", + render_errors: [view: FlagQuizWeb.ErrorView, accepts: ~w(html json), layout: false], + pubsub_server: FlagQuiz.PubSub, + live_view: [signing_salt: "lU6F5ijV"] + +# Configures Elixir's Logger +config :logger, :console, + format: "$time $metadata[$level] $message\n", + metadata: [:request_id] + +# Use Jason for JSON parsing in Phoenix +config :phoenix, :json_library, Jason diff --git a/config/runtime.exs b/config/runtime.exs new file mode 100644 index 0000000..783e5c0 --- /dev/null +++ b/config/runtime.exs @@ -0,0 +1,67 @@ +import Config +import FlagQuiz.ConfigHelpers, only: [get_env: 3, get_env: 2, get_env: 1] + +port = get_env("PORT", 3759, :int) +host = get_env("HOST", "localhost") +host_port = get_env("HOST_PORT", 3759, :int) +url_scheme = if host_port == 443, do: "https", else: "http" + +# Configures the endpoint +config :flag_quiz, FlagQuizWeb.Endpoint, + http: [port: port], + url: [ + host: host, + port: host_port, + scheme: url_scheme + ] + +config :flag_quiz, + secret_msg: get_env("SECRET_MSG", "NOT_SET") + +case Config.config_env() do + # PROD ENV CONFIG + + :prod -> + # Finally, we also include the path to a manifest + # containing the digested version of static files. This + # manifest is generated by the mix phoenix.digest task + # which you typically run after static files are built. + config :flag_quiz, FlagQuizWeb.Endpoint, + cache_static_manifest: "priv/static/cache_manifest.json", + secret_key_base: get_env("SECRET_KEY_BASE"), + live_view: [signing_salt: get_env("LV_SIGNING_SALT")] + + # Required when using releases + server: true + + # Do not print debug messages in production + config :logger, level: :error + + # DEV ENV CONFIG + + :dev -> + # For development, we disable any cache and enable + # debugging and code reloading. + # + # The watchers configuration can be used to run external + # watchers to your application. For example, we use it + # with brunch.io to recompile .js and .css sources. + config :flag_quiz, FlagQuizWeb.Endpoint, + secret_key_base: "gWdaZrx0+CB8iuwoC1LMNUD2Lp37PCqvv73Dgid6k+jESaQFWguzrf2hDAoIYE4U" + + # Watch static and templates for browser reloading. + config :flag_quiz, FlagQuizWeb.Endpoint, + live_reload: [ + patterns: [ + ~r"priv/static/.*(js|css|png|jpeg|jpg|gif|svg)$", + ~r"priv/gettext/.*(po)$", + ~r"lib/flag_quiz_web/(live|views)/.*(ex)$", + ~r"lib/flag_quiz_web/templates/.*(eex)$" + ] + ] + + # Set a higher stacktrace during development. + # Do not configure such in production as keeping + # and calculating stacktraces is usually expensive. + config :phoenix, :stacktrace_depth, 20 +end diff --git a/lib/flag_quiz/application.ex b/lib/flag_quiz/application.ex new file mode 100644 index 0000000..b005b9c --- /dev/null +++ b/lib/flag_quiz/application.ex @@ -0,0 +1,32 @@ +defmodule FlagQuiz.Application do + # See https://hexdocs.pm/elixir/Application.html + # for more information on OTP Applications + @moduledoc false + + use Application + + def start(_type, _args) do + children = [ + # Start the Telemetry supervisor + FlagQuizWeb.Telemetry, + # Start the PubSub system + {Phoenix.PubSub, name: FlagQuiz.PubSub}, + # Start the Endpoint (http/https) + FlagQuizWeb.Endpoint + # Start a worker by calling: FlagQuiz.Worker.start_link(arg) + # {FlagQuiz.Worker, arg} + ] + + # See https://hexdocs.pm/elixir/Supervisor.html + # for other strategies and supported options + opts = [strategy: :one_for_one, name: FlagQuiz.Supervisor] + Supervisor.start_link(children, opts) + end + + # Tell Phoenix to update the endpoint configuration + # whenever the application is updated. + def config_change(changed, _new, removed) do + FlagQuizWeb.Endpoint.config_change(changed, removed) + :ok + end +end diff --git a/lib/flag_quiz/config_helpers.ex b/lib/flag_quiz/config_helpers.ex new file mode 100644 index 0000000..f70003a --- /dev/null +++ b/lib/flag_quiz/config_helpers.ex @@ -0,0 +1,35 @@ +defmodule FlagQuiz.ConfigHelpers do + @type config_type :: :str | :int | :bool | :json + + @doc """ + Get value from environment variable, converting it to the given type if needed. + + If no default value is given, or `:no_default` is given as the default, an error is raised if the variable is not + set. + """ + @spec get_env(String.t(), :no_default | any(), config_type()) :: any() + def get_env(var, default \\ :no_default, type \\ :str) + + def get_env(var, :no_default, type) do + System.fetch_env!(var) + |> get_with_type(type) + end + + def get_env(var, default, type) do + with {:ok, val} <- System.fetch_env(var) do + get_with_type(val, type) + else + :error -> default + end + end + + @spec get_with_type(String.t(), config_type()) :: any() + defp get_with_type(val, type) + + defp get_with_type(val, :str), do: val + defp get_with_type(val, :int), do: String.to_integer(val) + defp get_with_type("true", :bool), do: true + defp get_with_type("false", :bool), do: false + defp get_with_type(val, :json), do: Jason.decode!(val) + defp get_with_type(val, type), do: raise("Cannot convert to #{inspect(type)}: #{inspect(val)}") +end diff --git a/lib/flag_quiz/flags.ex b/lib/flag_quiz/flags.ex new file mode 100644 index 0000000..724389d --- /dev/null +++ b/lib/flag_quiz/flags.ex @@ -0,0 +1,282 @@ +defmodule FlagQuiz.Flags do + @flags [ + {"AD", ["Andorra"]}, + {"AE", + ["United Arab Emirates", "Arabiemiirikunnat", "Emiraatit", "Yhdistyneet arabiemiirikunnat"]}, + {"AF", ["Afghanistan", "Afganistan"]}, + {"AG", ["Antigua and Barbuda", "Antigua ja Barbuda"]}, + # {"AI", ["Anguilla"]}, + {"AL", ["Albania"]}, + {"AM", ["Armenia"]}, + {"AO", ["Angola"]}, + # {"AQ", ["Antarctica"]}, + {"AR", ["Argentina", "Argentiina"]}, + # {"AS", ["American Samoa"]}, + {"AT", ["Austria", "Itävalta"]}, + {"AU", ["Australia"]}, + # {"AW", ["Aruba"]}, + # {"AX", ["Åland Islands", "Ahvenanmaa"]}, + {"AZ", ["Azerbaijan", "Azerbaidzan"]}, + {"BA", ["Bosnia and Herzegovina", "Bosnia ja Hertsegovina"]}, + {"BB", ["Barbados"]}, + {"BD", ["Bangladesh"]}, + {"BE", ["Belgium", "Belgia"]}, + {"BF", ["Burkina Faso"]}, + {"BG", ["Bulgaria"]}, + {"BH", ["Bahrain"]}, + {"BI", ["Burundi"]}, + {"BJ", ["Benin"]}, + # {"BL", ["Saint Barthélemy"]}, + # {"BM", ["Bermuda"]}, + {"BN", ["Brunei Darussalam", "Brunei"]}, + {"BO", ["Bolivia, Plurinational State of", "Bolivia"]}, + # {"BQ", ["Caribbean Netherlands"]}, + {"BR", ["Brazil", "Brasilia"]}, + {"BS", ["Bahamas", "The Bahamas", "Bahama"]}, + {"BT", ["Bhutan"]}, + # {"BV", ["Bouvet Island"]}, + {"BW", ["Botswana"]}, + {"BY", ["Belarus", "Valko-Venäjä"]}, + {"BZ", ["Belize"]}, + {"CA", ["Canada", "Kanada"]}, + # {"CC", ["Cocos (Keeling) Islands"]}, + {"CD", + [ + "Congo, the Democratic Republic of the", + "Congo-Kinshasa", + "DRC", + "DROC", + "Congo", + "Kongo", + "Kongon demokraattinen tasavalta", + "Kongo-Kinshasa", + "Kinshasan Kongo" + ]}, + {"CF", ["Central African Republic", "Keski-Afrikka"]}, + {"CG", ["Congo", "Congo Rebublic", "Kongo", "Kongon tasavalta"]}, + {"CH", ["Switzerland", "Sveitsi"]}, + {"CI", ["Côte d'Ivoire", "Ivory Coast", "Norsunluurannikko"]}, + # {"CK", ["Cook Islands"]}, + {"CL", ["Chile"]}, + {"CM", ["Cameroon", "Kamerun"]}, + {"CN", ["China", "Kiina"]}, + {"CO", ["Colombia", "Kolumbia"]}, + {"CR", ["Costa Rica"]}, + {"CU", ["Cuba", "Kuuba"]}, + {"CV", ["Cape Verde", "Kap Verde"]}, + # {"CW", ["Curaçao"]}, + # {"CX", ["Christmas Island"]}, + {"CY", ["Cyprus", "Kypros"]}, + {"CZ", ["Czech Republic", "Czechia", "Tsekki", "Tsekki"]}, + {"DE", ["Germany", "Saksa"]}, + {"DJ", ["Djibouti"]}, + {"DK", ["Denmark", "Tanska"]}, + {"DM", ["Dominica"]}, + {"DO", ["Dominican Republic", "Dominikaaninen tasavalta"]}, + {"DZ", ["Algeria"]}, + {"EC", ["Ecuador"]}, + {"EE", ["Estonia", "Viro"]}, + {"EG", ["Egypt", "Egypti"]}, + {"EH", ["Western Sahara", "Länsi-Sahara"]}, + {"ER", ["Eritrea"]}, + {"ES", ["Spain", "Espanja"]}, + {"ET", ["Ethiopia", "Etiopia"]}, + {"FI", ["Finland", "Suomi"]}, + {"FJ", ["Fiji", "Fidzi"]}, + {"FM", ["Micronesia, Federated States of", "Micronesia", "Mikronesia"]}, + {"FR", ["France", "Ranska"]}, + {"GA", ["Gabon"]}, + {"GB", ["UK", "United Kingdom", "Iso-Britannia", "Yhdistynyt kuningaskunta"]}, + {"GD", ["Grenada"]}, + {"GE", ["Georgia"]}, + # {"GG", ["Guernsey"]}, + {"GH", ["Ghana"]}, + # {"GI", ["Gibraltar"]}, + # {"GL", ["Greenland"]}, + {"GM", ["Gambia"]}, + {"GN", ["Guinea"]}, + # {"GP", ["Guadeloupe"]}, + {"GQ", ["Equatorial Guinea", "Päiväntasaajan Guinea"]}, + {"GR", ["Greece", "Kreikka"]}, + # {"GS", ["South Georgia and the South Sandwich Islands"]}, + {"GT", ["Guatemala"]}, + {"GU", ["Guam"]}, + {"GW", ["Guinea-Bissau"]}, + {"GY", ["Guyana"]}, + # {"HK", ["Hong Kong"]}, + # {"HM", ["Heard Island and McDonald Islands"]}, + {"HN", ["Honduras"]}, + {"HR", ["Croatia", "Kroatia"]}, + {"HT", ["Haiti"]}, + {"HU", ["Hungary", "Unkari"]}, + {"ID", ["Indonesia"]}, + {"IE", ["Ireland", "Irlanti"]}, + {"IL", ["Israel"]}, + # {"IM", ["Isle of Man"]}, + {"IN", ["India", "Intia"]}, + # {"IO", ["British Indian Ocean Territory"]}, + {"IQ", ["Iraq", "Irak"]}, + {"IR", ["Iran, Islamic Republic of", "Iran"]}, + {"IS", ["Iceland", "Islanti"]}, + {"IT", ["Italy", "Italia"]}, + # {"JE", ["Jersey"]}, + {"JM", ["Jamaica", "Jamaika"]}, + {"JO", ["Jordan", "Jordania"]}, + {"JP", ["Japan", "Japani"]}, + {"KE", ["Kenya", "Kenia"]}, + {"KG", ["Kyrgyzstan", "Kirgisia"]}, + {"KH", ["Cambodia", "Kambodza"]}, + {"KI", ["Kiribati"]}, + {"KM", ["Comoros", "Komorit", "Komorien liitto"]}, + {"KN", ["Saint Kitts and Nevis", "Saint Kitts ja Nevis"]}, + {"KP", + [ + "Korea, Democratic People's Republic of", + "Democratic People's Republic of Korea", + "North Korea", + "Pohjois-Korea" + ]}, + {"KR", ["Korea, Republic of", "Korea", "Republic of Korea", "South Korea", "Etelä-Korea"]}, + {"KW", ["Kuwait", "Kuwait"]}, + # {"KY", ["Cayman Islands"]}, + {"KZ", ["Kazakhstan", "Kazakstan"]}, + {"LA", ["Lao People's Democratic Republic", "Laos"]}, + {"LB", ["Lebanon", "Libanon"]}, + {"LC", ["Saint Lucia"]}, + {"LI", ["Liechtenstein"]}, + {"LK", ["Sri Lanka"]}, + {"LR", ["Liberia"]}, + {"LS", ["Lesotho"]}, + {"LT", ["Lithuania", "Liettua"]}, + {"LU", ["Luxembourg", "Luxemburg"]}, + {"LV", ["Latvia"]}, + {"LY", ["Libya", "Libya"]}, + {"MA", ["Morocco", "Marokko"]}, + {"MC", ["Monaco"]}, + {"MD", ["Moldova, Republic of", "Moldova"]}, + {"ME", ["Montenegro"]}, + # {"MF", ["Saint Martin"]}, + {"MG", ["Madagascar", "Madagaskar"]}, + {"MH", ["Marshall Islands", "Marshallsaaret", "Marshallinsaaret"]}, + {"MK", + ["Macedonia, the former Yugoslav Republic of", "Macedonia", "Pohjois-Makedonia", "Makedonia"]}, + {"ML", ["Mali"]}, + {"MM", ["Myanmar", "Burma"]}, + {"MN", ["Mongolia"]}, + # {"MO", ["Macao"]}, + # {"MP", ["Northern Mariana Islands"]}, + # {"MQ", ["Martinique"]}, + {"MR", ["Mauritania"]}, + # {"MS", ["Montserrat"]}, + {"MT", ["Malta"]}, + {"MU", ["Mauritius"]}, + {"MV", ["Maldives", "Malediivit"]}, + {"MW", ["Malawi"]}, + {"MX", ["Mexico", "Meksiko"]}, + {"MY", ["Malaysia", "Malesia"]}, + {"MZ", ["Mozambique", "Mosambik"]}, + {"NA", ["Namibia"]}, + # {"NC", ["New Caledonia"]}, + {"NE", ["Niger"]}, + # {"NF", ["Norfolk Island"]}, + {"NG", ["Nigeria"]}, + {"NI", ["Nicaragua"]}, + {"NL", ["Netherlands", "Alankomaat", "Hollanti"]}, + {"NO", ["Norway", "Norja"]}, + {"NP", ["Nepal"]}, + {"NR", ["Nauru"]}, + {"NU", ["Niue"]}, + {"NZ", ["New Zealand", "Uusi-Seelanti"]}, + {"OM", ["Oman"]}, + {"PA", ["Panama"]}, + {"PE", ["Peru"]}, + # {"PF", ["French Polynesia"]}, + {"PG", ["Papua New Guinea", "Papua-Uusi-Guinea"]}, + {"PH", ["Philippines", "Filippiinit"]}, + {"PK", ["Pakistan"]}, + {"PL", ["Poland", "Puola"]}, + # {"PM", ["Saint Pierre and Miquelon"]}, + # {"PN", ["Pitcairn"]}, + # {"PR", ["Puerto Rico"]}, + {"PS", ["Palestine", "Palestiina", "Palestiinalaisalueet"]}, + {"PT", ["Portugal", "Portugali"]}, + {"PW", ["Palau"]}, + {"PY", ["Paraguay"]}, + {"QA", ["Qatar"]}, + # {"RE", ["Réunion"]}, + {"RO", ["Romania"]}, + {"RS", ["Serbia"]}, + {"RU", ["Russian Federation", "Russia", "Venäjä"]}, + {"RW", ["Rwanda", "Ruanda"]}, + {"SA", ["Saudi Arabia"]}, + {"SB", ["Solomon Islands", "Salomonsaaret"]}, + {"SC", ["Seychelles", "Seychellit"]}, + {"SD", ["Sudan"]}, + {"SE", ["Sweden", "Ruotsi"]}, + {"SG", ["Singapore"]}, + # {"SH", ["Saint Helena, Ascension and Tristan da Cunha"]}, + {"SI", ["Slovenia"]}, + # {"SJ", ["Svalbard and Jan Mayen Islands"]}, + {"SK", ["Slovakia"]}, + {"SL", ["Sierra Leone"]}, + {"SM", ["San Marino"]}, + {"SN", ["Senegal"]}, + {"SO", ["Somalia"]}, + {"SR", ["Suriname", "Surinam"]}, + {"SS", ["South Sudan", "Etelä-Sudan"]}, + {"ST", ["Sao Tome and Principe", "Sao Tome ja Principe"]}, + {"SV", ["El Salvador"]}, + # {"SX", ["Sint Maarten (Dutch part)"]}, + {"SY", ["Syrian Arab Republic", "Syyria"]}, + {"SZ", ["Swaziland", "Swasimaa"]}, + # {"TC", ["Turks and Caicos Islands"]}, + {"TD", ["Chad", "Tsad"]}, + # {"TF", ["French Southern Territories"]}, + {"TG", ["Togo"]}, + {"TH", ["Thailand", "Thaimaa"]}, + {"TJ", ["Tajikistan", "Tadzikistan"]}, + # {"TK", ["Tokelau"]}, + {"TL", ["Timor-Leste", "East-Timor", "Itä-Timor"]}, + {"TM", ["Turkmenistan"]}, + {"TN", ["Tunisia"]}, + {"TO", ["Tonga"]}, + {"TR", ["Turkey", "Turkki"]}, + {"TT", ["Trinidad and Tobago", "Trinidad ja Tobaco"]}, + {"TV", ["Tuvalu"]}, + {"TW", ["Taiwan"]}, + {"TZ", ["Tanzania, United Republic of", "Tanzania", "Tansania"]}, + {"UA", ["Ukraine", "Ukraina"]}, + {"UG", ["Uganda"]}, + # {"UM", ["US Minor Outlying Islands"]}, + # {"UN", ["United Nations"]}, + {"US", + [ + "United States", + "USA", + "Yhdysvallat", + "United States of America", + "The United States of America" + ]}, + {"UY", ["Uruguay"]}, + {"UZ", ["Uzbekistan"]}, + {"VA", ["Holy See", "Vatican City", "Vatican", "Vatikaani", "Vatikaanivaltio"]}, + {"VC", ["Saint Vincent and the Grenadines", "Saint Vincent ja Grenadiinit"]}, + {"VE", ["Venezuela, Bolivarian Republic of", "Venezuela"]}, + # {"VG", ["Virgin Islands, British"]}, + # {"VI", ["Virgin Islands, U.S."]}, + {"VN", ["Viet Nam", "Vietnam"]}, + {"VU", ["Vanuatu"]}, + # {"WF", ["Wallis and Futuna Islands"]}, + {"WS", ["Samoa"]}, + # {"XK", ["Kosovo"]}, + {"YE", ["Yemen", "Jemen"]}, + # {"YT", ["Mayotte"]}, + {"ZA", ["South Africa", "Etelä-Afrikka"]}, + {"ZM", ["Zambia", "Sambia"]}, + {"ZW", ["Zimbabwe"]} + ] + + def get_quiz_set(amount) do + Enum.take_random(@flags, amount) + end +end diff --git a/lib/flag_quiz_web.ex b/lib/flag_quiz_web.ex new file mode 100644 index 0000000..0566534 --- /dev/null +++ b/lib/flag_quiz_web.ex @@ -0,0 +1,83 @@ +defmodule FlagQuizWeb do + @moduledoc """ + The entrypoint for defining your web interface, such + as controllers, views, channels and so on. + + This can be used in your application as: + + use FlagQuizWeb, :controller + use FlagQuizWeb, :view + + The definitions below will be executed for every view, + controller, etc, so keep them short and clean, focused + on imports, uses and aliases. + + Do NOT define functions inside the quoted expressions + below. Instead, define any helper function in modules + and import those modules here. + """ + + def view do + quote do + use Phoenix.View, + root: "lib/flag_quiz_web/templates", + namespace: FlagQuizWeb + + # Import convenience functions from controllers + import Phoenix.Controller, + only: [get_flash: 1, get_flash: 2, view_module: 1, view_template: 1] + + # Include shared imports and aliases for views + unquote(view_helpers()) + end + end + + def live_view do + quote do + use Phoenix.LiveView, + layout: {FlagQuizWeb.LayoutView, "live.html"} + + unquote(view_helpers()) + end + end + + def live_component do + quote do + use Phoenix.LiveComponent + + unquote(view_helpers()) + end + end + + def router do + quote do + use Phoenix.Router + + import Plug.Conn + import Phoenix.Controller + import Phoenix.LiveView.Router + end + end + + defp view_helpers do + quote do + # Use all HTML functionality (forms, tags, etc) + use Phoenix.HTML + + # Import LiveView helpers (live_render, live_component, live_patch, etc) + import Phoenix.LiveView.Helpers + + # Import basic rendering functionality (render, render_layout, etc) + import Phoenix.View + + alias FlagQuizWeb.Router.Helpers, as: Routes + end + end + + @doc """ + When used, dispatch to the appropriate controller/view/etc. + """ + defmacro __using__(which) when is_atom(which) do + apply(__MODULE__, which, []) + end +end diff --git a/lib/flag_quiz_web/endpoint.ex b/lib/flag_quiz_web/endpoint.ex new file mode 100644 index 0000000..add1dee --- /dev/null +++ b/lib/flag_quiz_web/endpoint.ex @@ -0,0 +1,49 @@ +defmodule FlagQuizWeb.Endpoint do + use Phoenix.Endpoint, otp_app: :flag_quiz + + # The session will be stored in the cookie and signed, + # this means its contents can be read but not tampered with. + # Set :encryption_salt if you would also like to encrypt it. + @session_options [ + store: :cookie, + key: "_flag_quiz_key", + signing_salt: "uwJibjrc" + ] + + socket "/live", Phoenix.LiveView.Socket, websocket: [connect_info: [session: @session_options]] + + # Serve at "/" the static files from "priv/static" directory. + # + # You should set gzip to true if you are running phx.digest + # when deploying your static files in production. + plug Plug.Static, + at: "/", + from: :flag_quiz, + gzip: false, + only: ~w(css fonts images js flags favicon.ico robots.txt) + + # Code reloading can be explicitly enabled under the + # :code_reloader configuration of your endpoint. + if code_reloading? do + socket "/phoenix/live_reload/socket", Phoenix.LiveReloader.Socket + plug Phoenix.LiveReloader + plug Phoenix.CodeReloader + end + + plug Phoenix.LiveDashboard.RequestLogger, + param_key: "request_logger", + cookie_key: "request_logger" + + plug Plug.RequestId + plug Plug.Telemetry, event_prefix: [:phoenix, :endpoint] + + plug Plug.Parsers, + parsers: [:urlencoded, :multipart, :json], + pass: ["*/*"], + json_decoder: Phoenix.json_library() + + plug Plug.MethodOverride + plug Plug.Head + plug Plug.Session, @session_options + plug FlagQuizWeb.Router +end diff --git a/lib/flag_quiz_web/live/page_live.ex b/lib/flag_quiz_web/live/page_live.ex new file mode 100644 index 0000000..8879058 --- /dev/null +++ b/lib/flag_quiz_web/live/page_live.ex @@ -0,0 +1,106 @@ +defmodule FlagQuizWeb.PageLive do + use FlagQuizWeb, :live_view + + require Logger + + @q_amount 10 + @seconds 10 + + @impl true + def mount(_params, _session, socket) do + {:ok, assign(socket, in_game?: false, tick_timer: nil, total: @q_amount)} + end + + @impl true + def handle_event(event, params, socket) + + def handle_event("start-game", _, socket) do + quiz_set = FlagQuiz.Flags.get_quiz_set(@q_amount) + {:noreply, assign(socket, in_game?: true) |> init_flag(quiz_set)} + end + + def handle_event("flag-input", params, socket) do + if not socket.assigns.valid? do + name = Map.get(params, "country-input", "") |> process_name() + valid = name in socket.assigns.flag_names + + if valid do + if not is_nil(socket.assigns.tick_timer), + do: Process.cancel_timer(socket.assigns.tick_timer) + + Process.send_after(self(), :next, 2_000) + end + + {:noreply, assign(socket, valid?: valid)} + else + {:noreply, socket} + end + end + + @impl true + def handle_info(msg, socket) + + def handle_info(:next, %{assigns: %{quiz_set: []}} = socket) do + {:noreply, assign(socket, victory?: true)} + end + + def handle_info(:next, socket) do + {:noreply, init_flag(socket, socket.assigns.quiz_set)} + end + + def handle_info(:tick, %{assigns: %{time: time}} = socket) when time <= 1 do + Process.send_after(self(), :reset, 2_000) + {:noreply, assign(socket, time: 0, failed?: true)} + end + + def handle_info(:tick, socket) do + tick_timer = Process.send_after(self(), :tick, 1_000) + {:noreply, assign(socket, time: socket.assigns.time - 1, tick_timer: tick_timer)} + end + + def handle_info(:reset, socket) do + {:noreply, assign(socket, in_game?: false)} + end + + def handle_info(msg, socket) do + Logger.debug("Got unknown msg: #{inspect(msg)}") + {:noreply, socket} + end + + defp init_flag(socket, [{flag_code, flag_names} | rest]) do + Process.send_after(self(), :tick, 1_000) + + assign(socket, + flag_code: String.downcase(flag_code), + flag_names: Enum.map(flag_names, &process_name/1), + time: @seconds, + valid?: false, + failed?: false, + victory?: false, + quiz_set: rest + ) + |> push_event("clear-input", %{}) + end + + defp process_name(name) do + name + |> String.downcase() + |> String.normalize(:nfc) + |> String.replace(["ä", "ã", "é", "í", "ö", "ô", "š", "ž", "ç"], &replace_special/1) + |> String.replace(~R/\s*/, "") + |> String.replace("-", "") + |> String.replace("'", "") + end + + defp replace_special(char) + + defp replace_special("ä"), do: "a" + defp replace_special("ö"), do: "o" + defp replace_special("ô"), do: "o" + defp replace_special("š"), do: "s" + defp replace_special("ž"), do: "z" + defp replace_special("ç"), do: "c" + defp replace_special("ã"), do: "a" + defp replace_special("é"), do: "e" + defp replace_special("í"), do: "i" +end diff --git a/lib/flag_quiz_web/live/page_live.html.leex b/lib/flag_quiz_web/live/page_live.html.leex new file mode 100644 index 0000000..77347fe --- /dev/null +++ b/lib/flag_quiz_web/live/page_live.html.leex @@ -0,0 +1,43 @@ +<%= cond do %> + <% not @socket.connected? -> %> +

Loading...

+

You will need JavaScript turned on to use this website.

+ <% not @in_game? -> %> +

Lippuvisa / Flag Quiz

+

+ Ohjeet. +

+ +
+ +
+ <% @victory? -> %> +

Voitit pelin! / You won!

+

Palkintosi / Your reward:

+

N 61° 26.035, E 023° 35.744

+
+ +
+ <% true -> %> +

Lippuvisa / Flag Quiz

+
<%= @total - Enum.count(@quiz_set) %> / <%= @total %>
+
<%= if @failed?, do: "flag-failed" %>" + >
+

+ <%= if not @valid? and not @failed?, do: @time %> + <%= if @failed?, do: inspect(@flag_names) %> +

+
+ + phx-hook="CountryInput" + /> +
+<% end %> diff --git a/lib/flag_quiz_web/router.ex b/lib/flag_quiz_web/router.ex new file mode 100644 index 0000000..6f05e98 --- /dev/null +++ b/lib/flag_quiz_web/router.ex @@ -0,0 +1,39 @@ +defmodule FlagQuizWeb.Router do + use FlagQuizWeb, :router + + pipeline :browser do + plug :accepts, ["html"] + plug :fetch_session + plug :fetch_live_flash + plug :put_root_layout, {FlagQuizWeb.LayoutView, :root} + plug :protect_from_forgery + plug :put_secure_browser_headers + end + + scope "/", FlagQuizWeb do + pipe_through :browser + + live "/", PageLive, :index + end + + # Other scopes may use custom stacks. + # scope "/api", FlagQuizWeb do + # pipe_through :api + # end + + # Enables LiveDashboard only for development + # + # If you want to use the LiveDashboard in production, you should put + # it behind authentication and allow only admins to access it. + # If your application does not have an admins-only section yet, + # you can use Plug.BasicAuth to set up some basic authentication + # as long as you are also using SSL (which you should anyway). + if Mix.env() in [:dev, :test] do + import Phoenix.LiveDashboard.Router + + scope "/" do + pipe_through :browser + live_dashboard "/dashboard", metrics: FlagQuizWeb.Telemetry + end + end +end diff --git a/lib/flag_quiz_web/telemetry.ex b/lib/flag_quiz_web/telemetry.ex new file mode 100644 index 0000000..8b2ee1a --- /dev/null +++ b/lib/flag_quiz_web/telemetry.ex @@ -0,0 +1,48 @@ +defmodule FlagQuizWeb.Telemetry do + use Supervisor + import Telemetry.Metrics + + def start_link(arg) do + Supervisor.start_link(__MODULE__, arg, name: __MODULE__) + end + + @impl true + def init(_arg) do + children = [ + # Telemetry poller will execute the given period measurements + # every 10_000ms. Learn more here: https://hexdocs.pm/telemetry_metrics + {:telemetry_poller, measurements: periodic_measurements(), period: 10_000} + # Add reporters as children of your supervision tree. + # {Telemetry.Metrics.ConsoleReporter, metrics: metrics()} + ] + + Supervisor.init(children, strategy: :one_for_one) + end + + def metrics do + [ + # Phoenix Metrics + summary("phoenix.endpoint.stop.duration", + unit: {:native, :millisecond} + ), + summary("phoenix.router_dispatch.stop.duration", + tags: [:route], + unit: {:native, :millisecond} + ), + + # VM Metrics + summary("vm.memory.total", unit: {:byte, :kilobyte}), + summary("vm.total_run_queue_lengths.total"), + summary("vm.total_run_queue_lengths.cpu"), + summary("vm.total_run_queue_lengths.io") + ] + end + + defp periodic_measurements do + [ + # A module, function and arguments to be invoked periodically. + # This function must call :telemetry.execute/3 and a metric must be added above. + # {FlagQuizWeb, :count_users, []} + ] + end +end diff --git a/lib/flag_quiz_web/templates/layout/app.html.eex b/lib/flag_quiz_web/templates/layout/app.html.eex new file mode 100644 index 0000000..09ffdad --- /dev/null +++ b/lib/flag_quiz_web/templates/layout/app.html.eex @@ -0,0 +1,5 @@ +
+ + + <%= @inner_content %> +
diff --git a/lib/flag_quiz_web/templates/layout/live.html.leex b/lib/flag_quiz_web/templates/layout/live.html.leex new file mode 100644 index 0000000..57cc99f --- /dev/null +++ b/lib/flag_quiz_web/templates/layout/live.html.leex @@ -0,0 +1,3 @@ +
+ <%= @inner_content %> +
diff --git a/lib/flag_quiz_web/templates/layout/root.html.leex b/lib/flag_quiz_web/templates/layout/root.html.leex new file mode 100644 index 0000000..2fc579c --- /dev/null +++ b/lib/flag_quiz_web/templates/layout/root.html.leex @@ -0,0 +1,15 @@ + + + + + + + <%= csrf_meta_tag() %> + <%= live_title_tag assigns[:page_title] || "FlagQuiz" %> + "/> + + + + <%= @inner_content %> + + diff --git a/lib/flag_quiz_web/views/error_view.ex b/lib/flag_quiz_web/views/error_view.ex new file mode 100644 index 0000000..a517366 --- /dev/null +++ b/lib/flag_quiz_web/views/error_view.ex @@ -0,0 +1,16 @@ +defmodule FlagQuizWeb.ErrorView do + use FlagQuizWeb, :view + + # If you want to customize a particular status code + # for a certain format, you may uncomment below. + # def render("500.html", _assigns) do + # "Internal Server Error" + # end + + # By default, Phoenix returns the status message from + # the template name. For example, "404.html" becomes + # "Not Found". + def template_not_found(template, _assigns) do + Phoenix.Controller.status_message_from_template(template) + end +end diff --git a/lib/flag_quiz_web/views/layout_view.ex b/lib/flag_quiz_web/views/layout_view.ex new file mode 100644 index 0000000..4046631 --- /dev/null +++ b/lib/flag_quiz_web/views/layout_view.ex @@ -0,0 +1,3 @@ +defmodule FlagQuizWeb.LayoutView do + use FlagQuizWeb, :view +end diff --git a/mix.exs b/mix.exs new file mode 100644 index 0000000..49c8b31 --- /dev/null +++ b/mix.exs @@ -0,0 +1,58 @@ +defmodule FlagQuiz.MixProject do + use Mix.Project + + def project do + [ + app: :flag_quiz, + version: "0.1.0", + elixir: "~> 1.11", + elixirc_paths: elixirc_paths(Mix.env()), + compilers: [:phoenix, :gettext] ++ Mix.compilers(), + start_permanent: Mix.env() == :prod, + aliases: aliases(), + deps: deps() + ] + end + + # Configuration for the OTP application. + # + # Type `mix help compile.app` for more information. + def application do + [ + mod: {FlagQuiz.Application, []}, + extra_applications: [:logger, :runtime_tools] + ] + end + + # Specifies which paths to compile per environment. + defp elixirc_paths(:test), do: ["lib", "test/support"] + defp elixirc_paths(_), do: ["lib"] + + # Specifies your project dependencies. + # + # Type `mix help deps` for examples and options. + defp deps do + [ + {:phoenix, "~> 1.5.7"}, + {:phoenix_live_view, "~> 0.15.0"}, + {:floki, ">= 0.27.0", only: :test}, + {:phoenix_html, "~> 2.11"}, + {:phoenix_live_reload, "~> 1.2", only: :dev}, + {:phoenix_live_dashboard, "~> 0.4"}, + {:telemetry_metrics, "~> 0.4"}, + {:telemetry_poller, "~> 0.4"}, + {:jason, "~> 1.0"}, + {:plug_cowboy, "~> 2.0"} + ] + end + + # Aliases are shortcuts or tasks specific to the current project. + # For example, to install project dependencies and perform other setup tasks, run: + # + # $ mix setup + # + # See the documentation for `Mix` for more info on aliases. + defp aliases do + [] + end +end diff --git a/mix.lock b/mix.lock new file mode 100644 index 0000000..39ea880 --- /dev/null +++ b/mix.lock @@ -0,0 +1,23 @@ +%{ + "cowboy": {:hex, :cowboy, "2.8.0", "f3dc62e35797ecd9ac1b50db74611193c29815401e53bac9a5c0577bd7bc667d", [:rebar3], [{:cowlib, "~> 2.9.1", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "4643e4fba74ac96d4d152c75803de6fad0b3fa5df354c71afdd6cbeeb15fac8a"}, + "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.3.1", "ebd1a1d7aff97f27c66654e78ece187abdc646992714164380d8a041eda16754", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3a6efd3366130eab84ca372cbd4a7d3c3a97bdfcfb4911233b035d117063f0af"}, + "cowlib": {:hex, :cowlib, "2.9.1", "61a6c7c50cf07fdd24b2f45b89500bb93b6686579b069a89f88cb211e1125c78", [:rebar3], [], "hexpm", "e4175dc240a70d996156160891e1c62238ede1729e45740bdd38064dad476170"}, + "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"}, + "floki": {:hex, :floki, "0.29.0", "b1710d8c93a2f860dc2d7adc390dd808dc2fb8f78ee562304457b75f4c640881", [:mix], [{:html_entities, "~> 0.5.0", [hex: :html_entities, repo: "hexpm", optional: false]}], "hexpm", "008585ce64b9f74c07d32958ec9866f4b8a124bf4da1e2941b28e41384edaaad"}, + "html_entities": {:hex, :html_entities, "0.5.1", "1c9715058b42c35a2ab65edc5b36d0ea66dd083767bef6e3edb57870ef556549", [:mix], [], "hexpm", "30efab070904eb897ff05cd52fa61c1025d7f8ef3a9ca250bc4e6513d16c32de"}, + "jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"}, + "mime": {:hex, :mime, "1.5.0", "203ef35ef3389aae6d361918bf3f952fa17a09e8e43b5aa592b93eba05d0fb8d", [:mix], [], "hexpm", "55a94c0f552249fc1a3dd9cd2d3ab9de9d3c89b559c2bd01121f824834f24746"}, + "phoenix": {:hex, :phoenix, "1.5.7", "2923bb3af924f184459fe4fa4b100bd25fa6468e69b2803dfae82698269aa5e0", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 2.13", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.1.2 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "774cd64417c5a3788414fdbb2be2eb9bcd0c048d9e6ad11a0c1fd67b7c0d0978"}, + "phoenix_html": {:hex, :phoenix_html, "2.14.3", "51f720d0d543e4e157ff06b65de38e13303d5778a7919bcc696599e5934271b8", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "efd697a7fff35a13eeeb6b43db884705cba353a1a41d127d118fda5f90c8e80f"}, + "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.4.0", "87990e68b60213d7487e65814046f9a2bed4a67886c943270125913499b3e5c3", [:mix], [{:ecto_psql_extras, "~> 0.4.1 or ~> 0.5", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 2.14.1 or ~> 2.15", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.15.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.4.0 or ~> 0.5.0 or ~> 0.6.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "8d52149e58188e9e4497cc0d8900ab94d9b66f96998ec38c47c7a4f8f4f50e57"}, + "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.3.0", "f35f61c3f959c9a01b36defaa1f0624edd55b87e236b606664a556d6f72fd2e7", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "02c1007ae393f2b76ec61c1a869b1e617179877984678babde131d716f95b582"}, + "phoenix_live_view": {:hex, :phoenix_live_view, "0.15.4", "86908dc9603cc81c07e84725ee42349b5325cb250c9c20d3533856ff18dbb7dc", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.5.7", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 0.5", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "35d78f3c35fe10a995dca5f4ab50165b7a90cbe02e23de245381558f821e9462"}, + "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.0.0", "a1ae76717bb168cdeb10ec9d92d1480fec99e3080f011402c0a2d68d47395ffb", [:mix], [], "hexpm", "c52d948c4f261577b9c6fa804be91884b381a7f8f18450c5045975435350f771"}, + "plug": {:hex, :plug, "1.11.0", "f17217525597628298998bc3baed9f8ea1fa3f1160aa9871aee6df47a6e4d38e", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "2d9c633f0499f9dc5c2fd069161af4e2e7756890b81adcbb2ceaa074e8308876"}, + "plug_cowboy": {:hex, :plug_cowboy, "2.4.1", "779ba386c0915027f22e14a48919a9545714f849505fa15af2631a0d298abf0f", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d72113b6dff7b37a7d9b2a5b68892808e3a9a752f2bf7e503240945385b70507"}, + "plug_crypto": {:hex, :plug_crypto, "1.2.0", "1cb20793aa63a6c619dd18bb33d7a3aa94818e5fd39ad357051a67f26dfa2df6", [:mix], [], "hexpm", "a48b538ae8bf381ffac344520755f3007cc10bd8e90b240af98ea29b69683fc2"}, + "ranch": {:hex, :ranch, "1.7.1", "6b1fab51b49196860b733a49c07604465a47bdb78aa10c1c16a3d199f7f8c881", [:rebar3], [], "hexpm", "451d8527787df716d99dc36162fca05934915db0b6141bbdac2ea8d3c7afc7d7"}, + "telemetry": {:hex, :telemetry, "0.4.2", "2808c992455e08d6177322f14d3bdb6b625fbcfd233a73505870d8738a2f4599", [:rebar3], [], "hexpm", "2d1419bd9dda6a206d7b5852179511722e2b18812310d304620c7bd92a13fcef"}, + "telemetry_metrics": {:hex, :telemetry_metrics, "0.6.0", "da9d49ee7e6bb1c259d36ce6539cd45ae14d81247a2b0c90edf55e2b50507f7b", [:mix], [{:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5cfe67ad464b243835512aa44321cee91faed6ea868d7fb761d7016e02915c3d"}, + "telemetry_poller": {:hex, :telemetry_poller, "0.5.1", "21071cc2e536810bac5628b935521ff3e28f0303e770951158c73eaaa01e962a", [:rebar3], [{:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "4cab72069210bc6e7a080cec9afffad1b33370149ed5d379b81c7c5f0c663fd4"}, +} diff --git a/priv/static/css/app.css b/priv/static/css/app.css new file mode 100644 index 0000000..427b3e3 --- /dev/null +++ b/priv/static/css/app.css @@ -0,0 +1,1650 @@ +@import "flag-icon.css"; + +/** + * Automatic version: + * Uses light theme by default but switches to dark theme + * if a system-wide theme preference is set on the user's device. + */ + + :root { + --background-body: #fff; + --background: #efefef; + --background-alt: #f7f7f7; + --selection: #9e9e9e; + --text-main: #363636; + --text-bright: #000; + --text-muted: #70777f; + --links: #0076d1; + --focus: #0096bfab; + --border: #dbdbdb; + --code: #000; + --animation-duration: 0.1s; + --button-hover: #ddd; + --scrollbar-thumb: rgb(213, 213, 213); + --scrollbar-thumb-hover: rgb(196, 196, 196); + --form-placeholder: #949494; + --form-text: #000; + --variable: #39a33c; + --highlight: #ff0; + --select-arrow: url("data:image/svg+xml;charset=utf-8,%3C?xml version='1.0' encoding='utf-8'?%3E %3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' height='62.5' width='116.9' fill='%23161f27'%3E %3Cpath d='M115.3,1.6 C113.7,0 111.1,0 109.5,1.6 L58.5,52.7 L7.4,1.6 C5.8,0 3.2,0 1.6,1.6 C0,3.2 0,5.8 1.6,7.4 L55.5,61.3 C56.3,62.1 57.3,62.5 58.4,62.5 C59.4,62.5 60.5,62.1 61.3,61.3 L115.2,7.4 C116.9,5.8 116.9,3.2 115.3,1.6Z'/%3E %3C/svg%3E"); +} + +@media (prefers-color-scheme: dark) { +:root { + --background-body: #202b38; + --background: #161f27; + --background-alt: #1a242f; + --selection: #1c76c5; + --text-main: #dbdbdb; + --text-bright: #fff; + --text-muted: #a9b1ba; + --links: #41adff; + --focus: #0096bfab; + --border: #526980; + --code: #ffbe85; + --animation-duration: 0.1s; + --button-hover: #324759; + --scrollbar-thumb: var(--button-hover); + --scrollbar-thumb-hover: rgb(20, 20, 20); + --form-placeholder: #a9a9a9; + --form-text: #fff; + --variable: #d941e2; + --highlight: #efdb43; + --select-arrow: url("data:image/svg+xml;charset=utf-8,%3C?xml version='1.0' encoding='utf-8'?%3E %3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' height='62.5' width='116.9' fill='%23efefef'%3E %3Cpath d='M115.3,1.6 C113.7,0 111.1,0 109.5,1.6 L58.5,52.7 L7.4,1.6 C5.8,0 3.2,0 1.6,1.6 C0,3.2 0,5.8 1.6,7.4 L55.5,61.3 C56.3,62.1 57.3,62.5 58.4,62.5 C59.4,62.5 60.5,62.1 61.3,61.3 L115.2,7.4 C116.9,5.8 116.9,3.2 115.3,1.6Z'/%3E %3C/svg%3E"); +} +} + +html { + scrollbar-color: rgb(213, 213, 213) #fff; + scrollbar-color: var(--scrollbar-thumb) var(--background-body); + scrollbar-width: thin; +} + +@media (prefers-color-scheme: dark) { + + html { + scrollbar-color: #324759 #202b38; + scrollbar-color: var(--scrollbar-thumb) var(--background-body); + } +} + +@media (prefers-color-scheme: dark) { + + html { + scrollbar-color: #324759 #202b38; + scrollbar-color: var(--scrollbar-thumb) var(--background-body); + } +} + +@media (prefers-color-scheme: dark) { + + html { + scrollbar-color: #324759 #202b38; + scrollbar-color: var(--scrollbar-thumb) var(--background-body); + } +} + +@media (prefers-color-scheme: dark) { + + html { + scrollbar-color: #324759 #202b38; + scrollbar-color: var(--scrollbar-thumb) var(--background-body); + } +} + +@media (prefers-color-scheme: dark) { + + html { + scrollbar-color: #324759 #202b38; + scrollbar-color: var(--scrollbar-thumb) var(--background-body); + } +} + +@media (prefers-color-scheme: dark) { + + html { + scrollbar-color: #324759 #202b38; + scrollbar-color: var(--scrollbar-thumb) var(--background-body); + } +} + +body { + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 'Segoe UI Emoji', 'Apple Color Emoji', 'Noto Color Emoji', sans-serif; + line-height: 1.4; + max-width: 800px; + margin: 0 auto; + padding: 0 10px; + word-wrap: break-word; + color: #363636; + color: var(--text-main); + background: #fff; + background: var(--background-body); + text-rendering: optimizeLegibility; +} + +@media (prefers-color-scheme: dark) { + + body { + background: #202b38; + background: var(--background-body); + } +} + +@media (prefers-color-scheme: dark) { + + body { + color: #dbdbdb; + color: var(--text-main); + } +} + +button { + transition: + background-color 0.1s linear, + border-color 0.1s linear, + color 0.1s linear, + box-shadow 0.1s linear, + transform 0.1s ease; + transition: + background-color var(--animation-duration) linear, + border-color var(--animation-duration) linear, + color var(--animation-duration) linear, + box-shadow var(--animation-duration) linear, + transform var(--animation-duration) ease; +} + +@media (prefers-color-scheme: dark) { + + button { + transition: + background-color 0.1s linear, + border-color 0.1s linear, + color 0.1s linear, + box-shadow 0.1s linear, + transform 0.1s ease; + transition: + background-color var(--animation-duration) linear, + border-color var(--animation-duration) linear, + color var(--animation-duration) linear, + box-shadow var(--animation-duration) linear, + transform var(--animation-duration) ease; + } +} + +input { + transition: + background-color 0.1s linear, + border-color 0.1s linear, + color 0.1s linear, + box-shadow 0.1s linear, + transform 0.1s ease; + transition: + background-color var(--animation-duration) linear, + border-color var(--animation-duration) linear, + color var(--animation-duration) linear, + box-shadow var(--animation-duration) linear, + transform var(--animation-duration) ease; +} + +@media (prefers-color-scheme: dark) { + + input { + transition: + background-color 0.1s linear, + border-color 0.1s linear, + color 0.1s linear, + box-shadow 0.1s linear, + transform 0.1s ease; + transition: + background-color var(--animation-duration) linear, + border-color var(--animation-duration) linear, + color var(--animation-duration) linear, + box-shadow var(--animation-duration) linear, + transform var(--animation-duration) ease; + } +} + +textarea { + transition: + background-color 0.1s linear, + border-color 0.1s linear, + color 0.1s linear, + box-shadow 0.1s linear, + transform 0.1s ease; + transition: + background-color var(--animation-duration) linear, + border-color var(--animation-duration) linear, + color var(--animation-duration) linear, + box-shadow var(--animation-duration) linear, + transform var(--animation-duration) ease; +} + +@media (prefers-color-scheme: dark) { + + textarea { + transition: + background-color 0.1s linear, + border-color 0.1s linear, + color 0.1s linear, + box-shadow 0.1s linear, + transform 0.1s ease; + transition: + background-color var(--animation-duration) linear, + border-color var(--animation-duration) linear, + color var(--animation-duration) linear, + box-shadow var(--animation-duration) linear, + transform var(--animation-duration) ease; + } +} + +h1 { + font-size: 2.2em; + margin-top: 0; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin-bottom: 12px; + margin-top: 24px; +} + +h1 { + color: #000; + color: var(--text-bright); +} + +@media (prefers-color-scheme: dark) { + + h1 { + color: #fff; + color: var(--text-bright); + } +} + +h2 { + color: #000; + color: var(--text-bright); +} + +@media (prefers-color-scheme: dark) { + + h2 { + color: #fff; + color: var(--text-bright); + } +} + +h3 { + color: #000; + color: var(--text-bright); +} + +@media (prefers-color-scheme: dark) { + + h3 { + color: #fff; + color: var(--text-bright); + } +} + +h4 { + color: #000; + color: var(--text-bright); +} + +@media (prefers-color-scheme: dark) { + + h4 { + color: #fff; + color: var(--text-bright); + } +} + +h5 { + color: #000; + color: var(--text-bright); +} + +@media (prefers-color-scheme: dark) { + + h5 { + color: #fff; + color: var(--text-bright); + } +} + +h6 { + color: #000; + color: var(--text-bright); +} + +@media (prefers-color-scheme: dark) { + + h6 { + color: #fff; + color: var(--text-bright); + } +} + +strong { + color: #000; + color: var(--text-bright); +} + +@media (prefers-color-scheme: dark) { + + strong { + color: #fff; + color: var(--text-bright); + } +} + +h1, +h2, +h3, +h4, +h5, +h6, +b, +strong, +th { + font-weight: 600; +} + +q::before { + content: none; +} + +q::after { + content: none; +} + +blockquote { + border-left: 4px solid #0096bfab; + border-left: 4px solid var(--focus); + margin: 1.5em 0; + padding: 0.5em 1em; + font-style: italic; +} + +@media (prefers-color-scheme: dark) { + + blockquote { + border-left: 4px solid #0096bfab; + border-left: 4px solid var(--focus); + } +} + +q { + border-left: 4px solid #0096bfab; + border-left: 4px solid var(--focus); + margin: 1.5em 0; + padding: 0.5em 1em; + font-style: italic; +} + +@media (prefers-color-scheme: dark) { + + q { + border-left: 4px solid #0096bfab; + border-left: 4px solid var(--focus); + } +} + +blockquote > footer { + font-style: normal; + border: 0; +} + +blockquote cite { + font-style: normal; +} + +address { + font-style: normal; +} + +a[href^='mailto\:']::before { + content: '📧 '; +} + +a[href^='tel\:']::before { + content: '📞 '; +} + +a[href^='sms\:']::before { + content: '💬 '; +} + +mark { + background-color: #ff0; + background-color: var(--highlight); + border-radius: 2px; + padding: 0 2px 0 2px; + color: #000; +} + +@media (prefers-color-scheme: dark) { + + mark { + background-color: #efdb43; + background-color: var(--highlight); + } +} + +button, +select, +input[type='submit'], +input[type='button'], +input[type='checkbox'], +input[type='range'], +input[type='radio'] { + cursor: pointer; +} + +input:not([type='checkbox']):not([type='radio']), +select { + display: block; +} + +input { + color: #000; + color: var(--form-text); + background-color: #efefef; + background-color: var(--background); + font-family: inherit; + font-size: inherit; + margin-right: 6px; + margin-bottom: 6px; + padding: 10px; + border: none; + border-radius: 6px; + outline: none; +} + +@media (prefers-color-scheme: dark) { + + input { + background-color: #161f27; + background-color: var(--background); + } +} + +@media (prefers-color-scheme: dark) { + + input { + color: #fff; + color: var(--form-text); + } +} + +button { + color: #000; + color: var(--form-text); + background-color: #efefef; + background-color: var(--background); + font-family: inherit; + font-size: inherit; + margin-right: 6px; + margin-bottom: 6px; + padding: 10px; + border: none; + border-radius: 6px; + outline: none; +} + +@media (prefers-color-scheme: dark) { + + button { + background-color: #161f27; + background-color: var(--background); + } +} + +@media (prefers-color-scheme: dark) { + + button { + color: #fff; + color: var(--form-text); + } +} + +textarea { + color: #000; + color: var(--form-text); + background-color: #efefef; + background-color: var(--background); + font-family: inherit; + font-size: inherit; + margin-right: 6px; + margin-bottom: 6px; + padding: 10px; + border: none; + border-radius: 6px; + outline: none; +} + +@media (prefers-color-scheme: dark) { + + textarea { + background-color: #161f27; + background-color: var(--background); + } +} + +@media (prefers-color-scheme: dark) { + + textarea { + color: #fff; + color: var(--form-text); + } +} + +select { + color: #000; + color: var(--form-text); + background-color: #efefef; + background-color: var(--background); + font-family: inherit; + font-size: inherit; + margin-right: 6px; + margin-bottom: 6px; + padding: 10px; + border: none; + border-radius: 6px; + outline: none; +} + +@media (prefers-color-scheme: dark) { + + select { + background-color: #161f27; + background-color: var(--background); + } +} + +@media (prefers-color-scheme: dark) { + + select { + color: #fff; + color: var(--form-text); + } +} + +input[type='checkbox'], +input[type='radio'] { + height: 1em; + width: 1em; +} + +input[type='radio'] { + border-radius: 100%; +} + +input { + vertical-align: top; +} + +label { + vertical-align: middle; + margin-bottom: 4px; + display: inline-block; +} + +input:not([type='checkbox']):not([type='radio']), +input[type='range'], +select, +button, +textarea { + -webkit-appearance: none; +} + +textarea { + display: block; + margin-right: 0; + box-sizing: border-box; + resize: vertical; +} + +textarea:not([cols]) { + width: 100%; +} + +textarea:not([rows]) { + min-height: 40px; + height: 140px; +} + +select { + background: #efefef url("data:image/svg+xml;charset=utf-8,%3C?xml version='1.0' encoding='utf-8'?%3E %3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' height='62.5' width='116.9' fill='%23161f27'%3E %3Cpath d='M115.3,1.6 C113.7,0 111.1,0 109.5,1.6 L58.5,52.7 L7.4,1.6 C5.8,0 3.2,0 1.6,1.6 C0,3.2 0,5.8 1.6,7.4 L55.5,61.3 C56.3,62.1 57.3,62.5 58.4,62.5 C59.4,62.5 60.5,62.1 61.3,61.3 L115.2,7.4 C116.9,5.8 116.9,3.2 115.3,1.6Z'/%3E %3C/svg%3E") calc(100% - 12px) 50% / 12px no-repeat; + background: var(--background) var(--select-arrow) calc(100% - 12px) 50% / 12px no-repeat; + padding-right: 35px; +} + +@media (prefers-color-scheme: dark) { + + select { + background: #161f27 url("data:image/svg+xml;charset=utf-8,%3C?xml version='1.0' encoding='utf-8'?%3E %3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' height='62.5' width='116.9' fill='%23efefef'%3E %3Cpath d='M115.3,1.6 C113.7,0 111.1,0 109.5,1.6 L58.5,52.7 L7.4,1.6 C5.8,0 3.2,0 1.6,1.6 C0,3.2 0,5.8 1.6,7.4 L55.5,61.3 C56.3,62.1 57.3,62.5 58.4,62.5 C59.4,62.5 60.5,62.1 61.3,61.3 L115.2,7.4 C116.9,5.8 116.9,3.2 115.3,1.6Z'/%3E %3C/svg%3E") calc(100% - 12px) 50% / 12px no-repeat; + background: var(--background) var(--select-arrow) calc(100% - 12px) 50% / 12px no-repeat; + } +} + +@media (prefers-color-scheme: dark) { + + select { + background: #161f27 url("data:image/svg+xml;charset=utf-8,%3C?xml version='1.0' encoding='utf-8'?%3E %3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' height='62.5' width='116.9' fill='%23efefef'%3E %3Cpath d='M115.3,1.6 C113.7,0 111.1,0 109.5,1.6 L58.5,52.7 L7.4,1.6 C5.8,0 3.2,0 1.6,1.6 C0,3.2 0,5.8 1.6,7.4 L55.5,61.3 C56.3,62.1 57.3,62.5 58.4,62.5 C59.4,62.5 60.5,62.1 61.3,61.3 L115.2,7.4 C116.9,5.8 116.9,3.2 115.3,1.6Z'/%3E %3C/svg%3E") calc(100% - 12px) 50% / 12px no-repeat; + background: var(--background) var(--select-arrow) calc(100% - 12px) 50% / 12px no-repeat; + } +} + +@media (prefers-color-scheme: dark) { + + select { + background: #161f27 url("data:image/svg+xml;charset=utf-8,%3C?xml version='1.0' encoding='utf-8'?%3E %3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' height='62.5' width='116.9' fill='%23efefef'%3E %3Cpath d='M115.3,1.6 C113.7,0 111.1,0 109.5,1.6 L58.5,52.7 L7.4,1.6 C5.8,0 3.2,0 1.6,1.6 C0,3.2 0,5.8 1.6,7.4 L55.5,61.3 C56.3,62.1 57.3,62.5 58.4,62.5 C59.4,62.5 60.5,62.1 61.3,61.3 L115.2,7.4 C116.9,5.8 116.9,3.2 115.3,1.6Z'/%3E %3C/svg%3E") calc(100% - 12px) 50% / 12px no-repeat; + background: var(--background) var(--select-arrow) calc(100% - 12px) 50% / 12px no-repeat; + } +} + +@media (prefers-color-scheme: dark) { + + select { + background: #161f27 url("data:image/svg+xml;charset=utf-8,%3C?xml version='1.0' encoding='utf-8'?%3E %3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' height='62.5' width='116.9' fill='%23efefef'%3E %3Cpath d='M115.3,1.6 C113.7,0 111.1,0 109.5,1.6 L58.5,52.7 L7.4,1.6 C5.8,0 3.2,0 1.6,1.6 C0,3.2 0,5.8 1.6,7.4 L55.5,61.3 C56.3,62.1 57.3,62.5 58.4,62.5 C59.4,62.5 60.5,62.1 61.3,61.3 L115.2,7.4 C116.9,5.8 116.9,3.2 115.3,1.6Z'/%3E %3C/svg%3E") calc(100% - 12px) 50% / 12px no-repeat; + background: var(--background) var(--select-arrow) calc(100% - 12px) 50% / 12px no-repeat; + } +} + +select::-ms-expand { + display: none; +} + +select[multiple] { + padding-right: 10px; + background-image: none; + overflow-y: auto; +} + +button, +input[type='submit'], +input[type='button'] { + padding-right: 30px; + padding-left: 30px; +} + +button:hover { + background: #ddd; + background: var(--button-hover); +} + +@media (prefers-color-scheme: dark) { + + button:hover { + background: #324759; + background: var(--button-hover); + } +} + +input[type='submit']:hover { + background: #ddd; + background: var(--button-hover); +} + +@media (prefers-color-scheme: dark) { + + input[type='submit']:hover { + background: #324759; + background: var(--button-hover); + } +} + +input[type='button']:hover { + background: #ddd; + background: var(--button-hover); +} + +@media (prefers-color-scheme: dark) { + + input[type='button']:hover { + background: #324759; + background: var(--button-hover); + } +} + +input:focus { + box-shadow: 0 0 0 2px #0096bfab; + box-shadow: 0 0 0 2px var(--focus); +} + +@media (prefers-color-scheme: dark) { + + input:focus { + box-shadow: 0 0 0 2px #0096bfab; + box-shadow: 0 0 0 2px var(--focus); + } +} + +select:focus { + box-shadow: 0 0 0 2px #0096bfab; + box-shadow: 0 0 0 2px var(--focus); +} + +@media (prefers-color-scheme: dark) { + + select:focus { + box-shadow: 0 0 0 2px #0096bfab; + box-shadow: 0 0 0 2px var(--focus); + } +} + +button:focus { + box-shadow: 0 0 0 2px #0096bfab; + box-shadow: 0 0 0 2px var(--focus); +} + +@media (prefers-color-scheme: dark) { + + button:focus { + box-shadow: 0 0 0 2px #0096bfab; + box-shadow: 0 0 0 2px var(--focus); + } +} + +textarea:focus { + box-shadow: 0 0 0 2px #0096bfab; + box-shadow: 0 0 0 2px var(--focus); +} + +@media (prefers-color-scheme: dark) { + + textarea:focus { + box-shadow: 0 0 0 2px #0096bfab; + box-shadow: 0 0 0 2px var(--focus); + } +} + +input[type='checkbox']:active, +input[type='radio']:active, +input[type='submit']:active, +input[type='button']:active, +input[type='range']:active, +button:active { + transform: translateY(2px); +} + +input:disabled, +select:disabled, +button:disabled, +textarea:disabled { + cursor: not-allowed; + opacity: 0.5; +} + +::-moz-placeholder { + color: #949494; + color: var(--form-placeholder); +} + +:-ms-input-placeholder { + color: #949494; + color: var(--form-placeholder); +} + +::-ms-input-placeholder { + color: #949494; + color: var(--form-placeholder); +} + +::placeholder { + color: #949494; + color: var(--form-placeholder); +} + +@media (prefers-color-scheme: dark) { + + ::-moz-placeholder { + color: #a9a9a9; + color: var(--form-placeholder); + } + + :-ms-input-placeholder { + color: #a9a9a9; + color: var(--form-placeholder); + } + + ::-ms-input-placeholder { + color: #a9a9a9; + color: var(--form-placeholder); + } + + ::placeholder { + color: #a9a9a9; + color: var(--form-placeholder); + } +} + +fieldset { + border: 1px #0096bfab solid; + border: 1px var(--focus) solid; + border-radius: 6px; + margin: 0; + margin-bottom: 12px; + padding: 10px; +} + +@media (prefers-color-scheme: dark) { + + fieldset { + border: 1px #0096bfab solid; + border: 1px var(--focus) solid; + } +} + +legend { + font-size: 0.9em; + font-weight: 600; +} + +input[type='range'] { + margin: 10px 0; + padding: 10px 0; + background: transparent; +} + +input[type='range']:focus { + outline: none; +} + +input[type='range']::-webkit-slider-runnable-track { + width: 100%; + height: 9.5px; + -webkit-transition: 0.2s; + transition: 0.2s; + background: #efefef; + background: var(--background); + border-radius: 3px; +} + +@media (prefers-color-scheme: dark) { + + input[type='range']::-webkit-slider-runnable-track { + background: #161f27; + background: var(--background); + } +} + +input[type='range']::-webkit-slider-thumb { + box-shadow: 0 1px 1px #000, 0 0 1px #0d0d0d; + height: 20px; + width: 20px; + border-radius: 50%; + background: #dbdbdb; + background: var(--border); + -webkit-appearance: none; + margin-top: -7px; +} + +@media (prefers-color-scheme: dark) { + + input[type='range']::-webkit-slider-thumb { + background: #526980; + background: var(--border); + } +} + +input[type='range']:focus::-webkit-slider-runnable-track { + background: #efefef; + background: var(--background); +} + +@media (prefers-color-scheme: dark) { + + input[type='range']:focus::-webkit-slider-runnable-track { + background: #161f27; + background: var(--background); + } +} + +input[type='range']::-moz-range-track { + width: 100%; + height: 9.5px; + -moz-transition: 0.2s; + transition: 0.2s; + background: #efefef; + background: var(--background); + border-radius: 3px; +} + +@media (prefers-color-scheme: dark) { + + input[type='range']::-moz-range-track { + background: #161f27; + background: var(--background); + } +} + +input[type='range']::-moz-range-thumb { + box-shadow: 1px 1px 1px #000, 0 0 1px #0d0d0d; + height: 20px; + width: 20px; + border-radius: 50%; + background: #dbdbdb; + background: var(--border); +} + +@media (prefers-color-scheme: dark) { + + input[type='range']::-moz-range-thumb { + background: #526980; + background: var(--border); + } +} + +input[type='range']::-ms-track { + width: 100%; + height: 9.5px; + background: transparent; + border-color: transparent; + border-width: 16px 0; + color: transparent; +} + +input[type='range']::-ms-fill-lower { + background: #efefef; + background: var(--background); + border: 0.2px solid #010101; + border-radius: 3px; + box-shadow: 1px 1px 1px #000, 0 0 1px #0d0d0d; +} + +@media (prefers-color-scheme: dark) { + + input[type='range']::-ms-fill-lower { + background: #161f27; + background: var(--background); + } +} + +input[type='range']::-ms-fill-upper { + background: #efefef; + background: var(--background); + border: 0.2px solid #010101; + border-radius: 3px; + box-shadow: 1px 1px 1px #000, 0 0 1px #0d0d0d; +} + +@media (prefers-color-scheme: dark) { + + input[type='range']::-ms-fill-upper { + background: #161f27; + background: var(--background); + } +} + +input[type='range']::-ms-thumb { + box-shadow: 1px 1px 1px #000, 0 0 1px #0d0d0d; + border: 1px solid #000; + height: 20px; + width: 20px; + border-radius: 50%; + background: #dbdbdb; + background: var(--border); +} + +@media (prefers-color-scheme: dark) { + + input[type='range']::-ms-thumb { + background: #526980; + background: var(--border); + } +} + +input[type='range']:focus::-ms-fill-lower { + background: #efefef; + background: var(--background); +} + +@media (prefers-color-scheme: dark) { + + input[type='range']:focus::-ms-fill-lower { + background: #161f27; + background: var(--background); + } +} + +input[type='range']:focus::-ms-fill-upper { + background: #efefef; + background: var(--background); +} + +@media (prefers-color-scheme: dark) { + + input[type='range']:focus::-ms-fill-upper { + background: #161f27; + background: var(--background); + } +} + +a { + text-decoration: none; + color: #0076d1; + color: var(--links); +} + +@media (prefers-color-scheme: dark) { + + a { + color: #41adff; + color: var(--links); + } +} + +a:hover { + text-decoration: underline; +} + +code { + background: #efefef; + background: var(--background); + color: #000; + color: var(--code); + padding: 2.5px 5px; + border-radius: 6px; + font-size: 1em; +} + +@media (prefers-color-scheme: dark) { + + code { + color: #ffbe85; + color: var(--code); + } +} + +@media (prefers-color-scheme: dark) { + + code { + background: #161f27; + background: var(--background); + } +} + +samp { + background: #efefef; + background: var(--background); + color: #000; + color: var(--code); + padding: 2.5px 5px; + border-radius: 6px; + font-size: 1em; +} + +@media (prefers-color-scheme: dark) { + + samp { + color: #ffbe85; + color: var(--code); + } +} + +@media (prefers-color-scheme: dark) { + + samp { + background: #161f27; + background: var(--background); + } +} + +time { + background: #efefef; + background: var(--background); + color: #000; + color: var(--code); + padding: 2.5px 5px; + border-radius: 6px; + font-size: 1em; +} + +@media (prefers-color-scheme: dark) { + + time { + color: #ffbe85; + color: var(--code); + } +} + +@media (prefers-color-scheme: dark) { + + time { + background: #161f27; + background: var(--background); + } +} + +pre > code { + padding: 10px; + display: block; + overflow-x: auto; +} + +var { + color: #39a33c; + color: var(--variable); + font-style: normal; + font-family: monospace; +} + +@media (prefers-color-scheme: dark) { + + var { + color: #d941e2; + color: var(--variable); + } +} + +kbd { + background: #efefef; + background: var(--background); + border: 1px solid #dbdbdb; + border: 1px solid var(--border); + border-radius: 2px; + color: #363636; + color: var(--text-main); + padding: 2px 4px 2px 4px; +} + +@media (prefers-color-scheme: dark) { + + kbd { + color: #dbdbdb; + color: var(--text-main); + } +} + +@media (prefers-color-scheme: dark) { + + kbd { + border: 1px solid #526980; + border: 1px solid var(--border); + } +} + +@media (prefers-color-scheme: dark) { + + kbd { + background: #161f27; + background: var(--background); + } +} + +img, +video { + max-width: 100%; + height: auto; +} + +hr { + border: none; + border-top: 1px solid #dbdbdb; + border-top: 1px solid var(--border); +} + +@media (prefers-color-scheme: dark) { + + hr { + border-top: 1px solid #526980; + border-top: 1px solid var(--border); + } +} + +table { + border-collapse: collapse; + margin-bottom: 10px; + width: 100%; + table-layout: fixed; +} + +table caption { + text-align: left; +} + +td, +th { + padding: 6px; + text-align: left; + vertical-align: top; + word-wrap: break-word; +} + +thead { + border-bottom: 1px solid #dbdbdb; + border-bottom: 1px solid var(--border); +} + +@media (prefers-color-scheme: dark) { + + thead { + border-bottom: 1px solid #526980; + border-bottom: 1px solid var(--border); + } +} + +tfoot { + border-top: 1px solid #dbdbdb; + border-top: 1px solid var(--border); +} + +@media (prefers-color-scheme: dark) { + + tfoot { + border-top: 1px solid #526980; + border-top: 1px solid var(--border); + } +} + +tbody tr:nth-child(even) { + background-color: #f7f7f7; + background-color: var(--background-alt); +} + +@media (prefers-color-scheme: dark) { + + tbody tr:nth-child(even) { + background-color: #1a242f; + background-color: var(--background-alt); + } +} + +::-webkit-scrollbar { + height: 10px; + width: 10px; +} + +::-webkit-scrollbar-track { + background: #efefef; + background: var(--background); + border-radius: 6px; +} + +@media (prefers-color-scheme: dark) { + + ::-webkit-scrollbar-track { + background: #161f27; + background: var(--background); + } +} + +::-webkit-scrollbar-thumb { + background: rgb(213, 213, 213); + background: var(--scrollbar-thumb); + border-radius: 6px; +} + +@media (prefers-color-scheme: dark) { + + ::-webkit-scrollbar-thumb { + background: #324759; + background: var(--scrollbar-thumb); + } +} + +@media (prefers-color-scheme: dark) { + + ::-webkit-scrollbar-thumb { + background: #324759; + background: var(--scrollbar-thumb); + } +} + +::-webkit-scrollbar-thumb:hover { + background: rgb(196, 196, 196); + background: var(--scrollbar-thumb-hover); +} + +@media (prefers-color-scheme: dark) { + + ::-webkit-scrollbar-thumb:hover { + background: rgb(20, 20, 20); + background: var(--scrollbar-thumb-hover); + } +} + +::-moz-selection { + background-color: #9e9e9e; + background-color: var(--selection); + color: #000; + color: var(--text-bright); +} + +::selection { + background-color: #9e9e9e; + background-color: var(--selection); + color: #000; + color: var(--text-bright); +} + +@media (prefers-color-scheme: dark) { + + ::-moz-selection { + color: #fff; + color: var(--text-bright); + } + + ::selection { + color: #fff; + color: var(--text-bright); + } +} + +@media (prefers-color-scheme: dark) { + + ::-moz-selection { + background-color: #1c76c5; + background-color: var(--selection); + } + + ::selection { + background-color: #1c76c5; + background-color: var(--selection); + } +} + +details { + display: flex; + flex-direction: column; + align-items: flex-start; + background-color: #f7f7f7; + background-color: var(--background-alt); + padding: 10px 10px 0; + margin: 1em 0; + border-radius: 6px; + overflow: hidden; +} + +@media (prefers-color-scheme: dark) { + + details { + background-color: #1a242f; + background-color: var(--background-alt); + } +} + +details[open] { + padding: 10px; +} + +details > :last-child { + margin-bottom: 0; +} + +details[open] summary { + margin-bottom: 10px; +} + +summary { + display: list-item; + background-color: #efefef; + background-color: var(--background); + padding: 10px; + margin: -10px -10px 0; + cursor: pointer; + outline: none; +} + +@media (prefers-color-scheme: dark) { + + summary { + background-color: #161f27; + background-color: var(--background); + } +} + +summary:hover, +summary:focus { + text-decoration: underline; +} + +details > :not(summary) { + margin-top: 0; +} + +summary::-webkit-details-marker { + color: #363636; + color: var(--text-main); +} + +@media (prefers-color-scheme: dark) { + + summary::-webkit-details-marker { + color: #dbdbdb; + color: var(--text-main); + } +} + +footer { + border-top: 1px solid #dbdbdb; + border-top: 1px solid var(--border); + padding-top: 10px; + color: #70777f; + color: var(--text-muted); +} + +@media (prefers-color-scheme: dark) { + + footer { + color: #a9b1ba; + color: var(--text-muted); + } +} + +@media (prefers-color-scheme: dark) { + + footer { + border-top: 1px solid #526980; + border-top: 1px solid var(--border); + } +} + +body > footer { + margin-top: 40px; +} + +@media print { + body, + pre, + code, + summary, + details, + button, + input, + textarea { + background-color: #fff; + } + + button, + input, + textarea { + border: 1px solid #000; + } + + body, + h1, + h2, + h3, + h4, + h5, + h6, + pre, + code, + button, + input, + textarea, + footer, + summary, + strong { + color: #000; + } + + summary::marker { + color: #000; + } + + summary::-webkit-details-marker { + color: #000; + } + + tbody tr:nth-child(even) { + background-color: #f2f2f2; + } + + a { + color: #00f; + text-decoration: underline; + } +} + +/* Fancy blur effect */ +#nprogress .peg { + display: block; + position: absolute; + right: 0px; + width: 100px; + height: 100%; + box-shadow: 0 0 10px #29d, 0 0 5px #29d; + opacity: 1.0; + + -webkit-transform: rotate(3deg) translate(0px, -4px); + -ms-transform: rotate(3deg) translate(0px, -4px); + transform: rotate(3deg) translate(0px, -4px); +} + +/* Remove these to get rid of the spinner */ +#nprogress .spinner { + display: block; + position: fixed; + z-index: 1031; + top: 15px; + right: 15px; +} + +#nprogress .spinner-icon { + width: 18px; + height: 18px; + box-sizing: border-box; + + border: solid 2px transparent; + border-top-color: #29d; + border-left-color: #29d; + border-radius: 50%; + + -webkit-animation: nprogress-spinner 400ms linear infinite; + animation: nprogress-spinner 400ms linear infinite; +} + +.nprogress-custom-parent { + overflow: hidden; + position: relative; +} + +.nprogress-custom-parent #nprogress .spinner, +.nprogress-custom-parent #nprogress .bar { + position: absolute; +} + +@-webkit-keyframes nprogress-spinner { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); } +} +@keyframes nprogress-spinner { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + + +/* This file is for your main application css. */ +/* LiveView specific classes for your customizations */ +.phx-no-feedback.invalid-feedback, +.phx-no-feedback .invalid-feedback { + display: none; } + +.phx-click-loading { + opacity: 0.5; + transition: opacity 1s ease-out; } + +.phx-disconnected { + cursor: wait; } + +.phx-disconnected * { + pointer-events: none; } + + +/* Booyah */ + +*, *::before { + box-sizing: border-box; +} + +html, body { + width: 100%; + height: 100%; +} + +main { + width: 100%; + height: 100%; + + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +body > div:first-child { + height: 100%; +} + +#flag { + flex: 3 0 100px; + width: 100%; + min-width: 100px; + + position: relative; +} + +.flag-valid::after { + content: "✓"; + color: lightgreen; +} + +.flag-failed::after { + content: "✗"; + color: coral; +} + +.flag-valid::after, .flag-failed::after { + position: absolute; + top: 50%; + left: 50%; + font-size: 50vw; + transform: translate(-50%, -50%); +} + +#title { + flex: 1 1; +} + +#timer { + flex: 1 1; + font-size: 5rem; +} + +#input-form { + flex: 1 1; +} + +#counter { + flex: 1 1; + font-size: 5rem; +} diff --git a/priv/static/css/flag-icon.css b/priv/static/css/flag-icon.css new file mode 100755 index 0000000..a4b0933 --- /dev/null +++ b/priv/static/css/flag-icon.css @@ -0,0 +1,1049 @@ +.flag-icon-background { + background-size: contain; + background-position: 50%; + background-repeat: no-repeat; +} +.flag-icon { + background-size: contain; + background-position: 50%; + background-repeat: no-repeat; + position: relative; + display: inline-block; + width: 1.33333333em; + line-height: 1em; +} +.flag-icon:before { + content: "\00a0"; +} +.flag-icon-ad { + background-image: url(../flags/4x3/ad.svg); +} + +.flag-icon-ae { + background-image: url(../flags/4x3/ae.svg); +} + +.flag-icon-af { + background-image: url(../flags/4x3/af.svg); +} + +.flag-icon-ag { + background-image: url(../flags/4x3/ag.svg); +} + +.flag-icon-ai { + background-image: url(../flags/4x3/ai.svg); +} + +.flag-icon-al { + background-image: url(../flags/4x3/al.svg); +} + +.flag-icon-am { + background-image: url(../flags/4x3/am.svg); +} + +.flag-icon-ao { + background-image: url(../flags/4x3/ao.svg); +} + +.flag-icon-aq { + background-image: url(../flags/4x3/aq.svg); +} + +.flag-icon-ar { + background-image: url(../flags/4x3/ar.svg); +} + +.flag-icon-as { + background-image: url(../flags/4x3/as.svg); +} + +.flag-icon-at { + background-image: url(../flags/4x3/at.svg); +} + +.flag-icon-au { + background-image: url(../flags/4x3/au.svg); +} + +.flag-icon-aw { + background-image: url(../flags/4x3/aw.svg); +} + +.flag-icon-ax { + background-image: url(../flags/4x3/ax.svg); +} + +.flag-icon-az { + background-image: url(../flags/4x3/az.svg); +} + +.flag-icon-ba { + background-image: url(../flags/4x3/ba.svg); +} + +.flag-icon-bb { + background-image: url(../flags/4x3/bb.svg); +} + +.flag-icon-bd { + background-image: url(../flags/4x3/bd.svg); +} + +.flag-icon-be { + background-image: url(../flags/4x3/be.svg); +} + +.flag-icon-bf { + background-image: url(../flags/4x3/bf.svg); +} + +.flag-icon-bg { + background-image: url(../flags/4x3/bg.svg); +} + +.flag-icon-bh { + background-image: url(../flags/4x3/bh.svg); +} + +.flag-icon-bi { + background-image: url(../flags/4x3/bi.svg); +} + +.flag-icon-bj { + background-image: url(../flags/4x3/bj.svg); +} + +.flag-icon-bl { + background-image: url(../flags/4x3/bl.svg); +} + +.flag-icon-bm { + background-image: url(../flags/4x3/bm.svg); +} + +.flag-icon-bn { + background-image: url(../flags/4x3/bn.svg); +} + +.flag-icon-bo { + background-image: url(../flags/4x3/bo.svg); +} + +.flag-icon-bq { + background-image: url(../flags/4x3/bq.svg); +} + +.flag-icon-br { + background-image: url(../flags/4x3/br.svg); +} + +.flag-icon-bs { + background-image: url(../flags/4x3/bs.svg); +} + +.flag-icon-bt { + background-image: url(../flags/4x3/bt.svg); +} + +.flag-icon-bv { + background-image: url(../flags/4x3/bv.svg); +} + +.flag-icon-bw { + background-image: url(../flags/4x3/bw.svg); +} + +.flag-icon-by { + background-image: url(../flags/4x3/by.svg); +} + +.flag-icon-bz { + background-image: url(../flags/4x3/bz.svg); +} + +.flag-icon-ca { + background-image: url(../flags/4x3/ca.svg); +} + +.flag-icon-cc { + background-image: url(../flags/4x3/cc.svg); +} + +.flag-icon-cd { + background-image: url(../flags/4x3/cd.svg); +} + +.flag-icon-cf { + background-image: url(../flags/4x3/cf.svg); +} + +.flag-icon-cg { + background-image: url(../flags/4x3/cg.svg); +} + +.flag-icon-ch { + background-image: url(../flags/4x3/ch.svg); +} + +.flag-icon-ci { + background-image: url(../flags/4x3/ci.svg); +} + +.flag-icon-ck { + background-image: url(../flags/4x3/ck.svg); +} + +.flag-icon-cl { + background-image: url(../flags/4x3/cl.svg); +} + +.flag-icon-cm { + background-image: url(../flags/4x3/cm.svg); +} + +.flag-icon-cn { + background-image: url(../flags/4x3/cn.svg); +} + +.flag-icon-co { + background-image: url(../flags/4x3/co.svg); +} + +.flag-icon-cr { + background-image: url(../flags/4x3/cr.svg); +} + +.flag-icon-cu { + background-image: url(../flags/4x3/cu.svg); +} + +.flag-icon-cv { + background-image: url(../flags/4x3/cv.svg); +} + +.flag-icon-cw { + background-image: url(../flags/4x3/cw.svg); +} + +.flag-icon-cx { + background-image: url(../flags/4x3/cx.svg); +} + +.flag-icon-cy { + background-image: url(../flags/4x3/cy.svg); +} + +.flag-icon-cz { + background-image: url(../flags/4x3/cz.svg); +} + +.flag-icon-de { + background-image: url(../flags/4x3/de.svg); +} + +.flag-icon-dj { + background-image: url(../flags/4x3/dj.svg); +} + +.flag-icon-dk { + background-image: url(../flags/4x3/dk.svg); +} + +.flag-icon-dm { + background-image: url(../flags/4x3/dm.svg); +} + +.flag-icon-do { + background-image: url(../flags/4x3/do.svg); +} + +.flag-icon-dz { + background-image: url(../flags/4x3/dz.svg); +} + +.flag-icon-ec { + background-image: url(../flags/4x3/ec.svg); +} + +.flag-icon-ee { + background-image: url(../flags/4x3/ee.svg); +} + +.flag-icon-eg { + background-image: url(../flags/4x3/eg.svg); +} + +.flag-icon-eh { + background-image: url(../flags/4x3/eh.svg); +} + +.flag-icon-er { + background-image: url(../flags/4x3/er.svg); +} + +.flag-icon-es { + background-image: url(../flags/4x3/es.svg); +} + +.flag-icon-et { + background-image: url(../flags/4x3/et.svg); +} + +.flag-icon-fi { + background-image: url(../flags/4x3/fi.svg); +} + +.flag-icon-fj { + background-image: url(../flags/4x3/fj.svg); +} + +.flag-icon-fk { + background-image: url(../flags/4x3/fk.svg); +} + +.flag-icon-fm { + background-image: url(../flags/4x3/fm.svg); +} + +.flag-icon-fo { + background-image: url(../flags/4x3/fo.svg); +} + +.flag-icon-fr { + background-image: url(../flags/4x3/fr.svg); +} + +.flag-icon-ga { + background-image: url(../flags/4x3/ga.svg); +} + +.flag-icon-gb { + background-image: url(../flags/4x3/gb.svg); +} + +.flag-icon-gd { + background-image: url(../flags/4x3/gd.svg); +} + +.flag-icon-ge { + background-image: url(../flags/4x3/ge.svg); +} + +.flag-icon-gf { + background-image: url(../flags/4x3/gf.svg); +} + +.flag-icon-gg { + background-image: url(../flags/4x3/gg.svg); +} + +.flag-icon-gh { + background-image: url(../flags/4x3/gh.svg); +} + +.flag-icon-gi { + background-image: url(../flags/4x3/gi.svg); +} + +.flag-icon-gl { + background-image: url(../flags/4x3/gl.svg); +} + +.flag-icon-gm { + background-image: url(../flags/4x3/gm.svg); +} + +.flag-icon-gn { + background-image: url(../flags/4x3/gn.svg); +} + +.flag-icon-gp { + background-image: url(../flags/4x3/gp.svg); +} + +.flag-icon-gq { + background-image: url(../flags/4x3/gq.svg); +} + +.flag-icon-gr { + background-image: url(../flags/4x3/gr.svg); +} + +.flag-icon-gs { + background-image: url(../flags/4x3/gs.svg); +} + +.flag-icon-gt { + background-image: url(../flags/4x3/gt.svg); +} + +.flag-icon-gu { + background-image: url(../flags/4x3/gu.svg); +} + +.flag-icon-gw { + background-image: url(../flags/4x3/gw.svg); +} + +.flag-icon-gy { + background-image: url(../flags/4x3/gy.svg); +} + +.flag-icon-hk { + background-image: url(../flags/4x3/hk.svg); +} + +.flag-icon-hm { + background-image: url(../flags/4x3/hm.svg); +} + +.flag-icon-hn { + background-image: url(../flags/4x3/hn.svg); +} + +.flag-icon-hr { + background-image: url(../flags/4x3/hr.svg); +} + +.flag-icon-ht { + background-image: url(../flags/4x3/ht.svg); +} + +.flag-icon-hu { + background-image: url(../flags/4x3/hu.svg); +} + +.flag-icon-id { + background-image: url(../flags/4x3/id.svg); +} + +.flag-icon-ie { + background-image: url(../flags/4x3/ie.svg); +} + +.flag-icon-il { + background-image: url(../flags/4x3/il.svg); +} + +.flag-icon-im { + background-image: url(../flags/4x3/im.svg); +} + +.flag-icon-in { + background-image: url(../flags/4x3/in.svg); +} + +.flag-icon-io { + background-image: url(../flags/4x3/io.svg); +} + +.flag-icon-iq { + background-image: url(../flags/4x3/iq.svg); +} + +.flag-icon-ir { + background-image: url(../flags/4x3/ir.svg); +} + +.flag-icon-is { + background-image: url(../flags/4x3/is.svg); +} + +.flag-icon-it { + background-image: url(../flags/4x3/it.svg); +} + +.flag-icon-je { + background-image: url(../flags/4x3/je.svg); +} + +.flag-icon-jm { + background-image: url(../flags/4x3/jm.svg); +} + +.flag-icon-jo { + background-image: url(../flags/4x3/jo.svg); +} + +.flag-icon-jp { + background-image: url(../flags/4x3/jp.svg); +} + +.flag-icon-ke { + background-image: url(../flags/4x3/ke.svg); +} + +.flag-icon-kg { + background-image: url(../flags/4x3/kg.svg); +} + +.flag-icon-kh { + background-image: url(../flags/4x3/kh.svg); +} + +.flag-icon-ki { + background-image: url(../flags/4x3/ki.svg); +} + +.flag-icon-km { + background-image: url(../flags/4x3/km.svg); +} + +.flag-icon-kn { + background-image: url(../flags/4x3/kn.svg); +} + +.flag-icon-kp { + background-image: url(../flags/4x3/kp.svg); +} + +.flag-icon-kr { + background-image: url(../flags/4x3/kr.svg); +} + +.flag-icon-kw { + background-image: url(../flags/4x3/kw.svg); +} + +.flag-icon-ky { + background-image: url(../flags/4x3/ky.svg); +} + +.flag-icon-kz { + background-image: url(../flags/4x3/kz.svg); +} + +.flag-icon-la { + background-image: url(../flags/4x3/la.svg); +} + +.flag-icon-lb { + background-image: url(../flags/4x3/lb.svg); +} + +.flag-icon-lc { + background-image: url(../flags/4x3/lc.svg); +} + +.flag-icon-li { + background-image: url(../flags/4x3/li.svg); +} + +.flag-icon-lk { + background-image: url(../flags/4x3/lk.svg); +} + +.flag-icon-lr { + background-image: url(../flags/4x3/lr.svg); +} + +.flag-icon-ls { + background-image: url(../flags/4x3/ls.svg); +} + +.flag-icon-lt { + background-image: url(../flags/4x3/lt.svg); +} + +.flag-icon-lu { + background-image: url(../flags/4x3/lu.svg); +} + +.flag-icon-lv { + background-image: url(../flags/4x3/lv.svg); +} + +.flag-icon-ly { + background-image: url(../flags/4x3/ly.svg); +} + +.flag-icon-ma { + background-image: url(../flags/4x3/ma.svg); +} + +.flag-icon-mc { + background-image: url(../flags/4x3/mc.svg); +} + +.flag-icon-md { + background-image: url(../flags/4x3/md.svg); +} + +.flag-icon-me { + background-image: url(../flags/4x3/me.svg); +} + +.flag-icon-mf { + background-image: url(../flags/4x3/mf.svg); +} + +.flag-icon-mg { + background-image: url(../flags/4x3/mg.svg); +} + +.flag-icon-mh { + background-image: url(../flags/4x3/mh.svg); +} + +.flag-icon-mk { + background-image: url(../flags/4x3/mk.svg); +} + +.flag-icon-ml { + background-image: url(../flags/4x3/ml.svg); +} + +.flag-icon-mm { + background-image: url(../flags/4x3/mm.svg); +} + +.flag-icon-mn { + background-image: url(../flags/4x3/mn.svg); +} + +.flag-icon-mo { + background-image: url(../flags/4x3/mo.svg); +} + +.flag-icon-mp { + background-image: url(../flags/4x3/mp.svg); +} + +.flag-icon-mq { + background-image: url(../flags/4x3/mq.svg); +} + +.flag-icon-mr { + background-image: url(../flags/4x3/mr.svg); +} + +.flag-icon-ms { + background-image: url(../flags/4x3/ms.svg); +} + +.flag-icon-mt { + background-image: url(../flags/4x3/mt.svg); +} + +.flag-icon-mu { + background-image: url(../flags/4x3/mu.svg); +} + +.flag-icon-mv { + background-image: url(../flags/4x3/mv.svg); +} + +.flag-icon-mw { + background-image: url(../flags/4x3/mw.svg); +} + +.flag-icon-mx { + background-image: url(../flags/4x3/mx.svg); +} + +.flag-icon-my { + background-image: url(../flags/4x3/my.svg); +} + +.flag-icon-mz { + background-image: url(../flags/4x3/mz.svg); +} + +.flag-icon-na { + background-image: url(../flags/4x3/na.svg); +} + +.flag-icon-nc { + background-image: url(../flags/4x3/nc.svg); +} + +.flag-icon-ne { + background-image: url(../flags/4x3/ne.svg); +} + +.flag-icon-nf { + background-image: url(../flags/4x3/nf.svg); +} + +.flag-icon-ng { + background-image: url(../flags/4x3/ng.svg); +} + +.flag-icon-ni { + background-image: url(../flags/4x3/ni.svg); +} + +.flag-icon-nl { + background-image: url(../flags/4x3/nl.svg); +} + +.flag-icon-no { + background-image: url(../flags/4x3/no.svg); +} + +.flag-icon-np { + background-image: url(../flags/4x3/np.svg); +} + +.flag-icon-nr { + background-image: url(../flags/4x3/nr.svg); +} + +.flag-icon-nu { + background-image: url(../flags/4x3/nu.svg); +} + +.flag-icon-nz { + background-image: url(../flags/4x3/nz.svg); +} + +.flag-icon-om { + background-image: url(../flags/4x3/om.svg); +} + +.flag-icon-pa { + background-image: url(../flags/4x3/pa.svg); +} + +.flag-icon-pe { + background-image: url(../flags/4x3/pe.svg); +} + +.flag-icon-pf { + background-image: url(../flags/4x3/pf.svg); +} + +.flag-icon-pg { + background-image: url(../flags/4x3/pg.svg); +} + +.flag-icon-ph { + background-image: url(../flags/4x3/ph.svg); +} + +.flag-icon-pk { + background-image: url(../flags/4x3/pk.svg); +} + +.flag-icon-pl { + background-image: url(../flags/4x3/pl.svg); +} + +.flag-icon-pm { + background-image: url(../flags/4x3/pm.svg); +} + +.flag-icon-pn { + background-image: url(../flags/4x3/pn.svg); +} + +.flag-icon-pr { + background-image: url(../flags/4x3/pr.svg); +} + +.flag-icon-ps { + background-image: url(../flags/4x3/ps.svg); +} + +.flag-icon-pt { + background-image: url(../flags/4x3/pt.svg); +} + +.flag-icon-pw { + background-image: url(../flags/4x3/pw.svg); +} + +.flag-icon-py { + background-image: url(../flags/4x3/py.svg); +} + +.flag-icon-qa { + background-image: url(../flags/4x3/qa.svg); +} + +.flag-icon-re { + background-image: url(../flags/4x3/re.svg); +} + +.flag-icon-ro { + background-image: url(../flags/4x3/ro.svg); +} + +.flag-icon-rs { + background-image: url(../flags/4x3/rs.svg); +} + +.flag-icon-ru { + background-image: url(../flags/4x3/ru.svg); +} + +.flag-icon-rw { + background-image: url(../flags/4x3/rw.svg); +} + +.flag-icon-sa { + background-image: url(../flags/4x3/sa.svg); +} + +.flag-icon-sb { + background-image: url(../flags/4x3/sb.svg); +} + +.flag-icon-sc { + background-image: url(../flags/4x3/sc.svg); +} + +.flag-icon-sd { + background-image: url(../flags/4x3/sd.svg); +} + +.flag-icon-se { + background-image: url(../flags/4x3/se.svg); +} + +.flag-icon-sg { + background-image: url(../flags/4x3/sg.svg); +} + +.flag-icon-sh { + background-image: url(../flags/4x3/sh.svg); +} + +.flag-icon-si { + background-image: url(../flags/4x3/si.svg); +} + +.flag-icon-sj { + background-image: url(../flags/4x3/sj.svg); +} + +.flag-icon-sk { + background-image: url(../flags/4x3/sk.svg); +} + +.flag-icon-sl { + background-image: url(../flags/4x3/sl.svg); +} + +.flag-icon-sm { + background-image: url(../flags/4x3/sm.svg); +} + +.flag-icon-sn { + background-image: url(../flags/4x3/sn.svg); +} + +.flag-icon-so { + background-image: url(../flags/4x3/so.svg); +} + +.flag-icon-sr { + background-image: url(../flags/4x3/sr.svg); +} + +.flag-icon-ss { + background-image: url(../flags/4x3/ss.svg); +} + +.flag-icon-st { + background-image: url(../flags/4x3/st.svg); +} + +.flag-icon-sv { + background-image: url(../flags/4x3/sv.svg); +} + +.flag-icon-sx { + background-image: url(../flags/4x3/sx.svg); +} + +.flag-icon-sy { + background-image: url(../flags/4x3/sy.svg); +} + +.flag-icon-sz { + background-image: url(../flags/4x3/sz.svg); +} + +.flag-icon-tc { + background-image: url(../flags/4x3/tc.svg); +} + +.flag-icon-td { + background-image: url(../flags/4x3/td.svg); +} + +.flag-icon-tf { + background-image: url(../flags/4x3/tf.svg); +} + +.flag-icon-tg { + background-image: url(../flags/4x3/tg.svg); +} + +.flag-icon-th { + background-image: url(../flags/4x3/th.svg); +} + +.flag-icon-tj { + background-image: url(../flags/4x3/tj.svg); +} + +.flag-icon-tk { + background-image: url(../flags/4x3/tk.svg); +} + +.flag-icon-tl { + background-image: url(../flags/4x3/tl.svg); +} + +.flag-icon-tm { + background-image: url(../flags/4x3/tm.svg); +} + +.flag-icon-tn { + background-image: url(../flags/4x3/tn.svg); +} + +.flag-icon-to { + background-image: url(../flags/4x3/to.svg); +} + +.flag-icon-tr { + background-image: url(../flags/4x3/tr.svg); +} + +.flag-icon-tt { + background-image: url(../flags/4x3/tt.svg); +} + +.flag-icon-tv { + background-image: url(../flags/4x3/tv.svg); +} + +.flag-icon-tw { + background-image: url(../flags/4x3/tw.svg); +} + +.flag-icon-tz { + background-image: url(../flags/4x3/tz.svg); +} + +.flag-icon-ua { + background-image: url(../flags/4x3/ua.svg); +} + +.flag-icon-ug { + background-image: url(../flags/4x3/ug.svg); +} + +.flag-icon-um { + background-image: url(../flags/4x3/um.svg); +} + +.flag-icon-us { + background-image: url(../flags/4x3/us.svg); +} + +.flag-icon-uy { + background-image: url(../flags/4x3/uy.svg); +} + +.flag-icon-uz { + background-image: url(../flags/4x3/uz.svg); +} + +.flag-icon-va { + background-image: url(../flags/4x3/va.svg); +} + +.flag-icon-vc { + background-image: url(../flags/4x3/vc.svg); +} + +.flag-icon-ve { + background-image: url(../flags/4x3/ve.svg); +} + +.flag-icon-vg { + background-image: url(../flags/4x3/vg.svg); +} + +.flag-icon-vi { + background-image: url(../flags/4x3/vi.svg); +} + +.flag-icon-vn { + background-image: url(../flags/4x3/vn.svg); +} + +.flag-icon-vu { + background-image: url(../flags/4x3/vu.svg); +} + +.flag-icon-wf { + background-image: url(../flags/4x3/wf.svg); +} + +.flag-icon-ws { + background-image: url(../flags/4x3/ws.svg); +} + +.flag-icon-ye { + background-image: url(../flags/4x3/ye.svg); +} + +.flag-icon-yt { + background-image: url(../flags/4x3/yt.svg); +} + +.flag-icon-za { + background-image: url(../flags/4x3/za.svg); +} + +.flag-icon-zm { + background-image: url(../flags/4x3/zm.svg); +} + +.flag-icon-zw { + background-image: url(../flags/4x3/zw.svg); +} + +.flag-icon-es-ct { + background-image: url(../flags/4x3/es-ct.svg); +} + +.flag-icon-es-ga { + background-image: url(../flags/4x3/es-ga.svg); +} + +.flag-icon-eu { + background-image: url(../flags/4x3/eu.svg); +} + +.flag-icon-gb-eng { + background-image: url(../flags/4x3/gb-eng.svg); +} + +.flag-icon-gb-nir { + background-image: url(../flags/4x3/gb-nir.svg); +} + +.flag-icon-gb-sct { + background-image: url(../flags/4x3/gb-sct.svg); +} + +.flag-icon-gb-wls { + background-image: url(../flags/4x3/gb-wls.svg); +} + +.flag-icon-un { + background-image: url(../flags/4x3/un.svg); +} + +.flag-icon-xk { + background-image: url(../flags/4x3/xk.svg); +} + diff --git a/priv/static/favicon.ico b/priv/static/favicon.ico new file mode 100644 index 0000000..73de524 Binary files /dev/null and b/priv/static/favicon.ico differ diff --git a/priv/static/flags/4x3/ad.svg b/priv/static/flags/4x3/ad.svg new file mode 100755 index 0000000..7320bf2 --- /dev/null +++ b/priv/static/flags/4x3/ad.svg @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/ae.svg b/priv/static/flags/4x3/ae.svg new file mode 100755 index 0000000..a7bdb17 --- /dev/null +++ b/priv/static/flags/4x3/ae.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/priv/static/flags/4x3/af.svg b/priv/static/flags/4x3/af.svg new file mode 100755 index 0000000..399c1c7 --- /dev/null +++ b/priv/static/flags/4x3/af.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/ag.svg b/priv/static/flags/4x3/ag.svg new file mode 100755 index 0000000..bdeee48 --- /dev/null +++ b/priv/static/flags/4x3/ag.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/ai.svg b/priv/static/flags/4x3/ai.svg new file mode 100755 index 0000000..29e6586 --- /dev/null +++ b/priv/static/flags/4x3/ai.svg @@ -0,0 +1,763 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/al.svg b/priv/static/flags/4x3/al.svg new file mode 100755 index 0000000..e831b02 --- /dev/null +++ b/priv/static/flags/4x3/al.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/priv/static/flags/4x3/am.svg b/priv/static/flags/4x3/am.svg new file mode 100755 index 0000000..0cd2178 --- /dev/null +++ b/priv/static/flags/4x3/am.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/priv/static/flags/4x3/ao.svg b/priv/static/flags/4x3/ao.svg new file mode 100755 index 0000000..a0b6dbb --- /dev/null +++ b/priv/static/flags/4x3/ao.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/aq.svg b/priv/static/flags/4x3/aq.svg new file mode 100755 index 0000000..2000e3c --- /dev/null +++ b/priv/static/flags/4x3/aq.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/priv/static/flags/4x3/ar.svg b/priv/static/flags/4x3/ar.svg new file mode 100755 index 0000000..4553b08 --- /dev/null +++ b/priv/static/flags/4x3/ar.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/as.svg b/priv/static/flags/4x3/as.svg new file mode 100755 index 0000000..81b0d9f --- /dev/null +++ b/priv/static/flags/4x3/as.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/at.svg b/priv/static/flags/4x3/at.svg new file mode 100755 index 0000000..e63fb2e --- /dev/null +++ b/priv/static/flags/4x3/at.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/priv/static/flags/4x3/au.svg b/priv/static/flags/4x3/au.svg new file mode 100755 index 0000000..18394ab --- /dev/null +++ b/priv/static/flags/4x3/au.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/priv/static/flags/4x3/aw.svg b/priv/static/flags/4x3/aw.svg new file mode 100755 index 0000000..66adb11 --- /dev/null +++ b/priv/static/flags/4x3/aw.svg @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/ax.svg b/priv/static/flags/4x3/ax.svg new file mode 100755 index 0000000..dad7d94 --- /dev/null +++ b/priv/static/flags/4x3/ax.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/az.svg b/priv/static/flags/4x3/az.svg new file mode 100755 index 0000000..4293e9f --- /dev/null +++ b/priv/static/flags/4x3/az.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/priv/static/flags/4x3/ba.svg b/priv/static/flags/4x3/ba.svg new file mode 100755 index 0000000..6402c10 --- /dev/null +++ b/priv/static/flags/4x3/ba.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/bb.svg b/priv/static/flags/4x3/bb.svg new file mode 100755 index 0000000..73f5329 --- /dev/null +++ b/priv/static/flags/4x3/bb.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/priv/static/flags/4x3/bd.svg b/priv/static/flags/4x3/bd.svg new file mode 100755 index 0000000..1e3433e --- /dev/null +++ b/priv/static/flags/4x3/bd.svg @@ -0,0 +1,4 @@ + + + + diff --git a/priv/static/flags/4x3/be.svg b/priv/static/flags/4x3/be.svg new file mode 100755 index 0000000..eaf016d --- /dev/null +++ b/priv/static/flags/4x3/be.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/bf.svg b/priv/static/flags/4x3/bf.svg new file mode 100755 index 0000000..a0ca050 --- /dev/null +++ b/priv/static/flags/4x3/bf.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/bg.svg b/priv/static/flags/4x3/bg.svg new file mode 100755 index 0000000..15ba696 --- /dev/null +++ b/priv/static/flags/4x3/bg.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/bh.svg b/priv/static/flags/4x3/bh.svg new file mode 100755 index 0000000..d4a32c0 --- /dev/null +++ b/priv/static/flags/4x3/bh.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/priv/static/flags/4x3/bi.svg b/priv/static/flags/4x3/bi.svg new file mode 100755 index 0000000..091f2df --- /dev/null +++ b/priv/static/flags/4x3/bi.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/bj.svg b/priv/static/flags/4x3/bj.svg new file mode 100755 index 0000000..fa0df27 --- /dev/null +++ b/priv/static/flags/4x3/bj.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/bl.svg b/priv/static/flags/4x3/bl.svg new file mode 100755 index 0000000..ecf6ec4 --- /dev/null +++ b/priv/static/flags/4x3/bl.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/bm.svg b/priv/static/flags/4x3/bm.svg new file mode 100755 index 0000000..5e2c873 --- /dev/null +++ b/priv/static/flags/4x3/bm.svg @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/bn.svg b/priv/static/flags/4x3/bn.svg new file mode 100755 index 0000000..ab6678f --- /dev/null +++ b/priv/static/flags/4x3/bn.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/bo.svg b/priv/static/flags/4x3/bo.svg new file mode 100755 index 0000000..c2dcbc8 --- /dev/null +++ b/priv/static/flags/4x3/bo.svg @@ -0,0 +1,676 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/bq.svg b/priv/static/flags/4x3/bq.svg new file mode 100755 index 0000000..4b74eb4 --- /dev/null +++ b/priv/static/flags/4x3/bq.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/priv/static/flags/4x3/br.svg b/priv/static/flags/4x3/br.svg new file mode 100755 index 0000000..3252a8e --- /dev/null +++ b/priv/static/flags/4x3/br.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/bs.svg b/priv/static/flags/4x3/bs.svg new file mode 100755 index 0000000..a14500b --- /dev/null +++ b/priv/static/flags/4x3/bs.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/bt.svg b/priv/static/flags/4x3/bt.svg new file mode 100755 index 0000000..f4b6e63 --- /dev/null +++ b/priv/static/flags/4x3/bt.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/bv.svg b/priv/static/flags/4x3/bv.svg new file mode 100755 index 0000000..71d098a --- /dev/null +++ b/priv/static/flags/4x3/bv.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/bw.svg b/priv/static/flags/4x3/bw.svg new file mode 100755 index 0000000..3d65eda --- /dev/null +++ b/priv/static/flags/4x3/bw.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/by.svg b/priv/static/flags/4x3/by.svg new file mode 100755 index 0000000..9566c6a --- /dev/null +++ b/priv/static/flags/4x3/by.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/bz.svg b/priv/static/flags/4x3/bz.svg new file mode 100755 index 0000000..6824957 --- /dev/null +++ b/priv/static/flags/4x3/bz.svg @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/ca.svg b/priv/static/flags/4x3/ca.svg new file mode 100755 index 0000000..4843fc3 --- /dev/null +++ b/priv/static/flags/4x3/ca.svg @@ -0,0 +1,4 @@ + + + + diff --git a/priv/static/flags/4x3/cc.svg b/priv/static/flags/4x3/cc.svg new file mode 100755 index 0000000..2c45698 --- /dev/null +++ b/priv/static/flags/4x3/cc.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/cd.svg b/priv/static/flags/4x3/cd.svg new file mode 100755 index 0000000..739fab7 --- /dev/null +++ b/priv/static/flags/4x3/cd.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/priv/static/flags/4x3/cf.svg b/priv/static/flags/4x3/cf.svg new file mode 100755 index 0000000..9f19138 --- /dev/null +++ b/priv/static/flags/4x3/cf.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/cg.svg b/priv/static/flags/4x3/cg.svg new file mode 100755 index 0000000..8b66be2 --- /dev/null +++ b/priv/static/flags/4x3/cg.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/ch.svg b/priv/static/flags/4x3/ch.svg new file mode 100755 index 0000000..f5ec8d4 --- /dev/null +++ b/priv/static/flags/4x3/ch.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/priv/static/flags/4x3/ci.svg b/priv/static/flags/4x3/ci.svg new file mode 100755 index 0000000..2bd7104 --- /dev/null +++ b/priv/static/flags/4x3/ci.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/ck.svg b/priv/static/flags/4x3/ck.svg new file mode 100755 index 0000000..e4f0d0c --- /dev/null +++ b/priv/static/flags/4x3/ck.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/priv/static/flags/4x3/cl.svg b/priv/static/flags/4x3/cl.svg new file mode 100755 index 0000000..287a37e --- /dev/null +++ b/priv/static/flags/4x3/cl.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/cm.svg b/priv/static/flags/4x3/cm.svg new file mode 100755 index 0000000..b4272b7 --- /dev/null +++ b/priv/static/flags/4x3/cm.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/cn.svg b/priv/static/flags/4x3/cn.svg new file mode 100755 index 0000000..72080b6 --- /dev/null +++ b/priv/static/flags/4x3/cn.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/priv/static/flags/4x3/co.svg b/priv/static/flags/4x3/co.svg new file mode 100755 index 0000000..0d74127 --- /dev/null +++ b/priv/static/flags/4x3/co.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/cr.svg b/priv/static/flags/4x3/cr.svg new file mode 100755 index 0000000..133b029 --- /dev/null +++ b/priv/static/flags/4x3/cr.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/cu.svg b/priv/static/flags/4x3/cu.svg new file mode 100755 index 0000000..079a29b --- /dev/null +++ b/priv/static/flags/4x3/cu.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/cv.svg b/priv/static/flags/4x3/cv.svg new file mode 100755 index 0000000..39a7b7e --- /dev/null +++ b/priv/static/flags/4x3/cv.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/cw.svg b/priv/static/flags/4x3/cw.svg new file mode 100755 index 0000000..533644d --- /dev/null +++ b/priv/static/flags/4x3/cw.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/cx.svg b/priv/static/flags/4x3/cx.svg new file mode 100755 index 0000000..f5b89b7 --- /dev/null +++ b/priv/static/flags/4x3/cx.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/cy.svg b/priv/static/flags/4x3/cy.svg new file mode 100755 index 0000000..3d483a1 --- /dev/null +++ b/priv/static/flags/4x3/cy.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/priv/static/flags/4x3/cz.svg b/priv/static/flags/4x3/cz.svg new file mode 100755 index 0000000..8767581 --- /dev/null +++ b/priv/static/flags/4x3/cz.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/priv/static/flags/4x3/de.svg b/priv/static/flags/4x3/de.svg new file mode 100755 index 0000000..1acf302 --- /dev/null +++ b/priv/static/flags/4x3/de.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/priv/static/flags/4x3/dj.svg b/priv/static/flags/4x3/dj.svg new file mode 100755 index 0000000..f328f3a --- /dev/null +++ b/priv/static/flags/4x3/dj.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/dk.svg b/priv/static/flags/4x3/dk.svg new file mode 100755 index 0000000..ab47e0c --- /dev/null +++ b/priv/static/flags/4x3/dk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/priv/static/flags/4x3/dm.svg b/priv/static/flags/4x3/dm.svg new file mode 100755 index 0000000..e35d7ca --- /dev/null +++ b/priv/static/flags/4x3/dm.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/do.svg b/priv/static/flags/4x3/do.svg new file mode 100755 index 0000000..97bae5f --- /dev/null +++ b/priv/static/flags/4x3/do.svg @@ -0,0 +1,6745 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/dz.svg b/priv/static/flags/4x3/dz.svg new file mode 100755 index 0000000..aa4eca2 --- /dev/null +++ b/priv/static/flags/4x3/dz.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/priv/static/flags/4x3/ec.svg b/priv/static/flags/4x3/ec.svg new file mode 100755 index 0000000..42fbef5 --- /dev/null +++ b/priv/static/flags/4x3/ec.svg @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/ee.svg b/priv/static/flags/4x3/ee.svg new file mode 100755 index 0000000..aa917bb --- /dev/null +++ b/priv/static/flags/4x3/ee.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/eg.svg b/priv/static/flags/4x3/eg.svg new file mode 100755 index 0000000..a755cd7 --- /dev/null +++ b/priv/static/flags/4x3/eg.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/eh.svg b/priv/static/flags/4x3/eh.svg new file mode 100755 index 0000000..438c382 --- /dev/null +++ b/priv/static/flags/4x3/eh.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/er.svg b/priv/static/flags/4x3/er.svg new file mode 100755 index 0000000..7a25798 --- /dev/null +++ b/priv/static/flags/4x3/er.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/priv/static/flags/4x3/es-ct.svg b/priv/static/flags/4x3/es-ct.svg new file mode 100755 index 0000000..9b07e7a --- /dev/null +++ b/priv/static/flags/4x3/es-ct.svg @@ -0,0 +1,4 @@ + + + + diff --git a/priv/static/flags/4x3/es-ga.svg b/priv/static/flags/4x3/es-ga.svg new file mode 100755 index 0000000..4e213f5 --- /dev/null +++ b/priv/static/flags/4x3/es-ga.svg @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/es.svg b/priv/static/flags/4x3/es.svg new file mode 100755 index 0000000..576dd67 --- /dev/null +++ b/priv/static/flags/4x3/es.svg @@ -0,0 +1,544 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/et.svg b/priv/static/flags/4x3/et.svg new file mode 100755 index 0000000..9145fd7 --- /dev/null +++ b/priv/static/flags/4x3/et.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/eu.svg b/priv/static/flags/4x3/eu.svg new file mode 100755 index 0000000..b6a39f5 --- /dev/null +++ b/priv/static/flags/4x3/eu.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/fi.svg b/priv/static/flags/4x3/fi.svg new file mode 100755 index 0000000..c3451a4 --- /dev/null +++ b/priv/static/flags/4x3/fi.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/priv/static/flags/4x3/fj.svg b/priv/static/flags/4x3/fj.svg new file mode 100755 index 0000000..c7549b5 --- /dev/null +++ b/priv/static/flags/4x3/fj.svg @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/fk.svg b/priv/static/flags/4x3/fk.svg new file mode 100755 index 0000000..28ad702 --- /dev/null +++ b/priv/static/flags/4x3/fk.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/fm.svg b/priv/static/flags/4x3/fm.svg new file mode 100755 index 0000000..54f3e77 --- /dev/null +++ b/priv/static/flags/4x3/fm.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/priv/static/flags/4x3/fo.svg b/priv/static/flags/4x3/fo.svg new file mode 100755 index 0000000..341d52e --- /dev/null +++ b/priv/static/flags/4x3/fo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/fr.svg b/priv/static/flags/4x3/fr.svg new file mode 100755 index 0000000..712c8a5 --- /dev/null +++ b/priv/static/flags/4x3/fr.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/ga.svg b/priv/static/flags/4x3/ga.svg new file mode 100755 index 0000000..1f0a9ca --- /dev/null +++ b/priv/static/flags/4x3/ga.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/gb-eng.svg b/priv/static/flags/4x3/gb-eng.svg new file mode 100755 index 0000000..eab52bd --- /dev/null +++ b/priv/static/flags/4x3/gb-eng.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/priv/static/flags/4x3/gb-nir.svg b/priv/static/flags/4x3/gb-nir.svg new file mode 100755 index 0000000..e043b3e --- /dev/null +++ b/priv/static/flags/4x3/gb-nir.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/gb-sct.svg b/priv/static/flags/4x3/gb-sct.svg new file mode 100755 index 0000000..169bfba --- /dev/null +++ b/priv/static/flags/4x3/gb-sct.svg @@ -0,0 +1,4 @@ + + + + diff --git a/priv/static/flags/4x3/gb-wls.svg b/priv/static/flags/4x3/gb-wls.svg new file mode 100755 index 0000000..48a6420 --- /dev/null +++ b/priv/static/flags/4x3/gb-wls.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/priv/static/flags/4x3/gb.svg b/priv/static/flags/4x3/gb.svg new file mode 100755 index 0000000..132dbed --- /dev/null +++ b/priv/static/flags/4x3/gb.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/gd.svg b/priv/static/flags/4x3/gd.svg new file mode 100755 index 0000000..f2254f3 --- /dev/null +++ b/priv/static/flags/4x3/gd.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/ge.svg b/priv/static/flags/4x3/ge.svg new file mode 100755 index 0000000..8abdee3 --- /dev/null +++ b/priv/static/flags/4x3/ge.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/priv/static/flags/4x3/gf.svg b/priv/static/flags/4x3/gf.svg new file mode 100755 index 0000000..e382883 --- /dev/null +++ b/priv/static/flags/4x3/gf.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/gg.svg b/priv/static/flags/4x3/gg.svg new file mode 100755 index 0000000..deb4af5 --- /dev/null +++ b/priv/static/flags/4x3/gg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/priv/static/flags/4x3/gh.svg b/priv/static/flags/4x3/gh.svg new file mode 100755 index 0000000..3f97834 --- /dev/null +++ b/priv/static/flags/4x3/gh.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/priv/static/flags/4x3/gi.svg b/priv/static/flags/4x3/gi.svg new file mode 100755 index 0000000..1b44fd6 --- /dev/null +++ b/priv/static/flags/4x3/gi.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/gl.svg b/priv/static/flags/4x3/gl.svg new file mode 100755 index 0000000..20f5c5e --- /dev/null +++ b/priv/static/flags/4x3/gl.svg @@ -0,0 +1,4 @@ + + + + diff --git a/priv/static/flags/4x3/gm.svg b/priv/static/flags/4x3/gm.svg new file mode 100755 index 0000000..76d03af --- /dev/null +++ b/priv/static/flags/4x3/gm.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/gn.svg b/priv/static/flags/4x3/gn.svg new file mode 100755 index 0000000..7841e8d --- /dev/null +++ b/priv/static/flags/4x3/gn.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/gp.svg b/priv/static/flags/4x3/gp.svg new file mode 100755 index 0000000..24a8260 --- /dev/null +++ b/priv/static/flags/4x3/gp.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/gq.svg b/priv/static/flags/4x3/gq.svg new file mode 100755 index 0000000..4cec1a5 --- /dev/null +++ b/priv/static/flags/4x3/gq.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/gr.svg b/priv/static/flags/4x3/gr.svg new file mode 100755 index 0000000..581af28 --- /dev/null +++ b/priv/static/flags/4x3/gr.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/gs.svg b/priv/static/flags/4x3/gs.svg new file mode 100755 index 0000000..6833555 --- /dev/null +++ b/priv/static/flags/4x3/gs.svg @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + L + + + E + + + O + + + T + + + E + + + R + + + R + + + R + + + R + + + R + + + E + + + O + + + O + + + A + + + A + + + A + + + M + + + P + + + P + + + P + + + I + + + T + + + T + + + M + + + G + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/gt.svg b/priv/static/flags/4x3/gt.svg new file mode 100755 index 0000000..724e970 --- /dev/null +++ b/priv/static/flags/4x3/gt.svg @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/gu.svg b/priv/static/flags/4x3/gu.svg new file mode 100755 index 0000000..00e8615 --- /dev/null +++ b/priv/static/flags/4x3/gu.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + G + + + U + + + A + + + M + + + + + + + + G + + + U + + + A + + + M + + diff --git a/priv/static/flags/4x3/gw.svg b/priv/static/flags/4x3/gw.svg new file mode 100755 index 0000000..ae17314 --- /dev/null +++ b/priv/static/flags/4x3/gw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/gy.svg b/priv/static/flags/4x3/gy.svg new file mode 100755 index 0000000..e957f3e --- /dev/null +++ b/priv/static/flags/4x3/gy.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/priv/static/flags/4x3/hk.svg b/priv/static/flags/4x3/hk.svg new file mode 100755 index 0000000..9e45292 --- /dev/null +++ b/priv/static/flags/4x3/hk.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/hm.svg b/priv/static/flags/4x3/hm.svg new file mode 100755 index 0000000..a9dda07 --- /dev/null +++ b/priv/static/flags/4x3/hm.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/priv/static/flags/4x3/hn.svg b/priv/static/flags/4x3/hn.svg new file mode 100755 index 0000000..47af518 --- /dev/null +++ b/priv/static/flags/4x3/hn.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/hr.svg b/priv/static/flags/4x3/hr.svg new file mode 100755 index 0000000..7b699d3 --- /dev/null +++ b/priv/static/flags/4x3/hr.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/ht.svg b/priv/static/flags/4x3/ht.svg new file mode 100755 index 0000000..14f67d7 --- /dev/null +++ b/priv/static/flags/4x3/ht.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/hu.svg b/priv/static/flags/4x3/hu.svg new file mode 100755 index 0000000..177da97 --- /dev/null +++ b/priv/static/flags/4x3/hu.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/id.svg b/priv/static/flags/4x3/id.svg new file mode 100755 index 0000000..0663baf --- /dev/null +++ b/priv/static/flags/4x3/id.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/priv/static/flags/4x3/ie.svg b/priv/static/flags/4x3/ie.svg new file mode 100755 index 0000000..53f3464 --- /dev/null +++ b/priv/static/flags/4x3/ie.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/il.svg b/priv/static/flags/4x3/il.svg new file mode 100755 index 0000000..fc10b47 --- /dev/null +++ b/priv/static/flags/4x3/il.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/im.svg b/priv/static/flags/4x3/im.svg new file mode 100755 index 0000000..31b2222 --- /dev/null +++ b/priv/static/flags/4x3/im.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/in.svg b/priv/static/flags/4x3/in.svg new file mode 100755 index 0000000..6b831bc --- /dev/null +++ b/priv/static/flags/4x3/in.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/io.svg b/priv/static/flags/4x3/io.svg new file mode 100755 index 0000000..d6e5854 --- /dev/null +++ b/priv/static/flags/4x3/io.svg @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/iq.svg b/priv/static/flags/4x3/iq.svg new file mode 100755 index 0000000..ab90fd0 --- /dev/null +++ b/priv/static/flags/4x3/iq.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/priv/static/flags/4x3/ir.svg b/priv/static/flags/4x3/ir.svg new file mode 100755 index 0000000..ffb37b4 --- /dev/null +++ b/priv/static/flags/4x3/ir.svg @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/is.svg b/priv/static/flags/4x3/is.svg new file mode 100755 index 0000000..a7524b5 --- /dev/null +++ b/priv/static/flags/4x3/is.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/it.svg b/priv/static/flags/4x3/it.svg new file mode 100755 index 0000000..5cb92aa --- /dev/null +++ b/priv/static/flags/4x3/it.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/je.svg b/priv/static/flags/4x3/je.svg new file mode 100755 index 0000000..d90f124 --- /dev/null +++ b/priv/static/flags/4x3/je.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/jm.svg b/priv/static/flags/4x3/jm.svg new file mode 100755 index 0000000..535daf4 --- /dev/null +++ b/priv/static/flags/4x3/jm.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/priv/static/flags/4x3/jo.svg b/priv/static/flags/4x3/jo.svg new file mode 100755 index 0000000..3a17678 --- /dev/null +++ b/priv/static/flags/4x3/jo.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/jp.svg b/priv/static/flags/4x3/jp.svg new file mode 100755 index 0000000..d415816 --- /dev/null +++ b/priv/static/flags/4x3/jp.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/priv/static/flags/4x3/ke.svg b/priv/static/flags/4x3/ke.svg new file mode 100755 index 0000000..c1fd2d8 --- /dev/null +++ b/priv/static/flags/4x3/ke.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/kg.svg b/priv/static/flags/4x3/kg.svg new file mode 100755 index 0000000..936767b --- /dev/null +++ b/priv/static/flags/4x3/kg.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/kh.svg b/priv/static/flags/4x3/kh.svg new file mode 100755 index 0000000..7cd890a --- /dev/null +++ b/priv/static/flags/4x3/kh.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/ki.svg b/priv/static/flags/4x3/ki.svg new file mode 100755 index 0000000..604890c --- /dev/null +++ b/priv/static/flags/4x3/ki.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/km.svg b/priv/static/flags/4x3/km.svg new file mode 100755 index 0000000..a6ccb8d --- /dev/null +++ b/priv/static/flags/4x3/km.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/kn.svg b/priv/static/flags/4x3/kn.svg new file mode 100755 index 0000000..d13066b --- /dev/null +++ b/priv/static/flags/4x3/kn.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/kp.svg b/priv/static/flags/4x3/kp.svg new file mode 100755 index 0000000..06b4e38 --- /dev/null +++ b/priv/static/flags/4x3/kp.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/kr.svg b/priv/static/flags/4x3/kr.svg new file mode 100755 index 0000000..39508cb --- /dev/null +++ b/priv/static/flags/4x3/kr.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/kw.svg b/priv/static/flags/4x3/kw.svg new file mode 100755 index 0000000..b4a4bf2 --- /dev/null +++ b/priv/static/flags/4x3/kw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/ky.svg b/priv/static/flags/4x3/ky.svg new file mode 100755 index 0000000..1a2d9c9 --- /dev/null +++ b/priv/static/flags/4x3/ky.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/kz.svg b/priv/static/flags/4x3/kz.svg new file mode 100755 index 0000000..049d6fd --- /dev/null +++ b/priv/static/flags/4x3/kz.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/la.svg b/priv/static/flags/4x3/la.svg new file mode 100755 index 0000000..a87bc98 --- /dev/null +++ b/priv/static/flags/4x3/la.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/lb.svg b/priv/static/flags/4x3/lb.svg new file mode 100755 index 0000000..0967842 --- /dev/null +++ b/priv/static/flags/4x3/lb.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/lc.svg b/priv/static/flags/4x3/lc.svg new file mode 100755 index 0000000..8ba746c --- /dev/null +++ b/priv/static/flags/4x3/lc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/priv/static/flags/4x3/li.svg b/priv/static/flags/4x3/li.svg new file mode 100755 index 0000000..6b4160c --- /dev/null +++ b/priv/static/flags/4x3/li.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/lk.svg b/priv/static/flags/4x3/lk.svg new file mode 100755 index 0000000..4a377f1 --- /dev/null +++ b/priv/static/flags/4x3/lk.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/lr.svg b/priv/static/flags/4x3/lr.svg new file mode 100755 index 0000000..00e3629 --- /dev/null +++ b/priv/static/flags/4x3/lr.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/ls.svg b/priv/static/flags/4x3/ls.svg new file mode 100755 index 0000000..5dd5b0c --- /dev/null +++ b/priv/static/flags/4x3/ls.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/priv/static/flags/4x3/lt.svg b/priv/static/flags/4x3/lt.svg new file mode 100755 index 0000000..36e30e9 --- /dev/null +++ b/priv/static/flags/4x3/lt.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/lu.svg b/priv/static/flags/4x3/lu.svg new file mode 100755 index 0000000..bf6ca16 --- /dev/null +++ b/priv/static/flags/4x3/lu.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/priv/static/flags/4x3/lv.svg b/priv/static/flags/4x3/lv.svg new file mode 100755 index 0000000..efa5a32 --- /dev/null +++ b/priv/static/flags/4x3/lv.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/priv/static/flags/4x3/ly.svg b/priv/static/flags/4x3/ly.svg new file mode 100755 index 0000000..fcc2dc9 --- /dev/null +++ b/priv/static/flags/4x3/ly.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/ma.svg b/priv/static/flags/4x3/ma.svg new file mode 100755 index 0000000..8de4077 --- /dev/null +++ b/priv/static/flags/4x3/ma.svg @@ -0,0 +1,4 @@ + + + + diff --git a/priv/static/flags/4x3/mc.svg b/priv/static/flags/4x3/mc.svg new file mode 100755 index 0000000..45133dc --- /dev/null +++ b/priv/static/flags/4x3/mc.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/priv/static/flags/4x3/md.svg b/priv/static/flags/4x3/md.svg new file mode 100755 index 0000000..a86be90 --- /dev/null +++ b/priv/static/flags/4x3/md.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/me.svg b/priv/static/flags/4x3/me.svg new file mode 100755 index 0000000..613083f --- /dev/null +++ b/priv/static/flags/4x3/me.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/mf.svg b/priv/static/flags/4x3/mf.svg new file mode 100755 index 0000000..bf46785 --- /dev/null +++ b/priv/static/flags/4x3/mf.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/mg.svg b/priv/static/flags/4x3/mg.svg new file mode 100755 index 0000000..76e84fc --- /dev/null +++ b/priv/static/flags/4x3/mg.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/mh.svg b/priv/static/flags/4x3/mh.svg new file mode 100755 index 0000000..f74e99d --- /dev/null +++ b/priv/static/flags/4x3/mh.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/mk.svg b/priv/static/flags/4x3/mk.svg new file mode 100755 index 0000000..1f1eaf6 --- /dev/null +++ b/priv/static/flags/4x3/mk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/priv/static/flags/4x3/ml.svg b/priv/static/flags/4x3/ml.svg new file mode 100755 index 0000000..66da1bb --- /dev/null +++ b/priv/static/flags/4x3/ml.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/mm.svg b/priv/static/flags/4x3/mm.svg new file mode 100755 index 0000000..c77927e --- /dev/null +++ b/priv/static/flags/4x3/mm.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/mn.svg b/priv/static/flags/4x3/mn.svg new file mode 100755 index 0000000..6c62973 --- /dev/null +++ b/priv/static/flags/4x3/mn.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/mo.svg b/priv/static/flags/4x3/mo.svg new file mode 100755 index 0000000..30e9129 --- /dev/null +++ b/priv/static/flags/4x3/mo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/priv/static/flags/4x3/mp.svg b/priv/static/flags/4x3/mp.svg new file mode 100755 index 0000000..bf9ed63 --- /dev/null +++ b/priv/static/flags/4x3/mp.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/mq.svg b/priv/static/flags/4x3/mq.svg new file mode 100755 index 0000000..b389d43 --- /dev/null +++ b/priv/static/flags/4x3/mq.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/mr.svg b/priv/static/flags/4x3/mr.svg new file mode 100755 index 0000000..b53ce61 --- /dev/null +++ b/priv/static/flags/4x3/mr.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/priv/static/flags/4x3/ms.svg b/priv/static/flags/4x3/ms.svg new file mode 100755 index 0000000..5796863 --- /dev/null +++ b/priv/static/flags/4x3/ms.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/mt.svg b/priv/static/flags/4x3/mt.svg new file mode 100755 index 0000000..93fe67b --- /dev/null +++ b/priv/static/flags/4x3/mt.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/mu.svg b/priv/static/flags/4x3/mu.svg new file mode 100755 index 0000000..102ed3b --- /dev/null +++ b/priv/static/flags/4x3/mu.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/priv/static/flags/4x3/mv.svg b/priv/static/flags/4x3/mv.svg new file mode 100755 index 0000000..2525c92 --- /dev/null +++ b/priv/static/flags/4x3/mv.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/priv/static/flags/4x3/mw.svg b/priv/static/flags/4x3/mw.svg new file mode 100755 index 0000000..5bd17f8 --- /dev/null +++ b/priv/static/flags/4x3/mw.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/priv/static/flags/4x3/mx.svg b/priv/static/flags/4x3/mx.svg new file mode 100755 index 0000000..7de1b66 --- /dev/null +++ b/priv/static/flags/4x3/mx.svg @@ -0,0 +1,382 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/my.svg b/priv/static/flags/4x3/my.svg new file mode 100755 index 0000000..a08f085 --- /dev/null +++ b/priv/static/flags/4x3/my.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/mz.svg b/priv/static/flags/4x3/mz.svg new file mode 100755 index 0000000..2e98e99 --- /dev/null +++ b/priv/static/flags/4x3/mz.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/na.svg b/priv/static/flags/4x3/na.svg new file mode 100755 index 0000000..f2f571f --- /dev/null +++ b/priv/static/flags/4x3/na.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/nc.svg b/priv/static/flags/4x3/nc.svg new file mode 100755 index 0000000..5c6c5e0 --- /dev/null +++ b/priv/static/flags/4x3/nc.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/ne.svg b/priv/static/flags/4x3/ne.svg new file mode 100755 index 0000000..f470907 --- /dev/null +++ b/priv/static/flags/4x3/ne.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/priv/static/flags/4x3/nf.svg b/priv/static/flags/4x3/nf.svg new file mode 100755 index 0000000..46d7e8f --- /dev/null +++ b/priv/static/flags/4x3/nf.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/priv/static/flags/4x3/ng.svg b/priv/static/flags/4x3/ng.svg new file mode 100755 index 0000000..42ee5ad --- /dev/null +++ b/priv/static/flags/4x3/ng.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/priv/static/flags/4x3/ni.svg b/priv/static/flags/4x3/ni.svg new file mode 100755 index 0000000..f77ed63 --- /dev/null +++ b/priv/static/flags/4x3/ni.svg @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/nl.svg b/priv/static/flags/4x3/nl.svg new file mode 100755 index 0000000..2026937 --- /dev/null +++ b/priv/static/flags/4x3/nl.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/priv/static/flags/4x3/no.svg b/priv/static/flags/4x3/no.svg new file mode 100755 index 0000000..56e78e1 --- /dev/null +++ b/priv/static/flags/4x3/no.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/np.svg b/priv/static/flags/4x3/np.svg new file mode 100755 index 0000000..4e151e4 --- /dev/null +++ b/priv/static/flags/4x3/np.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/nr.svg b/priv/static/flags/4x3/nr.svg new file mode 100755 index 0000000..cfdc0d1 --- /dev/null +++ b/priv/static/flags/4x3/nr.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/nu.svg b/priv/static/flags/4x3/nu.svg new file mode 100755 index 0000000..bc06b55 --- /dev/null +++ b/priv/static/flags/4x3/nu.svg @@ -0,0 +1,29 @@ + + + + + + + +Flag of Niue + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/nz.svg b/priv/static/flags/4x3/nz.svg new file mode 100755 index 0000000..ba7cac0 --- /dev/null +++ b/priv/static/flags/4x3/nz.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/om.svg b/priv/static/flags/4x3/om.svg new file mode 100755 index 0000000..68fe15d --- /dev/null +++ b/priv/static/flags/4x3/om.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/pa.svg b/priv/static/flags/4x3/pa.svg new file mode 100755 index 0000000..09b3e11 --- /dev/null +++ b/priv/static/flags/4x3/pa.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/pe.svg b/priv/static/flags/4x3/pe.svg new file mode 100755 index 0000000..71a1be1 --- /dev/null +++ b/priv/static/flags/4x3/pe.svg @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/pf.svg b/priv/static/flags/4x3/pf.svg new file mode 100755 index 0000000..7a32556 --- /dev/null +++ b/priv/static/flags/4x3/pf.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/pg.svg b/priv/static/flags/4x3/pg.svg new file mode 100755 index 0000000..5fb0cd5 --- /dev/null +++ b/priv/static/flags/4x3/pg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/priv/static/flags/4x3/ph.svg b/priv/static/flags/4x3/ph.svg new file mode 100755 index 0000000..a0c37d8 --- /dev/null +++ b/priv/static/flags/4x3/ph.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/priv/static/flags/4x3/pk.svg b/priv/static/flags/4x3/pk.svg new file mode 100755 index 0000000..387265c --- /dev/null +++ b/priv/static/flags/4x3/pk.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/pl.svg b/priv/static/flags/4x3/pl.svg new file mode 100755 index 0000000..c00513a --- /dev/null +++ b/priv/static/flags/4x3/pl.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/priv/static/flags/4x3/pm.svg b/priv/static/flags/4x3/pm.svg new file mode 100755 index 0000000..07ea24c --- /dev/null +++ b/priv/static/flags/4x3/pm.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/pn.svg b/priv/static/flags/4x3/pn.svg new file mode 100755 index 0000000..80682ab --- /dev/null +++ b/priv/static/flags/4x3/pn.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/pr.svg b/priv/static/flags/4x3/pr.svg new file mode 100755 index 0000000..191c56a --- /dev/null +++ b/priv/static/flags/4x3/pr.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/ps.svg b/priv/static/flags/4x3/ps.svg new file mode 100755 index 0000000..a6dedf5 --- /dev/null +++ b/priv/static/flags/4x3/ps.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/pt.svg b/priv/static/flags/4x3/pt.svg new file mode 100755 index 0000000..fa9621f --- /dev/null +++ b/priv/static/flags/4x3/pt.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/pw.svg b/priv/static/flags/4x3/pw.svg new file mode 100755 index 0000000..8127a2c --- /dev/null +++ b/priv/static/flags/4x3/pw.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/priv/static/flags/4x3/py.svg b/priv/static/flags/4x3/py.svg new file mode 100755 index 0000000..1402520 --- /dev/null +++ b/priv/static/flags/4x3/py.svg @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/qa.svg b/priv/static/flags/4x3/qa.svg new file mode 100755 index 0000000..0f93a9d --- /dev/null +++ b/priv/static/flags/4x3/qa.svg @@ -0,0 +1,4 @@ + + + + diff --git a/priv/static/flags/4x3/re.svg b/priv/static/flags/4x3/re.svg new file mode 100755 index 0000000..827103b --- /dev/null +++ b/priv/static/flags/4x3/re.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/ro.svg b/priv/static/flags/4x3/ro.svg new file mode 100755 index 0000000..d43c1e2 --- /dev/null +++ b/priv/static/flags/4x3/ro.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/rs.svg b/priv/static/flags/4x3/rs.svg new file mode 100755 index 0000000..6469365 --- /dev/null +++ b/priv/static/flags/4x3/rs.svg @@ -0,0 +1,292 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/ru.svg b/priv/static/flags/4x3/ru.svg new file mode 100755 index 0000000..f56fddb --- /dev/null +++ b/priv/static/flags/4x3/ru.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/rw.svg b/priv/static/flags/4x3/rw.svg new file mode 100755 index 0000000..afed4e3 --- /dev/null +++ b/priv/static/flags/4x3/rw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/sa.svg b/priv/static/flags/4x3/sa.svg new file mode 100755 index 0000000..c9e8cca --- /dev/null +++ b/priv/static/flags/4x3/sa.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/sb.svg b/priv/static/flags/4x3/sb.svg new file mode 100755 index 0000000..b8e1f8e --- /dev/null +++ b/priv/static/flags/4x3/sb.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/sc.svg b/priv/static/flags/4x3/sc.svg new file mode 100755 index 0000000..2286e14 --- /dev/null +++ b/priv/static/flags/4x3/sc.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/sd.svg b/priv/static/flags/4x3/sd.svg new file mode 100755 index 0000000..9981494 --- /dev/null +++ b/priv/static/flags/4x3/sd.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/se.svg b/priv/static/flags/4x3/se.svg new file mode 100755 index 0000000..e9977d7 --- /dev/null +++ b/priv/static/flags/4x3/se.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/priv/static/flags/4x3/sg.svg b/priv/static/flags/4x3/sg.svg new file mode 100755 index 0000000..8931660 --- /dev/null +++ b/priv/static/flags/4x3/sg.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/sh.svg b/priv/static/flags/4x3/sh.svg new file mode 100755 index 0000000..a768813 --- /dev/null +++ b/priv/static/flags/4x3/sh.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/si.svg b/priv/static/flags/4x3/si.svg new file mode 100755 index 0000000..a83515b --- /dev/null +++ b/priv/static/flags/4x3/si.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/sj.svg b/priv/static/flags/4x3/sj.svg new file mode 100755 index 0000000..8e5d104 --- /dev/null +++ b/priv/static/flags/4x3/sj.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/sk.svg b/priv/static/flags/4x3/sk.svg new file mode 100755 index 0000000..3d9ea27 --- /dev/null +++ b/priv/static/flags/4x3/sk.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/priv/static/flags/4x3/sl.svg b/priv/static/flags/4x3/sl.svg new file mode 100755 index 0000000..51e2676 --- /dev/null +++ b/priv/static/flags/4x3/sl.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/sm.svg b/priv/static/flags/4x3/sm.svg new file mode 100755 index 0000000..dbe605e --- /dev/null +++ b/priv/static/flags/4x3/sm.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + L + + + I + + + B + + + E + + + R + + + T + + + A + + + S + + + + diff --git a/priv/static/flags/4x3/sn.svg b/priv/static/flags/4x3/sn.svg new file mode 100755 index 0000000..c06616f --- /dev/null +++ b/priv/static/flags/4x3/sn.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/priv/static/flags/4x3/so.svg b/priv/static/flags/4x3/so.svg new file mode 100755 index 0000000..def9fa3 --- /dev/null +++ b/priv/static/flags/4x3/so.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/priv/static/flags/4x3/sr.svg b/priv/static/flags/4x3/sr.svg new file mode 100755 index 0000000..9a169fd --- /dev/null +++ b/priv/static/flags/4x3/sr.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/priv/static/flags/4x3/ss.svg b/priv/static/flags/4x3/ss.svg new file mode 100755 index 0000000..4efa598 --- /dev/null +++ b/priv/static/flags/4x3/ss.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/priv/static/flags/4x3/st.svg b/priv/static/flags/4x3/st.svg new file mode 100755 index 0000000..a6bd218 --- /dev/null +++ b/priv/static/flags/4x3/st.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/sv.svg b/priv/static/flags/4x3/sv.svg new file mode 100755 index 0000000..d15caac --- /dev/null +++ b/priv/static/flags/4x3/sv.svg @@ -0,0 +1,594 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/sx.svg b/priv/static/flags/4x3/sx.svg new file mode 100755 index 0000000..9ddaf0d --- /dev/null +++ b/priv/static/flags/4x3/sx.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/sy.svg b/priv/static/flags/4x3/sy.svg new file mode 100755 index 0000000..b30a3ba --- /dev/null +++ b/priv/static/flags/4x3/sy.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/priv/static/flags/4x3/sz.svg b/priv/static/flags/4x3/sz.svg new file mode 100755 index 0000000..4904c42 --- /dev/null +++ b/priv/static/flags/4x3/sz.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/tc.svg b/priv/static/flags/4x3/tc.svg new file mode 100755 index 0000000..a78d1fe --- /dev/null +++ b/priv/static/flags/4x3/tc.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/td.svg b/priv/static/flags/4x3/td.svg new file mode 100755 index 0000000..734473e --- /dev/null +++ b/priv/static/flags/4x3/td.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/tf.svg b/priv/static/flags/4x3/tf.svg new file mode 100755 index 0000000..3913728 --- /dev/null +++ b/priv/static/flags/4x3/tf.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/tg.svg b/priv/static/flags/4x3/tg.svg new file mode 100755 index 0000000..09ba198 --- /dev/null +++ b/priv/static/flags/4x3/tg.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/th.svg b/priv/static/flags/4x3/th.svg new file mode 100755 index 0000000..66fcd8e --- /dev/null +++ b/priv/static/flags/4x3/th.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/tj.svg b/priv/static/flags/4x3/tj.svg new file mode 100755 index 0000000..92ac160 --- /dev/null +++ b/priv/static/flags/4x3/tj.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/tk.svg b/priv/static/flags/4x3/tk.svg new file mode 100755 index 0000000..312e881 --- /dev/null +++ b/priv/static/flags/4x3/tk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/priv/static/flags/4x3/tl.svg b/priv/static/flags/4x3/tl.svg new file mode 100755 index 0000000..94738dd --- /dev/null +++ b/priv/static/flags/4x3/tl.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/tm.svg b/priv/static/flags/4x3/tm.svg new file mode 100755 index 0000000..a0fadb6 --- /dev/null +++ b/priv/static/flags/4x3/tm.svg @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/tn.svg b/priv/static/flags/4x3/tn.svg new file mode 100755 index 0000000..c6aaecb --- /dev/null +++ b/priv/static/flags/4x3/tn.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/to.svg b/priv/static/flags/4x3/to.svg new file mode 100755 index 0000000..4dd38e4 --- /dev/null +++ b/priv/static/flags/4x3/to.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/priv/static/flags/4x3/tr.svg b/priv/static/flags/4x3/tr.svg new file mode 100755 index 0000000..f1910ee --- /dev/null +++ b/priv/static/flags/4x3/tr.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/priv/static/flags/4x3/tt.svg b/priv/static/flags/4x3/tt.svg new file mode 100755 index 0000000..19add52 --- /dev/null +++ b/priv/static/flags/4x3/tt.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/priv/static/flags/4x3/tv.svg b/priv/static/flags/4x3/tv.svg new file mode 100755 index 0000000..a63338d --- /dev/null +++ b/priv/static/flags/4x3/tv.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/tw.svg b/priv/static/flags/4x3/tw.svg new file mode 100755 index 0000000..000250e --- /dev/null +++ b/priv/static/flags/4x3/tw.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/tz.svg b/priv/static/flags/4x3/tz.svg new file mode 100755 index 0000000..5c80173 --- /dev/null +++ b/priv/static/flags/4x3/tz.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/ua.svg b/priv/static/flags/4x3/ua.svg new file mode 100755 index 0000000..a93d06d --- /dev/null +++ b/priv/static/flags/4x3/ua.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/priv/static/flags/4x3/ug.svg b/priv/static/flags/4x3/ug.svg new file mode 100755 index 0000000..c996cbd --- /dev/null +++ b/priv/static/flags/4x3/ug.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/um.svg b/priv/static/flags/4x3/um.svg new file mode 100755 index 0000000..1aa1162 --- /dev/null +++ b/priv/static/flags/4x3/um.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/un.svg b/priv/static/flags/4x3/un.svg new file mode 100755 index 0000000..b623650 --- /dev/null +++ b/priv/static/flags/4x3/un.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/us.svg b/priv/static/flags/4x3/us.svg new file mode 100755 index 0000000..5b55267 --- /dev/null +++ b/priv/static/flags/4x3/us.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/priv/static/flags/4x3/uy.svg b/priv/static/flags/4x3/uy.svg new file mode 100755 index 0000000..bad58e5 --- /dev/null +++ b/priv/static/flags/4x3/uy.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/uz.svg b/priv/static/flags/4x3/uz.svg new file mode 100755 index 0000000..3ede7f1 --- /dev/null +++ b/priv/static/flags/4x3/uz.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/va.svg b/priv/static/flags/4x3/va.svg new file mode 100755 index 0000000..258cca9 --- /dev/null +++ b/priv/static/flags/4x3/va.svg @@ -0,0 +1,479 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/vc.svg b/priv/static/flags/4x3/vc.svg new file mode 100755 index 0000000..99ba90f --- /dev/null +++ b/priv/static/flags/4x3/vc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/priv/static/flags/4x3/ve.svg b/priv/static/flags/4x3/ve.svg new file mode 100755 index 0000000..98ef473 --- /dev/null +++ b/priv/static/flags/4x3/ve.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/vg.svg b/priv/static/flags/4x3/vg.svg new file mode 100755 index 0000000..2c69495 --- /dev/null +++ b/priv/static/flags/4x3/vg.svg @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/vi.svg b/priv/static/flags/4x3/vi.svg new file mode 100755 index 0000000..db0e62c --- /dev/null +++ b/priv/static/flags/4x3/vi.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/vn.svg b/priv/static/flags/4x3/vn.svg new file mode 100755 index 0000000..3fc2279 --- /dev/null +++ b/priv/static/flags/4x3/vn.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/priv/static/flags/4x3/vu.svg b/priv/static/flags/4x3/vu.svg new file mode 100755 index 0000000..a773285 --- /dev/null +++ b/priv/static/flags/4x3/vu.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/wf.svg b/priv/static/flags/4x3/wf.svg new file mode 100755 index 0000000..9d43586 --- /dev/null +++ b/priv/static/flags/4x3/wf.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/ws.svg b/priv/static/flags/4x3/ws.svg new file mode 100755 index 0000000..1b3ecf4 --- /dev/null +++ b/priv/static/flags/4x3/ws.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/xk.svg b/priv/static/flags/4x3/xk.svg new file mode 100755 index 0000000..7e41b1d --- /dev/null +++ b/priv/static/flags/4x3/xk.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/ye.svg b/priv/static/flags/4x3/ye.svg new file mode 100755 index 0000000..1befdec --- /dev/null +++ b/priv/static/flags/4x3/ye.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/yt.svg b/priv/static/flags/4x3/yt.svg new file mode 100755 index 0000000..f198fff --- /dev/null +++ b/priv/static/flags/4x3/yt.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/priv/static/flags/4x3/za.svg b/priv/static/flags/4x3/za.svg new file mode 100755 index 0000000..7a420a0 --- /dev/null +++ b/priv/static/flags/4x3/za.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/zm.svg b/priv/static/flags/4x3/zm.svg new file mode 100755 index 0000000..9e723c6 --- /dev/null +++ b/priv/static/flags/4x3/zm.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/flags/4x3/zw.svg b/priv/static/flags/4x3/zw.svg new file mode 100755 index 0000000..1b18e84 --- /dev/null +++ b/priv/static/flags/4x3/zw.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/priv/static/js/app.js b/priv/static/js/app.js new file mode 100644 index 0000000..9269e90 --- /dev/null +++ b/priv/static/js/app.js @@ -0,0 +1,207 @@ +/******/ (function (modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if (installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; + /******/ + } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} + /******/ + }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; + /******/ + } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function (exports, name, getter) { +/******/ if (!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); + /******/ + } + /******/ + }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function (exports) { +/******/ if (typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); + /******/ + } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); + /******/ + }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function (value, mode) { +/******/ if (mode & 1) value = __webpack_require__(value); +/******/ if (mode & 8) return value; +/******/ if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if (mode & 2 && typeof value != 'string') for (var key in value) __webpack_require__.d(ns, key, function (key) { return value[key]; }.bind(null, key)); +/******/ return ns; + /******/ + }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function (module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; + /******/ + }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = "/js/"; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 0); + /******/ +}) +/************************************************************************/ +/******/({ + +/***/ "../deps/phoenix/priv/static/phoenix.js": +/*!**********************************************!*\ + !*** ../deps/phoenix/priv/static/phoenix.js ***! + \**********************************************/ +/*! no static exports found */ +/***/ (function (module, exports, __webpack_require__) { + + eval("!function (e, t) {\n true ? module.exports = t() : undefined;\n}(this, function () {\n return function (e) {\n var t = {};\n\n function n(i) {\n if (t[i]) return t[i].exports;\n var o = t[i] = {\n i: i,\n l: !1,\n exports: {}\n };\n return e[i].call(o.exports, o, o.exports, n), o.l = !0, o.exports;\n }\n\n return n.m = e, n.c = t, n.d = function (e, t, i) {\n n.o(e, t) || Object.defineProperty(e, t, {\n enumerable: !0,\n get: i\n });\n }, n.r = function (e) {\n \"undefined\" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {\n value: \"Module\"\n }), Object.defineProperty(e, \"__esModule\", {\n value: !0\n });\n }, n.t = function (e, t) {\n if (1 & t && (e = n(e)), 8 & t) return e;\n if (4 & t && \"object\" == typeof e && e && e.__esModule) return e;\n var i = Object.create(null);\n if (n.r(i), Object.defineProperty(i, \"default\", {\n enumerable: !0,\n value: e\n }), 2 & t && \"string\" != typeof e) for (var o in e) n.d(i, o, function (t) {\n return e[t];\n }.bind(null, o));\n return i;\n }, n.n = function (e) {\n var t = e && e.__esModule ? function () {\n return e.default;\n } : function () {\n return e;\n };\n return n.d(t, \"a\", t), t;\n }, n.o = function (e, t) {\n return Object.prototype.hasOwnProperty.call(e, t);\n }, n.p = \"\", n(n.s = 0);\n }([function (e, t, n) {\n (function (t) {\n e.exports = t.Phoenix = n(2);\n }).call(this, n(1));\n }, function (e, t) {\n var n;\n\n n = function () {\n return this;\n }();\n\n try {\n n = n || new Function(\"return this\")();\n } catch (e) {\n \"object\" == typeof window && (n = window);\n }\n\n e.exports = n;\n }, function (e, t, n) {\n \"use strict\";\n\n function i(e) {\n return function (e) {\n if (Array.isArray(e)) return a(e);\n }(e) || function (e) {\n if (\"undefined\" != typeof Symbol && Symbol.iterator in Object(e)) return Array.from(e);\n }(e) || s(e) || function () {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }();\n }\n\n function o(e) {\n return (o = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (e) {\n return typeof e;\n } : function (e) {\n return e && \"function\" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? \"symbol\" : typeof e;\n })(e);\n }\n\n function r(e, t) {\n return function (e) {\n if (Array.isArray(e)) return e;\n }(e) || function (e, t) {\n if (\"undefined\" == typeof Symbol || !(Symbol.iterator in Object(e))) return;\n var n = [],\n i = !0,\n o = !1,\n r = void 0;\n\n try {\n for (var s, a = e[Symbol.iterator](); !(i = (s = a.next()).done) && (n.push(s.value), !t || n.length !== t); i = !0);\n } catch (e) {\n o = !0, r = e;\n } finally {\n try {\n i || null == a.return || a.return();\n } finally {\n if (o) throw r;\n }\n }\n\n return n;\n }(e, t) || s(e, t) || function () {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }();\n }\n\n function s(e, t) {\n if (e) {\n if (\"string\" == typeof e) return a(e, t);\n var n = Object.prototype.toString.call(e).slice(8, -1);\n return \"Object\" === n && e.constructor && (n = e.constructor.name), \"Map\" === n || \"Set\" === n ? Array.from(n) : \"Arguments\" === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? a(e, t) : void 0;\n }\n }\n\n function a(e, t) {\n (null == t || t > e.length) && (t = e.length);\n\n for (var n = 0, i = new Array(t); n < t; n++) i[n] = e[n];\n\n return i;\n }\n\n function c(e, t) {\n if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n }\n\n function u(e, t) {\n for (var n = 0; n < t.length; n++) {\n var i = t[n];\n i.enumerable = i.enumerable || !1, i.configurable = !0, \"value\" in i && (i.writable = !0), Object.defineProperty(e, i.key, i);\n }\n }\n\n function h(e, t, n) {\n return t && u(e.prototype, t), n && u(e, n), e;\n }\n\n n.r(t), n.d(t, \"Channel\", function () {\n return _;\n }), n.d(t, \"Serializer\", function () {\n return H;\n }), n.d(t, \"Socket\", function () {\n return U;\n }), n.d(t, \"LongPoll\", function () {\n return D;\n }), n.d(t, \"Ajax\", function () {\n return M;\n }), n.d(t, \"Presence\", function () {\n return N;\n });\n\n var l = \"undefined\" != typeof self ? self : null,\n f = \"undefined\" != typeof window ? window : null,\n d = l || f || void 0,\n p = 0,\n v = 1,\n y = 2,\n m = 3,\n g = \"closed\",\n k = \"errored\",\n b = \"joined\",\n j = \"joining\",\n C = \"leaving\",\n E = \"phx_close\",\n R = \"phx_error\",\n T = \"phx_join\",\n S = \"phx_reply\",\n w = \"phx_leave\",\n A = [E, R, T, S, w],\n L = \"longpoll\",\n x = \"websocket\",\n O = function (e) {\n if (\"function\" == typeof e) return e;\n return function () {\n return e;\n };\n },\n P = function () {\n function e(t, n, i, o) {\n c(this, e), this.channel = t, this.event = n, this.payload = i || function () {\n return {};\n }, this.receivedResp = null, this.timeout = o, this.timeoutTimer = null, this.recHooks = [], this.sent = !1;\n }\n\n return h(e, [{\n key: \"resend\",\n value: function (e) {\n this.timeout = e, this.reset(), this.send();\n }\n }, {\n key: \"send\",\n value: function () {\n this.hasReceived(\"timeout\") || (this.startTimeout(), this.sent = !0, this.channel.socket.push({\n topic: this.channel.topic,\n event: this.event,\n payload: this.payload(),\n ref: this.ref,\n join_ref: this.channel.joinRef()\n }));\n }\n }, {\n key: \"receive\",\n value: function (e, t) {\n return this.hasReceived(e) && t(this.receivedResp.response), this.recHooks.push({\n status: e,\n callback: t\n }), this;\n }\n }, {\n key: \"reset\",\n value: function () {\n this.cancelRefEvent(), this.ref = null, this.refEvent = null, this.receivedResp = null, this.sent = !1;\n }\n }, {\n key: \"matchReceive\",\n value: function (e) {\n var t = e.status,\n n = e.response;\n e.ref;\n this.recHooks.filter(function (e) {\n return e.status === t;\n }).forEach(function (e) {\n return e.callback(n);\n });\n }\n }, {\n key: \"cancelRefEvent\",\n value: function () {\n this.refEvent && this.channel.off(this.refEvent);\n }\n }, {\n key: \"cancelTimeout\",\n value: function () {\n clearTimeout(this.timeoutTimer), this.timeoutTimer = null;\n }\n }, {\n key: \"startTimeout\",\n value: function () {\n var e = this;\n this.timeoutTimer && this.cancelTimeout(), this.ref = this.channel.socket.makeRef(), this.refEvent = this.channel.replyEventName(this.ref), this.channel.on(this.refEvent, function (t) {\n e.cancelRefEvent(), e.cancelTimeout(), e.receivedResp = t, e.matchReceive(t);\n }), this.timeoutTimer = setTimeout(function () {\n e.trigger(\"timeout\", {});\n }, this.timeout);\n }\n }, {\n key: \"hasReceived\",\n value: function (e) {\n return this.receivedResp && this.receivedResp.status === e;\n }\n }, {\n key: \"trigger\",\n value: function (e, t) {\n this.channel.trigger(this.refEvent, {\n status: e,\n response: t\n });\n }\n }]), e;\n }(),\n _ = function () {\n function e(t, n, i) {\n var o = this;\n c(this, e), this.state = g, this.topic = t, this.params = O(n || {}), this.socket = i, this.bindings = [], this.bindingRef = 0, this.timeout = this.socket.timeout, this.joinedOnce = !1, this.joinPush = new P(this, T, this.params, this.timeout), this.pushBuffer = [], this.stateChangeRefs = [], this.rejoinTimer = new J(function () {\n o.socket.isConnected() && o.rejoin();\n }, this.socket.rejoinAfterMs), this.stateChangeRefs.push(this.socket.onError(function () {\n return o.rejoinTimer.reset();\n })), this.stateChangeRefs.push(this.socket.onOpen(function () {\n o.rejoinTimer.reset(), o.isErrored() && o.rejoin();\n })), this.joinPush.receive(\"ok\", function () {\n o.state = b, o.rejoinTimer.reset(), o.pushBuffer.forEach(function (e) {\n return e.send();\n }), o.pushBuffer = [];\n }), this.joinPush.receive(\"error\", function () {\n o.state = k, o.socket.isConnected() && o.rejoinTimer.scheduleTimeout();\n }), this.onClose(function () {\n o.rejoinTimer.reset(), o.socket.hasLogger() && o.socket.log(\"channel\", \"close \".concat(o.topic, \" \").concat(o.joinRef())), o.state = g, o.socket.remove(o);\n }), this.onError(function (e) {\n o.socket.hasLogger() && o.socket.log(\"channel\", \"error \".concat(o.topic), e), o.isJoining() && o.joinPush.reset(), o.state = k, o.socket.isConnected() && o.rejoinTimer.scheduleTimeout();\n }), this.joinPush.receive(\"timeout\", function () {\n o.socket.hasLogger() && o.socket.log(\"channel\", \"timeout \".concat(o.topic, \" (\").concat(o.joinRef(), \")\"), o.joinPush.timeout), new P(o, w, O({}), o.timeout).send(), o.state = k, o.joinPush.reset(), o.socket.isConnected() && o.rejoinTimer.scheduleTimeout();\n }), this.on(S, function (e, t) {\n o.trigger(o.replyEventName(t), e);\n });\n }\n\n return h(e, [{\n key: \"join\",\n value: function () {\n var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : this.timeout;\n if (this.joinedOnce) throw new Error(\"tried to join multiple times. 'join' can only be called a single time per channel instance\");\n return this.timeout = e, this.joinedOnce = !0, this.rejoin(), this.joinPush;\n }\n }, {\n key: \"onClose\",\n value: function (e) {\n this.on(E, e);\n }\n }, {\n key: \"onError\",\n value: function (e) {\n return this.on(R, function (t) {\n return e(t);\n });\n }\n }, {\n key: \"on\",\n value: function (e, t) {\n var n = this.bindingRef++;\n return this.bindings.push({\n event: e,\n ref: n,\n callback: t\n }), n;\n }\n }, {\n key: \"off\",\n value: function (e, t) {\n this.bindings = this.bindings.filter(function (n) {\n return !(n.event === e && (void 0 === t || t === n.ref));\n });\n }\n }, {\n key: \"canPush\",\n value: function () {\n return this.socket.isConnected() && this.isJoined();\n }\n }, {\n key: \"push\",\n value: function (e, t) {\n var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : this.timeout;\n if (!this.joinedOnce) throw new Error(\"tried to push '\".concat(e, \"' to '\").concat(this.topic, \"' before joining. Use channel.join() before pushing events\"));\n var i = new P(this, e, function () {\n return t;\n }, n);\n return this.canPush() ? i.send() : (i.startTimeout(), this.pushBuffer.push(i)), i;\n }\n }, {\n key: \"leave\",\n value: function () {\n var e = this,\n t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : this.timeout;\n this.rejoinTimer.reset(), this.joinPush.cancelTimeout(), this.state = C;\n\n var n = function () {\n e.socket.hasLogger() && e.socket.log(\"channel\", \"leave \".concat(e.topic)), e.trigger(E, \"leave\");\n },\n i = new P(this, w, O({}), t);\n\n return i.receive(\"ok\", function () {\n return n();\n }).receive(\"timeout\", function () {\n return n();\n }), i.send(), this.canPush() || i.trigger(\"ok\", {}), i;\n }\n }, {\n key: \"onMessage\",\n value: function (e, t, n) {\n return t;\n }\n }, {\n key: \"isLifecycleEvent\",\n value: function (e) {\n return A.indexOf(e) >= 0;\n }\n }, {\n key: \"isMember\",\n value: function (e, t, n, i) {\n return this.topic === e && (!i || i === this.joinRef() || !this.isLifecycleEvent(t) || (this.socket.hasLogger() && this.socket.log(\"channel\", \"dropping outdated message\", {\n topic: e,\n event: t,\n payload: n,\n joinRef: i\n }), !1));\n }\n }, {\n key: \"joinRef\",\n value: function () {\n return this.joinPush.ref;\n }\n }, {\n key: \"rejoin\",\n value: function () {\n var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : this.timeout;\n this.isLeaving() || (this.socket.leaveOpenTopic(this.topic), this.state = j, this.joinPush.resend(e));\n }\n }, {\n key: \"trigger\",\n value: function (e, t, n, i) {\n var o = this.onMessage(e, t, n, i);\n if (t && !o) throw new Error(\"channel onMessage callbacks must return the payload, modified or unmodified\");\n\n for (var r = this.bindings.filter(function (t) {\n return t.event === e;\n }), s = 0; s < r.length; s++) {\n r[s].callback(o, n, i || this.joinRef());\n }\n }\n }, {\n key: \"replyEventName\",\n value: function (e) {\n return \"chan_reply_\".concat(e);\n }\n }, {\n key: \"isClosed\",\n value: function () {\n return this.state === g;\n }\n }, {\n key: \"isErrored\",\n value: function () {\n return this.state === k;\n }\n }, {\n key: \"isJoined\",\n value: function () {\n return this.state === b;\n }\n }, {\n key: \"isJoining\",\n value: function () {\n return this.state === j;\n }\n }, {\n key: \"isLeaving\",\n value: function () {\n return this.state === C;\n }\n }]), e;\n }(),\n H = {\n HEADER_LENGTH: 1,\n META_LENGTH: 4,\n KINDS: {\n push: 0,\n reply: 1,\n broadcast: 2\n },\n encode: function (e, t) {\n if (e.payload.constructor === ArrayBuffer) return t(this.binaryEncode(e));\n var n = [e.join_ref, e.ref, e.topic, e.event, e.payload];\n return t(JSON.stringify(n));\n },\n decode: function (e, t) {\n if (e.constructor === ArrayBuffer) return t(this.binaryDecode(e));\n var n = r(JSON.parse(e), 5);\n return t({\n join_ref: n[0],\n ref: n[1],\n topic: n[2],\n event: n[3],\n payload: n[4]\n });\n },\n binaryEncode: function (e) {\n var t = e.join_ref,\n n = e.ref,\n i = e.event,\n o = e.topic,\n r = e.payload,\n s = this.META_LENGTH + t.length + n.length + o.length + i.length,\n a = new ArrayBuffer(this.HEADER_LENGTH + s),\n c = new DataView(a),\n u = 0;\n c.setUint8(u++, this.KINDS.push), c.setUint8(u++, t.length), c.setUint8(u++, n.length), c.setUint8(u++, o.length), c.setUint8(u++, i.length), Array.from(t, function (e) {\n return c.setUint8(u++, e.charCodeAt(0));\n }), Array.from(n, function (e) {\n return c.setUint8(u++, e.charCodeAt(0));\n }), Array.from(o, function (e) {\n return c.setUint8(u++, e.charCodeAt(0));\n }), Array.from(i, function (e) {\n return c.setUint8(u++, e.charCodeAt(0));\n });\n var h = new Uint8Array(a.byteLength + r.byteLength);\n return h.set(new Uint8Array(a), 0), h.set(new Uint8Array(r), a.byteLength), h.buffer;\n },\n binaryDecode: function (e) {\n var t = new DataView(e),\n n = t.getUint8(0),\n i = new TextDecoder();\n\n switch (n) {\n case this.KINDS.push:\n return this.decodePush(e, t, i);\n\n case this.KINDS.reply:\n return this.decodeReply(e, t, i);\n\n case this.KINDS.broadcast:\n return this.decodeBroadcast(e, t, i);\n }\n },\n decodePush: function (e, t, n) {\n var i = t.getUint8(1),\n o = t.getUint8(2),\n r = t.getUint8(3),\n s = this.HEADER_LENGTH + this.META_LENGTH - 1,\n a = n.decode(e.slice(s, s + i));\n s += i;\n var c = n.decode(e.slice(s, s + o));\n s += o;\n var u = n.decode(e.slice(s, s + r));\n return s += r, {\n join_ref: a,\n ref: null,\n topic: c,\n event: u,\n payload: e.slice(s, e.byteLength)\n };\n },\n decodeReply: function (e, t, n) {\n var i = t.getUint8(1),\n o = t.getUint8(2),\n r = t.getUint8(3),\n s = t.getUint8(4),\n a = this.HEADER_LENGTH + this.META_LENGTH,\n c = n.decode(e.slice(a, a + i));\n a += i;\n var u = n.decode(e.slice(a, a + o));\n a += o;\n var h = n.decode(e.slice(a, a + r));\n a += r;\n var l = n.decode(e.slice(a, a + s));\n a += s;\n var f = e.slice(a, e.byteLength);\n return {\n join_ref: c,\n ref: u,\n topic: h,\n event: S,\n payload: {\n status: l,\n response: f\n }\n };\n },\n decodeBroadcast: function (e, t, n) {\n var i = t.getUint8(1),\n o = t.getUint8(2),\n r = this.HEADER_LENGTH + 2,\n s = n.decode(e.slice(r, r + i));\n r += i;\n var a = n.decode(e.slice(r, r + o));\n return r += o, {\n join_ref: null,\n ref: null,\n topic: s,\n event: a,\n payload: e.slice(r, e.byteLength)\n };\n }\n },\n U = function () {\n function e(t) {\n var n = this,\n i = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {};\n c(this, e), this.stateChangeCallbacks = {\n open: [],\n close: [],\n error: [],\n message: []\n }, this.channels = [], this.sendBuffer = [], this.ref = 0, this.timeout = i.timeout || 1e4, this.transport = i.transport || d.WebSocket || D, this.defaultEncoder = H.encode.bind(H), this.defaultDecoder = H.decode.bind(H), this.closeWasClean = !1, this.unloaded = !1, this.binaryType = i.binaryType || \"arraybuffer\", this.transport !== D ? (this.encode = i.encode || this.defaultEncoder, this.decode = i.decode || this.defaultDecoder) : (this.encode = this.defaultEncoder, this.decode = this.defaultDecoder), f && f.addEventListener && f.addEventListener(\"unload\", function (e) {\n n.conn && (n.unloaded = !0, n.abnormalClose(\"unloaded\"));\n }), this.heartbeatIntervalMs = i.heartbeatIntervalMs || 3e4, this.rejoinAfterMs = function (e) {\n return i.rejoinAfterMs ? i.rejoinAfterMs(e) : [1e3, 2e3, 5e3][e - 1] || 1e4;\n }, this.reconnectAfterMs = function (e) {\n return n.unloaded ? 100 : i.reconnectAfterMs ? i.reconnectAfterMs(e) : [10, 50, 100, 150, 200, 250, 500, 1e3, 2e3][e - 1] || 5e3;\n }, this.logger = i.logger || null, this.longpollerTimeout = i.longpollerTimeout || 2e4, this.params = O(i.params || {}), this.endPoint = \"\".concat(t, \"/\").concat(x), this.vsn = i.vsn || \"2.0.0\", this.heartbeatTimer = null, this.pendingHeartbeatRef = null, this.reconnectTimer = new J(function () {\n n.teardown(function () {\n return n.connect();\n });\n }, this.reconnectAfterMs);\n }\n\n return h(e, [{\n key: \"protocol\",\n value: function () {\n return location.protocol.match(/^https/) ? \"wss\" : \"ws\";\n }\n }, {\n key: \"endPointURL\",\n value: function () {\n var e = M.appendParams(M.appendParams(this.endPoint, this.params()), {\n vsn: this.vsn\n });\n return \"/\" !== e.charAt(0) ? e : \"/\" === e.charAt(1) ? \"\".concat(this.protocol(), \":\").concat(e) : \"\".concat(this.protocol(), \"://\").concat(location.host).concat(e);\n }\n }, {\n key: \"disconnect\",\n value: function (e, t, n) {\n this.closeWasClean = !0, this.reconnectTimer.reset(), this.teardown(e, t, n);\n }\n }, {\n key: \"connect\",\n value: function (e) {\n var t = this;\n e && (console && console.log(\"passing params to connect is deprecated. Instead pass :params to the Socket constructor\"), this.params = O(e)), this.conn || (this.closeWasClean = !1, this.conn = new this.transport(this.endPointURL()), this.conn.binaryType = this.binaryType, this.conn.timeout = this.longpollerTimeout, this.conn.onopen = function () {\n return t.onConnOpen();\n }, this.conn.onerror = function (e) {\n return t.onConnError(e);\n }, this.conn.onmessage = function (e) {\n return t.onConnMessage(e);\n }, this.conn.onclose = function (e) {\n return t.onConnClose(e);\n });\n }\n }, {\n key: \"log\",\n value: function (e, t, n) {\n this.logger(e, t, n);\n }\n }, {\n key: \"hasLogger\",\n value: function () {\n return null !== this.logger;\n }\n }, {\n key: \"onOpen\",\n value: function (e) {\n var t = this.makeRef();\n return this.stateChangeCallbacks.open.push([t, e]), t;\n }\n }, {\n key: \"onClose\",\n value: function (e) {\n var t = this.makeRef();\n return this.stateChangeCallbacks.close.push([t, e]), t;\n }\n }, {\n key: \"onError\",\n value: function (e) {\n var t = this.makeRef();\n return this.stateChangeCallbacks.error.push([t, e]), t;\n }\n }, {\n key: \"onMessage\",\n value: function (e) {\n var t = this.makeRef();\n return this.stateChangeCallbacks.message.push([t, e]), t;\n }\n }, {\n key: \"onConnOpen\",\n value: function () {\n this.hasLogger() && this.log(\"transport\", \"connected to \".concat(this.endPointURL())), this.unloaded = !1, this.closeWasClean = !1, this.flushSendBuffer(), this.reconnectTimer.reset(), this.resetHeartbeat(), this.stateChangeCallbacks.open.forEach(function (e) {\n return (0, r(e, 2)[1])();\n });\n }\n }, {\n key: \"resetHeartbeat\",\n value: function () {\n var e = this;\n this.conn && this.conn.skipHeartbeat || (this.pendingHeartbeatRef = null, clearInterval(this.heartbeatTimer), this.heartbeatTimer = setInterval(function () {\n return e.sendHeartbeat();\n }, this.heartbeatIntervalMs));\n }\n }, {\n key: \"teardown\",\n value: function (e, t, n) {\n var i = this;\n if (!this.conn) return e && e();\n this.waitForBufferDone(function () {\n i.conn && (t ? i.conn.close(t, n || \"\") : i.conn.close()), i.waitForSocketClosed(function () {\n i.conn && (i.conn.onclose = function () {}, i.conn = null), e && e();\n });\n });\n }\n }, {\n key: \"waitForBufferDone\",\n value: function (e) {\n var t = this,\n n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 1;\n 5 !== n && this.conn && this.conn.bufferedAmount ? setTimeout(function () {\n t.waitForBufferDone(e, n + 1);\n }, 150 * n) : e();\n }\n }, {\n key: \"waitForSocketClosed\",\n value: function (e) {\n var t = this,\n n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 1;\n 5 !== n && this.conn && this.conn.readyState !== m ? setTimeout(function () {\n t.waitForSocketClosed(e, n + 1);\n }, 150 * n) : e();\n }\n }, {\n key: \"onConnClose\",\n value: function (e) {\n this.hasLogger() && this.log(\"transport\", \"close\", e), this.triggerChanError(), clearInterval(this.heartbeatTimer), this.closeWasClean || this.reconnectTimer.scheduleTimeout(), this.stateChangeCallbacks.close.forEach(function (t) {\n return (0, r(t, 2)[1])(e);\n });\n }\n }, {\n key: \"onConnError\",\n value: function (e) {\n this.hasLogger() && this.log(\"transport\", e), this.triggerChanError(), this.stateChangeCallbacks.error.forEach(function (t) {\n return (0, r(t, 2)[1])(e);\n });\n }\n }, {\n key: \"triggerChanError\",\n value: function () {\n this.channels.forEach(function (e) {\n e.isErrored() || e.isLeaving() || e.isClosed() || e.trigger(R);\n });\n }\n }, {\n key: \"connectionState\",\n value: function () {\n switch (this.conn && this.conn.readyState) {\n case p:\n return \"connecting\";\n\n case v:\n return \"open\";\n\n case y:\n return \"closing\";\n\n default:\n return \"closed\";\n }\n }\n }, {\n key: \"isConnected\",\n value: function () {\n return \"open\" === this.connectionState();\n }\n }, {\n key: \"remove\",\n value: function (e) {\n this.off(e.stateChangeRefs), this.channels = this.channels.filter(function (t) {\n return t.joinRef() !== e.joinRef();\n });\n }\n }, {\n key: \"off\",\n value: function (e) {\n for (var t in this.stateChangeCallbacks) this.stateChangeCallbacks[t] = this.stateChangeCallbacks[t].filter(function (t) {\n var n = r(t, 1)[0];\n return -1 === e.indexOf(n);\n });\n }\n }, {\n key: \"channel\",\n value: function (e) {\n var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {},\n n = new _(e, t, this);\n return this.channels.push(n), n;\n }\n }, {\n key: \"push\",\n value: function (e) {\n var t = this;\n\n if (this.hasLogger()) {\n var n = e.topic,\n i = e.event,\n o = e.payload,\n r = e.ref,\n s = e.join_ref;\n this.log(\"push\", \"\".concat(n, \" \").concat(i, \" (\").concat(s, \", \").concat(r, \")\"), o);\n }\n\n this.isConnected() ? this.encode(e, function (e) {\n return t.conn.send(e);\n }) : this.sendBuffer.push(function () {\n return t.encode(e, function (e) {\n return t.conn.send(e);\n });\n });\n }\n }, {\n key: \"makeRef\",\n value: function () {\n var e = this.ref + 1;\n return e === this.ref ? this.ref = 0 : this.ref = e, this.ref.toString();\n }\n }, {\n key: \"sendHeartbeat\",\n value: function () {\n if (this.isConnected()) {\n if (this.pendingHeartbeatRef) return this.pendingHeartbeatRef = null, this.hasLogger() && this.log(\"transport\", \"heartbeat timeout. Attempting to re-establish connection\"), void this.abnormalClose(\"heartbeat timeout\");\n this.pendingHeartbeatRef = this.makeRef(), this.push({\n topic: \"phoenix\",\n event: \"heartbeat\",\n payload: {},\n ref: this.pendingHeartbeatRef\n });\n }\n }\n }, {\n key: \"abnormalClose\",\n value: function (e) {\n this.closeWasClean = !1, this.conn.readyState === v && this.conn.close(1e3, e);\n }\n }, {\n key: \"flushSendBuffer\",\n value: function () {\n this.isConnected() && this.sendBuffer.length > 0 && (this.sendBuffer.forEach(function (e) {\n return e();\n }), this.sendBuffer = []);\n }\n }, {\n key: \"onConnMessage\",\n value: function (e) {\n var t = this;\n this.decode(e.data, function (e) {\n var n = e.topic,\n i = e.event,\n o = e.payload,\n s = e.ref,\n a = e.join_ref;\n s && s === t.pendingHeartbeatRef && (t.pendingHeartbeatRef = null), t.hasLogger() && t.log(\"receive\", \"\".concat(o.status || \"\", \" \").concat(n, \" \").concat(i, \" \").concat(s && \"(\" + s + \")\" || \"\"), o);\n\n for (var c = 0; c < t.channels.length; c++) {\n var u = t.channels[c];\n u.isMember(n, i, o, a) && u.trigger(i, o, s, a);\n }\n\n for (var h = 0; h < t.stateChangeCallbacks.message.length; h++) {\n (0, r(t.stateChangeCallbacks.message[h], 2)[1])(e);\n }\n });\n }\n }, {\n key: \"leaveOpenTopic\",\n value: function (e) {\n var t = this.channels.find(function (t) {\n return t.topic === e && (t.isJoined() || t.isJoining());\n });\n t && (this.hasLogger() && this.log(\"transport\", 'leaving duplicate topic \"'.concat(e, '\"')), t.leave());\n }\n }]), e;\n }(),\n D = function () {\n function e(t) {\n c(this, e), this.endPoint = null, this.token = null, this.skipHeartbeat = !0, this.onopen = function () {}, this.onerror = function () {}, this.onmessage = function () {}, this.onclose = function () {}, this.pollEndpoint = this.normalizeEndpoint(t), this.readyState = p, this.poll();\n }\n\n return h(e, [{\n key: \"normalizeEndpoint\",\n value: function (e) {\n return e.replace(\"ws://\", \"http://\").replace(\"wss://\", \"https://\").replace(new RegExp(\"(.*)/\" + x), \"$1/\" + L);\n }\n }, {\n key: \"endpointURL\",\n value: function () {\n return M.appendParams(this.pollEndpoint, {\n token: this.token\n });\n }\n }, {\n key: \"closeAndRetry\",\n value: function () {\n this.close(), this.readyState = p;\n }\n }, {\n key: \"ontimeout\",\n value: function () {\n this.onerror(\"timeout\"), this.closeAndRetry();\n }\n }, {\n key: \"poll\",\n value: function () {\n var e = this;\n this.readyState !== v && this.readyState !== p || M.request(\"GET\", this.endpointURL(), \"application/json\", null, this.timeout, this.ontimeout.bind(this), function (t) {\n if (t) {\n var n = t.status,\n i = t.token,\n o = t.messages;\n e.token = i;\n } else n = 0;\n\n switch (n) {\n case 200:\n o.forEach(function (t) {\n return e.onmessage({\n data: t\n });\n }), e.poll();\n break;\n\n case 204:\n e.poll();\n break;\n\n case 410:\n e.readyState = v, e.onopen(), e.poll();\n break;\n\n case 403:\n e.onerror(), e.close();\n break;\n\n case 0:\n case 500:\n e.onerror(), e.closeAndRetry();\n break;\n\n default:\n throw new Error(\"unhandled poll status \".concat(n));\n }\n });\n }\n }, {\n key: \"send\",\n value: function (e) {\n var t = this;\n M.request(\"POST\", this.endpointURL(), \"application/json\", e, this.timeout, this.onerror.bind(this, \"timeout\"), function (e) {\n e && 200 === e.status || (t.onerror(e && e.status), t.closeAndRetry());\n });\n }\n }, {\n key: \"close\",\n value: function (e, t) {\n this.readyState = m, this.onclose();\n }\n }]), e;\n }(),\n M = function () {\n function e() {\n c(this, e);\n }\n\n return h(e, null, [{\n key: \"request\",\n value: function (e, t, n, i, o, r, s) {\n if (d.XDomainRequest) {\n var a = new XDomainRequest();\n this.xdomainRequest(a, e, t, i, o, r, s);\n } else {\n var c = new d.XMLHttpRequest();\n this.xhrRequest(c, e, t, n, i, o, r, s);\n }\n }\n }, {\n key: \"xdomainRequest\",\n value: function (e, t, n, i, o, r, s) {\n var a = this;\n e.timeout = o, e.open(t, n), e.onload = function () {\n var t = a.parseJSON(e.responseText);\n s && s(t);\n }, r && (e.ontimeout = r), e.onprogress = function () {}, e.send(i);\n }\n }, {\n key: \"xhrRequest\",\n value: function (e, t, n, i, o, r, s, a) {\n var c = this;\n e.open(t, n, !0), e.timeout = r, e.setRequestHeader(\"Content-Type\", i), e.onerror = function () {\n a && a(null);\n }, e.onreadystatechange = function () {\n if (e.readyState === c.states.complete && a) {\n var t = c.parseJSON(e.responseText);\n a(t);\n }\n }, s && (e.ontimeout = s), e.send(o);\n }\n }, {\n key: \"parseJSON\",\n value: function (e) {\n if (!e || \"\" === e) return null;\n\n try {\n return JSON.parse(e);\n } catch (t) {\n return console && console.log(\"failed to parse JSON response\", e), null;\n }\n }\n }, {\n key: \"serialize\",\n value: function (e, t) {\n var n = [];\n\n for (var i in e) if (e.hasOwnProperty(i)) {\n var r = t ? \"\".concat(t, \"[\").concat(i, \"]\") : i,\n s = e[i];\n \"object\" === o(s) ? n.push(this.serialize(s, r)) : n.push(encodeURIComponent(r) + \"=\" + encodeURIComponent(s));\n }\n\n return n.join(\"&\");\n }\n }, {\n key: \"appendParams\",\n value: function (e, t) {\n if (0 === Object.keys(t).length) return e;\n var n = e.match(/\\?/) ? \"&\" : \"?\";\n return \"\".concat(e).concat(n).concat(this.serialize(t));\n }\n }]), e;\n }();\n\n M.states = {\n complete: 4\n };\n\n var N = function () {\n function e(t) {\n var n = this,\n i = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {};\n c(this, e);\n var o = i.events || {\n state: \"presence_state\",\n diff: \"presence_diff\"\n };\n this.state = {}, this.pendingDiffs = [], this.channel = t, this.joinRef = null, this.caller = {\n onJoin: function () {},\n onLeave: function () {},\n onSync: function () {}\n }, this.channel.on(o.state, function (t) {\n var i = n.caller,\n o = i.onJoin,\n r = i.onLeave,\n s = i.onSync;\n n.joinRef = n.channel.joinRef(), n.state = e.syncState(n.state, t, o, r), n.pendingDiffs.forEach(function (t) {\n n.state = e.syncDiff(n.state, t, o, r);\n }), n.pendingDiffs = [], s();\n }), this.channel.on(o.diff, function (t) {\n var i = n.caller,\n o = i.onJoin,\n r = i.onLeave,\n s = i.onSync;\n n.inPendingSyncState() ? n.pendingDiffs.push(t) : (n.state = e.syncDiff(n.state, t, o, r), s());\n });\n }\n\n return h(e, [{\n key: \"onJoin\",\n value: function (e) {\n this.caller.onJoin = e;\n }\n }, {\n key: \"onLeave\",\n value: function (e) {\n this.caller.onLeave = e;\n }\n }, {\n key: \"onSync\",\n value: function (e) {\n this.caller.onSync = e;\n }\n }, {\n key: \"list\",\n value: function (t) {\n return e.list(this.state, t);\n }\n }, {\n key: \"inPendingSyncState\",\n value: function () {\n return !this.joinRef || this.joinRef !== this.channel.joinRef();\n }\n }], [{\n key: \"syncState\",\n value: function (e, t, n, i) {\n var o = this,\n r = this.clone(e),\n s = {},\n a = {};\n return this.map(r, function (e, n) {\n t[e] || (a[e] = n);\n }), this.map(t, function (e, t) {\n var n = r[e];\n\n if (n) {\n var i = t.metas.map(function (e) {\n return e.phx_ref;\n }),\n c = n.metas.map(function (e) {\n return e.phx_ref;\n }),\n u = t.metas.filter(function (e) {\n return c.indexOf(e.phx_ref) < 0;\n }),\n h = n.metas.filter(function (e) {\n return i.indexOf(e.phx_ref) < 0;\n });\n u.length > 0 && (s[e] = t, s[e].metas = u), h.length > 0 && (a[e] = o.clone(n), a[e].metas = h);\n } else s[e] = t;\n }), this.syncDiff(r, {\n joins: s,\n leaves: a\n }, n, i);\n }\n }, {\n key: \"syncDiff\",\n value: function (e, t, n, o) {\n var r = t.joins,\n s = t.leaves,\n a = this.clone(e);\n return n || (n = function () {}), o || (o = function () {}), this.map(r, function (e, t) {\n var o = a[e];\n\n if (a[e] = t, o) {\n var r,\n s = a[e].metas.map(function (e) {\n return e.phx_ref;\n }),\n c = o.metas.filter(function (e) {\n return s.indexOf(e.phx_ref) < 0;\n });\n (r = a[e].metas).unshift.apply(r, i(c));\n }\n\n n(e, o, t);\n }), this.map(s, function (e, t) {\n var n = a[e];\n\n if (n) {\n var i = t.metas.map(function (e) {\n return e.phx_ref;\n });\n n.metas = n.metas.filter(function (e) {\n return i.indexOf(e.phx_ref) < 0;\n }), o(e, n, t), 0 === n.metas.length && delete a[e];\n }\n }), a;\n }\n }, {\n key: \"list\",\n value: function (e, t) {\n return t || (t = function (e, t) {\n return t;\n }), this.map(e, function (e, n) {\n return t(e, n);\n });\n }\n }, {\n key: \"map\",\n value: function (e, t) {\n return Object.getOwnPropertyNames(e).map(function (n) {\n return t(n, e[n]);\n });\n }\n }, {\n key: \"clone\",\n value: function (e) {\n return JSON.parse(JSON.stringify(e));\n }\n }]), e;\n }(),\n J = function () {\n function e(t, n) {\n c(this, e), this.callback = t, this.timerCalc = n, this.timer = null, this.tries = 0;\n }\n\n return h(e, [{\n key: \"reset\",\n value: function () {\n this.tries = 0, clearTimeout(this.timer);\n }\n }, {\n key: \"scheduleTimeout\",\n value: function () {\n var e = this;\n clearTimeout(this.timer), this.timer = setTimeout(function () {\n e.tries = e.tries + 1, e.callback();\n }, this.timerCalc(this.tries + 1));\n }\n }]), e;\n }();\n }]);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vZGVwcy9waG9lbml4L3ByaXYvc3RhdGljL3Bob2VuaXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vZGVwcy9waG9lbml4L3ByaXYvc3RhdGljL3Bob2VuaXguanM/MzFiYiJdLCJzb3VyY2VzQ29udGVudCI6WyIhZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXSx0KTpcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzLlBob2VuaXg9dCgpOmUuUGhvZW5peD10KCl9KHRoaXMsKGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Z1bmN0aW9uIG4oaSl7aWYodFtpXSlyZXR1cm4gdFtpXS5leHBvcnRzO3ZhciBvPXRbaV09e2k6aSxsOiExLGV4cG9ydHM6e319O3JldHVybiBlW2ldLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9cmV0dXJuIG4ubT1lLG4uYz10LG4uZD1mdW5jdGlvbihlLHQsaSl7bi5vKGUsdCl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6ITAsZ2V0Oml9KX0sbi5yPWZ1bmN0aW9uKGUpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbihlLHQpe2lmKDEmdCYmKGU9bihlKSksOCZ0KXJldHVybiBlO2lmKDQmdCYmXCJvYmplY3RcIj09dHlwZW9mIGUmJmUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgaT1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihpKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTplfSksMiZ0JiZcInN0cmluZ1wiIT10eXBlb2YgZSlmb3IodmFyIG8gaW4gZSluLmQoaSxvLGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfS5iaW5kKG51bGwsbykpO3JldHVybiBpfSxuLm49ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIG4uZCh0LFwiYVwiLHQpLHR9LG4ubz1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX0sbi5wPVwiXCIsbihuLnM9MCl9KFtmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKHQpe2UuZXhwb3J0cz10LlBob2VuaXg9bigyKX0pLmNhbGwodGhpcyxuKDEpKX0sZnVuY3Rpb24oZSx0KXt2YXIgbjtuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7dHJ5e249bnx8bmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKX1jYXRjaChlKXtcIm9iamVjdFwiPT10eXBlb2Ygd2luZG93JiYobj13aW5kb3cpfWUuZXhwb3J0cz1ufSxmdW5jdGlvbihlLHQsbil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gYShlKX0oZSl8fGZ1bmN0aW9uKGUpe2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpcmV0dXJuIEFycmF5LmZyb20oZSl9KGUpfHxzKGUpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpfSgpfWZ1bmN0aW9uIG8oZSl7cmV0dXJuKG89XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgZX0pKGUpfWZ1bmN0aW9uIHIoZSx0KXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gZX0oZSl8fGZ1bmN0aW9uKGUsdCl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFN5bWJvbHx8IShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKSlyZXR1cm47dmFyIG49W10saT0hMCxvPSExLHI9dm9pZCAwO3RyeXtmb3IodmFyIHMsYT1lW1N5bWJvbC5pdGVyYXRvcl0oKTshKGk9KHM9YS5uZXh0KCkpLmRvbmUpJiYobi5wdXNoKHMudmFsdWUpLCF0fHxuLmxlbmd0aCE9PXQpO2k9ITApO31jYXRjaChlKXtvPSEwLHI9ZX1maW5hbGx5e3RyeXtpfHxudWxsPT1hLnJldHVybnx8YS5yZXR1cm4oKX1maW5hbGx5e2lmKG8pdGhyb3cgcn19cmV0dXJuIG59KGUsdCl8fHMoZSx0KXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpfSgpfWZ1bmN0aW9uIHMoZSx0KXtpZihlKXtpZihcInN0cmluZ1wiPT10eXBlb2YgZSlyZXR1cm4gYShlLHQpO3ZhciBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKTtyZXR1cm5cIk9iamVjdFwiPT09biYmZS5jb25zdHJ1Y3RvciYmKG49ZS5jb25zdHJ1Y3Rvci5uYW1lKSxcIk1hcFwiPT09bnx8XCJTZXRcIj09PW4/QXJyYXkuZnJvbShuKTpcIkFyZ3VtZW50c1wiPT09bnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3Qobik/YShlLHQpOnZvaWQgMH19ZnVuY3Rpb24gYShlLHQpeyhudWxsPT10fHx0PmUubGVuZ3RoKSYmKHQ9ZS5sZW5ndGgpO2Zvcih2YXIgbj0wLGk9bmV3IEFycmF5KHQpO248dDtuKyspaVtuXT1lW25dO3JldHVybiBpfWZ1bmN0aW9uIGMoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIHUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIGk9dFtuXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMSxpLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBpJiYoaS53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsaS5rZXksaSl9fWZ1bmN0aW9uIGgoZSx0LG4pe3JldHVybiB0JiZ1KGUucHJvdG90eXBlLHQpLG4mJnUoZSxuKSxlfW4ucih0KSxuLmQodCxcIkNoYW5uZWxcIiwoZnVuY3Rpb24oKXtyZXR1cm4gX30pKSxuLmQodCxcIlNlcmlhbGl6ZXJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gSH0pKSxuLmQodCxcIlNvY2tldFwiLChmdW5jdGlvbigpe3JldHVybiBVfSkpLG4uZCh0LFwiTG9uZ1BvbGxcIiwoZnVuY3Rpb24oKXtyZXR1cm4gRH0pKSxuLmQodCxcIkFqYXhcIiwoZnVuY3Rpb24oKXtyZXR1cm4gTX0pKSxuLmQodCxcIlByZXNlbmNlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIE59KSk7dmFyIGw9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjpudWxsLGY9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6bnVsbCxkPWx8fGZ8fHZvaWQgMCxwPTAsdj0xLHk9MixtPTMsZz1cImNsb3NlZFwiLGs9XCJlcnJvcmVkXCIsYj1cImpvaW5lZFwiLGo9XCJqb2luaW5nXCIsQz1cImxlYXZpbmdcIixFPVwicGh4X2Nsb3NlXCIsUj1cInBoeF9lcnJvclwiLFQ9XCJwaHhfam9pblwiLFM9XCJwaHhfcmVwbHlcIix3PVwicGh4X2xlYXZlXCIsQT1bRSxSLFQsUyx3XSxMPVwibG9uZ3BvbGxcIix4PVwid2Vic29ja2V0XCIsTz1mdW5jdGlvbihlKXtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBlKXJldHVybiBlO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlfX0sUD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuLGksbyl7Yyh0aGlzLGUpLHRoaXMuY2hhbm5lbD10LHRoaXMuZXZlbnQ9bix0aGlzLnBheWxvYWQ9aXx8ZnVuY3Rpb24oKXtyZXR1cm57fX0sdGhpcy5yZWNlaXZlZFJlc3A9bnVsbCx0aGlzLnRpbWVvdXQ9byx0aGlzLnRpbWVvdXRUaW1lcj1udWxsLHRoaXMucmVjSG9va3M9W10sdGhpcy5zZW50PSExfXJldHVybiBoKGUsW3trZXk6XCJyZXNlbmRcIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnRpbWVvdXQ9ZSx0aGlzLnJlc2V0KCksdGhpcy5zZW5kKCl9fSx7a2V5Olwic2VuZFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5oYXNSZWNlaXZlZChcInRpbWVvdXRcIil8fCh0aGlzLnN0YXJ0VGltZW91dCgpLHRoaXMuc2VudD0hMCx0aGlzLmNoYW5uZWwuc29ja2V0LnB1c2goe3RvcGljOnRoaXMuY2hhbm5lbC50b3BpYyxldmVudDp0aGlzLmV2ZW50LHBheWxvYWQ6dGhpcy5wYXlsb2FkKCkscmVmOnRoaXMucmVmLGpvaW5fcmVmOnRoaXMuY2hhbm5lbC5qb2luUmVmKCl9KSl9fSx7a2V5OlwicmVjZWl2ZVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuaGFzUmVjZWl2ZWQoZSkmJnQodGhpcy5yZWNlaXZlZFJlc3AucmVzcG9uc2UpLHRoaXMucmVjSG9va3MucHVzaCh7c3RhdHVzOmUsY2FsbGJhY2s6dH0pLHRoaXN9fSx7a2V5OlwicmVzZXRcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuY2FuY2VsUmVmRXZlbnQoKSx0aGlzLnJlZj1udWxsLHRoaXMucmVmRXZlbnQ9bnVsbCx0aGlzLnJlY2VpdmVkUmVzcD1udWxsLHRoaXMuc2VudD0hMX19LHtrZXk6XCJtYXRjaFJlY2VpdmVcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lLnN0YXR1cyxuPWUucmVzcG9uc2U7ZS5yZWY7dGhpcy5yZWNIb29rcy5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnN0YXR1cz09PXR9KSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2FsbGJhY2sobil9KSl9fSx7a2V5OlwiY2FuY2VsUmVmRXZlbnRcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMucmVmRXZlbnQmJnRoaXMuY2hhbm5lbC5vZmYodGhpcy5yZWZFdmVudCl9fSx7a2V5OlwiY2FuY2VsVGltZW91dFwiLHZhbHVlOmZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMudGltZW91dFRpbWVyKSx0aGlzLnRpbWVvdXRUaW1lcj1udWxsfX0se2tleTpcInN0YXJ0VGltZW91dFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLnRpbWVvdXRUaW1lciYmdGhpcy5jYW5jZWxUaW1lb3V0KCksdGhpcy5yZWY9dGhpcy5jaGFubmVsLnNvY2tldC5tYWtlUmVmKCksdGhpcy5yZWZFdmVudD10aGlzLmNoYW5uZWwucmVwbHlFdmVudE5hbWUodGhpcy5yZWYpLHRoaXMuY2hhbm5lbC5vbih0aGlzLnJlZkV2ZW50LChmdW5jdGlvbih0KXtlLmNhbmNlbFJlZkV2ZW50KCksZS5jYW5jZWxUaW1lb3V0KCksZS5yZWNlaXZlZFJlc3A9dCxlLm1hdGNoUmVjZWl2ZSh0KX0pKSx0aGlzLnRpbWVvdXRUaW1lcj1zZXRUaW1lb3V0KChmdW5jdGlvbigpe2UudHJpZ2dlcihcInRpbWVvdXRcIix7fSl9KSx0aGlzLnRpbWVvdXQpfX0se2tleTpcImhhc1JlY2VpdmVkXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVjZWl2ZWRSZXNwJiZ0aGlzLnJlY2VpdmVkUmVzcC5zdGF0dXM9PT1lfX0se2tleTpcInRyaWdnZXJcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3RoaXMuY2hhbm5lbC50cmlnZ2VyKHRoaXMucmVmRXZlbnQse3N0YXR1czplLHJlc3BvbnNlOnR9KX19XSksZX0oKSxfPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0LG4saSl7dmFyIG89dGhpcztjKHRoaXMsZSksdGhpcy5zdGF0ZT1nLHRoaXMudG9waWM9dCx0aGlzLnBhcmFtcz1PKG58fHt9KSx0aGlzLnNvY2tldD1pLHRoaXMuYmluZGluZ3M9W10sdGhpcy5iaW5kaW5nUmVmPTAsdGhpcy50aW1lb3V0PXRoaXMuc29ja2V0LnRpbWVvdXQsdGhpcy5qb2luZWRPbmNlPSExLHRoaXMuam9pblB1c2g9bmV3IFAodGhpcyxULHRoaXMucGFyYW1zLHRoaXMudGltZW91dCksdGhpcy5wdXNoQnVmZmVyPVtdLHRoaXMuc3RhdGVDaGFuZ2VSZWZzPVtdLHRoaXMucmVqb2luVGltZXI9bmV3IEooKGZ1bmN0aW9uKCl7by5zb2NrZXQuaXNDb25uZWN0ZWQoKSYmby5yZWpvaW4oKX0pLHRoaXMuc29ja2V0LnJlam9pbkFmdGVyTXMpLHRoaXMuc3RhdGVDaGFuZ2VSZWZzLnB1c2godGhpcy5zb2NrZXQub25FcnJvcigoZnVuY3Rpb24oKXtyZXR1cm4gby5yZWpvaW5UaW1lci5yZXNldCgpfSkpKSx0aGlzLnN0YXRlQ2hhbmdlUmVmcy5wdXNoKHRoaXMuc29ja2V0Lm9uT3BlbigoZnVuY3Rpb24oKXtvLnJlam9pblRpbWVyLnJlc2V0KCksby5pc0Vycm9yZWQoKSYmby5yZWpvaW4oKX0pKSksdGhpcy5qb2luUHVzaC5yZWNlaXZlKFwib2tcIiwoZnVuY3Rpb24oKXtvLnN0YXRlPWIsby5yZWpvaW5UaW1lci5yZXNldCgpLG8ucHVzaEJ1ZmZlci5mb3JFYWNoKChmdW5jdGlvbihlKXtyZXR1cm4gZS5zZW5kKCl9KSksby5wdXNoQnVmZmVyPVtdfSkpLHRoaXMuam9pblB1c2gucmVjZWl2ZShcImVycm9yXCIsKGZ1bmN0aW9uKCl7by5zdGF0ZT1rLG8uc29ja2V0LmlzQ29ubmVjdGVkKCkmJm8ucmVqb2luVGltZXIuc2NoZWR1bGVUaW1lb3V0KCl9KSksdGhpcy5vbkNsb3NlKChmdW5jdGlvbigpe28ucmVqb2luVGltZXIucmVzZXQoKSxvLnNvY2tldC5oYXNMb2dnZXIoKSYmby5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLFwiY2xvc2UgXCIuY29uY2F0KG8udG9waWMsXCIgXCIpLmNvbmNhdChvLmpvaW5SZWYoKSkpLG8uc3RhdGU9ZyxvLnNvY2tldC5yZW1vdmUobyl9KSksdGhpcy5vbkVycm9yKChmdW5jdGlvbihlKXtvLnNvY2tldC5oYXNMb2dnZXIoKSYmby5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLFwiZXJyb3IgXCIuY29uY2F0KG8udG9waWMpLGUpLG8uaXNKb2luaW5nKCkmJm8uam9pblB1c2gucmVzZXQoKSxvLnN0YXRlPWssby5zb2NrZXQuaXNDb25uZWN0ZWQoKSYmby5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKX0pKSx0aGlzLmpvaW5QdXNoLnJlY2VpdmUoXCJ0aW1lb3V0XCIsKGZ1bmN0aW9uKCl7by5zb2NrZXQuaGFzTG9nZ2VyKCkmJm8uc29ja2V0LmxvZyhcImNoYW5uZWxcIixcInRpbWVvdXQgXCIuY29uY2F0KG8udG9waWMsXCIgKFwiKS5jb25jYXQoby5qb2luUmVmKCksXCIpXCIpLG8uam9pblB1c2gudGltZW91dCksbmV3IFAobyx3LE8oe30pLG8udGltZW91dCkuc2VuZCgpLG8uc3RhdGU9ayxvLmpvaW5QdXNoLnJlc2V0KCksby5zb2NrZXQuaXNDb25uZWN0ZWQoKSYmby5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKX0pKSx0aGlzLm9uKFMsKGZ1bmN0aW9uKGUsdCl7by50cmlnZ2VyKG8ucmVwbHlFdmVudE5hbWUodCksZSl9KSl9cmV0dXJuIGgoZSxbe2tleTpcImpvaW5cIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp0aGlzLnRpbWVvdXQ7aWYodGhpcy5qb2luZWRPbmNlKXRocm93IG5ldyBFcnJvcihcInRyaWVkIHRvIGpvaW4gbXVsdGlwbGUgdGltZXMuICdqb2luJyBjYW4gb25seSBiZSBjYWxsZWQgYSBzaW5nbGUgdGltZSBwZXIgY2hhbm5lbCBpbnN0YW5jZVwiKTtyZXR1cm4gdGhpcy50aW1lb3V0PWUsdGhpcy5qb2luZWRPbmNlPSEwLHRoaXMucmVqb2luKCksdGhpcy5qb2luUHVzaH19LHtrZXk6XCJvbkNsb3NlXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vbihFLGUpfX0se2tleTpcIm9uRXJyb3JcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vbihSLChmdW5jdGlvbih0KXtyZXR1cm4gZSh0KX0pKX19LHtrZXk6XCJvblwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5iaW5kaW5nUmVmKys7cmV0dXJuIHRoaXMuYmluZGluZ3MucHVzaCh7ZXZlbnQ6ZSxyZWY6bixjYWxsYmFjazp0fSksbn19LHtrZXk6XCJvZmZcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3RoaXMuYmluZGluZ3M9dGhpcy5iaW5kaW5ncy5maWx0ZXIoKGZ1bmN0aW9uKG4pe3JldHVybiEobi5ldmVudD09PWUmJih2b2lkIDA9PT10fHx0PT09bi5yZWYpKX0pKX19LHtrZXk6XCJjYW5QdXNoXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKSYmdGhpcy5pc0pvaW5lZCgpfX0se2tleTpcInB1c2hcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp0aGlzLnRpbWVvdXQ7aWYoIXRoaXMuam9pbmVkT25jZSl0aHJvdyBuZXcgRXJyb3IoXCJ0cmllZCB0byBwdXNoICdcIi5jb25jYXQoZSxcIicgdG8gJ1wiKS5jb25jYXQodGhpcy50b3BpYyxcIicgYmVmb3JlIGpvaW5pbmcuIFVzZSBjaGFubmVsLmpvaW4oKSBiZWZvcmUgcHVzaGluZyBldmVudHNcIikpO3ZhciBpPW5ldyBQKHRoaXMsZSwoZnVuY3Rpb24oKXtyZXR1cm4gdH0pLG4pO3JldHVybiB0aGlzLmNhblB1c2goKT9pLnNlbmQoKTooaS5zdGFydFRpbWVvdXQoKSx0aGlzLnB1c2hCdWZmZXIucHVzaChpKSksaX19LHtrZXk6XCJsZWF2ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp0aGlzLnRpbWVvdXQ7dGhpcy5yZWpvaW5UaW1lci5yZXNldCgpLHRoaXMuam9pblB1c2guY2FuY2VsVGltZW91dCgpLHRoaXMuc3RhdGU9Qzt2YXIgbj1mdW5jdGlvbigpe2Uuc29ja2V0Lmhhc0xvZ2dlcigpJiZlLnNvY2tldC5sb2coXCJjaGFubmVsXCIsXCJsZWF2ZSBcIi5jb25jYXQoZS50b3BpYykpLGUudHJpZ2dlcihFLFwibGVhdmVcIil9LGk9bmV3IFAodGhpcyx3LE8oe30pLHQpO3JldHVybiBpLnJlY2VpdmUoXCJva1wiLChmdW5jdGlvbigpe3JldHVybiBuKCl9KSkucmVjZWl2ZShcInRpbWVvdXRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gbigpfSkpLGkuc2VuZCgpLHRoaXMuY2FuUHVzaCgpfHxpLnRyaWdnZXIoXCJva1wiLHt9KSxpfX0se2tleTpcIm9uTWVzc2FnZVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdH19LHtrZXk6XCJpc0xpZmVjeWNsZUV2ZW50XCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEEuaW5kZXhPZihlKT49MH19LHtrZXk6XCJpc01lbWJlclwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLGkpe3JldHVybiB0aGlzLnRvcGljPT09ZSYmKCFpfHxpPT09dGhpcy5qb2luUmVmKCl8fCF0aGlzLmlzTGlmZWN5Y2xlRXZlbnQodCl8fCh0aGlzLnNvY2tldC5oYXNMb2dnZXIoKSYmdGhpcy5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLFwiZHJvcHBpbmcgb3V0ZGF0ZWQgbWVzc2FnZVwiLHt0b3BpYzplLGV2ZW50OnQscGF5bG9hZDpuLGpvaW5SZWY6aX0pLCExKSl9fSx7a2V5Olwiam9pblJlZlwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuam9pblB1c2gucmVmfX0se2tleTpcInJlam9pblwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnRoaXMudGltZW91dDt0aGlzLmlzTGVhdmluZygpfHwodGhpcy5zb2NrZXQubGVhdmVPcGVuVG9waWModGhpcy50b3BpYyksdGhpcy5zdGF0ZT1qLHRoaXMuam9pblB1c2gucmVzZW5kKGUpKX19LHtrZXk6XCJ0cmlnZ2VyXCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4saSl7dmFyIG89dGhpcy5vbk1lc3NhZ2UoZSx0LG4saSk7aWYodCYmIW8pdGhyb3cgbmV3IEVycm9yKFwiY2hhbm5lbCBvbk1lc3NhZ2UgY2FsbGJhY2tzIG11c3QgcmV0dXJuIHRoZSBwYXlsb2FkLCBtb2RpZmllZCBvciB1bm1vZGlmaWVkXCIpO2Zvcih2YXIgcj10aGlzLmJpbmRpbmdzLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQuZXZlbnQ9PT1lfSkpLHM9MDtzPHIubGVuZ3RoO3MrKyl7cltzXS5jYWxsYmFjayhvLG4saXx8dGhpcy5qb2luUmVmKCkpfX19LHtrZXk6XCJyZXBseUV2ZW50TmFtZVwiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVyblwiY2hhbl9yZXBseV9cIi5jb25jYXQoZSl9fSx7a2V5OlwiaXNDbG9zZWRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlPT09Z319LHtrZXk6XCJpc0Vycm9yZWRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlPT09a319LHtrZXk6XCJpc0pvaW5lZFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGU9PT1ifX0se2tleTpcImlzSm9pbmluZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGU9PT1qfX0se2tleTpcImlzTGVhdmluZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGU9PT1DfX1dKSxlfSgpLEg9e0hFQURFUl9MRU5HVEg6MSxNRVRBX0xFTkdUSDo0LEtJTkRTOntwdXNoOjAscmVwbHk6MSxicm9hZGNhc3Q6Mn0sZW5jb2RlOmZ1bmN0aW9uKGUsdCl7aWYoZS5wYXlsb2FkLmNvbnN0cnVjdG9yPT09QXJyYXlCdWZmZXIpcmV0dXJuIHQodGhpcy5iaW5hcnlFbmNvZGUoZSkpO3ZhciBuPVtlLmpvaW5fcmVmLGUucmVmLGUudG9waWMsZS5ldmVudCxlLnBheWxvYWRdO3JldHVybiB0KEpTT04uc3RyaW5naWZ5KG4pKX0sZGVjb2RlOmZ1bmN0aW9uKGUsdCl7aWYoZS5jb25zdHJ1Y3Rvcj09PUFycmF5QnVmZmVyKXJldHVybiB0KHRoaXMuYmluYXJ5RGVjb2RlKGUpKTt2YXIgbj1yKEpTT04ucGFyc2UoZSksNSk7cmV0dXJuIHQoe2pvaW5fcmVmOm5bMF0scmVmOm5bMV0sdG9waWM6blsyXSxldmVudDpuWzNdLHBheWxvYWQ6bls0XX0pfSxiaW5hcnlFbmNvZGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5qb2luX3JlZixuPWUucmVmLGk9ZS5ldmVudCxvPWUudG9waWMscj1lLnBheWxvYWQscz10aGlzLk1FVEFfTEVOR1RIK3QubGVuZ3RoK24ubGVuZ3RoK28ubGVuZ3RoK2kubGVuZ3RoLGE9bmV3IEFycmF5QnVmZmVyKHRoaXMuSEVBREVSX0xFTkdUSCtzKSxjPW5ldyBEYXRhVmlldyhhKSx1PTA7Yy5zZXRVaW50OCh1KyssdGhpcy5LSU5EUy5wdXNoKSxjLnNldFVpbnQ4KHUrKyx0Lmxlbmd0aCksYy5zZXRVaW50OCh1Kyssbi5sZW5ndGgpLGMuc2V0VWludDgodSsrLG8ubGVuZ3RoKSxjLnNldFVpbnQ4KHUrKyxpLmxlbmd0aCksQXJyYXkuZnJvbSh0LChmdW5jdGlvbihlKXtyZXR1cm4gYy5zZXRVaW50OCh1KyssZS5jaGFyQ29kZUF0KDApKX0pKSxBcnJheS5mcm9tKG4sKGZ1bmN0aW9uKGUpe3JldHVybiBjLnNldFVpbnQ4KHUrKyxlLmNoYXJDb2RlQXQoMCkpfSkpLEFycmF5LmZyb20obywoZnVuY3Rpb24oZSl7cmV0dXJuIGMuc2V0VWludDgodSsrLGUuY2hhckNvZGVBdCgwKSl9KSksQXJyYXkuZnJvbShpLChmdW5jdGlvbihlKXtyZXR1cm4gYy5zZXRVaW50OCh1KyssZS5jaGFyQ29kZUF0KDApKX0pKTt2YXIgaD1uZXcgVWludDhBcnJheShhLmJ5dGVMZW5ndGgrci5ieXRlTGVuZ3RoKTtyZXR1cm4gaC5zZXQobmV3IFVpbnQ4QXJyYXkoYSksMCksaC5zZXQobmV3IFVpbnQ4QXJyYXkociksYS5ieXRlTGVuZ3RoKSxoLmJ1ZmZlcn0sYmluYXJ5RGVjb2RlOmZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBEYXRhVmlldyhlKSxuPXQuZ2V0VWludDgoMCksaT1uZXcgVGV4dERlY29kZXI7c3dpdGNoKG4pe2Nhc2UgdGhpcy5LSU5EUy5wdXNoOnJldHVybiB0aGlzLmRlY29kZVB1c2goZSx0LGkpO2Nhc2UgdGhpcy5LSU5EUy5yZXBseTpyZXR1cm4gdGhpcy5kZWNvZGVSZXBseShlLHQsaSk7Y2FzZSB0aGlzLktJTkRTLmJyb2FkY2FzdDpyZXR1cm4gdGhpcy5kZWNvZGVCcm9hZGNhc3QoZSx0LGkpfX0sZGVjb2RlUHVzaDpmdW5jdGlvbihlLHQsbil7dmFyIGk9dC5nZXRVaW50OCgxKSxvPXQuZ2V0VWludDgoMikscj10LmdldFVpbnQ4KDMpLHM9dGhpcy5IRUFERVJfTEVOR1RIK3RoaXMuTUVUQV9MRU5HVEgtMSxhPW4uZGVjb2RlKGUuc2xpY2UocyxzK2kpKTtzKz1pO3ZhciBjPW4uZGVjb2RlKGUuc2xpY2UocyxzK28pKTtzKz1vO3ZhciB1PW4uZGVjb2RlKGUuc2xpY2UocyxzK3IpKTtyZXR1cm4gcys9cix7am9pbl9yZWY6YSxyZWY6bnVsbCx0b3BpYzpjLGV2ZW50OnUscGF5bG9hZDplLnNsaWNlKHMsZS5ieXRlTGVuZ3RoKX19LGRlY29kZVJlcGx5OmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10LmdldFVpbnQ4KDEpLG89dC5nZXRVaW50OCgyKSxyPXQuZ2V0VWludDgoMykscz10LmdldFVpbnQ4KDQpLGE9dGhpcy5IRUFERVJfTEVOR1RIK3RoaXMuTUVUQV9MRU5HVEgsYz1uLmRlY29kZShlLnNsaWNlKGEsYStpKSk7YSs9aTt2YXIgdT1uLmRlY29kZShlLnNsaWNlKGEsYStvKSk7YSs9bzt2YXIgaD1uLmRlY29kZShlLnNsaWNlKGEsYStyKSk7YSs9cjt2YXIgbD1uLmRlY29kZShlLnNsaWNlKGEsYStzKSk7YSs9czt2YXIgZj1lLnNsaWNlKGEsZS5ieXRlTGVuZ3RoKTtyZXR1cm57am9pbl9yZWY6YyxyZWY6dSx0b3BpYzpoLGV2ZW50OlMscGF5bG9hZDp7c3RhdHVzOmwscmVzcG9uc2U6Zn19fSxkZWNvZGVCcm9hZGNhc3Q6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXQuZ2V0VWludDgoMSksbz10LmdldFVpbnQ4KDIpLHI9dGhpcy5IRUFERVJfTEVOR1RIKzIscz1uLmRlY29kZShlLnNsaWNlKHIscitpKSk7cis9aTt2YXIgYT1uLmRlY29kZShlLnNsaWNlKHIscitvKSk7cmV0dXJuIHIrPW8se2pvaW5fcmVmOm51bGwscmVmOm51bGwsdG9waWM6cyxldmVudDphLHBheWxvYWQ6ZS5zbGljZShyLGUuYnl0ZUxlbmd0aCl9fX0sVT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7dmFyIG49dGhpcyxpPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtjKHRoaXMsZSksdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcz17b3BlbjpbXSxjbG9zZTpbXSxlcnJvcjpbXSxtZXNzYWdlOltdfSx0aGlzLmNoYW5uZWxzPVtdLHRoaXMuc2VuZEJ1ZmZlcj1bXSx0aGlzLnJlZj0wLHRoaXMudGltZW91dD1pLnRpbWVvdXR8fDFlNCx0aGlzLnRyYW5zcG9ydD1pLnRyYW5zcG9ydHx8ZC5XZWJTb2NrZXR8fEQsdGhpcy5kZWZhdWx0RW5jb2Rlcj1ILmVuY29kZS5iaW5kKEgpLHRoaXMuZGVmYXVsdERlY29kZXI9SC5kZWNvZGUuYmluZChIKSx0aGlzLmNsb3NlV2FzQ2xlYW49ITEsdGhpcy51bmxvYWRlZD0hMSx0aGlzLmJpbmFyeVR5cGU9aS5iaW5hcnlUeXBlfHxcImFycmF5YnVmZmVyXCIsdGhpcy50cmFuc3BvcnQhPT1EPyh0aGlzLmVuY29kZT1pLmVuY29kZXx8dGhpcy5kZWZhdWx0RW5jb2Rlcix0aGlzLmRlY29kZT1pLmRlY29kZXx8dGhpcy5kZWZhdWx0RGVjb2Rlcik6KHRoaXMuZW5jb2RlPXRoaXMuZGVmYXVsdEVuY29kZXIsdGhpcy5kZWNvZGU9dGhpcy5kZWZhdWx0RGVjb2RlciksZiYmZi5hZGRFdmVudExpc3RlbmVyJiZmLmFkZEV2ZW50TGlzdGVuZXIoXCJ1bmxvYWRcIiwoZnVuY3Rpb24oZSl7bi5jb25uJiYobi51bmxvYWRlZD0hMCxuLmFibm9ybWFsQ2xvc2UoXCJ1bmxvYWRlZFwiKSl9KSksdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zPWkuaGVhcnRiZWF0SW50ZXJ2YWxNc3x8M2U0LHRoaXMucmVqb2luQWZ0ZXJNcz1mdW5jdGlvbihlKXtyZXR1cm4gaS5yZWpvaW5BZnRlck1zP2kucmVqb2luQWZ0ZXJNcyhlKTpbMWUzLDJlMyw1ZTNdW2UtMV18fDFlNH0sdGhpcy5yZWNvbm5lY3RBZnRlck1zPWZ1bmN0aW9uKGUpe3JldHVybiBuLnVubG9hZGVkPzEwMDppLnJlY29ubmVjdEFmdGVyTXM/aS5yZWNvbm5lY3RBZnRlck1zKGUpOlsxMCw1MCwxMDAsMTUwLDIwMCwyNTAsNTAwLDFlMywyZTNdW2UtMV18fDVlM30sdGhpcy5sb2dnZXI9aS5sb2dnZXJ8fG51bGwsdGhpcy5sb25ncG9sbGVyVGltZW91dD1pLmxvbmdwb2xsZXJUaW1lb3V0fHwyZTQsdGhpcy5wYXJhbXM9TyhpLnBhcmFtc3x8e30pLHRoaXMuZW5kUG9pbnQ9XCJcIi5jb25jYXQodCxcIi9cIikuY29uY2F0KHgpLHRoaXMudnNuPWkudnNufHxcIjIuMC4wXCIsdGhpcy5oZWFydGJlYXRUaW1lcj1udWxsLHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZj1udWxsLHRoaXMucmVjb25uZWN0VGltZXI9bmV3IEooKGZ1bmN0aW9uKCl7bi50ZWFyZG93bigoZnVuY3Rpb24oKXtyZXR1cm4gbi5jb25uZWN0KCl9KSl9KSx0aGlzLnJlY29ubmVjdEFmdGVyTXMpfXJldHVybiBoKGUsW3trZXk6XCJwcm90b2NvbFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGxvY2F0aW9uLnByb3RvY29sLm1hdGNoKC9eaHR0cHMvKT9cIndzc1wiOlwid3NcIn19LHtrZXk6XCJlbmRQb2ludFVSTFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9TS5hcHBlbmRQYXJhbXMoTS5hcHBlbmRQYXJhbXModGhpcy5lbmRQb2ludCx0aGlzLnBhcmFtcygpKSx7dnNuOnRoaXMudnNufSk7cmV0dXJuXCIvXCIhPT1lLmNoYXJBdCgwKT9lOlwiL1wiPT09ZS5jaGFyQXQoMSk/XCJcIi5jb25jYXQodGhpcy5wcm90b2NvbCgpLFwiOlwiKS5jb25jYXQoZSk6XCJcIi5jb25jYXQodGhpcy5wcm90b2NvbCgpLFwiOi8vXCIpLmNvbmNhdChsb2NhdGlvbi5ob3N0KS5jb25jYXQoZSl9fSx7a2V5OlwiZGlzY29ubmVjdFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt0aGlzLmNsb3NlV2FzQ2xlYW49ITAsdGhpcy5yZWNvbm5lY3RUaW1lci5yZXNldCgpLHRoaXMudGVhcmRvd24oZSx0LG4pfX0se2tleTpcImNvbm5lY3RcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2UmJihjb25zb2xlJiZjb25zb2xlLmxvZyhcInBhc3NpbmcgcGFyYW1zIHRvIGNvbm5lY3QgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCBwYXNzIDpwYXJhbXMgdG8gdGhlIFNvY2tldCBjb25zdHJ1Y3RvclwiKSx0aGlzLnBhcmFtcz1PKGUpKSx0aGlzLmNvbm58fCh0aGlzLmNsb3NlV2FzQ2xlYW49ITEsdGhpcy5jb25uPW5ldyB0aGlzLnRyYW5zcG9ydCh0aGlzLmVuZFBvaW50VVJMKCkpLHRoaXMuY29ubi5iaW5hcnlUeXBlPXRoaXMuYmluYXJ5VHlwZSx0aGlzLmNvbm4udGltZW91dD10aGlzLmxvbmdwb2xsZXJUaW1lb3V0LHRoaXMuY29ubi5vbm9wZW49ZnVuY3Rpb24oKXtyZXR1cm4gdC5vbkNvbm5PcGVuKCl9LHRoaXMuY29ubi5vbmVycm9yPWZ1bmN0aW9uKGUpe3JldHVybiB0Lm9uQ29ubkVycm9yKGUpfSx0aGlzLmNvbm4ub25tZXNzYWdlPWZ1bmN0aW9uKGUpe3JldHVybiB0Lm9uQ29ubk1lc3NhZ2UoZSl9LHRoaXMuY29ubi5vbmNsb3NlPWZ1bmN0aW9uKGUpe3JldHVybiB0Lm9uQ29ubkNsb3NlKGUpfSl9fSx7a2V5OlwibG9nXCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3RoaXMubG9nZ2VyKGUsdCxuKX19LHtrZXk6XCJoYXNMb2dnZXJcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBudWxsIT09dGhpcy5sb2dnZXJ9fSx7a2V5Olwib25PcGVuXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5tYWtlUmVmKCk7cmV0dXJuIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3Mub3Blbi5wdXNoKFt0LGVdKSx0fX0se2tleTpcIm9uQ2xvc2VcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLm1ha2VSZWYoKTtyZXR1cm4gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5jbG9zZS5wdXNoKFt0LGVdKSx0fX0se2tleTpcIm9uRXJyb3JcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLm1ha2VSZWYoKTtyZXR1cm4gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5lcnJvci5wdXNoKFt0LGVdKSx0fX0se2tleTpcIm9uTWVzc2FnZVwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubWFrZVJlZigpO3JldHVybiB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm1lc3NhZ2UucHVzaChbdCxlXSksdH19LHtrZXk6XCJvbkNvbm5PcGVuXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmhhc0xvZ2dlcigpJiZ0aGlzLmxvZyhcInRyYW5zcG9ydFwiLFwiY29ubmVjdGVkIHRvIFwiLmNvbmNhdCh0aGlzLmVuZFBvaW50VVJMKCkpKSx0aGlzLnVubG9hZGVkPSExLHRoaXMuY2xvc2VXYXNDbGVhbj0hMSx0aGlzLmZsdXNoU2VuZEJ1ZmZlcigpLHRoaXMucmVjb25uZWN0VGltZXIucmVzZXQoKSx0aGlzLnJlc2V0SGVhcnRiZWF0KCksdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5vcGVuLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JldHVybigwLHIoZSwyKVsxXSkoKX0pKX19LHtrZXk6XCJyZXNldEhlYXJ0YmVhdFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLmNvbm4mJnRoaXMuY29ubi5za2lwSGVhcnRiZWF0fHwodGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmPW51bGwsY2xlYXJJbnRlcnZhbCh0aGlzLmhlYXJ0YmVhdFRpbWVyKSx0aGlzLmhlYXJ0YmVhdFRpbWVyPXNldEludGVydmFsKChmdW5jdGlvbigpe3JldHVybiBlLnNlbmRIZWFydGJlYXQoKX0pLHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcykpfX0se2tleTpcInRlYXJkb3duXCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXM7aWYoIXRoaXMuY29ubilyZXR1cm4gZSYmZSgpO3RoaXMud2FpdEZvckJ1ZmZlckRvbmUoKGZ1bmN0aW9uKCl7aS5jb25uJiYodD9pLmNvbm4uY2xvc2UodCxufHxcIlwiKTppLmNvbm4uY2xvc2UoKSksaS53YWl0Rm9yU29ja2V0Q2xvc2VkKChmdW5jdGlvbigpe2kuY29ubiYmKGkuY29ubi5vbmNsb3NlPWZ1bmN0aW9uKCl7fSxpLmNvbm49bnVsbCksZSYmZSgpfSkpfSkpfX0se2tleTpcIndhaXRGb3JCdWZmZXJEb25lXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToxOzUhPT1uJiZ0aGlzLmNvbm4mJnRoaXMuY29ubi5idWZmZXJlZEFtb3VudD9zZXRUaW1lb3V0KChmdW5jdGlvbigpe3Qud2FpdEZvckJ1ZmZlckRvbmUoZSxuKzEpfSksMTUwKm4pOmUoKX19LHtrZXk6XCJ3YWl0Rm9yU29ja2V0Q2xvc2VkXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToxOzUhPT1uJiZ0aGlzLmNvbm4mJnRoaXMuY29ubi5yZWFkeVN0YXRlIT09bT9zZXRUaW1lb3V0KChmdW5jdGlvbigpe3Qud2FpdEZvclNvY2tldENsb3NlZChlLG4rMSl9KSwxNTAqbik6ZSgpfX0se2tleTpcIm9uQ29ubkNsb3NlXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5oYXNMb2dnZXIoKSYmdGhpcy5sb2coXCJ0cmFuc3BvcnRcIixcImNsb3NlXCIsZSksdGhpcy50cmlnZ2VyQ2hhbkVycm9yKCksY2xlYXJJbnRlcnZhbCh0aGlzLmhlYXJ0YmVhdFRpbWVyKSx0aGlzLmNsb3NlV2FzQ2xlYW58fHRoaXMucmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCksdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5jbG9zZS5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4oMCxyKHQsMilbMV0pKGUpfSkpfX0se2tleTpcIm9uQ29ubkVycm9yXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5oYXNMb2dnZXIoKSYmdGhpcy5sb2coXCJ0cmFuc3BvcnRcIixlKSx0aGlzLnRyaWdnZXJDaGFuRXJyb3IoKSx0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLmVycm9yLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybigwLHIodCwyKVsxXSkoZSl9KSl9fSx7a2V5OlwidHJpZ2dlckNoYW5FcnJvclwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5jaGFubmVscy5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmlzRXJyb3JlZCgpfHxlLmlzTGVhdmluZygpfHxlLmlzQ2xvc2VkKCl8fGUudHJpZ2dlcihSKX0pKX19LHtrZXk6XCJjb25uZWN0aW9uU3RhdGVcIix2YWx1ZTpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLmNvbm4mJnRoaXMuY29ubi5yZWFkeVN0YXRlKXtjYXNlIHA6cmV0dXJuXCJjb25uZWN0aW5nXCI7Y2FzZSB2OnJldHVyblwib3BlblwiO2Nhc2UgeTpyZXR1cm5cImNsb3NpbmdcIjtkZWZhdWx0OnJldHVyblwiY2xvc2VkXCJ9fX0se2tleTpcImlzQ29ubmVjdGVkXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5cIm9wZW5cIj09PXRoaXMuY29ubmVjdGlvblN0YXRlKCl9fSx7a2V5OlwicmVtb3ZlXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vZmYoZS5zdGF0ZUNoYW5nZVJlZnMpLHRoaXMuY2hhbm5lbHM9dGhpcy5jaGFubmVscy5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmpvaW5SZWYoKSE9PWUuam9pblJlZigpfSkpfX0se2tleTpcIm9mZlwiLHZhbHVlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzKXRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3NbdF09dGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrc1t0XS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3ZhciBuPXIodCwxKVswXTtyZXR1cm4tMT09PWUuaW5kZXhPZihuKX0pKX19LHtrZXk6XCJjaGFubmVsXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LG49bmV3IF8oZSx0LHRoaXMpO3JldHVybiB0aGlzLmNoYW5uZWxzLnB1c2gobiksbn19LHtrZXk6XCJwdXNoXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZih0aGlzLmhhc0xvZ2dlcigpKXt2YXIgbj1lLnRvcGljLGk9ZS5ldmVudCxvPWUucGF5bG9hZCxyPWUucmVmLHM9ZS5qb2luX3JlZjt0aGlzLmxvZyhcInB1c2hcIixcIlwiLmNvbmNhdChuLFwiIFwiKS5jb25jYXQoaSxcIiAoXCIpLmNvbmNhdChzLFwiLCBcIikuY29uY2F0KHIsXCIpXCIpLG8pfXRoaXMuaXNDb25uZWN0ZWQoKT90aGlzLmVuY29kZShlLChmdW5jdGlvbihlKXtyZXR1cm4gdC5jb25uLnNlbmQoZSl9KSk6dGhpcy5zZW5kQnVmZmVyLnB1c2goKGZ1bmN0aW9uKCl7cmV0dXJuIHQuZW5jb2RlKGUsKGZ1bmN0aW9uKGUpe3JldHVybiB0LmNvbm4uc2VuZChlKX0pKX0pKX19LHtrZXk6XCJtYWtlUmVmXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJlZisxO3JldHVybiBlPT09dGhpcy5yZWY/dGhpcy5yZWY9MDp0aGlzLnJlZj1lLHRoaXMucmVmLnRvU3RyaW5nKCl9fSx7a2V5Olwic2VuZEhlYXJ0YmVhdFwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0Nvbm5lY3RlZCgpKXtpZih0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYpcmV0dXJuIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZj1udWxsLHRoaXMuaGFzTG9nZ2VyKCkmJnRoaXMubG9nKFwidHJhbnNwb3J0XCIsXCJoZWFydGJlYXQgdGltZW91dC4gQXR0ZW1wdGluZyB0byByZS1lc3RhYmxpc2ggY29ubmVjdGlvblwiKSx2b2lkIHRoaXMuYWJub3JtYWxDbG9zZShcImhlYXJ0YmVhdCB0aW1lb3V0XCIpO3RoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZj10aGlzLm1ha2VSZWYoKSx0aGlzLnB1c2goe3RvcGljOlwicGhvZW5peFwiLGV2ZW50OlwiaGVhcnRiZWF0XCIscGF5bG9hZDp7fSxyZWY6dGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmfSl9fX0se2tleTpcImFibm9ybWFsQ2xvc2VcIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLmNsb3NlV2FzQ2xlYW49ITEsdGhpcy5jb25uLnJlYWR5U3RhdGU9PT12JiZ0aGlzLmNvbm4uY2xvc2UoMWUzLGUpfX0se2tleTpcImZsdXNoU2VuZEJ1ZmZlclwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5pc0Nvbm5lY3RlZCgpJiZ0aGlzLnNlbmRCdWZmZXIubGVuZ3RoPjAmJih0aGlzLnNlbmRCdWZmZXIuZm9yRWFjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUoKX0pKSx0aGlzLnNlbmRCdWZmZXI9W10pfX0se2tleTpcIm9uQ29ubk1lc3NhZ2VcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMuZGVjb2RlKGUuZGF0YSwoZnVuY3Rpb24oZSl7dmFyIG49ZS50b3BpYyxpPWUuZXZlbnQsbz1lLnBheWxvYWQscz1lLnJlZixhPWUuam9pbl9yZWY7cyYmcz09PXQucGVuZGluZ0hlYXJ0YmVhdFJlZiYmKHQucGVuZGluZ0hlYXJ0YmVhdFJlZj1udWxsKSx0Lmhhc0xvZ2dlcigpJiZ0LmxvZyhcInJlY2VpdmVcIixcIlwiLmNvbmNhdChvLnN0YXR1c3x8XCJcIixcIiBcIikuY29uY2F0KG4sXCIgXCIpLmNvbmNhdChpLFwiIFwiKS5jb25jYXQocyYmXCIoXCIrcytcIilcInx8XCJcIiksbyk7Zm9yKHZhciBjPTA7Yzx0LmNoYW5uZWxzLmxlbmd0aDtjKyspe3ZhciB1PXQuY2hhbm5lbHNbY107dS5pc01lbWJlcihuLGksbyxhKSYmdS50cmlnZ2VyKGksbyxzLGEpfWZvcih2YXIgaD0wO2g8dC5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5tZXNzYWdlLmxlbmd0aDtoKyspeygwLHIodC5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5tZXNzYWdlW2hdLDIpWzFdKShlKX19KSl9fSx7a2V5OlwibGVhdmVPcGVuVG9waWNcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmNoYW5uZWxzLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnRvcGljPT09ZSYmKHQuaXNKb2luZWQoKXx8dC5pc0pvaW5pbmcoKSl9KSk7dCYmKHRoaXMuaGFzTG9nZ2VyKCkmJnRoaXMubG9nKFwidHJhbnNwb3J0XCIsJ2xlYXZpbmcgZHVwbGljYXRlIHRvcGljIFwiJy5jb25jYXQoZSwnXCInKSksdC5sZWF2ZSgpKX19XSksZX0oKSxEPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtjKHRoaXMsZSksdGhpcy5lbmRQb2ludD1udWxsLHRoaXMudG9rZW49bnVsbCx0aGlzLnNraXBIZWFydGJlYXQ9ITAsdGhpcy5vbm9wZW49ZnVuY3Rpb24oKXt9LHRoaXMub25lcnJvcj1mdW5jdGlvbigpe30sdGhpcy5vbm1lc3NhZ2U9ZnVuY3Rpb24oKXt9LHRoaXMub25jbG9zZT1mdW5jdGlvbigpe30sdGhpcy5wb2xsRW5kcG9pbnQ9dGhpcy5ub3JtYWxpemVFbmRwb2ludCh0KSx0aGlzLnJlYWR5U3RhdGU9cCx0aGlzLnBvbGwoKX1yZXR1cm4gaChlLFt7a2V5Olwibm9ybWFsaXplRW5kcG9pbnRcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKFwid3M6Ly9cIixcImh0dHA6Ly9cIikucmVwbGFjZShcIndzczovL1wiLFwiaHR0cHM6Ly9cIikucmVwbGFjZShuZXcgUmVnRXhwKFwiKC4qKS9cIit4KSxcIiQxL1wiK0wpfX0se2tleTpcImVuZHBvaW50VVJMXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gTS5hcHBlbmRQYXJhbXModGhpcy5wb2xsRW5kcG9pbnQse3Rva2VuOnRoaXMudG9rZW59KX19LHtrZXk6XCJjbG9zZUFuZFJldHJ5XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmNsb3NlKCksdGhpcy5yZWFkeVN0YXRlPXB9fSx7a2V5Olwib250aW1lb3V0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLm9uZXJyb3IoXCJ0aW1lb3V0XCIpLHRoaXMuY2xvc2VBbmRSZXRyeSgpfX0se2tleTpcInBvbGxcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5yZWFkeVN0YXRlIT09diYmdGhpcy5yZWFkeVN0YXRlIT09cHx8TS5yZXF1ZXN0KFwiR0VUXCIsdGhpcy5lbmRwb2ludFVSTCgpLFwiYXBwbGljYXRpb24vanNvblwiLG51bGwsdGhpcy50aW1lb3V0LHRoaXMub250aW1lb3V0LmJpbmQodGhpcyksKGZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBuPXQuc3RhdHVzLGk9dC50b2tlbixvPXQubWVzc2FnZXM7ZS50b2tlbj1pfWVsc2Ugbj0wO3N3aXRjaChuKXtjYXNlIDIwMDpvLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBlLm9ubWVzc2FnZSh7ZGF0YTp0fSl9KSksZS5wb2xsKCk7YnJlYWs7Y2FzZSAyMDQ6ZS5wb2xsKCk7YnJlYWs7Y2FzZSA0MTA6ZS5yZWFkeVN0YXRlPXYsZS5vbm9wZW4oKSxlLnBvbGwoKTticmVhaztjYXNlIDQwMzplLm9uZXJyb3IoKSxlLmNsb3NlKCk7YnJlYWs7Y2FzZSAwOmNhc2UgNTAwOmUub25lcnJvcigpLGUuY2xvc2VBbmRSZXRyeSgpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKFwidW5oYW5kbGVkIHBvbGwgc3RhdHVzIFwiLmNvbmNhdChuKSl9fSkpfX0se2tleTpcInNlbmRcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO00ucmVxdWVzdChcIlBPU1RcIix0aGlzLmVuZHBvaW50VVJMKCksXCJhcHBsaWNhdGlvbi9qc29uXCIsZSx0aGlzLnRpbWVvdXQsdGhpcy5vbmVycm9yLmJpbmQodGhpcyxcInRpbWVvdXRcIiksKGZ1bmN0aW9uKGUpe2UmJjIwMD09PWUuc3RhdHVzfHwodC5vbmVycm9yKGUmJmUuc3RhdHVzKSx0LmNsb3NlQW5kUmV0cnkoKSl9KSl9fSx7a2V5OlwiY2xvc2VcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3RoaXMucmVhZHlTdGF0ZT1tLHRoaXMub25jbG9zZSgpfX1dKSxlfSgpLE09ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7Yyh0aGlzLGUpfXJldHVybiBoKGUsbnVsbCxbe2tleTpcInJlcXVlc3RcIix2YWx1ZTpmdW5jdGlvbihlLHQsbixpLG8scixzKXtpZihkLlhEb21haW5SZXF1ZXN0KXt2YXIgYT1uZXcgWERvbWFpblJlcXVlc3Q7dGhpcy54ZG9tYWluUmVxdWVzdChhLGUsdCxpLG8scixzKX1lbHNle3ZhciBjPW5ldyBkLlhNTEh0dHBSZXF1ZXN0O3RoaXMueGhyUmVxdWVzdChjLGUsdCxuLGksbyxyLHMpfX19LHtrZXk6XCJ4ZG9tYWluUmVxdWVzdFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLGksbyxyLHMpe3ZhciBhPXRoaXM7ZS50aW1lb3V0PW8sZS5vcGVuKHQsbiksZS5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgdD1hLnBhcnNlSlNPTihlLnJlc3BvbnNlVGV4dCk7cyYmcyh0KX0sciYmKGUub250aW1lb3V0PXIpLGUub25wcm9ncmVzcz1mdW5jdGlvbigpe30sZS5zZW5kKGkpfX0se2tleTpcInhoclJlcXVlc3RcIix2YWx1ZTpmdW5jdGlvbihlLHQsbixpLG8scixzLGEpe3ZhciBjPXRoaXM7ZS5vcGVuKHQsbiwhMCksZS50aW1lb3V0PXIsZS5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsaSksZS5vbmVycm9yPWZ1bmN0aW9uKCl7YSYmYShudWxsKX0sZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZihlLnJlYWR5U3RhdGU9PT1jLnN0YXRlcy5jb21wbGV0ZSYmYSl7dmFyIHQ9Yy5wYXJzZUpTT04oZS5yZXNwb25zZVRleHQpO2EodCl9fSxzJiYoZS5vbnRpbWVvdXQ9cyksZS5zZW5kKG8pfX0se2tleTpcInBhcnNlSlNPTlwiLHZhbHVlOmZ1bmN0aW9uKGUpe2lmKCFlfHxcIlwiPT09ZSlyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIEpTT04ucGFyc2UoZSl9Y2F0Y2godCl7cmV0dXJuIGNvbnNvbGUmJmNvbnNvbGUubG9nKFwiZmFpbGVkIHRvIHBhcnNlIEpTT04gcmVzcG9uc2VcIixlKSxudWxsfX19LHtrZXk6XCJzZXJpYWxpemVcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPVtdO2Zvcih2YXIgaSBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkoaSkpe3ZhciByPXQ/XCJcIi5jb25jYXQodCxcIltcIikuY29uY2F0KGksXCJdXCIpOmkscz1lW2ldO1wib2JqZWN0XCI9PT1vKHMpP24ucHVzaCh0aGlzLnNlcmlhbGl6ZShzLHIpKTpuLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHIpK1wiPVwiK2VuY29kZVVSSUNvbXBvbmVudChzKSl9cmV0dXJuIG4uam9pbihcIiZcIil9fSx7a2V5OlwiYXBwZW5kUGFyYW1zXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtpZigwPT09T2JqZWN0LmtleXModCkubGVuZ3RoKXJldHVybiBlO3ZhciBuPWUubWF0Y2goL1xcPy8pP1wiJlwiOlwiP1wiO3JldHVyblwiXCIuY29uY2F0KGUpLmNvbmNhdChuKS5jb25jYXQodGhpcy5zZXJpYWxpemUodCkpfX1dKSxlfSgpO00uc3RhdGVzPXtjb21wbGV0ZTo0fTt2YXIgTj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7dmFyIG49dGhpcyxpPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtjKHRoaXMsZSk7dmFyIG89aS5ldmVudHN8fHtzdGF0ZTpcInByZXNlbmNlX3N0YXRlXCIsZGlmZjpcInByZXNlbmNlX2RpZmZcIn07dGhpcy5zdGF0ZT17fSx0aGlzLnBlbmRpbmdEaWZmcz1bXSx0aGlzLmNoYW5uZWw9dCx0aGlzLmpvaW5SZWY9bnVsbCx0aGlzLmNhbGxlcj17b25Kb2luOmZ1bmN0aW9uKCl7fSxvbkxlYXZlOmZ1bmN0aW9uKCl7fSxvblN5bmM6ZnVuY3Rpb24oKXt9fSx0aGlzLmNoYW5uZWwub24oby5zdGF0ZSwoZnVuY3Rpb24odCl7dmFyIGk9bi5jYWxsZXIsbz1pLm9uSm9pbixyPWkub25MZWF2ZSxzPWkub25TeW5jO24uam9pblJlZj1uLmNoYW5uZWwuam9pblJlZigpLG4uc3RhdGU9ZS5zeW5jU3RhdGUobi5zdGF0ZSx0LG8sciksbi5wZW5kaW5nRGlmZnMuZm9yRWFjaCgoZnVuY3Rpb24odCl7bi5zdGF0ZT1lLnN5bmNEaWZmKG4uc3RhdGUsdCxvLHIpfSkpLG4ucGVuZGluZ0RpZmZzPVtdLHMoKX0pKSx0aGlzLmNoYW5uZWwub24oby5kaWZmLChmdW5jdGlvbih0KXt2YXIgaT1uLmNhbGxlcixvPWkub25Kb2luLHI9aS5vbkxlYXZlLHM9aS5vblN5bmM7bi5pblBlbmRpbmdTeW5jU3RhdGUoKT9uLnBlbmRpbmdEaWZmcy5wdXNoKHQpOihuLnN0YXRlPWUuc3luY0RpZmYobi5zdGF0ZSx0LG8scikscygpKX0pKX1yZXR1cm4gaChlLFt7a2V5Olwib25Kb2luXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5jYWxsZXIub25Kb2luPWV9fSx7a2V5Olwib25MZWF2ZVwiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuY2FsbGVyLm9uTGVhdmU9ZX19LHtrZXk6XCJvblN5bmNcIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLmNhbGxlci5vblN5bmM9ZX19LHtrZXk6XCJsaXN0XCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIGUubGlzdCh0aGlzLnN0YXRlLHQpfX0se2tleTpcImluUGVuZGluZ1N5bmNTdGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuam9pblJlZnx8dGhpcy5qb2luUmVmIT09dGhpcy5jaGFubmVsLmpvaW5SZWYoKX19XSxbe2tleTpcInN5bmNTdGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBvPXRoaXMscj10aGlzLmNsb25lKGUpLHM9e30sYT17fTtyZXR1cm4gdGhpcy5tYXAociwoZnVuY3Rpb24oZSxuKXt0W2VdfHwoYVtlXT1uKX0pKSx0aGlzLm1hcCh0LChmdW5jdGlvbihlLHQpe3ZhciBuPXJbZV07aWYobil7dmFyIGk9dC5tZXRhcy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBoeF9yZWZ9KSksYz1uLm1ldGFzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGh4X3JlZn0pKSx1PXQubWV0YXMuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gYy5pbmRleE9mKGUucGh4X3JlZik8MH0pKSxoPW4ubWV0YXMuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gaS5pbmRleE9mKGUucGh4X3JlZik8MH0pKTt1Lmxlbmd0aD4wJiYoc1tlXT10LHNbZV0ubWV0YXM9dSksaC5sZW5ndGg+MCYmKGFbZV09by5jbG9uZShuKSxhW2VdLm1ldGFzPWgpfWVsc2Ugc1tlXT10fSkpLHRoaXMuc3luY0RpZmYocix7am9pbnM6cyxsZWF2ZXM6YX0sbixpKX19LHtrZXk6XCJzeW5jRGlmZlwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLG8pe3ZhciByPXQuam9pbnMscz10LmxlYXZlcyxhPXRoaXMuY2xvbmUoZSk7cmV0dXJuIG58fChuPWZ1bmN0aW9uKCl7fSksb3x8KG89ZnVuY3Rpb24oKXt9KSx0aGlzLm1hcChyLChmdW5jdGlvbihlLHQpe3ZhciBvPWFbZV07aWYoYVtlXT10LG8pe3ZhciByLHM9YVtlXS5tZXRhcy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBoeF9yZWZ9KSksYz1vLm1ldGFzLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIHMuaW5kZXhPZihlLnBoeF9yZWYpPDB9KSk7KHI9YVtlXS5tZXRhcykudW5zaGlmdC5hcHBseShyLGkoYykpfW4oZSxvLHQpfSkpLHRoaXMubWFwKHMsKGZ1bmN0aW9uKGUsdCl7dmFyIG49YVtlXTtpZihuKXt2YXIgaT10Lm1ldGFzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGh4X3JlZn0pKTtuLm1ldGFzPW4ubWV0YXMuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gaS5pbmRleE9mKGUucGh4X3JlZik8MH0pKSxvKGUsbix0KSwwPT09bi5tZXRhcy5sZW5ndGgmJmRlbGV0ZSBhW2VdfX0pKSxhfX0se2tleTpcImxpc3RcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiB0fHwodD1mdW5jdGlvbihlLHQpe3JldHVybiB0fSksdGhpcy5tYXAoZSwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gdChlLG4pfSkpfX0se2tleTpcIm1hcFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIHQobixlW25dKX0pKX19LHtrZXk6XCJjbG9uZVwiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUpKX19XSksZX0oKSxKPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0LG4pe2ModGhpcyxlKSx0aGlzLmNhbGxiYWNrPXQsdGhpcy50aW1lckNhbGM9bix0aGlzLnRpbWVyPW51bGwsdGhpcy50cmllcz0wfXJldHVybiBoKGUsW3trZXk6XCJyZXNldFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy50cmllcz0wLGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKX19LHtrZXk6XCJzY2hlZHVsZVRpbWVvdXRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7Y2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMudGltZXI9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtlLnRyaWVzPWUudHJpZXMrMSxlLmNhbGxiYWNrKCl9KSx0aGlzLnRpbWVyQ2FsYyh0aGlzLnRyaWVzKzEpKX19XSksZX0oKX1dKX0pKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../deps/phoenix/priv/static/phoenix.js\n"); + + /***/ + }), + +/***/ "../deps/phoenix_html/priv/static/phoenix_html.js": +/*!********************************************************!*\ + !*** ../deps/phoenix_html/priv/static/phoenix_html.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function (module, exports, __webpack_require__) { + + "use strict"; + eval("\n\n(function () {\n var PolyfillEvent = eventConstructor();\n\n function eventConstructor() {\n if (typeof window.CustomEvent === \"function\") return window.CustomEvent; // IE<=9 Support\n\n function CustomEvent(event, params) {\n params = params || {\n bubbles: false,\n cancelable: false,\n detail: undefined\n };\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n }\n\n CustomEvent.prototype = window.Event.prototype;\n return CustomEvent;\n }\n\n function buildHiddenInput(name, value) {\n var input = document.createElement(\"input\");\n input.type = \"hidden\";\n input.name = name;\n input.value = value;\n return input;\n }\n\n function handleClick(element) {\n var to = element.getAttribute(\"data-to\"),\n method = buildHiddenInput(\"_method\", element.getAttribute(\"data-method\")),\n csrf = buildHiddenInput(\"_csrf_token\", element.getAttribute(\"data-csrf\")),\n form = document.createElement(\"form\"),\n target = element.getAttribute(\"target\");\n form.method = element.getAttribute(\"data-method\") === \"get\" ? \"get\" : \"post\";\n form.action = to;\n form.style.display = \"hidden\";\n if (target) form.target = target;\n form.appendChild(csrf);\n form.appendChild(method);\n document.body.appendChild(form);\n form.submit();\n }\n\n window.addEventListener(\"click\", function (e) {\n var element = e.target;\n\n while (element && element.getAttribute) {\n var phoenixLinkEvent = new PolyfillEvent('phoenix.link.click', {\n \"bubbles\": true,\n \"cancelable\": true\n });\n\n if (!element.dispatchEvent(phoenixLinkEvent)) {\n e.preventDefault();\n e.stopImmediatePropagation();\n return false;\n }\n\n if (element.getAttribute(\"data-method\")) {\n handleClick(element);\n e.preventDefault();\n return false;\n } else {\n element = element.parentNode;\n }\n }\n }, false);\n window.addEventListener('phoenix.link.click', function (e) {\n var message = e.target.getAttribute(\"data-confirm\");\n\n if (message && !window.confirm(message)) {\n e.preventDefault();\n }\n }, false);\n})();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vZGVwcy9waG9lbml4X2h0bWwvcHJpdi9zdGF0aWMvcGhvZW5peF9odG1sLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uL2RlcHMvcGhvZW5peF9odG1sL3ByaXYvc3RhdGljL3Bob2VuaXhfaHRtbC5qcz80N2Q4Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG4oZnVuY3Rpb24oKSB7XG4gIHZhciBQb2x5ZmlsbEV2ZW50ID0gZXZlbnRDb25zdHJ1Y3RvcigpO1xuXG4gIGZ1bmN0aW9uIGV2ZW50Q29uc3RydWN0b3IoKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHdpbmRvdy5DdXN0b21FdmVudDtcbiAgICAvLyBJRTw9OSBTdXBwb3J0XG4gICAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQoZXZlbnQsIHBhcmFtcykge1xuICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHtidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogZmFsc2UsIGRldGFpbDogdW5kZWZpbmVkfTtcbiAgICAgIHZhciBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcbiAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnQsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSwgcGFyYW1zLmRldGFpbCk7XG4gICAgICByZXR1cm4gZXZ0O1xuICAgIH1cbiAgICBDdXN0b21FdmVudC5wcm90b3R5cGUgPSB3aW5kb3cuRXZlbnQucHJvdG90eXBlO1xuICAgIHJldHVybiBDdXN0b21FdmVudDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkSGlkZGVuSW5wdXQobmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgaW5wdXQudHlwZSA9IFwiaGlkZGVuXCI7XG4gICAgaW5wdXQubmFtZSA9IG5hbWU7XG4gICAgaW5wdXQudmFsdWUgPSB2YWx1ZTtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVDbGljayhlbGVtZW50KSB7XG4gICAgdmFyIHRvID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXRvXCIpLFxuICAgICAgICBtZXRob2QgPSBidWlsZEhpZGRlbklucHV0KFwiX21ldGhvZFwiLCBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtbWV0aG9kXCIpKSxcbiAgICAgICAgY3NyZiA9IGJ1aWxkSGlkZGVuSW5wdXQoXCJfY3NyZl90b2tlblwiLCBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtY3NyZlwiKSksXG4gICAgICAgIGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiKSxcbiAgICAgICAgdGFyZ2V0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ0YXJnZXRcIik7XG5cbiAgICBmb3JtLm1ldGhvZCA9IChlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtbWV0aG9kXCIpID09PSBcImdldFwiKSA/IFwiZ2V0XCIgOiBcInBvc3RcIjtcbiAgICBmb3JtLmFjdGlvbiA9IHRvO1xuICAgIGZvcm0uc3R5bGUuZGlzcGxheSA9IFwiaGlkZGVuXCI7XG5cbiAgICBpZiAodGFyZ2V0KSBmb3JtLnRhcmdldCA9IHRhcmdldDtcblxuICAgIGZvcm0uYXBwZW5kQ2hpbGQoY3NyZik7XG4gICAgZm9ybS5hcHBlbmRDaGlsZChtZXRob2QpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZm9ybSk7XG4gICAgZm9ybS5zdWJtaXQoKTtcbiAgfVxuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlbGVtZW50ID0gZS50YXJnZXQ7XG5cbiAgICB3aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZSkge1xuICAgICAgdmFyIHBob2VuaXhMaW5rRXZlbnQgPSBuZXcgUG9seWZpbGxFdmVudCgncGhvZW5peC5saW5rLmNsaWNrJywge1xuICAgICAgICBcImJ1YmJsZXNcIjogdHJ1ZSwgXCJjYW5jZWxhYmxlXCI6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWVsZW1lbnQuZGlzcGF0Y2hFdmVudChwaG9lbml4TGlua0V2ZW50KSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1tZXRob2RcIikpIHtcbiAgICAgICAgaGFuZGxlQ2xpY2soZWxlbWVudCk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIGZhbHNlKTtcblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncGhvZW5peC5saW5rLmNsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgbWVzc2FnZSA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZShcImRhdGEtY29uZmlybVwiKTtcbiAgICBpZihtZXNzYWdlICYmICF3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSwgZmFsc2UpO1xufSkoKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBREE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../deps/phoenix_html/priv/static/phoenix_html.js\n"); + + /***/ + }), + +/***/ "../deps/phoenix_live_view/priv/static/phoenix_live_view.js": +/*!******************************************************************!*\ + !*** ../deps/phoenix_live_view/priv/static/phoenix_live_view.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function (module, exports, __webpack_require__) { + + eval("!function (e, t) {\n true ? module.exports = t() : undefined;\n}(this, function () {\n return function (e) {\n var t = {};\n\n function n(i) {\n if (t[i]) return t[i].exports;\n var r = t[i] = {\n i: i,\n l: !1,\n exports: {}\n };\n return e[i].call(r.exports, r, r.exports, n), r.l = !0, r.exports;\n }\n\n return n.m = e, n.c = t, n.d = function (e, t, i) {\n n.o(e, t) || Object.defineProperty(e, t, {\n configurable: !1,\n enumerable: !0,\n get: i\n });\n }, n.r = function (e) {\n Object.defineProperty(e, \"__esModule\", {\n value: !0\n });\n }, n.n = function (e) {\n var t = e && e.__esModule ? function () {\n return e.default;\n } : function () {\n return e;\n };\n return n.d(t, \"a\", t), t;\n }, n.o = function (e, t) {\n return Object.prototype.hasOwnProperty.call(e, t);\n }, n.p = \"\", n(n.s = 2);\n }([function (e, t, n) {\n \"use strict\";\n\n n.r(t);\n var i,\n r = 11;\n var o = \"http://www.w3.org/1999/xhtml\",\n a = \"undefined\" == typeof document ? void 0 : document,\n u = !!a && \"content\" in a.createElement(\"template\"),\n s = !!a && a.createRange && \"createContextualFragment\" in a.createRange();\n\n function c(e) {\n return e = e.trim(), u ? function (e) {\n var t = a.createElement(\"template\");\n return t.innerHTML = e, t.content.childNodes[0];\n }(e) : s ? function (e) {\n return i || (i = a.createRange()).selectNode(a.body), i.createContextualFragment(e).childNodes[0];\n }(e) : function (e) {\n var t = a.createElement(\"body\");\n return t.innerHTML = e, t.childNodes[0];\n }(e);\n }\n\n function l(e, t) {\n var n,\n i,\n r = e.nodeName,\n o = t.nodeName;\n return r === o || (n = r.charCodeAt(0), i = o.charCodeAt(0), n <= 90 && i >= 97 ? r === o.toUpperCase() : i <= 90 && n >= 97 && o === r.toUpperCase());\n }\n\n function d(e, t, n) {\n e[n] !== t[n] && (e[n] = t[n], e[n] ? e.setAttribute(n, \"\") : e.removeAttribute(n));\n }\n\n var h = {\n OPTION: function (e, t) {\n var n = e.parentNode;\n\n if (n) {\n var i = n.nodeName.toUpperCase();\n \"OPTGROUP\" === i && (i = (n = n.parentNode) && n.nodeName.toUpperCase()), \"SELECT\" !== i || n.hasAttribute(\"multiple\") || (e.hasAttribute(\"selected\") && !t.selected && (e.setAttribute(\"selected\", \"selected\"), e.removeAttribute(\"selected\")), n.selectedIndex = -1);\n }\n\n d(e, t, \"selected\");\n },\n INPUT: function (e, t) {\n d(e, t, \"checked\"), d(e, t, \"disabled\"), e.value !== t.value && (e.value = t.value), t.hasAttribute(\"value\") || e.removeAttribute(\"value\");\n },\n TEXTAREA: function (e, t) {\n var n = t.value;\n e.value !== n && (e.value = n);\n var i = e.firstChild;\n\n if (i) {\n var r = i.nodeValue;\n if (r == n || !n && r == e.placeholder) return;\n i.nodeValue = n;\n }\n },\n SELECT: function (e, t) {\n if (!t.hasAttribute(\"multiple\")) {\n for (var n, i, r = -1, o = 0, a = e.firstChild; a;) if (\"OPTGROUP\" === (i = a.nodeName && a.nodeName.toUpperCase())) a = (n = a).firstChild;else {\n if (\"OPTION\" === i) {\n if (a.hasAttribute(\"selected\")) {\n r = o;\n break;\n }\n\n o++;\n }\n\n !(a = a.nextSibling) && n && (a = n.nextSibling, n = null);\n }\n\n e.selectedIndex = r;\n }\n }\n },\n f = 1,\n v = 11,\n p = 3,\n g = 8;\n\n function m() {}\n\n function y(e) {\n if (e) return e.getAttribute && e.getAttribute(\"id\") || e.id;\n }\n\n var b = function (e) {\n return function (t, n, i) {\n if (i || (i = {}), \"string\" == typeof n) if (\"#document\" === t.nodeName || \"HTML\" === t.nodeName || \"BODY\" === t.nodeName) {\n var r = n;\n (n = a.createElement(\"html\")).innerHTML = r;\n } else n = c(n);\n var u = i.getNodeKey || y,\n s = i.onBeforeNodeAdded || m,\n d = i.onNodeAdded || m,\n b = i.onBeforeElUpdated || m,\n k = i.onElUpdated || m,\n w = i.onBeforeNodeDiscarded || m,\n E = i.onNodeDiscarded || m,\n A = i.onBeforeElChildrenUpdated || m,\n S = !0 === i.childrenOnly,\n x = Object.create(null),\n C = [];\n\n function P(e) {\n C.push(e);\n }\n\n function L(e, t, n) {\n !1 !== w(e) && (t && t.removeChild(e), E(e), function e(t, n) {\n if (t.nodeType === f) for (var i = t.firstChild; i;) {\n var r = void 0;\n n && (r = u(i)) ? P(r) : (E(i), i.firstChild && e(i, n)), i = i.nextSibling;\n }\n }(e, n));\n }\n\n function I(e) {\n d(e);\n\n for (var t = e.firstChild; t;) {\n var n = t.nextSibling,\n i = u(t);\n\n if (i) {\n var r = x[i];\n r && l(t, r) ? (t.parentNode.replaceChild(r, t), T(r, t)) : I(t);\n } else I(t);\n\n t = n;\n }\n }\n\n function T(t, n, i) {\n var r = u(n);\n\n if (r && delete x[r], !i) {\n if (!1 === b(t, n)) return;\n if (e(t, n), k(t), !1 === A(t, n)) return;\n }\n\n \"TEXTAREA\" !== t.nodeName ? function (e, t) {\n var n,\n i,\n r,\n o,\n c,\n d = t.firstChild,\n v = e.firstChild;\n\n e: for (; d;) {\n for (o = d.nextSibling, n = u(d); v;) {\n if (r = v.nextSibling, d.isSameNode && d.isSameNode(v)) {\n d = o, v = r;\n continue e;\n }\n\n i = u(v);\n var m = v.nodeType,\n y = void 0;\n\n if (m === d.nodeType && (m === f ? (n ? n !== i && ((c = x[n]) ? r === c ? y = !1 : (e.insertBefore(c, v), i ? P(i) : L(v, e, !0), v = c) : y = !1) : i && (y = !1), (y = !1 !== y && l(v, d)) && T(v, d)) : m !== p && m != g || (y = !0, v.nodeValue !== d.nodeValue && (v.nodeValue = d.nodeValue))), y) {\n d = o, v = r;\n continue e;\n }\n\n i ? P(i) : L(v, e, !0), v = r;\n }\n\n if (n && (c = x[n]) && l(c, d)) e.appendChild(c), T(c, d);else {\n var b = s(d);\n !1 !== b && (b && (d = b), d.actualize && (d = d.actualize(e.ownerDocument || a)), e.appendChild(d), I(d));\n }\n d = o, v = r;\n }\n\n !function (e, t, n) {\n for (; t;) {\n var i = t.nextSibling;\n (n = u(t)) ? P(n) : L(t, e, !0), t = i;\n }\n }(e, v, i);\n var k = h[e.nodeName];\n k && k(e, t);\n }(t, n) : h.TEXTAREA(t, n);\n }\n\n !function e(t) {\n if (t.nodeType === f || t.nodeType === v) for (var n = t.firstChild; n;) {\n var i = u(n);\n i && (x[i] = n), e(n), n = n.nextSibling;\n }\n }(t);\n var D = t,\n _ = D.nodeType,\n N = n.nodeType;\n if (!S) if (_ === f) N === f ? l(t, n) || (E(t), D = function (e, t) {\n for (var n = e.firstChild; n;) {\n var i = n.nextSibling;\n t.appendChild(n), n = i;\n }\n\n return t;\n }(t, function (e, t) {\n return t && t !== o ? a.createElementNS(t, e) : a.createElement(e);\n }(n.nodeName, n.namespaceURI))) : D = n;else if (_ === p || _ === g) {\n if (N === _) return D.nodeValue !== n.nodeValue && (D.nodeValue = n.nodeValue), D;\n D = n;\n }\n if (D === n) E(t);else {\n if (n.isSameNode && n.isSameNode(D)) return;\n if (T(D, n, S), C) for (var R = 0, O = C.length; R < O; R++) {\n var j = x[C[R]];\n j && L(j, j.parentNode, !1);\n }\n }\n return !S && D !== t && t.parentNode && (D.actualize && (D = D.actualize(t.ownerDocument || a)), t.parentNode.replaceChild(D, t)), D;\n };\n }(function (e, t) {\n var n,\n i,\n o,\n a,\n u = t.attributes;\n\n if (t.nodeType !== r && e.nodeType !== r) {\n for (var s = u.length - 1; s >= 0; s--) i = (n = u[s]).name, o = n.namespaceURI, a = n.value, o ? (i = n.localName || i, e.getAttributeNS(o, i) !== a && (\"xmlns\" === n.prefix && (i = n.name), e.setAttributeNS(o, i, a))) : e.getAttribute(i) !== a && e.setAttribute(i, a);\n\n for (var c = e.attributes, l = c.length - 1; l >= 0; l--) i = (n = c[l]).name, (o = n.namespaceURI) ? (i = n.localName || i, t.hasAttributeNS(o, i) || e.removeAttributeNS(o, i)) : t.hasAttribute(i) || e.removeAttribute(i);\n }\n });\n\n function k(e) {\n return P(e) || S(e) || L(e) || C();\n }\n\n function w(e, t) {\n var n = Object.keys(e);\n\n if (Object.getOwnPropertySymbols) {\n var i = Object.getOwnPropertySymbols(e);\n t && (i = i.filter(function (t) {\n return Object.getOwnPropertyDescriptor(e, t).enumerable;\n })), n.push.apply(n, i);\n }\n\n return n;\n }\n\n function E(e, t, n) {\n return t in e ? Object.defineProperty(e, t, {\n value: n,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[t] = n, e;\n }\n\n function A(e) {\n return function (e) {\n if (Array.isArray(e)) return I(e);\n }(e) || S(e) || L(e) || function () {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }();\n }\n\n function S(e) {\n if (\"undefined\" != typeof Symbol && Symbol.iterator in Object(e)) return Array.from(e);\n }\n\n function x(e, t) {\n return P(e) || function (e, t) {\n if (\"undefined\" == typeof Symbol || !(Symbol.iterator in Object(e))) return;\n var n = [],\n i = !0,\n r = !1,\n o = void 0;\n\n try {\n for (var a, u = e[Symbol.iterator](); !(i = (a = u.next()).done) && (n.push(a.value), !t || n.length !== t); i = !0);\n } catch (e) {\n r = !0, o = e;\n } finally {\n try {\n i || null == u.return || u.return();\n } finally {\n if (r) throw o;\n }\n }\n\n return n;\n }(e, t) || L(e, t) || C();\n }\n\n function C() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n function P(e) {\n if (Array.isArray(e)) return e;\n }\n\n function L(e, t) {\n if (e) {\n if (\"string\" == typeof e) return I(e, t);\n var n = Object.prototype.toString.call(e).slice(8, -1);\n return \"Object\" === n && e.constructor && (n = e.constructor.name), \"Map\" === n || \"Set\" === n ? Array.from(e) : \"Arguments\" === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? I(e, t) : void 0;\n }\n }\n\n function I(e, t) {\n (null == t || t > e.length) && (t = e.length);\n\n for (var n = 0, i = new Array(t); n < t; n++) i[n] = e[n];\n\n return i;\n }\n\n function T(e, t) {\n if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n }\n\n function D(e, t) {\n for (var n = 0; n < t.length; n++) {\n var i = t[n];\n i.enumerable = i.enumerable || !1, i.configurable = !0, \"value\" in i && (i.writable = !0), Object.defineProperty(e, i.key, i);\n }\n }\n\n function _(e, t, n) {\n return t && D(e.prototype, t), n && D(e, n), e;\n }\n\n function N(e) {\n \"@babel/helpers - typeof\";\n\n return (N = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (e) {\n return typeof e;\n } : function (e) {\n return e && \"function\" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? \"symbol\" : typeof e;\n })(e);\n }\n\n n.d(t, \"debug\", function () {\n return K;\n }), n.d(t, \"Rendered\", function () {\n return ue;\n }), n.d(t, \"LiveSocket\", function () {\n return se;\n }), n.d(t, \"Browser\", function () {\n return ce;\n }), n.d(t, \"DOM\", function () {\n return le;\n }), n.d(t, \"View\", function () {\n return fe;\n });\n\n var R = [1e3, 3e3],\n O = \"data-phx-view\",\n j = [\"phx-click-loading\", \"phx-change-loading\", \"phx-submit-loading\", \"phx-keydown-loading\", \"phx-keyup-loading\", \"phx-blur-loading\", \"phx-focus-loading\"],\n H = \"data-phx-component\",\n F = \"data-phx-ref\",\n M = \"data-phx-upload-ref\",\n U = \"[\".concat(O, \"]\"),\n B = [\"text\", \"textarea\", \"number\", \"email\", \"password\", \"search\", \"tel\", \"url\", \"date\", \"time\"],\n J = [\"checkbox\", \"radio\"],\n V = 1,\n W = \"phx-\",\n q = {\n debounce: 300,\n throttle: 300\n },\n z = function (e, t) {\n return console.error && console.error(e, t);\n };\n\n var K = function (e, t, n, i) {\n e.liveSocket.isDebugEnabled() && console.log(\"\".concat(e.id, \" \").concat(t, \": \").concat(n, \" - \"), i);\n },\n X = function (e) {\n return \"function\" == typeof e ? e : function () {\n return e;\n };\n },\n $ = function (e) {\n return JSON.parse(JSON.stringify(e));\n },\n G = function (e, t, n) {\n do {\n if (e.matches(\"[\".concat(t, \"]\"))) return e;\n e = e.parentElement || e.parentNode;\n } while (null !== e && 1 === e.nodeType && !(n && n.isSameNode(e) || e.matches(U)));\n\n return null;\n },\n Y = function (e) {\n return null !== e && \"object\" === N(e) && !(e instanceof Array);\n },\n Q = function (e) {\n for (var t in e) return !1;\n\n return !0;\n },\n Z = function (e, t) {\n return e && t(e);\n },\n ee = function () {\n function e(t, n, i) {\n T(this, e), this.ref = ie.genFileRef(n), this.fileEl = t, this.file = n, this.view = i, this.meta = null, this._isCancelled = !1, this._isDone = !1, this._progress = 0, this._onDone = function () {};\n }\n\n return _(e, null, [{\n key: \"isActive\",\n value: function (e, t) {\n var n = void 0 === t._phxRef,\n i = e.getAttribute(\"data-phx-active-refs\").split(\",\").indexOf(ie.genFileRef(t)) >= 0;\n return t.size > 0 && (n || i);\n }\n }, {\n key: \"isPreflighted\",\n value: function (e, t) {\n var n = e.getAttribute(\"data-phx-preflighted-refs\").split(\",\").indexOf(ie.genFileRef(t)) >= 0;\n return n && this.isActive(e, t);\n }\n }]), _(e, [{\n key: \"metadata\",\n value: function () {\n return this.meta;\n }\n }, {\n key: \"progress\",\n value: function (e) {\n var t = this;\n this._progress = Math.floor(e), this._progress >= 100 ? (this._progress = 100, this._isDone = !0, this.view.pushFileProgress(this.fileEl, this.ref, 100, function () {\n ie.untrackFile(t.fileEl, t.file), t._onDone();\n })) : this.view.pushFileProgress(this.fileEl, this.ref, this._progress);\n }\n }, {\n key: \"cancel\",\n value: function () {\n this._isCancelled = !0, this._isDone = !0, this._onDone();\n }\n }, {\n key: \"isDone\",\n value: function () {\n return this._isDone;\n }\n }, {\n key: \"error\",\n value: function () {\n var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : \"failed\";\n this.view.pushFileProgress(this.fileEl, this.ref, {\n error: e\n });\n }\n }, {\n key: \"onDone\",\n value: function (e) {\n this._onDone = e;\n }\n }, {\n key: \"toPreflightPayload\",\n value: function () {\n return {\n last_modified: this.file.lastModified,\n name: this.file.name,\n size: this.file.size,\n type: this.file.type,\n ref: this.ref\n };\n }\n }, {\n key: \"uploader\",\n value: function (e) {\n if (this.meta.uploader) {\n var t = e[this.meta.uploader] || z(\"no uploader configured for \".concat(this.meta.uploader));\n return {\n name: this.meta.uploader,\n callback: t\n };\n }\n\n return {\n name: \"channel\",\n callback: re\n };\n }\n }, {\n key: \"zipPostFlight\",\n value: function (e) {\n this.meta = e.entries[this.ref], this.meta || z(\"no preflight upload response returned with ref \".concat(this.ref), {\n input: this.fileEl,\n response: e\n });\n }\n }]), e;\n }(),\n te = {\n LiveFileUpload: {\n preflightedRefs: function () {\n return this.el.getAttribute(\"data-phx-preflighted-refs\");\n },\n mounted: function () {\n this.preflightedWas = this.preflightedRefs();\n },\n updated: function () {\n var e = this.preflightedRefs();\n this.preflightedWas !== e && (this.preflightedWas = e, \"\" === e && this.__view.cancelSubmit(this.el.form));\n }\n }\n };\n\n te.LiveImgPreview = {\n mounted: function () {\n var e = this;\n this.ref = this.el.getAttribute(\"data-phx-entry-ref\"), this.inputEl = document.getElementById(this.el.getAttribute(M)), ie.getEntryDataURL(this.inputEl, this.ref, function (t) {\n return e.el.src = t;\n });\n }\n };\n\n var ne = 0,\n ie = function () {\n function e(t, n, i) {\n T(this, e), this.view = n, this.onComplete = i, this._entries = Array.from(e.filesAwaitingPreflight(t) || []).map(function (e) {\n return new ee(t, e, n);\n }), this.numEntriesInProgress = this._entries.length;\n }\n\n return _(e, null, [{\n key: \"genFileRef\",\n value: function (e) {\n var t = e._phxRef;\n return void 0 !== t ? t : (e._phxRef = (ne++).toString(), e._phxRef);\n }\n }, {\n key: \"getEntryDataURL\",\n value: function (e, t, n) {\n var i = this,\n r = this.activeFiles(e).find(function (e) {\n return i.genFileRef(e) === t;\n }),\n o = new FileReader();\n o.onload = function (e) {\n return n(e.target.result);\n }, o.readAsDataURL(r);\n }\n }, {\n key: \"hasUploadsInProgress\",\n value: function (e) {\n var t = 0;\n return le.findUploadInputs(e).forEach(function (e) {\n e.getAttribute(\"data-phx-preflighted-refs\") !== e.getAttribute(\"data-phx-done-refs\") && t++;\n }), t > 0;\n }\n }, {\n key: \"serializeUploads\",\n value: function (e) {\n var t = this,\n n = {};\n return this.activeFiles(e, \"serialize\").forEach(function (i) {\n var r = {\n path: e.name\n },\n o = e.getAttribute(M);\n n[o] = n[o] || [], r.ref = t.genFileRef(i), r.name = i.name, r.type = i.type, r.size = i.size, n[o].push(r);\n }), n;\n }\n }, {\n key: \"clearFiles\",\n value: function (e) {\n e.value = null, le.putPrivate(e, \"files\", []);\n }\n }, {\n key: \"untrackFile\",\n value: function (e, t) {\n le.putPrivate(e, \"files\", le.private(e, \"files\").filter(function (e) {\n return !Object.is(e, t);\n }));\n }\n }, {\n key: \"trackFiles\",\n value: function (e, t) {\n var n = this;\n\n if (null !== e.getAttribute(\"multiple\")) {\n var i = t.filter(function (t) {\n return !n.activeFiles(e).find(function (e) {\n return Object.is(e, t);\n });\n });\n le.putPrivate(e, \"files\", this.activeFiles(e).concat(i)), e.value = null;\n } else le.putPrivate(e, \"files\", t);\n }\n }, {\n key: \"activeFileInputs\",\n value: function (e) {\n var t = this,\n n = le.findUploadInputs(e);\n return Array.from(n).filter(function (e) {\n return e.files && t.activeFiles(e).length > 0;\n });\n }\n }, {\n key: \"activeFiles\",\n value: function (e) {\n return (le.private(e, \"files\") || []).filter(function (t) {\n return ee.isActive(e, t);\n });\n }\n }, {\n key: \"inputsAwaitingPreflight\",\n value: function (e) {\n var t = this,\n n = le.findUploadInputs(e);\n return Array.from(n).filter(function (e) {\n return t.filesAwaitingPreflight(e).length > 0;\n });\n }\n }, {\n key: \"filesAwaitingPreflight\",\n value: function (e) {\n return this.activeFiles(e).filter(function (t) {\n return !ee.isPreflighted(e, t);\n });\n }\n }]), _(e, [{\n key: \"entries\",\n value: function () {\n return this._entries;\n }\n }, {\n key: \"initAdapterUpload\",\n value: function (e, t, n) {\n var i = this;\n this._entries = this._entries.map(function (t) {\n return t.zipPostFlight(e), t.onDone(function () {\n i.numEntriesInProgress--, 0 === i.numEntriesInProgress && i.onComplete();\n }), t;\n });\n\n var r = this._entries.reduce(function (e, t) {\n var i = t.uploader(n.uploaders),\n r = i.name,\n o = i.callback;\n return e[r] = e[r] || {\n callback: o,\n entries: []\n }, e[r].entries.push(t), e;\n }, {});\n\n for (var o in r) {\n var a = r[o];\n (0, a.callback)(a.entries, t, e, n);\n }\n }\n }]), e;\n }(),\n re = function (e, t, n, i) {\n e.forEach(function (e) {\n new oe(e, n.config.chunk_size, i).upload();\n });\n },\n oe = function () {\n function e(t, n, i) {\n T(this, e), this.liveSocket = i, this.entry = t, this.offset = 0, this.chunkSize = n, this.uploadChannel = i.channel(\"lvu:\".concat(t.ref), {\n token: t.metadata()\n });\n }\n\n return _(e, [{\n key: \"upload\",\n value: function () {\n var e = this;\n this.uploadChannel.join().receive(\"ok\", function (t) {\n return e.readNextChunk();\n }).receive(\"error\", function (t) {\n e.uploadChannel.leave(), e.entry.error();\n });\n }\n }, {\n key: \"isDone\",\n value: function () {\n return this.offset >= this.entry.file.size;\n }\n }, {\n key: \"readNextChunk\",\n value: function () {\n var e = this,\n t = new window.FileReader(),\n n = this.entry.file.slice(this.offset, this.chunkSize + this.offset);\n t.onload = function (t) {\n if (null !== t.target.error) return z(\"Read error: \" + t.target.error);\n e.offset += t.target.result.byteLength, e.pushChunk(t.target.result);\n }, t.readAsArrayBuffer(n);\n }\n }, {\n key: \"pushChunk\",\n value: function (e) {\n var t = this;\n this.uploadChannel.isJoined() && this.uploadChannel.push(\"chunk\", e).receive(\"ok\", function () {\n t.entry.progress(t.offset / t.entry.file.size * 100), t.isDone() || setTimeout(function () {\n return t.readNextChunk();\n }, t.liveSocket.getLatencySim() || 0);\n });\n }\n }]), e;\n }(),\n ae = function (e) {\n var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {},\n n = new FormData(e),\n i = [];\n n.forEach(function (e, t, n) {\n e instanceof File && i.push(t);\n }), i.forEach(function (e) {\n return n.delete(e);\n });\n\n var r,\n o = new URLSearchParams(),\n a = function (e) {\n if (\"undefined\" == typeof Symbol || null == e[Symbol.iterator]) {\n if (Array.isArray(e) || (e = L(e))) {\n var t = 0,\n n = function () {};\n\n return {\n s: n,\n n: function () {\n return t >= e.length ? {\n done: !0\n } : {\n done: !1,\n value: e[t++]\n };\n },\n e: function (e) {\n throw e;\n },\n f: n\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n var i,\n r,\n o = !0,\n a = !1;\n return {\n s: function () {\n i = e[Symbol.iterator]();\n },\n n: function () {\n var e = i.next();\n return o = e.done, e;\n },\n e: function (e) {\n a = !0, r = e;\n },\n f: function () {\n try {\n o || null == i.return || i.return();\n } finally {\n if (a) throw r;\n }\n }\n };\n }(n.entries());\n\n try {\n for (a.s(); !(r = a.n()).done;) {\n var u = x(r.value, 2),\n s = u[0],\n c = u[1];\n o.append(s, c);\n }\n } catch (e) {\n a.e(e);\n } finally {\n a.f();\n }\n\n for (var l in t) o.append(l, t[l]);\n\n return o.toString();\n },\n ue = function () {\n function e(t, n) {\n T(this, e), this.viewId = t, this.rendered = {}, this.mergeDiff(n);\n }\n\n return _(e, null, [{\n key: \"extract\",\n value: function (e) {\n var t = e.r,\n n = e.e,\n i = e.t;\n return delete e.r, delete e.e, delete e.t, {\n diff: e,\n title: i,\n reply: t || null,\n events: n || []\n };\n }\n }]), _(e, [{\n key: \"parentViewId\",\n value: function () {\n return this.viewId;\n }\n }, {\n key: \"toString\",\n value: function (e) {\n return this.recursiveToString(this.rendered, this.rendered.c, e);\n }\n }, {\n key: \"recursiveToString\",\n value: function (e) {\n var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : e.c,\n n = arguments.length > 2 ? arguments[2] : void 0,\n i = {\n buffer: \"\",\n components: t,\n onlyCids: n = n ? new Set(n) : null\n };\n return this.toOutputBuffer(e, i), i.buffer;\n }\n }, {\n key: \"componentCIDs\",\n value: function (e) {\n return Object.keys(e.c || {}).map(function (e) {\n return parseInt(e);\n });\n }\n }, {\n key: \"isComponentOnlyDiff\",\n value: function (e) {\n return !!e.c && 1 === Object.keys(e).length;\n }\n }, {\n key: \"getComponent\",\n value: function (e, t) {\n return e.c[t];\n }\n }, {\n key: \"mergeDiff\",\n value: function (e) {\n var t = e.c;\n\n if (delete e.c, this.rendered = this.recursiveMerge(this.rendered, e), this.rendered.c = this.rendered.c || {}, t) {\n var n = this.rendered.c;\n\n for (var i in t) {\n var r = t[i],\n o = r,\n a = o.s;\n\n if (\"number\" == typeof a) {\n for (; \"number\" == typeof a;) a = (o = a > 0 ? t[a] : n[-a]).s;\n\n o = $(o), this.doRecursiveMerge(o, r), o.s = a;\n } else o = n[i] || {}, o = this.recursiveMerge(o, r);\n\n t[i] = o;\n }\n\n for (var u in t) n[u] = t[u];\n\n e.c = t;\n }\n }\n }, {\n key: \"recursiveMerge\",\n value: function (e, t) {\n return void 0 !== t.s ? t : (this.doRecursiveMerge(e, t), e);\n }\n }, {\n key: \"doRecursiveMerge\",\n value: function (e, t) {\n for (var n in t) {\n var i = t[n],\n r = e[n];\n Y(i) && void 0 === i.s && Y(r) ? this.doRecursiveMerge(r, i) : e[n] = i;\n }\n }\n }, {\n key: \"componentToString\",\n value: function (e) {\n return this.recursiveCIDToString(this.rendered.c, e);\n }\n }, {\n key: \"pruneCIDs\",\n value: function (e) {\n var t = this;\n e.forEach(function (e) {\n return delete t.rendered.c[e];\n });\n }\n }, {\n key: \"get\",\n value: function () {\n return this.rendered;\n }\n }, {\n key: \"isNewFingerprint\",\n value: function () {\n return !!(arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}).s;\n }\n }, {\n key: \"toOutputBuffer\",\n value: function (e, t) {\n if (e.d) return this.comprehensionToBuffer(e, t);\n var n = e.s;\n t.buffer += n[0];\n\n for (var i = 1; i < n.length; i++) this.dynamicToBuffer(e[i - 1], t), t.buffer += n[i];\n }\n }, {\n key: \"comprehensionToBuffer\",\n value: function (e, t) {\n for (var n = e.d, i = e.s, r = 0; r < n.length; r++) {\n var o = n[r];\n t.buffer += i[0];\n\n for (var a = 1; a < i.length; a++) this.dynamicToBuffer(o[a - 1], t), t.buffer += i[a];\n }\n }\n }, {\n key: \"dynamicToBuffer\",\n value: function (e, t) {\n \"number\" == typeof e ? t.buffer += this.recursiveCIDToString(t.components, e, t.onlyCids) : Y(e) ? this.toOutputBuffer(e, t) : t.buffer += e;\n }\n }, {\n key: \"recursiveCIDToString\",\n value: function (e, t, n) {\n var i = this,\n r = e[t] || z(\"no component for CID \".concat(t), e),\n o = document.createElement(\"template\");\n o.innerHTML = this.recursiveToString(r, e, n);\n var a = o.content,\n u = n && !n.has(t),\n s = x(Array.from(a.childNodes).reduce(function (e, n, r) {\n var a = x(e, 2),\n s = a[0],\n c = a[1];\n return n.nodeType === Node.ELEMENT_NODE ? n.getAttribute(H) ? [s, !0] : (n.setAttribute(H, t), n.id || (n.id = \"\".concat(i.parentViewId(), \"-\").concat(t, \"-\").concat(r)), u && (n.setAttribute(\"data-phx-skip\", \"\"), n.innerHTML = \"\"), [!0, c]) : \"\" !== n.nodeValue.trim() ? (z(\"only HTML element tags are allowed at the root of components.\\n\\n\" + 'got: \"'.concat(n.nodeValue.trim(), '\"\\n\\n') + \"within:\\n\", o.innerHTML.trim()), n.replaceWith(i.createSpan(n.nodeValue, t)), [!0, c]) : (n.remove(), [s, c]);\n }, [!1, !1]), 2),\n c = s[0],\n l = s[1];\n return c || l ? !c && l ? (z(\"expected at least one HTML element tag directly inside a component, but only subcomponents were found. A component must render at least one HTML tag directly inside itself.\", o.innerHTML.trim()), o.innerHTML) : o.innerHTML : (z(\"expected at least one HTML element tag inside a component, but the component is empty:\\n\", o.innerHTML.trim()), this.createSpan(\"\", t).outerHTML);\n }\n }, {\n key: \"createSpan\",\n value: function (e, t) {\n var n = document.createElement(\"span\");\n return n.innerText = e, n.setAttribute(H, t), n;\n }\n }]), e;\n }(),\n se = function () {\n function e(t, n) {\n var i = this,\n r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {};\n if (T(this, e), this.unloaded = !1, !n || \"Object\" === n.constructor.name) throw new Error('\\n a phoenix Socket must be provided as the second argument to the LiveSocket constructor. For example:\\n\\n import {Socket} from \"phoenix\"\\n import {LiveSocket} from \"phoenix_live_view\"\\n let liveSocket = new LiveSocket(\"/live\", Socket, {...})\\n ');\n this.socket = new n(t, r), this.bindingPrefix = r.bindingPrefix || W, this.opts = r, this.params = X(r.params || {}), this.viewLogger = r.viewLogger, this.metadataCallbacks = r.metadata || {}, this.defaults = Object.assign($(q), r.defaults || {}), this.activeElement = null, this.prevActive = null, this.silenced = !1, this.main = null, this.linkRef = 0, this.roots = {}, this.href = window.location.href, this.pendingLink = null, this.currentLocation = $(window.location), this.hooks = r.hooks || {}, this.uploaders = r.uploaders || {}, this.loaderTimeout = r.loaderTimeout || V, this.boundTopLevelEvents = !1, this.domCallbacks = Object.assign({\n onNodeAdded: X(),\n onBeforeElUpdated: X()\n }, r.dom || {}), window.addEventListener(\"unload\", function (e) {\n i.unloaded = !0;\n }), this.socket.onOpen(function () {\n i.isUnloaded() && window.location.reload();\n });\n }\n\n return _(e, [{\n key: \"isProfileEnabled\",\n value: function () {\n return \"true\" === sessionStorage.getItem(\"phx:live-socket:profiling\");\n }\n }, {\n key: \"isDebugEnabled\",\n value: function () {\n return \"true\" === sessionStorage.getItem(\"phx:live-socket:debug\");\n }\n }, {\n key: \"enableDebug\",\n value: function () {\n sessionStorage.setItem(\"phx:live-socket:debug\", \"true\");\n }\n }, {\n key: \"enableProfiling\",\n value: function () {\n sessionStorage.setItem(\"phx:live-socket:profiling\", \"true\");\n }\n }, {\n key: \"disableDebug\",\n value: function () {\n sessionStorage.removeItem(\"phx:live-socket:debug\");\n }\n }, {\n key: \"disableProfiling\",\n value: function () {\n sessionStorage.removeItem(\"phx:live-socket:profiling\");\n }\n }, {\n key: \"enableLatencySim\",\n value: function (e) {\n this.enableDebug(), console.log(\"latency simulator enabled for the duration of this browser session. Call disableLatencySim() to disable\"), sessionStorage.setItem(\"phx:live-socket:latency-sim\", e);\n }\n }, {\n key: \"disableLatencySim\",\n value: function () {\n sessionStorage.removeItem(\"phx:live-socket:latency-sim\");\n }\n }, {\n key: \"getLatencySim\",\n value: function () {\n var e = sessionStorage.getItem(\"phx:live-socket:latency-sim\");\n return e ? parseInt(e) : null;\n }\n }, {\n key: \"getSocket\",\n value: function () {\n return this.socket;\n }\n }, {\n key: \"connect\",\n value: function () {\n var e = this,\n t = function () {\n e.joinRootViews() && (e.bindTopLevelEvents(), e.socket.connect());\n };\n\n [\"complete\", \"loaded\", \"interactive\"].indexOf(document.readyState) >= 0 ? t() : document.addEventListener(\"DOMContentLoaded\", function () {\n return t();\n });\n }\n }, {\n key: \"disconnect\",\n value: function (e) {\n this.socket.disconnect(e);\n }\n }, {\n key: \"triggerDOM\",\n value: function (e, t) {\n var n;\n (n = this.domCallbacks)[e].apply(n, A(t));\n }\n }, {\n key: \"time\",\n value: function (e, t) {\n if (!this.isProfileEnabled() || !console.time) return t();\n console.time(e);\n var n = t();\n return console.timeEnd(e), n;\n }\n }, {\n key: \"log\",\n value: function (e, t, n) {\n if (this.viewLogger) {\n var i = x(n(), 2),\n r = i[0],\n o = i[1];\n this.viewLogger(e, t, r, o);\n } else if (this.isDebugEnabled()) {\n var a = x(n(), 2),\n u = a[0],\n s = a[1];\n K(e, t, u, s);\n }\n }\n }, {\n key: \"onChannel\",\n value: function (e, t, n) {\n var i = this;\n e.on(t, function (e) {\n var t = i.getLatencySim();\n t ? (console.log(\"simulating \".concat(t, \"ms of latency from server to client\")), setTimeout(function () {\n return n(e);\n }, t)) : n(e);\n });\n }\n }, {\n key: \"wrapPush\",\n value: function (e, t, n) {\n var i = this,\n r = this.getLatencySim(),\n o = e.joinCount;\n if (!r) return t.timeout ? n().receive(\"timeout\", function () {\n e.joinCount === o && i.reloadWithJitter(e, function () {\n i.log(e, \"timeout\", function () {\n return [\"received timeout while communicating with server. Falling back to hard refresh for recovery\"];\n });\n });\n }) : n();\n console.log(\"simulating \".concat(r, \"ms of latency from client to server\"));\n var a = {\n receives: [],\n receive: function (e, t) {\n this.receives.push([e, t]);\n }\n };\n return setTimeout(function () {\n a.receives.reduce(function (e, t) {\n var n = x(t, 2),\n i = n[0],\n r = n[1];\n return e.receive(i, r);\n }, n());\n }, r), a;\n }\n }, {\n key: \"reloadWithJitter\",\n value: function (e, t) {\n var n = this;\n e.destroy(), this.disconnect();\n var i = R[0],\n r = R[1],\n o = Math.floor(Math.random() * (r - i + 1)) + i,\n a = ce.updateLocal(e.name(), \"consecutive-reloads\", 0, function (e) {\n return e + 1;\n });\n t ? t() : this.log(e, \"join\", function () {\n return [\"encountered \".concat(a, \" consecutive reloads\")];\n }), a > 10 && (this.log(e, \"join\", function () {\n return [\"exceeded \".concat(10, \" consecutive reloads. Entering failsafe mode\")];\n }), o = 3e4), setTimeout(function () {\n n.hasPendingLink() ? window.location = n.pendingLink : window.location.reload();\n }, o);\n }\n }, {\n key: \"getHookCallbacks\",\n value: function (e) {\n return e && e.startsWith(\"Phoenix.\") ? te[e.split(\".\")[1]] : this.hooks[e];\n }\n }, {\n key: \"isUnloaded\",\n value: function () {\n return this.unloaded;\n }\n }, {\n key: \"isConnected\",\n value: function () {\n return this.socket.isConnected();\n }\n }, {\n key: \"getBindingPrefix\",\n value: function () {\n return this.bindingPrefix;\n }\n }, {\n key: \"binding\",\n value: function (e) {\n return \"\".concat(this.getBindingPrefix()).concat(e);\n }\n }, {\n key: \"channel\",\n value: function (e, t) {\n return this.socket.channel(e, t);\n }\n }, {\n key: \"joinRootViews\",\n value: function () {\n var e = this,\n t = !1;\n return le.all(document, \"\".concat(U, \":not([\").concat(\"data-phx-parent-id\", \"])\"), function (n) {\n if (!e.getRootById(n.id)) {\n var i = e.joinRootView(n, e.getHref());\n e.root = e.root || i, n.getAttribute(\"data-phx-main\") && (e.main = i);\n }\n\n t = !0;\n }), t;\n }\n }, {\n key: \"redirect\",\n value: function (e, t) {\n this.disconnect(), ce.redirect(e, t);\n }\n }, {\n key: \"replaceMain\",\n value: function (e, t) {\n var n = this,\n i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : null,\n r = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : this.setPendingLink(e),\n o = this.main.el;\n this.main.showLoader(this.loaderTimeout), this.main.destroy(), ce.fetchPage(e, function (a, u) {\n if (200 !== a) return n.redirect(e);\n var s = document.createElement(\"template\");\n s.innerHTML = u;\n var c = s.content.childNodes[0];\n if (!c || !n.isPhxView(c)) return n.redirect(e);\n n.joinRootView(c, e, t, function (e, t) {\n 1 === t && (n.commitPendingLink(r) ? (o.replaceWith(e.el), n.main = e, i && i()) : e.destroy());\n });\n });\n }\n }, {\n key: \"isPhxView\",\n value: function (e) {\n return e.getAttribute && null !== e.getAttribute(O);\n }\n }, {\n key: \"joinRootView\",\n value: function (e, t, n, i) {\n var r = new fe(e, this, null, t, n);\n return this.roots[r.id] = r, r.join(i), r;\n }\n }, {\n key: \"owner\",\n value: function (e, t) {\n var n = this,\n i = Z(e.closest(U), function (e) {\n return n.getViewByEl(e);\n });\n i && t(i);\n }\n }, {\n key: \"withinOwners\",\n value: function (e, t) {\n var n = this;\n this.owner(e, function (i) {\n var r = e.getAttribute(n.binding(\"target\"));\n null === r ? t(i, e) : i.withinTargets(r, t);\n });\n }\n }, {\n key: \"getViewByEl\",\n value: function (e) {\n var t = e.getAttribute(\"data-phx-root-id\");\n return Z(this.getRootById(t), function (t) {\n return t.getDescendentByEl(e);\n });\n }\n }, {\n key: \"getRootById\",\n value: function (e) {\n return this.roots[e];\n }\n }, {\n key: \"destroyAllViews\",\n value: function () {\n for (var e in this.roots) this.roots[e].destroy(), delete this.roots[e];\n }\n }, {\n key: \"destroyViewByEl\",\n value: function (e) {\n var t = this.getRootById(e.getAttribute(\"data-phx-root-id\"));\n t && t.destroyDescendent(e.id);\n }\n }, {\n key: \"setActiveElement\",\n value: function (e) {\n var t = this;\n\n if (this.activeElement !== e) {\n this.activeElement = e;\n\n var n = function () {\n e === t.activeElement && (t.activeElement = null), e.removeEventListener(\"mouseup\", t), e.removeEventListener(\"touchend\", t);\n };\n\n e.addEventListener(\"mouseup\", n), e.addEventListener(\"touchend\", n);\n }\n }\n }, {\n key: \"getActiveElement\",\n value: function () {\n return document.activeElement === document.body ? this.activeElement || document.activeElement : document.activeElement || document.body;\n }\n }, {\n key: \"dropActiveElement\",\n value: function (e) {\n this.prevActive && e.ownsElement(this.prevActive) && (this.prevActive = null);\n }\n }, {\n key: \"restorePreviouslyActiveFocus\",\n value: function () {\n this.prevActive && this.prevActive !== document.body && this.prevActive.focus();\n }\n }, {\n key: \"blurActiveElement\",\n value: function () {\n this.prevActive = this.getActiveElement(), this.prevActive !== document.body && this.prevActive.blur();\n }\n }, {\n key: \"bindTopLevelEvents\",\n value: function () {\n var e = this;\n this.boundTopLevelEvents || (this.boundTopLevelEvents = !0, document.body.addEventListener(\"click\", function () {}), window.addEventListener(\"pageshow\", function (t) {\n t.persisted && (e.withPageLoading({\n to: window.location.href,\n kind: \"redirect\"\n }), window.location.reload());\n }), this.bindClicks(), this.bindNav(), this.bindForms(), this.bind({\n keyup: \"keyup\",\n keydown: \"keydown\"\n }, function (t, n, i, r, o, a, u) {\n var s = r.getAttribute(e.binding(\"key\")),\n c = t.key && t.key.toLowerCase();\n s && s.toLowerCase() !== c || i.pushKey(r, o, n, a, function (e) {\n for (var t = 1; t < arguments.length; t++) {\n var n = null != arguments[t] ? arguments[t] : {};\n t % 2 ? w(Object(n), !0).forEach(function (t) {\n E(e, t, n[t]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : w(Object(n)).forEach(function (t) {\n Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t));\n });\n }\n\n return e;\n }({\n key: t.key\n }, e.eventMeta(n, t, r)));\n }), this.bind({\n blur: \"focusout\",\n focus: \"focusin\"\n }, function (t, n, i, r, o, a, u) {\n u || i.pushEvent(n, r, o, a, e.eventMeta(n, t, r));\n }), this.bind({\n blur: \"blur\",\n focus: \"focus\"\n }, function (t, n, i, r, o, a, u) {\n u && \"window\" !== !u && i.pushEvent(n, r, o, a, e.eventMeta(n, t, r));\n }), window.addEventListener(\"dragover\", function (e) {\n return e.preventDefault();\n }), window.addEventListener(\"drop\", function (t) {\n t.preventDefault();\n var n = Z(G(t.target, e.binding(\"drop-target\")), function (t) {\n return t.getAttribute(e.binding(\"drop-target\"));\n }),\n i = n && document.getElementById(n),\n r = Array.from(t.dataTransfer.files || []);\n i && !i.disabled && 0 !== r.length && i.files instanceof FileList && (ie.trackFiles(i, r), i.dispatchEvent(new Event(\"input\", {\n bubbles: !0\n })));\n }));\n }\n }, {\n key: \"eventMeta\",\n value: function (e, t, n) {\n var i = this.metadataCallbacks[e];\n return i ? i(t, n) : {};\n }\n }, {\n key: \"setPendingLink\",\n value: function (e) {\n return this.linkRef++, this.pendingLink = e, this.linkRef;\n }\n }, {\n key: \"commitPendingLink\",\n value: function (e) {\n return this.linkRef === e && (this.href = this.pendingLink, this.pendingLink = null, !0);\n }\n }, {\n key: \"getHref\",\n value: function () {\n return this.href;\n }\n }, {\n key: \"hasPendingLink\",\n value: function () {\n return !!this.pendingLink;\n }\n }, {\n key: \"bind\",\n value: function (e, t) {\n var n = this,\n i = function (i) {\n var r = e[i];\n n.on(r, function (e) {\n var r = n.binding(i),\n o = n.binding(\"window-\".concat(i)),\n a = e.target.getAttribute && e.target.getAttribute(r);\n a ? n.debounce(e.target, e, function () {\n n.withinOwners(e.target, function (n, r) {\n t(e, i, n, e.target, r, a, null);\n });\n }) : le.all(document, \"[\".concat(o, \"]\"), function (r) {\n var a = r.getAttribute(o);\n n.debounce(r, e, function () {\n n.withinOwners(r, function (n, o) {\n t(e, i, n, r, o, a, \"window\");\n });\n });\n });\n });\n };\n\n for (var r in e) i(r);\n }\n }, {\n key: \"bindClicks\",\n value: function () {\n this.bindClick(\"click\", \"click\", !1), this.bindClick(\"mousedown\", \"capture-click\", !0);\n }\n }, {\n key: \"bindClick\",\n value: function (e, t, n) {\n var i = this,\n r = this.binding(t);\n window.addEventListener(e, function (e) {\n if (i.isConnected()) {\n var t = null,\n o = (t = n ? e.target.matches(\"[\".concat(r, \"]\")) ? e.target : e.target.querySelector(\"[\".concat(r, \"]\")) : G(e.target, r)) && t.getAttribute(r);\n o && (\"#\" === t.getAttribute(\"href\") && e.preventDefault(), i.debounce(t, e, function () {\n i.withinOwners(t, function (n, r) {\n n.pushEvent(\"click\", t, r, o, i.eventMeta(\"click\", e, t));\n });\n }));\n }\n }, n);\n }\n }, {\n key: \"bindNav\",\n value: function () {\n var e = this;\n\n if (ce.canPushState()) {\n history.scrollRestoration && (history.scrollRestoration = \"manual\");\n var t = null;\n window.addEventListener(\"scroll\", function (e) {\n clearTimeout(t), t = setTimeout(function () {\n ce.updateCurrentState(function (e) {\n return Object.assign(e, {\n scroll: window.scrollY\n });\n });\n }, 100);\n }), window.addEventListener(\"popstate\", function (t) {\n if (e.registerNewLocation(window.location)) {\n var n = t.state || {},\n i = n.type,\n r = n.id,\n o = n.root,\n a = n.scroll,\n u = window.location.href;\n e.main.isConnected() && \"patch\" === i && r === e.main.id ? e.main.pushLinkPatch(u, null) : e.replaceMain(u, null, function () {\n o && e.replaceRootHistory(), \"number\" == typeof a && setTimeout(function () {\n window.scrollTo(0, a);\n }, 0);\n });\n }\n }, !1), window.addEventListener(\"click\", function (t) {\n var n = G(t.target, \"data-phx-link\"),\n i = n && n.getAttribute(\"data-phx-link\"),\n r = t.metaKey || t.ctrlKey || 1 === t.button;\n\n if (i && e.isConnected() && e.main && !r) {\n var o = n.href,\n a = n.getAttribute(\"data-phx-link-state\");\n if (t.preventDefault(), e.pendingLink !== o) if (\"patch\" === i) e.pushHistoryPatch(o, a, n);else {\n if (\"redirect\" !== i) throw new Error(\"expected \".concat(\"data-phx-link\", ' to be \"patch\" or \"redirect\", got: ').concat(i));\n e.historyRedirect(o, a);\n }\n }\n }, !1);\n }\n }\n }, {\n key: \"withPageLoading\",\n value: function (e, t) {\n le.dispatchEvent(window, \"phx:page-loading-start\", e);\n\n var n = function () {\n return le.dispatchEvent(window, \"phx:page-loading-stop\", e);\n };\n\n return t ? t(n) : n;\n }\n }, {\n key: \"pushHistoryPatch\",\n value: function (e, t, n) {\n var i = this;\n this.withPageLoading({\n to: e,\n kind: \"patch\"\n }, function (r) {\n i.main.pushLinkPatch(e, n, function () {\n i.historyPatch(e, t), r();\n });\n });\n }\n }, {\n key: \"historyPatch\",\n value: function (e, t) {\n ce.pushState(t, {\n type: \"patch\",\n id: this.main.id\n }, e), this.registerNewLocation(window.location);\n }\n }, {\n key: \"historyRedirect\",\n value: function (e, t, n) {\n var i = this,\n r = window.scrollY;\n this.withPageLoading({\n to: e,\n kind: \"redirect\"\n }, function (o) {\n i.replaceMain(e, n, function () {\n ce.pushState(t, {\n type: \"redirect\",\n id: i.main.id,\n scroll: r\n }, e), i.registerNewLocation(window.location), o();\n });\n });\n }\n }, {\n key: \"replaceRootHistory\",\n value: function () {\n ce.pushState(\"replace\", {\n root: !0,\n type: \"patch\",\n id: this.main.id\n });\n }\n }, {\n key: \"registerNewLocation\",\n value: function (e) {\n var t = this.currentLocation;\n return t.pathname + t.search !== e.pathname + e.search && (this.currentLocation = $(e), !0);\n }\n }, {\n key: \"bindForms\",\n value: function () {\n var e = this,\n t = 0;\n this.on(\"submit\", function (t) {\n var n = t.target.getAttribute(e.binding(\"submit\"));\n n && (t.preventDefault(), t.target.disabled = !0, e.withinOwners(t.target, function (e, i) {\n return e.submitForm(t.target, i, n);\n }));\n }, !1);\n\n for (var n = function () {\n var n = r[i];\n e.on(n, function (i) {\n var r = i.target,\n o = r.form && r.form.getAttribute(e.binding(\"change\"));\n\n if (o && (\"number\" !== r.type || !r.validity || !r.validity.badInput)) {\n var a = t;\n t++;\n var u = le.private(r, \"prev-iteration\") || {},\n s = u.at,\n c = u.type;\n s === a - 1 && n !== c || (le.putPrivate(r, \"prev-iteration\", {\n at: a,\n type: n\n }), e.debounce(r, i, function () {\n e.withinOwners(r.form, function (t, n) {\n le.putPrivate(r, \"phx-has-focused\", !0), le.isTextualInput(r) || e.setActiveElement(r), t.pushInput(r, n, o, i.target);\n });\n }));\n }\n }, !1);\n }, i = 0, r = [\"change\", \"input\"]; i < r.length; i++) n();\n }\n }, {\n key: \"debounce\",\n value: function (e, t, n) {\n var i = this.binding(\"debounce\"),\n r = this.binding(\"throttle\"),\n o = this.defaults.debounce.toString(),\n a = this.defaults.throttle.toString();\n le.debounce(e, t, i, o, r, a, n);\n }\n }, {\n key: \"silenceEvents\",\n value: function (e) {\n this.silenced = !0, e(), this.silenced = !1;\n }\n }, {\n key: \"on\",\n value: function (e, t) {\n var n = this;\n window.addEventListener(e, function (e) {\n n.silenced || t(e);\n });\n }\n }]), e;\n }(),\n ce = {\n canPushState: function () {\n return void 0 !== history.pushState;\n },\n dropLocal: function (e, t) {\n return window.localStorage.removeItem(this.localKey(e, t));\n },\n updateLocal: function (e, t, n, i) {\n var r = this.getLocal(e, t),\n o = this.localKey(e, t),\n a = null === r ? n : i(r);\n return window.localStorage.setItem(o, JSON.stringify(a)), a;\n },\n getLocal: function (e, t) {\n return JSON.parse(window.localStorage.getItem(this.localKey(e, t)));\n },\n fetchPage: function (e, t) {\n var n = new XMLHttpRequest();\n n.open(\"GET\", e, !0), n.timeout = 3e4, n.setRequestHeader(\"content-type\", \"text/html\"), n.setRequestHeader(\"cache-control\", \"max-age=0, no-cache, no-store, must-revalidate, post-check=0, pre-check=0\"), n.setRequestHeader(\"x-requested-with\", \"live-link\"), n.onerror = function () {\n return t(400);\n }, n.ontimeout = function () {\n return t(504);\n }, n.onreadystatechange = function () {\n if (4 === n.readyState) {\n var i = new URL(e),\n r = i.pathname + i.search,\n o = Z(n.getResponseHeader(\"x-response-url\") || n.responseURL, function (e) {\n return new URL(e);\n }),\n a = o ? o.pathname + o.search : null;\n return \"live-link\" !== n.getResponseHeader(\"x-requested-with\") ? t(400) : null === o || a != r ? t(302) : 200 !== n.status ? t(n.status) : void t(200, n.responseText);\n }\n }, n.send();\n },\n updateCurrentState: function (e) {\n this.canPushState() && history.replaceState(e(history.state || {}), \"\", window.location.href);\n },\n pushState: function (e, t, n) {\n if (this.canPushState()) {\n if (n !== window.location.href) {\n if (\"redirect\" == t.type && t.scroll) {\n var i = history.state || {};\n i.scroll = t.scroll, history.replaceState(i, \"\", window.location.href);\n }\n\n delete t.scroll, history[e + \"State\"](t, \"\", n || null);\n var r = this.getHashTargetEl(window.location.hash);\n r ? r.scrollIntoView() : \"redirect\" === t.type && window.scroll(0, 0);\n }\n } else this.redirect(n);\n },\n setCookie: function (e, t) {\n document.cookie = \"\".concat(e, \"=\").concat(t);\n },\n getCookie: function (e) {\n return document.cookie.replace(new RegExp(\"(?:(?:^|.*;s*)\".concat(e, \"s*=s*([^;]*).*$)|^.*$\")), \"$1\");\n },\n redirect: function (e, t) {\n t && ce.setCookie(\"__phoenix_flash__\", t + \"; max-age=60000; path=/\"), window.location = e;\n },\n localKey: function (e, t) {\n return \"\".concat(e, \"-\").concat(t);\n },\n getHashTargetEl: function (e) {\n var t = e.toString().substring(1);\n if (\"\" !== t) return document.getElementById(t) || document.querySelector('a[name=\"'.concat(t, '\"]'));\n }\n },\n le = {\n byId: function (e) {\n return document.getElementById(e) || z(\"no id found for \".concat(e));\n },\n removeClass: function (e, t) {\n e.classList.remove(t), 0 === e.classList.length && e.removeAttribute(\"class\");\n },\n all: function (e, t, n) {\n var i = Array.from(e.querySelectorAll(t));\n return n ? i.forEach(n) : i;\n },\n childNodeLength: function (e) {\n var t = document.createElement(\"template\");\n return t.innerHTML = e, t.content.childElementCount;\n },\n isUploadInput: function (e) {\n return \"file\" === e.type && null !== e.getAttribute(M);\n },\n findUploadInputs: function (e) {\n return this.all(e, 'input[type=\"file\"]['.concat(M, \"]\"));\n },\n findComponentNodeList: function (e, t) {\n return this.filterWithinSameLiveView(this.all(e, \"[\".concat(H, '=\"').concat(t, '\"]')), e);\n },\n isPhxDestroyed: function (e) {\n return !(!e.id || !le.private(e, \"destroyed\"));\n },\n markPhxChildDestroyed: function (e) {\n e.setAttribute(\"data-phx-session\", \"\"), this.putPrivate(e, \"destroyed\", !0);\n },\n findPhxChildrenInFragment: function (e, t) {\n var n = document.createElement(\"template\");\n return n.innerHTML = e, this.findPhxChildren(n.content, t);\n },\n isIgnored: function (e, t) {\n return \"ignore\" === (e.getAttribute(t) || e.getAttribute(\"data-phx-update\"));\n },\n isPhxUpdate: function (e, t, n) {\n return e.getAttribute && n.indexOf(e.getAttribute(t)) >= 0;\n },\n findPhxChildren: function (e, t) {\n return this.all(e, \"\".concat(U, \"[\").concat(\"data-phx-parent-id\", '=\"').concat(t, '\"]'));\n },\n findParentCIDs: function (e, t) {\n var n = this,\n i = new Set(t);\n return t.reduce(function (t, i) {\n var r = \"[\".concat(H, '=\"').concat(i, '\"] [').concat(H, \"]\");\n return n.filterWithinSameLiveView(n.all(e, r), e).map(function (e) {\n return parseInt(e.getAttribute(H));\n }).forEach(function (e) {\n return t.delete(e);\n }), t;\n }, i);\n },\n filterWithinSameLiveView: function (e, t) {\n var n = this;\n return t.querySelector(U) ? e.filter(function (e) {\n return n.withinSameLiveView(e, t);\n }) : e;\n },\n withinSameLiveView: function (e, t) {\n for (; e = e.parentNode;) {\n if (e.isSameNode(t)) return !0;\n if (e.getAttribute(O)) return !1;\n }\n },\n private: function (e, t) {\n return e.phxPrivate && e.phxPrivate[t];\n },\n deletePrivate: function (e, t) {\n e.phxPrivate && delete e.phxPrivate[t];\n },\n putPrivate: function (e, t, n) {\n e.phxPrivate || (e.phxPrivate = {}), e.phxPrivate[t] = n;\n },\n copyPrivates: function (e, t) {\n t.phxPrivate && (e.phxPrivate = $(t.phxPrivate));\n },\n putTitle: function (e) {\n var t = document.querySelector(\"title\").dataset,\n n = t.prefix,\n i = t.suffix;\n document.title = \"\".concat(n || \"\").concat(e).concat(i || \"\");\n },\n debounce: function (e, t, n, i, r, o, a) {\n var u = this,\n s = e.getAttribute(n),\n c = e.getAttribute(r);\n \"\" === s && (s = i), \"\" === c && (c = o);\n var l = s || c;\n\n switch (l) {\n case null:\n return a();\n\n case \"blur\":\n return void (this.once(e, \"debounce-blur\") && e.addEventListener(\"blur\", function () {\n return a();\n }));\n\n default:\n var d = parseInt(l),\n h = this.incCycle(e, \"debounce-trigger\", function () {\n return c ? u.deletePrivate(e, \"throttled\") : a();\n });\n if (isNaN(d)) return z(\"invalid throttle/debounce value: \".concat(l));\n\n if (c) {\n var f = !1;\n\n if (\"keydown\" === t.type) {\n var v = this.private(e, \"debounce-prev-key\");\n this.putPrivate(e, \"debounce-prev-key\", t.key), f = v !== t.key;\n }\n\n if (!f && this.private(e, \"throttled\")) return !1;\n a(), this.putPrivate(e, \"throttled\", !0), setTimeout(function () {\n return u.triggerCycle(e, \"debounce-trigger\");\n }, d);\n } else setTimeout(function () {\n return u.triggerCycle(e, \"debounce-trigger\", h);\n }, d);\n\n e.form && this.once(e.form, \"bind-debounce\") && e.form.addEventListener(\"submit\", function (t) {\n Array.from(new FormData(e.form).entries(), function (t) {\n var n = x(t, 2),\n i = n[0],\n r = (n[1], e.form.querySelector('[name=\"'.concat(i, '\"]')));\n u.incCycle(r, \"debounce-trigger\"), u.deletePrivate(r, \"throttled\");\n });\n }), this.once(e, \"bind-debounce\") && e.addEventListener(\"blur\", function (t) {\n return u.triggerCycle(e, \"debounce-trigger\");\n });\n }\n },\n triggerCycle: function (e, t, n) {\n var i = x(this.private(e, t), 2),\n r = i[0],\n o = i[1];\n n || (n = r), n === r && (this.incCycle(e, t), o());\n },\n once: function (e, t) {\n return !0 !== this.private(e, t) && (this.putPrivate(e, t, !0), !0);\n },\n incCycle: function (e, t) {\n var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : function () {},\n i = x(this.private(e, t) || [0, n], 2),\n r = i[0];\n i[1];\n return r++, this.putPrivate(e, t, [r, n]), r;\n },\n discardError: function (e, t, n) {\n var i = t.getAttribute && t.getAttribute(n),\n r = i && e.querySelector('[id=\"'.concat(i, '\"], [name=\"').concat(i, '\"]'));\n r && (this.private(r, \"phx-has-focused\") || this.private(r.form, \"phx-has-submitted\") || t.classList.add(\"phx-no-feedback\"));\n },\n showError: function (e, t) {\n var n = this;\n (e.id || e.name) && this.all(e.form, \"[\".concat(t, '=\"').concat(e.id, '\"], [').concat(t, '=\"').concat(e.name, '\"]'), function (e) {\n n.removeClass(e, \"phx-no-feedback\");\n });\n },\n isPhxChild: function (e) {\n return e.getAttribute && e.getAttribute(\"data-phx-parent-id\");\n },\n dispatchEvent: function (e, t) {\n var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {},\n i = new CustomEvent(t, {\n bubbles: !0,\n cancelable: !0,\n detail: n\n });\n e.dispatchEvent(i);\n },\n cloneNode: function (e, t) {\n if (void 0 === t) return e.cloneNode(!0);\n var n = e.cloneNode(!1);\n return n.innerHTML = t, n;\n },\n mergeAttrs: function (e, t) {\n for (var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, i = n.exclude || [], r = n.isIgnored, o = t.attributes, a = o.length - 1; a >= 0; a--) {\n var u = o[a].name;\n i.indexOf(u) < 0 && e.setAttribute(u, t.getAttribute(u));\n }\n\n for (var s = e.attributes, c = s.length - 1; c >= 0; c--) {\n var l = s[c].name;\n r ? l.startsWith(\"data-\") && !t.hasAttribute(l) && e.removeAttribute(l) : t.hasAttribute(l) || e.removeAttribute(l);\n }\n },\n mergeFocusedInput: function (e, t) {\n e instanceof HTMLSelectElement || le.mergeAttrs(e, t, {\n except: [\"value\"]\n }), t.readOnly ? e.setAttribute(\"readonly\", !0) : e.removeAttribute(\"readonly\");\n },\n hasSelectionRange: function (e) {\n return e.setSelectionRange && (\"text\" === e.type || \"textarea\" === e.type);\n },\n restoreFocus: function (e, t, n) {\n if (le.isTextualInput(e)) {\n var i = e.matches(\":focus\");\n e.readOnly && e.blur(), i || e.focus(), this.hasSelectionRange(e) && e.setSelectionRange(t, n);\n }\n },\n isFormInput: function (e) {\n return /^(?:input|select|textarea)$/i.test(e.tagName) && \"button\" !== e.type;\n },\n syncAttrsToProps: function (e) {\n e instanceof HTMLInputElement && J.indexOf(e.type.toLocaleLowerCase()) >= 0 && (e.checked = null !== e.getAttribute(\"checked\"));\n },\n isTextualInput: function (e) {\n return B.indexOf(e.type) >= 0;\n },\n isNowTriggerFormExternal: function (e, t) {\n return e.getAttribute && null !== e.getAttribute(t);\n },\n syncPendingRef: function (e, t, n) {\n var i = e.getAttribute(F);\n return null === i || (le.isFormInput(e) || null !== e.getAttribute(n) ? (le.isUploadInput(e) && le.mergeAttrs(e, t, {\n isIgnored: !0\n }), le.putPrivate(e, F, t), !1) : (j.forEach(function (n) {\n e.classList.contains(n) && t.classList.add(n);\n }), t.setAttribute(F, i), !0));\n },\n cleanChildNodes: function (e, t) {\n if (le.isPhxUpdate(e, t, [\"append\", \"prepend\"])) {\n var n = [];\n e.childNodes.forEach(function (e) {\n e.id || (e.nodeType === Node.TEXT_NODE && \"\" === e.nodeValue.trim() || z(\"only HTML element tags with an id are allowed inside containers with phx-update.\\n\\n\" + 'removing illegal node: \"'.concat((e.outerHTML || e.nodeValue).trim(), '\"\\n\\n')), n.push(e));\n }), n.forEach(function (e) {\n return e.remove();\n });\n }\n }\n },\n de = function () {\n function e(t, n, i) {\n T(this, e);\n var r = new Set(),\n o = new Set(A(n.children).map(function (e) {\n return e.id;\n })),\n a = [];\n Array.from(t.children).forEach(function (e) {\n if (e.id && (r.add(e.id), o.has(e.id))) {\n var t = e.previousElementSibling && e.previousElementSibling.id;\n a.push({\n elementId: e.id,\n previousElementId: t\n });\n }\n }), this.containerId = n.id, this.updateType = i, this.elementsToModify = a, this.elementIdsToAdd = A(o).filter(function (e) {\n return !r.has(e);\n });\n }\n\n return _(e, [{\n key: \"perform\",\n value: function () {\n var e = le.byId(this.containerId);\n this.elementsToModify.forEach(function (t) {\n t.previousElementId ? Z(document.getElementById(t.previousElementId), function (e) {\n Z(document.getElementById(t.elementId), function (t) {\n t.previousElementSibling && t.previousElementSibling.id == e.id || e.insertAdjacentElement(\"afterend\", t);\n });\n }) : Z(document.getElementById(t.elementId), function (t) {\n null == t.previousElementSibling || e.insertAdjacentElement(\"afterbegin\", t);\n });\n }), \"prepend\" == this.updateType && this.elementIdsToAdd.reverse().forEach(function (t) {\n Z(document.getElementById(t), function (t) {\n return e.insertAdjacentElement(\"afterbegin\", t);\n });\n });\n }\n }]), e;\n }(),\n he = function () {\n function e(t, n, i, r, o) {\n T(this, e), this.view = t, this.liveSocket = t.liveSocket, this.container = n, this.id = i, this.rootID = t.root.id, this.html = r, this.targetCID = o, this.cidPatch = \"number\" == typeof this.targetCID, this.callbacks = {\n beforeadded: [],\n beforeupdated: [],\n beforephxChildAdded: [],\n afteradded: [],\n afterupdated: [],\n afterdiscarded: [],\n afterphxChildAdded: []\n };\n }\n\n return _(e, null, [{\n key: \"patchEl\",\n value: function (e, t, n) {\n b(e, t, {\n childrenOnly: !1,\n onBeforeElUpdated: function (e, t) {\n if (n && n.isSameNode(e) && le.isFormInput(e)) return le.mergeFocusedInput(e, t), !1;\n }\n });\n }\n }]), _(e, [{\n key: \"before\",\n value: function (e, t) {\n this.callbacks[\"before\".concat(e)].push(t);\n }\n }, {\n key: \"after\",\n value: function (e, t) {\n this.callbacks[\"after\".concat(e)].push(t);\n }\n }, {\n key: \"trackBefore\",\n value: function (e) {\n for (var t = arguments.length, n = new Array(t > 1 ? t - 1 : 0), i = 1; i < t; i++) n[i - 1] = arguments[i];\n\n this.callbacks[\"before\".concat(e)].forEach(function (e) {\n return e.apply(void 0, n);\n });\n }\n }, {\n key: \"trackAfter\",\n value: function (e) {\n for (var t = arguments.length, n = new Array(t > 1 ? t - 1 : 0), i = 1; i < t; i++) n[i - 1] = arguments[i];\n\n this.callbacks[\"after\".concat(e)].forEach(function (e) {\n return e.apply(void 0, n);\n });\n }\n }, {\n key: \"markPrunableContentForRemoval\",\n value: function () {\n le.all(this.container, \"[phx-update=append] > *, [phx-update=prepend] > *\", function (e) {\n e.setAttribute(\"data-phx-remove\", \"\");\n });\n }\n }, {\n key: \"perform\",\n value: function () {\n var e = this,\n t = this.view,\n n = this.liveSocket,\n i = this.container,\n r = this.html,\n o = this.isCIDPatch() ? this.targetCIDContainer(r) : i;\n\n if (!this.isCIDPatch() || o) {\n var a = n.getActiveElement(),\n u = a && le.hasSelectionRange(a) ? a : {},\n s = u.selectionStart,\n c = u.selectionEnd,\n l = n.binding(\"update\"),\n d = n.binding(\"feedback-for\"),\n h = n.binding(\"disable-with\"),\n f = n.binding(\"trigger-action\"),\n v = [],\n p = [],\n g = [],\n m = null,\n y = n.time(\"premorph container prep\", function () {\n return e.buildDiffHTML(i, r, l, o);\n });\n return this.trackBefore(\"added\", i), this.trackBefore(\"updated\", i, i), n.time(\"morphdom\", function () {\n b(o, y, {\n childrenOnly: null === o.getAttribute(H),\n getNodeKey: function (e) {\n return le.isPhxDestroyed(e) ? null : e.id;\n },\n onBeforeNodeAdded: function (t) {\n return le.discardError(o, t, d), e.trackBefore(\"added\", t), t;\n },\n onNodeAdded: function (n) {\n le.isNowTriggerFormExternal(n, f) && (m = n), le.isPhxChild(n) && t.ownsElement(n) && e.trackAfter(\"phxChildAdded\", n), v.push(n);\n },\n onNodeDiscarded: function (t) {\n le.isPhxChild(t) && n.destroyViewByEl(t), e.trackAfter(\"discarded\", t);\n },\n onBeforeNodeDiscarded: function (t) {\n return !(!t.getAttribute || null === t.getAttribute(\"data-phx-remove\")) || (null === t.parentNode || !le.isPhxUpdate(t.parentNode, l, [\"append\", \"prepend\"]) || !t.id) && !e.skipCIDSibling(t);\n },\n onElUpdated: function (e) {\n le.isNowTriggerFormExternal(e, f) && (m = e), p.push(e);\n },\n onBeforeElUpdated: function (t, n) {\n if (le.cleanChildNodes(n, l), e.skipCIDSibling(n)) return !1;\n if (le.isIgnored(t, l)) return e.trackBefore(\"updated\", t, n), le.mergeAttrs(t, n, {\n isIgnored: !0\n }), p.push(t), !1;\n if (\"number\" === t.type && t.validity && t.validity.badInput) return !1;\n if (!le.syncPendingRef(t, n, h)) return le.isUploadInput(t) && (e.trackBefore(\"updated\", t, n), p.push(t)), !1;\n\n if (le.isPhxChild(n)) {\n var i = t.getAttribute(\"data-phx-session\");\n return le.mergeAttrs(t, n, {\n exclude: [\"data-phx-static\"]\n }), \"\" !== i && t.setAttribute(\"data-phx-session\", i), t.setAttribute(\"data-phx-root-id\", e.rootID), !1;\n }\n\n return le.copyPrivates(n, t), le.discardError(o, n, d), a && t.isSameNode(a) && le.isFormInput(t) && !e.forceFocusedSelectUpdate(t, n) ? (e.trackBefore(\"updated\", t, n), le.mergeFocusedInput(t, n), le.syncAttrsToProps(t), p.push(t), !1) : (le.isPhxUpdate(n, l, [\"append\", \"prepend\"]) && g.push(new de(t, n, n.getAttribute(l))), le.syncAttrsToProps(n), e.trackBefore(\"updated\", t, n), !0);\n }\n });\n }), n.isDebugEnabled() && function () {\n for (var e = new Set(), t = document.querySelectorAll(\"*[id]\"), n = 0, i = t.length; n < i; n++) e.has(t[n].id) ? console.error(\"Multiple IDs detected: \".concat(t[n].id, \". Ensure unique element ids.\")) : e.add(t[n].id);\n }(), g.length > 0 && n.time(\"post-morph append/prepend restoration\", function () {\n g.forEach(function (e) {\n return e.perform();\n });\n }), n.silenceEvents(function () {\n return le.restoreFocus(a, s, c);\n }), le.dispatchEvent(document, \"phx:update\"), v.forEach(function (t) {\n return e.trackAfter(\"added\", t);\n }), p.forEach(function (t) {\n return e.trackAfter(\"updated\", t);\n }), m && (n.disconnect(), m.submit()), !0;\n }\n }\n }, {\n key: \"forceFocusedSelectUpdate\",\n value: function (e, t) {\n var n = [\"select\", \"select-one\", \"select-multiple\"].find(function (t) {\n return t === e.type;\n });\n return !0 === e.multiple || n && e.innerHTML != t.innerHTML;\n }\n }, {\n key: \"isCIDPatch\",\n value: function () {\n return this.cidPatch;\n }\n }, {\n key: \"skipCIDSibling\",\n value: function (e) {\n return e.nodeType === Node.ELEMENT_NODE && null !== e.getAttribute(\"data-phx-skip\");\n }\n }, {\n key: \"targetCIDContainer\",\n value: function (e) {\n if (this.isCIDPatch()) {\n var t = k(le.findComponentNodeList(this.container, this.targetCID)),\n n = t[0];\n return 0 === t.slice(1).length && 1 === le.childNodeLength(e) ? n : n && n.parentNode;\n }\n }\n }, {\n key: \"buildDiffHTML\",\n value: function (e, t, n, i) {\n var r = this,\n o = this.isCIDPatch(),\n a = o && i.getAttribute(H) === this.targetCID.toString();\n if (!o || a) return t;\n var u = null,\n s = document.createElement(\"template\");\n u = le.cloneNode(i);\n var c = k(le.findComponentNodeList(u, this.targetCID)),\n l = c[0],\n d = c.slice(1);\n return s.innerHTML = t, d.forEach(function (e) {\n return e.remove();\n }), Array.from(u.childNodes).forEach(function (e) {\n e.id && e.nodeType === Node.ELEMENT_NODE && e.getAttribute(H) !== r.targetCID.toString() && (e.setAttribute(\"data-phx-skip\", \"\"), e.innerHTML = \"\");\n }), Array.from(s.content.childNodes).forEach(function (e) {\n return u.insertBefore(e, l);\n }), l.remove(), u.outerHTML;\n }\n }]), e;\n }(),\n fe = function () {\n function e(t, n, i, r, o) {\n var a = this;\n T(this, e), this.liveSocket = n, this.flash = o, this.parent = i, this.root = i ? i.root : this, this.el = t, this.id = this.el.id, this.view = this.el.getAttribute(O), this.ref = 0, this.childJoins = 0, this.loaderTimer = null, this.pendingDiffs = [], this.pruningCIDs = [], this.href = r, this.joinCount = this.parent ? this.parent.joinCount - 1 : 0, this.joinPending = !0, this.destroyed = !1, this.joinCallback = function () {}, this.stopCallback = function () {}, this.pendingJoinOps = this.parent ? null : [], this.viewHooks = {}, this.uploaders = {}, this.formSubmits = [], this.children = this.parent ? null : {}, this.root.children[this.id] = {}, this.channel = this.liveSocket.channel(\"lv:\".concat(this.id), function () {\n return {\n url: a.href,\n params: a.connectParams(),\n session: a.getSession(),\n static: a.getStatic(),\n flash: a.flash\n };\n }), this.showLoader(this.liveSocket.loaderTimeout), this.bindChannel();\n }\n\n return _(e, [{\n key: \"isMain\",\n value: function () {\n return this.liveSocket.main === this;\n }\n }, {\n key: \"connectParams\",\n value: function () {\n var e = this.liveSocket.params(this.view),\n t = le.all(document, \"[\".concat(this.binding(\"track-static\"), \"]\")).map(function (e) {\n return e.src || e.href;\n }).filter(function (e) {\n return \"string\" == typeof e;\n });\n return t.length > 0 && (e._track_static = t), e._mounts = this.joinCount, e;\n }\n }, {\n key: \"name\",\n value: function () {\n return this.view;\n }\n }, {\n key: \"isConnected\",\n value: function () {\n return this.channel.canPush();\n }\n }, {\n key: \"getSession\",\n value: function () {\n return this.el.getAttribute(\"data-phx-session\");\n }\n }, {\n key: \"getStatic\",\n value: function () {\n var e = this.el.getAttribute(\"data-phx-static\");\n return \"\" === e ? null : e;\n }\n }, {\n key: \"destroy\",\n value: function () {\n var e = this,\n t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : function () {};\n this.destroyAllChildren(), this.destroyed = !0, delete this.root.children[this.id], this.parent && delete this.root.children[this.parent.id][this.id], clearTimeout(this.loaderTimer);\n\n var n = function () {\n for (var n in t(), e.viewHooks) e.destroyHook(e.viewHooks[n]);\n };\n\n le.markPhxChildDestroyed(this.el), this.log(\"destroyed\", function () {\n return [\"the child has been removed from the parent\"];\n }), this.channel.leave().receive(\"ok\", n).receive(\"error\", n).receive(\"timeout\", n);\n }\n }, {\n key: \"setContainerClasses\",\n value: function () {\n var e;\n this.el.classList.remove(\"phx-connected\", \"phx-disconnected\", \"phx-error\"), (e = this.el.classList).add.apply(e, arguments);\n }\n }, {\n key: \"isLoading\",\n value: function () {\n return this.el.classList.contains(\"phx-disconnected\");\n }\n }, {\n key: \"showLoader\",\n value: function (e) {\n var t = this;\n if (clearTimeout(this.loaderTimer), e) this.loaderTimer = setTimeout(function () {\n return t.showLoader();\n }, e);else {\n for (var n in this.viewHooks) this.viewHooks[n].__disconnected();\n\n this.setContainerClasses(\"phx-disconnected\");\n }\n }\n }, {\n key: \"hideLoader\",\n value: function () {\n clearTimeout(this.loaderTimer), this.setContainerClasses(\"phx-connected\");\n }\n }, {\n key: \"triggerReconnected\",\n value: function () {\n for (var e in this.viewHooks) this.viewHooks[e].__reconnected();\n }\n }, {\n key: \"log\",\n value: function (e, t) {\n this.liveSocket.log(this, e, t);\n }\n }, {\n key: \"withinTargets\",\n value: function (e, t) {\n var n = this;\n\n if (/^(0|[1-9]\\d*)$/.test(e)) {\n var i = le.findComponentNodeList(this.el, e);\n 0 === i.length ? z(\"no component found matching phx-target of \".concat(e)) : t(this, i[0]);\n } else {\n var r = Array.from(document.querySelectorAll(e));\n 0 === r.length && z('nothing found matching the phx-target selector \"'.concat(e, '\"')), r.forEach(function (e) {\n return n.liveSocket.owner(e, function (n) {\n return t(n, e);\n });\n });\n }\n }\n }, {\n key: \"applyDiff\",\n value: function (e, t, n) {\n this.log(e, function () {\n return [\"\", $(t)];\n });\n var i = ue.extract(t),\n r = i.diff,\n o = i.reply,\n a = i.events,\n u = i.title;\n return u && le.putTitle(u), n({\n diff: r,\n reply: o,\n events: a\n }), o;\n }\n }, {\n key: \"onJoin\",\n value: function (e) {\n var t = this,\n n = e.rendered;\n this.childJoins = 0, this.joinPending = !0, this.flash = null, ce.dropLocal(this.name(), \"consecutive-reloads\"), this.applyDiff(\"mount\", n, function (n) {\n var i = n.diff,\n r = n.events;\n t.rendered = new ue(t.id, i);\n var o = t.renderContainer(null, \"join\");\n t.dropPendingRefs();\n var a = t.formsForRecovery(o);\n t.joinCount++, a.length > 0 ? a.forEach(function (e, n) {\n t.pushFormRecovery(e, function (e) {\n n === a.length - 1 && t.onJoinComplete(e, o, r);\n });\n }) : t.onJoinComplete(e, o, r);\n });\n }\n }, {\n key: \"dropPendingRefs\",\n value: function () {\n le.all(this.el, \"[\".concat(F, \"]\"), function (e) {\n return e.removeAttribute(F);\n });\n }\n }, {\n key: \"onJoinComplete\",\n value: function (e, t, n) {\n var i = this,\n r = e.live_patch;\n if (this.joinCount > 1 || this.parent && !this.parent.isJoinPending()) return this.applyJoinPatch(r, t, n);\n 0 === le.findPhxChildrenInFragment(t, this.id).filter(function (e) {\n var t = e.id && i.el.querySelector(\"#\".concat(e.id)),\n n = t && t.getAttribute(\"data-phx-static\");\n return n && e.setAttribute(\"data-phx-static\", n), i.joinChild(e);\n }).length ? this.parent ? (this.root.pendingJoinOps.push([this, function () {\n return i.applyJoinPatch(r, t, n);\n }]), this.parent.ackJoin(this)) : (this.onAllChildJoinsComplete(), this.applyJoinPatch(r, t, n)) : this.root.pendingJoinOps.push([this, function () {\n return i.applyJoinPatch(r, t, n);\n }]);\n }\n }, {\n key: \"attachTrueDocEl\",\n value: function () {\n this.el = le.byId(this.id), this.el.setAttribute(\"data-phx-root-id\", this.root.id);\n }\n }, {\n key: \"dispatchEvents\",\n value: function (e) {\n e.forEach(function (e) {\n var t = x(e, 2),\n n = t[0],\n i = t[1];\n window.dispatchEvent(new CustomEvent(\"phx:hook:\".concat(n), {\n detail: i\n }));\n });\n }\n }, {\n key: \"applyJoinPatch\",\n value: function (e, t, n) {\n var i = this;\n this.attachTrueDocEl();\n var r = new he(this, this.el, this.id, t, null);\n\n if (r.markPrunableContentForRemoval(), this.performPatch(r, !1), this.joinNewChildren(), le.all(this.el, \"[\".concat(this.binding(\"hook\"), \"], [data-phx-\").concat(\"hook\", \"]\"), function (e) {\n var t = i.addHook(e);\n t && t.__mounted();\n }), this.joinPending = !1, this.dispatchEvents(n), this.applyPendingUpdates(), e) {\n var o = e.kind,\n a = e.to;\n this.liveSocket.historyPatch(a, o);\n }\n\n this.hideLoader(), this.joinCount > 1 && this.triggerReconnected(), this.stopCallback();\n }\n }, {\n key: \"triggerBeforeUpdateHook\",\n value: function (e, t) {\n this.liveSocket.triggerDOM(\"onBeforeElUpdated\", [e, t]);\n var n = this.getHook(e),\n i = n && le.isIgnored(e, this.binding(\"update\"));\n if (n && !e.isEqualNode(t) && (!i || !function (e, t) {\n return JSON.stringify(e) === JSON.stringify(t);\n }(e.dataset, t.dataset))) return n.__beforeUpdate(), n;\n }\n }, {\n key: \"performPatch\",\n value: function (e, t) {\n var n = this,\n i = [],\n r = !1,\n o = new Set();\n return e.after(\"added\", function (e) {\n n.liveSocket.triggerDOM(\"onNodeAdded\", [e]);\n var t = n.addHook(e);\n t && t.__mounted();\n }), e.after(\"phxChildAdded\", function (e) {\n return r = !0;\n }), e.before(\"updated\", function (e, t) {\n n.triggerBeforeUpdateHook(e, t) && o.add(e.id);\n }), e.after(\"updated\", function (e) {\n o.has(e.id) && n.getHook(e).__updated();\n }), e.after(\"discarded\", function (e) {\n var t = n.componentID(e);\n \"number\" == typeof t && -1 === i.indexOf(t) && i.push(t);\n var r = n.getHook(e);\n r && n.destroyHook(r);\n }), e.perform(), t && this.maybePushComponentsDestroyed(i), r;\n }\n }, {\n key: \"joinNewChildren\",\n value: function () {\n var e = this;\n le.findPhxChildren(this.el, this.id).forEach(function (t) {\n return e.joinChild(t);\n });\n }\n }, {\n key: \"getChildById\",\n value: function (e) {\n return this.root.children[this.id][e];\n }\n }, {\n key: \"getDescendentByEl\",\n value: function (e) {\n return e.id === this.id ? this : this.children[e.getAttribute(\"data-phx-parent-id\")][e.id];\n }\n }, {\n key: \"destroyDescendent\",\n value: function (e) {\n for (var t in this.root.children) for (var n in this.root.children[t]) if (n === e) return this.root.children[t][n].destroy();\n }\n }, {\n key: \"joinChild\",\n value: function (t) {\n if (!this.getChildById(t.id)) {\n var n = new e(t, this.liveSocket, this);\n return this.root.children[this.id][n.id] = n, n.join(), this.childJoins++, !0;\n }\n }\n }, {\n key: \"isJoinPending\",\n value: function () {\n return this.joinPending;\n }\n }, {\n key: \"ackJoin\",\n value: function (e) {\n this.childJoins--, 0 === this.childJoins && (this.parent ? this.parent.ackJoin(this) : this.onAllChildJoinsComplete());\n }\n }, {\n key: \"onAllChildJoinsComplete\",\n value: function () {\n this.joinCallback(), this.pendingJoinOps.forEach(function (e) {\n var t = x(e, 2),\n n = t[0],\n i = t[1];\n n.isDestroyed() || i();\n }), this.pendingJoinOps = [];\n }\n }, {\n key: \"update\",\n value: function (e, t) {\n var n = this;\n if (this.isJoinPending() || this.liveSocket.hasPendingLink()) return this.pendingDiffs.push({\n diff: e,\n events: t\n });\n this.rendered.mergeDiff(e);\n var i = !1;\n this.rendered.isComponentOnlyDiff(e) ? this.liveSocket.time(\"component patch complete\", function () {\n le.findParentCIDs(n.el, n.rendered.componentCIDs(e)).forEach(function (t) {\n n.componentPatch(n.rendered.getComponent(e, t), t) && (i = !0);\n });\n }) : Q(e) || this.liveSocket.time(\"full patch complete\", function () {\n var t = n.renderContainer(e, \"update\"),\n r = new he(n, n.el, n.id, t, null);\n i = n.performPatch(r, !0);\n }), this.dispatchEvents(t), i && this.joinNewChildren();\n }\n }, {\n key: \"renderContainer\",\n value: function (e, t) {\n var n = this;\n return this.liveSocket.time(\"toString diff (\".concat(t, \")\"), function () {\n var t = n.el.tagName,\n i = e ? n.rendered.componentCIDs(e).concat(n.pruningCIDs) : null,\n r = n.rendered.toString(i);\n return \"<\".concat(t, \">\").concat(r, \"\");\n });\n }\n }, {\n key: \"componentPatch\",\n value: function (e, t) {\n if (Q(e)) return !1;\n var n = this.rendered.componentToString(t),\n i = new he(this, this.el, this.id, n, t);\n return this.performPatch(i, !0);\n }\n }, {\n key: \"getHook\",\n value: function (e) {\n return this.viewHooks[pe.elementID(e)];\n }\n }, {\n key: \"addHook\",\n value: function (e) {\n if (!pe.elementID(e) && e.getAttribute) {\n var t = e.getAttribute(\"data-phx-\".concat(\"hook\")) || e.getAttribute(this.binding(\"hook\"));\n\n if (!t || this.ownsElement(e)) {\n var n = this.liveSocket.getHookCallbacks(t);\n\n if (n) {\n e.id || z('no DOM ID for hook \"'.concat(t, '\". Hooks require a unique ID on each element.'), e);\n var i = new pe(this, e, n);\n return this.viewHooks[pe.elementID(i.el)] = i, i;\n }\n\n null !== t && z('unknown hook found for \"'.concat(t, '\"'), e);\n }\n }\n }\n }, {\n key: \"destroyHook\",\n value: function (e) {\n e.__destroyed(), e.__cleanup__(), delete this.viewHooks[pe.elementID(e.el)];\n }\n }, {\n key: \"applyPendingUpdates\",\n value: function () {\n var e = this;\n this.pendingDiffs.forEach(function (t) {\n var n = t.diff,\n i = t.events;\n return e.update(n, i);\n }), this.pendingDiffs = [];\n }\n }, {\n key: \"onChannel\",\n value: function (e, t) {\n var n = this;\n this.liveSocket.onChannel(this.channel, e, function (e) {\n n.isJoinPending() ? n.root.pendingJoinOps.push([n, function () {\n return t(e);\n }]) : t(e);\n });\n }\n }, {\n key: \"bindChannel\",\n value: function () {\n var e = this;\n this.liveSocket.onChannel(this.channel, \"diff\", function (t) {\n e.applyDiff(\"update\", t, function (t) {\n var n = t.diff,\n i = t.events;\n return e.update(n, i);\n });\n }), this.onChannel(\"redirect\", function (t) {\n var n = t.to,\n i = t.flash;\n return e.onRedirect({\n to: n,\n flash: i\n });\n }), this.onChannel(\"live_patch\", function (t) {\n return e.onLivePatch(t);\n }), this.onChannel(\"live_redirect\", function (t) {\n return e.onLiveRedirect(t);\n }), this.channel.onError(function (t) {\n return e.onError(t);\n }), this.channel.onClose(function (t) {\n return e.onClose(t);\n });\n }\n }, {\n key: \"destroyAllChildren\",\n value: function () {\n for (var e in this.root.children[this.id]) this.getChildById(e).destroy();\n }\n }, {\n key: \"onLiveRedirect\",\n value: function (e) {\n var t = e.to,\n n = e.kind,\n i = e.flash,\n r = this.expandURL(t);\n this.liveSocket.historyRedirect(r, n, i);\n }\n }, {\n key: \"onLivePatch\",\n value: function (e) {\n var t = e.to,\n n = e.kind;\n this.href = this.expandURL(t), this.liveSocket.historyPatch(t, n);\n }\n }, {\n key: \"expandURL\",\n value: function (e) {\n return e.startsWith(\"/\") ? \"\".concat(window.location.protocol, \"//\").concat(window.location.host).concat(e) : e;\n }\n }, {\n key: \"onRedirect\",\n value: function (e) {\n var t = e.to,\n n = e.flash;\n this.liveSocket.redirect(t, n);\n }\n }, {\n key: \"isDestroyed\",\n value: function () {\n return this.destroyed;\n }\n }, {\n key: \"join\",\n value: function (e) {\n var t = this;\n this.parent || (this.stopCallback = this.liveSocket.withPageLoading({\n to: this.href,\n kind: \"initial\"\n })), this.joinCallback = function () {\n return e && e(t, t.joinCount);\n }, this.liveSocket.wrapPush(this, {\n timeout: !1\n }, function () {\n return t.channel.join().receive(\"ok\", function (e) {\n return t.onJoin(e);\n }).receive(\"error\", function (e) {\n return t.onJoinError(e);\n }).receive(\"timeout\", function () {\n return t.onJoinError({\n reason: \"timeout\"\n });\n });\n });\n }\n }, {\n key: \"onJoinError\",\n value: function (e) {\n return (e.redirect || e.live_redirect) && (this.joinPending = !1, this.channel.leave()), e.redirect ? this.onRedirect(e.redirect) : e.live_redirect ? this.onLiveRedirect(e.live_redirect) : (this.log(\"error\", function () {\n return [\"unable to join\", e];\n }), this.liveSocket.reloadWithJitter(this));\n }\n }, {\n key: \"onClose\",\n value: function (e) {\n if (!this.isDestroyed()) {\n if (this.isJoinPending() || this.liveSocket.hasPendingLink() && \"leave\" !== e) return this.liveSocket.reloadWithJitter(this);\n this.destroyAllChildren(), this.liveSocket.dropActiveElement(this), document.activeElement && document.activeElement.blur(), this.liveSocket.isUnloaded() && this.showLoader(200);\n }\n }\n }, {\n key: \"onError\",\n value: function (e) {\n this.onClose(e), this.log(\"error\", function () {\n return [\"view crashed\", e];\n }), this.liveSocket.isUnloaded() || this.displayError();\n }\n }, {\n key: \"displayError\",\n value: function () {\n this.isMain() && le.dispatchEvent(window, \"phx:page-loading-start\", {\n to: this.href,\n kind: \"error\"\n }), this.showLoader(), this.setContainerClasses(\"phx-disconnected\", \"phx-error\");\n }\n }, {\n key: \"pushWithReply\",\n value: function (e, t, n) {\n var i = this,\n r = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : function () {},\n o = x(e ? e() : [null, []], 2),\n a = o[0],\n u = x(o[1], 1)[0],\n s = function () {};\n\n return u && null !== u.getAttribute(this.binding(\"page-loading\")) && (s = this.liveSocket.withPageLoading({\n kind: \"element\",\n target: u\n })), \"number\" != typeof n.cid && delete n.cid, this.liveSocket.wrapPush(this, {\n timeout: !0\n }, function () {\n return i.channel.push(t, n, 3e4).receive(\"ok\", function (e) {\n var t = null;\n null !== a && i.undoRefs(a), e.diff && (t = i.applyDiff(\"update\", e.diff, function (e) {\n var t = e.diff,\n n = e.events;\n i.update(t, n);\n })), e.redirect && i.onRedirect(e.redirect), e.live_patch && i.onLivePatch(e.live_patch), e.live_redirect && i.onLiveRedirect(e.live_redirect), s(), r(e, t);\n });\n });\n }\n }, {\n key: \"undoRefs\",\n value: function (e) {\n var t = this;\n le.all(this.el, \"[\".concat(F, '=\"').concat(e, '\"]'), function (e) {\n e.removeAttribute(F), null !== e.getAttribute(\"data-phx-readonly\") && (e.readOnly = !1, e.removeAttribute(\"data-phx-readonly\")), null !== e.getAttribute(\"data-phx-disabled\") && (e.disabled = !1, e.removeAttribute(\"data-phx-disabled\")), j.forEach(function (t) {\n return le.removeClass(e, t);\n });\n var n = e.getAttribute(\"data-phx-disable-with-restore\");\n null !== n && (e.innerText = n, e.removeAttribute(\"data-phx-disable-with-restore\"));\n var i = le.private(e, F);\n\n if (i) {\n var r = t.triggerBeforeUpdateHook(e, i);\n he.patchEl(e, i, t.liveSocket.getActiveElement()), r && r.__updated(), le.deletePrivate(e, F);\n }\n });\n }\n }, {\n key: \"putRef\",\n value: function (e, t) {\n var n = this.ref++,\n i = this.binding(\"disable-with\");\n return e.forEach(function (e) {\n e.classList.add(\"phx-\".concat(t, \"-loading\")), e.setAttribute(F, n);\n var r = e.getAttribute(i);\n null !== r && (e.getAttribute(\"data-phx-disable-with-restore\") || e.setAttribute(\"data-phx-disable-with-restore\", e.innerText), e.innerText = r);\n }), [n, e];\n }\n }, {\n key: \"componentID\",\n value: function (e) {\n var t = e.getAttribute && e.getAttribute(H);\n return t ? parseInt(t) : null;\n }\n }, {\n key: \"targetComponentID\",\n value: function (e, t) {\n return e.getAttribute(this.binding(\"target\")) ? this.closestComponentID(t) : null;\n }\n }, {\n key: \"closestComponentID\",\n value: function (e) {\n var t = this;\n return e ? Z(e.closest(\"[\".concat(H, \"]\")), function (e) {\n return t.ownsElement(e) && t.componentID(e);\n }) : null;\n }\n }, {\n key: \"pushHookEvent\",\n value: function (e, t, n, i) {\n if (!this.isConnected()) return this.log(\"hook\", function () {\n return [\"unable to push hook event. LiveView not connected\", t, n];\n }), !1;\n var r = x(this.putRef([], \"hook\"), 2),\n o = r[0],\n a = r[1];\n return this.pushWithReply(function () {\n return [o, a];\n }, \"event\", {\n type: \"hook\",\n event: t,\n value: n,\n cid: this.closestComponentID(e)\n }, function (e, t) {\n return i(t, o);\n }), o;\n }\n }, {\n key: \"extractMeta\",\n value: function (e, t) {\n for (var n = this.binding(\"value-\"), i = 0; i < e.attributes.length; i++) {\n var r = e.attributes[i].name;\n r.startsWith(n) && (t[r.replace(n, \"\")] = e.getAttribute(r));\n }\n\n return void 0 !== e.value && (t.value = e.value, \"INPUT\" === e.tagName && J.indexOf(e.type) >= 0 && !e.checked && delete t.value), t;\n }\n }, {\n key: \"pushEvent\",\n value: function (e, t, n, i, r) {\n var o = this;\n this.pushWithReply(function () {\n return o.putRef([t], e);\n }, \"event\", {\n type: e,\n event: i,\n value: this.extractMeta(t, r),\n cid: this.targetComponentID(t, n)\n });\n }\n }, {\n key: \"pushKey\",\n value: function (e, t, n, i, r) {\n var o = this;\n this.pushWithReply(function () {\n return o.putRef([e], n);\n }, \"event\", {\n type: n,\n event: i,\n value: this.extractMeta(e, r),\n cid: this.targetComponentID(e, t)\n });\n }\n }, {\n key: \"pushFileProgress\",\n value: function (e, t, n) {\n var i = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : function () {};\n this.liveSocket.withinOwners(e.form, function (r, o) {\n r.pushWithReply(null, \"progress\", {\n event: e.getAttribute(r.binding(\"progress\")),\n ref: e.getAttribute(M),\n entry_ref: t,\n progress: n,\n cid: r.targetComponentID(e.form, o)\n }, i);\n });\n }\n }, {\n key: \"pushInput\",\n value: function (e, t, n, i, r) {\n var o = this,\n a = this.targetComponentID(e.form, t),\n u = function () {\n return o.putRef([e, e.form], \"change\");\n },\n s = ae(e.form, {\n _target: i.name\n });\n\n e.files && e.files.length > 0 && ie.trackFiles(e, Array.from(e.files));\n var c = {\n type: \"form\",\n event: n,\n value: s,\n uploads: ie.serializeUploads(e),\n cid: a\n };\n this.pushWithReply(u, \"event\", c, function (n) {\n if (le.showError(e, o.liveSocket.binding(\"feedback-for\")), le.isUploadInput(e) && null !== e.getAttribute(\"data-phx-auto-upload\")) {\n if (ie.filesAwaitingPreflight(e).length > 0) {\n var i = x(u(), 2),\n s = i[0];\n i[1];\n o.uploadFiles(e.form, t, s, a, function (t) {\n r && r(n), o.triggerAwaitingSubmit(e.form);\n });\n }\n } else r && r(n);\n });\n }\n }, {\n key: \"triggerAwaitingSubmit\",\n value: function (e) {\n var t = this.getScheduledSubmit(e);\n\n if (t) {\n var n = x(t, 3),\n i = (n[0], n[1], n[2]);\n this.cancelSubmit(e), i();\n }\n }\n }, {\n key: \"getScheduledSubmit\",\n value: function (e) {\n return this.formSubmits.find(function (t) {\n var n = x(t, 2),\n i = n[0];\n n[1];\n return i.isSameNode(e);\n });\n }\n }, {\n key: \"scheduleSubmit\",\n value: function (e, t, n) {\n if (this.getScheduledSubmit(e)) return !0;\n this.formSubmits.push([e, t, n]);\n }\n }, {\n key: \"cancelSubmit\",\n value: function (e) {\n var t = this;\n this.formSubmits = this.formSubmits.filter(function (n) {\n var i = x(n, 3),\n r = i[0],\n o = i[1];\n i[2];\n return !r.isSameNode(e) || (t.undoRefs(o), !1);\n });\n }\n }, {\n key: \"pushFormSubmit\",\n value: function (e, t, n, i) {\n var r = this,\n o = function (e) {\n return !(G(e, \"\".concat(r.binding(\"update\"), \"=ignore\"), e.form) || G(e, \"data-phx-update=ignore\", e.form));\n },\n a = function (e) {\n return e.hasAttribute(r.binding(\"disable-with\"));\n },\n u = function (e) {\n return \"BUTTON\" == e.tagName;\n },\n s = function (e) {\n return [\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(e.tagName);\n },\n c = function () {\n var t = Array.from(e.elements),\n n = t.filter(a),\n i = t.filter(u).filter(o),\n c = t.filter(s).filter(o);\n return i.forEach(function (e) {\n e.setAttribute(\"data-phx-disabled\", e.disabled), e.disabled = !0;\n }), c.forEach(function (e) {\n e.setAttribute(\"data-phx-readonly\", e.readOnly), e.readOnly = !0, e.files && (e.setAttribute(\"data-phx-disabled\", e.disabled), e.disabled = !0);\n }), e.setAttribute(r.binding(\"page-loading\"), \"\"), r.putRef([e].concat(n).concat(i).concat(c), \"submit\");\n },\n l = this.targetComponentID(e, t);\n\n if (ie.hasUploadsInProgress(e)) {\n var d = x(c(), 2),\n h = d[0];\n d[1];\n return this.scheduleSubmit(e, h, function () {\n return r.pushFormSubmit(e, t, n, i);\n });\n }\n\n if (ie.inputsAwaitingPreflight(e).length > 0) {\n var f = x(c(), 2),\n v = f[0],\n p = f[1],\n g = function () {\n return [v, p];\n };\n\n this.uploadFiles(e, t, v, l, function (t) {\n var o = ae(e, {});\n r.pushWithReply(g, \"event\", {\n type: \"form\",\n event: n,\n value: o,\n cid: l\n }, i);\n });\n } else {\n var m = ae(e);\n this.pushWithReply(c, \"event\", {\n type: \"form\",\n event: n,\n value: m,\n cid: l\n }, i);\n }\n }\n }, {\n key: \"uploadFiles\",\n value: function (e, t, n, i, r) {\n var o = this,\n a = this.joinCount;\n ie.activeFileInputs(e).forEach(function (e) {\n var i = new ie(e, o, r);\n o.uploaders[e] = i;\n var u = i.entries().map(function (e) {\n return e.toPreflightPayload();\n }),\n s = {\n ref: e.getAttribute(M),\n entries: u,\n cid: o.targetComponentID(e.form, t)\n };\n o.log(\"upload\", function () {\n return [\"sending preflight request\", s];\n }), o.pushWithReply(null, \"allow_upload\", s, function (e) {\n if (o.log(\"upload\", function () {\n return [\"got preflight response\", e];\n }), e.error) {\n o.undoRefs(n);\n var t = x(e.error, 2),\n r = t[0],\n u = t[1];\n o.log(\"upload\", function () {\n return [\"error for entry \".concat(r), u];\n });\n } else {\n i.initAdapterUpload(e, function (e) {\n o.channel.onError(function () {\n o.joinCount === a && e();\n });\n }, o.liveSocket);\n }\n });\n });\n }\n }, {\n key: \"pushFormRecovery\",\n value: function (e, t) {\n var n = this;\n this.liveSocket.withinOwners(e, function (i, r) {\n var o = e.elements[0],\n a = e.getAttribute(n.binding(\"auto-recover\")) || e.getAttribute(n.binding(\"change\"));\n i.pushInput(o, r, a, o, t);\n });\n }\n }, {\n key: \"pushLinkPatch\",\n value: function (e, t, n) {\n var i = this,\n r = this.liveSocket.setPendingLink(e),\n o = t ? function () {\n return i.putRef([t], \"click\");\n } : null;\n this.pushWithReply(o, \"link\", {\n url: e\n }, function (t) {\n t.link_redirect ? i.liveSocket.replaceMain(e, null, n, r) : i.liveSocket.commitPendingLink(r) && (i.href = e, i.applyPendingUpdates(), n && n());\n }).receive(\"timeout\", function () {\n return i.liveSocket.redirect(window.location.href);\n });\n }\n }, {\n key: \"formsForRecovery\",\n value: function (e) {\n var t = this;\n if (0 === this.joinCount) return [];\n var n = this.binding(\"change\"),\n i = document.createElement(\"template\");\n return i.innerHTML = e, le.all(this.el, \"form[\".concat(n, \"]\")).filter(function (e) {\n return t.ownsElement(e);\n }).filter(function (e) {\n return e.elements.length > 0;\n }).filter(function (e) {\n return \"ignore\" !== e.getAttribute(t.binding(\"auto-recover\"));\n }).filter(function (e) {\n return i.content.querySelector(\"form[\".concat(n, '=\"').concat(e.getAttribute(n), '\"]'));\n });\n }\n }, {\n key: \"maybePushComponentsDestroyed\",\n value: function (e) {\n var t,\n n = this,\n i = e.filter(function (e) {\n return 0 === le.findComponentNodeList(n.el, e).length;\n });\n i.length > 0 && ((t = this.pruningCIDs).push.apply(t, A(i)), this.pushWithReply(null, \"cids_will_destroy\", {\n cids: i\n }, function () {\n n.pruningCIDs = n.pruningCIDs.filter(function (e) {\n return -1 !== i.indexOf(e);\n });\n var e = i.filter(function (e) {\n return 0 === le.findComponentNodeList(n.el, e).length;\n });\n e.length > 0 && n.pushWithReply(null, \"cids_destroyed\", {\n cids: e\n }, function (e) {\n n.rendered.pruneCIDs(e.cids);\n });\n }));\n }\n }, {\n key: \"ownsElement\",\n value: function (e) {\n return e.getAttribute(\"data-phx-parent-id\") === this.id || Z(e.closest(U), function (e) {\n return e.id;\n }) === this.id;\n }\n }, {\n key: \"submitForm\",\n value: function (e, t, n) {\n var i = this;\n le.putPrivate(e, \"phx-has-submitted\", !0), this.liveSocket.blurActiveElement(this), this.pushFormSubmit(e, t, n, function () {\n i.liveSocket.restorePreviouslyActiveFocus();\n });\n }\n }, {\n key: \"binding\",\n value: function (e) {\n return this.liveSocket.binding(e);\n }\n }]), e;\n }(),\n ve = 1,\n pe = function () {\n function e(t, n, i) {\n for (var r in T(this, e), this.__view = t, this.__liveSocket = t.liveSocket, this.__callbacks = i, this.__listeners = new Set(), this.__isDisconnected = !1, this.el = n, this.viewName = t.name(), this.el.phxHookId = this.constructor.makeID(), this.__callbacks) this[r] = this.__callbacks[r];\n }\n\n return _(e, null, [{\n key: \"makeID\",\n value: function () {\n return ve++;\n }\n }, {\n key: \"elementID\",\n value: function (e) {\n return e.phxHookId;\n }\n }]), _(e, [{\n key: \"__mounted\",\n value: function () {\n this.mounted && this.mounted();\n }\n }, {\n key: \"__updated\",\n value: function () {\n this.updated && this.updated();\n }\n }, {\n key: \"__beforeUpdate\",\n value: function () {\n this.beforeUpdate && this.beforeUpdate();\n }\n }, {\n key: \"__destroyed\",\n value: function () {\n this.destroyed && this.destroyed();\n }\n }, {\n key: \"__reconnected\",\n value: function () {\n this.__isDisconnected && (this.__isDisconnected = !1, this.reconnected && this.reconnected());\n }\n }, {\n key: \"__disconnected\",\n value: function () {\n this.__isDisconnected = !0, this.disconnected && this.disconnected();\n }\n }, {\n key: \"pushEvent\",\n value: function (e) {\n var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {},\n n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : function () {};\n return this.__view.pushHookEvent(null, e, t, n);\n }\n }, {\n key: \"pushEventTo\",\n value: function (e, t) {\n var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {},\n i = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : function () {};\n return this.__view.withinTargets(e, function (e, r) {\n return e.pushHookEvent(r, t, n, i);\n });\n }\n }, {\n key: \"handleEvent\",\n value: function (e, t) {\n var n = function (n, i) {\n return i ? e : t(n.detail);\n };\n\n return window.addEventListener(\"phx:hook:\".concat(e), n), this.__listeners.add(n), n;\n }\n }, {\n key: \"removeHandleEvent\",\n value: function (e) {\n var t = e(null, !0);\n window.removeEventListener(\"phx:hook:\".concat(t), e), this.__listeners.delete(e);\n }\n }, {\n key: \"__cleanup__\",\n value: function () {\n var e = this;\n\n this.__listeners.forEach(function (t) {\n return e.removeHandleEvent(t);\n });\n }\n }]), e;\n }();\n\n t.default = se;\n }, function (e, t) {\n var n;\n\n n = function () {\n return this;\n }();\n\n try {\n n = n || Function(\"return this\")() || (0, eval)(\"this\");\n } catch (e) {\n \"object\" == typeof window && (n = window);\n }\n\n e.exports = n;\n }, function (e, t, n) {\n (function (t) {\n t.Phoenix || (t.Phoenix = {}), e.exports = t.Phoenix.LiveView = n(0);\n }).call(this, n(1));\n }]);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9wcml2L3N0YXRpYy9waG9lbml4X2xpdmVfdmlldy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L3ByaXYvc3RhdGljL3Bob2VuaXhfbGl2ZV92aWV3LmpzPzJjOTAiXSwic291cmNlc0NvbnRlbnQiOlsiIWZ1bmN0aW9uKGUsdCl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9dCgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sdCk6XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0cy5waG9lbml4X2xpdmVfdmlldz10KCk6ZS5waG9lbml4X2xpdmVfdmlldz10KCl9KHRoaXMsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9e307ZnVuY3Rpb24gbihpKXtpZih0W2ldKXJldHVybiB0W2ldLmV4cG9ydHM7dmFyIHI9dFtpXT17aTppLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIGVbaV0uY2FsbChyLmV4cG9ydHMscixyLmV4cG9ydHMsbiksci5sPSEwLHIuZXhwb3J0c31yZXR1cm4gbi5tPWUsbi5jPXQsbi5kPWZ1bmN0aW9uKGUsdCxpKXtuLm8oZSx0KXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITAsZ2V0Oml9KX0sbi5yPWZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfSxuLm49ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIG4uZCh0LFwiYVwiLHQpLHR9LG4ubz1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX0sbi5wPVwiXCIsbihuLnM9Mil9KFtmdW5jdGlvbihlLHQsbil7XCJ1c2Ugc3RyaWN0XCI7bi5yKHQpO3ZhciBpLHI9MTE7dmFyIG89XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCIsYT1cInVuZGVmaW5lZFwiPT10eXBlb2YgZG9jdW1lbnQ/dm9pZCAwOmRvY3VtZW50LHU9ISFhJiZcImNvbnRlbnRcImluIGEuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpLHM9ISFhJiZhLmNyZWF0ZVJhbmdlJiZcImNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudFwiaW4gYS5jcmVhdGVSYW5nZSgpO2Z1bmN0aW9uIGMoZSl7cmV0dXJuIGU9ZS50cmltKCksdT9mdW5jdGlvbihlKXt2YXIgdD1hLmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtyZXR1cm4gdC5pbm5lckhUTUw9ZSx0LmNvbnRlbnQuY2hpbGROb2Rlc1swXX0oZSk6cz9mdW5jdGlvbihlKXtyZXR1cm4gaXx8KGk9YS5jcmVhdGVSYW5nZSgpKS5zZWxlY3ROb2RlKGEuYm9keSksaS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoZSkuY2hpbGROb2Rlc1swXX0oZSk6ZnVuY3Rpb24oZSl7dmFyIHQ9YS5jcmVhdGVFbGVtZW50KFwiYm9keVwiKTtyZXR1cm4gdC5pbm5lckhUTUw9ZSx0LmNoaWxkTm9kZXNbMF19KGUpfWZ1bmN0aW9uIGwoZSx0KXt2YXIgbixpLHI9ZS5ub2RlTmFtZSxvPXQubm9kZU5hbWU7cmV0dXJuIHI9PT1vfHwobj1yLmNoYXJDb2RlQXQoMCksaT1vLmNoYXJDb2RlQXQoMCksbjw9OTAmJmk+PTk3P3I9PT1vLnRvVXBwZXJDYXNlKCk6aTw9OTAmJm4+PTk3JiZvPT09ci50b1VwcGVyQ2FzZSgpKX1mdW5jdGlvbiBkKGUsdCxuKXtlW25dIT09dFtuXSYmKGVbbl09dFtuXSxlW25dP2Uuc2V0QXR0cmlidXRlKG4sXCJcIik6ZS5yZW1vdmVBdHRyaWJ1dGUobikpfXZhciBoPXtPUFRJT046ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnBhcmVudE5vZGU7aWYobil7dmFyIGk9bi5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO1wiT1BUR1JPVVBcIj09PWkmJihpPShuPW4ucGFyZW50Tm9kZSkmJm4ubm9kZU5hbWUudG9VcHBlckNhc2UoKSksXCJTRUxFQ1RcIiE9PWl8fG4uaGFzQXR0cmlidXRlKFwibXVsdGlwbGVcIil8fChlLmhhc0F0dHJpYnV0ZShcInNlbGVjdGVkXCIpJiYhdC5zZWxlY3RlZCYmKGUuc2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIixcInNlbGVjdGVkXCIpLGUucmVtb3ZlQXR0cmlidXRlKFwic2VsZWN0ZWRcIikpLG4uc2VsZWN0ZWRJbmRleD0tMSl9ZChlLHQsXCJzZWxlY3RlZFwiKX0sSU5QVVQ6ZnVuY3Rpb24oZSx0KXtkKGUsdCxcImNoZWNrZWRcIiksZChlLHQsXCJkaXNhYmxlZFwiKSxlLnZhbHVlIT09dC52YWx1ZSYmKGUudmFsdWU9dC52YWx1ZSksdC5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKXx8ZS5yZW1vdmVBdHRyaWJ1dGUoXCJ2YWx1ZVwiKX0sVEVYVEFSRUE6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LnZhbHVlO2UudmFsdWUhPT1uJiYoZS52YWx1ZT1uKTt2YXIgaT1lLmZpcnN0Q2hpbGQ7aWYoaSl7dmFyIHI9aS5ub2RlVmFsdWU7aWYocj09bnx8IW4mJnI9PWUucGxhY2Vob2xkZXIpcmV0dXJuO2kubm9kZVZhbHVlPW59fSxTRUxFQ1Q6ZnVuY3Rpb24oZSx0KXtpZighdC5oYXNBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSl7Zm9yKHZhciBuLGkscj0tMSxvPTAsYT1lLmZpcnN0Q2hpbGQ7YTspaWYoXCJPUFRHUk9VUFwiPT09KGk9YS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpKSlhPShuPWEpLmZpcnN0Q2hpbGQ7ZWxzZXtpZihcIk9QVElPTlwiPT09aSl7aWYoYS5oYXNBdHRyaWJ1dGUoXCJzZWxlY3RlZFwiKSl7cj1vO2JyZWFrfW8rK30hKGE9YS5uZXh0U2libGluZykmJm4mJihhPW4ubmV4dFNpYmxpbmcsbj1udWxsKX1lLnNlbGVjdGVkSW5kZXg9cn19fSxmPTEsdj0xMSxwPTMsZz04O2Z1bmN0aW9uIG0oKXt9ZnVuY3Rpb24geShlKXtpZihlKXJldHVybiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoXCJpZFwiKXx8ZS5pZH12YXIgYj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxuLGkpe2lmKGl8fChpPXt9KSxcInN0cmluZ1wiPT10eXBlb2YgbilpZihcIiNkb2N1bWVudFwiPT09dC5ub2RlTmFtZXx8XCJIVE1MXCI9PT10Lm5vZGVOYW1lfHxcIkJPRFlcIj09PXQubm9kZU5hbWUpe3ZhciByPW47KG49YS5jcmVhdGVFbGVtZW50KFwiaHRtbFwiKSkuaW5uZXJIVE1MPXJ9ZWxzZSBuPWMobik7dmFyIHU9aS5nZXROb2RlS2V5fHx5LHM9aS5vbkJlZm9yZU5vZGVBZGRlZHx8bSxkPWkub25Ob2RlQWRkZWR8fG0sYj1pLm9uQmVmb3JlRWxVcGRhdGVkfHxtLGs9aS5vbkVsVXBkYXRlZHx8bSx3PWkub25CZWZvcmVOb2RlRGlzY2FyZGVkfHxtLEU9aS5vbk5vZGVEaXNjYXJkZWR8fG0sQT1pLm9uQmVmb3JlRWxDaGlsZHJlblVwZGF0ZWR8fG0sUz0hMD09PWkuY2hpbGRyZW5Pbmx5LHg9T2JqZWN0LmNyZWF0ZShudWxsKSxDPVtdO2Z1bmN0aW9uIFAoZSl7Qy5wdXNoKGUpfWZ1bmN0aW9uIEwoZSx0LG4peyExIT09dyhlKSYmKHQmJnQucmVtb3ZlQ2hpbGQoZSksRShlKSxmdW5jdGlvbiBlKHQsbil7aWYodC5ub2RlVHlwZT09PWYpZm9yKHZhciBpPXQuZmlyc3RDaGlsZDtpOyl7dmFyIHI9dm9pZCAwO24mJihyPXUoaSkpP1Aocik6KEUoaSksaS5maXJzdENoaWxkJiZlKGksbikpLGk9aS5uZXh0U2libGluZ319KGUsbikpfWZ1bmN0aW9uIEkoZSl7ZChlKTtmb3IodmFyIHQ9ZS5maXJzdENoaWxkO3Q7KXt2YXIgbj10Lm5leHRTaWJsaW5nLGk9dSh0KTtpZihpKXt2YXIgcj14W2ldO3ImJmwodCxyKT8odC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChyLHQpLFQocix0KSk6SSh0KX1lbHNlIEkodCk7dD1ufX1mdW5jdGlvbiBUKHQsbixpKXt2YXIgcj11KG4pO2lmKHImJmRlbGV0ZSB4W3JdLCFpKXtpZighMT09PWIodCxuKSlyZXR1cm47aWYoZSh0LG4pLGsodCksITE9PT1BKHQsbikpcmV0dXJufVwiVEVYVEFSRUFcIiE9PXQubm9kZU5hbWU/ZnVuY3Rpb24oZSx0KXt2YXIgbixpLHIsbyxjLGQ9dC5maXJzdENoaWxkLHY9ZS5maXJzdENoaWxkO2U6Zm9yKDtkOyl7Zm9yKG89ZC5uZXh0U2libGluZyxuPXUoZCk7djspe2lmKHI9di5uZXh0U2libGluZyxkLmlzU2FtZU5vZGUmJmQuaXNTYW1lTm9kZSh2KSl7ZD1vLHY9cjtjb250aW51ZSBlfWk9dSh2KTt2YXIgbT12Lm5vZGVUeXBlLHk9dm9pZCAwO2lmKG09PT1kLm5vZGVUeXBlJiYobT09PWY/KG4/biE9PWkmJigoYz14W25dKT9yPT09Yz95PSExOihlLmluc2VydEJlZm9yZShjLHYpLGk/UChpKTpMKHYsZSwhMCksdj1jKTp5PSExKTppJiYoeT0hMSksKHk9ITEhPT15JiZsKHYsZCkpJiZUKHYsZCkpOm0hPT1wJiZtIT1nfHwoeT0hMCx2Lm5vZGVWYWx1ZSE9PWQubm9kZVZhbHVlJiYodi5ub2RlVmFsdWU9ZC5ub2RlVmFsdWUpKSkseSl7ZD1vLHY9cjtjb250aW51ZSBlfWk/UChpKTpMKHYsZSwhMCksdj1yfWlmKG4mJihjPXhbbl0pJiZsKGMsZCkpZS5hcHBlbmRDaGlsZChjKSxUKGMsZCk7ZWxzZXt2YXIgYj1zKGQpOyExIT09YiYmKGImJihkPWIpLGQuYWN0dWFsaXplJiYoZD1kLmFjdHVhbGl6ZShlLm93bmVyRG9jdW1lbnR8fGEpKSxlLmFwcGVuZENoaWxkKGQpLEkoZCkpfWQ9byx2PXJ9IWZ1bmN0aW9uKGUsdCxuKXtmb3IoO3Q7KXt2YXIgaT10Lm5leHRTaWJsaW5nOyhuPXUodCkpP1Aobik6TCh0LGUsITApLHQ9aX19KGUsdixpKTt2YXIgaz1oW2Uubm9kZU5hbWVdO2smJmsoZSx0KX0odCxuKTpoLlRFWFRBUkVBKHQsbil9IWZ1bmN0aW9uIGUodCl7aWYodC5ub2RlVHlwZT09PWZ8fHQubm9kZVR5cGU9PT12KWZvcih2YXIgbj10LmZpcnN0Q2hpbGQ7bjspe3ZhciBpPXUobik7aSYmKHhbaV09biksZShuKSxuPW4ubmV4dFNpYmxpbmd9fSh0KTt2YXIgRD10LF89RC5ub2RlVHlwZSxOPW4ubm9kZVR5cGU7aWYoIVMpaWYoXz09PWYpTj09PWY/bCh0LG4pfHwoRSh0KSxEPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWUuZmlyc3RDaGlsZDtuOyl7dmFyIGk9bi5uZXh0U2libGluZzt0LmFwcGVuZENoaWxkKG4pLG49aX1yZXR1cm4gdH0odCxmdW5jdGlvbihlLHQpe3JldHVybiB0JiZ0IT09bz9hLmNyZWF0ZUVsZW1lbnROUyh0LGUpOmEuY3JlYXRlRWxlbWVudChlKX0obi5ub2RlTmFtZSxuLm5hbWVzcGFjZVVSSSkpKTpEPW47ZWxzZSBpZihfPT09cHx8Xz09PWcpe2lmKE49PT1fKXJldHVybiBELm5vZGVWYWx1ZSE9PW4ubm9kZVZhbHVlJiYoRC5ub2RlVmFsdWU9bi5ub2RlVmFsdWUpLEQ7RD1ufWlmKEQ9PT1uKUUodCk7ZWxzZXtpZihuLmlzU2FtZU5vZGUmJm4uaXNTYW1lTm9kZShEKSlyZXR1cm47aWYoVChELG4sUyksQylmb3IodmFyIFI9MCxPPUMubGVuZ3RoO1I8TztSKyspe3ZhciBqPXhbQ1tSXV07aiYmTChqLGoucGFyZW50Tm9kZSwhMSl9fXJldHVybiFTJiZEIT09dCYmdC5wYXJlbnROb2RlJiYoRC5hY3R1YWxpemUmJihEPUQuYWN0dWFsaXplKHQub3duZXJEb2N1bWVudHx8YSkpLHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoRCx0KSksRH19KGZ1bmN0aW9uKGUsdCl7dmFyIG4saSxvLGEsdT10LmF0dHJpYnV0ZXM7aWYodC5ub2RlVHlwZSE9PXImJmUubm9kZVR5cGUhPT1yKXtmb3IodmFyIHM9dS5sZW5ndGgtMTtzPj0wO3MtLSlpPShuPXVbc10pLm5hbWUsbz1uLm5hbWVzcGFjZVVSSSxhPW4udmFsdWUsbz8oaT1uLmxvY2FsTmFtZXx8aSxlLmdldEF0dHJpYnV0ZU5TKG8saSkhPT1hJiYoXCJ4bWxuc1wiPT09bi5wcmVmaXgmJihpPW4ubmFtZSksZS5zZXRBdHRyaWJ1dGVOUyhvLGksYSkpKTplLmdldEF0dHJpYnV0ZShpKSE9PWEmJmUuc2V0QXR0cmlidXRlKGksYSk7Zm9yKHZhciBjPWUuYXR0cmlidXRlcyxsPWMubGVuZ3RoLTE7bD49MDtsLS0paT0obj1jW2xdKS5uYW1lLChvPW4ubmFtZXNwYWNlVVJJKT8oaT1uLmxvY2FsTmFtZXx8aSx0Lmhhc0F0dHJpYnV0ZU5TKG8saSl8fGUucmVtb3ZlQXR0cmlidXRlTlMobyxpKSk6dC5oYXNBdHRyaWJ1dGUoaSl8fGUucmVtb3ZlQXR0cmlidXRlKGkpfX0pO2Z1bmN0aW9uIGsoZSl7cmV0dXJuIFAoZSl8fFMoZSl8fEwoZSl8fEMoKX1mdW5jdGlvbiB3KGUsdCl7dmFyIG49T2JqZWN0LmtleXMoZSk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIGk9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTt0JiYoaT1pLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpLmVudW1lcmFibGV9KSksbi5wdXNoLmFwcGx5KG4saSl9cmV0dXJuIG59ZnVuY3Rpb24gRShlLHQsbil7cmV0dXJuIHQgaW4gZT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6ZVt0XT1uLGV9ZnVuY3Rpb24gQShlKXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gSShlKX0oZSl8fFMoZSl8fEwoZSl8fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9KCl9ZnVuY3Rpb24gUyhlKXtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKXJldHVybiBBcnJheS5mcm9tKGUpfWZ1bmN0aW9uIHgoZSx0KXtyZXR1cm4gUChlKXx8ZnVuY3Rpb24oZSx0KXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgU3ltYm9sfHwhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpKXJldHVybjt2YXIgbj1bXSxpPSEwLHI9ITEsbz12b2lkIDA7dHJ5e2Zvcih2YXIgYSx1PWVbU3ltYm9sLml0ZXJhdG9yXSgpOyEoaT0oYT11Lm5leHQoKSkuZG9uZSkmJihuLnB1c2goYS52YWx1ZSksIXR8fG4ubGVuZ3RoIT09dCk7aT0hMCk7fWNhdGNoKGUpe3I9ITAsbz1lfWZpbmFsbHl7dHJ5e2l8fG51bGw9PXUucmV0dXJufHx1LnJldHVybigpfWZpbmFsbHl7aWYocil0aHJvdyBvfX1yZXR1cm4gbn0oZSx0KXx8TChlLHQpfHxDKCl9ZnVuY3Rpb24gQygpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9ZnVuY3Rpb24gUChlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlfWZ1bmN0aW9uIEwoZSx0KXtpZihlKXtpZihcInN0cmluZ1wiPT10eXBlb2YgZSlyZXR1cm4gSShlLHQpO3ZhciBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKTtyZXR1cm5cIk9iamVjdFwiPT09biYmZS5jb25zdHJ1Y3RvciYmKG49ZS5jb25zdHJ1Y3Rvci5uYW1lKSxcIk1hcFwiPT09bnx8XCJTZXRcIj09PW4/QXJyYXkuZnJvbShlKTpcIkFyZ3VtZW50c1wiPT09bnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3Qobik/SShlLHQpOnZvaWQgMH19ZnVuY3Rpb24gSShlLHQpeyhudWxsPT10fHx0PmUubGVuZ3RoKSYmKHQ9ZS5sZW5ndGgpO2Zvcih2YXIgbj0wLGk9bmV3IEFycmF5KHQpO248dDtuKyspaVtuXT1lW25dO3JldHVybiBpfWZ1bmN0aW9uIFQoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIEQoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIGk9dFtuXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMSxpLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBpJiYoaS53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsaS5rZXksaSl9fWZ1bmN0aW9uIF8oZSx0LG4pe3JldHVybiB0JiZEKGUucHJvdG90eXBlLHQpLG4mJkQoZSxuKSxlfWZ1bmN0aW9uIE4oZSl7XCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO3JldHVybihOPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIGV9KShlKX1uLmQodCxcImRlYnVnXCIsZnVuY3Rpb24oKXtyZXR1cm4gS30pLG4uZCh0LFwiUmVuZGVyZWRcIixmdW5jdGlvbigpe3JldHVybiB1ZX0pLG4uZCh0LFwiTGl2ZVNvY2tldFwiLGZ1bmN0aW9uKCl7cmV0dXJuIHNlfSksbi5kKHQsXCJCcm93c2VyXCIsZnVuY3Rpb24oKXtyZXR1cm4gY2V9KSxuLmQodCxcIkRPTVwiLGZ1bmN0aW9uKCl7cmV0dXJuIGxlfSksbi5kKHQsXCJWaWV3XCIsZnVuY3Rpb24oKXtyZXR1cm4gZmV9KTt2YXIgUj1bMWUzLDNlM10sTz1cImRhdGEtcGh4LXZpZXdcIixqPVtcInBoeC1jbGljay1sb2FkaW5nXCIsXCJwaHgtY2hhbmdlLWxvYWRpbmdcIixcInBoeC1zdWJtaXQtbG9hZGluZ1wiLFwicGh4LWtleWRvd24tbG9hZGluZ1wiLFwicGh4LWtleXVwLWxvYWRpbmdcIixcInBoeC1ibHVyLWxvYWRpbmdcIixcInBoeC1mb2N1cy1sb2FkaW5nXCJdLEg9XCJkYXRhLXBoeC1jb21wb25lbnRcIixGPVwiZGF0YS1waHgtcmVmXCIsTT1cImRhdGEtcGh4LXVwbG9hZC1yZWZcIixVPVwiW1wiLmNvbmNhdChPLFwiXVwiKSxCPVtcInRleHRcIixcInRleHRhcmVhXCIsXCJudW1iZXJcIixcImVtYWlsXCIsXCJwYXNzd29yZFwiLFwic2VhcmNoXCIsXCJ0ZWxcIixcInVybFwiLFwiZGF0ZVwiLFwidGltZVwiXSxKPVtcImNoZWNrYm94XCIsXCJyYWRpb1wiXSxWPTEsVz1cInBoeC1cIixxPXtkZWJvdW5jZTozMDAsdGhyb3R0bGU6MzAwfSx6PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGNvbnNvbGUuZXJyb3ImJmNvbnNvbGUuZXJyb3IoZSx0KX07dmFyIEs9ZnVuY3Rpb24oZSx0LG4saSl7ZS5saXZlU29ja2V0LmlzRGVidWdFbmFibGVkKCkmJmNvbnNvbGUubG9nKFwiXCIuY29uY2F0KGUuaWQsXCIgXCIpLmNvbmNhdCh0LFwiOiBcIikuY29uY2F0KG4sXCIgLSBcIiksaSl9LFg9ZnVuY3Rpb24oZSl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgZT9lOmZ1bmN0aW9uKCl7cmV0dXJuIGV9fSwkPWZ1bmN0aW9uKGUpe3JldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUpKX0sRz1mdW5jdGlvbihlLHQsbil7ZG97aWYoZS5tYXRjaGVzKFwiW1wiLmNvbmNhdCh0LFwiXVwiKSkpcmV0dXJuIGU7ZT1lLnBhcmVudEVsZW1lbnR8fGUucGFyZW50Tm9kZX13aGlsZShudWxsIT09ZSYmMT09PWUubm9kZVR5cGUmJiEobiYmbi5pc1NhbWVOb2RlKGUpfHxlLm1hdGNoZXMoVSkpKTtyZXR1cm4gbnVsbH0sWT1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9PWUmJlwib2JqZWN0XCI9PT1OKGUpJiYhKGUgaW5zdGFuY2VvZiBBcnJheSl9LFE9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0IGluIGUpcmV0dXJuITE7cmV0dXJuITB9LFo9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmdChlKX0sZWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsbixpKXtUKHRoaXMsZSksdGhpcy5yZWY9aWUuZ2VuRmlsZVJlZihuKSx0aGlzLmZpbGVFbD10LHRoaXMuZmlsZT1uLHRoaXMudmlldz1pLHRoaXMubWV0YT1udWxsLHRoaXMuX2lzQ2FuY2VsbGVkPSExLHRoaXMuX2lzRG9uZT0hMSx0aGlzLl9wcm9ncmVzcz0wLHRoaXMuX29uRG9uZT1mdW5jdGlvbigpe319cmV0dXJuIF8oZSxudWxsLFt7a2V5OlwiaXNBY3RpdmVcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXZvaWQgMD09PXQuX3BoeFJlZixpPWUuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtYWN0aXZlLXJlZnNcIikuc3BsaXQoXCIsXCIpLmluZGV4T2YoaWUuZ2VuRmlsZVJlZih0KSk+PTA7cmV0dXJuIHQuc2l6ZT4wJiYobnx8aSl9fSx7a2V5OlwiaXNQcmVmbGlnaHRlZFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1wcmVmbGlnaHRlZC1yZWZzXCIpLnNwbGl0KFwiLFwiKS5pbmRleE9mKGllLmdlbkZpbGVSZWYodCkpPj0wO3JldHVybiBuJiZ0aGlzLmlzQWN0aXZlKGUsdCl9fV0pLF8oZSxbe2tleTpcIm1ldGFkYXRhXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZXRhfX0se2tleTpcInByb2dyZXNzXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLl9wcm9ncmVzcz1NYXRoLmZsb29yKGUpLHRoaXMuX3Byb2dyZXNzPj0xMDA/KHRoaXMuX3Byb2dyZXNzPTEwMCx0aGlzLl9pc0RvbmU9ITAsdGhpcy52aWV3LnB1c2hGaWxlUHJvZ3Jlc3ModGhpcy5maWxlRWwsdGhpcy5yZWYsMTAwLGZ1bmN0aW9uKCl7aWUudW50cmFja0ZpbGUodC5maWxlRWwsdC5maWxlKSx0Ll9vbkRvbmUoKX0pKTp0aGlzLnZpZXcucHVzaEZpbGVQcm9ncmVzcyh0aGlzLmZpbGVFbCx0aGlzLnJlZix0aGlzLl9wcm9ncmVzcyl9fSx7a2V5OlwiY2FuY2VsXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLl9pc0NhbmNlbGxlZD0hMCx0aGlzLl9pc0RvbmU9ITAsdGhpcy5fb25Eb25lKCl9fSx7a2V5OlwiaXNEb25lXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNEb25lfX0se2tleTpcImVycm9yXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06XCJmYWlsZWRcIjt0aGlzLnZpZXcucHVzaEZpbGVQcm9ncmVzcyh0aGlzLmZpbGVFbCx0aGlzLnJlZix7ZXJyb3I6ZX0pfX0se2tleTpcIm9uRG9uZVwiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuX29uRG9uZT1lfX0se2tleTpcInRvUHJlZmxpZ2h0UGF5bG9hZFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue2xhc3RfbW9kaWZpZWQ6dGhpcy5maWxlLmxhc3RNb2RpZmllZCxuYW1lOnRoaXMuZmlsZS5uYW1lLHNpemU6dGhpcy5maWxlLnNpemUsdHlwZTp0aGlzLmZpbGUudHlwZSxyZWY6dGhpcy5yZWZ9fX0se2tleTpcInVwbG9hZGVyXCIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYodGhpcy5tZXRhLnVwbG9hZGVyKXt2YXIgdD1lW3RoaXMubWV0YS51cGxvYWRlcl18fHooXCJubyB1cGxvYWRlciBjb25maWd1cmVkIGZvciBcIi5jb25jYXQodGhpcy5tZXRhLnVwbG9hZGVyKSk7cmV0dXJue25hbWU6dGhpcy5tZXRhLnVwbG9hZGVyLGNhbGxiYWNrOnR9fXJldHVybntuYW1lOlwiY2hhbm5lbFwiLGNhbGxiYWNrOnJlfX19LHtrZXk6XCJ6aXBQb3N0RmxpZ2h0XCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5tZXRhPWUuZW50cmllc1t0aGlzLnJlZl0sdGhpcy5tZXRhfHx6KFwibm8gcHJlZmxpZ2h0IHVwbG9hZCByZXNwb25zZSByZXR1cm5lZCB3aXRoIHJlZiBcIi5jb25jYXQodGhpcy5yZWYpLHtpbnB1dDp0aGlzLmZpbGVFbCxyZXNwb25zZTplfSl9fV0pLGV9KCksdGU9e0xpdmVGaWxlVXBsb2FkOntwcmVmbGlnaHRlZFJlZnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1wcmVmbGlnaHRlZC1yZWZzXCIpfSxtb3VudGVkOmZ1bmN0aW9uKCl7dGhpcy5wcmVmbGlnaHRlZFdhcz10aGlzLnByZWZsaWdodGVkUmVmcygpfSx1cGRhdGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcmVmbGlnaHRlZFJlZnMoKTt0aGlzLnByZWZsaWdodGVkV2FzIT09ZSYmKHRoaXMucHJlZmxpZ2h0ZWRXYXM9ZSxcIlwiPT09ZSYmdGhpcy5fX3ZpZXcuY2FuY2VsU3VibWl0KHRoaXMuZWwuZm9ybSkpfX19O3RlLkxpdmVJbWdQcmV2aWV3PXttb3VudGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLnJlZj10aGlzLmVsLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LWVudHJ5LXJlZlwiKSx0aGlzLmlucHV0RWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5lbC5nZXRBdHRyaWJ1dGUoTSkpLGllLmdldEVudHJ5RGF0YVVSTCh0aGlzLmlucHV0RWwsdGhpcy5yZWYsZnVuY3Rpb24odCl7cmV0dXJuIGUuZWwuc3JjPXR9KX19O3ZhciBuZT0wLGllPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0LG4saSl7VCh0aGlzLGUpLHRoaXMudmlldz1uLHRoaXMub25Db21wbGV0ZT1pLHRoaXMuX2VudHJpZXM9QXJyYXkuZnJvbShlLmZpbGVzQXdhaXRpbmdQcmVmbGlnaHQodCl8fFtdKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBlZSh0LGUsbil9KSx0aGlzLm51bUVudHJpZXNJblByb2dyZXNzPXRoaXMuX2VudHJpZXMubGVuZ3RofXJldHVybiBfKGUsbnVsbCxbe2tleTpcImdlbkZpbGVSZWZcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lLl9waHhSZWY7cmV0dXJuIHZvaWQgMCE9PXQ/dDooZS5fcGh4UmVmPShuZSsrKS50b1N0cmluZygpLGUuX3BoeFJlZil9fSx7a2V5OlwiZ2V0RW50cnlEYXRhVVJMXCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXMscj10aGlzLmFjdGl2ZUZpbGVzKGUpLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGkuZ2VuRmlsZVJlZihlKT09PXR9KSxvPW5ldyBGaWxlUmVhZGVyO28ub25sb2FkPWZ1bmN0aW9uKGUpe3JldHVybiBuKGUudGFyZ2V0LnJlc3VsdCl9LG8ucmVhZEFzRGF0YVVSTChyKX19LHtrZXk6XCJoYXNVcGxvYWRzSW5Qcm9ncmVzc1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PTA7cmV0dXJuIGxlLmZpbmRVcGxvYWRJbnB1dHMoZSkuZm9yRWFjaChmdW5jdGlvbihlKXtlLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LXByZWZsaWdodGVkLXJlZnNcIikhPT1lLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LWRvbmUtcmVmc1wiKSYmdCsrfSksdD4wfX0se2tleTpcInNlcmlhbGl6ZVVwbG9hZHNcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49e307cmV0dXJuIHRoaXMuYWN0aXZlRmlsZXMoZSxcInNlcmlhbGl6ZVwiKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe3ZhciByPXtwYXRoOmUubmFtZX0sbz1lLmdldEF0dHJpYnV0ZShNKTtuW29dPW5bb118fFtdLHIucmVmPXQuZ2VuRmlsZVJlZihpKSxyLm5hbWU9aS5uYW1lLHIudHlwZT1pLnR5cGUsci5zaXplPWkuc2l6ZSxuW29dLnB1c2gocil9KSxufX0se2tleTpcImNsZWFyRmlsZXNcIix2YWx1ZTpmdW5jdGlvbihlKXtlLnZhbHVlPW51bGwsbGUucHV0UHJpdmF0ZShlLFwiZmlsZXNcIixbXSl9fSx7a2V5OlwidW50cmFja0ZpbGVcIix2YWx1ZTpmdW5jdGlvbihlLHQpe2xlLnB1dFByaXZhdGUoZSxcImZpbGVzXCIsbGUucHJpdmF0ZShlLFwiZmlsZXNcIikuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFPYmplY3QuaXMoZSx0KX0pKX19LHtrZXk6XCJ0cmFja0ZpbGVzXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2lmKG51bGwhPT1lLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpKXt2YXIgaT10LmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4hbi5hY3RpdmVGaWxlcyhlKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuaXMoZSx0KX0pfSk7bGUucHV0UHJpdmF0ZShlLFwiZmlsZXNcIix0aGlzLmFjdGl2ZUZpbGVzKGUpLmNvbmNhdChpKSksZS52YWx1ZT1udWxsfWVsc2UgbGUucHV0UHJpdmF0ZShlLFwiZmlsZXNcIix0KX19LHtrZXk6XCJhY3RpdmVGaWxlSW5wdXRzXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPWxlLmZpbmRVcGxvYWRJbnB1dHMoZSk7cmV0dXJuIEFycmF5LmZyb20obikuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLmZpbGVzJiZ0LmFjdGl2ZUZpbGVzKGUpLmxlbmd0aD4wfSl9fSx7a2V5OlwiYWN0aXZlRmlsZXNcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4obGUucHJpdmF0ZShlLFwiZmlsZXNcIil8fFtdKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIGVlLmlzQWN0aXZlKGUsdCl9KX19LHtrZXk6XCJpbnB1dHNBd2FpdGluZ1ByZWZsaWdodFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1sZS5maW5kVXBsb2FkSW5wdXRzKGUpO3JldHVybiBBcnJheS5mcm9tKG4pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gdC5maWxlc0F3YWl0aW5nUHJlZmxpZ2h0KGUpLmxlbmd0aD4wfSl9fSx7a2V5OlwiZmlsZXNBd2FpdGluZ1ByZWZsaWdodFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmFjdGl2ZUZpbGVzKGUpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4hZWUuaXNQcmVmbGlnaHRlZChlLHQpfSl9fV0pLF8oZSxbe2tleTpcImVudHJpZXNcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbnRyaWVzfX0se2tleTpcImluaXRBZGFwdGVyVXBsb2FkXCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXM7dGhpcy5fZW50cmllcz10aGlzLl9lbnRyaWVzLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC56aXBQb3N0RmxpZ2h0KGUpLHQub25Eb25lKGZ1bmN0aW9uKCl7aS5udW1FbnRyaWVzSW5Qcm9ncmVzcy0tLDA9PT1pLm51bUVudHJpZXNJblByb2dyZXNzJiZpLm9uQ29tcGxldGUoKX0pLHR9KTt2YXIgcj10aGlzLl9lbnRyaWVzLnJlZHVjZShmdW5jdGlvbihlLHQpe3ZhciBpPXQudXBsb2FkZXIobi51cGxvYWRlcnMpLHI9aS5uYW1lLG89aS5jYWxsYmFjaztyZXR1cm4gZVtyXT1lW3JdfHx7Y2FsbGJhY2s6byxlbnRyaWVzOltdfSxlW3JdLmVudHJpZXMucHVzaCh0KSxlfSx7fSk7Zm9yKHZhciBvIGluIHIpe3ZhciBhPXJbb107KDAsYS5jYWxsYmFjaykoYS5lbnRyaWVzLHQsZSxuKX19fV0pLGV9KCkscmU9ZnVuY3Rpb24oZSx0LG4saSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe25ldyBvZShlLG4uY29uZmlnLmNodW5rX3NpemUsaSkudXBsb2FkKCl9KX0sb2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsbixpKXtUKHRoaXMsZSksdGhpcy5saXZlU29ja2V0PWksdGhpcy5lbnRyeT10LHRoaXMub2Zmc2V0PTAsdGhpcy5jaHVua1NpemU9bix0aGlzLnVwbG9hZENoYW5uZWw9aS5jaGFubmVsKFwibHZ1OlwiLmNvbmNhdCh0LnJlZikse3Rva2VuOnQubWV0YWRhdGEoKX0pfXJldHVybiBfKGUsW3trZXk6XCJ1cGxvYWRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy51cGxvYWRDaGFubmVsLmpvaW4oKS5yZWNlaXZlKFwib2tcIixmdW5jdGlvbih0KXtyZXR1cm4gZS5yZWFkTmV4dENodW5rKCl9KS5yZWNlaXZlKFwiZXJyb3JcIixmdW5jdGlvbih0KXtlLnVwbG9hZENoYW5uZWwubGVhdmUoKSxlLmVudHJ5LmVycm9yKCl9KX19LHtrZXk6XCJpc0RvbmVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9mZnNldD49dGhpcy5lbnRyeS5maWxlLnNpemV9fSx7a2V5OlwicmVhZE5leHRDaHVua1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PW5ldyB3aW5kb3cuRmlsZVJlYWRlcixuPXRoaXMuZW50cnkuZmlsZS5zbGljZSh0aGlzLm9mZnNldCx0aGlzLmNodW5rU2l6ZSt0aGlzLm9mZnNldCk7dC5vbmxvYWQ9ZnVuY3Rpb24odCl7aWYobnVsbCE9PXQudGFyZ2V0LmVycm9yKXJldHVybiB6KFwiUmVhZCBlcnJvcjogXCIrdC50YXJnZXQuZXJyb3IpO2Uub2Zmc2V0Kz10LnRhcmdldC5yZXN1bHQuYnl0ZUxlbmd0aCxlLnB1c2hDaHVuayh0LnRhcmdldC5yZXN1bHQpfSx0LnJlYWRBc0FycmF5QnVmZmVyKG4pfX0se2tleTpcInB1c2hDaHVua1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy51cGxvYWRDaGFubmVsLmlzSm9pbmVkKCkmJnRoaXMudXBsb2FkQ2hhbm5lbC5wdXNoKFwiY2h1bmtcIixlKS5yZWNlaXZlKFwib2tcIixmdW5jdGlvbigpe3QuZW50cnkucHJvZ3Jlc3ModC5vZmZzZXQvdC5lbnRyeS5maWxlLnNpemUqMTAwKSx0LmlzRG9uZSgpfHxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIHQucmVhZE5leHRDaHVuaygpfSx0LmxpdmVTb2NrZXQuZ2V0TGF0ZW5jeVNpbSgpfHwwKX0pfX1dKSxlfSgpLGFlPWZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxuPW5ldyBGb3JtRGF0YShlKSxpPVtdO24uZm9yRWFjaChmdW5jdGlvbihlLHQsbil7ZSBpbnN0YW5jZW9mIEZpbGUmJmkucHVzaCh0KX0pLGkuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gbi5kZWxldGUoZSl9KTt2YXIgcixvPW5ldyBVUkxTZWFyY2hQYXJhbXMsYT1mdW5jdGlvbihlKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgU3ltYm9sfHxudWxsPT1lW1N5bWJvbC5pdGVyYXRvcl0pe2lmKEFycmF5LmlzQXJyYXkoZSl8fChlPUwoZSkpKXt2YXIgdD0wLG49ZnVuY3Rpb24oKXt9O3JldHVybntzOm4sbjpmdW5jdGlvbigpe3JldHVybiB0Pj1lLmxlbmd0aD97ZG9uZTohMH06e2RvbmU6ITEsdmFsdWU6ZVt0KytdfX0sZTpmdW5jdGlvbihlKXt0aHJvdyBlfSxmOm59fXRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKX12YXIgaSxyLG89ITAsYT0hMTtyZXR1cm57czpmdW5jdGlvbigpe2k9ZVtTeW1ib2wuaXRlcmF0b3JdKCl9LG46ZnVuY3Rpb24oKXt2YXIgZT1pLm5leHQoKTtyZXR1cm4gbz1lLmRvbmUsZX0sZTpmdW5jdGlvbihlKXthPSEwLHI9ZX0sZjpmdW5jdGlvbigpe3RyeXtvfHxudWxsPT1pLnJldHVybnx8aS5yZXR1cm4oKX1maW5hbGx5e2lmKGEpdGhyb3cgcn19fX0obi5lbnRyaWVzKCkpO3RyeXtmb3IoYS5zKCk7IShyPWEubigpKS5kb25lOyl7dmFyIHU9eChyLnZhbHVlLDIpLHM9dVswXSxjPXVbMV07by5hcHBlbmQocyxjKX19Y2F0Y2goZSl7YS5lKGUpfWZpbmFsbHl7YS5mKCl9Zm9yKHZhciBsIGluIHQpby5hcHBlbmQobCx0W2xdKTtyZXR1cm4gby50b1N0cmluZygpfSx1ZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuKXtUKHRoaXMsZSksdGhpcy52aWV3SWQ9dCx0aGlzLnJlbmRlcmVkPXt9LHRoaXMubWVyZ2VEaWZmKG4pfXJldHVybiBfKGUsbnVsbCxbe2tleTpcImV4dHJhY3RcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lLnIsbj1lLmUsaT1lLnQ7cmV0dXJuIGRlbGV0ZSBlLnIsZGVsZXRlIGUuZSxkZWxldGUgZS50LHtkaWZmOmUsdGl0bGU6aSxyZXBseTp0fHxudWxsLGV2ZW50czpufHxbXX19fV0pLF8oZSxbe2tleTpcInBhcmVudFZpZXdJZFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlld0lkfX0se2tleTpcInRvU3RyaW5nXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVjdXJzaXZlVG9TdHJpbmcodGhpcy5yZW5kZXJlZCx0aGlzLnJlbmRlcmVkLmMsZSl9fSx7a2V5OlwicmVjdXJzaXZlVG9TdHJpbmdcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06ZS5jLG49YXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDAsaT17YnVmZmVyOlwiXCIsY29tcG9uZW50czp0LG9ubHlDaWRzOm49bj9uZXcgU2V0KG4pOm51bGx9O3JldHVybiB0aGlzLnRvT3V0cHV0QnVmZmVyKGUsaSksaS5idWZmZXJ9fSx7a2V5OlwiY29tcG9uZW50Q0lEc1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3Qua2V5cyhlLmN8fHt9KS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHBhcnNlSW50KGUpfSl9fSx7a2V5OlwiaXNDb21wb25lbnRPbmx5RGlmZlwiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiEhZS5jJiYxPT09T2JqZWN0LmtleXMoZSkubGVuZ3RofX0se2tleTpcImdldENvbXBvbmVudFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY1t0XX19LHtrZXk6XCJtZXJnZURpZmZcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lLmM7aWYoZGVsZXRlIGUuYyx0aGlzLnJlbmRlcmVkPXRoaXMucmVjdXJzaXZlTWVyZ2UodGhpcy5yZW5kZXJlZCxlKSx0aGlzLnJlbmRlcmVkLmM9dGhpcy5yZW5kZXJlZC5jfHx7fSx0KXt2YXIgbj10aGlzLnJlbmRlcmVkLmM7Zm9yKHZhciBpIGluIHQpe3ZhciByPXRbaV0sbz1yLGE9by5zO2lmKFwibnVtYmVyXCI9PXR5cGVvZiBhKXtmb3IoO1wibnVtYmVyXCI9PXR5cGVvZiBhOylhPShvPWE+MD90W2FdOm5bLWFdKS5zO289JChvKSx0aGlzLmRvUmVjdXJzaXZlTWVyZ2UobyxyKSxvLnM9YX1lbHNlIG89bltpXXx8e30sbz10aGlzLnJlY3Vyc2l2ZU1lcmdlKG8scik7dFtpXT1vfWZvcih2YXIgdSBpbiB0KW5bdV09dFt1XTtlLmM9dH19fSx7a2V5OlwicmVjdXJzaXZlTWVyZ2VcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDAhPT10LnM/dDoodGhpcy5kb1JlY3Vyc2l2ZU1lcmdlKGUsdCksZSl9fSx7a2V5OlwiZG9SZWN1cnNpdmVNZXJnZVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIHQpe3ZhciBpPXRbbl0scj1lW25dO1koaSkmJnZvaWQgMD09PWkucyYmWShyKT90aGlzLmRvUmVjdXJzaXZlTWVyZ2UocixpKTplW25dPWl9fX0se2tleTpcImNvbXBvbmVudFRvU3RyaW5nXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVjdXJzaXZlQ0lEVG9TdHJpbmcodGhpcy5yZW5kZXJlZC5jLGUpfX0se2tleTpcInBydW5lQ0lEc1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBkZWxldGUgdC5yZW5kZXJlZC5jW2VdfSl9fSx7a2V5OlwiZ2V0XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlZH19LHtrZXk6XCJpc05ld0ZpbmdlcnByaW50XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4hIShhcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30pLnN9fSx7a2V5OlwidG9PdXRwdXRCdWZmZXJcIix2YWx1ZTpmdW5jdGlvbihlLHQpe2lmKGUuZClyZXR1cm4gdGhpcy5jb21wcmVoZW5zaW9uVG9CdWZmZXIoZSx0KTt2YXIgbj1lLnM7dC5idWZmZXIrPW5bMF07Zm9yKHZhciBpPTE7aTxuLmxlbmd0aDtpKyspdGhpcy5keW5hbWljVG9CdWZmZXIoZVtpLTFdLHQpLHQuYnVmZmVyKz1uW2ldfX0se2tleTpcImNvbXByZWhlbnNpb25Ub0J1ZmZlclwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWUuZCxpPWUucyxyPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPW5bcl07dC5idWZmZXIrPWlbMF07Zm9yKHZhciBhPTE7YTxpLmxlbmd0aDthKyspdGhpcy5keW5hbWljVG9CdWZmZXIob1thLTFdLHQpLHQuYnVmZmVyKz1pW2FdfX19LHtrZXk6XCJkeW5hbWljVG9CdWZmZXJcIix2YWx1ZTpmdW5jdGlvbihlLHQpe1wibnVtYmVyXCI9PXR5cGVvZiBlP3QuYnVmZmVyKz10aGlzLnJlY3Vyc2l2ZUNJRFRvU3RyaW5nKHQuY29tcG9uZW50cyxlLHQub25seUNpZHMpOlkoZSk/dGhpcy50b091dHB1dEJ1ZmZlcihlLHQpOnQuYnVmZmVyKz1lfX0se2tleTpcInJlY3Vyc2l2ZUNJRFRvU3RyaW5nXCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXMscj1lW3RdfHx6KFwibm8gY29tcG9uZW50IGZvciBDSUQgXCIuY29uY2F0KHQpLGUpLG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO28uaW5uZXJIVE1MPXRoaXMucmVjdXJzaXZlVG9TdHJpbmcocixlLG4pO3ZhciBhPW8uY29udGVudCx1PW4mJiFuLmhhcyh0KSxzPXgoQXJyYXkuZnJvbShhLmNoaWxkTm9kZXMpLnJlZHVjZShmdW5jdGlvbihlLG4scil7dmFyIGE9eChlLDIpLHM9YVswXSxjPWFbMV07cmV0dXJuIG4ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERT9uLmdldEF0dHJpYnV0ZShIKT9bcywhMF06KG4uc2V0QXR0cmlidXRlKEgsdCksbi5pZHx8KG4uaWQ9XCJcIi5jb25jYXQoaS5wYXJlbnRWaWV3SWQoKSxcIi1cIikuY29uY2F0KHQsXCItXCIpLmNvbmNhdChyKSksdSYmKG4uc2V0QXR0cmlidXRlKFwiZGF0YS1waHgtc2tpcFwiLFwiXCIpLG4uaW5uZXJIVE1MPVwiXCIpLFshMCxjXSk6XCJcIiE9PW4ubm9kZVZhbHVlLnRyaW0oKT8oeihcIm9ubHkgSFRNTCBlbGVtZW50IHRhZ3MgYXJlIGFsbG93ZWQgYXQgdGhlIHJvb3Qgb2YgY29tcG9uZW50cy5cXG5cXG5cIisnZ290OiBcIicuY29uY2F0KG4ubm9kZVZhbHVlLnRyaW0oKSwnXCJcXG5cXG4nKStcIndpdGhpbjpcXG5cIixvLmlubmVySFRNTC50cmltKCkpLG4ucmVwbGFjZVdpdGgoaS5jcmVhdGVTcGFuKG4ubm9kZVZhbHVlLHQpKSxbITAsY10pOihuLnJlbW92ZSgpLFtzLGNdKX0sWyExLCExXSksMiksYz1zWzBdLGw9c1sxXTtyZXR1cm4gY3x8bD8hYyYmbD8oeihcImV4cGVjdGVkIGF0IGxlYXN0IG9uZSBIVE1MIGVsZW1lbnQgdGFnIGRpcmVjdGx5IGluc2lkZSBhIGNvbXBvbmVudCwgYnV0IG9ubHkgc3ViY29tcG9uZW50cyB3ZXJlIGZvdW5kLiBBIGNvbXBvbmVudCBtdXN0IHJlbmRlciBhdCBsZWFzdCBvbmUgSFRNTCB0YWcgZGlyZWN0bHkgaW5zaWRlIGl0c2VsZi5cIixvLmlubmVySFRNTC50cmltKCkpLG8uaW5uZXJIVE1MKTpvLmlubmVySFRNTDooeihcImV4cGVjdGVkIGF0IGxlYXN0IG9uZSBIVE1MIGVsZW1lbnQgdGFnIGluc2lkZSBhIGNvbXBvbmVudCwgYnV0IHRoZSBjb21wb25lbnQgaXMgZW1wdHk6XFxuXCIsby5pbm5lckhUTUwudHJpbSgpKSx0aGlzLmNyZWF0ZVNwYW4oXCJcIix0KS5vdXRlckhUTUwpfX0se2tleTpcImNyZWF0ZVNwYW5cIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO3JldHVybiBuLmlubmVyVGV4dD1lLG4uc2V0QXR0cmlidXRlKEgsdCksbn19XSksZX0oKSxzZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuKXt2YXIgaT10aGlzLHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9O2lmKFQodGhpcyxlKSx0aGlzLnVubG9hZGVkPSExLCFufHxcIk9iamVjdFwiPT09bi5jb25zdHJ1Y3Rvci5uYW1lKXRocm93IG5ldyBFcnJvcignXFxuICAgICAgYSBwaG9lbml4IFNvY2tldCBtdXN0IGJlIHByb3ZpZGVkIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIExpdmVTb2NrZXQgY29uc3RydWN0b3IuIEZvciBleGFtcGxlOlxcblxcbiAgICAgICAgICBpbXBvcnQge1NvY2tldH0gZnJvbSBcInBob2VuaXhcIlxcbiAgICAgICAgICBpbXBvcnQge0xpdmVTb2NrZXR9IGZyb20gXCJwaG9lbml4X2xpdmVfdmlld1wiXFxuICAgICAgICAgIGxldCBsaXZlU29ja2V0ID0gbmV3IExpdmVTb2NrZXQoXCIvbGl2ZVwiLCBTb2NrZXQsIHsuLi59KVxcbiAgICAgICcpO3RoaXMuc29ja2V0PW5ldyBuKHQsciksdGhpcy5iaW5kaW5nUHJlZml4PXIuYmluZGluZ1ByZWZpeHx8Vyx0aGlzLm9wdHM9cix0aGlzLnBhcmFtcz1YKHIucGFyYW1zfHx7fSksdGhpcy52aWV3TG9nZ2VyPXIudmlld0xvZ2dlcix0aGlzLm1ldGFkYXRhQ2FsbGJhY2tzPXIubWV0YWRhdGF8fHt9LHRoaXMuZGVmYXVsdHM9T2JqZWN0LmFzc2lnbigkKHEpLHIuZGVmYXVsdHN8fHt9KSx0aGlzLmFjdGl2ZUVsZW1lbnQ9bnVsbCx0aGlzLnByZXZBY3RpdmU9bnVsbCx0aGlzLnNpbGVuY2VkPSExLHRoaXMubWFpbj1udWxsLHRoaXMubGlua1JlZj0wLHRoaXMucm9vdHM9e30sdGhpcy5ocmVmPXdpbmRvdy5sb2NhdGlvbi5ocmVmLHRoaXMucGVuZGluZ0xpbms9bnVsbCx0aGlzLmN1cnJlbnRMb2NhdGlvbj0kKHdpbmRvdy5sb2NhdGlvbiksdGhpcy5ob29rcz1yLmhvb2tzfHx7fSx0aGlzLnVwbG9hZGVycz1yLnVwbG9hZGVyc3x8e30sdGhpcy5sb2FkZXJUaW1lb3V0PXIubG9hZGVyVGltZW91dHx8Vix0aGlzLmJvdW5kVG9wTGV2ZWxFdmVudHM9ITEsdGhpcy5kb21DYWxsYmFja3M9T2JqZWN0LmFzc2lnbih7b25Ob2RlQWRkZWQ6WCgpLG9uQmVmb3JlRWxVcGRhdGVkOlgoKX0sci5kb218fHt9KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInVubG9hZFwiLGZ1bmN0aW9uKGUpe2kudW5sb2FkZWQ9ITB9KSx0aGlzLnNvY2tldC5vbk9wZW4oZnVuY3Rpb24oKXtpLmlzVW5sb2FkZWQoKSYmd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpfSl9cmV0dXJuIF8oZSxbe2tleTpcImlzUHJvZmlsZUVuYWJsZWRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVyblwidHJ1ZVwiPT09c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcInBoeDpsaXZlLXNvY2tldDpwcm9maWxpbmdcIil9fSx7a2V5OlwiaXNEZWJ1Z0VuYWJsZWRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVyblwidHJ1ZVwiPT09c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcInBoeDpsaXZlLXNvY2tldDpkZWJ1Z1wiKX19LHtrZXk6XCJlbmFibGVEZWJ1Z1wiLHZhbHVlOmZ1bmN0aW9uKCl7c2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInBoeDpsaXZlLXNvY2tldDpkZWJ1Z1wiLFwidHJ1ZVwiKX19LHtrZXk6XCJlbmFibGVQcm9maWxpbmdcIix2YWx1ZTpmdW5jdGlvbigpe3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oXCJwaHg6bGl2ZS1zb2NrZXQ6cHJvZmlsaW5nXCIsXCJ0cnVlXCIpfX0se2tleTpcImRpc2FibGVEZWJ1Z1wiLHZhbHVlOmZ1bmN0aW9uKCl7c2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShcInBoeDpsaXZlLXNvY2tldDpkZWJ1Z1wiKX19LHtrZXk6XCJkaXNhYmxlUHJvZmlsaW5nXCIsdmFsdWU6ZnVuY3Rpb24oKXtzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFwicGh4OmxpdmUtc29ja2V0OnByb2ZpbGluZ1wiKX19LHtrZXk6XCJlbmFibGVMYXRlbmN5U2ltXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5lbmFibGVEZWJ1ZygpLGNvbnNvbGUubG9nKFwibGF0ZW5jeSBzaW11bGF0b3IgZW5hYmxlZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoaXMgYnJvd3NlciBzZXNzaW9uLiBDYWxsIGRpc2FibGVMYXRlbmN5U2ltKCkgdG8gZGlzYWJsZVwiKSxzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwicGh4OmxpdmUtc29ja2V0OmxhdGVuY3ktc2ltXCIsZSl9fSx7a2V5OlwiZGlzYWJsZUxhdGVuY3lTaW1cIix2YWx1ZTpmdW5jdGlvbigpe3Nlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oXCJwaHg6bGl2ZS1zb2NrZXQ6bGF0ZW5jeS1zaW1cIil9fSx7a2V5OlwiZ2V0TGF0ZW5jeVNpbVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcInBoeDpsaXZlLXNvY2tldDpsYXRlbmN5LXNpbVwiKTtyZXR1cm4gZT9wYXJzZUludChlKTpudWxsfX0se2tleTpcImdldFNvY2tldFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc29ja2V0fX0se2tleTpcImNvbm5lY3RcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1mdW5jdGlvbigpe2Uuam9pblJvb3RWaWV3cygpJiYoZS5iaW5kVG9wTGV2ZWxFdmVudHMoKSxlLnNvY2tldC5jb25uZWN0KCkpfTtbXCJjb21wbGV0ZVwiLFwibG9hZGVkXCIsXCJpbnRlcmFjdGl2ZVwiXS5pbmRleE9mKGRvY3VtZW50LnJlYWR5U3RhdGUpPj0wP3QoKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLGZ1bmN0aW9uKCl7cmV0dXJuIHQoKX0pfX0se2tleTpcImRpc2Nvbm5lY3RcIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnNvY2tldC5kaXNjb25uZWN0KGUpfX0se2tleTpcInRyaWdnZXJET01cIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuOyhuPXRoaXMuZG9tQ2FsbGJhY2tzKVtlXS5hcHBseShuLEEodCkpfX0se2tleTpcInRpbWVcIix2YWx1ZTpmdW5jdGlvbihlLHQpe2lmKCF0aGlzLmlzUHJvZmlsZUVuYWJsZWQoKXx8IWNvbnNvbGUudGltZSlyZXR1cm4gdCgpO2NvbnNvbGUudGltZShlKTt2YXIgbj10KCk7cmV0dXJuIGNvbnNvbGUudGltZUVuZChlKSxufX0se2tleTpcImxvZ1wiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXtpZih0aGlzLnZpZXdMb2dnZXIpe3ZhciBpPXgobigpLDIpLHI9aVswXSxvPWlbMV07dGhpcy52aWV3TG9nZ2VyKGUsdCxyLG8pfWVsc2UgaWYodGhpcy5pc0RlYnVnRW5hYmxlZCgpKXt2YXIgYT14KG4oKSwyKSx1PWFbMF0scz1hWzFdO0soZSx0LHUscyl9fX0se2tleTpcIm9uQ2hhbm5lbFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10aGlzO2Uub24odCxmdW5jdGlvbihlKXt2YXIgdD1pLmdldExhdGVuY3lTaW0oKTt0Pyhjb25zb2xlLmxvZyhcInNpbXVsYXRpbmcgXCIuY29uY2F0KHQsXCJtcyBvZiBsYXRlbmN5IGZyb20gc2VydmVyIHRvIGNsaWVudFwiKSksc2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBuKGUpfSx0KSk6bihlKX0pfX0se2tleTpcIndyYXBQdXNoXCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXMscj10aGlzLmdldExhdGVuY3lTaW0oKSxvPWUuam9pbkNvdW50O2lmKCFyKXJldHVybiB0LnRpbWVvdXQ/bigpLnJlY2VpdmUoXCJ0aW1lb3V0XCIsZnVuY3Rpb24oKXtlLmpvaW5Db3VudD09PW8mJmkucmVsb2FkV2l0aEppdHRlcihlLGZ1bmN0aW9uKCl7aS5sb2coZSxcInRpbWVvdXRcIixmdW5jdGlvbigpe3JldHVybltcInJlY2VpdmVkIHRpbWVvdXQgd2hpbGUgY29tbXVuaWNhdGluZyB3aXRoIHNlcnZlci4gRmFsbGluZyBiYWNrIHRvIGhhcmQgcmVmcmVzaCBmb3IgcmVjb3ZlcnlcIl19KX0pfSk6bigpO2NvbnNvbGUubG9nKFwic2ltdWxhdGluZyBcIi5jb25jYXQocixcIm1zIG9mIGxhdGVuY3kgZnJvbSBjbGllbnQgdG8gc2VydmVyXCIpKTt2YXIgYT17cmVjZWl2ZXM6W10scmVjZWl2ZTpmdW5jdGlvbihlLHQpe3RoaXMucmVjZWl2ZXMucHVzaChbZSx0XSl9fTtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe2EucmVjZWl2ZXMucmVkdWNlKGZ1bmN0aW9uKGUsdCl7dmFyIG49eCh0LDIpLGk9blswXSxyPW5bMV07cmV0dXJuIGUucmVjZWl2ZShpLHIpfSxuKCkpfSxyKSxhfX0se2tleTpcInJlbG9hZFdpdGhKaXR0ZXJcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7ZS5kZXN0cm95KCksdGhpcy5kaXNjb25uZWN0KCk7dmFyIGk9UlswXSxyPVJbMV0sbz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKHItaSsxKSkraSxhPWNlLnVwZGF0ZUxvY2FsKGUubmFtZSgpLFwiY29uc2VjdXRpdmUtcmVsb2Fkc1wiLDAsZnVuY3Rpb24oZSl7cmV0dXJuIGUrMX0pO3Q/dCgpOnRoaXMubG9nKGUsXCJqb2luXCIsZnVuY3Rpb24oKXtyZXR1cm5bXCJlbmNvdW50ZXJlZCBcIi5jb25jYXQoYSxcIiBjb25zZWN1dGl2ZSByZWxvYWRzXCIpXX0pLGE+MTAmJih0aGlzLmxvZyhlLFwiam9pblwiLGZ1bmN0aW9uKCl7cmV0dXJuW1wiZXhjZWVkZWQgXCIuY29uY2F0KDEwLFwiIGNvbnNlY3V0aXZlIHJlbG9hZHMuIEVudGVyaW5nIGZhaWxzYWZlIG1vZGVcIildfSksbz0zZTQpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtuLmhhc1BlbmRpbmdMaW5rKCk/d2luZG93LmxvY2F0aW9uPW4ucGVuZGluZ0xpbms6d2luZG93LmxvY2F0aW9uLnJlbG9hZCgpfSxvKX19LHtrZXk6XCJnZXRIb29rQ2FsbGJhY2tzXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuc3RhcnRzV2l0aChcIlBob2VuaXguXCIpP3RlW2Uuc3BsaXQoXCIuXCIpWzFdXTp0aGlzLmhvb2tzW2VdfX0se2tleTpcImlzVW5sb2FkZWRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVubG9hZGVkfX0se2tleTpcImlzQ29ubmVjdGVkXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKX19LHtrZXk6XCJnZXRCaW5kaW5nUHJlZml4XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iaW5kaW5nUHJlZml4fX0se2tleTpcImJpbmRpbmdcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm5cIlwiLmNvbmNhdCh0aGlzLmdldEJpbmRpbmdQcmVmaXgoKSkuY29uY2F0KGUpfX0se2tleTpcImNoYW5uZWxcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnNvY2tldC5jaGFubmVsKGUsdCl9fSx7a2V5Olwiam9pblJvb3RWaWV3c1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PSExO3JldHVybiBsZS5hbGwoZG9jdW1lbnQsXCJcIi5jb25jYXQoVSxcIjpub3QoW1wiKS5jb25jYXQoXCJkYXRhLXBoeC1wYXJlbnQtaWRcIixcIl0pXCIpLGZ1bmN0aW9uKG4pe2lmKCFlLmdldFJvb3RCeUlkKG4uaWQpKXt2YXIgaT1lLmpvaW5Sb290VmlldyhuLGUuZ2V0SHJlZigpKTtlLnJvb3Q9ZS5yb290fHxpLG4uZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtbWFpblwiKSYmKGUubWFpbj1pKX10PSEwfSksdH19LHtrZXk6XCJyZWRpcmVjdFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dGhpcy5kaXNjb25uZWN0KCksY2UucmVkaXJlY3QoZSx0KX19LHtrZXk6XCJyZXBsYWNlTWFpblwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcyxpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsLHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnRoaXMuc2V0UGVuZGluZ0xpbmsoZSksbz10aGlzLm1haW4uZWw7dGhpcy5tYWluLnNob3dMb2FkZXIodGhpcy5sb2FkZXJUaW1lb3V0KSx0aGlzLm1haW4uZGVzdHJveSgpLGNlLmZldGNoUGFnZShlLGZ1bmN0aW9uKGEsdSl7aWYoMjAwIT09YSlyZXR1cm4gbi5yZWRpcmVjdChlKTt2YXIgcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7cy5pbm5lckhUTUw9dTt2YXIgYz1zLmNvbnRlbnQuY2hpbGROb2Rlc1swXTtpZighY3x8IW4uaXNQaHhWaWV3KGMpKXJldHVybiBuLnJlZGlyZWN0KGUpO24uam9pblJvb3RWaWV3KGMsZSx0LGZ1bmN0aW9uKGUsdCl7MT09PXQmJihuLmNvbW1pdFBlbmRpbmdMaW5rKHIpPyhvLnJlcGxhY2VXaXRoKGUuZWwpLG4ubWFpbj1lLGkmJmkoKSk6ZS5kZXN0cm95KCkpfSl9KX19LHtrZXk6XCJpc1BoeFZpZXdcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUmJm51bGwhPT1lLmdldEF0dHJpYnV0ZShPKX19LHtrZXk6XCJqb2luUm9vdFZpZXdcIix2YWx1ZTpmdW5jdGlvbihlLHQsbixpKXt2YXIgcj1uZXcgZmUoZSx0aGlzLG51bGwsdCxuKTtyZXR1cm4gdGhpcy5yb290c1tyLmlkXT1yLHIuam9pbihpKSxyfX0se2tleTpcIm93bmVyXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLGk9WihlLmNsb3Nlc3QoVSksZnVuY3Rpb24oZSl7cmV0dXJuIG4uZ2V0Vmlld0J5RWwoZSl9KTtpJiZ0KGkpfX0se2tleTpcIndpdGhpbk93bmVyc1wiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpczt0aGlzLm93bmVyKGUsZnVuY3Rpb24oaSl7dmFyIHI9ZS5nZXRBdHRyaWJ1dGUobi5iaW5kaW5nKFwidGFyZ2V0XCIpKTtudWxsPT09cj90KGksZSk6aS53aXRoaW5UYXJnZXRzKHIsdCl9KX19LHtrZXk6XCJnZXRWaWV3QnlFbFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtcm9vdC1pZFwiKTtyZXR1cm4gWih0aGlzLmdldFJvb3RCeUlkKHQpLGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldERlc2NlbmRlbnRCeUVsKGUpfSl9fSx7a2V5OlwiZ2V0Um9vdEJ5SWRcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yb290c1tlXX19LHtrZXk6XCJkZXN0cm95QWxsVmlld3NcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgZSBpbiB0aGlzLnJvb3RzKXRoaXMucm9vdHNbZV0uZGVzdHJveSgpLGRlbGV0ZSB0aGlzLnJvb3RzW2VdfX0se2tleTpcImRlc3Ryb3lWaWV3QnlFbFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0Um9vdEJ5SWQoZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1yb290LWlkXCIpKTt0JiZ0LmRlc3Ryb3lEZXNjZW5kZW50KGUuaWQpfX0se2tleTpcInNldEFjdGl2ZUVsZW1lbnRcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKHRoaXMuYWN0aXZlRWxlbWVudCE9PWUpe3RoaXMuYWN0aXZlRWxlbWVudD1lO3ZhciBuPWZ1bmN0aW9uKCl7ZT09PXQuYWN0aXZlRWxlbWVudCYmKHQuYWN0aXZlRWxlbWVudD1udWxsKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsdCksZS5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIix0KX07ZS5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLG4pLGUuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsbil9fX0se2tleTpcImdldEFjdGl2ZUVsZW1lbnRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09ZG9jdW1lbnQuYm9keT90aGlzLmFjdGl2ZUVsZW1lbnR8fGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ6ZG9jdW1lbnQuYWN0aXZlRWxlbWVudHx8ZG9jdW1lbnQuYm9keX19LHtrZXk6XCJkcm9wQWN0aXZlRWxlbWVudFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMucHJldkFjdGl2ZSYmZS5vd25zRWxlbWVudCh0aGlzLnByZXZBY3RpdmUpJiYodGhpcy5wcmV2QWN0aXZlPW51bGwpfX0se2tleTpcInJlc3RvcmVQcmV2aW91c2x5QWN0aXZlRm9jdXNcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMucHJldkFjdGl2ZSYmdGhpcy5wcmV2QWN0aXZlIT09ZG9jdW1lbnQuYm9keSYmdGhpcy5wcmV2QWN0aXZlLmZvY3VzKCl9fSx7a2V5OlwiYmx1ckFjdGl2ZUVsZW1lbnRcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMucHJldkFjdGl2ZT10aGlzLmdldEFjdGl2ZUVsZW1lbnQoKSx0aGlzLnByZXZBY3RpdmUhPT1kb2N1bWVudC5ib2R5JiZ0aGlzLnByZXZBY3RpdmUuYmx1cigpfX0se2tleTpcImJpbmRUb3BMZXZlbEV2ZW50c1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLmJvdW5kVG9wTGV2ZWxFdmVudHN8fCh0aGlzLmJvdW5kVG9wTGV2ZWxFdmVudHM9ITAsZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIixmdW5jdGlvbigpe30pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZXNob3dcIixmdW5jdGlvbih0KXt0LnBlcnNpc3RlZCYmKGUud2l0aFBhZ2VMb2FkaW5nKHt0bzp3aW5kb3cubG9jYXRpb24uaHJlZixraW5kOlwicmVkaXJlY3RcIn0pLHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKSl9KSx0aGlzLmJpbmRDbGlja3MoKSx0aGlzLmJpbmROYXYoKSx0aGlzLmJpbmRGb3JtcygpLHRoaXMuYmluZCh7a2V5dXA6XCJrZXl1cFwiLGtleWRvd246XCJrZXlkb3duXCJ9LGZ1bmN0aW9uKHQsbixpLHIsbyxhLHUpe3ZhciBzPXIuZ2V0QXR0cmlidXRlKGUuYmluZGluZyhcImtleVwiKSksYz10LmtleSYmdC5rZXkudG9Mb3dlckNhc2UoKTtzJiZzLnRvTG93ZXJDYXNlKCkhPT1jfHxpLnB1c2hLZXkocixvLG4sYSxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbdF0/YXJndW1lbnRzW3RdOnt9O3QlMj93KE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbih0KXtFKGUsdCxuW3RdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOncoT2JqZWN0KG4pKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLHQpKX0pfXJldHVybiBlfSh7a2V5OnQua2V5fSxlLmV2ZW50TWV0YShuLHQscikpKX0pLHRoaXMuYmluZCh7Ymx1cjpcImZvY3Vzb3V0XCIsZm9jdXM6XCJmb2N1c2luXCJ9LGZ1bmN0aW9uKHQsbixpLHIsbyxhLHUpe3V8fGkucHVzaEV2ZW50KG4scixvLGEsZS5ldmVudE1ldGEobix0LHIpKX0pLHRoaXMuYmluZCh7Ymx1cjpcImJsdXJcIixmb2N1czpcImZvY3VzXCJ9LGZ1bmN0aW9uKHQsbixpLHIsbyxhLHUpe3UmJlwid2luZG93XCIhPT0hdSYmaS5wdXNoRXZlbnQobixyLG8sYSxlLmV2ZW50TWV0YShuLHQscikpfSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJkcmFnb3ZlclwiLGZ1bmN0aW9uKGUpe3JldHVybiBlLnByZXZlbnREZWZhdWx0KCl9KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImRyb3BcIixmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCk7dmFyIG49WihHKHQudGFyZ2V0LGUuYmluZGluZyhcImRyb3AtdGFyZ2V0XCIpKSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoZS5iaW5kaW5nKFwiZHJvcC10YXJnZXRcIikpfSksaT1uJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChuKSxyPUFycmF5LmZyb20odC5kYXRhVHJhbnNmZXIuZmlsZXN8fFtdKTtpJiYhaS5kaXNhYmxlZCYmMCE9PXIubGVuZ3RoJiZpLmZpbGVzIGluc3RhbmNlb2YgRmlsZUxpc3QmJihpZS50cmFja0ZpbGVzKGksciksaS5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIse2J1YmJsZXM6ITB9KSkpfSkpfX0se2tleTpcImV2ZW50TWV0YVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10aGlzLm1ldGFkYXRhQ2FsbGJhY2tzW2VdO3JldHVybiBpP2kodCxuKTp7fX19LHtrZXk6XCJzZXRQZW5kaW5nTGlua1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmxpbmtSZWYrKyx0aGlzLnBlbmRpbmdMaW5rPWUsdGhpcy5saW5rUmVmfX0se2tleTpcImNvbW1pdFBlbmRpbmdMaW5rXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMubGlua1JlZj09PWUmJih0aGlzLmhyZWY9dGhpcy5wZW5kaW5nTGluayx0aGlzLnBlbmRpbmdMaW5rPW51bGwsITApfX0se2tleTpcImdldEhyZWZcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhyZWZ9fSx7a2V5OlwiaGFzUGVuZGluZ0xpbmtcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5wZW5kaW5nTGlua319LHtrZXk6XCJiaW5kXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLGk9ZnVuY3Rpb24oaSl7dmFyIHI9ZVtpXTtuLm9uKHIsZnVuY3Rpb24oZSl7dmFyIHI9bi5iaW5kaW5nKGkpLG89bi5iaW5kaW5nKFwid2luZG93LVwiLmNvbmNhdChpKSksYT1lLnRhcmdldC5nZXRBdHRyaWJ1dGUmJmUudGFyZ2V0LmdldEF0dHJpYnV0ZShyKTthP24uZGVib3VuY2UoZS50YXJnZXQsZSxmdW5jdGlvbigpe24ud2l0aGluT3duZXJzKGUudGFyZ2V0LGZ1bmN0aW9uKG4scil7dChlLGksbixlLnRhcmdldCxyLGEsbnVsbCl9KX0pOmxlLmFsbChkb2N1bWVudCxcIltcIi5jb25jYXQobyxcIl1cIiksZnVuY3Rpb24ocil7dmFyIGE9ci5nZXRBdHRyaWJ1dGUobyk7bi5kZWJvdW5jZShyLGUsZnVuY3Rpb24oKXtuLndpdGhpbk93bmVycyhyLGZ1bmN0aW9uKG4sbyl7dChlLGksbixyLG8sYSxcIndpbmRvd1wiKX0pfSl9KX0pfTtmb3IodmFyIHIgaW4gZSlpKHIpfX0se2tleTpcImJpbmRDbGlja3NcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuYmluZENsaWNrKFwiY2xpY2tcIixcImNsaWNrXCIsITEpLHRoaXMuYmluZENsaWNrKFwibW91c2Vkb3duXCIsXCJjYXB0dXJlLWNsaWNrXCIsITApfX0se2tleTpcImJpbmRDbGlja1wiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10aGlzLHI9dGhpcy5iaW5kaW5nKHQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oZSl7aWYoaS5pc0Nvbm5lY3RlZCgpKXt2YXIgdD1udWxsLG89KHQ9bj9lLnRhcmdldC5tYXRjaGVzKFwiW1wiLmNvbmNhdChyLFwiXVwiKSk/ZS50YXJnZXQ6ZS50YXJnZXQucXVlcnlTZWxlY3RvcihcIltcIi5jb25jYXQocixcIl1cIikpOkcoZS50YXJnZXQscikpJiZ0LmdldEF0dHJpYnV0ZShyKTtvJiYoXCIjXCI9PT10LmdldEF0dHJpYnV0ZShcImhyZWZcIikmJmUucHJldmVudERlZmF1bHQoKSxpLmRlYm91bmNlKHQsZSxmdW5jdGlvbigpe2kud2l0aGluT3duZXJzKHQsZnVuY3Rpb24obixyKXtuLnB1c2hFdmVudChcImNsaWNrXCIsdCxyLG8saS5ldmVudE1ldGEoXCJjbGlja1wiLGUsdCkpfSl9KSl9fSxuKX19LHtrZXk6XCJiaW5kTmF2XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKGNlLmNhblB1c2hTdGF0ZSgpKXtoaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uJiYoaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbj1cIm1hbnVhbFwiKTt2YXIgdD1udWxsO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsZnVuY3Rpb24oZSl7Y2xlYXJUaW1lb3V0KHQpLHQ9c2V0VGltZW91dChmdW5jdGlvbigpe2NlLnVwZGF0ZUN1cnJlbnRTdGF0ZShmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihlLHtzY3JvbGw6d2luZG93LnNjcm9sbFl9KX0pfSwxMDApfSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLGZ1bmN0aW9uKHQpe2lmKGUucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pKXt2YXIgbj10LnN0YXRlfHx7fSxpPW4udHlwZSxyPW4uaWQsbz1uLnJvb3QsYT1uLnNjcm9sbCx1PXdpbmRvdy5sb2NhdGlvbi5ocmVmO2UubWFpbi5pc0Nvbm5lY3RlZCgpJiZcInBhdGNoXCI9PT1pJiZyPT09ZS5tYWluLmlkP2UubWFpbi5wdXNoTGlua1BhdGNoKHUsbnVsbCk6ZS5yZXBsYWNlTWFpbih1LG51bGwsZnVuY3Rpb24oKXtvJiZlLnJlcGxhY2VSb290SGlzdG9yeSgpLFwibnVtYmVyXCI9PXR5cGVvZiBhJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7d2luZG93LnNjcm9sbFRvKDAsYSl9LDApfSl9fSwhMSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLGZ1bmN0aW9uKHQpe3ZhciBuPUcodC50YXJnZXQsXCJkYXRhLXBoeC1saW5rXCIpLGk9biYmbi5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1saW5rXCIpLHI9dC5tZXRhS2V5fHx0LmN0cmxLZXl8fDE9PT10LmJ1dHRvbjtpZihpJiZlLmlzQ29ubmVjdGVkKCkmJmUubWFpbiYmIXIpe3ZhciBvPW4uaHJlZixhPW4uZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtbGluay1zdGF0ZVwiKTtpZih0LnByZXZlbnREZWZhdWx0KCksZS5wZW5kaW5nTGluayE9PW8paWYoXCJwYXRjaFwiPT09aSllLnB1c2hIaXN0b3J5UGF0Y2gobyxhLG4pO2Vsc2V7aWYoXCJyZWRpcmVjdFwiIT09aSl0aHJvdyBuZXcgRXJyb3IoXCJleHBlY3RlZCBcIi5jb25jYXQoXCJkYXRhLXBoeC1saW5rXCIsJyB0byBiZSBcInBhdGNoXCIgb3IgXCJyZWRpcmVjdFwiLCBnb3Q6ICcpLmNvbmNhdChpKSk7ZS5oaXN0b3J5UmVkaXJlY3QobyxhKX19fSwhMSl9fX0se2tleTpcIndpdGhQYWdlTG9hZGluZ1wiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7bGUuZGlzcGF0Y2hFdmVudCh3aW5kb3csXCJwaHg6cGFnZS1sb2FkaW5nLXN0YXJ0XCIsZSk7dmFyIG49ZnVuY3Rpb24oKXtyZXR1cm4gbGUuZGlzcGF0Y2hFdmVudCh3aW5kb3csXCJwaHg6cGFnZS1sb2FkaW5nLXN0b3BcIixlKX07cmV0dXJuIHQ/dChuKTpufX0se2tleTpcInB1c2hIaXN0b3J5UGF0Y2hcIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7dmFyIGk9dGhpczt0aGlzLndpdGhQYWdlTG9hZGluZyh7dG86ZSxraW5kOlwicGF0Y2hcIn0sZnVuY3Rpb24ocil7aS5tYWluLnB1c2hMaW5rUGF0Y2goZSxuLGZ1bmN0aW9uKCl7aS5oaXN0b3J5UGF0Y2goZSx0KSxyKCl9KX0pfX0se2tleTpcImhpc3RvcnlQYXRjaFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7Y2UucHVzaFN0YXRlKHQse3R5cGU6XCJwYXRjaFwiLGlkOnRoaXMubWFpbi5pZH0sZSksdGhpcy5yZWdpc3Rlck5ld0xvY2F0aW9uKHdpbmRvdy5sb2NhdGlvbil9fSx7a2V5OlwiaGlzdG9yeVJlZGlyZWN0XCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXMscj13aW5kb3cuc2Nyb2xsWTt0aGlzLndpdGhQYWdlTG9hZGluZyh7dG86ZSxraW5kOlwicmVkaXJlY3RcIn0sZnVuY3Rpb24obyl7aS5yZXBsYWNlTWFpbihlLG4sZnVuY3Rpb24oKXtjZS5wdXNoU3RhdGUodCx7dHlwZTpcInJlZGlyZWN0XCIsaWQ6aS5tYWluLmlkLHNjcm9sbDpyfSxlKSxpLnJlZ2lzdGVyTmV3TG9jYXRpb24od2luZG93LmxvY2F0aW9uKSxvKCl9KX0pfX0se2tleTpcInJlcGxhY2VSb290SGlzdG9yeVwiLHZhbHVlOmZ1bmN0aW9uKCl7Y2UucHVzaFN0YXRlKFwicmVwbGFjZVwiLHtyb290OiEwLHR5cGU6XCJwYXRjaFwiLGlkOnRoaXMubWFpbi5pZH0pfX0se2tleTpcInJlZ2lzdGVyTmV3TG9jYXRpb25cIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmN1cnJlbnRMb2NhdGlvbjtyZXR1cm4gdC5wYXRobmFtZSt0LnNlYXJjaCE9PWUucGF0aG5hbWUrZS5zZWFyY2gmJih0aGlzLmN1cnJlbnRMb2NhdGlvbj0kKGUpLCEwKX19LHtrZXk6XCJiaW5kRm9ybXNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD0wO3RoaXMub24oXCJzdWJtaXRcIixmdW5jdGlvbih0KXt2YXIgbj10LnRhcmdldC5nZXRBdHRyaWJ1dGUoZS5iaW5kaW5nKFwic3VibWl0XCIpKTtuJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQudGFyZ2V0LmRpc2FibGVkPSEwLGUud2l0aGluT3duZXJzKHQudGFyZ2V0LGZ1bmN0aW9uKGUsaSl7cmV0dXJuIGUuc3VibWl0Rm9ybSh0LnRhcmdldCxpLG4pfSkpfSwhMSk7Zm9yKHZhciBuPWZ1bmN0aW9uKCl7dmFyIG49cltpXTtlLm9uKG4sZnVuY3Rpb24oaSl7dmFyIHI9aS50YXJnZXQsbz1yLmZvcm0mJnIuZm9ybS5nZXRBdHRyaWJ1dGUoZS5iaW5kaW5nKFwiY2hhbmdlXCIpKTtpZihvJiYoXCJudW1iZXJcIiE9PXIudHlwZXx8IXIudmFsaWRpdHl8fCFyLnZhbGlkaXR5LmJhZElucHV0KSl7dmFyIGE9dDt0Kys7dmFyIHU9bGUucHJpdmF0ZShyLFwicHJldi1pdGVyYXRpb25cIil8fHt9LHM9dS5hdCxjPXUudHlwZTtzPT09YS0xJiZuIT09Y3x8KGxlLnB1dFByaXZhdGUocixcInByZXYtaXRlcmF0aW9uXCIse2F0OmEsdHlwZTpufSksZS5kZWJvdW5jZShyLGksZnVuY3Rpb24oKXtlLndpdGhpbk93bmVycyhyLmZvcm0sZnVuY3Rpb24odCxuKXtsZS5wdXRQcml2YXRlKHIsXCJwaHgtaGFzLWZvY3VzZWRcIiwhMCksbGUuaXNUZXh0dWFsSW5wdXQocil8fGUuc2V0QWN0aXZlRWxlbWVudChyKSx0LnB1c2hJbnB1dChyLG4sbyxpLnRhcmdldCl9KX0pKX19LCExKX0saT0wLHI9W1wiY2hhbmdlXCIsXCJpbnB1dFwiXTtpPHIubGVuZ3RoO2krKyluKCl9fSx7a2V5OlwiZGVib3VuY2VcIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7dmFyIGk9dGhpcy5iaW5kaW5nKFwiZGVib3VuY2VcIikscj10aGlzLmJpbmRpbmcoXCJ0aHJvdHRsZVwiKSxvPXRoaXMuZGVmYXVsdHMuZGVib3VuY2UudG9TdHJpbmcoKSxhPXRoaXMuZGVmYXVsdHMudGhyb3R0bGUudG9TdHJpbmcoKTtsZS5kZWJvdW5jZShlLHQsaSxvLHIsYSxuKX19LHtrZXk6XCJzaWxlbmNlRXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5zaWxlbmNlZD0hMCxlKCksdGhpcy5zaWxlbmNlZD0hMX19LHtrZXk6XCJvblwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpczt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGUpe24uc2lsZW5jZWR8fHQoZSl9KX19XSksZX0oKSxjZT17Y2FuUHVzaFN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PWhpc3RvcnkucHVzaFN0YXRlfSxkcm9wTG9jYWw6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMubG9jYWxLZXkoZSx0KSl9LHVwZGF0ZUxvY2FsOmZ1bmN0aW9uKGUsdCxuLGkpe3ZhciByPXRoaXMuZ2V0TG9jYWwoZSx0KSxvPXRoaXMubG9jYWxLZXkoZSx0KSxhPW51bGw9PT1yP246aShyKTtyZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKG8sSlNPTi5zdHJpbmdpZnkoYSkpLGF9LGdldExvY2FsOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIEpTT04ucGFyc2Uod2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxLZXkoZSx0KSkpfSxmZXRjaFBhZ2U6ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3Q7bi5vcGVuKFwiR0VUXCIsZSwhMCksbi50aW1lb3V0PTNlNCxuLnNldFJlcXVlc3RIZWFkZXIoXCJjb250ZW50LXR5cGVcIixcInRleHQvaHRtbFwiKSxuLnNldFJlcXVlc3RIZWFkZXIoXCJjYWNoZS1jb250cm9sXCIsXCJtYXgtYWdlPTAsIG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwb3N0LWNoZWNrPTAsIHByZS1jaGVjaz0wXCIpLG4uc2V0UmVxdWVzdEhlYWRlcihcIngtcmVxdWVzdGVkLXdpdGhcIixcImxpdmUtbGlua1wiKSxuLm9uZXJyb3I9ZnVuY3Rpb24oKXtyZXR1cm4gdCg0MDApfSxuLm9udGltZW91dD1mdW5jdGlvbigpe3JldHVybiB0KDUwNCl9LG4ub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoND09PW4ucmVhZHlTdGF0ZSl7dmFyIGk9bmV3IFVSTChlKSxyPWkucGF0aG5hbWUraS5zZWFyY2gsbz1aKG4uZ2V0UmVzcG9uc2VIZWFkZXIoXCJ4LXJlc3BvbnNlLXVybFwiKXx8bi5yZXNwb25zZVVSTCxmdW5jdGlvbihlKXtyZXR1cm4gbmV3IFVSTChlKX0pLGE9bz9vLnBhdGhuYW1lK28uc2VhcmNoOm51bGw7cmV0dXJuXCJsaXZlLWxpbmtcIiE9PW4uZ2V0UmVzcG9uc2VIZWFkZXIoXCJ4LXJlcXVlc3RlZC13aXRoXCIpP3QoNDAwKTpudWxsPT09b3x8YSE9cj90KDMwMik6MjAwIT09bi5zdGF0dXM/dChuLnN0YXR1cyk6dm9pZCB0KDIwMCxuLnJlc3BvbnNlVGV4dCl9fSxuLnNlbmQoKX0sdXBkYXRlQ3VycmVudFN0YXRlOmZ1bmN0aW9uKGUpe3RoaXMuY2FuUHVzaFN0YXRlKCkmJmhpc3RvcnkucmVwbGFjZVN0YXRlKGUoaGlzdG9yeS5zdGF0ZXx8e30pLFwiXCIsd2luZG93LmxvY2F0aW9uLmhyZWYpfSxwdXNoU3RhdGU6ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuY2FuUHVzaFN0YXRlKCkpe2lmKG4hPT13aW5kb3cubG9jYXRpb24uaHJlZil7aWYoXCJyZWRpcmVjdFwiPT10LnR5cGUmJnQuc2Nyb2xsKXt2YXIgaT1oaXN0b3J5LnN0YXRlfHx7fTtpLnNjcm9sbD10LnNjcm9sbCxoaXN0b3J5LnJlcGxhY2VTdGF0ZShpLFwiXCIsd2luZG93LmxvY2F0aW9uLmhyZWYpfWRlbGV0ZSB0LnNjcm9sbCxoaXN0b3J5W2UrXCJTdGF0ZVwiXSh0LFwiXCIsbnx8bnVsbCk7dmFyIHI9dGhpcy5nZXRIYXNoVGFyZ2V0RWwod2luZG93LmxvY2F0aW9uLmhhc2gpO3I/ci5zY3JvbGxJbnRvVmlldygpOlwicmVkaXJlY3RcIj09PXQudHlwZSYmd2luZG93LnNjcm9sbCgwLDApfX1lbHNlIHRoaXMucmVkaXJlY3Qobil9LHNldENvb2tpZTpmdW5jdGlvbihlLHQpe2RvY3VtZW50LmNvb2tpZT1cIlwiLmNvbmNhdChlLFwiPVwiKS5jb25jYXQodCl9LGdldENvb2tpZTpmdW5jdGlvbihlKXtyZXR1cm4gZG9jdW1lbnQuY29va2llLnJlcGxhY2UobmV3IFJlZ0V4cChcIig/Oig/Ol58Lio7cyopXCIuY29uY2F0KGUsXCJzKj1zKihbXjtdKikuKiQpfF4uKiRcIikpLFwiJDFcIil9LHJlZGlyZWN0OmZ1bmN0aW9uKGUsdCl7dCYmY2Uuc2V0Q29va2llKFwiX19waG9lbml4X2ZsYXNoX19cIix0K1wiOyBtYXgtYWdlPTYwMDAwOyBwYXRoPS9cIiksd2luZG93LmxvY2F0aW9uPWV9LGxvY2FsS2V5OmZ1bmN0aW9uKGUsdCl7cmV0dXJuXCJcIi5jb25jYXQoZSxcIi1cIikuY29uY2F0KHQpfSxnZXRIYXNoVGFyZ2V0RWw6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50b1N0cmluZygpLnN1YnN0cmluZygxKTtpZihcIlwiIT09dClyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodCl8fGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2FbbmFtZT1cIicuY29uY2F0KHQsJ1wiXScpKX19LGxlPXtieUlkOmZ1bmN0aW9uKGUpe3JldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKXx8eihcIm5vIGlkIGZvdW5kIGZvciBcIi5jb25jYXQoZSkpfSxyZW1vdmVDbGFzczpmdW5jdGlvbihlLHQpe2UuY2xhc3NMaXN0LnJlbW92ZSh0KSwwPT09ZS5jbGFzc0xpc3QubGVuZ3RoJiZlLnJlbW92ZUF0dHJpYnV0ZShcImNsYXNzXCIpfSxhbGw6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPUFycmF5LmZyb20oZS5xdWVyeVNlbGVjdG9yQWxsKHQpKTtyZXR1cm4gbj9pLmZvckVhY2gobik6aX0sY2hpbGROb2RlTGVuZ3RoOmZ1bmN0aW9uKGUpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtyZXR1cm4gdC5pbm5lckhUTUw9ZSx0LmNvbnRlbnQuY2hpbGRFbGVtZW50Q291bnR9LGlzVXBsb2FkSW5wdXQ6ZnVuY3Rpb24oZSl7cmV0dXJuXCJmaWxlXCI9PT1lLnR5cGUmJm51bGwhPT1lLmdldEF0dHJpYnV0ZShNKX0sZmluZFVwbG9hZElucHV0czpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hbGwoZSwnaW5wdXRbdHlwZT1cImZpbGVcIl1bJy5jb25jYXQoTSxcIl1cIikpfSxmaW5kQ29tcG9uZW50Tm9kZUxpc3Q6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5maWx0ZXJXaXRoaW5TYW1lTGl2ZVZpZXcodGhpcy5hbGwoZSxcIltcIi5jb25jYXQoSCwnPVwiJykuY29uY2F0KHQsJ1wiXScpKSxlKX0saXNQaHhEZXN0cm95ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuISghZS5pZHx8IWxlLnByaXZhdGUoZSxcImRlc3Ryb3llZFwiKSl9LG1hcmtQaHhDaGlsZERlc3Ryb3llZDpmdW5jdGlvbihlKXtlLnNldEF0dHJpYnV0ZShcImRhdGEtcGh4LXNlc3Npb25cIixcIlwiKSx0aGlzLnB1dFByaXZhdGUoZSxcImRlc3Ryb3llZFwiLCEwKX0sZmluZFBoeENoaWxkcmVuSW5GcmFnbWVudDpmdW5jdGlvbihlLHQpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtyZXR1cm4gbi5pbm5lckhUTUw9ZSx0aGlzLmZpbmRQaHhDaGlsZHJlbihuLmNvbnRlbnQsdCl9LGlzSWdub3JlZDpmdW5jdGlvbihlLHQpe3JldHVyblwiaWdub3JlXCI9PT0oZS5nZXRBdHRyaWJ1dGUodCl8fGUuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtdXBkYXRlXCIpKX0saXNQaHhVcGRhdGU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLmdldEF0dHJpYnV0ZSYmbi5pbmRleE9mKGUuZ2V0QXR0cmlidXRlKHQpKT49MH0sZmluZFBoeENoaWxkcmVuOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYWxsKGUsXCJcIi5jb25jYXQoVSxcIltcIikuY29uY2F0KFwiZGF0YS1waHgtcGFyZW50LWlkXCIsJz1cIicpLmNvbmNhdCh0LCdcIl0nKSl9LGZpbmRQYXJlbnRDSURzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcyxpPW5ldyBTZXQodCk7cmV0dXJuIHQucmVkdWNlKGZ1bmN0aW9uKHQsaSl7dmFyIHI9XCJbXCIuY29uY2F0KEgsJz1cIicpLmNvbmNhdChpLCdcIl0gWycpLmNvbmNhdChILFwiXVwiKTtyZXR1cm4gbi5maWx0ZXJXaXRoaW5TYW1lTGl2ZVZpZXcobi5hbGwoZSxyKSxlKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHBhcnNlSW50KGUuZ2V0QXR0cmlidXRlKEgpKX0pLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIHQuZGVsZXRlKGUpfSksdH0saSl9LGZpbHRlcldpdGhpblNhbWVMaXZlVmlldzpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7cmV0dXJuIHQucXVlcnlTZWxlY3RvcihVKT9lLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gbi53aXRoaW5TYW1lTGl2ZVZpZXcoZSx0KX0pOmV9LHdpdGhpblNhbWVMaXZlVmlldzpmdW5jdGlvbihlLHQpe2Zvcig7ZT1lLnBhcmVudE5vZGU7KXtpZihlLmlzU2FtZU5vZGUodCkpcmV0dXJuITA7aWYoZS5nZXRBdHRyaWJ1dGUoTykpcmV0dXJuITF9fSxwcml2YXRlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUucGh4UHJpdmF0ZSYmZS5waHhQcml2YXRlW3RdfSxkZWxldGVQcml2YXRlOmZ1bmN0aW9uKGUsdCl7ZS5waHhQcml2YXRlJiZkZWxldGUgZS5waHhQcml2YXRlW3RdfSxwdXRQcml2YXRlOmZ1bmN0aW9uKGUsdCxuKXtlLnBoeFByaXZhdGV8fChlLnBoeFByaXZhdGU9e30pLGUucGh4UHJpdmF0ZVt0XT1ufSxjb3B5UHJpdmF0ZXM6ZnVuY3Rpb24oZSx0KXt0LnBoeFByaXZhdGUmJihlLnBoeFByaXZhdGU9JCh0LnBoeFByaXZhdGUpKX0scHV0VGl0bGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcInRpdGxlXCIpLmRhdGFzZXQsbj10LnByZWZpeCxpPXQuc3VmZml4O2RvY3VtZW50LnRpdGxlPVwiXCIuY29uY2F0KG58fFwiXCIpLmNvbmNhdChlKS5jb25jYXQoaXx8XCJcIil9LGRlYm91bmNlOmZ1bmN0aW9uKGUsdCxuLGkscixvLGEpe3ZhciB1PXRoaXMscz1lLmdldEF0dHJpYnV0ZShuKSxjPWUuZ2V0QXR0cmlidXRlKHIpO1wiXCI9PT1zJiYocz1pKSxcIlwiPT09YyYmKGM9byk7dmFyIGw9c3x8Yztzd2l0Y2gobCl7Y2FzZSBudWxsOnJldHVybiBhKCk7Y2FzZVwiYmx1clwiOnJldHVybiB2b2lkKHRoaXMub25jZShlLFwiZGVib3VuY2UtYmx1clwiKSYmZS5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLGZ1bmN0aW9uKCl7cmV0dXJuIGEoKX0pKTtkZWZhdWx0OnZhciBkPXBhcnNlSW50KGwpLGg9dGhpcy5pbmNDeWNsZShlLFwiZGVib3VuY2UtdHJpZ2dlclwiLGZ1bmN0aW9uKCl7cmV0dXJuIGM/dS5kZWxldGVQcml2YXRlKGUsXCJ0aHJvdHRsZWRcIik6YSgpfSk7aWYoaXNOYU4oZCkpcmV0dXJuIHooXCJpbnZhbGlkIHRocm90dGxlL2RlYm91bmNlIHZhbHVlOiBcIi5jb25jYXQobCkpO2lmKGMpe3ZhciBmPSExO2lmKFwia2V5ZG93blwiPT09dC50eXBlKXt2YXIgdj10aGlzLnByaXZhdGUoZSxcImRlYm91bmNlLXByZXYta2V5XCIpO3RoaXMucHV0UHJpdmF0ZShlLFwiZGVib3VuY2UtcHJldi1rZXlcIix0LmtleSksZj12IT09dC5rZXl9aWYoIWYmJnRoaXMucHJpdmF0ZShlLFwidGhyb3R0bGVkXCIpKXJldHVybiExO2EoKSx0aGlzLnB1dFByaXZhdGUoZSxcInRocm90dGxlZFwiLCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIHUudHJpZ2dlckN5Y2xlKGUsXCJkZWJvdW5jZS10cmlnZ2VyXCIpfSxkKX1lbHNlIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gdS50cmlnZ2VyQ3ljbGUoZSxcImRlYm91bmNlLXRyaWdnZXJcIixoKX0sZCk7ZS5mb3JtJiZ0aGlzLm9uY2UoZS5mb3JtLFwiYmluZC1kZWJvdW5jZVwiKSYmZS5mb3JtLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIixmdW5jdGlvbih0KXtBcnJheS5mcm9tKG5ldyBGb3JtRGF0YShlLmZvcm0pLmVudHJpZXMoKSxmdW5jdGlvbih0KXt2YXIgbj14KHQsMiksaT1uWzBdLHI9KG5bMV0sZS5mb3JtLnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lPVwiJy5jb25jYXQoaSwnXCJdJykpKTt1LmluY0N5Y2xlKHIsXCJkZWJvdW5jZS10cmlnZ2VyXCIpLHUuZGVsZXRlUHJpdmF0ZShyLFwidGhyb3R0bGVkXCIpfSl9KSx0aGlzLm9uY2UoZSxcImJpbmQtZGVib3VuY2VcIikmJmUuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIixmdW5jdGlvbih0KXtyZXR1cm4gdS50cmlnZ2VyQ3ljbGUoZSxcImRlYm91bmNlLXRyaWdnZXJcIil9KX19LHRyaWdnZXJDeWNsZTpmdW5jdGlvbihlLHQsbil7dmFyIGk9eCh0aGlzLnByaXZhdGUoZSx0KSwyKSxyPWlbMF0sbz1pWzFdO258fChuPXIpLG49PT1yJiYodGhpcy5pbmNDeWNsZShlLHQpLG8oKSl9LG9uY2U6ZnVuY3Rpb24oZSx0KXtyZXR1cm4hMCE9PXRoaXMucHJpdmF0ZShlLHQpJiYodGhpcy5wdXRQcml2YXRlKGUsdCwhMCksITApfSxpbmNDeWNsZTpmdW5jdGlvbihlLHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpmdW5jdGlvbigpe30saT14KHRoaXMucHJpdmF0ZShlLHQpfHxbMCxuXSwyKSxyPWlbMF07aVsxXTtyZXR1cm4gcisrLHRoaXMucHV0UHJpdmF0ZShlLHQsW3Isbl0pLHJ9LGRpc2NhcmRFcnJvcjpmdW5jdGlvbihlLHQsbil7dmFyIGk9dC5nZXRBdHRyaWJ1dGUmJnQuZ2V0QXR0cmlidXRlKG4pLHI9aSYmZS5xdWVyeVNlbGVjdG9yKCdbaWQ9XCInLmNvbmNhdChpLCdcIl0sIFtuYW1lPVwiJykuY29uY2F0KGksJ1wiXScpKTtyJiYodGhpcy5wcml2YXRlKHIsXCJwaHgtaGFzLWZvY3VzZWRcIil8fHRoaXMucHJpdmF0ZShyLmZvcm0sXCJwaHgtaGFzLXN1Ym1pdHRlZFwiKXx8dC5jbGFzc0xpc3QuYWRkKFwicGh4LW5vLWZlZWRiYWNrXCIpKX0sc2hvd0Vycm9yOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpczsoZS5pZHx8ZS5uYW1lKSYmdGhpcy5hbGwoZS5mb3JtLFwiW1wiLmNvbmNhdCh0LCc9XCInKS5jb25jYXQoZS5pZCwnXCJdLCBbJykuY29uY2F0KHQsJz1cIicpLmNvbmNhdChlLm5hbWUsJ1wiXScpLGZ1bmN0aW9uKGUpe24ucmVtb3ZlQ2xhc3MoZSxcInBoeC1uby1mZWVkYmFja1wiKX0pfSxpc1BoeENoaWxkOmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1wYXJlbnQtaWRcIil9LGRpc3BhdGNoRXZlbnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e30saT1uZXcgQ3VzdG9tRXZlbnQodCx7YnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGRldGFpbDpufSk7ZS5kaXNwYXRjaEV2ZW50KGkpfSxjbG9uZU5vZGU6ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDA9PT10KXJldHVybiBlLmNsb25lTm9kZSghMCk7dmFyIG49ZS5jbG9uZU5vZGUoITEpO3JldHVybiBuLmlubmVySFRNTD10LG59LG1lcmdlQXR0cnM6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGk9bi5leGNsdWRlfHxbXSxyPW4uaXNJZ25vcmVkLG89dC5hdHRyaWJ1dGVzLGE9by5sZW5ndGgtMTthPj0wO2EtLSl7dmFyIHU9b1thXS5uYW1lO2kuaW5kZXhPZih1KTwwJiZlLnNldEF0dHJpYnV0ZSh1LHQuZ2V0QXR0cmlidXRlKHUpKX1mb3IodmFyIHM9ZS5hdHRyaWJ1dGVzLGM9cy5sZW5ndGgtMTtjPj0wO2MtLSl7dmFyIGw9c1tjXS5uYW1lO3I/bC5zdGFydHNXaXRoKFwiZGF0YS1cIikmJiF0Lmhhc0F0dHJpYnV0ZShsKSYmZS5yZW1vdmVBdHRyaWJ1dGUobCk6dC5oYXNBdHRyaWJ1dGUobCl8fGUucmVtb3ZlQXR0cmlidXRlKGwpfX0sbWVyZ2VGb2N1c2VkSW5wdXQ6ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnR8fGxlLm1lcmdlQXR0cnMoZSx0LHtleGNlcHQ6W1widmFsdWVcIl19KSx0LnJlYWRPbmx5P2Uuc2V0QXR0cmlidXRlKFwicmVhZG9ubHlcIiwhMCk6ZS5yZW1vdmVBdHRyaWJ1dGUoXCJyZWFkb25seVwiKX0saGFzU2VsZWN0aW9uUmFuZ2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2V0U2VsZWN0aW9uUmFuZ2UmJihcInRleHRcIj09PWUudHlwZXx8XCJ0ZXh0YXJlYVwiPT09ZS50eXBlKX0scmVzdG9yZUZvY3VzOmZ1bmN0aW9uKGUsdCxuKXtpZihsZS5pc1RleHR1YWxJbnB1dChlKSl7dmFyIGk9ZS5tYXRjaGVzKFwiOmZvY3VzXCIpO2UucmVhZE9ubHkmJmUuYmx1cigpLGl8fGUuZm9jdXMoKSx0aGlzLmhhc1NlbGVjdGlvblJhbmdlKGUpJiZlLnNldFNlbGVjdGlvblJhbmdlKHQsbil9fSxpc0Zvcm1JbnB1dDpmdW5jdGlvbihlKXtyZXR1cm4vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2kudGVzdChlLnRhZ05hbWUpJiZcImJ1dHRvblwiIT09ZS50eXBlfSxzeW5jQXR0cnNUb1Byb3BzOmZ1bmN0aW9uKGUpe2UgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50JiZKLmluZGV4T2YoZS50eXBlLnRvTG9jYWxlTG93ZXJDYXNlKCkpPj0wJiYoZS5jaGVja2VkPW51bGwhPT1lLmdldEF0dHJpYnV0ZShcImNoZWNrZWRcIikpfSxpc1RleHR1YWxJbnB1dDpmdW5jdGlvbihlKXtyZXR1cm4gQi5pbmRleE9mKGUudHlwZSk+PTB9LGlzTm93VHJpZ2dlckZvcm1FeHRlcm5hbDpmdW5jdGlvbihlLHQpe3JldHVybiBlLmdldEF0dHJpYnV0ZSYmbnVsbCE9PWUuZ2V0QXR0cmlidXRlKHQpfSxzeW5jUGVuZGluZ1JlZjpmdW5jdGlvbihlLHQsbil7dmFyIGk9ZS5nZXRBdHRyaWJ1dGUoRik7cmV0dXJuIG51bGw9PT1pfHwobGUuaXNGb3JtSW5wdXQoZSl8fG51bGwhPT1lLmdldEF0dHJpYnV0ZShuKT8obGUuaXNVcGxvYWRJbnB1dChlKSYmbGUubWVyZ2VBdHRycyhlLHQse2lzSWdub3JlZDohMH0pLGxlLnB1dFByaXZhdGUoZSxGLHQpLCExKTooai5mb3JFYWNoKGZ1bmN0aW9uKG4pe2UuY2xhc3NMaXN0LmNvbnRhaW5zKG4pJiZ0LmNsYXNzTGlzdC5hZGQobil9KSx0LnNldEF0dHJpYnV0ZShGLGkpLCEwKSl9LGNsZWFuQ2hpbGROb2RlczpmdW5jdGlvbihlLHQpe2lmKGxlLmlzUGh4VXBkYXRlKGUsdCxbXCJhcHBlbmRcIixcInByZXBlbmRcIl0pKXt2YXIgbj1bXTtlLmNoaWxkTm9kZXMuZm9yRWFjaChmdW5jdGlvbihlKXtlLmlkfHwoZS5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFJiZcIlwiPT09ZS5ub2RlVmFsdWUudHJpbSgpfHx6KFwib25seSBIVE1MIGVsZW1lbnQgdGFncyB3aXRoIGFuIGlkIGFyZSBhbGxvd2VkIGluc2lkZSBjb250YWluZXJzIHdpdGggcGh4LXVwZGF0ZS5cXG5cXG5cIisncmVtb3ZpbmcgaWxsZWdhbCBub2RlOiBcIicuY29uY2F0KChlLm91dGVySFRNTHx8ZS5ub2RlVmFsdWUpLnRyaW0oKSwnXCJcXG5cXG4nKSksbi5wdXNoKGUpKX0pLG4uZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZW1vdmUoKX0pfX19LGRlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0LG4saSl7VCh0aGlzLGUpO3ZhciByPW5ldyBTZXQsbz1uZXcgU2V0KEEobi5jaGlsZHJlbikubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlkfSkpLGE9W107QXJyYXkuZnJvbSh0LmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKGUuaWQmJihyLmFkZChlLmlkKSxvLmhhcyhlLmlkKSkpe3ZhciB0PWUucHJldmlvdXNFbGVtZW50U2libGluZyYmZS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmlkO2EucHVzaCh7ZWxlbWVudElkOmUuaWQscHJldmlvdXNFbGVtZW50SWQ6dH0pfX0pLHRoaXMuY29udGFpbmVySWQ9bi5pZCx0aGlzLnVwZGF0ZVR5cGU9aSx0aGlzLmVsZW1lbnRzVG9Nb2RpZnk9YSx0aGlzLmVsZW1lbnRJZHNUb0FkZD1BKG8pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hci5oYXMoZSl9KX1yZXR1cm4gXyhlLFt7a2V5OlwicGVyZm9ybVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9bGUuYnlJZCh0aGlzLmNvbnRhaW5lcklkKTt0aGlzLmVsZW1lbnRzVG9Nb2RpZnkuZm9yRWFjaChmdW5jdGlvbih0KXt0LnByZXZpb3VzRWxlbWVudElkP1ooZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodC5wcmV2aW91c0VsZW1lbnRJZCksZnVuY3Rpb24oZSl7Wihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0LmVsZW1lbnRJZCksZnVuY3Rpb24odCl7dC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nJiZ0LnByZXZpb3VzRWxlbWVudFNpYmxpbmcuaWQ9PWUuaWR8fGUuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJlbmRcIix0KX0pfSk6Wihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0LmVsZW1lbnRJZCksZnVuY3Rpb24odCl7bnVsbD09dC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nfHxlLmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyYmVnaW5cIix0KX0pfSksXCJwcmVwZW5kXCI9PXRoaXMudXBkYXRlVHlwZSYmdGhpcy5lbGVtZW50SWRzVG9BZGQucmV2ZXJzZSgpLmZvckVhY2goZnVuY3Rpb24odCl7Wihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0KSxmdW5jdGlvbih0KXtyZXR1cm4gZS5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmJlZ2luXCIsdCl9KX0pfX1dKSxlfSgpLGhlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0LG4saSxyLG8pe1QodGhpcyxlKSx0aGlzLnZpZXc9dCx0aGlzLmxpdmVTb2NrZXQ9dC5saXZlU29ja2V0LHRoaXMuY29udGFpbmVyPW4sdGhpcy5pZD1pLHRoaXMucm9vdElEPXQucm9vdC5pZCx0aGlzLmh0bWw9cix0aGlzLnRhcmdldENJRD1vLHRoaXMuY2lkUGF0Y2g9XCJudW1iZXJcIj09dHlwZW9mIHRoaXMudGFyZ2V0Q0lELHRoaXMuY2FsbGJhY2tzPXtiZWZvcmVhZGRlZDpbXSxiZWZvcmV1cGRhdGVkOltdLGJlZm9yZXBoeENoaWxkQWRkZWQ6W10sYWZ0ZXJhZGRlZDpbXSxhZnRlcnVwZGF0ZWQ6W10sYWZ0ZXJkaXNjYXJkZWQ6W10sYWZ0ZXJwaHhDaGlsZEFkZGVkOltdfX1yZXR1cm4gXyhlLG51bGwsW3trZXk6XCJwYXRjaEVsXCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe2IoZSx0LHtjaGlsZHJlbk9ubHk6ITEsb25CZWZvcmVFbFVwZGF0ZWQ6ZnVuY3Rpb24oZSx0KXtpZihuJiZuLmlzU2FtZU5vZGUoZSkmJmxlLmlzRm9ybUlucHV0KGUpKXJldHVybiBsZS5tZXJnZUZvY3VzZWRJbnB1dChlLHQpLCExfX0pfX1dKSxfKGUsW3trZXk6XCJiZWZvcmVcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3RoaXMuY2FsbGJhY2tzW1wiYmVmb3JlXCIuY29uY2F0KGUpXS5wdXNoKHQpfX0se2tleTpcImFmdGVyXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt0aGlzLmNhbGxiYWNrc1tcImFmdGVyXCIuY29uY2F0KGUpXS5wdXNoKHQpfX0se2tleTpcInRyYWNrQmVmb3JlXCIsdmFsdWU6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkodD4xP3QtMTowKSxpPTE7aTx0O2krKyluW2ktMV09YXJndW1lbnRzW2ldO3RoaXMuY2FsbGJhY2tzW1wiYmVmb3JlXCIuY29uY2F0KGUpXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmFwcGx5KHZvaWQgMCxuKX0pfX0se2tleTpcInRyYWNrQWZ0ZXJcIix2YWx1ZTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheSh0PjE/dC0xOjApLGk9MTtpPHQ7aSsrKW5baS0xXT1hcmd1bWVudHNbaV07dGhpcy5jYWxsYmFja3NbXCJhZnRlclwiLmNvbmNhdChlKV0uZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gZS5hcHBseSh2b2lkIDAsbil9KX19LHtrZXk6XCJtYXJrUHJ1bmFibGVDb250ZW50Rm9yUmVtb3ZhbFwiLHZhbHVlOmZ1bmN0aW9uKCl7bGUuYWxsKHRoaXMuY29udGFpbmVyLFwiW3BoeC11cGRhdGU9YXBwZW5kXSA+ICosIFtwaHgtdXBkYXRlPXByZXBlbmRdID4gKlwiLGZ1bmN0aW9uKGUpe2Uuc2V0QXR0cmlidXRlKFwiZGF0YS1waHgtcmVtb3ZlXCIsXCJcIil9KX19LHtrZXk6XCJwZXJmb3JtXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy52aWV3LG49dGhpcy5saXZlU29ja2V0LGk9dGhpcy5jb250YWluZXIscj10aGlzLmh0bWwsbz10aGlzLmlzQ0lEUGF0Y2goKT90aGlzLnRhcmdldENJRENvbnRhaW5lcihyKTppO2lmKCF0aGlzLmlzQ0lEUGF0Y2goKXx8byl7dmFyIGE9bi5nZXRBY3RpdmVFbGVtZW50KCksdT1hJiZsZS5oYXNTZWxlY3Rpb25SYW5nZShhKT9hOnt9LHM9dS5zZWxlY3Rpb25TdGFydCxjPXUuc2VsZWN0aW9uRW5kLGw9bi5iaW5kaW5nKFwidXBkYXRlXCIpLGQ9bi5iaW5kaW5nKFwiZmVlZGJhY2stZm9yXCIpLGg9bi5iaW5kaW5nKFwiZGlzYWJsZS13aXRoXCIpLGY9bi5iaW5kaW5nKFwidHJpZ2dlci1hY3Rpb25cIiksdj1bXSxwPVtdLGc9W10sbT1udWxsLHk9bi50aW1lKFwicHJlbW9ycGggY29udGFpbmVyIHByZXBcIixmdW5jdGlvbigpe3JldHVybiBlLmJ1aWxkRGlmZkhUTUwoaSxyLGwsbyl9KTtyZXR1cm4gdGhpcy50cmFja0JlZm9yZShcImFkZGVkXCIsaSksdGhpcy50cmFja0JlZm9yZShcInVwZGF0ZWRcIixpLGkpLG4udGltZShcIm1vcnBoZG9tXCIsZnVuY3Rpb24oKXtiKG8seSx7Y2hpbGRyZW5Pbmx5Om51bGw9PT1vLmdldEF0dHJpYnV0ZShIKSxnZXROb2RlS2V5OmZ1bmN0aW9uKGUpe3JldHVybiBsZS5pc1BoeERlc3Ryb3llZChlKT9udWxsOmUuaWR9LG9uQmVmb3JlTm9kZUFkZGVkOmZ1bmN0aW9uKHQpe3JldHVybiBsZS5kaXNjYXJkRXJyb3Iobyx0LGQpLGUudHJhY2tCZWZvcmUoXCJhZGRlZFwiLHQpLHR9LG9uTm9kZUFkZGVkOmZ1bmN0aW9uKG4pe2xlLmlzTm93VHJpZ2dlckZvcm1FeHRlcm5hbChuLGYpJiYobT1uKSxsZS5pc1BoeENoaWxkKG4pJiZ0Lm93bnNFbGVtZW50KG4pJiZlLnRyYWNrQWZ0ZXIoXCJwaHhDaGlsZEFkZGVkXCIsbiksdi5wdXNoKG4pfSxvbk5vZGVEaXNjYXJkZWQ6ZnVuY3Rpb24odCl7bGUuaXNQaHhDaGlsZCh0KSYmbi5kZXN0cm95Vmlld0J5RWwodCksZS50cmFja0FmdGVyKFwiZGlzY2FyZGVkXCIsdCl9LG9uQmVmb3JlTm9kZURpc2NhcmRlZDpmdW5jdGlvbih0KXtyZXR1cm4hKCF0LmdldEF0dHJpYnV0ZXx8bnVsbD09PXQuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtcmVtb3ZlXCIpKXx8KG51bGw9PT10LnBhcmVudE5vZGV8fCFsZS5pc1BoeFVwZGF0ZSh0LnBhcmVudE5vZGUsbCxbXCJhcHBlbmRcIixcInByZXBlbmRcIl0pfHwhdC5pZCkmJiFlLnNraXBDSURTaWJsaW5nKHQpfSxvbkVsVXBkYXRlZDpmdW5jdGlvbihlKXtsZS5pc05vd1RyaWdnZXJGb3JtRXh0ZXJuYWwoZSxmKSYmKG09ZSkscC5wdXNoKGUpfSxvbkJlZm9yZUVsVXBkYXRlZDpmdW5jdGlvbih0LG4pe2lmKGxlLmNsZWFuQ2hpbGROb2RlcyhuLGwpLGUuc2tpcENJRFNpYmxpbmcobikpcmV0dXJuITE7aWYobGUuaXNJZ25vcmVkKHQsbCkpcmV0dXJuIGUudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsdCxuKSxsZS5tZXJnZUF0dHJzKHQsbix7aXNJZ25vcmVkOiEwfSkscC5wdXNoKHQpLCExO2lmKFwibnVtYmVyXCI9PT10LnR5cGUmJnQudmFsaWRpdHkmJnQudmFsaWRpdHkuYmFkSW5wdXQpcmV0dXJuITE7aWYoIWxlLnN5bmNQZW5kaW5nUmVmKHQsbixoKSlyZXR1cm4gbGUuaXNVcGxvYWRJbnB1dCh0KSYmKGUudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsdCxuKSxwLnB1c2godCkpLCExO2lmKGxlLmlzUGh4Q2hpbGQobikpe3ZhciBpPXQuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtc2Vzc2lvblwiKTtyZXR1cm4gbGUubWVyZ2VBdHRycyh0LG4se2V4Y2x1ZGU6W1wiZGF0YS1waHgtc3RhdGljXCJdfSksXCJcIiE9PWkmJnQuc2V0QXR0cmlidXRlKFwiZGF0YS1waHgtc2Vzc2lvblwiLGkpLHQuc2V0QXR0cmlidXRlKFwiZGF0YS1waHgtcm9vdC1pZFwiLGUucm9vdElEKSwhMX1yZXR1cm4gbGUuY29weVByaXZhdGVzKG4sdCksbGUuZGlzY2FyZEVycm9yKG8sbixkKSxhJiZ0LmlzU2FtZU5vZGUoYSkmJmxlLmlzRm9ybUlucHV0KHQpJiYhZS5mb3JjZUZvY3VzZWRTZWxlY3RVcGRhdGUodCxuKT8oZS50cmFja0JlZm9yZShcInVwZGF0ZWRcIix0LG4pLGxlLm1lcmdlRm9jdXNlZElucHV0KHQsbiksbGUuc3luY0F0dHJzVG9Qcm9wcyh0KSxwLnB1c2godCksITEpOihsZS5pc1BoeFVwZGF0ZShuLGwsW1wiYXBwZW5kXCIsXCJwcmVwZW5kXCJdKSYmZy5wdXNoKG5ldyBkZSh0LG4sbi5nZXRBdHRyaWJ1dGUobCkpKSxsZS5zeW5jQXR0cnNUb1Byb3BzKG4pLGUudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsdCxuKSwhMCl9fSl9KSxuLmlzRGVidWdFbmFibGVkKCkmJmZ1bmN0aW9uKCl7Zm9yKHZhciBlPW5ldyBTZXQsdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiKltpZF1cIiksbj0wLGk9dC5sZW5ndGg7bjxpO24rKyllLmhhcyh0W25dLmlkKT9jb25zb2xlLmVycm9yKFwiTXVsdGlwbGUgSURzIGRldGVjdGVkOiBcIi5jb25jYXQodFtuXS5pZCxcIi4gRW5zdXJlIHVuaXF1ZSBlbGVtZW50IGlkcy5cIikpOmUuYWRkKHRbbl0uaWQpfSgpLGcubGVuZ3RoPjAmJm4udGltZShcInBvc3QtbW9ycGggYXBwZW5kL3ByZXBlbmQgcmVzdG9yYXRpb25cIixmdW5jdGlvbigpe2cuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gZS5wZXJmb3JtKCl9KX0pLG4uc2lsZW5jZUV2ZW50cyhmdW5jdGlvbigpe3JldHVybiBsZS5yZXN0b3JlRm9jdXMoYSxzLGMpfSksbGUuZGlzcGF0Y2hFdmVudChkb2N1bWVudCxcInBoeDp1cGRhdGVcIiksdi5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBlLnRyYWNrQWZ0ZXIoXCJhZGRlZFwiLHQpfSkscC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBlLnRyYWNrQWZ0ZXIoXCJ1cGRhdGVkXCIsdCl9KSxtJiYobi5kaXNjb25uZWN0KCksbS5zdWJtaXQoKSksITB9fX0se2tleTpcImZvcmNlRm9jdXNlZFNlbGVjdFVwZGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49W1wic2VsZWN0XCIsXCJzZWxlY3Qtb25lXCIsXCJzZWxlY3QtbXVsdGlwbGVcIl0uZmluZChmdW5jdGlvbih0KXtyZXR1cm4gdD09PWUudHlwZX0pO3JldHVybiEwPT09ZS5tdWx0aXBsZXx8biYmZS5pbm5lckhUTUwhPXQuaW5uZXJIVE1MfX0se2tleTpcImlzQ0lEUGF0Y2hcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNpZFBhdGNofX0se2tleTpcInNraXBDSURTaWJsaW5nXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmbnVsbCE9PWUuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtc2tpcFwiKX19LHtrZXk6XCJ0YXJnZXRDSURDb250YWluZXJcIix2YWx1ZTpmdW5jdGlvbihlKXtpZih0aGlzLmlzQ0lEUGF0Y2goKSl7dmFyIHQ9ayhsZS5maW5kQ29tcG9uZW50Tm9kZUxpc3QodGhpcy5jb250YWluZXIsdGhpcy50YXJnZXRDSUQpKSxuPXRbMF07cmV0dXJuIDA9PT10LnNsaWNlKDEpLmxlbmd0aCYmMT09PWxlLmNoaWxkTm9kZUxlbmd0aChlKT9uOm4mJm4ucGFyZW50Tm9kZX19fSx7a2V5OlwiYnVpbGREaWZmSFRNTFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLGkpe3ZhciByPXRoaXMsbz10aGlzLmlzQ0lEUGF0Y2goKSxhPW8mJmkuZ2V0QXR0cmlidXRlKEgpPT09dGhpcy50YXJnZXRDSUQudG9TdHJpbmcoKTtpZighb3x8YSlyZXR1cm4gdDt2YXIgdT1udWxsLHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO3U9bGUuY2xvbmVOb2RlKGkpO3ZhciBjPWsobGUuZmluZENvbXBvbmVudE5vZGVMaXN0KHUsdGhpcy50YXJnZXRDSUQpKSxsPWNbMF0sZD1jLnNsaWNlKDEpO3JldHVybiBzLmlubmVySFRNTD10LGQuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZW1vdmUoKX0pLEFycmF5LmZyb20odS5jaGlsZE5vZGVzKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuaWQmJmUubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmZS5nZXRBdHRyaWJ1dGUoSCkhPT1yLnRhcmdldENJRC50b1N0cmluZygpJiYoZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1za2lwXCIsXCJcIiksZS5pbm5lckhUTUw9XCJcIil9KSxBcnJheS5mcm9tKHMuY29udGVudC5jaGlsZE5vZGVzKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiB1Lmluc2VydEJlZm9yZShlLGwpfSksbC5yZW1vdmUoKSx1Lm91dGVySFRNTH19XSksZX0oKSxmZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuLGkscixvKXt2YXIgYT10aGlzO1QodGhpcyxlKSx0aGlzLmxpdmVTb2NrZXQ9bix0aGlzLmZsYXNoPW8sdGhpcy5wYXJlbnQ9aSx0aGlzLnJvb3Q9aT9pLnJvb3Q6dGhpcyx0aGlzLmVsPXQsdGhpcy5pZD10aGlzLmVsLmlkLHRoaXMudmlldz10aGlzLmVsLmdldEF0dHJpYnV0ZShPKSx0aGlzLnJlZj0wLHRoaXMuY2hpbGRKb2lucz0wLHRoaXMubG9hZGVyVGltZXI9bnVsbCx0aGlzLnBlbmRpbmdEaWZmcz1bXSx0aGlzLnBydW5pbmdDSURzPVtdLHRoaXMuaHJlZj1yLHRoaXMuam9pbkNvdW50PXRoaXMucGFyZW50P3RoaXMucGFyZW50LmpvaW5Db3VudC0xOjAsdGhpcy5qb2luUGVuZGluZz0hMCx0aGlzLmRlc3Ryb3llZD0hMSx0aGlzLmpvaW5DYWxsYmFjaz1mdW5jdGlvbigpe30sdGhpcy5zdG9wQ2FsbGJhY2s9ZnVuY3Rpb24oKXt9LHRoaXMucGVuZGluZ0pvaW5PcHM9dGhpcy5wYXJlbnQ/bnVsbDpbXSx0aGlzLnZpZXdIb29rcz17fSx0aGlzLnVwbG9hZGVycz17fSx0aGlzLmZvcm1TdWJtaXRzPVtdLHRoaXMuY2hpbGRyZW49dGhpcy5wYXJlbnQ/bnVsbDp7fSx0aGlzLnJvb3QuY2hpbGRyZW5bdGhpcy5pZF09e30sdGhpcy5jaGFubmVsPXRoaXMubGl2ZVNvY2tldC5jaGFubmVsKFwibHY6XCIuY29uY2F0KHRoaXMuaWQpLGZ1bmN0aW9uKCl7cmV0dXJue3VybDphLmhyZWYscGFyYW1zOmEuY29ubmVjdFBhcmFtcygpLHNlc3Npb246YS5nZXRTZXNzaW9uKCksc3RhdGljOmEuZ2V0U3RhdGljKCksZmxhc2g6YS5mbGFzaH19KSx0aGlzLnNob3dMb2FkZXIodGhpcy5saXZlU29ja2V0LmxvYWRlclRpbWVvdXQpLHRoaXMuYmluZENoYW5uZWwoKX1yZXR1cm4gXyhlLFt7a2V5OlwiaXNNYWluXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5saXZlU29ja2V0Lm1haW49PT10aGlzfX0se2tleTpcImNvbm5lY3RQYXJhbXNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMubGl2ZVNvY2tldC5wYXJhbXModGhpcy52aWV3KSx0PWxlLmFsbChkb2N1bWVudCxcIltcIi5jb25jYXQodGhpcy5iaW5kaW5nKFwidHJhY2stc3RhdGljXCIpLFwiXVwiKSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNyY3x8ZS5ocmVmfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiBlfSk7cmV0dXJuIHQubGVuZ3RoPjAmJihlLl90cmFja19zdGF0aWM9dCksZS5fbW91bnRzPXRoaXMuam9pbkNvdW50LGV9fSx7a2V5OlwibmFtZVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlld319LHtrZXk6XCJpc0Nvbm5lY3RlZFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hhbm5lbC5jYW5QdXNoKCl9fSx7a2V5OlwiZ2V0U2Vzc2lvblwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtc2Vzc2lvblwiKX19LHtrZXk6XCJnZXRTdGF0aWNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtc3RhdGljXCIpO3JldHVyblwiXCI9PT1lP251bGw6ZX19LHtrZXk6XCJkZXN0cm95XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOmZ1bmN0aW9uKCl7fTt0aGlzLmRlc3Ryb3lBbGxDaGlsZHJlbigpLHRoaXMuZGVzdHJveWVkPSEwLGRlbGV0ZSB0aGlzLnJvb3QuY2hpbGRyZW5bdGhpcy5pZF0sdGhpcy5wYXJlbnQmJmRlbGV0ZSB0aGlzLnJvb3QuY2hpbGRyZW5bdGhpcy5wYXJlbnQuaWRdW3RoaXMuaWRdLGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKTt2YXIgbj1mdW5jdGlvbigpe2Zvcih2YXIgbiBpbiB0KCksZS52aWV3SG9va3MpZS5kZXN0cm95SG9vayhlLnZpZXdIb29rc1tuXSl9O2xlLm1hcmtQaHhDaGlsZERlc3Ryb3llZCh0aGlzLmVsKSx0aGlzLmxvZyhcImRlc3Ryb3llZFwiLGZ1bmN0aW9uKCl7cmV0dXJuW1widGhlIGNoaWxkIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcGFyZW50XCJdfSksdGhpcy5jaGFubmVsLmxlYXZlKCkucmVjZWl2ZShcIm9rXCIsbikucmVjZWl2ZShcImVycm9yXCIsbikucmVjZWl2ZShcInRpbWVvdXRcIixuKX19LHtrZXk6XCJzZXRDb250YWluZXJDbGFzc2VzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZTt0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoXCJwaHgtY29ubmVjdGVkXCIsXCJwaHgtZGlzY29ubmVjdGVkXCIsXCJwaHgtZXJyb3JcIiksKGU9dGhpcy5lbC5jbGFzc0xpc3QpLmFkZC5hcHBseShlLGFyZ3VtZW50cyl9fSx7a2V5OlwiaXNMb2FkaW5nXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbC5jbGFzc0xpc3QuY29udGFpbnMoXCJwaHgtZGlzY29ubmVjdGVkXCIpfX0se2tleTpcInNob3dMb2FkZXJcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKSxlKXRoaXMubG9hZGVyVGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiB0LnNob3dMb2FkZXIoKX0sZSk7ZWxzZXtmb3IodmFyIG4gaW4gdGhpcy52aWV3SG9va3MpdGhpcy52aWV3SG9va3Nbbl0uX19kaXNjb25uZWN0ZWQoKTt0aGlzLnNldENvbnRhaW5lckNsYXNzZXMoXCJwaHgtZGlzY29ubmVjdGVkXCIpfX19LHtrZXk6XCJoaWRlTG9hZGVyXCIsdmFsdWU6ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodGhpcy5sb2FkZXJUaW1lciksdGhpcy5zZXRDb250YWluZXJDbGFzc2VzKFwicGh4LWNvbm5lY3RlZFwiKX19LHtrZXk6XCJ0cmlnZ2VyUmVjb25uZWN0ZWRcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgZSBpbiB0aGlzLnZpZXdIb29rcyl0aGlzLnZpZXdIb29rc1tlXS5fX3JlY29ubmVjdGVkKCl9fSx7a2V5OlwibG9nXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt0aGlzLmxpdmVTb2NrZXQubG9nKHRoaXMsZSx0KX19LHtrZXk6XCJ3aXRoaW5UYXJnZXRzXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2lmKC9eKDB8WzEtOV1cXGQqKSQvLnRlc3QoZSkpe3ZhciBpPWxlLmZpbmRDb21wb25lbnROb2RlTGlzdCh0aGlzLmVsLGUpOzA9PT1pLmxlbmd0aD96KFwibm8gY29tcG9uZW50IGZvdW5kIG1hdGNoaW5nIHBoeC10YXJnZXQgb2YgXCIuY29uY2F0KGUpKTp0KHRoaXMsaVswXSl9ZWxzZXt2YXIgcj1BcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZSkpOzA9PT1yLmxlbmd0aCYmeignbm90aGluZyBmb3VuZCBtYXRjaGluZyB0aGUgcGh4LXRhcmdldCBzZWxlY3RvciBcIicuY29uY2F0KGUsJ1wiJykpLHIuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gbi5saXZlU29ja2V0Lm93bmVyKGUsZnVuY3Rpb24obil7cmV0dXJuIHQobixlKX0pfSl9fX0se2tleTpcImFwcGx5RGlmZlwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt0aGlzLmxvZyhlLGZ1bmN0aW9uKCl7cmV0dXJuW1wiXCIsJCh0KV19KTt2YXIgaT11ZS5leHRyYWN0KHQpLHI9aS5kaWZmLG89aS5yZXBseSxhPWkuZXZlbnRzLHU9aS50aXRsZTtyZXR1cm4gdSYmbGUucHV0VGl0bGUodSksbih7ZGlmZjpyLHJlcGx5Om8sZXZlbnRzOmF9KSxvfX0se2tleTpcIm9uSm9pblwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1lLnJlbmRlcmVkO3RoaXMuY2hpbGRKb2lucz0wLHRoaXMuam9pblBlbmRpbmc9ITAsdGhpcy5mbGFzaD1udWxsLGNlLmRyb3BMb2NhbCh0aGlzLm5hbWUoKSxcImNvbnNlY3V0aXZlLXJlbG9hZHNcIiksdGhpcy5hcHBseURpZmYoXCJtb3VudFwiLG4sZnVuY3Rpb24obil7dmFyIGk9bi5kaWZmLHI9bi5ldmVudHM7dC5yZW5kZXJlZD1uZXcgdWUodC5pZCxpKTt2YXIgbz10LnJlbmRlckNvbnRhaW5lcihudWxsLFwiam9pblwiKTt0LmRyb3BQZW5kaW5nUmVmcygpO3ZhciBhPXQuZm9ybXNGb3JSZWNvdmVyeShvKTt0LmpvaW5Db3VudCsrLGEubGVuZ3RoPjA/YS5mb3JFYWNoKGZ1bmN0aW9uKGUsbil7dC5wdXNoRm9ybVJlY292ZXJ5KGUsZnVuY3Rpb24oZSl7bj09PWEubGVuZ3RoLTEmJnQub25Kb2luQ29tcGxldGUoZSxvLHIpfSl9KTp0Lm9uSm9pbkNvbXBsZXRlKGUsbyxyKX0pfX0se2tleTpcImRyb3BQZW5kaW5nUmVmc1wiLHZhbHVlOmZ1bmN0aW9uKCl7bGUuYWxsKHRoaXMuZWwsXCJbXCIuY29uY2F0KEYsXCJdXCIpLGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlbW92ZUF0dHJpYnV0ZShGKX0pfX0se2tleTpcIm9uSm9pbkNvbXBsZXRlXCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXMscj1lLmxpdmVfcGF0Y2g7aWYodGhpcy5qb2luQ291bnQ+MXx8dGhpcy5wYXJlbnQmJiF0aGlzLnBhcmVudC5pc0pvaW5QZW5kaW5nKCkpcmV0dXJuIHRoaXMuYXBwbHlKb2luUGF0Y2gocix0LG4pOzA9PT1sZS5maW5kUGh4Q2hpbGRyZW5JbkZyYWdtZW50KHQsdGhpcy5pZCkuZmlsdGVyKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQmJmkuZWwucXVlcnlTZWxlY3RvcihcIiNcIi5jb25jYXQoZS5pZCkpLG49dCYmdC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1zdGF0aWNcIik7cmV0dXJuIG4mJmUuc2V0QXR0cmlidXRlKFwiZGF0YS1waHgtc3RhdGljXCIsbiksaS5qb2luQ2hpbGQoZSl9KS5sZW5ndGg/dGhpcy5wYXJlbnQ/KHRoaXMucm9vdC5wZW5kaW5nSm9pbk9wcy5wdXNoKFt0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIGkuYXBwbHlKb2luUGF0Y2gocix0LG4pfV0pLHRoaXMucGFyZW50LmFja0pvaW4odGhpcykpOih0aGlzLm9uQWxsQ2hpbGRKb2luc0NvbXBsZXRlKCksdGhpcy5hcHBseUpvaW5QYXRjaChyLHQsbikpOnRoaXMucm9vdC5wZW5kaW5nSm9pbk9wcy5wdXNoKFt0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIGkuYXBwbHlKb2luUGF0Y2gocix0LG4pfV0pfX0se2tleTpcImF0dGFjaFRydWVEb2NFbFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5lbD1sZS5ieUlkKHRoaXMuaWQpLHRoaXMuZWwuc2V0QXR0cmlidXRlKFwiZGF0YS1waHgtcm9vdC1pZFwiLHRoaXMucm9vdC5pZCl9fSx7a2V5OlwiZGlzcGF0Y2hFdmVudHNcIix2YWx1ZTpmdW5jdGlvbihlKXtlLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9eChlLDIpLG49dFswXSxpPXRbMV07d2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwicGh4Omhvb2s6XCIuY29uY2F0KG4pLHtkZXRhaWw6aX0pKX0pfX0se2tleTpcImFwcGx5Sm9pblBhdGNoXCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXM7dGhpcy5hdHRhY2hUcnVlRG9jRWwoKTt2YXIgcj1uZXcgaGUodGhpcyx0aGlzLmVsLHRoaXMuaWQsdCxudWxsKTtpZihyLm1hcmtQcnVuYWJsZUNvbnRlbnRGb3JSZW1vdmFsKCksdGhpcy5wZXJmb3JtUGF0Y2gociwhMSksdGhpcy5qb2luTmV3Q2hpbGRyZW4oKSxsZS5hbGwodGhpcy5lbCxcIltcIi5jb25jYXQodGhpcy5iaW5kaW5nKFwiaG9va1wiKSxcIl0sIFtkYXRhLXBoeC1cIikuY29uY2F0KFwiaG9va1wiLFwiXVwiKSxmdW5jdGlvbihlKXt2YXIgdD1pLmFkZEhvb2soZSk7dCYmdC5fX21vdW50ZWQoKX0pLHRoaXMuam9pblBlbmRpbmc9ITEsdGhpcy5kaXNwYXRjaEV2ZW50cyhuKSx0aGlzLmFwcGx5UGVuZGluZ1VwZGF0ZXMoKSxlKXt2YXIgbz1lLmtpbmQsYT1lLnRvO3RoaXMubGl2ZVNvY2tldC5oaXN0b3J5UGF0Y2goYSxvKX10aGlzLmhpZGVMb2FkZXIoKSx0aGlzLmpvaW5Db3VudD4xJiZ0aGlzLnRyaWdnZXJSZWNvbm5lY3RlZCgpLHRoaXMuc3RvcENhbGxiYWNrKCl9fSx7a2V5OlwidHJpZ2dlckJlZm9yZVVwZGF0ZUhvb2tcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3RoaXMubGl2ZVNvY2tldC50cmlnZ2VyRE9NKFwib25CZWZvcmVFbFVwZGF0ZWRcIixbZSx0XSk7dmFyIG49dGhpcy5nZXRIb29rKGUpLGk9biYmbGUuaXNJZ25vcmVkKGUsdGhpcy5iaW5kaW5nKFwidXBkYXRlXCIpKTtpZihuJiYhZS5pc0VxdWFsTm9kZSh0KSYmKCFpfHwhZnVuY3Rpb24oZSx0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSk9PT1KU09OLnN0cmluZ2lmeSh0KX0oZS5kYXRhc2V0LHQuZGF0YXNldCkpKXJldHVybiBuLl9fYmVmb3JlVXBkYXRlKCksbn19LHtrZXk6XCJwZXJmb3JtUGF0Y2hcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMsaT1bXSxyPSExLG89bmV3IFNldDtyZXR1cm4gZS5hZnRlcihcImFkZGVkXCIsZnVuY3Rpb24oZSl7bi5saXZlU29ja2V0LnRyaWdnZXJET00oXCJvbk5vZGVBZGRlZFwiLFtlXSk7dmFyIHQ9bi5hZGRIb29rKGUpO3QmJnQuX19tb3VudGVkKCl9KSxlLmFmdGVyKFwicGh4Q2hpbGRBZGRlZFwiLGZ1bmN0aW9uKGUpe3JldHVybiByPSEwfSksZS5iZWZvcmUoXCJ1cGRhdGVkXCIsZnVuY3Rpb24oZSx0KXtuLnRyaWdnZXJCZWZvcmVVcGRhdGVIb29rKGUsdCkmJm8uYWRkKGUuaWQpfSksZS5hZnRlcihcInVwZGF0ZWRcIixmdW5jdGlvbihlKXtvLmhhcyhlLmlkKSYmbi5nZXRIb29rKGUpLl9fdXBkYXRlZCgpfSksZS5hZnRlcihcImRpc2NhcmRlZFwiLGZ1bmN0aW9uKGUpe3ZhciB0PW4uY29tcG9uZW50SUQoZSk7XCJudW1iZXJcIj09dHlwZW9mIHQmJi0xPT09aS5pbmRleE9mKHQpJiZpLnB1c2godCk7dmFyIHI9bi5nZXRIb29rKGUpO3ImJm4uZGVzdHJveUhvb2socil9KSxlLnBlcmZvcm0oKSx0JiZ0aGlzLm1heWJlUHVzaENvbXBvbmVudHNEZXN0cm95ZWQoaSkscn19LHtrZXk6XCJqb2luTmV3Q2hpbGRyZW5cIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7bGUuZmluZFBoeENoaWxkcmVuKHRoaXMuZWwsdGhpcy5pZCkuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gZS5qb2luQ2hpbGQodCl9KX19LHtrZXk6XCJnZXRDaGlsZEJ5SWRcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdW2VdfX0se2tleTpcImdldERlc2NlbmRlbnRCeUVsXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuaWQ9PT10aGlzLmlkP3RoaXM6dGhpcy5jaGlsZHJlbltlLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LXBhcmVudC1pZFwiKV1bZS5pZF19fSx7a2V5OlwiZGVzdHJveURlc2NlbmRlbnRcIix2YWx1ZTpmdW5jdGlvbihlKXtmb3IodmFyIHQgaW4gdGhpcy5yb290LmNoaWxkcmVuKWZvcih2YXIgbiBpbiB0aGlzLnJvb3QuY2hpbGRyZW5bdF0paWYobj09PWUpcmV0dXJuIHRoaXMucm9vdC5jaGlsZHJlblt0XVtuXS5kZXN0cm95KCl9fSx7a2V5Olwiam9pbkNoaWxkXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXRoaXMuZ2V0Q2hpbGRCeUlkKHQuaWQpKXt2YXIgbj1uZXcgZSh0LHRoaXMubGl2ZVNvY2tldCx0aGlzKTtyZXR1cm4gdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdW24uaWRdPW4sbi5qb2luKCksdGhpcy5jaGlsZEpvaW5zKyssITB9fX0se2tleTpcImlzSm9pblBlbmRpbmdcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmpvaW5QZW5kaW5nfX0se2tleTpcImFja0pvaW5cIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLmNoaWxkSm9pbnMtLSwwPT09dGhpcy5jaGlsZEpvaW5zJiYodGhpcy5wYXJlbnQ/dGhpcy5wYXJlbnQuYWNrSm9pbih0aGlzKTp0aGlzLm9uQWxsQ2hpbGRKb2luc0NvbXBsZXRlKCkpfX0se2tleTpcIm9uQWxsQ2hpbGRKb2luc0NvbXBsZXRlXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmpvaW5DYWxsYmFjaygpLHRoaXMucGVuZGluZ0pvaW5PcHMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD14KGUsMiksbj10WzBdLGk9dFsxXTtuLmlzRGVzdHJveWVkKCl8fGkoKX0pLHRoaXMucGVuZGluZ0pvaW5PcHM9W119fSx7a2V5OlwidXBkYXRlXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2lmKHRoaXMuaXNKb2luUGVuZGluZygpfHx0aGlzLmxpdmVTb2NrZXQuaGFzUGVuZGluZ0xpbmsoKSlyZXR1cm4gdGhpcy5wZW5kaW5nRGlmZnMucHVzaCh7ZGlmZjplLGV2ZW50czp0fSk7dGhpcy5yZW5kZXJlZC5tZXJnZURpZmYoZSk7dmFyIGk9ITE7dGhpcy5yZW5kZXJlZC5pc0NvbXBvbmVudE9ubHlEaWZmKGUpP3RoaXMubGl2ZVNvY2tldC50aW1lKFwiY29tcG9uZW50IHBhdGNoIGNvbXBsZXRlXCIsZnVuY3Rpb24oKXtsZS5maW5kUGFyZW50Q0lEcyhuLmVsLG4ucmVuZGVyZWQuY29tcG9uZW50Q0lEcyhlKSkuZm9yRWFjaChmdW5jdGlvbih0KXtuLmNvbXBvbmVudFBhdGNoKG4ucmVuZGVyZWQuZ2V0Q29tcG9uZW50KGUsdCksdCkmJihpPSEwKX0pfSk6UShlKXx8dGhpcy5saXZlU29ja2V0LnRpbWUoXCJmdWxsIHBhdGNoIGNvbXBsZXRlXCIsZnVuY3Rpb24oKXt2YXIgdD1uLnJlbmRlckNvbnRhaW5lcihlLFwidXBkYXRlXCIpLHI9bmV3IGhlKG4sbi5lbCxuLmlkLHQsbnVsbCk7aT1uLnBlcmZvcm1QYXRjaChyLCEwKX0pLHRoaXMuZGlzcGF0Y2hFdmVudHModCksaSYmdGhpcy5qb2luTmV3Q2hpbGRyZW4oKX19LHtrZXk6XCJyZW5kZXJDb250YWluZXJcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7cmV0dXJuIHRoaXMubGl2ZVNvY2tldC50aW1lKFwidG9TdHJpbmcgZGlmZiAoXCIuY29uY2F0KHQsXCIpXCIpLGZ1bmN0aW9uKCl7dmFyIHQ9bi5lbC50YWdOYW1lLGk9ZT9uLnJlbmRlcmVkLmNvbXBvbmVudENJRHMoZSkuY29uY2F0KG4ucHJ1bmluZ0NJRHMpOm51bGwscj1uLnJlbmRlcmVkLnRvU3RyaW5nKGkpO3JldHVyblwiPFwiLmNvbmNhdCh0LFwiPlwiKS5jb25jYXQocixcIjwvXCIpLmNvbmNhdCh0LFwiPlwiKX0pfX0se2tleTpcImNvbXBvbmVudFBhdGNoXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtpZihRKGUpKXJldHVybiExO3ZhciBuPXRoaXMucmVuZGVyZWQuY29tcG9uZW50VG9TdHJpbmcodCksaT1uZXcgaGUodGhpcyx0aGlzLmVsLHRoaXMuaWQsbix0KTtyZXR1cm4gdGhpcy5wZXJmb3JtUGF0Y2goaSwhMCl9fSx7a2V5OlwiZ2V0SG9va1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnZpZXdIb29rc1twZS5lbGVtZW50SUQoZSldfX0se2tleTpcImFkZEhvb2tcIix2YWx1ZTpmdW5jdGlvbihlKXtpZighcGUuZWxlbWVudElEKGUpJiZlLmdldEF0dHJpYnV0ZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1cIi5jb25jYXQoXCJob29rXCIpKXx8ZS5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFwiaG9va1wiKSk7aWYoIXR8fHRoaXMub3duc0VsZW1lbnQoZSkpe3ZhciBuPXRoaXMubGl2ZVNvY2tldC5nZXRIb29rQ2FsbGJhY2tzKHQpO2lmKG4pe2UuaWR8fHooJ25vIERPTSBJRCBmb3IgaG9vayBcIicuY29uY2F0KHQsJ1wiLiBIb29rcyByZXF1aXJlIGEgdW5pcXVlIElEIG9uIGVhY2ggZWxlbWVudC4nKSxlKTt2YXIgaT1uZXcgcGUodGhpcyxlLG4pO3JldHVybiB0aGlzLnZpZXdIb29rc1twZS5lbGVtZW50SUQoaS5lbCldPWksaX1udWxsIT09dCYmeigndW5rbm93biBob29rIGZvdW5kIGZvciBcIicuY29uY2F0KHQsJ1wiJyksZSl9fX19LHtrZXk6XCJkZXN0cm95SG9va1wiLHZhbHVlOmZ1bmN0aW9uKGUpe2UuX19kZXN0cm95ZWQoKSxlLl9fY2xlYW51cF9fKCksZGVsZXRlIHRoaXMudmlld0hvb2tzW3BlLmVsZW1lbnRJRChlLmVsKV19fSx7a2V5OlwiYXBwbHlQZW5kaW5nVXBkYXRlc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLnBlbmRpbmdEaWZmcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPXQuZGlmZixpPXQuZXZlbnRzO3JldHVybiBlLnVwZGF0ZShuLGkpfSksdGhpcy5wZW5kaW5nRGlmZnM9W119fSx7a2V5Olwib25DaGFubmVsXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3RoaXMubGl2ZVNvY2tldC5vbkNoYW5uZWwodGhpcy5jaGFubmVsLGUsZnVuY3Rpb24oZSl7bi5pc0pvaW5QZW5kaW5nKCk/bi5yb290LnBlbmRpbmdKb2luT3BzLnB1c2goW24sZnVuY3Rpb24oKXtyZXR1cm4gdChlKX1dKTp0KGUpfSl9fSx7a2V5OlwiYmluZENoYW5uZWxcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5saXZlU29ja2V0Lm9uQ2hhbm5lbCh0aGlzLmNoYW5uZWwsXCJkaWZmXCIsZnVuY3Rpb24odCl7ZS5hcHBseURpZmYoXCJ1cGRhdGVcIix0LGZ1bmN0aW9uKHQpe3ZhciBuPXQuZGlmZixpPXQuZXZlbnRzO3JldHVybiBlLnVwZGF0ZShuLGkpfSl9KSx0aGlzLm9uQ2hhbm5lbChcInJlZGlyZWN0XCIsZnVuY3Rpb24odCl7dmFyIG49dC50byxpPXQuZmxhc2g7cmV0dXJuIGUub25SZWRpcmVjdCh7dG86bixmbGFzaDppfSl9KSx0aGlzLm9uQ2hhbm5lbChcImxpdmVfcGF0Y2hcIixmdW5jdGlvbih0KXtyZXR1cm4gZS5vbkxpdmVQYXRjaCh0KX0pLHRoaXMub25DaGFubmVsKFwibGl2ZV9yZWRpcmVjdFwiLGZ1bmN0aW9uKHQpe3JldHVybiBlLm9uTGl2ZVJlZGlyZWN0KHQpfSksdGhpcy5jaGFubmVsLm9uRXJyb3IoZnVuY3Rpb24odCl7cmV0dXJuIGUub25FcnJvcih0KX0pLHRoaXMuY2hhbm5lbC5vbkNsb3NlKGZ1bmN0aW9uKHQpe3JldHVybiBlLm9uQ2xvc2UodCl9KX19LHtrZXk6XCJkZXN0cm95QWxsQ2hpbGRyZW5cIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgZSBpbiB0aGlzLnJvb3QuY2hpbGRyZW5bdGhpcy5pZF0pdGhpcy5nZXRDaGlsZEJ5SWQoZSkuZGVzdHJveSgpfX0se2tleTpcIm9uTGl2ZVJlZGlyZWN0XCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50byxuPWUua2luZCxpPWUuZmxhc2gscj10aGlzLmV4cGFuZFVSTCh0KTt0aGlzLmxpdmVTb2NrZXQuaGlzdG9yeVJlZGlyZWN0KHIsbixpKX19LHtrZXk6XCJvbkxpdmVQYXRjaFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWUudG8sbj1lLmtpbmQ7dGhpcy5ocmVmPXRoaXMuZXhwYW5kVVJMKHQpLHRoaXMubGl2ZVNvY2tldC5oaXN0b3J5UGF0Y2godCxuKX19LHtrZXk6XCJleHBhbmRVUkxcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5zdGFydHNXaXRoKFwiL1wiKT9cIlwiLmNvbmNhdCh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wsXCIvL1wiKS5jb25jYXQod2luZG93LmxvY2F0aW9uLmhvc3QpLmNvbmNhdChlKTplfX0se2tleTpcIm9uUmVkaXJlY3RcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lLnRvLG49ZS5mbGFzaDt0aGlzLmxpdmVTb2NrZXQucmVkaXJlY3QodCxuKX19LHtrZXk6XCJpc0Rlc3Ryb3llZFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVzdHJveWVkfX0se2tleTpcImpvaW5cIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMucGFyZW50fHwodGhpcy5zdG9wQ2FsbGJhY2s9dGhpcy5saXZlU29ja2V0LndpdGhQYWdlTG9hZGluZyh7dG86dGhpcy5ocmVmLGtpbmQ6XCJpbml0aWFsXCJ9KSksdGhpcy5qb2luQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gZSYmZSh0LHQuam9pbkNvdW50KX0sdGhpcy5saXZlU29ja2V0LndyYXBQdXNoKHRoaXMse3RpbWVvdXQ6ITF9LGZ1bmN0aW9uKCl7cmV0dXJuIHQuY2hhbm5lbC5qb2luKCkucmVjZWl2ZShcIm9rXCIsZnVuY3Rpb24oZSl7cmV0dXJuIHQub25Kb2luKGUpfSkucmVjZWl2ZShcImVycm9yXCIsZnVuY3Rpb24oZSl7cmV0dXJuIHQub25Kb2luRXJyb3IoZSl9KS5yZWNlaXZlKFwidGltZW91dFwiLGZ1bmN0aW9uKCl7cmV0dXJuIHQub25Kb2luRXJyb3Ioe3JlYXNvbjpcInRpbWVvdXRcIn0pfSl9KX19LHtrZXk6XCJvbkpvaW5FcnJvclwiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybihlLnJlZGlyZWN0fHxlLmxpdmVfcmVkaXJlY3QpJiYodGhpcy5qb2luUGVuZGluZz0hMSx0aGlzLmNoYW5uZWwubGVhdmUoKSksZS5yZWRpcmVjdD90aGlzLm9uUmVkaXJlY3QoZS5yZWRpcmVjdCk6ZS5saXZlX3JlZGlyZWN0P3RoaXMub25MaXZlUmVkaXJlY3QoZS5saXZlX3JlZGlyZWN0KToodGhpcy5sb2coXCJlcnJvclwiLGZ1bmN0aW9uKCl7cmV0dXJuW1widW5hYmxlIHRvIGpvaW5cIixlXX0pLHRoaXMubGl2ZVNvY2tldC5yZWxvYWRXaXRoSml0dGVyKHRoaXMpKX19LHtrZXk6XCJvbkNsb3NlXCIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYoIXRoaXMuaXNEZXN0cm95ZWQoKSl7aWYodGhpcy5pc0pvaW5QZW5kaW5nKCl8fHRoaXMubGl2ZVNvY2tldC5oYXNQZW5kaW5nTGluaygpJiZcImxlYXZlXCIhPT1lKXJldHVybiB0aGlzLmxpdmVTb2NrZXQucmVsb2FkV2l0aEppdHRlcih0aGlzKTt0aGlzLmRlc3Ryb3lBbGxDaGlsZHJlbigpLHRoaXMubGl2ZVNvY2tldC5kcm9wQWN0aXZlRWxlbWVudCh0aGlzKSxkb2N1bWVudC5hY3RpdmVFbGVtZW50JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKSx0aGlzLmxpdmVTb2NrZXQuaXNVbmxvYWRlZCgpJiZ0aGlzLnNob3dMb2FkZXIoMjAwKX19fSx7a2V5Olwib25FcnJvclwiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMub25DbG9zZShlKSx0aGlzLmxvZyhcImVycm9yXCIsZnVuY3Rpb24oKXtyZXR1cm5bXCJ2aWV3IGNyYXNoZWRcIixlXX0pLHRoaXMubGl2ZVNvY2tldC5pc1VubG9hZGVkKCl8fHRoaXMuZGlzcGxheUVycm9yKCl9fSx7a2V5OlwiZGlzcGxheUVycm9yXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmlzTWFpbigpJiZsZS5kaXNwYXRjaEV2ZW50KHdpbmRvdyxcInBoeDpwYWdlLWxvYWRpbmctc3RhcnRcIix7dG86dGhpcy5ocmVmLGtpbmQ6XCJlcnJvclwifSksdGhpcy5zaG93TG9hZGVyKCksdGhpcy5zZXRDb250YWluZXJDbGFzc2VzKFwicGh4LWRpc2Nvbm5lY3RlZFwiLFwicGh4LWVycm9yXCIpfX0se2tleTpcInB1c2hXaXRoUmVwbHlcIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7dmFyIGk9dGhpcyxyPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTpmdW5jdGlvbigpe30sbz14KGU/ZSgpOltudWxsLFtdXSwyKSxhPW9bMF0sdT14KG9bMV0sMSlbMF0scz1mdW5jdGlvbigpe307cmV0dXJuIHUmJm51bGwhPT11LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJwYWdlLWxvYWRpbmdcIikpJiYocz10aGlzLmxpdmVTb2NrZXQud2l0aFBhZ2VMb2FkaW5nKHtraW5kOlwiZWxlbWVudFwiLHRhcmdldDp1fSkpLFwibnVtYmVyXCIhPXR5cGVvZiBuLmNpZCYmZGVsZXRlIG4uY2lkLHRoaXMubGl2ZVNvY2tldC53cmFwUHVzaCh0aGlzLHt0aW1lb3V0OiEwfSxmdW5jdGlvbigpe3JldHVybiBpLmNoYW5uZWwucHVzaCh0LG4sM2U0KS5yZWNlaXZlKFwib2tcIixmdW5jdGlvbihlKXt2YXIgdD1udWxsO251bGwhPT1hJiZpLnVuZG9SZWZzKGEpLGUuZGlmZiYmKHQ9aS5hcHBseURpZmYoXCJ1cGRhdGVcIixlLmRpZmYsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kaWZmLG49ZS5ldmVudHM7aS51cGRhdGUodCxuKX0pKSxlLnJlZGlyZWN0JiZpLm9uUmVkaXJlY3QoZS5yZWRpcmVjdCksZS5saXZlX3BhdGNoJiZpLm9uTGl2ZVBhdGNoKGUubGl2ZV9wYXRjaCksZS5saXZlX3JlZGlyZWN0JiZpLm9uTGl2ZVJlZGlyZWN0KGUubGl2ZV9yZWRpcmVjdCkscygpLHIoZSx0KX0pfSl9fSx7a2V5OlwidW5kb1JlZnNcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2xlLmFsbCh0aGlzLmVsLFwiW1wiLmNvbmNhdChGLCc9XCInKS5jb25jYXQoZSwnXCJdJyksZnVuY3Rpb24oZSl7ZS5yZW1vdmVBdHRyaWJ1dGUoRiksbnVsbCE9PWUuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtcmVhZG9ubHlcIikmJihlLnJlYWRPbmx5PSExLGUucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1waHgtcmVhZG9ubHlcIikpLG51bGwhPT1lLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LWRpc2FibGVkXCIpJiYoZS5kaXNhYmxlZD0hMSxlLnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtcGh4LWRpc2FibGVkXCIpKSxqLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGxlLnJlbW92ZUNsYXNzKGUsdCl9KTt2YXIgbj1lLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LWRpc2FibGUtd2l0aC1yZXN0b3JlXCIpO251bGwhPT1uJiYoZS5pbm5lclRleHQ9bixlLnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtcGh4LWRpc2FibGUtd2l0aC1yZXN0b3JlXCIpKTt2YXIgaT1sZS5wcml2YXRlKGUsRik7aWYoaSl7dmFyIHI9dC50cmlnZ2VyQmVmb3JlVXBkYXRlSG9vayhlLGkpO2hlLnBhdGNoRWwoZSxpLHQubGl2ZVNvY2tldC5nZXRBY3RpdmVFbGVtZW50KCkpLHImJnIuX191cGRhdGVkKCksbGUuZGVsZXRlUHJpdmF0ZShlLEYpfX0pfX0se2tleTpcInB1dFJlZlwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5yZWYrKyxpPXRoaXMuYmluZGluZyhcImRpc2FibGUtd2l0aFwiKTtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2xhc3NMaXN0LmFkZChcInBoeC1cIi5jb25jYXQodCxcIi1sb2FkaW5nXCIpKSxlLnNldEF0dHJpYnV0ZShGLG4pO3ZhciByPWUuZ2V0QXR0cmlidXRlKGkpO251bGwhPT1yJiYoZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1kaXNhYmxlLXdpdGgtcmVzdG9yZVwiKXx8ZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1kaXNhYmxlLXdpdGgtcmVzdG9yZVwiLGUuaW5uZXJUZXh0KSxlLmlubmVyVGV4dD1yKX0pLFtuLGVdfX0se2tleTpcImNvbXBvbmVudElEXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKEgpO3JldHVybiB0P3BhcnNlSW50KHQpOm51bGx9fSx7a2V5OlwidGFyZ2V0Q29tcG9uZW50SURcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiBlLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJ0YXJnZXRcIikpP3RoaXMuY2xvc2VzdENvbXBvbmVudElEKHQpOm51bGx9fSx7a2V5OlwiY2xvc2VzdENvbXBvbmVudElEXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gZT9aKGUuY2xvc2VzdChcIltcIi5jb25jYXQoSCxcIl1cIikpLGZ1bmN0aW9uKGUpe3JldHVybiB0Lm93bnNFbGVtZW50KGUpJiZ0LmNvbXBvbmVudElEKGUpfSk6bnVsbH19LHtrZXk6XCJwdXNoSG9va0V2ZW50XCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4saSl7aWYoIXRoaXMuaXNDb25uZWN0ZWQoKSlyZXR1cm4gdGhpcy5sb2coXCJob29rXCIsZnVuY3Rpb24oKXtyZXR1cm5bXCJ1bmFibGUgdG8gcHVzaCBob29rIGV2ZW50LiBMaXZlVmlldyBub3QgY29ubmVjdGVkXCIsdCxuXX0pLCExO3ZhciByPXgodGhpcy5wdXRSZWYoW10sXCJob29rXCIpLDIpLG89clswXSxhPXJbMV07cmV0dXJuIHRoaXMucHVzaFdpdGhSZXBseShmdW5jdGlvbigpe3JldHVybltvLGFdfSxcImV2ZW50XCIse3R5cGU6XCJob29rXCIsZXZlbnQ6dCx2YWx1ZTpuLGNpZDp0aGlzLmNsb3Nlc3RDb21wb25lbnRJRChlKX0sZnVuY3Rpb24oZSx0KXtyZXR1cm4gaSh0LG8pfSksb319LHtrZXk6XCJleHRyYWN0TWV0YVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXRoaXMuYmluZGluZyhcInZhbHVlLVwiKSxpPTA7aTxlLmF0dHJpYnV0ZXMubGVuZ3RoO2krKyl7dmFyIHI9ZS5hdHRyaWJ1dGVzW2ldLm5hbWU7ci5zdGFydHNXaXRoKG4pJiYodFtyLnJlcGxhY2UobixcIlwiKV09ZS5nZXRBdHRyaWJ1dGUocikpfXJldHVybiB2b2lkIDAhPT1lLnZhbHVlJiYodC52YWx1ZT1lLnZhbHVlLFwiSU5QVVRcIj09PWUudGFnTmFtZSYmSi5pbmRleE9mKGUudHlwZSk+PTAmJiFlLmNoZWNrZWQmJmRlbGV0ZSB0LnZhbHVlKSx0fX0se2tleTpcInB1c2hFdmVudFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLGkscil7dmFyIG89dGhpczt0aGlzLnB1c2hXaXRoUmVwbHkoZnVuY3Rpb24oKXtyZXR1cm4gby5wdXRSZWYoW3RdLGUpfSxcImV2ZW50XCIse3R5cGU6ZSxldmVudDppLHZhbHVlOnRoaXMuZXh0cmFjdE1ldGEodCxyKSxjaWQ6dGhpcy50YXJnZXRDb21wb25lbnRJRCh0LG4pfSl9fSx7a2V5OlwicHVzaEtleVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLGkscil7dmFyIG89dGhpczt0aGlzLnB1c2hXaXRoUmVwbHkoZnVuY3Rpb24oKXtyZXR1cm4gby5wdXRSZWYoW2VdLG4pfSxcImV2ZW50XCIse3R5cGU6bixldmVudDppLHZhbHVlOnRoaXMuZXh0cmFjdE1ldGEoZSxyKSxjaWQ6dGhpcy50YXJnZXRDb21wb25lbnRJRChlLHQpfSl9fSx7a2V5OlwicHVzaEZpbGVQcm9ncmVzc1wiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106ZnVuY3Rpb24oKXt9O3RoaXMubGl2ZVNvY2tldC53aXRoaW5Pd25lcnMoZS5mb3JtLGZ1bmN0aW9uKHIsbyl7ci5wdXNoV2l0aFJlcGx5KG51bGwsXCJwcm9ncmVzc1wiLHtldmVudDplLmdldEF0dHJpYnV0ZShyLmJpbmRpbmcoXCJwcm9ncmVzc1wiKSkscmVmOmUuZ2V0QXR0cmlidXRlKE0pLGVudHJ5X3JlZjp0LHByb2dyZXNzOm4sY2lkOnIudGFyZ2V0Q29tcG9uZW50SUQoZS5mb3JtLG8pfSxpKX0pfX0se2tleTpcInB1c2hJbnB1dFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLGkscil7dmFyIG89dGhpcyxhPXRoaXMudGFyZ2V0Q29tcG9uZW50SUQoZS5mb3JtLHQpLHU9ZnVuY3Rpb24oKXtyZXR1cm4gby5wdXRSZWYoW2UsZS5mb3JtXSxcImNoYW5nZVwiKX0scz1hZShlLmZvcm0se190YXJnZXQ6aS5uYW1lfSk7ZS5maWxlcyYmZS5maWxlcy5sZW5ndGg+MCYmaWUudHJhY2tGaWxlcyhlLEFycmF5LmZyb20oZS5maWxlcykpO3ZhciBjPXt0eXBlOlwiZm9ybVwiLGV2ZW50Om4sdmFsdWU6cyx1cGxvYWRzOmllLnNlcmlhbGl6ZVVwbG9hZHMoZSksY2lkOmF9O3RoaXMucHVzaFdpdGhSZXBseSh1LFwiZXZlbnRcIixjLGZ1bmN0aW9uKG4pe2lmKGxlLnNob3dFcnJvcihlLG8ubGl2ZVNvY2tldC5iaW5kaW5nKFwiZmVlZGJhY2stZm9yXCIpKSxsZS5pc1VwbG9hZElucHV0KGUpJiZudWxsIT09ZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1hdXRvLXVwbG9hZFwiKSl7aWYoaWUuZmlsZXNBd2FpdGluZ1ByZWZsaWdodChlKS5sZW5ndGg+MCl7dmFyIGk9eCh1KCksMikscz1pWzBdO2lbMV07by51cGxvYWRGaWxlcyhlLmZvcm0sdCxzLGEsZnVuY3Rpb24odCl7ciYmcihuKSxvLnRyaWdnZXJBd2FpdGluZ1N1Ym1pdChlLmZvcm0pfSl9fWVsc2UgciYmcihuKX0pfX0se2tleTpcInRyaWdnZXJBd2FpdGluZ1N1Ym1pdFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0U2NoZWR1bGVkU3VibWl0KGUpO2lmKHQpe3ZhciBuPXgodCwzKSxpPShuWzBdLG5bMV0sblsyXSk7dGhpcy5jYW5jZWxTdWJtaXQoZSksaSgpfX19LHtrZXk6XCJnZXRTY2hlZHVsZWRTdWJtaXRcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5mb3JtU3VibWl0cy5maW5kKGZ1bmN0aW9uKHQpe3ZhciBuPXgodCwyKSxpPW5bMF07blsxXTtyZXR1cm4gaS5pc1NhbWVOb2RlKGUpfSl9fSx7a2V5Olwic2NoZWR1bGVTdWJtaXRcIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7aWYodGhpcy5nZXRTY2hlZHVsZWRTdWJtaXQoZSkpcmV0dXJuITA7dGhpcy5mb3JtU3VibWl0cy5wdXNoKFtlLHQsbl0pfX0se2tleTpcImNhbmNlbFN1Ym1pdFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy5mb3JtU3VibWl0cz10aGlzLmZvcm1TdWJtaXRzLmZpbHRlcihmdW5jdGlvbihuKXt2YXIgaT14KG4sMykscj1pWzBdLG89aVsxXTtpWzJdO3JldHVybiFyLmlzU2FtZU5vZGUoZSl8fCh0LnVuZG9SZWZzKG8pLCExKX0pfX0se2tleTpcInB1c2hGb3JtU3VibWl0XCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4saSl7dmFyIHI9dGhpcyxvPWZ1bmN0aW9uKGUpe3JldHVybiEoRyhlLFwiXCIuY29uY2F0KHIuYmluZGluZyhcInVwZGF0ZVwiKSxcIj1pZ25vcmVcIiksZS5mb3JtKXx8RyhlLFwiZGF0YS1waHgtdXBkYXRlPWlnbm9yZVwiLGUuZm9ybSkpfSxhPWZ1bmN0aW9uKGUpe3JldHVybiBlLmhhc0F0dHJpYnV0ZShyLmJpbmRpbmcoXCJkaXNhYmxlLXdpdGhcIikpfSx1PWZ1bmN0aW9uKGUpe3JldHVyblwiQlVUVE9OXCI9PWUudGFnTmFtZX0scz1mdW5jdGlvbihlKXtyZXR1cm5bXCJJTlBVVFwiLFwiVEVYVEFSRUFcIixcIlNFTEVDVFwiXS5pbmNsdWRlcyhlLnRhZ05hbWUpfSxjPWZ1bmN0aW9uKCl7dmFyIHQ9QXJyYXkuZnJvbShlLmVsZW1lbnRzKSxuPXQuZmlsdGVyKGEpLGk9dC5maWx0ZXIodSkuZmlsdGVyKG8pLGM9dC5maWx0ZXIocykuZmlsdGVyKG8pO3JldHVybiBpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1kaXNhYmxlZFwiLGUuZGlzYWJsZWQpLGUuZGlzYWJsZWQ9ITB9KSxjLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1yZWFkb25seVwiLGUucmVhZE9ubHkpLGUucmVhZE9ubHk9ITAsZS5maWxlcyYmKGUuc2V0QXR0cmlidXRlKFwiZGF0YS1waHgtZGlzYWJsZWRcIixlLmRpc2FibGVkKSxlLmRpc2FibGVkPSEwKX0pLGUuc2V0QXR0cmlidXRlKHIuYmluZGluZyhcInBhZ2UtbG9hZGluZ1wiKSxcIlwiKSxyLnB1dFJlZihbZV0uY29uY2F0KG4pLmNvbmNhdChpKS5jb25jYXQoYyksXCJzdWJtaXRcIil9LGw9dGhpcy50YXJnZXRDb21wb25lbnRJRChlLHQpO2lmKGllLmhhc1VwbG9hZHNJblByb2dyZXNzKGUpKXt2YXIgZD14KGMoKSwyKSxoPWRbMF07ZFsxXTtyZXR1cm4gdGhpcy5zY2hlZHVsZVN1Ym1pdChlLGgsZnVuY3Rpb24oKXtyZXR1cm4gci5wdXNoRm9ybVN1Ym1pdChlLHQsbixpKX0pfWlmKGllLmlucHV0c0F3YWl0aW5nUHJlZmxpZ2h0KGUpLmxlbmd0aD4wKXt2YXIgZj14KGMoKSwyKSx2PWZbMF0scD1mWzFdLGc9ZnVuY3Rpb24oKXtyZXR1cm5bdixwXX07dGhpcy51cGxvYWRGaWxlcyhlLHQsdixsLGZ1bmN0aW9uKHQpe3ZhciBvPWFlKGUse30pO3IucHVzaFdpdGhSZXBseShnLFwiZXZlbnRcIix7dHlwZTpcImZvcm1cIixldmVudDpuLHZhbHVlOm8sY2lkOmx9LGkpfSl9ZWxzZXt2YXIgbT1hZShlKTt0aGlzLnB1c2hXaXRoUmVwbHkoYyxcImV2ZW50XCIse3R5cGU6XCJmb3JtXCIsZXZlbnQ6bix2YWx1ZTptLGNpZDpsfSxpKX19fSx7a2V5OlwidXBsb2FkRmlsZXNcIix2YWx1ZTpmdW5jdGlvbihlLHQsbixpLHIpe3ZhciBvPXRoaXMsYT10aGlzLmpvaW5Db3VudDtpZS5hY3RpdmVGaWxlSW5wdXRzKGUpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIGk9bmV3IGllKGUsbyxyKTtvLnVwbG9hZGVyc1tlXT1pO3ZhciB1PWkuZW50cmllcygpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS50b1ByZWZsaWdodFBheWxvYWQoKX0pLHM9e3JlZjplLmdldEF0dHJpYnV0ZShNKSxlbnRyaWVzOnUsY2lkOm8udGFyZ2V0Q29tcG9uZW50SUQoZS5mb3JtLHQpfTtvLmxvZyhcInVwbG9hZFwiLGZ1bmN0aW9uKCl7cmV0dXJuW1wic2VuZGluZyBwcmVmbGlnaHQgcmVxdWVzdFwiLHNdfSksby5wdXNoV2l0aFJlcGx5KG51bGwsXCJhbGxvd191cGxvYWRcIixzLGZ1bmN0aW9uKGUpe2lmKG8ubG9nKFwidXBsb2FkXCIsZnVuY3Rpb24oKXtyZXR1cm5bXCJnb3QgcHJlZmxpZ2h0IHJlc3BvbnNlXCIsZV19KSxlLmVycm9yKXtvLnVuZG9SZWZzKG4pO3ZhciB0PXgoZS5lcnJvciwyKSxyPXRbMF0sdT10WzFdO28ubG9nKFwidXBsb2FkXCIsZnVuY3Rpb24oKXtyZXR1cm5bXCJlcnJvciBmb3IgZW50cnkgXCIuY29uY2F0KHIpLHVdfSl9ZWxzZXtpLmluaXRBZGFwdGVyVXBsb2FkKGUsZnVuY3Rpb24oZSl7by5jaGFubmVsLm9uRXJyb3IoZnVuY3Rpb24oKXtvLmpvaW5Db3VudD09PWEmJmUoKX0pfSxvLmxpdmVTb2NrZXQpfX0pfSl9fSx7a2V5OlwicHVzaEZvcm1SZWNvdmVyeVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpczt0aGlzLmxpdmVTb2NrZXQud2l0aGluT3duZXJzKGUsZnVuY3Rpb24oaSxyKXt2YXIgbz1lLmVsZW1lbnRzWzBdLGE9ZS5nZXRBdHRyaWJ1dGUobi5iaW5kaW5nKFwiYXV0by1yZWNvdmVyXCIpKXx8ZS5nZXRBdHRyaWJ1dGUobi5iaW5kaW5nKFwiY2hhbmdlXCIpKTtpLnB1c2hJbnB1dChvLHIsYSxvLHQpfSl9fSx7a2V5OlwicHVzaExpbmtQYXRjaFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10aGlzLHI9dGhpcy5saXZlU29ja2V0LnNldFBlbmRpbmdMaW5rKGUpLG89dD9mdW5jdGlvbigpe3JldHVybiBpLnB1dFJlZihbdF0sXCJjbGlja1wiKX06bnVsbDt0aGlzLnB1c2hXaXRoUmVwbHkobyxcImxpbmtcIix7dXJsOmV9LGZ1bmN0aW9uKHQpe3QubGlua19yZWRpcmVjdD9pLmxpdmVTb2NrZXQucmVwbGFjZU1haW4oZSxudWxsLG4scik6aS5saXZlU29ja2V0LmNvbW1pdFBlbmRpbmdMaW5rKHIpJiYoaS5ocmVmPWUsaS5hcHBseVBlbmRpbmdVcGRhdGVzKCksbiYmbigpKX0pLnJlY2VpdmUoXCJ0aW1lb3V0XCIsZnVuY3Rpb24oKXtyZXR1cm4gaS5saXZlU29ja2V0LnJlZGlyZWN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKX0pfX0se2tleTpcImZvcm1zRm9yUmVjb3ZlcnlcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKDA9PT10aGlzLmpvaW5Db3VudClyZXR1cm5bXTt2YXIgbj10aGlzLmJpbmRpbmcoXCJjaGFuZ2VcIiksaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7cmV0dXJuIGkuaW5uZXJIVE1MPWUsbGUuYWxsKHRoaXMuZWwsXCJmb3JtW1wiLmNvbmNhdChuLFwiXVwiKSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiB0Lm93bnNFbGVtZW50KGUpfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLmVsZW1lbnRzLmxlbmd0aD4wfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVyblwiaWdub3JlXCIhPT1lLmdldEF0dHJpYnV0ZSh0LmJpbmRpbmcoXCJhdXRvLXJlY292ZXJcIikpfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBpLmNvbnRlbnQucXVlcnlTZWxlY3RvcihcImZvcm1bXCIuY29uY2F0KG4sJz1cIicpLmNvbmNhdChlLmdldEF0dHJpYnV0ZShuKSwnXCJdJykpfSl9fSx7a2V5OlwibWF5YmVQdXNoQ29tcG9uZW50c0Rlc3Ryb3llZFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcyxpPWUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiAwPT09bGUuZmluZENvbXBvbmVudE5vZGVMaXN0KG4uZWwsZSkubGVuZ3RofSk7aS5sZW5ndGg+MCYmKCh0PXRoaXMucHJ1bmluZ0NJRHMpLnB1c2guYXBwbHkodCxBKGkpKSx0aGlzLnB1c2hXaXRoUmVwbHkobnVsbCxcImNpZHNfd2lsbF9kZXN0cm95XCIse2NpZHM6aX0sZnVuY3Rpb24oKXtuLnBydW5pbmdDSURzPW4ucHJ1bmluZ0NJRHMuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybi0xIT09aS5pbmRleE9mKGUpfSk7dmFyIGU9aS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIDA9PT1sZS5maW5kQ29tcG9uZW50Tm9kZUxpc3Qobi5lbCxlKS5sZW5ndGh9KTtlLmxlbmd0aD4wJiZuLnB1c2hXaXRoUmVwbHkobnVsbCxcImNpZHNfZGVzdHJveWVkXCIse2NpZHM6ZX0sZnVuY3Rpb24oZSl7bi5yZW5kZXJlZC5wcnVuZUNJRHMoZS5jaWRzKX0pfSkpfX0se2tleTpcIm93bnNFbGVtZW50XCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtcGFyZW50LWlkXCIpPT09dGhpcy5pZHx8WihlLmNsb3Nlc3QoVSksZnVuY3Rpb24oZSl7cmV0dXJuIGUuaWR9KT09PXRoaXMuaWR9fSx7a2V5Olwic3VibWl0Rm9ybVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10aGlzO2xlLnB1dFByaXZhdGUoZSxcInBoeC1oYXMtc3VibWl0dGVkXCIsITApLHRoaXMubGl2ZVNvY2tldC5ibHVyQWN0aXZlRWxlbWVudCh0aGlzKSx0aGlzLnB1c2hGb3JtU3VibWl0KGUsdCxuLGZ1bmN0aW9uKCl7aS5saXZlU29ja2V0LnJlc3RvcmVQcmV2aW91c2x5QWN0aXZlRm9jdXMoKX0pfX0se2tleTpcImJpbmRpbmdcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5saXZlU29ja2V0LmJpbmRpbmcoZSl9fV0pLGV9KCksdmU9MSxwZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuLGkpe2Zvcih2YXIgciBpbiBUKHRoaXMsZSksdGhpcy5fX3ZpZXc9dCx0aGlzLl9fbGl2ZVNvY2tldD10LmxpdmVTb2NrZXQsdGhpcy5fX2NhbGxiYWNrcz1pLHRoaXMuX19saXN0ZW5lcnM9bmV3IFNldCx0aGlzLl9faXNEaXNjb25uZWN0ZWQ9ITEsdGhpcy5lbD1uLHRoaXMudmlld05hbWU9dC5uYW1lKCksdGhpcy5lbC5waHhIb29rSWQ9dGhpcy5jb25zdHJ1Y3Rvci5tYWtlSUQoKSx0aGlzLl9fY2FsbGJhY2tzKXRoaXNbcl09dGhpcy5fX2NhbGxiYWNrc1tyXX1yZXR1cm4gXyhlLG51bGwsW3trZXk6XCJtYWtlSURcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB2ZSsrfX0se2tleTpcImVsZW1lbnRJRFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnBoeEhvb2tJZH19XSksXyhlLFt7a2V5OlwiX19tb3VudGVkXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLm1vdW50ZWQmJnRoaXMubW91bnRlZCgpfX0se2tleTpcIl9fdXBkYXRlZFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGVkJiZ0aGlzLnVwZGF0ZWQoKX19LHtrZXk6XCJfX2JlZm9yZVVwZGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5iZWZvcmVVcGRhdGUmJnRoaXMuYmVmb3JlVXBkYXRlKCl9fSx7a2V5OlwiX19kZXN0cm95ZWRcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZGVzdHJveWVkJiZ0aGlzLmRlc3Ryb3llZCgpfX0se2tleTpcIl9fcmVjb25uZWN0ZWRcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX19pc0Rpc2Nvbm5lY3RlZCYmKHRoaXMuX19pc0Rpc2Nvbm5lY3RlZD0hMSx0aGlzLnJlY29ubmVjdGVkJiZ0aGlzLnJlY29ubmVjdGVkKCkpfX0se2tleTpcIl9fZGlzY29ubmVjdGVkXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLl9faXNEaXNjb25uZWN0ZWQ9ITAsdGhpcy5kaXNjb25uZWN0ZWQmJnRoaXMuZGlzY29ubmVjdGVkKCl9fSx7a2V5OlwicHVzaEV2ZW50XCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOmZ1bmN0aW9uKCl7fTtyZXR1cm4gdGhpcy5fX3ZpZXcucHVzaEhvb2tFdmVudChudWxsLGUsdCxuKX19LHtrZXk6XCJwdXNoRXZlbnRUb1wiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGk9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOmZ1bmN0aW9uKCl7fTtyZXR1cm4gdGhpcy5fX3ZpZXcud2l0aGluVGFyZ2V0cyhlLGZ1bmN0aW9uKGUscil7cmV0dXJuIGUucHVzaEhvb2tFdmVudChyLHQsbixpKX0pfX0se2tleTpcImhhbmRsZUV2ZW50XCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1mdW5jdGlvbihuLGkpe3JldHVybiBpP2U6dChuLmRldGFpbCl9O3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBoeDpob29rOlwiLmNvbmNhdChlKSxuKSx0aGlzLl9fbGlzdGVuZXJzLmFkZChuKSxufX0se2tleTpcInJlbW92ZUhhbmRsZUV2ZW50XCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZShudWxsLCEwKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBoeDpob29rOlwiLmNvbmNhdCh0KSxlKSx0aGlzLl9fbGlzdGVuZXJzLmRlbGV0ZShlKX19LHtrZXk6XCJfX2NsZWFudXBfX1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9fbGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGUucmVtb3ZlSGFuZGxlRXZlbnQodCl9KX19XSksZX0oKTt0LmRlZmF1bHQ9c2V9LGZ1bmN0aW9uKGUsdCl7dmFyIG47bj1mdW5jdGlvbigpe3JldHVybiB0aGlzfSgpO3RyeXtuPW58fEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKXx8KDAsZXZhbCkoXCJ0aGlzXCIpfWNhdGNoKGUpe1wib2JqZWN0XCI9PXR5cGVvZiB3aW5kb3cmJihuPXdpbmRvdyl9ZS5leHBvcnRzPW59LGZ1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24odCl7dC5QaG9lbml4fHwodC5QaG9lbml4PXt9KSxlLmV4cG9ydHM9dC5QaG9lbml4LkxpdmVWaWV3PW4oMCl9KS5jYWxsKHRoaXMsbigxKSl9XSl9KTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../deps/phoenix_live_view/priv/static/phoenix_live_view.js\n"); + + /***/ + }), + +/***/ "./js/app.js": +/*!*******************!*\ + !*** ./js/app.js ***! + \*******************/ +/*! no exports provided */ +/***/ (function (module, __webpack_exports__, __webpack_require__) { + + "use strict"; + + const Hooks = { + CountryInput: { + mounted() { + this.el.focus(); + this.handleEvent("clear-input", () => this.el.value = ""); + }, + + updated() { + this.el.focus(); + } + } + }; + + const nprogress = __webpack_require__("./node_modules/nprogress/nprogress.js"); + const nprogressDefault = __webpack_require__.n(nprogress); + + const Socket = __webpack_require__("../deps/phoenix/priv/static/phoenix.js"); + const LiveView = __webpack_require__("../deps/phoenix_live_view/priv/static/phoenix_live_view.js"); + + const csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content"); + const liveSocket = new LiveView["LiveSocket"]("/live", Socket["Socket"], { params: { _csrf_token: csrfToken }, hooks: Hooks }); + + // Show progress bar on live navigation and form submits + window.addEventListener("phx:page-loading-start", info => nprogressDefault.a.start()); + window.addEventListener("phx:page-loading-stop", info => nprogressDefault.a.done()); + + // connect if there are any LiveViews on the page + liveSocket.connect(); + + // expose liveSocket on window for web console debug logs and latency simulation: + // >> liveSocket.enableDebug() + // >> liveSocket.enableLatencySim(1000) // enabled for duration of browser session + // >> liveSocket.disableLatencySim() + window.liveSocket = liveSocket; + }), + +/***/ "./node_modules/nprogress/nprogress.js": +/*!*********************************************!*\ + !*** ./node_modules/nprogress/nprogress.js ***! + \*********************************************/ +/*! no static exports found */ +/***/ (function (module, exports, __webpack_require__) { + + eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress\n * @license MIT */\n\n;(function(root, factory) {\n\n if (true) {\n !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n\n})(this, function() {\n var NProgress = {};\n\n NProgress.version = '0.2.0';\n\n var Settings = NProgress.settings = {\n minimum: 0.08,\n easing: 'ease',\n positionUsing: '',\n speed: 200,\n trickle: true,\n trickleRate: 0.02,\n trickleSpeed: 800,\n showSpinner: true,\n barSelector: '[role=\"bar\"]',\n spinnerSelector: '[role=\"spinner\"]',\n parent: 'body',\n template: '
'\n };\n\n /**\n * Updates configuration.\n *\n * NProgress.configure({\n * minimum: 0.1\n * });\n */\n NProgress.configure = function(options) {\n var key, value;\n for (key in options) {\n value = options[key];\n if (value !== undefined && options.hasOwnProperty(key)) Settings[key] = value;\n }\n\n return this;\n };\n\n /**\n * Last number.\n */\n\n NProgress.status = null;\n\n /**\n * Sets the progress bar status, where `n` is a number from `0.0` to `1.0`.\n *\n * NProgress.set(0.4);\n * NProgress.set(1.0);\n */\n\n NProgress.set = function(n) {\n var started = NProgress.isStarted();\n\n n = clamp(n, Settings.minimum, 1);\n NProgress.status = (n === 1 ? null : n);\n\n var progress = NProgress.render(!started),\n bar = progress.querySelector(Settings.barSelector),\n speed = Settings.speed,\n ease = Settings.easing;\n\n progress.offsetWidth; /* Repaint */\n\n queue(function(next) {\n // Set positionUsing if it hasn't already been set\n if (Settings.positionUsing === '') Settings.positionUsing = NProgress.getPositioningCSS();\n\n // Add transition\n css(bar, barPositionCSS(n, speed, ease));\n\n if (n === 1) {\n // Fade out\n css(progress, { \n transition: 'none', \n opacity: 1 \n });\n progress.offsetWidth; /* Repaint */\n\n setTimeout(function() {\n css(progress, { \n transition: 'all ' + speed + 'ms linear', \n opacity: 0 \n });\n setTimeout(function() {\n NProgress.remove();\n next();\n }, speed);\n }, speed);\n } else {\n setTimeout(next, speed);\n }\n });\n\n return this;\n };\n\n NProgress.isStarted = function() {\n return typeof NProgress.status === 'number';\n };\n\n /**\n * Shows the progress bar.\n * This is the same as setting the status to 0%, except that it doesn't go backwards.\n *\n * NProgress.start();\n *\n */\n NProgress.start = function() {\n if (!NProgress.status) NProgress.set(0);\n\n var work = function() {\n setTimeout(function() {\n if (!NProgress.status) return;\n NProgress.trickle();\n work();\n }, Settings.trickleSpeed);\n };\n\n if (Settings.trickle) work();\n\n return this;\n };\n\n /**\n * Hides the progress bar.\n * This is the *sort of* the same as setting the status to 100%, with the\n * difference being `done()` makes some placebo effect of some realistic motion.\n *\n * NProgress.done();\n *\n * If `true` is passed, it will show the progress bar even if its hidden.\n *\n * NProgress.done(true);\n */\n\n NProgress.done = function(force) {\n if (!force && !NProgress.status) return this;\n\n return NProgress.inc(0.3 + 0.5 * Math.random()).set(1);\n };\n\n /**\n * Increments by a random amount.\n */\n\n NProgress.inc = function(amount) {\n var n = NProgress.status;\n\n if (!n) {\n return NProgress.start();\n } else {\n if (typeof amount !== 'number') {\n amount = (1 - n) * clamp(Math.random() * n, 0.1, 0.95);\n }\n\n n = clamp(n + amount, 0, 0.994);\n return NProgress.set(n);\n }\n };\n\n NProgress.trickle = function() {\n return NProgress.inc(Math.random() * Settings.trickleRate);\n };\n\n /**\n * Waits for all supplied jQuery promises and\n * increases the progress as the promises resolve.\n *\n * @param $promise jQUery Promise\n */\n (function() {\n var initial = 0, current = 0;\n\n NProgress.promise = function($promise) {\n if (!$promise || $promise.state() === \"resolved\") {\n return this;\n }\n\n if (current === 0) {\n NProgress.start();\n }\n\n initial++;\n current++;\n\n $promise.always(function() {\n current--;\n if (current === 0) {\n initial = 0;\n NProgress.done();\n } else {\n NProgress.set((initial - current) / initial);\n }\n });\n\n return this;\n };\n\n })();\n\n /**\n * (Internal) renders the progress bar markup based on the `template`\n * setting.\n */\n\n NProgress.render = function(fromStart) {\n if (NProgress.isRendered()) return document.getElementById('nprogress');\n\n addClass(document.documentElement, 'nprogress-busy');\n \n var progress = document.createElement('div');\n progress.id = 'nprogress';\n progress.innerHTML = Settings.template;\n\n var bar = progress.querySelector(Settings.barSelector),\n perc = fromStart ? '-100' : toBarPerc(NProgress.status || 0),\n parent = document.querySelector(Settings.parent),\n spinner;\n \n css(bar, {\n transition: 'all 0 linear',\n transform: 'translate3d(' + perc + '%,0,0)'\n });\n\n if (!Settings.showSpinner) {\n spinner = progress.querySelector(Settings.spinnerSelector);\n spinner && removeElement(spinner);\n }\n\n if (parent != document.body) {\n addClass(parent, 'nprogress-custom-parent');\n }\n\n parent.appendChild(progress);\n return progress;\n };\n\n /**\n * Removes the element. Opposite of render().\n */\n\n NProgress.remove = function() {\n removeClass(document.documentElement, 'nprogress-busy');\n removeClass(document.querySelector(Settings.parent), 'nprogress-custom-parent');\n var progress = document.getElementById('nprogress');\n progress && removeElement(progress);\n };\n\n /**\n * Checks if the progress bar is rendered.\n */\n\n NProgress.isRendered = function() {\n return !!document.getElementById('nprogress');\n };\n\n /**\n * Determine which positioning CSS rule to use.\n */\n\n NProgress.getPositioningCSS = function() {\n // Sniff on document.body.style\n var bodyStyle = document.body.style;\n\n // Sniff prefixes\n var vendorPrefix = ('WebkitTransform' in bodyStyle) ? 'Webkit' :\n ('MozTransform' in bodyStyle) ? 'Moz' :\n ('msTransform' in bodyStyle) ? 'ms' :\n ('OTransform' in bodyStyle) ? 'O' : '';\n\n if (vendorPrefix + 'Perspective' in bodyStyle) {\n // Modern browsers with 3D support, e.g. Webkit, IE10\n return 'translate3d';\n } else if (vendorPrefix + 'Transform' in bodyStyle) {\n // Browsers without 3D support, e.g. IE9\n return 'translate';\n } else {\n // Browsers without translate() support, e.g. IE7-8\n return 'margin';\n }\n };\n\n /**\n * Helpers\n */\n\n function clamp(n, min, max) {\n if (n < min) return min;\n if (n > max) return max;\n return n;\n }\n\n /**\n * (Internal) converts a percentage (`0..1`) to a bar translateX\n * percentage (`-100%..0%`).\n */\n\n function toBarPerc(n) {\n return (-1 + n) * 100;\n }\n\n\n /**\n * (Internal) returns the correct CSS for changing the bar's\n * position given an n percentage, and speed and ease from Settings\n */\n\n function barPositionCSS(n, speed, ease) {\n var barCSS;\n\n if (Settings.positionUsing === 'translate3d') {\n barCSS = { transform: 'translate3d('+toBarPerc(n)+'%,0,0)' };\n } else if (Settings.positionUsing === 'translate') {\n barCSS = { transform: 'translate('+toBarPerc(n)+'%,0)' };\n } else {\n barCSS = { 'margin-left': toBarPerc(n)+'%' };\n }\n\n barCSS.transition = 'all '+speed+'ms '+ease;\n\n return barCSS;\n }\n\n /**\n * (Internal) Queues a function to be executed.\n */\n\n var queue = (function() {\n var pending = [];\n \n function next() {\n var fn = pending.shift();\n if (fn) {\n fn(next);\n }\n }\n\n return function(fn) {\n pending.push(fn);\n if (pending.length == 1) next();\n };\n })();\n\n /**\n * (Internal) Applies css properties to an element, similar to the jQuery \n * css method.\n *\n * While this helper does assist with vendor prefixed property names, it \n * does not perform any manipulation of values prior to setting styles.\n */\n\n var css = (function() {\n var cssPrefixes = [ 'Webkit', 'O', 'Moz', 'ms' ],\n cssProps = {};\n\n function camelCase(string) {\n return string.replace(/^-ms-/, 'ms-').replace(/-([\\da-z])/gi, function(match, letter) {\n return letter.toUpperCase();\n });\n }\n\n function getVendorProp(name) {\n var style = document.body.style;\n if (name in style) return name;\n\n var i = cssPrefixes.length,\n capName = name.charAt(0).toUpperCase() + name.slice(1),\n vendorName;\n while (i--) {\n vendorName = cssPrefixes[i] + capName;\n if (vendorName in style) return vendorName;\n }\n\n return name;\n }\n\n function getStyleProp(name) {\n name = camelCase(name);\n return cssProps[name] || (cssProps[name] = getVendorProp(name));\n }\n\n function applyCss(element, prop, value) {\n prop = getStyleProp(prop);\n element.style[prop] = value;\n }\n\n return function(element, properties) {\n var args = arguments,\n prop, \n value;\n\n if (args.length == 2) {\n for (prop in properties) {\n value = properties[prop];\n if (value !== undefined && properties.hasOwnProperty(prop)) applyCss(element, prop, value);\n }\n } else {\n applyCss(element, args[1], args[2]);\n }\n }\n })();\n\n /**\n * (Internal) Determines if an element or space separated list of class names contains a class name.\n */\n\n function hasClass(element, name) {\n var list = typeof element == 'string' ? element : classList(element);\n return list.indexOf(' ' + name + ' ') >= 0;\n }\n\n /**\n * (Internal) Adds a class to an element.\n */\n\n function addClass(element, name) {\n var oldList = classList(element),\n newList = oldList + name;\n\n if (hasClass(oldList, name)) return; \n\n // Trim the opening space.\n element.className = newList.substring(1);\n }\n\n /**\n * (Internal) Removes a class from an element.\n */\n\n function removeClass(element, name) {\n var oldList = classList(element),\n newList;\n\n if (!hasClass(element, name)) return;\n\n // Replace the class name.\n newList = oldList.replace(' ' + name + ' ', ' ');\n\n // Trim the opening and closing spaces.\n element.className = newList.substring(1, newList.length - 1);\n }\n\n /**\n * (Internal) Gets a space separated list of the class names on the element. \n * The list is wrapped with a single space on each end to facilitate finding \n * matches within the list.\n */\n\n function classList(element) {\n return (' ' + (element.className || '') + ' ').replace(/\\s+/gi, ' ');\n }\n\n /**\n * (Internal) Removes an element from the DOM.\n */\n\n function removeElement(element) {\n element && element.parentNode && element.parentNode.removeChild(element);\n }\n\n return NProgress;\n});\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbnByb2dyZXNzL25wcm9ncmVzcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9ucHJvZ3Jlc3MvbnByb2dyZXNzLmpzPzMyM2UiXSwic291cmNlc0NvbnRlbnQiOlsiLyogTlByb2dyZXNzLCAoYykgMjAxMywgMjAxNCBSaWNvIFN0YS4gQ3J1eiAtIGh0dHA6Ly9yaWNvc3RhY3J1ei5jb20vbnByb2dyZXNzXG4gKiBAbGljZW5zZSBNSVQgKi9cblxuOyhmdW5jdGlvbihyb290LCBmYWN0b3J5KSB7XG5cbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShmYWN0b3J5KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgfSBlbHNlIHtcbiAgICByb290Lk5Qcm9ncmVzcyA9IGZhY3RvcnkoKTtcbiAgfVxuXG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbiAgdmFyIE5Qcm9ncmVzcyA9IHt9O1xuXG4gIE5Qcm9ncmVzcy52ZXJzaW9uID0gJzAuMi4wJztcblxuICB2YXIgU2V0dGluZ3MgPSBOUHJvZ3Jlc3Muc2V0dGluZ3MgPSB7XG4gICAgbWluaW11bTogMC4wOCxcbiAgICBlYXNpbmc6ICdlYXNlJyxcbiAgICBwb3NpdGlvblVzaW5nOiAnJyxcbiAgICBzcGVlZDogMjAwLFxuICAgIHRyaWNrbGU6IHRydWUsXG4gICAgdHJpY2tsZVJhdGU6IDAuMDIsXG4gICAgdHJpY2tsZVNwZWVkOiA4MDAsXG4gICAgc2hvd1NwaW5uZXI6IHRydWUsXG4gICAgYmFyU2VsZWN0b3I6ICdbcm9sZT1cImJhclwiXScsXG4gICAgc3Bpbm5lclNlbGVjdG9yOiAnW3JvbGU9XCJzcGlubmVyXCJdJyxcbiAgICBwYXJlbnQ6ICdib2R5JyxcbiAgICB0ZW1wbGF0ZTogJzxkaXYgY2xhc3M9XCJiYXJcIiByb2xlPVwiYmFyXCI+PGRpdiBjbGFzcz1cInBlZ1wiPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9XCJzcGlubmVyXCIgcm9sZT1cInNwaW5uZXJcIj48ZGl2IGNsYXNzPVwic3Bpbm5lci1pY29uXCI+PC9kaXY+PC9kaXY+J1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqICAgICBOUHJvZ3Jlc3MuY29uZmlndXJlKHtcbiAgICogICAgICAgbWluaW11bTogMC4xXG4gICAqICAgICB9KTtcbiAgICovXG4gIE5Qcm9ncmVzcy5jb25maWd1cmUgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgdmFyIGtleSwgdmFsdWU7XG4gICAgZm9yIChrZXkgaW4gb3B0aW9ucykge1xuICAgICAgdmFsdWUgPSBvcHRpb25zW2tleV07XG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmhhc093blByb3BlcnR5KGtleSkpIFNldHRpbmdzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogTGFzdCBudW1iZXIuXG4gICAqL1xuXG4gIE5Qcm9ncmVzcy5zdGF0dXMgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwcm9ncmVzcyBiYXIgc3RhdHVzLCB3aGVyZSBgbmAgaXMgYSBudW1iZXIgZnJvbSBgMC4wYCB0byBgMS4wYC5cbiAgICpcbiAgICogICAgIE5Qcm9ncmVzcy5zZXQoMC40KTtcbiAgICogICAgIE5Qcm9ncmVzcy5zZXQoMS4wKTtcbiAgICovXG5cbiAgTlByb2dyZXNzLnNldCA9IGZ1bmN0aW9uKG4pIHtcbiAgICB2YXIgc3RhcnRlZCA9IE5Qcm9ncmVzcy5pc1N0YXJ0ZWQoKTtcblxuICAgIG4gPSBjbGFtcChuLCBTZXR0aW5ncy5taW5pbXVtLCAxKTtcbiAgICBOUHJvZ3Jlc3Muc3RhdHVzID0gKG4gPT09IDEgPyBudWxsIDogbik7XG5cbiAgICB2YXIgcHJvZ3Jlc3MgPSBOUHJvZ3Jlc3MucmVuZGVyKCFzdGFydGVkKSxcbiAgICAgICAgYmFyICAgICAgPSBwcm9ncmVzcy5xdWVyeVNlbGVjdG9yKFNldHRpbmdzLmJhclNlbGVjdG9yKSxcbiAgICAgICAgc3BlZWQgICAgPSBTZXR0aW5ncy5zcGVlZCxcbiAgICAgICAgZWFzZSAgICAgPSBTZXR0aW5ncy5lYXNpbmc7XG5cbiAgICBwcm9ncmVzcy5vZmZzZXRXaWR0aDsgLyogUmVwYWludCAqL1xuXG4gICAgcXVldWUoZnVuY3Rpb24obmV4dCkge1xuICAgICAgLy8gU2V0IHBvc2l0aW9uVXNpbmcgaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiBzZXRcbiAgICAgIGlmIChTZXR0aW5ncy5wb3NpdGlvblVzaW5nID09PSAnJykgU2V0dGluZ3MucG9zaXRpb25Vc2luZyA9IE5Qcm9ncmVzcy5nZXRQb3NpdGlvbmluZ0NTUygpO1xuXG4gICAgICAvLyBBZGQgdHJhbnNpdGlvblxuICAgICAgY3NzKGJhciwgYmFyUG9zaXRpb25DU1Mobiwgc3BlZWQsIGVhc2UpKTtcblxuICAgICAgaWYgKG4gPT09IDEpIHtcbiAgICAgICAgLy8gRmFkZSBvdXRcbiAgICAgICAgY3NzKHByb2dyZXNzLCB7IFxuICAgICAgICAgIHRyYW5zaXRpb246ICdub25lJywgXG4gICAgICAgICAgb3BhY2l0eTogMSBcbiAgICAgICAgfSk7XG4gICAgICAgIHByb2dyZXNzLm9mZnNldFdpZHRoOyAvKiBSZXBhaW50ICovXG5cbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICBjc3MocHJvZ3Jlc3MsIHsgXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiAnYWxsICcgKyBzcGVlZCArICdtcyBsaW5lYXInLCBcbiAgICAgICAgICAgIG9wYWNpdHk6IDAgXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIE5Qcm9ncmVzcy5yZW1vdmUoKTtcbiAgICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgICB9LCBzcGVlZCk7XG4gICAgICAgIH0sIHNwZWVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFRpbWVvdXQobmV4dCwgc3BlZWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgTlByb2dyZXNzLmlzU3RhcnRlZCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0eXBlb2YgTlByb2dyZXNzLnN0YXR1cyA9PT0gJ251bWJlcic7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNob3dzIHRoZSBwcm9ncmVzcyBiYXIuXG4gICAqIFRoaXMgaXMgdGhlIHNhbWUgYXMgc2V0dGluZyB0aGUgc3RhdHVzIHRvIDAlLCBleGNlcHQgdGhhdCBpdCBkb2Vzbid0IGdvIGJhY2t3YXJkcy5cbiAgICpcbiAgICogICAgIE5Qcm9ncmVzcy5zdGFydCgpO1xuICAgKlxuICAgKi9cbiAgTlByb2dyZXNzLnN0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKCFOUHJvZ3Jlc3Muc3RhdHVzKSBOUHJvZ3Jlc3Muc2V0KDApO1xuXG4gICAgdmFyIHdvcmsgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghTlByb2dyZXNzLnN0YXR1cykgcmV0dXJuO1xuICAgICAgICBOUHJvZ3Jlc3MudHJpY2tsZSgpO1xuICAgICAgICB3b3JrKCk7XG4gICAgICB9LCBTZXR0aW5ncy50cmlja2xlU3BlZWQpO1xuICAgIH07XG5cbiAgICBpZiAoU2V0dGluZ3MudHJpY2tsZSkgd29yaygpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhpZGVzIHRoZSBwcm9ncmVzcyBiYXIuXG4gICAqIFRoaXMgaXMgdGhlICpzb3J0IG9mKiB0aGUgc2FtZSBhcyBzZXR0aW5nIHRoZSBzdGF0dXMgdG8gMTAwJSwgd2l0aCB0aGVcbiAgICogZGlmZmVyZW5jZSBiZWluZyBgZG9uZSgpYCBtYWtlcyBzb21lIHBsYWNlYm8gZWZmZWN0IG9mIHNvbWUgcmVhbGlzdGljIG1vdGlvbi5cbiAgICpcbiAgICogICAgIE5Qcm9ncmVzcy5kb25lKCk7XG4gICAqXG4gICAqIElmIGB0cnVlYCBpcyBwYXNzZWQsIGl0IHdpbGwgc2hvdyB0aGUgcHJvZ3Jlc3MgYmFyIGV2ZW4gaWYgaXRzIGhpZGRlbi5cbiAgICpcbiAgICogICAgIE5Qcm9ncmVzcy5kb25lKHRydWUpO1xuICAgKi9cblxuICBOUHJvZ3Jlc3MuZG9uZSA9IGZ1bmN0aW9uKGZvcmNlKSB7XG4gICAgaWYgKCFmb3JjZSAmJiAhTlByb2dyZXNzLnN0YXR1cykgcmV0dXJuIHRoaXM7XG5cbiAgICByZXR1cm4gTlByb2dyZXNzLmluYygwLjMgKyAwLjUgKiBNYXRoLnJhbmRvbSgpKS5zZXQoMSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEluY3JlbWVudHMgYnkgYSByYW5kb20gYW1vdW50LlxuICAgKi9cblxuICBOUHJvZ3Jlc3MuaW5jID0gZnVuY3Rpb24oYW1vdW50KSB7XG4gICAgdmFyIG4gPSBOUHJvZ3Jlc3Muc3RhdHVzO1xuXG4gICAgaWYgKCFuKSB7XG4gICAgICByZXR1cm4gTlByb2dyZXNzLnN0YXJ0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgYW1vdW50ICE9PSAnbnVtYmVyJykge1xuICAgICAgICBhbW91bnQgPSAoMSAtIG4pICogY2xhbXAoTWF0aC5yYW5kb20oKSAqIG4sIDAuMSwgMC45NSk7XG4gICAgICB9XG5cbiAgICAgIG4gPSBjbGFtcChuICsgYW1vdW50LCAwLCAwLjk5NCk7XG4gICAgICByZXR1cm4gTlByb2dyZXNzLnNldChuKTtcbiAgICB9XG4gIH07XG5cbiAgTlByb2dyZXNzLnRyaWNrbGUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gTlByb2dyZXNzLmluYyhNYXRoLnJhbmRvbSgpICogU2V0dGluZ3MudHJpY2tsZVJhdGUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgYWxsIHN1cHBsaWVkIGpRdWVyeSBwcm9taXNlcyBhbmRcbiAgICogaW5jcmVhc2VzIHRoZSBwcm9ncmVzcyBhcyB0aGUgcHJvbWlzZXMgcmVzb2x2ZS5cbiAgICpcbiAgICogQHBhcmFtICRwcm9taXNlIGpRVWVyeSBQcm9taXNlXG4gICAqL1xuICAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIGluaXRpYWwgPSAwLCBjdXJyZW50ID0gMDtcblxuICAgIE5Qcm9ncmVzcy5wcm9taXNlID0gZnVuY3Rpb24oJHByb21pc2UpIHtcbiAgICAgIGlmICghJHByb21pc2UgfHwgJHByb21pc2Uuc3RhdGUoKSA9PT0gXCJyZXNvbHZlZFwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3VycmVudCA9PT0gMCkge1xuICAgICAgICBOUHJvZ3Jlc3Muc3RhcnQoKTtcbiAgICAgIH1cblxuICAgICAgaW5pdGlhbCsrO1xuICAgICAgY3VycmVudCsrO1xuXG4gICAgICAkcHJvbWlzZS5hbHdheXMoZnVuY3Rpb24oKSB7XG4gICAgICAgIGN1cnJlbnQtLTtcbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IDApIHtcbiAgICAgICAgICAgIGluaXRpYWwgPSAwO1xuICAgICAgICAgICAgTlByb2dyZXNzLmRvbmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIE5Qcm9ncmVzcy5zZXQoKGluaXRpYWwgLSBjdXJyZW50KSAvIGluaXRpYWwpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICB9KSgpO1xuXG4gIC8qKlxuICAgKiAoSW50ZXJuYWwpIHJlbmRlcnMgdGhlIHByb2dyZXNzIGJhciBtYXJrdXAgYmFzZWQgb24gdGhlIGB0ZW1wbGF0ZWBcbiAgICogc2V0dGluZy5cbiAgICovXG5cbiAgTlByb2dyZXNzLnJlbmRlciA9IGZ1bmN0aW9uKGZyb21TdGFydCkge1xuICAgIGlmIChOUHJvZ3Jlc3MuaXNSZW5kZXJlZCgpKSByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25wcm9ncmVzcycpO1xuXG4gICAgYWRkQ2xhc3MoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAnbnByb2dyZXNzLWJ1c3knKTtcbiAgICBcbiAgICB2YXIgcHJvZ3Jlc3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBwcm9ncmVzcy5pZCA9ICducHJvZ3Jlc3MnO1xuICAgIHByb2dyZXNzLmlubmVySFRNTCA9IFNldHRpbmdzLnRlbXBsYXRlO1xuXG4gICAgdmFyIGJhciAgICAgID0gcHJvZ3Jlc3MucXVlcnlTZWxlY3RvcihTZXR0aW5ncy5iYXJTZWxlY3RvciksXG4gICAgICAgIHBlcmMgICAgID0gZnJvbVN0YXJ0ID8gJy0xMDAnIDogdG9CYXJQZXJjKE5Qcm9ncmVzcy5zdGF0dXMgfHwgMCksXG4gICAgICAgIHBhcmVudCAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihTZXR0aW5ncy5wYXJlbnQpLFxuICAgICAgICBzcGlubmVyO1xuICAgIFxuICAgIGNzcyhiYXIsIHtcbiAgICAgIHRyYW5zaXRpb246ICdhbGwgMCBsaW5lYXInLFxuICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoJyArIHBlcmMgKyAnJSwwLDApJ1xuICAgIH0pO1xuXG4gICAgaWYgKCFTZXR0aW5ncy5zaG93U3Bpbm5lcikge1xuICAgICAgc3Bpbm5lciA9IHByb2dyZXNzLnF1ZXJ5U2VsZWN0b3IoU2V0dGluZ3Muc3Bpbm5lclNlbGVjdG9yKTtcbiAgICAgIHNwaW5uZXIgJiYgcmVtb3ZlRWxlbWVudChzcGlubmVyKTtcbiAgICB9XG5cbiAgICBpZiAocGFyZW50ICE9IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgIGFkZENsYXNzKHBhcmVudCwgJ25wcm9ncmVzcy1jdXN0b20tcGFyZW50Jyk7XG4gICAgfVxuXG4gICAgcGFyZW50LmFwcGVuZENoaWxkKHByb2dyZXNzKTtcbiAgICByZXR1cm4gcHJvZ3Jlc3M7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIGVsZW1lbnQuIE9wcG9zaXRlIG9mIHJlbmRlcigpLlxuICAgKi9cblxuICBOUHJvZ3Jlc3MucmVtb3ZlID0gZnVuY3Rpb24oKSB7XG4gICAgcmVtb3ZlQ2xhc3MoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAnbnByb2dyZXNzLWJ1c3knKTtcbiAgICByZW1vdmVDbGFzcyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFNldHRpbmdzLnBhcmVudCksICducHJvZ3Jlc3MtY3VzdG9tLXBhcmVudCcpO1xuICAgIHZhciBwcm9ncmVzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCducHJvZ3Jlc3MnKTtcbiAgICBwcm9ncmVzcyAmJiByZW1vdmVFbGVtZW50KHByb2dyZXNzKTtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBwcm9ncmVzcyBiYXIgaXMgcmVuZGVyZWQuXG4gICAqL1xuXG4gIE5Qcm9ncmVzcy5pc1JlbmRlcmVkID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICEhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25wcm9ncmVzcycpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgd2hpY2ggcG9zaXRpb25pbmcgQ1NTIHJ1bGUgdG8gdXNlLlxuICAgKi9cblxuICBOUHJvZ3Jlc3MuZ2V0UG9zaXRpb25pbmdDU1MgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBTbmlmZiBvbiBkb2N1bWVudC5ib2R5LnN0eWxlXG4gICAgdmFyIGJvZHlTdHlsZSA9IGRvY3VtZW50LmJvZHkuc3R5bGU7XG5cbiAgICAvLyBTbmlmZiBwcmVmaXhlc1xuICAgIHZhciB2ZW5kb3JQcmVmaXggPSAoJ1dlYmtpdFRyYW5zZm9ybScgaW4gYm9keVN0eWxlKSA/ICdXZWJraXQnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgKCdNb3pUcmFuc2Zvcm0nIGluIGJvZHlTdHlsZSkgPyAnTW96JyA6XG4gICAgICAgICAgICAgICAgICAgICAgICgnbXNUcmFuc2Zvcm0nIGluIGJvZHlTdHlsZSkgPyAnbXMnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgKCdPVHJhbnNmb3JtJyBpbiBib2R5U3R5bGUpID8gJ08nIDogJyc7XG5cbiAgICBpZiAodmVuZG9yUHJlZml4ICsgJ1BlcnNwZWN0aXZlJyBpbiBib2R5U3R5bGUpIHtcbiAgICAgIC8vIE1vZGVybiBicm93c2VycyB3aXRoIDNEIHN1cHBvcnQsIGUuZy4gV2Via2l0LCBJRTEwXG4gICAgICByZXR1cm4gJ3RyYW5zbGF0ZTNkJztcbiAgICB9IGVsc2UgaWYgKHZlbmRvclByZWZpeCArICdUcmFuc2Zvcm0nIGluIGJvZHlTdHlsZSkge1xuICAgICAgLy8gQnJvd3NlcnMgd2l0aG91dCAzRCBzdXBwb3J0LCBlLmcuIElFOVxuICAgICAgcmV0dXJuICd0cmFuc2xhdGUnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCcm93c2VycyB3aXRob3V0IHRyYW5zbGF0ZSgpIHN1cHBvcnQsIGUuZy4gSUU3LThcbiAgICAgIHJldHVybiAnbWFyZ2luJztcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEhlbHBlcnNcbiAgICovXG5cbiAgZnVuY3Rpb24gY2xhbXAobiwgbWluLCBtYXgpIHtcbiAgICBpZiAobiA8IG1pbikgcmV0dXJuIG1pbjtcbiAgICBpZiAobiA+IG1heCkgcmV0dXJuIG1heDtcbiAgICByZXR1cm4gbjtcbiAgfVxuXG4gIC8qKlxuICAgKiAoSW50ZXJuYWwpIGNvbnZlcnRzIGEgcGVyY2VudGFnZSAoYDAuLjFgKSB0byBhIGJhciB0cmFuc2xhdGVYXG4gICAqIHBlcmNlbnRhZ2UgKGAtMTAwJS4uMCVgKS5cbiAgICovXG5cbiAgZnVuY3Rpb24gdG9CYXJQZXJjKG4pIHtcbiAgICByZXR1cm4gKC0xICsgbikgKiAxMDA7XG4gIH1cblxuXG4gIC8qKlxuICAgKiAoSW50ZXJuYWwpIHJldHVybnMgdGhlIGNvcnJlY3QgQ1NTIGZvciBjaGFuZ2luZyB0aGUgYmFyJ3NcbiAgICogcG9zaXRpb24gZ2l2ZW4gYW4gbiBwZXJjZW50YWdlLCBhbmQgc3BlZWQgYW5kIGVhc2UgZnJvbSBTZXR0aW5nc1xuICAgKi9cblxuICBmdW5jdGlvbiBiYXJQb3NpdGlvbkNTUyhuLCBzcGVlZCwgZWFzZSkge1xuICAgIHZhciBiYXJDU1M7XG5cbiAgICBpZiAoU2V0dGluZ3MucG9zaXRpb25Vc2luZyA9PT0gJ3RyYW5zbGF0ZTNkJykge1xuICAgICAgYmFyQ1NTID0geyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgnK3RvQmFyUGVyYyhuKSsnJSwwLDApJyB9O1xuICAgIH0gZWxzZSBpZiAoU2V0dGluZ3MucG9zaXRpb25Vc2luZyA9PT0gJ3RyYW5zbGF0ZScpIHtcbiAgICAgIGJhckNTUyA9IHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlKCcrdG9CYXJQZXJjKG4pKyclLDApJyB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBiYXJDU1MgPSB7ICdtYXJnaW4tbGVmdCc6IHRvQmFyUGVyYyhuKSsnJScgfTtcbiAgICB9XG5cbiAgICBiYXJDU1MudHJhbnNpdGlvbiA9ICdhbGwgJytzcGVlZCsnbXMgJytlYXNlO1xuXG4gICAgcmV0dXJuIGJhckNTUztcbiAgfVxuXG4gIC8qKlxuICAgKiAoSW50ZXJuYWwpIFF1ZXVlcyBhIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuICAgKi9cblxuICB2YXIgcXVldWUgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBlbmRpbmcgPSBbXTtcbiAgICBcbiAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgdmFyIGZuID0gcGVuZGluZy5zaGlmdCgpO1xuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIGZuKG5leHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbihmbikge1xuICAgICAgcGVuZGluZy5wdXNoKGZuKTtcbiAgICAgIGlmIChwZW5kaW5nLmxlbmd0aCA9PSAxKSBuZXh0KCk7XG4gICAgfTtcbiAgfSkoKTtcblxuICAvKipcbiAgICogKEludGVybmFsKSBBcHBsaWVzIGNzcyBwcm9wZXJ0aWVzIHRvIGFuIGVsZW1lbnQsIHNpbWlsYXIgdG8gdGhlIGpRdWVyeSBcbiAgICogY3NzIG1ldGhvZC5cbiAgICpcbiAgICogV2hpbGUgdGhpcyBoZWxwZXIgZG9lcyBhc3Npc3Qgd2l0aCB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHkgbmFtZXMsIGl0IFxuICAgKiBkb2VzIG5vdCBwZXJmb3JtIGFueSBtYW5pcHVsYXRpb24gb2YgdmFsdWVzIHByaW9yIHRvIHNldHRpbmcgc3R5bGVzLlxuICAgKi9cblxuICB2YXIgY3NzID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciBjc3NQcmVmaXhlcyA9IFsgJ1dlYmtpdCcsICdPJywgJ01veicsICdtcycgXSxcbiAgICAgICAgY3NzUHJvcHMgICAgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGNhbWVsQ2FzZShzdHJpbmcpIHtcbiAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXi1tcy0vLCAnbXMtJykucmVwbGFjZSgvLShbXFxkYS16XSkvZ2ksIGZ1bmN0aW9uKG1hdGNoLCBsZXR0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0VmVuZG9yUHJvcChuYW1lKSB7XG4gICAgICB2YXIgc3R5bGUgPSBkb2N1bWVudC5ib2R5LnN0eWxlO1xuICAgICAgaWYgKG5hbWUgaW4gc3R5bGUpIHJldHVybiBuYW1lO1xuXG4gICAgICB2YXIgaSA9IGNzc1ByZWZpeGVzLmxlbmd0aCxcbiAgICAgICAgICBjYXBOYW1lID0gbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSksXG4gICAgICAgICAgdmVuZG9yTmFtZTtcbiAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgdmVuZG9yTmFtZSA9IGNzc1ByZWZpeGVzW2ldICsgY2FwTmFtZTtcbiAgICAgICAgaWYgKHZlbmRvck5hbWUgaW4gc3R5bGUpIHJldHVybiB2ZW5kb3JOYW1lO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTdHlsZVByb3AobmFtZSkge1xuICAgICAgbmFtZSA9IGNhbWVsQ2FzZShuYW1lKTtcbiAgICAgIHJldHVybiBjc3NQcm9wc1tuYW1lXSB8fCAoY3NzUHJvcHNbbmFtZV0gPSBnZXRWZW5kb3JQcm9wKG5hbWUpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcHBseUNzcyhlbGVtZW50LCBwcm9wLCB2YWx1ZSkge1xuICAgICAgcHJvcCA9IGdldFN0eWxlUHJvcChwcm9wKTtcbiAgICAgIGVsZW1lbnQuc3R5bGVbcHJvcF0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24oZWxlbWVudCwgcHJvcGVydGllcykge1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgcHJvcCwgXG4gICAgICAgICAgdmFsdWU7XG5cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAyKSB7XG4gICAgICAgIGZvciAocHJvcCBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0aWVzW3Byb3BdO1xuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocHJvcCkpIGFwcGx5Q3NzKGVsZW1lbnQsIHByb3AsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXBwbHlDc3MoZWxlbWVudCwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICB9XG4gICAgfVxuICB9KSgpO1xuXG4gIC8qKlxuICAgKiAoSW50ZXJuYWwpIERldGVybWluZXMgaWYgYW4gZWxlbWVudCBvciBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjbGFzcyBuYW1lcyBjb250YWlucyBhIGNsYXNzIG5hbWUuXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGhhc0NsYXNzKGVsZW1lbnQsIG5hbWUpIHtcbiAgICB2YXIgbGlzdCA9IHR5cGVvZiBlbGVtZW50ID09ICdzdHJpbmcnID8gZWxlbWVudCA6IGNsYXNzTGlzdChlbGVtZW50KTtcbiAgICByZXR1cm4gbGlzdC5pbmRleE9mKCcgJyArIG5hbWUgKyAnICcpID49IDA7XG4gIH1cblxuICAvKipcbiAgICogKEludGVybmFsKSBBZGRzIGEgY2xhc3MgdG8gYW4gZWxlbWVudC5cbiAgICovXG5cbiAgZnVuY3Rpb24gYWRkQ2xhc3MoZWxlbWVudCwgbmFtZSkge1xuICAgIHZhciBvbGRMaXN0ID0gY2xhc3NMaXN0KGVsZW1lbnQpLFxuICAgICAgICBuZXdMaXN0ID0gb2xkTGlzdCArIG5hbWU7XG5cbiAgICBpZiAoaGFzQ2xhc3Mob2xkTGlzdCwgbmFtZSkpIHJldHVybjsgXG5cbiAgICAvLyBUcmltIHRoZSBvcGVuaW5nIHNwYWNlLlxuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gbmV3TGlzdC5zdWJzdHJpbmcoMSk7XG4gIH1cblxuICAvKipcbiAgICogKEludGVybmFsKSBSZW1vdmVzIGEgY2xhc3MgZnJvbSBhbiBlbGVtZW50LlxuICAgKi9cblxuICBmdW5jdGlvbiByZW1vdmVDbGFzcyhlbGVtZW50LCBuYW1lKSB7XG4gICAgdmFyIG9sZExpc3QgPSBjbGFzc0xpc3QoZWxlbWVudCksXG4gICAgICAgIG5ld0xpc3Q7XG5cbiAgICBpZiAoIWhhc0NsYXNzKGVsZW1lbnQsIG5hbWUpKSByZXR1cm47XG5cbiAgICAvLyBSZXBsYWNlIHRoZSBjbGFzcyBuYW1lLlxuICAgIG5ld0xpc3QgPSBvbGRMaXN0LnJlcGxhY2UoJyAnICsgbmFtZSArICcgJywgJyAnKTtcblxuICAgIC8vIFRyaW0gdGhlIG9wZW5pbmcgYW5kIGNsb3Npbmcgc3BhY2VzLlxuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gbmV3TGlzdC5zdWJzdHJpbmcoMSwgbmV3TGlzdC5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAoSW50ZXJuYWwpIEdldHMgYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiB0aGUgY2xhc3MgbmFtZXMgb24gdGhlIGVsZW1lbnQuIFxuICAgKiBUaGUgbGlzdCBpcyB3cmFwcGVkIHdpdGggYSBzaW5nbGUgc3BhY2Ugb24gZWFjaCBlbmQgdG8gZmFjaWxpdGF0ZSBmaW5kaW5nIFxuICAgKiBtYXRjaGVzIHdpdGhpbiB0aGUgbGlzdC5cbiAgICovXG5cbiAgZnVuY3Rpb24gY2xhc3NMaXN0KGVsZW1lbnQpIHtcbiAgICByZXR1cm4gKCcgJyArIChlbGVtZW50LmNsYXNzTmFtZSB8fCAnJykgKyAnICcpLnJlcGxhY2UoL1xccysvZ2ksICcgJyk7XG4gIH1cblxuICAvKipcbiAgICogKEludGVybmFsKSBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgRE9NLlxuICAgKi9cblxuICBmdW5jdGlvbiByZW1vdmVFbGVtZW50KGVsZW1lbnQpIHtcbiAgICBlbGVtZW50ICYmIGVsZW1lbnQucGFyZW50Tm9kZSAmJiBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG4gIH1cblxuICByZXR1cm4gTlByb2dyZXNzO1xufSk7XG5cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBLFdBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/nprogress/nprogress.js\n"); + + /***/ + }), + +/***/ 0: +/*!*************************!*\ + !*** multi ./js/app.js ***! + \*************************/ +/*! no static exports found */ +/***/ (function (module, exports, __webpack_require__) { + + module.exports = __webpack_require__(/*! ./js/app.js */"./js/app.js"); + + + /***/ + }) + + /******/ +}); diff --git a/priv/static/robots.txt b/priv/static/robots.txt new file mode 100644 index 0000000..3c9c7c0 --- /dev/null +++ b/priv/static/robots.txt @@ -0,0 +1,5 @@ +# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file +# +# To ban all spiders from the entire site uncomment the next two lines: +# User-agent: * +# Disallow: /