diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..007098c --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "elixirLS.projectDir": "lp", + "files.associations": + { + "*.lmay":"yaml" + }, +} \ No newline at end of file diff --git a/deploy/GCP deploy b/deploy/GCP deploy new file mode 100644 index 0000000..1d48355 --- /dev/null +++ b/deploy/GCP deploy @@ -0,0 +1,30 @@ +# commands from dev env should work. +# you'd need to add prod database to env, like this (don't use this exact one) +# export DATABASE_URL=ecto://postgres:postgres@localhost/lp_dev +# and gen a secret: +export SECRET_KEY_BASE=`mix phx.gen.secret` +# open ports you want to use for prod in firewall rules(instance settings) +# then add port you want to env: +# export PORT=80085 #this one won't work, obviously. put proper one here +# as I'm using micro instance with ssd, let's add swap :c +# use blkid to get uuid +# add the folloving line: +# UUID=XXXX-XXXX-XXXX-XXXX-XXXX /gssd ext4 errors=remount-ro 0 1 +# to /etc/fstab +#sudo sed -e '2iUUID=XXXX-XXXX-XXXX-XXXX-XXXX \/gssd ext4 errors=remount-ro 0 1' -i /etc/fstab +#sudo sed -e '2iUUID=ba0f9619-0a64-4e35-9de0-0cd63af25c0c \/gssd ext4 errors=remount-ro 0 1' -i /etc/fstab +sudo mkfs.ext4 /dev/sdb +sudo mount -t ext4 /dev/sdb /gssd +sudo fallocate -l 4G /gssd/swapfile +sudo chmod 600 /gssd/swapfile +sudo mkswap /gssd/swapfile +sudo sed -e '2i\/gssd\/swapfile swap swap defaults 0 0' -i /etc/fstab +git clone https://github.com/GameCult/GCLP.git +cd GCLP +# git checkout pet # for now +cd lp +mix deps.get +mix deps.compile +mix ecto.create +# fetch prod.exs config file + diff --git a/deploy/rel.sh b/deploy/rel.sh new file mode 100644 index 0000000..6fcea27 --- /dev/null +++ b/deploy/rel.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# don't forget to modify it, according to your db credentials +if [ -z "$DATABASE_URL"]; then +echo 'export DATABASE_URL=ecto://postgres:postgres@localhost/lp_dev' >> ~/.bashrc +fi +if [ -z "$SECRET_KEY_BASE"]; then +key=`mix phx.gen.secret` +echo 'export SECRET_KEY_BASE='$key >> ~/.bashrc +fi +if [ -z "$PORT"]; then +echo 'export PORT=80' >> ~/.bashrc +# echo 'export PORT=443' >> ~/.bashrc that was a mistake. it is http port in prod +fi +# and cert paths +if [ -z "$GCLP_SSL_KEY_PATH"]; then +echo 'export GCLP_SSL_KEY_PATH=~/GCLP/lp/priv/cert/selfsigned_key.pem' >> ~/.bashrc +fi +if [ -z "$GCLP_APP_SSL_CERT_PATH"]; then +echo 'export GCLP_APP_SSL_CERT_PATH=~/GCLP/lp/priv/cert/selfsigned.pem' >> ~/.bashrc +fi \ No newline at end of file diff --git a/deploy/release.sh b/deploy/release.sh new file mode 100644 index 0000000..df8af2f --- /dev/null +++ b/deploy/release.sh @@ -0,0 +1,26 @@ +#!/bin/bash +cd ../lp +sudo _build/prod/rel/lp/bin/lp stop +# git pull origin pet +mix deps.get --only prod +MIX_ENV=prod mix compile +npm install --prefix ./assets +npm run deploy --prefix ./assets +mix phx.digest # once you have something js related +MIX_ENV=prod mix release +sudo _build/prod/rel/lp/bin/lp daemon + +# note, that it is running in terminal + + + # start Starts the system + # start_iex Starts the system with IEx attached + # daemon Starts the system as a daemon + # daemon_iex Starts the system as a daemon with IEx attached + # eval "EXPR" Executes the given expression on a new, non-booted system + # rpc "EXPR" Executes the given expression remotely on the running system + # remote Connects to the running system via a remote shell + # restart Restarts the running system via a remote command + # stop Stops the running system via a remote command + # pid Prints the operating system PID of the running system via a remote command + # version Prints the release name and version to be booted \ No newline at end of file diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml new file mode 100644 index 0000000..f15852d --- /dev/null +++ b/docker/docker-compose.yaml @@ -0,0 +1,10 @@ +#todo +version: 3.8 +services: + elixir_dev: + build: + context: ./elixir_dev + ports: + - 4000:4000 + volumes: + - "./volumes/elixir:/elixir" \ No newline at end of file diff --git a/docker/elixir_dev/.Dockerfile b/docker/elixir_dev/.Dockerfile new file mode 100644 index 0000000..730fd5a --- /dev/null +++ b/docker/elixir_dev/.Dockerfile @@ -0,0 +1,54 @@ +FROM ubuntu:18.04 + +# install ubuntu packages +RUN apt-get update -q \ + && apt-get install -y \ + git \ + curl \ + locales \ + build-essential \ + autoconf \ + libncurses5-dev \ + libwxgtk3.0-dev \ + libgl1-mesa-dev \ + libglu1-mesa-dev \ + libpng-dev \ + libssh-dev \ + unixodbc-dev \ + && apt-get clean + +# install asdf and its plugins +# ASDF will only correctly install plugins into the home directory as of 0.7.5 +# so .... Just go with it. +ENV ASDF_ROOT /root/.asdf +ENV PATH "${ASDF_ROOT}/bin:${ASDF_ROOT}/shims:$PATH" + +RUN git clone https://github.com/asdf-vm/asdf.git ${ASDF_ROOT} --branch v0.7.5 \ + && asdf plugin-add erlang https://github.com/asdf-vm/asdf-erlang \ + && asdf plugin-add elixir https://github.com/asdf-vm/asdf-elixir \ + && asdf plugin-add nodejs https://github.com/asdf-vm/asdf-nodejs \ + && ${ASDF_ROOT}/plugins/nodejs/bin/import-release-team-keyring + +# set the locale +RUN locale-gen en_US.UTF-8 +ENV LANG en_US.UTF-8 +ENV LANGUAGE en_US:en +ENV LC_ALL en_US.UTF-8 +# install erlang +ENV ERLANG_VERSION 22.0.7 +RUN asdf install erlang ${ERLANG_VERSION} \ + && asdf global erlang ${ERLANG_VERSION} + +# install elixir +ENV ELIXIR_VERSION 1.10.3-otp-21 +RUN asdf install elixir ${ELIXIR_VERSION} \ + && asdf global elixir ${ELIXIR_VERSION} + +# install local Elixir hex and rebar +RUN mix local.hex --force \ + && mix local.rebar --force + +# install nodejs +ENV NODEJS_VERSION 12.8.4 +RUN asdf install nodejs ${NODEJS_VERSION} \ + && asdf global nodejs ${NODEJS_VERSION} \ No newline at end of file diff --git a/docs/cli log b/docs/cli log new file mode 100644 index 0000000..adab935 --- /dev/null +++ b/docs/cli log @@ -0,0 +1,11 @@ +mix phx.new lp --live +cd lp + +# on local machine, for dev +# needs postgres, default credentials are postgres/postgres +# see: lp/config/dev.exs +mix ecto create +mix deps get +mix deps compile +# self-signed ssl cert, localhost for dev +mix phx.gen.cert diff --git a/docs/dev env b/docs/dev env new file mode 100644 index 0000000..6baf850 --- /dev/null +++ b/docs/dev env @@ -0,0 +1,30 @@ +# todo: docker +# On windows - just install wsl2 (see https://docs.microsoft.com/en-us/windows/wsl/install-win10 ) +# then ubuntu, preferably 18.04lts +# after that, just use ubuntu commands. + +# might use this, for skipping prompts during installation +export DEBIAN_FRONTEND=noninteractive #not really helping +# +sudo apt-get install wget ca-certificates +wget https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb && sudo dpkg -i erlang-solutions_2.0_all.deb +sudo apt-get update +sudo apt-get install esl-erlang elixir inotify-tools nodejs npm yarn python git +mix local.hex --force +mix local.rebar --force +mix archive.install hex phx_new 1.5.5 + +# postgres: +wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - +sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" >> /etc/apt/sources.list.d/pgdg.list' +sudo apt-get update +sudo apt-get install postgresql postgresql-contrib +# create default user postgre with password postgres in database postgres +# (that's what phoenix expects by default. see /config/dev.exs) +sudo -u postgres psql postgres +\password postgres +postgres +postgres +quit + +# now you are good to go. feel free to add here if I missed something or contact me \ No newline at end of file diff --git a/docs/notes b/docs/notes new file mode 100644 index 0000000..15fc80e --- /dev/null +++ b/docs/notes @@ -0,0 +1,3 @@ + in production, you would usually deal with static assets at application server layer, possibly not hitting Phoenix at all. + uses https only on port 443 in dev + diff --git a/docs/project structure.lmay b/docs/project structure.lmay new file mode 100644 index 0000000..f6e1604 --- /dev/null +++ b/docs/project structure.lmay @@ -0,0 +1,17 @@ +# lmay = yaml. +# in vs code, Open Settings (JSON): +# +# "files.associations": +# { +# "*.lmay":"yaml" +# }, +# or feel free to rename it ^_^ +folders: + lib: + description: all sources + +files: + lib/lp_web/: + router.ex: + notes: + diff --git a/docs/skills/elixir b/docs/skills/elixir new file mode 100644 index 0000000..4976d79 --- /dev/null +++ b/docs/skills/elixir @@ -0,0 +1,2 @@ +mix.exs -> put deps here +func (a)+b -> func((a)+b) ;brackets are added implicitly \ No newline at end of file diff --git a/docs/skills/phoenix.lmay b/docs/skills/phoenix.lmay new file mode 100644 index 0000000..2074a24 --- /dev/null +++ b/docs/skills/phoenix.lmay @@ -0,0 +1,10 @@ +version: 1.5.5 + +facts: + - you need controller, in order to serve route + - you also need view + - if you want html - must rename it to html.eex and add controller+view + - minimal /lib/templates/layout/root is "<%= @inner_content %>" + - you get one generated for you, when running "mix phx.gen.live " + - live uses websockets + \ No newline at end of file diff --git a/docs/todo.md b/docs/todo.md new file mode 100644 index 0000000..619c458 --- /dev/null +++ b/docs/todo.md @@ -0,0 +1,2 @@ +create docker development environment +fix github requiring poison, instead of jason \ No newline at end of file diff --git a/lp/.formatter.exs b/lp/.formatter.exs new file mode 100644 index 0000000..8a6391c --- /dev/null +++ b/lp/.formatter.exs @@ -0,0 +1,5 @@ +[ + import_deps: [:ecto, :phoenix], + inputs: ["*.{ex,exs}", "priv/*/seeds.exs", "{config,lib,test}/**/*.{ex,exs}"], + subdirectories: ["priv/*/migrations"] +] diff --git a/lp/.gitignore b/lp/.gitignore new file mode 100644 index 0000000..1a174f7 --- /dev/null +++ b/lp/.gitignore @@ -0,0 +1,42 @@ +# 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"). +lp-*.tar + +# If NPM crashes, it generates a log, let's ignore it too. +npm-debug.log + +# The directory NPM downloads your dependencies sources to. +/assets/node_modules/ + +# Since we are building assets from assets/, +# we ignore priv/static. You may want to comment +# this depending on your deployment strategy. +# /priv/static/ +/priv/secret/* +/priv/cert/ + +# find the way to get your prod secret to prod server +# leaving you an example +/config/prod.exs +/config/prod.secret.exs +/config/github.exs \ No newline at end of file diff --git a/lp/README.md b/lp/README.md new file mode 100644 index 0000000..c7d1180 --- /dev/null +++ b/lp/README.md @@ -0,0 +1,20 @@ +# Lp + +To start your Phoenix server: + + * Install dependencies with `mix deps.get` + * Create and migrate your database with `mix ecto.setup` + * Install Node.js dependencies with `npm install` inside the `assets` directory + * Start Phoenix endpoint with `mix phx.server` + +Now you can visit [`localhost:4000`](http://localhost:4000) 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/lp/assets/.babelrc b/lp/assets/.babelrc new file mode 100644 index 0000000..ce33b24 --- /dev/null +++ b/lp/assets/.babelrc @@ -0,0 +1,5 @@ +{ + "presets": [ + "@babel/preset-env" + ] +} diff --git a/lp/assets/css/app.scss b/lp/assets/css/app.scss new file mode 100644 index 0000000..f7775db --- /dev/null +++ b/lp/assets/css/app.scss @@ -0,0 +1,91 @@ +/* This file is for your main application css. */ +@import "./phoenix.css"; +@import "../node_modules/nprogress/nprogress.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; +} + +.phx-modal { + opacity: 1!important; + position: fixed; + z-index: 1; + left: 0; + top: 0; + width: 100%; + height: 100%; + overflow: auto; + background-color: rgb(0,0,0); + background-color: rgba(0,0,0,0.4); +} + +.phx-modal-content { + background-color: #fefefe; + margin: 15% auto; + padding: 20px; + border: 1px solid #888; + width: 80%; +} + +.phx-modal-close { + color: #aaa; + float: right; + font-size: 28px; + font-weight: bold; +} + +.phx-modal-close:hover, +.phx-modal-close:focus { + color: black; + text-decoration: none; + cursor: pointer; +} + + +/* Alerts and form errors */ +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert p { + margin-bottom: 0; +} +.alert:empty { + display: none; +} +.invalid-feedback { + color: #a94442; + display: block; + margin: -1rem 0 2rem; +} diff --git a/lp/assets/css/phoenix.css b/lp/assets/css/phoenix.css new file mode 100644 index 0000000..3767b31 --- /dev/null +++ b/lp/assets/css/phoenix.css @@ -0,0 +1,101 @@ +/* Includes some default style for the starter application. + * This can be safely deleted to start fresh. + */ + +/* Milligram v1.3.0 https://milligram.github.io + * Copyright (c) 2017 CJ Patoilo Licensed under the MIT license + */ + +*,*:after,*:before{box-sizing:inherit}html{box-sizing:border-box;font-size:62.5%}body{color:#000000;font-family:'Helvetica', 'Arial', sans-serif;font-size:1.6em;font-weight:300;line-height:1.6}blockquote{border-left:0.3rem solid #d1d1d1;margin-left:0;margin-right:0;padding:1rem 1.5rem}blockquote *:last-child{margin-bottom:0}.button,button,input[type='button'],input[type='reset'],input[type='submit']{background-color:#0069d9;border:0.1rem solid #0069d9;border-radius:.4rem;color:#fff;cursor:pointer;display:inline-block;font-size:1.1rem;font-weight:700;height:3.8rem;letter-spacing:.1rem;line-height:3.8rem;padding:0 3.0rem;text-align:center;text-decoration:none;text-transform:uppercase;white-space:nowrap}.button:focus,.button:hover,button:focus,button:hover,input[type='button']:focus,input[type='button']:hover,input[type='reset']:focus,input[type='reset']:hover,input[type='submit']:focus,input[type='submit']:hover{background-color:#606c76;border-color:#606c76;color:#fff;outline:0}.button[disabled],button[disabled],input[type='button'][disabled],input[type='reset'][disabled],input[type='submit'][disabled]{cursor:default;opacity:.5}.button[disabled]:focus,.button[disabled]:hover,button[disabled]:focus,button[disabled]:hover,input[type='button'][disabled]:focus,input[type='button'][disabled]:hover,input[type='reset'][disabled]:focus,input[type='reset'][disabled]:hover,input[type='submit'][disabled]:focus,input[type='submit'][disabled]:hover{background-color:#0069d9;border-color:#0069d9}.button.button-outline,button.button-outline,input[type='button'].button-outline,input[type='reset'].button-outline,input[type='submit'].button-outline{background-color:transparent;color:#0069d9}.button.button-outline:focus,.button.button-outline:hover,button.button-outline:focus,button.button-outline:hover,input[type='button'].button-outline:focus,input[type='button'].button-outline:hover,input[type='reset'].button-outline:focus,input[type='reset'].button-outline:hover,input[type='submit'].button-outline:focus,input[type='submit'].button-outline:hover{background-color:transparent;border-color:#606c76;color:#606c76}.button.button-outline[disabled]:focus,.button.button-outline[disabled]:hover,button.button-outline[disabled]:focus,button.button-outline[disabled]:hover,input[type='button'].button-outline[disabled]:focus,input[type='button'].button-outline[disabled]:hover,input[type='reset'].button-outline[disabled]:focus,input[type='reset'].button-outline[disabled]:hover,input[type='submit'].button-outline[disabled]:focus,input[type='submit'].button-outline[disabled]:hover{border-color:inherit;color:#0069d9}.button.button-clear,button.button-clear,input[type='button'].button-clear,input[type='reset'].button-clear,input[type='submit'].button-clear{background-color:transparent;border-color:transparent;color:#0069d9}.button.button-clear:focus,.button.button-clear:hover,button.button-clear:focus,button.button-clear:hover,input[type='button'].button-clear:focus,input[type='button'].button-clear:hover,input[type='reset'].button-clear:focus,input[type='reset'].button-clear:hover,input[type='submit'].button-clear:focus,input[type='submit'].button-clear:hover{background-color:transparent;border-color:transparent;color:#606c76}.button.button-clear[disabled]:focus,.button.button-clear[disabled]:hover,button.button-clear[disabled]:focus,button.button-clear[disabled]:hover,input[type='button'].button-clear[disabled]:focus,input[type='button'].button-clear[disabled]:hover,input[type='reset'].button-clear[disabled]:focus,input[type='reset'].button-clear[disabled]:hover,input[type='submit'].button-clear[disabled]:focus,input[type='submit'].button-clear[disabled]:hover{color:#0069d9}code{background:#f4f5f6;border-radius:.4rem;font-size:86%;margin:0 .2rem;padding:.2rem .5rem;white-space:nowrap}pre{background:#f4f5f6;border-left:0.3rem solid #0069d9;overflow-y:hidden}pre>code{border-radius:0;display:block;padding:1rem 1.5rem;white-space:pre}hr{border:0;border-top:0.1rem solid #f4f5f6;margin:3.0rem 0}input[type='email'],input[type='number'],input[type='password'],input[type='search'],input[type='tel'],input[type='text'],input[type='url'],textarea,select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;border:0.1rem solid #d1d1d1;border-radius:.4rem;box-shadow:none;box-sizing:inherit;height:3.8rem;padding:.6rem 1.0rem;width:100%}input[type='email']:focus,input[type='number']:focus,input[type='password']:focus,input[type='search']:focus,input[type='tel']:focus,input[type='text']:focus,input[type='url']:focus,textarea:focus,select:focus{border-color:#0069d9;outline:0}select{background:url('data:image/svg+xml;utf8,') center right no-repeat;padding-right:3.0rem}select:focus{background-image:url('data:image/svg+xml;utf8,')}textarea{min-height:6.5rem}label,legend{display:block;font-size:1.6rem;font-weight:700;margin-bottom:.5rem}fieldset{border-width:0;padding:0}input[type='checkbox'],input[type='radio']{display:inline}.label-inline{display:inline-block;font-weight:normal;margin-left:.5rem}.row{display:flex;flex-direction:column;padding:0;width:100%}.row.row-no-padding{padding:0}.row.row-no-padding>.column{padding:0}.row.row-wrap{flex-wrap:wrap}.row.row-top{align-items:flex-start}.row.row-bottom{align-items:flex-end}.row.row-center{align-items:center}.row.row-stretch{align-items:stretch}.row.row-baseline{align-items:baseline}.row .column{display:block;flex:1 1 auto;margin-left:0;max-width:100%;width:100%}.row .column.column-offset-10{margin-left:10%}.row .column.column-offset-20{margin-left:20%}.row .column.column-offset-25{margin-left:25%}.row .column.column-offset-33,.row .column.column-offset-34{margin-left:33.3333%}.row .column.column-offset-50{margin-left:50%}.row .column.column-offset-66,.row .column.column-offset-67{margin-left:66.6666%}.row .column.column-offset-75{margin-left:75%}.row .column.column-offset-80{margin-left:80%}.row .column.column-offset-90{margin-left:90%}.row .column.column-10{flex:0 0 10%;max-width:10%}.row .column.column-20{flex:0 0 20%;max-width:20%}.row .column.column-25{flex:0 0 25%;max-width:25%}.row .column.column-33,.row .column.column-34{flex:0 0 33.3333%;max-width:33.3333%}.row .column.column-40{flex:0 0 40%;max-width:40%}.row .column.column-50{flex:0 0 50%;max-width:50%}.row .column.column-60{flex:0 0 60%;max-width:60%}.row .column.column-66,.row .column.column-67{flex:0 0 66.6666%;max-width:66.6666%}.row .column.column-75{flex:0 0 75%;max-width:75%}.row .column.column-80{flex:0 0 80%;max-width:80%}.row .column.column-90{flex:0 0 90%;max-width:90%}.row .column .column-top{align-self:flex-start}.row .column .column-bottom{align-self:flex-end}.row .column .column-center{-ms-grid-row-align:center;align-self:center}@media (min-width: 40rem){.row{flex-direction:row;margin-left:-1.0rem;width:calc(100% + 2.0rem)}.row .column{margin-bottom:inherit;padding:0 1.0rem}}a{color:#0069d9;text-decoration:none}a:focus,a:hover{color:#606c76}dl,ol,ul{list-style:none;margin-top:0;padding-left:0}dl dl,dl ol,dl ul,ol dl,ol ol,ol ul,ul dl,ul ol,ul ul{font-size:90%;margin:1.5rem 0 1.5rem 3.0rem}ol{list-style:decimal inside}ul{list-style:circle inside}.button,button,dd,dt,li{margin-bottom:1.0rem}fieldset,input,select,textarea{margin-bottom:1.5rem}blockquote,dl,figure,form,ol,p,pre,table,ul{margin-bottom:2.5rem}table{border-spacing:0;width:100%}td,th{border-bottom:0.1rem solid #e1e1e1;padding:1.2rem 1.5rem;text-align:left}td:first-child,th:first-child{padding-left:0}td:last-child,th:last-child{padding-right:0}b,strong{font-weight:bold}p{margin-top:0}h1,h2,h3,h4,h5,h6{font-weight:300;letter-spacing:-.1rem;margin-bottom:2.0rem;margin-top:0}h1{font-size:4.6rem;line-height:1.2}h2{font-size:3.6rem;line-height:1.25}h3{font-size:2.8rem;line-height:1.3}h4{font-size:2.2rem;letter-spacing:-.08rem;line-height:1.35}h5{font-size:1.8rem;letter-spacing:-.05rem;line-height:1.5}h6{font-size:1.6rem;letter-spacing:0;line-height:1.4}img{max-width:100%}.clearfix:after{clear:both;content:' ';display:table}.float-left{float:left}.float-right{float:right} + +/* General style */ +h1{font-size: 3.6rem; line-height: 1.25} +h2{font-size: 2.8rem; line-height: 1.3} +h3{font-size: 2.2rem; letter-spacing: -.08rem; line-height: 1.35} +h4{font-size: 1.8rem; letter-spacing: -.05rem; line-height: 1.5} +h5{font-size: 1.6rem; letter-spacing: 0; line-height: 1.4} +h6{font-size: 1.4rem; letter-spacing: 0; line-height: 1.2} +pre{padding: 1em;} + +.container{ + margin: 0 auto; + max-width: 80.0rem; + padding: 0 2.0rem; + position: relative; + width: 100% +} +select { + width: auto; +} + +/* Phoenix promo and logo */ +.phx-hero { + text-align: center; + border-bottom: 1px solid #e3e3e3; + background: #eee; + border-radius: 6px; + padding: 3em 3em 1em; + margin-bottom: 3rem; + font-weight: 200; + font-size: 120%; +} +.phx-hero input { + background: #ffffff; +} +.phx-logo { + min-width: 300px; + margin: 1rem; + display: block; +} +.phx-logo img { + width: auto; + display: block; +} + +/* Headers */ +header { + width: 100%; + background: #fdfdfd; + border-bottom: 1px solid #eaeaea; + margin-bottom: 2rem; +} +header section { + align-items: center; + display: flex; + flex-direction: column; + justify-content: space-between; +} +header section :first-child { + order: 2; +} +header section :last-child { + order: 1; +} +header nav ul, +header nav li { + margin: 0; + padding: 0; + display: block; + text-align: right; + white-space: nowrap; +} +header nav ul { + margin: 1rem; + margin-top: 0; +} +header nav a { + display: block; +} + +@media (min-width: 40.0rem) { /* Small devices (landscape phones, 576px and up) */ + header section { + flex-direction: row; + } + header nav ul { + margin: 1rem; + } + .phx-logo { + flex-basis: 527px; + margin: 2rem 1rem; + } +} diff --git a/lp/assets/js/app.js b/lp/assets/js/app.js new file mode 100644 index 0000000..dfc0f97 --- /dev/null +++ b/lp/assets/js/app.js @@ -0,0 +1,35 @@ +// We need to import the CSS so that webpack will load it. +// The MiniCssExtractPlugin is used to separate it out into +// its own CSS file. +import "../css/app.scss" + +// webpack automatically bundles all modules in your +// entry points. Those entry points can be configured +// in "webpack.config.js". +// +// Import deps with the dep name or local files with a relative path, for example: +// +// import {Socket} from "phoenix" +// import socket from "./socket" +// +import "phoenix_html" +import {Socket} from "phoenix" +import NProgress from "nprogress" +import {LiveSocket} from "phoenix_live_view" + +let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content") +let liveSocket = new LiveSocket("/live", Socket, {params: {_csrf_token: csrfToken}}) + +// Show progress bar on live navigation and form submits +window.addEventListener("phx:page-loading-start", info => NProgress.start()) +window.addEventListener("phx:page-loading-stop", info => NProgress.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 + diff --git a/lp/assets/js/old.js b/lp/assets/js/old.js new file mode 100644 index 0000000..41d470d --- /dev/null +++ b/lp/assets/js/old.js @@ -0,0 +1,197 @@ +//__________________ https://gamecult.games/user/plugins/backtotop/assets/js/return-to-top.js +// ===== Scroll to Top ==== +$(window).scroll(function () { + if ($(this).scrollTop() >= 50) { // If page is scrolled more than 50px + $('#return-to-top').fadeIn(200); // Fade in the arrow + } else { + $('#return-to-top').fadeOut(200); // Else fade out the arrow + } +}); +$('#return-to-top').click(function () { // When arrow is clicked + $('body,html').animate({ + scrollTop: 0 // Scroll to top of body + }, 500); +}); +// __________________ https://gamecult.games/user/plugins/simplesearch/js/simplesearch.js +((function(){ + if (!Element.prototype.matches) { + Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector; + } + var findAncestor = function(el, selector) { + while ((el = el.parentElement) && !((el.matches || el.matchesSelector).call(el, selector))) {} + return el; + }; + + var fields = document.querySelectorAll('input[name="searchfield"][data-search-input]'); + Array.prototype.forEach.call(fields, function(field) { + var form = findAncestor(field, 'form[data-simplesearch-form]'), + min = field.getAttribute('data-min') || false, + location = field.getAttribute('data-search-input'), + separator = field.getAttribute('data-search-separator'); + + if (min) { + var invalid = field.getAttribute('data-search-invalid'); + field.addEventListener('keydown', function() { + field.setCustomValidity(field.value.length >= min ? '' : invalid); + }); + } + + form.addEventListener('submit', function(event) { + event.preventDefault(); + + if (field.checkValidity()) { + window.location.href = location + separator + field.value; + } + }); + }); +})()); + +//_______________ https://gamecult.games/user/themes/klb4/js/jquery.treemenu.js +/* + treeMenu - jQuery plugin + version: 0.6 + + Copyright 2014 Stepan Krapivin + +*/ +(function($){ + $.fn.treemenu = function(options) { + options = options || {}; + options.delay = options.delay || 0; + options.openActive = options.openActive || false; + options.closeOther = options.closeOther || false; + options.activeSelector = options.activeSelector || ".active"; + + this.addClass("treemenu"); + + if (!options.nonroot) { + this.addClass("treemenu-root"); + } + + options.nonroot = true; + + this.find("> li").each(function() { + e = $(this); + var subtree = e.find('> ul'); + var button = e.find('.toggler').eq(0); + + if(button.length == 0) { + // create toggler + var button = $(''); + button.addClass('toggler'); + e.prepend(button); + } + + if(subtree.length > 0) { + subtree.hide(); + + e.addClass('tree-closed'); + + e.find(button).click(function() { + var li = $(this).parent('li'); + + if (options.closeOther && li.hasClass('tree-closed')) { + var siblings = li.parent('ul').find("li:not(.tree-empty)"); + siblings.removeClass("tree-opened"); + siblings.addClass("tree-closed"); + siblings.removeClass(options.activeSelector); + siblings.find('> ul').slideUp(options.delay); + } + + li.find('> ul').slideToggle(options.delay); + li.toggleClass('tree-opened'); + li.toggleClass('tree-closed'); + li.toggleClass(options.activeSelector); + }); + + $(this).find('> ul').treemenu(options); + } else { + $(this).addClass('tree-empty'); + } + }); + + if (options.openActive) { + var cls = this.attr("class"); + + this.find(options.activeSelector).each(function(){ + var el = $(this).parent(); + + while (el.attr("class") !== cls) { + el.find('> ul').show(); + if(el.prop("tagName") === 'UL') { + el.show(); + } else if (el.prop("tagName") === 'LI') { + el.removeClass('tree-closed'); + el.addClass("tree-opened"); + el.show(); + } + + el = el.parent(); + } + }); + } + + return this; + } +})(jQuery); + +//____________________________ https://gamecult.games/user/themes/klb4/js/site.js +var isTouch = window.DocumentTouch && document instanceof DocumentTouch; + +function scrollHeader() { + // Has scrolled class on header + var zvalue = $(document).scrollTop(); + if ( zvalue > 75 ) + $("#header").addClass("scrolled"); + else + $("#header").removeClass("scrolled"); +} + +function parallaxBackground() { + $('.parallax').css('background-positionY', ($(window).scrollTop() * 0.3) + 'px'); +} + +jQuery(document).ready(function($){ + + scrollHeader(); + + // Scroll Events + if (!isTouch){ + $(document).scroll(function() { + scrollHeader(); + parallaxBackground(); + }); + }; + + // Touch scroll + $(document).on({ + 'touchmove': function(e) { + scrollHeader(); // Replace this with your code. + } + }); + + //Smooth scroll to start + $('#to-start').click(function(){ + var start_y = $('#start').position().top; + var header_offset = 45; + window.scroll({ top: start_y - header_offset, left: 0, behavior: 'smooth' }); + return false; + }); + + //Smooth scroll to top + $('#to-top').click(function(){ + window.scroll({ top: 0, left: 0, behavior: 'smooth' }); + return false; + }); + + // Responsive Menu + $('#toggle').click(function () { + $(this).toggleClass('active'); + $('#overlay').toggleClass('open'); + $('body').toggleClass('mobile-nav-open'); + }); + + // Tree Menu + $(".tree").treemenu({delay:300}); + +}); \ No newline at end of file diff --git a/lp/assets/package-lock.json b/lp/assets/package-lock.json new file mode 100644 index 0000000..cb69b2f --- /dev/null +++ b/lp/assets/package-lock.json @@ -0,0 +1,8160 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", + "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "semver": "^5.5.0" + } + }, + "@babel/core": { + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", + "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.6", + "@babel/helper-module-transforms": "^7.11.0", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.11.5", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.11.5", + "@babel/types": "^7.11.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", + "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "dev": true, + "requires": { + "@babel/types": "^7.11.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", + "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.10.4", + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", + "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.10.5", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", + "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.0" + } + }, + "@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", + "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", + "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/template": "^7.10.4", + "@babel/types": "^7.11.0", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", + "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", + "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", + "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", + "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", + "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", + "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", + "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", + "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", + "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", + "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", + "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", + "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", + "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.4" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", + "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", + "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", + "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", + "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", + "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", + "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", + "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", + "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", + "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", + "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", + "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", + "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", + "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", + "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", + "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", + "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", + "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", + "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", + "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", + "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", + "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", + "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", + "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", + "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", + "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", + "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", + "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", + "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", + "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", + "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", + "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", + "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", + "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", + "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", + "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", + "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", + "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", + "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.5.tgz", + "integrity": "sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.11.0", + "@babel/helper-compilation-targets": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-proposal-async-generator-functions": "^7.10.4", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-export-namespace-from": "^7.10.4", + "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.11.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", + "@babel/plugin-proposal-private-methods": "^7.10.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.10.4", + "@babel/plugin-transform-arrow-functions": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.10.4", + "@babel/plugin-transform-block-scoped-functions": "^7.10.4", + "@babel/plugin-transform-block-scoping": "^7.10.4", + "@babel/plugin-transform-classes": "^7.10.4", + "@babel/plugin-transform-computed-properties": "^7.10.4", + "@babel/plugin-transform-destructuring": "^7.10.4", + "@babel/plugin-transform-dotall-regex": "^7.10.4", + "@babel/plugin-transform-duplicate-keys": "^7.10.4", + "@babel/plugin-transform-exponentiation-operator": "^7.10.4", + "@babel/plugin-transform-for-of": "^7.10.4", + "@babel/plugin-transform-function-name": "^7.10.4", + "@babel/plugin-transform-literals": "^7.10.4", + "@babel/plugin-transform-member-expression-literals": "^7.10.4", + "@babel/plugin-transform-modules-amd": "^7.10.4", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/plugin-transform-modules-systemjs": "^7.10.4", + "@babel/plugin-transform-modules-umd": "^7.10.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", + "@babel/plugin-transform-new-target": "^7.10.4", + "@babel/plugin-transform-object-super": "^7.10.4", + "@babel/plugin-transform-parameters": "^7.10.4", + "@babel/plugin-transform-property-literals": "^7.10.4", + "@babel/plugin-transform-regenerator": "^7.10.4", + "@babel/plugin-transform-reserved-words": "^7.10.4", + "@babel/plugin-transform-shorthand-properties": "^7.10.4", + "@babel/plugin-transform-spread": "^7.11.0", + "@babel/plugin-transform-sticky-regex": "^7.10.4", + "@babel/plugin-transform-template-literals": "^7.10.4", + "@babel/plugin-transform-typeof-symbol": "^7.10.4", + "@babel/plugin-transform-unicode-escapes": "^7.10.4", + "@babel/plugin-transform-unicode-regex": "^7.10.4", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.11.5", + "browserslist": "^4.12.0", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", + "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.5", + "@babel/types": "^7.11.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", + "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "dev": true + }, + "@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "dependencies": { + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + } + } + }, + "ajv": { + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true, + "optional": true + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", + "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", + "dev": true + }, + "babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "dev": true, + "requires": { + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true, + "optional": true + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "dev": true + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.14.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz", + "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001135", + "electron-to-chromium": "^1.3.571", + "escalade": "^3.1.0", + "node-releases": "^1.1.61" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001142", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001142.tgz", + "integrity": "sha512-pDPpn9ankEpBFZXyCv2I4lh1v/ju+bqb78QfKf+w9XgDAFWBwSYPswXqprRdrgQWK0wQnpIbfwRjNHO1HWqvoQ==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", + "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==", + "dev": true, + "requires": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "dev": true, + "requires": { + "browserslist": "^4.8.5", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-loader": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", + "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-what": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.1.tgz", + "integrity": "sha512-wHOppVDKl4vTAOWzJt5Ek37Sgd9qq1Bmj/T1OjvicWbU5W7ru7Pqbn0Jdqii3Drx/h+dixHKXNhZYx7blthL7g==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", + "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", + "dev": true, + "requires": { + "css-tree": "1.0.0-alpha.39" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "dev": true, + "requires": { + "mdn-data": "2.0.6", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", + "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", + "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "electron-to-chromium": { + "version": "1.3.576", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.576.tgz", + "integrity": "sha512-uSEI0XZ//5ic+0NdOqlxp0liCD44ck20OAGyLMSymIWTEAtHKVJi6JM18acOnRgUgX7Q65QqnI+sNncNvIy8ew==", + "dev": true + }, + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz", + "integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "requires": { + "globule": "^1.0.0" + } + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + } + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "globule": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", + "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", + "dev": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "hard-source-webpack-plugin": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/hard-source-webpack-plugin/-/hard-source-webpack-plugin-0.13.1.tgz", + "integrity": "sha512-r9zf5Wq7IqJHdVAQsZ4OP+dcUSvoHqDMxJlIzaE2J0TZWn3UjMMrHqwDHR8Jr/pzPfG7XxSe36E7Y8QGNdtuAw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "find-cache-dir": "^2.0.0", + "graceful-fs": "^4.1.11", + "lodash": "^4.15.0", + "mkdirp": "^0.5.1", + "node-object-hash": "^1.2.0", + "parse-json": "^4.0.0", + "pkg-dir": "^3.0.0", + "rimraf": "^2.6.2", + "semver": "^5.6.0", + "tapable": "^1.0.0-beta.5", + "webpack-sources": "^1.0.1", + "write-json-file": "^2.3.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "in-publish": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", + "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "jest-worker": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", + "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "dev": true, + "requires": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.0" + } + }, + "mini-css-extract-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "dev": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-object-hash": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/node-object-hash/-/node-object-hash-1.4.2.tgz", + "integrity": "sha512-UdS4swXs85fCGWWf6t6DMGgpN/vnlKeSGEQ7hJcrs7PBFoxoKLmibc3QRb7fwiYsjdL7PX8iI/TMSlZ90dgHhQ==", + "dev": true + }, + "node-releases": { + "version": "1.1.61", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.61.tgz", + "integrity": "sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==", + "dev": true + }, + "node-sass": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", + "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", + "dev": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.15", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "2.2.5", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + }, + "dependencies": { + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + } + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=" + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optimize-css-assets-webpack-plugin": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", + "dev": true, + "requires": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "phoenix": { + "version": "file:../deps/phoenix" + }, + "phoenix_html": { + "version": "file:../deps/phoenix_html" + }, + "phoenix_live_view": { + "version": "file:../deps/phoenix_live_view" + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "optional": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-calc": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.4.tgz", + "integrity": "sha512-0I79VRAd1UTkaHzY9w83P39YGO/M3bG7/tNLrHGEunBolfoGM0hSjrGvjoeaj0JE/zIw5GsI2KZ0UwDJqv5hjw==", + "dev": true, + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-selector-parser": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "dev": true, + "requires": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "regenerate": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true, + "optional": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass-graph": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", + "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^13.3.2" + } + }, + "sass-loader": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.6.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", + "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz", + "integrity": "sha512-/fKw3R+hWyHfYx7Bv6oPqmk4HGQcrWLtV3X6ggvPuwPNHSnzvVV51z6OaaCOus4YLjutYGOz3pEpbhe6Up2s1w==", + "dev": true, + "requires": { + "cacache": "^13.0.1", + "find-cache-dir": "^3.3.1", + "jest-worker": "^25.4.0", + "p-limit": "^2.3.0", + "schema-utils": "^2.6.6", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.6.12", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "cacache": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", + "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", + "dev": true, + "requires": { + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "p-map": "^3.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^2.7.1", + "ssri": "^7.0.0", + "unique-filename": "^1.1.1" + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "ssri": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", + "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "minipass": "^3.1.1" + } + } + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "dev": true, + "requires": { + "glob": "^7.1.2" + } + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "optional": true + }, + "uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "watchpack": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", + "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" + } + }, + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1" + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + } + } + }, + "webpack": { + "version": "4.41.5", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", + "integrity": "sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } + } + } + }, + "webpack-cli": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", + "import-local": "^2.0.0", + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "write-json-file": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", + "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", + "dev": true, + "requires": { + "detect-indent": "^5.0.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "pify": "^3.0.0", + "sort-keys": "^2.0.0", + "write-file-atomic": "^2.0.0" + }, + "dependencies": { + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/lp/assets/package.json b/lp/assets/package.json new file mode 100644 index 0000000..aa41dee --- /dev/null +++ b/lp/assets/package.json @@ -0,0 +1,30 @@ +{ + "repository": {}, + "description": " ", + "license": "MIT", + "scripts": { + "deploy": "webpack --mode production", + "watch": "webpack --mode development --watch" + }, + "dependencies": { + "phoenix": "file:../deps/phoenix", + "phoenix_html": "file:../deps/phoenix_html", + "phoenix_live_view": "file:../deps/phoenix_live_view", + "nprogress": "^0.2.0" + }, + "devDependencies": { + "@babel/core": "^7.0.0", + "@babel/preset-env": "^7.0.0", + "babel-loader": "^8.0.0", + "copy-webpack-plugin": "^5.1.1", + "css-loader": "^3.4.2", + "sass-loader": "^8.0.2", + "node-sass": "^4.13.1", + "hard-source-webpack-plugin": "^0.13.1", + "mini-css-extract-plugin": "^0.9.0", + "optimize-css-assets-webpack-plugin": "^5.0.1", + "terser-webpack-plugin": "^2.3.2", + "webpack": "4.41.5", + "webpack-cli": "^3.3.2" + } +} diff --git a/lp/assets/static/favicon.ico b/lp/assets/static/favicon.ico new file mode 100644 index 0000000..73de524 Binary files /dev/null and b/lp/assets/static/favicon.ico differ diff --git a/lp/assets/static/images/phoenix.png b/lp/assets/static/images/phoenix.png new file mode 100644 index 0000000..9c81075 Binary files /dev/null and b/lp/assets/static/images/phoenix.png differ diff --git a/lp/assets/static/robots.txt b/lp/assets/static/robots.txt new file mode 100644 index 0000000..3c9c7c0 --- /dev/null +++ b/lp/assets/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: / diff --git a/lp/assets/webpack.config.js b/lp/assets/webpack.config.js new file mode 100644 index 0000000..079610d --- /dev/null +++ b/lp/assets/webpack.config.js @@ -0,0 +1,53 @@ +const path = require('path'); +const glob = require('glob'); +const HardSourceWebpackPlugin = require('hard-source-webpack-plugin'); +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); +const TerserPlugin = require('terser-webpack-plugin'); +const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); +const CopyWebpackPlugin = require('copy-webpack-plugin'); + +module.exports = (env, options) => { + const devMode = options.mode !== 'production'; + + return { + optimization: { + minimizer: [ + new TerserPlugin({ cache: true, parallel: true, sourceMap: devMode }), + new OptimizeCSSAssetsPlugin({}) + ] + }, + entry: { + 'app': glob.sync('./vendor/**/*.js').concat(['./js/app.js']) + }, + output: { + filename: '[name].js', + path: path.resolve(__dirname, '../priv/static/js'), + publicPath: '/js/' + }, + devtool: devMode ? 'eval-cheap-module-source-map' : undefined, + module: { + rules: [ + { + test: /\.js$/, + exclude: /node_modules/, + use: { + loader: 'babel-loader' + } + }, + { + test: /\.[s]?css$/, + use: [ + MiniCssExtractPlugin.loader, + 'css-loader', + 'sass-loader', + ], + } + ] + }, + plugins: [ + new MiniCssExtractPlugin({ filename: '../css/app.css' }), + new CopyWebpackPlugin([{ from: 'static/', to: '../' }]) + ] + .concat(devMode ? [new HardSourceWebpackPlugin()] : []) + } +}; diff --git a/lp/config/config.exs b/lp/config/config.exs new file mode 100644 index 0000000..cc11394 --- /dev/null +++ b/lp/config/config.exs @@ -0,0 +1,49 @@ +# 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 + +config :lp, + ecto_repos: [Lp.Repo] + + + +# Configures the endpoint +config :lp, LpWeb.Endpoint, + url: [host: "localhost"], + force_ssl: [hsts: true], + secret_key_base: "DgokGSB84E7YMG0wLwe/hR51+TpWnqbdQmZjvGh6SIEDExzvOQS1IYiJoxTcI/XN", + render_errors: [view: LpWeb.ErrorView, accepts: ~w(html json), layout: false], + pubsub_server: Lp.PubSub, + live_view: [signing_salt: "CeYKUFh5"] + +# 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 + + +config :phoenix, :template_engines, + md: PhoenixMarkdown.Engine + # haml: PhoenixHaml.Engine + # https://emmet.io eex should be good enough + + +# Import environment specific config. This must remain at the bottom +# of this file so it overrides the configuration defined above. +import_config "#{Mix.env()}.exs" + +import_config "github.exs" +#_________________ +#import Config +#config :lp, +# client_id: "your_fancy_github_id", +# client_secret: "that_is_a_secret" +# \ No newline at end of file diff --git a/lp/config/dev.exs b/lp/config/dev.exs new file mode 100644 index 0000000..2690f87 --- /dev/null +++ b/lp/config/dev.exs @@ -0,0 +1,77 @@ +use Mix.Config + +# Configure your database +config :lp, Lp.Repo, + username: "postgres", + password: "postgres", + database: "lp_dev", + hostname: "localhost", + show_sensitive_data_on_connection_error: true, + pool_size: 10 + +# 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 webpack to recompile .js and .css sources. +config :lp, LpWeb.Endpoint, + # http: [port: 80], + https: [ + port: 443, + cipher_suite: :strong, + keyfile: "priv/cert/selfsigned_key.pem", + certfile: "priv/cert/selfsigned.pem" + ], + debug_errors: true, + code_reloader: true, + check_origin: false, + watchers: [ + node: [ + "node_modules/webpack/bin/webpack.js", + "--mode", + "development", + "--watch-stdin", + cd: Path.expand("../assets", __DIR__) + ] + ] + +# ## SSL Support +# +# In order to use HTTPS in development, a self-signed +# certificate can be generated by running the following +# Mix task: +# +# mix phx.gen.cert +# +# Note that this task requires Erlang/OTP 20 or later. +# Run `mix help phx.gen.cert` for more information. +# +# The `http:` config above can be replaced with: +# + +# +# If desired, both `http:` and `https:` keys can be +# configured to run both http and https servers on +# different ports. + +# Watch static and templates for browser reloading. +config :lp, LpWeb.Endpoint, + live_reload: [ + patterns: [ + ~r"priv/static/.*(js|css|png|jpeg|jpg|gif|svg)$", + ~r"priv/gettext/.*(po)$", + ~r"lib/lp_web/(live|views)/.*(ex)$", + ~r"lib/lp_web/templates/.*(eex|md)$" + ] + ] + +# Do not include metadata nor timestamps in development logs +config :logger, :console, format: "[$level] $message\n" + +# Set a higher stacktrace during development. Avoid configuring such +# in production as building large stacktraces may be expensive. +config :phoenix, :stacktrace_depth, 20 + +# Initialize plugs at runtime for faster development compilation +config :phoenix, :plug_init_mode, :runtime diff --git a/lp/config/prod.exs b/lp/config/prod.exs new file mode 100644 index 0000000..6579fdf --- /dev/null +++ b/lp/config/prod.exs @@ -0,0 +1,65 @@ +use Mix.Config + +# For production, don't forget to configure the url host +# to something meaningful, Phoenix uses this information +# when generating URLs. +# +# Note we also include the path to a cache manifest +# containing the digested version of static files. This +# manifest is generated by the `mix phx.digest` task, +# which you should run after static files are built and +# before starting your production server. +config :lp, LpWeb.Endpoint, + # url: [host: "example.com", port: 80], + url: [host: "35.193.215.48"], + cache_static_manifest: "priv/static/cache_manifest.json", + https: [ + port: 443, + cipher_suite: :strong, + keyfile: System.get_env("GCLP_SSL_KEY_PATH"), + certfile: System.get_env("GCLP_APP_SSL_CERT_PATH"), + transport_options: [socket_opts: [:inet6]] + ] +# +#usually you would not want to do that, but i'm lazy. adjust to your machine + +# Do not print debug messages in production +config :logger, level: :info + +# ## SSL Support +# +# To get SSL working, you will need to add the `https` key +# to the previous section and set your `:url` port to 443: +# + # config :lp, LpWeb.Endpoint, + # ... + # url: [host: "example.com", port: 443], + # https: [ + # port: 443, + # cipher_suite: :strong, + # keyfile: System.get_env("SOME_APP_SSL_KEY_PATH"), + # certfile: System.get_env("SOME_APP_SSL_CERT_PATH"), + # transport_options: [socket_opts: [:inet6]] + # ] +# +# The `cipher_suite` is set to `:strong` to support only the +# latest and more secure SSL ciphers. This means old browsers +# and clients may not be supported. You can set it to +# `:compatible` for wider support. +# +# `:keyfile` and `:certfile` expect an absolute path to the key +# and cert in disk or a relative path inside priv, for example +# "priv/ssl/server.key". For all supported SSL configuration +# options, see https://hexdocs.pm/plug/Plug.SSL.html#configure/1 +# +# We also recommend setting `force_ssl` in your endpoint, ensuring +# no data is ever sent via http, always redirecting to https: +# + config :lp, LpWeb.Endpoint, + force_ssl: [hsts: true] +# +# Check `Plug.SSL` for all available options in `force_ssl`. + +# Finally import the config/prod.secret.exs which loads secrets +# and configuration from environment variables. +import_config "prod.secret.exs" diff --git a/lp/config/prod.secret.exs b/lp/config/prod.secret.exs new file mode 100644 index 0000000..e7a5bcf --- /dev/null +++ b/lp/config/prod.secret.exs @@ -0,0 +1,41 @@ +# In this file, we load production configuration and secrets +# from environment variables. You can also hardcode secrets, +# although such is generally not recommended and you have to +# remember to add this file to your .gitignore. +use Mix.Config + +database_url = + System.get_env("DATABASE_URL") || + raise """ + environment variable DATABASE_URL is missing. + For example: ecto://USER:PASS@HOST/DATABASE + """ + +config :lp, Lp.Repo, + ssl: true, + url: database_url, + pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10") + +secret_key_base = + System.get_env("SECRET_KEY_BASE") || + raise """ + environment variable SECRET_KEY_BASE is missing. + You can generate one by calling: mix phx.gen.secret + """ + +# config :lp, LpWeb.Endpoint, +# http: [ +# port: String.to_integer(System.get_env("PORT") || "4000"), +# transport_options: [socket_opts: [:inet6]] +# ], +# secret_key_base: secret_key_base + +# ## Using releases (Elixir v1.9+) +# +# If you are doing OTP releases, you need to instruct Phoenix +# to start each relevant endpoint: +# + config :lp, LpWeb.Endpoint, server: true +# +# Then you can assemble a release by calling `mix release`. +# See `mix help release` for more information. diff --git a/lp/config/test.exs b/lp/config/test.exs new file mode 100644 index 0000000..2fb9ca3 --- /dev/null +++ b/lp/config/test.exs @@ -0,0 +1,22 @@ +use Mix.Config + +# Configure your database +# +# The MIX_TEST_PARTITION environment variable can be used +# to provide built-in test partitioning in CI environment. +# Run `mix help test` for more information. +config :lp, Lp.Repo, + username: "postgres", + password: "postgres", + database: "lp_test#{System.get_env("MIX_TEST_PARTITION")}", + hostname: "localhost", + pool: Ecto.Adapters.SQL.Sandbox + +# We don't run a server during test. If one is required, +# you can enable the server option below. +config :lp, LpWeb.Endpoint, + http: [port: 4002], + server: false + +# Print only warnings and errors during test +config :logger, level: :warn diff --git a/lp/lib/lp.ex b/lp/lib/lp.ex new file mode 100644 index 0000000..e21475a --- /dev/null +++ b/lp/lib/lp.ex @@ -0,0 +1,9 @@ +defmodule Lp do + @moduledoc """ + Lp keeps the contexts that define your domain + and business logic. + + Contexts are also responsible for managing your data, regardless + if it comes from the database, an external API or others. + """ +end diff --git a/lp/lib/lp/application.ex b/lp/lib/lp/application.ex new file mode 100644 index 0000000..14eea0c --- /dev/null +++ b/lp/lib/lp/application.ex @@ -0,0 +1,34 @@ +defmodule Lp.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 Ecto repository + Lp.Repo, + # Start the Telemetry supervisor + LpWeb.Telemetry, + # Start the PubSub system + {Phoenix.PubSub, name: Lp.PubSub}, + # Start the Endpoint (http/https) + LpWeb.Endpoint + # Start a worker by calling: Lp.Worker.start_link(arg) + # {Lp.Worker, arg} + ] + + # See https://hexdocs.pm/elixir/Supervisor.html + # for other strategies and supported options + opts = [strategy: :one_for_one, name: Lp.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 + LpWeb.Endpoint.config_change(changed, removed) + :ok + end +end diff --git a/lp/lib/lp/repo.ex b/lp/lib/lp/repo.ex new file mode 100644 index 0000000..c831857 --- /dev/null +++ b/lp/lib/lp/repo.ex @@ -0,0 +1,5 @@ +defmodule Lp.Repo do + use Ecto.Repo, + otp_app: :lp, + adapter: Ecto.Adapters.Postgres +end diff --git a/lp/lib/lp_web.ex b/lp/lib/lp_web.ex new file mode 100644 index 0000000..fc67626 --- /dev/null +++ b/lp/lib/lp_web.ex @@ -0,0 +1,102 @@ +defmodule LpWeb 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 LpWeb, :controller + use LpWeb, :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 controller do + quote do + use Phoenix.Controller, namespace: LpWeb + + import Plug.Conn + import LpWeb.Gettext + alias LpWeb.Router.Helpers, as: Routes + end + end + + def view do + quote do + use Phoenix.View, + root: "lib/lp_web/templates", + namespace: LpWeb + + # 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: {LpWeb.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 + + def channel do + quote do + use Phoenix.Channel + import LpWeb.Gettext + 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 + + import LpWeb.ErrorHelpers + import LpWeb.Gettext + alias LpWeb.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/lp/lib/lp_web/channels/user_socket.ex b/lp/lib/lp_web/channels/user_socket.ex new file mode 100644 index 0000000..487ba16 --- /dev/null +++ b/lp/lib/lp_web/channels/user_socket.ex @@ -0,0 +1,35 @@ +defmodule LpWeb.UserSocket do + use Phoenix.Socket + + ## Channels + # channel "room:*", LpWeb.RoomChannel + + # Socket params are passed from the client and can + # be used to verify and authenticate a user. After + # verification, you can put default assigns into + # the socket that will be set for all channels, ie + # + # {:ok, assign(socket, :user_id, verified_user_id)} + # + # To deny connection, return `:error`. + # + # See `Phoenix.Token` documentation for examples in + # performing token verification on connect. + @impl true + def connect(_params, socket, _connect_info) do + {:ok, socket} + end + + # Socket id's are topics that allow you to identify all sockets for a given user: + # + # def id(socket), do: "user_socket:#{socket.assigns.user_id}" + # + # Would allow you to broadcast a "disconnect" event and terminate + # all active sockets and channels for a given user: + # + # LpWeb.Endpoint.broadcast("user_socket:#{user.id}", "disconnect", %{}) + # + # Returning `nil` makes this socket anonymous. + @impl true + def id(_socket), do: nil +end diff --git a/lp/lib/lp_web/controllers/git_controller.ex b/lp/lib/lp_web/controllers/git_controller.ex new file mode 100644 index 0000000..56cf33c --- /dev/null +++ b/lp/lib/lp_web/controllers/git_controller.ex @@ -0,0 +1,55 @@ +defmodule LpWeb.GitController do + @client_id Application.fetch_env!(:lp, :client_id) + @client_secret Application.fetch_env!(:lp, :client_secret) + use LpWeb, :controller + # @data "/priv/secret/github_credentials" |> File.stream! |> Enum.to_list + + def index(conn, _params) do + render(conn, "git.html") + end + def show(conn, _params) do + html(conn,"") + end + def oauth(conn, %{"code" => code}) do + #some persistance side effect + # persist(code) + access_token = Github.Oauth2.Client.access_token!( + config: [client_id: @client_id, client_secret: @client_secret], + params: [code: code] + ) + + github_client = %Github.Client{access_token: access_token} + + %{"login" => login} = github_client |> Github.Users.find!() |> Map.fetch!(:body) + [%{"email" => email} | _] = github_client |> Github.Users.Emails.list!() |> Map.fetch!(:body) + render(conn, "oauth2.html", [login: login, email: email]) + # redirect(conn, "git.html") + # html(conn,"") + + end + + # ___ example from github + # def github_callback(conn, %{"code" => code}) do + # access_token = Github.Oauth2.Client.access_token!( + # config: [client_id: @client_id, client_secret: @client_secret], + # params: [code: code] + # ) + + # github_client = %Github.Client{access_token: access_token} + + # %{"login" => login} = github_client |> Github.Users.find!() |> Map.fetch!(:body) + # [%{"email" => email} | _] = github_client |> Github.Users.Emails.list!() |> Map.fetch!(:body) + # ... + # end + + # ___ + + def github(conn, _params) do + authorize_url = Github.Oauth2.Client.authorize_url!( + # config: [client_id: Application.fetch_env!(:lp, :client_id), client_secret: Application.fetch_env!(:lp, :client_secret)], + config: [client_id: @client_id, client_secret: @client_secret], + scope: "user:email" + ) + conn |> redirect(external: authorize_url) + end + end diff --git a/lp/lib/lp_web/controllers/old_controller.ex b/lp/lib/lp_web/controllers/old_controller.ex new file mode 100644 index 0000000..4c1443b --- /dev/null +++ b/lp/lib/lp_web/controllers/old_controller.ex @@ -0,0 +1,14 @@ +defmodule LpWeb.OldController do + use LpWeb, :controller + + def index(conn, _params) do + # conn + # |> render("old.html") + render(conn, "old.html") + + # html(conn, """ + #

YetAnotherOldMockup

+ # """ + # ) + end + end \ No newline at end of file diff --git a/lp/lib/lp_web/controllers/table_controller.ex b/lp/lib/lp_web/controllers/table_controller.ex new file mode 100644 index 0000000..6347b55 --- /dev/null +++ b/lp/lib/lp_web/controllers/table_controller.ex @@ -0,0 +1,11 @@ +defmodule LpWeb.TableController do + use LpWeb, :controller + + def index(conn, _params) do + render(conn, "table.html") + + end + def sample(conn, _params) do + render(conn, "table_sample.html") + end + end \ No newline at end of file diff --git a/lp/lib/lp_web/endpoint.ex b/lp/lib/lp_web/endpoint.ex new file mode 100644 index 0000000..26850fe --- /dev/null +++ b/lp/lib/lp_web/endpoint.ex @@ -0,0 +1,54 @@ +defmodule LpWeb.Endpoint do + use Phoenix.Endpoint, otp_app: :lp + + # 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: "_lp_key", + signing_salt: "xPlX3lVr" + ] + + socket "/socket", LpWeb.UserSocket, + websocket: true, + longpoll: false + + 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: :lp, + gzip: false, + only: ~w(css fonts images js 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 + plug Phoenix.Ecto.CheckRepoStatus, otp_app: :lp + 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 LpWeb.Router +end diff --git a/lp/lib/lp_web/gettext.ex b/lp/lib/lp_web/gettext.ex new file mode 100644 index 0000000..1cb2440 --- /dev/null +++ b/lp/lib/lp_web/gettext.ex @@ -0,0 +1,24 @@ +defmodule LpWeb.Gettext do + @moduledoc """ + A module providing Internationalization with a gettext-based API. + + By using [Gettext](https://hexdocs.pm/gettext), + your module gains a set of macros for translations, for example: + + import LpWeb.Gettext + + # Simple translation + gettext("Here is the string to translate") + + # Plural translation + ngettext("Here is the string to translate", + "Here are the strings to translate", + 3) + + # Domain-based translation + dgettext("errors", "Here is the error message to translate") + + See the [Gettext Docs](https://hexdocs.pm/gettext) for detailed usage. + """ + use Gettext, otp_app: :lp +end diff --git a/lp/lib/lp_web/live/page_live.ex b/lp/lib/lp_web/live/page_live.ex new file mode 100644 index 0000000..47f4d08 --- /dev/null +++ b/lp/lib/lp_web/live/page_live.ex @@ -0,0 +1,39 @@ +defmodule LpWeb.PageLive do + use LpWeb, :live_view + + @impl true + def mount(_params, _session, socket) do + {:ok, assign(socket, query: "", results: %{})} + end + + @impl true + def handle_event("suggest", %{"q" => query}, socket) do + {:noreply, assign(socket, results: search(query), query: query)} + end + + @impl true + def handle_event("search", %{"q" => query}, socket) do + case search(query) do + %{^query => vsn} -> + {:noreply, redirect(socket, external: "https://hexdocs.pm/#{query}/#{vsn}")} + + _ -> + {:noreply, + socket + |> put_flash(:error, "No dependencies found matching \"#{query}\"") + |> assign(results: %{}, query: query)} + end + end + + defp search(query) do + if not LpWeb.Endpoint.config(:code_reloader) do + raise "action disabled when not in development" + end + + for {app, desc, vsn} <- Application.started_applications(), + app = to_string(app), + String.starts_with?(app, query) and not List.starts_with?(desc, ~c"ERTS"), + into: %{}, + do: {app, vsn} + end +end diff --git a/lp/lib/lp_web/live/page_live.html.leex b/lp/lib/lp_web/live/page_live.html.leex new file mode 100644 index 0000000..52509c2 --- /dev/null +++ b/lp/lib/lp_web/live/page_live.html.leex @@ -0,0 +1,48 @@ +
+

<%= gettext "Welcome to %{name}!", name: "Phoenix" %>

+

Peace of mind from prototype to production

+ +
+ + + <%= for {app, _vsn} <- @results do %> + + <% end %> + + +
+
+ +
+ + +
diff --git a/lp/lib/lp_web/router.ex b/lp/lib/lp_web/router.ex new file mode 100644 index 0000000..6623a34 --- /dev/null +++ b/lp/lib/lp_web/router.ex @@ -0,0 +1,50 @@ +defmodule LpWeb.Router do + use LpWeb, :router + + pipeline :browser do + plug :accepts, ["html"] + plug :fetch_session + plug :fetch_live_flash + plug :put_root_layout, {LpWeb.LayoutView, :root} + plug :protect_from_forgery + plug :put_secure_browser_headers + end + + pipeline :api do + plug :accepts, ["json"] + end + + scope "/", LpWeb do + pipe_through :browser + get "/", OldController, :index + # get "/table", TableController, :sample + get "/table", TableController, :index + get "/git", GitController, :index + get "/github", GitController, :github + get "/oauth2", GitController, :oauth + # get "old", OldController, :index + + # live "/", PageLive, :index + end + + # Other scopes may use custom stacks. + # scope "/api", LpWeb 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: LpWeb.Telemetry + end + end +end diff --git a/lp/lib/lp_web/telemetry.ex b/lp/lib/lp_web/telemetry.ex new file mode 100644 index 0000000..d6ecd68 --- /dev/null +++ b/lp/lib/lp_web/telemetry.ex @@ -0,0 +1,55 @@ +defmodule LpWeb.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} + ), + + # Database Metrics + summary("lp.repo.query.total_time", unit: {:native, :millisecond}), + summary("lp.repo.query.decode_time", unit: {:native, :millisecond}), + summary("lp.repo.query.query_time", unit: {:native, :millisecond}), + summary("lp.repo.query.queue_time", unit: {:native, :millisecond}), + summary("lp.repo.query.idle_time", 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. + # {LpWeb, :count_users, []} + ] + end +end diff --git a/lp/lib/lp_web/templates/error/404_page.html.eex b/lp/lib/lp_web/templates/error/404_page.html.eex new file mode 100644 index 0000000..79c4fa5 --- /dev/null +++ b/lp/lib/lp_web/templates/error/404_page.html.eex @@ -0,0 +1 @@ +

404

\ No newline at end of file diff --git a/lp/lib/lp_web/templates/error/500_page.html.eex b/lp/lib/lp_web/templates/error/500_page.html.eex new file mode 100644 index 0000000..fe5c8bf --- /dev/null +++ b/lp/lib/lp_web/templates/error/500_page.html.eex @@ -0,0 +1,2 @@ +

500

+

There was an error. Sadly.

diff --git a/lp/lib/lp_web/templates/git/git.html.eex b/lp/lib/lp_web/templates/git/git.html.eex new file mode 100644 index 0000000..84ec007 --- /dev/null +++ b/lp/lib/lp_web/templates/git/git.html.eex @@ -0,0 +1,43 @@ + + + +

Github mock page

+ + +
iex> jwt_token = Github.Client.generate_jwt_token(app_id: 12345, private_key_filepath: "app.pem")
+
+iex> github_client = %Github.Client{jwt_token: "jwt_token"}
+
+iex> github_client |> Github.Apps.Installations.find!(67890)
+%Github.Client.Response{
+  status: 200,
+  headers: [...],
+  body: %{"id" => 12345, ...},
+  ...
+}
+ +
def github(conn, _params) do
+  authorize_url = Github.Oauth2.Client.authorize_url!(
+    config: [client_id: "client_id", client_secret: "client_secret"],
+    scope: "user:email"
+  )
+  conn |> redirect(external: authorize_url)
+end
+ +
def github_callback(conn, %{"code" => code}) do
+  access_token = Github.Oauth2.Client.access_token!(
+    config: [client_id: "client_id", client_secret: "client_secret"],
+    params: [code: code]
+  )
+
+  github_client = %Github.Client{access_token: access_token}
+
+  %{"login" => login} = github_client |> Github.Users.find!() |> Map.fetch!(:body)
+  [%{"email" => email} | _] = github_client |> Github.Users.Emails.list!() |> Map.fetch!(:body)
+  ...
+end
+

https://github.com/WorkflowCI/github#with-app-jwt-token (c)

+

<%= link "GH", to: "/github" %>

+<%# <%= Github.(@url_get_param) %> + + diff --git a/lp/lib/lp_web/templates/git/oauth2.html.eex b/lp/lib/lp_web/templates/git/oauth2.html.eex new file mode 100644 index 0000000..4ce9670 --- /dev/null +++ b/lp/lib/lp_web/templates/git/oauth2.html.eex @@ -0,0 +1,4 @@ +

Autorisation succeded

+

Welcome, <%= @login %> !

+

Is it your mail <%= @email %>?

+

todo. keep context

diff --git a/lp/lib/lp_web/templates/layout/app.html.eex b/lp/lib/lp_web/templates/layout/app.html.eex new file mode 100644 index 0000000..09ffdad --- /dev/null +++ b/lp/lib/lp_web/templates/layout/app.html.eex @@ -0,0 +1,5 @@ +
+ + + <%= @inner_content %> +
diff --git a/lp/lib/lp_web/templates/layout/live.html.leex b/lp/lib/lp_web/templates/layout/live.html.leex new file mode 100644 index 0000000..8dcded5 --- /dev/null +++ b/lp/lib/lp_web/templates/layout/live.html.leex @@ -0,0 +1,11 @@ +
+ + + + + <%= @inner_content %> +
diff --git a/lp/lib/lp_web/templates/layout/old_root.html.leex b/lp/lib/lp_web/templates/layout/old_root.html.leex new file mode 100644 index 0000000..71ba7df --- /dev/null +++ b/lp/lib/lp_web/templates/layout/old_root.html.leex @@ -0,0 +1,30 @@ + + + + + + + <%= csrf_meta_tag() %> + <%= live_title_tag assigns[:page_title] || "Lp", suffix: " · Phoenix Framework" %> + "/> + + + +
+
+ + +
+
+ <%= @inner_content %> + + diff --git a/lp/lib/lp_web/templates/layout/root.html.eex b/lp/lib/lp_web/templates/layout/root.html.eex new file mode 100644 index 0000000..c1d7ede --- /dev/null +++ b/lp/lib/lp_web/templates/layout/root.html.eex @@ -0,0 +1,34 @@ + + + + + + + <%= csrf_meta_tag() %> + <%= live_title_tag assigns[:page_title] || "Lp", suffix: " · Phoenix Framework" %> + "/> + + + + + + +
+
+ +
+
+ + <%= @inner_content %> + + diff --git a/lp/lib/lp_web/templates/layout/root.html.haml b/lp/lib/lp_web/templates/layout/root.html.haml new file mode 100644 index 0000000..acbd0b8 --- /dev/null +++ b/lp/lib/lp_web/templates/layout/root.html.haml @@ -0,0 +1,20 @@ +!!! +%html{lang: "en"} + %head + %meta{content: "text/html; charset=UTF-8", "http-equiv" => "Content-Type"}/ + %meta{charset: "utf-8"}/ + %meta{content: "IE=edge", "http-equiv" => "X-UA-Compatible"}/ + %meta{content: "width=device-width, initial-scale=1.0", name: "viewport"}/ + = csrf_meta_tag() + = live_title_tag assigns[:page_title] || "Lp", suffix: " · Phoenix Framework" + %link{href: "#{Routes.static_path(@conn, "/css/app.css")}", "phx-track-static" => "", rel: "stylesheet"}/ + %script{defer: "defer", "phx-track-static" => "", src: "#{Routes.static_path(@conn, "/js/app.js")}", type: "text/javascript"} + %script{defer: "defer", src: "https://cdn.jsdelivr.net/gh/alpinejs/alpine@v2.3.5/dist/alpine.min.js"} + %body + %header + %section.container + %nav{role: "navigation"} + %ul + %li + %a{href: "https://gamecult.games/labor-platform"} GameCult + = @inner_content \ No newline at end of file diff --git a/lp/lib/lp_web/templates/old/old.html.eex_first b/lp/lib/lp_web/templates/old/old.html.eex_first new file mode 100644 index 0000000..5d65550 --- /dev/null +++ b/lp/lib/lp_web/templates/old/old.html.eex_first @@ -0,0 +1 @@ +Eex has first priority diff --git a/lp/lib/lp_web/templates/old/old.html.md b/lp/lib/lp_web/templates/old/old.html.md new file mode 100644 index 0000000..b945380 --- /dev/null +++ b/lp/lib/lp_web/templates/old/old.html.md @@ -0,0 +1,185 @@ +--- +title: 'GameCult Labor Platform' +anchors: + active: false +tagtitle: h2 +--- + +# Architecture + +The Labor Platform is available on our website as a web app. Users can simply login using their Github account or create a GameCult account (same account used in our games). Pages and actions in this section all take place on our website, which communicates with an application and database running on our server containing code that interfaces with Github for things like the creation of issues, assignment of tasks, and retrieving patron donation history. + + +## Contribute + +This section of the Platform is where members can view all of the currently outstanding issues for our projects, and sign up to volunteer themselves. Each entry is linked to Github, and displays its current status in the list entry, including some data which is not available on Github. Issues can be sorted and filtered based on any of the following: + + +### Data + + + +* Project +* Name +* Category (Modeling/Music/AI/Refactoring/etc.) +* Status (available/assigned/pending review/complete) +* Currently assigned members/Current volunteers +* Man Hours +* Skill Level +* Contribution Points + + +## Vote + +This section of the Platform allows members to participate in determining the future direction of GameCult. Any member can create a motion in this section or vote on existing motions. + + +## Profile + +This section allows the user to access supplementary information and statistics connected to their account. Here the user can describe the skills they have to better match them with open issues. + + + +* Nickname +* Member Tier +* Portfolio Link +* Skills + * List areas of expertise and the level for each skill. +* Availability + * Amount of time per day that the user is available for work + * Weekday selection +* Task History + * Completed Tasks + * Tasks in Progress + * Hours worked + * Total points earned/ total payout (per/year) +* Payout + * Revenue Share + * Monthly/Yearly Income + * Total + * Per Project + * Bounties + * Total + * This Month/Year +* Point Balance + + +### Management + +This section is for creating motions which impact some aspect of the GameCult organization itself, such as tier thresholds or Role applications. Motions in this section are time-limited, and will pass or fail depending on the vote distribution at the end of the time limit. The majority needed to pass a motion depends on the type. + + +### Projects + +This section is for motions which, when successful, result in the creation of a new issue with associated bounty. This is the place to report bugs in one of our projects, or suggest new features or content to be created. Motions in this section are not time-limited, and are passed when a certain proportion of the total voting body agrees on it. There are only positive votes in this section, abstaining from voting on a proposal here is the same as voting against. The proportion necessary to pass a proposal depends on its category: + + + +* Bugs: 15% +* Cosmetics: 30% +* Balance Changes: 40% +* Features: 50% +* New Content: 50% +* Fundamental Design Changes: 66% + + +# Tiers + +Members are given points according to two metrics: patrons and contributors, both of which contribute towards their ranking in a tier system. Tiers, in addition to providing certain benefits, directly determine how powerful the member’s vote is on the Platform. Each of the 5 tiers of each type provides a single vote added to the total number of votes a member can use. + + +### Decay + +In order to avoid stratifying the organization over time due to a weight of historical contribution that is impossible for new members to overcome, historical point balances are subject to exponential decay, with 1% of their balance disappearing every week, rounded down. This does not apply to project specific contribution points. + + +### Patrons + +Both a patron’s monthly contribution and their total historical donation counts towards their Patron Tier. After a month, a donation becomes historical, meaning its value is halved and subject to point decay. Every dollar of direct donation provides a single point. Player accounts also earn patron points for 20% of their CultCoin purchases. + +**Tier I - Bronze (10 pts)** + +**Tier II - Silver (100 pts)** + +**Tier III - Gold (1k pts)** + +**Tier IV - Platinum (10k pts)** + +**Tier V - Unobtanium (100k pts)** + + +### Contributors + +Contributors earn points from their contributions, with the amount being calculated using a formula that takes input from the task’s skill requirement and estimated man-hours. Contribution points are accounted for on both a general and per-project basis. Project contribution points do not decay. For simplicity and parity with patron points, each point granted represents a dollar of nominal labor value. Contributors are also eligible for bonuses if they turn in contributions early or if they. New contributors are automatically granted 20 contribution points for an automatic tier of Postulate. + +**Tier I - Postulate (10 pts)** + +**Tier II - Initiate (100 pts)** + +Required to qualify for revenue sharing + +**Tier III - Novice (1k pts)** + +Allows the member to apply for a Maintainer Role for any project + +**Tier IV - Adept (10k pts)** + +Allows the member to apply for a Producer Role for any project + +**Tier V - Master (100k pts)** + + +# Revenue Sharing + +Revenue is divided in three equal portions: one portion is divided among all members according to total contribution points, one is divided according to contributions for the specific project which generated the revenue, and the last is stored in the budget for expenses and development of future projects. + + +# Roles + +Not all contributions can be easily quantified by individual tasks. Some jobs are ongoing, and should be rewarded as such. We call those positions “Roles”. Roles provide an ongoing stream of both direct income (salary) and contribution points. + + +### Social Media + +Describes those tasked with social media-related responsibilities. Someone in this role would be responsible for maintaining and keeping up-to-date with the various social media profiles maintained by GameCult. + + +### Community Manager + +Community managers are responsible for maintaining contact with and order within our internal social environments, such as Discord or forums. + + +### Maintainer + +Members of a project’s maintenance team are responsible for formalizing community proposals and reviewing pull requests to verify quality and coverage. This does not apply only to code. Projects need Maintainers to verify the quality of art as well, and there is a writing-related role (Editor) which is not project-specific. + + +### Producer + +Producers are responsible for coordinating and caring for the members who are working on their project, as well as creating milestones and keeping their eyes on deadlines. It’s their job to choose which volunteers get assigned to issues. They can also unilaterally create new issues as long as they aren’t contradicted by previous community votes. + + +# Workflow + + +## Issue Creation + +Sometimes the community has spoken, and decided that something needs to get done. When such a proposal passes, it is added to a queue for formalization. Other times it is a Producer for the project who decides, crafting a proposal and adding it to the queue directly. + +From the queue, a maintainer will pick up the proposal and turn it into an Issue, describing it in detail as well as determining the skill level and man hours required to complete the task. + + +## Assignment + +Once an issue has been created, it must be assigned to a member. Members must volunteer to work on an issue, at which point they can be chosen for the task by the project’s Producer. + +The assigned member is by default assigned a nominal deadline depending on their stated availability and the amount of man-hours of the task: a person who has declared 1 hour per day of availability would receive 5 days to complete a 5 man-hour task. The default deadline can be adjusted by the Producer when the task is assigned. + + +## Submission + +Regardless of the state of work when the deadline is reached, it must be submitted to the project repository as a pull request. + +At this point one of the project’s Maintainers needs to come along and determine whether the submission solves the issue and meets the project’s standards for quality. If it does not, the Producer can choose whether to extend the deadline or reassign the task and choose what proportion of the bounty goes to the previous assignee. + +On completion, the member(s) assigned to the task are awarded the contribution points and the cash bounty associated with the task. A successful task can be awarded a point bonus proportional to the nominal man-hours divided by the number taken. A highly successful task where the assignee went beyond the call of duty may also earn a bonus at the discretion of the Producer. \ No newline at end of file diff --git a/lp/lib/lp_web/templates/table/table.html.eex b/lp/lib/lp_web/templates/table/table.html.eex new file mode 100644 index 0000000..0d2f0c4 --- /dev/null +++ b/lp/lib/lp_web/templates/table/table.html.eex @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProjectNameCategory (Modeling/Music/AI/Refactoring/etc.)Status (available/assigned/pending review/complete)Currently assigned members/Current volunteersMan HoursSkill levelContribution Points
ProjectNameCategory (Modeling/Music/AI/Refactoring/etc.)Status (available/assigned/pending review/complete)Currently assigned members/Current volunteersMan HoursSkill levelContribution Points
GCLPTable datawebassigned1: Yangest: 7, spnt: 2medium31
+ + \ No newline at end of file diff --git a/lp/lib/lp_web/templates/table/table_sample.html.eex b/lp/lib/lp_web/templates/table/table_sample.html.eex new file mode 100644 index 0000000..f1bd608 --- /dev/null +++ b/lp/lib/lp_web/templates/table/table_sample.html.eex @@ -0,0 +1,690 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
First nameLast namePositionOfficeAgeStart dateSalaryExtn.
First nameLast namePositionOfficeAgeStart dateSalaryExtn.
TigerNixonSystem ArchitectEdinburgh612011/04/25$320,8005421
GarrettWintersAccountantTokyo632011/07/25$170,7508422
AshtonCoxJunior Technical AuthorSan Francisco662009/01/12$86,0001562
CedricKellySenior Javascript DeveloperEdinburgh222012/03/29$433,0606224
AiriSatouAccountantTokyo332008/11/28$162,7005407
BrielleWilliamsonIntegration SpecialistNew York612012/12/02$372,0004804
HerrodChandlerSales AssistantSan Francisco592012/08/06$137,5009608
RhonaDavidsonIntegration SpecialistTokyo552010/10/14$327,9006200
ColleenHurstJavascript DeveloperSan Francisco392009/09/15$205,5002360
SonyaFrostSoftware EngineerEdinburgh232008/12/13$103,6001667
JenaGainesOffice ManagerLondon302008/12/19$90,5603814
QuinnFlynnSupport LeadEdinburgh222013/03/03$342,0009497
ChardeMarshallRegional DirectorSan Francisco362008/10/16$470,6006741
HaleyKennedySenior Marketing DesignerLondon432012/12/18$313,5003597
TatyanaFitzpatrickRegional DirectorLondon192010/03/17$385,7501965
MichaelSilvaMarketing DesignerLondon662012/11/27$198,5001581
PaulByrdChief Financial Officer (CFO)New York642010/06/09$725,0003059
GloriaLittleSystems AdministratorNew York592009/04/10$237,5001721
BradleyGreerSoftware EngineerLondon412012/10/13$132,0002558
DaiRiosPersonnel LeadEdinburgh352012/09/26$217,5002290
JenetteCaldwellDevelopment LeadNew York302011/09/03$345,0001937
YuriBerryChief Marketing Officer (CMO)New York402009/06/25$675,0006154
CaesarVancePre-Sales SupportNew York212011/12/12$106,4508330
DorisWilderSales AssistantSidney232010/09/20$85,6003023
AngelicaRamosChief Executive Officer (CEO)London472009/10/09$1,200,0005797
GavinJoyceDeveloperEdinburgh422010/12/22$92,5758822
JenniferChangRegional DirectorSingapore282010/11/14$357,6509239
BrendenWagnerSoftware EngineerSan Francisco282011/06/07$206,8501314
FionaGreenChief Operating Officer (COO)San Francisco482010/03/11$850,0002947
ShouItouRegional MarketingTokyo202011/08/14$163,0008899
MichelleHouseIntegration SpecialistSidney372011/06/02$95,4002769
SukiBurksDeveloperLondon532009/10/22$114,5006832
PrescottBartlettTechnical AuthorLondon272011/05/07$145,0003606
GavinCortezTeam LeaderSan Francisco222008/10/26$235,5002860
MartenaMccrayPost-Sales supportEdinburgh462011/03/09$324,0508240
UnityButlerMarketing DesignerSan Francisco472009/12/09$85,6755384
HowardHatfieldOffice ManagerSan Francisco512008/12/16$164,5007031
HopeFuentesSecretarySan Francisco412010/02/12$109,8506318
VivianHarrellFinancial ControllerSan Francisco622009/02/14$452,5009422
TimothyMooneyOffice ManagerLondon372008/12/11$136,2007580
JacksonBradshawDirectorNew York652008/09/26$645,7501042
OliviaLiangSupport EngineerSingapore642011/02/03$234,5002120
BrunoNashSoftware EngineerLondon382011/05/03$163,5006222
SakuraYamamotoSupport EngineerTokyo372009/08/19$139,5759383
ThorWaltonDeveloperNew York612013/08/11$98,5408327
FinnCamachoSupport EngineerSan Francisco472009/07/07$87,5002927
SergeBaldwinData CoordinatorSingapore642012/04/09$138,5758352
ZenaidaFrankSoftware EngineerNew York632010/01/04$125,2507439
ZoritaSerranoSoftware EngineerSan Francisco562012/06/01$115,0004389
JenniferAcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,6503431
CaraStevensSales AssistantNew York462011/12/06$145,6003990
HermioneButlerRegional DirectorLondon472011/03/21$356,2501016
LaelGreerSystems AdministratorLondon212009/02/27$103,5006733
JonasAlexanderDeveloperSan Francisco302010/07/14$86,5008196
ShadDeckerRegional DirectorEdinburgh512008/11/13$183,0006373
MichaelBruceJavascript DeveloperSingapore292011/06/27$183,0005384
DonnaSniderCustomer SupportNew York272011/01/25$112,0004226
+ + diff --git a/lp/lib/lp_web/views/error_helpers.ex b/lp/lib/lp_web/views/error_helpers.ex new file mode 100644 index 0000000..285f65e --- /dev/null +++ b/lp/lib/lp_web/views/error_helpers.ex @@ -0,0 +1,47 @@ +defmodule LpWeb.ErrorHelpers do + @moduledoc """ + Conveniences for translating and building error messages. + """ + + use Phoenix.HTML + + @doc """ + Generates tag for inlined form input errors. + """ + def error_tag(form, field) do + Enum.map(Keyword.get_values(form.errors, field), fn error -> + content_tag(:span, translate_error(error), + class: "invalid-feedback", + phx_feedback_for: input_id(form, field) + ) + end) + end + + @doc """ + Translates an error message using gettext. + """ + def translate_error({msg, opts}) do + # When using gettext, we typically pass the strings we want + # to translate as a static argument: + # + # # Translate "is invalid" in the "errors" domain + # dgettext("errors", "is invalid") + # + # # Translate the number of files with plural rules + # dngettext("errors", "1 file", "%{count} files", count) + # + # Because the error messages we show in our forms and APIs + # are defined inside Ecto, we need to translate them dynamically. + # This requires us to call the Gettext module passing our gettext + # backend as first argument. + # + # Note we use the "errors" domain, which means translations + # should be written to the errors.po file. The :count option is + # set by Ecto and indicates we should also apply plural rules. + if count = opts[:count] do + Gettext.dngettext(LpWeb.Gettext, "errors", msg, msg, count, opts) + else + Gettext.dgettext(LpWeb.Gettext, "errors", msg, opts) + end + end +end diff --git a/lp/lib/lp_web/views/error_view.ex b/lp/lib/lp_web/views/error_view.ex new file mode 100644 index 0000000..9702a05 --- /dev/null +++ b/lp/lib/lp_web/views/error_view.ex @@ -0,0 +1,20 @@ +defmodule LpWeb.ErrorView do + use LpWeb, :view + + # If you want to customize a particular status code + # for a certain format, you may uncomment below. + def render("404.html", _assigns) do + render("404_page.html", %{}) + end + def render("500.html", _assigns) do + render("500_page.html", %{}) + # "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/lp/lib/lp_web/views/git_view.ex b/lp/lib/lp_web/views/git_view.ex new file mode 100644 index 0000000..4af481a --- /dev/null +++ b/lp/lib/lp_web/views/git_view.ex @@ -0,0 +1,3 @@ +defmodule LpWeb.GitView do + use LpWeb, :view + end \ No newline at end of file diff --git a/lp/lib/lp_web/views/layout_view.ex b/lp/lib/lp_web/views/layout_view.ex new file mode 100644 index 0000000..576608e --- /dev/null +++ b/lp/lib/lp_web/views/layout_view.ex @@ -0,0 +1,3 @@ +defmodule LpWeb.LayoutView do + use LpWeb, :view +end diff --git a/lp/lib/lp_web/views/old_view.ex b/lp/lib/lp_web/views/old_view.ex new file mode 100644 index 0000000..044865e --- /dev/null +++ b/lp/lib/lp_web/views/old_view.ex @@ -0,0 +1,11 @@ +defmodule LpWeb.OldView do + use LpWeb, :view + + # def title() do + # "Awesome New Title!" + # end + + # def render(conn, _params) do + # # render(conn, "index.html") + # end + end \ No newline at end of file diff --git a/lp/lib/lp_web/views/table_view.ex b/lp/lib/lp_web/views/table_view.ex new file mode 100644 index 0000000..2a6c2cb --- /dev/null +++ b/lp/lib/lp_web/views/table_view.ex @@ -0,0 +1,3 @@ +defmodule LpWeb.TableView do + use LpWeb, :view + end \ No newline at end of file diff --git a/lp/mix.exs b/lp/mix.exs new file mode 100644 index 0000000..0330806 --- /dev/null +++ b/lp/mix.exs @@ -0,0 +1,71 @@ +defmodule Lp.MixProject do + use Mix.Project + + def project do + [ + app: :lp, + version: "0.1.0", + elixir: "~> 1.7", + 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: {Lp.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.5"}, + {:phoenix_ecto, "~> 4.1"}, + {:ecto_sql, "~> 3.4"}, + {:postgrex, ">= 0.0.0"}, + {:phoenix_live_view, "~> 0.14.6"}, + {:floki, ">= 0.27.0", only: :test}, + {:phoenix_html, "~> 2.11"}, + {:phoenix_live_reload, "~> 1.2", only: :dev}, + {:phoenix_live_dashboard, "~> 0.2"}, + {:telemetry_metrics, "~> 0.4"}, + {:telemetry_poller, "~> 0.4"}, + {:gettext, "~> 0.11"}, + {:jason, "~> 1.0"}, + {:plug_cowboy, "~> 2.0"}, + {:phoenix_markdown, "~> 1.0"}, + # {:ueberauth_github, "~> 0.7"}, + {:github, "~> 0.12.0-rc1"}, + {:poison, "~> 4.0.1"}, + ] + 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 + [ + setup: ["deps.get", "ecto.setup", "cmd npm install --prefix assets"], + "ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"], + "ecto.reset": ["ecto.drop", "ecto.setup"], + test: ["ecto.create --quiet", "ecto.migrate --quiet", "test"] + ] + end +end diff --git a/lp/mix.lock b/lp/mix.lock new file mode 100644 index 0000000..7ff7ac7 --- /dev/null +++ b/lp/mix.lock @@ -0,0 +1,49 @@ +%{ + "calliope": {:hex, :calliope, "0.4.2", "29d8585331f3c04f95d6e2f7c8367d660cfb6c2dc031bd3d22afb7e7201eb5c6", [:mix], [], "hexpm", "3e355b0057ce52e402172e3f37f739765450b9c7ec18bf84c56c12007363283c"}, + "certifi": {:hex, :certifi, "2.5.2", "b7cfeae9d2ed395695dd8201c57a2d019c0c43ecaf8b8bcb9320b40d6662f340", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm", "3b3b5f36493004ac3455966991eaf6e768ce9884693d9968055aeeeb1e575040"}, + "connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm", "4a0850c9be22a43af9920a71ab17c051f5f7d45c209e40269a1938832510e4d9"}, + "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"}, + "cowlib": {:hex, :cowlib, "2.9.1", "61a6c7c50cf07fdd24b2f45b89500bb93b6686579b069a89f88cb211e1125c78", [:rebar3], [], "hexpm", "e4175dc240a70d996156160891e1c62238ede1729e45740bdd38064dad476170"}, + "db_connection": {:hex, :db_connection, "2.2.2", "3bbca41b199e1598245b716248964926303b5d4609ff065125ce98bcd368939e", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}], "hexpm", "642af240d8a8affb93b4ba5a6fcd2bbcbdc327e1a524b825d383711536f8070c"}, + "decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"}, + "earmark": {:hex, :earmark, "1.4.10", "bddce5e8ea37712a5bfb01541be8ba57d3b171d3fa4f80a0be9bcf1db417bcaf", [:mix], [{:earmark_parser, ">= 1.4.10", [hex: :earmark_parser, repo: "hexpm", optional: false]}], "hexpm", "12dbfa80810478e521d3ffb941ad9fbfcbbd7debe94e1341b4c4a1b2411c1c27"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.10", "6603d7a603b9c18d3d20db69921527f82ef09990885ed7525003c7fe7dc86c56", [:mix], [], "hexpm", "8e2d5370b732385db2c9b22215c3f59c84ac7dda7ed7e544d7c459496ae519c0"}, + "ecto": {:hex, :ecto, "3.4.6", "08f7afad3257d6eb8613309af31037e16c36808dfda5a3cd0cb4e9738db030e4", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "6f13a9e2a62e75c2dcfc7207bfc65645ab387af8360db4c89fee8b5a4bf3f70b"}, + "ecto_sql": {:hex, :ecto_sql, "3.4.5", "30161f81b167d561a9a2df4329c10ae05ff36eca7ccc84628f2c8b9fa1e43323", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.4.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.3.0 or ~> 0.4.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.0", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "31990c6a3579b36a3c0841d34a94c275e727de8b84f58509da5f1b2032c98ac2"}, + "file_system": {:hex, :file_system, "0.2.9", "545b9c9d502e8bfa71a5315fac2a923bd060fd9acb797fe6595f54b0f975fd32", [:mix], [], "hexpm", "3cf87a377fe1d93043adeec4889feacf594957226b4f19d5897096d6f61345d8"}, + "floki": {:hex, :floki, "0.28.0", "0d0795a17189510ee01323e6990f906309e9fc6e8570219135211f1264d78c7f", [:mix], [{:html_entities, "~> 0.5.0", [hex: :html_entities, repo: "hexpm", optional: false]}], "hexpm", "db1549560874ebba5a6367e46c3aec5fedd41f2757ad6efe567efb04b4d4ee55"}, + "gettext": {:hex, :gettext, "0.18.2", "7df3ea191bb56c0309c00a783334b288d08a879f53a7014341284635850a6e55", [:mix], [], "hexpm", "f9f537b13d4fdd30f3039d33cb80144c3aa1f8d9698e47d7bcbcc8df93b1f5c5"}, + "github": {:hex, :github, "0.12.0-rc1", "3b7c7efafb7ee2d6f584a129c2a42c38b1f00d12e289ba179f01865c6115e003", [:make, :mix], [{:httpoison, "~> 0.11", [hex: :httpoison, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:joken, "~> 2.0.0-rc3", [hex: :joken, repo: "hexpm", optional: false]}, {:oauth2, "~> 0.9", [hex: :oauth2, repo: "hexpm", optional: false]}], "hexpm", "f48f1f08bd9a80ad71891ea70c76e3a4c165095d48facaaaf3cde555865d0420"}, + "hackney": {:hex, :hackney, "1.16.0", "5096ac8e823e3a441477b2d187e30dd3fff1a82991a806b2003845ce72ce2d84", [:rebar3], [{:certifi, "2.5.2", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.1", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.0", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.6", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm", "3bf0bebbd5d3092a3543b783bf065165fa5d3ad4b899b836810e513064134e18"}, + "html_entities": {:hex, :html_entities, "0.5.1", "1c9715058b42c35a2ab65edc5b36d0ea66dd083767bef6e3edb57870ef556549", [:mix], [], "hexpm", "30efab070904eb897ff05cd52fa61c1025d7f8ef3a9ca250bc4e6513d16c32de"}, + "httpoison": {:hex, :httpoison, "0.13.0", "bfaf44d9f133a6599886720f3937a7699466d23bb0cd7a88b6ba011f53c6f562", [:mix], [{:hackney, "~> 1.8", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "4846958172d6401c4f34ecc5c2c4607b5b0d90b8eec8f6df137ca4907942ed0f"}, + "idna": {:hex, :idna, "6.0.1", "1d038fb2e7668ce41fbf681d2c45902e52b3cb9e9c77b55334353b222c2ee50c", [:rebar3], [{:unicode_util_compat, "0.5.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "a02c8a1c4fd601215bb0b0324c8a6986749f807ce35f25449ec9e69758708122"}, + "jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"}, + "joken": {:hex, :joken, "2.0.1", "ec9ab31bf660f343380da033b3316855197c8d4c6ef597fa3fcb451b326beb14", [:mix], [{:jose, "~> 1.9", [hex: :jose, repo: "hexpm", optional: false]}], "hexpm", "059be59550f93486b1b1f6bb54b7fa573354ee8d6adbb7244cad74d62e3fdf6a"}, + "jose": {:hex, :jose, "1.10.1", "16d8e460dae7203c6d1efa3f277e25b5af8b659febfc2f2eb4bacf87f128b80a", [:mix, :rebar3], [], "hexpm", "3c7ddc8a9394b92891db7c2771da94bf819834a1a4c92e30857b7d582e2f8257"}, + "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, + "mime": {:hex, :mime, "1.4.0", "5066f14944b470286146047d2f73518cf5cca82f8e4815cf35d196b58cf07c47", [:mix], [], "hexpm", "75fa42c4228ea9a23f70f123c74ba7cece6a03b1fd474fe13f6a7a85c6ea4ff6"}, + "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"}, + "oauth2": {:hex, :oauth2, "0.9.4", "632e8e8826a45e33ac2ea5ac66dcc019ba6bb5a0d2ba77e342d33e3b7b252c6e", [:mix], [{:hackney, "~> 1.7", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "407c6b9f60aa0d01b915e2347dc6be78adca706a37f0c530808942da3b62e7af"}, + "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm", "17ef63abde837ad30680ea7f857dd9e7ced9476cdd7b0394432af4bfc241b960"}, + "phoenix": {:hex, :phoenix, "1.5.5", "9a5a197edc1828c5f138a8ef10524dfecc43e36ab435c14578b1e9b4bd98858c", [: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", "b10eaf86ad026eafad2ee3dd336f0fb1c95a3711789855d913244e270bde463b"}, + "phoenix_ecto": {:hex, :phoenix_ecto, "4.2.1", "13f124cf0a3ce0f1948cf24654c7b9f2347169ff75c1123f44674afee6af3b03", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 2.15", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "478a1bae899cac0a6e02be1deec7e2944b7754c04e7d4107fc5a517f877743c0"}, + "phoenix_haml": {:hex, :phoenix_haml, "0.2.3", "432b689ebb03dc821f00ae0ae5fb22e814aa8704e599763cbde538daf9f389f6", [:mix], [{:calliope, "~> 0.4.1", [hex: :calliope, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.1", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.3", [hex: :phoenix_html, repo: "hexpm", optional: false]}], "hexpm", "bc52d3a5800034aad469c18af317cc983b362760348ce2f50c395efc733a00ec"}, + "phoenix_html": {:hex, :phoenix_html, "2.14.2", "b8a3899a72050f3f48a36430da507dd99caf0ac2d06c77529b1646964f3d563e", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "58061c8dfd25da5df1ea0ca47c972f161beb6c875cd293917045b92ffe1bf617"}, + "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.2.9", "ac43a73561a4010fd2a52289a2f570829e2be5d5ea408a5af99dbed8793439e7", [:mix], [{:phoenix_html, "~> 2.14.1 or ~> 2.15", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.14.3", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.4.0 or ~> 0.5.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "f7cd3265a53d2bcd2e541a7d3c55f5a22e07bf6070b1d4adabd81791885190f7"}, + "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.2.4", "940c0344b1d66a2e46eef02af3a70e0c5bb45a4db0bf47917add271b76cd3914", [: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", "38f9308357dea4cc77f247e216da99fcb0224e05ada1469167520bed4cb8cccd"}, + "phoenix_live_view": {:hex, :phoenix_live_view, "0.14.7", "e05ca2e57974bb99eb54fed88b04754a622e54cf7e832db3c868bd06e0b99ff2", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.5.3", [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", "899224a704221ab0019200da61019dea699763e12daa24d69edd79bc228fe5a5"}, + "phoenix_markdown": {:hex, :phoenix_markdown, "1.0.3", "8095c40dd5037f4b56079ad66de3fe9136406c7c44e1222ce3c74d22e4c7870a", [:mix], [{:earmark, "~> 1.2", [hex: :earmark, repo: "hexpm", optional: false]}, {:html_entities, "~> 0.4", [hex: :html_entities, repo: "hexpm", optional: false]}, {:phoenix, ">= 1.1.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, ">= 2.3.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}], "hexpm", "d3591c4cb3357b068cc8284952dbacedb874b287add27787eea2d1d314b18c16"}, + "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.0.0", "a1ae76717bb168cdeb10ec9d92d1480fec99e3080f011402c0a2d68d47395ffb", [:mix], [], "hexpm", "c52d948c4f261577b9c6fa804be91884b381a7f8f18450c5045975435350f771"}, + "plug": {:hex, :plug, "1.10.4", "41eba7d1a2d671faaf531fa867645bd5a3dce0957d8e2a3f398ccff7d2ef017f", [: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", "ad1e233fe73d2eec56616568d260777b67f53148a999dc2d048f4eb9778fe4a0"}, + "plug_cowboy": {:hex, :plug_cowboy, "2.3.0", "149a50e05cb73c12aad6506a371cd75750c0b19a32f81866e1a323dda9e0e99d", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "bc595a1870cef13f9c1e03df56d96804db7f702175e4ccacdb8fc75c02a7b97e"}, + "plug_crypto": {:hex, :plug_crypto, "1.1.2", "bdd187572cc26dbd95b87136290425f2b580a116d3fb1f564216918c9730d227", [:mix], [], "hexpm", "6b8b608f895b6ffcfad49c37c7883e8df98ae19c6a28113b02aa1e9c5b22d6b5"}, + "poison": {:hex, :poison, "4.0.1", "bcb755a16fac91cad79bfe9fc3585bb07b9331e50cfe3420a24bcc2d735709ae", [:mix], [], "hexpm", "ba8836feea4b394bb718a161fc59a288fe0109b5006d6bdf97b6badfcf6f0f25"}, + "postgrex": {:hex, :postgrex, "0.15.6", "a464c72010a56e3214fe2b99c1a76faab4c2bb0255cabdef30dea763a3569aa2", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "f99268325ac8f66ffd6c4964faab9e70fbf721234ab2ad238c00f9530b8cdd55"}, + "ranch": {:hex, :ranch, "1.7.1", "6b1fab51b49196860b733a49c07604465a47bdb78aa10c1c16a3d199f7f8c881", [:rebar3], [], "hexpm", "451d8527787df716d99dc36162fca05934915db0b6141bbdac2ea8d3c7afc7d7"}, + "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"}, + "telemetry": {:hex, :telemetry, "0.4.2", "2808c992455e08d6177322f14d3bdb6b625fbcfd233a73505870d8738a2f4599", [:rebar3], [], "hexpm", "2d1419bd9dda6a206d7b5852179511722e2b18812310d304620c7bd92a13fcef"}, + "telemetry_metrics": {:hex, :telemetry_metrics, "0.5.0", "1b796e74add83abf844e808564275dfb342bcc930b04c7577ab780e262b0d998", [:mix], [{:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "31225e6ce7a37a421a0a96ec55244386aec1c190b22578bd245188a4a33298fd"}, + "telemetry_poller": {:hex, :telemetry_poller, "0.5.1", "21071cc2e536810bac5628b935521ff3e28f0303e770951158c73eaaa01e962a", [:rebar3], [{:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "4cab72069210bc6e7a080cec9afffad1b33370149ed5d379b81c7c5f0c663fd4"}, + "unicode_util_compat": {:hex, :unicode_util_compat, "0.5.0", "8516502659002cec19e244ebd90d312183064be95025a319a6c7e89f4bccd65b", [:rebar3], [], "hexpm", "d48d002e15f5cc105a696cf2f1bbb3fc72b4b770a184d8420c8db20da2674b38"}, +} diff --git a/lp/priv/cert/selfsigned.pem b/lp/priv/cert/selfsigned.pem new file mode 100644 index 0000000..dc9e28a --- /dev/null +++ b/lp/priv/cert/selfsigned.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIIcP+NbAJOWXAwDQYJKoZIhvcNAQELBQAwQzEaMBgGA1UE +CgwRUGhvZW5peCBGcmFtZXdvcmsxJTAjBgNVBAMMHFNlbGYtc2lnbmVkIHRlc3Qg +Y2VydGlmaWNhdGUwHhcNMjAxMDA0MDAwMDAwWhcNMjExMDA0MDAwMDAwWjBDMRow +GAYDVQQKDBFQaG9lbml4IEZyYW1ld29yazElMCMGA1UEAwwcU2VsZi1zaWduZWQg +dGVzdCBjZXJ0aWZpY2F0ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALIWgneD0c3VqtMDeT1t/TOEt6fHXnZ+L/j00V1bMXqmQOQlGZ8swCs3djUdfPLM +jnxfWQZ4Z6Ms3bml8KnwYsQyIG3+nW4VGB4wgow7wJX0qGC8WV/qsqci1v9YF9L0 +0w+12Wpjffy2ksPrOGgjl07+BGw73I8s9xo3pBnloREgD4v7k6cuEeQ8aFr2hSkL +ttL68qIZfp6XWzqiDKHCNL4L94mBO5/K5V0scRNLt9wxUHdwjqIkgH1OAVsWmVQp +OKdxnngh5AxiNw2RK0vnTZmfoN/HoRXa5Do48qyRVo3WIsqOVIhkJZ/Fp8lSy/ui +LPlH+z2c2maBVtp4OnPcaR0CAwEAAaN0MHIwDAYDVR0TAQH/BAIwADAOBgNVHQ8B +Af8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB0GA1UdDgQW +BBTQ5EXwkbu0mZ9bgrI6Q/jI2bjCzTAUBgNVHREEDTALgglsb2NhbGhvc3QwDQYJ +KoZIhvcNAQELBQADggEBADTmkM1bEBJLm87LhPZfhbmBokuw1JrAM7r8Wkun+1xu +FQyVTFWME2rZSj3VI7H059fcG+i6pgH0gVfsK8hnJ/PFQnT/HWf7IxYZRkLjmEQ1 +Lf/LgCA/QfhIGxHeEJRN9bFIdmwjTF0Y3JitU440O4krYDvnoodqWSQbWMTSegN7 +vHyR/sLEPHBBkkl3cAOUQbIT/zLpSYuKG3CGldyaKry2z+b+I9MUonn2dDjSZlb1 +ISZJCFl+yjn1dKX9GTV1eFBn9n16B2EKIofEuM3RY72jRk1nH8DiUI2GygMZX51A +fc8Gd1iXcGSk3GllbogOCElelo2u3Sgy1c5oHMmN+oc= +-----END CERTIFICATE----- + diff --git a/lp/priv/cert/selfsigned_key.pem b/lp/priv/cert/selfsigned_key.pem new file mode 100644 index 0000000..3c06d94 --- /dev/null +++ b/lp/priv/cert/selfsigned_key.pem @@ -0,0 +1,28 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAshaCd4PRzdWq0wN5PW39M4S3p8dedn4v+PTRXVsxeqZA5CUZ +nyzAKzd2NR188syOfF9ZBnhnoyzduaXwqfBixDIgbf6dbhUYHjCCjDvAlfSoYLxZ +X+qypyLW/1gX0vTTD7XZamN9/LaSw+s4aCOXTv4EbDvcjyz3GjekGeWhESAPi/uT +py4R5DxoWvaFKQu20vryohl+npdbOqIMocI0vgv3iYE7n8rlXSxxE0u33DFQd3CO +oiSAfU4BWxaZVCk4p3GeeCHkDGI3DZErS+dNmZ+g38ehFdrkOjjyrJFWjdYiyo5U +iGQln8WnyVLL+6Is+Uf7PZzaZoFW2ng6c9xpHQIDAQABAoIBAFSI1NNwkjW3uAfE +PVfIjwlWdWtB+vgaPCFb7Mn40Mrcgi8J4ViqgGnDQOxDnB0Qto4ZIIQuwVs2n+VQ +/KVeQzPIa5Zq50Xq43DpK/7vGiLUaNzKa05ZdQZbRl0c7uonZsytUI/svFAqRg6T +6Emeo2NOtsC9xZt9B6q9QLs+Qi+DEqRDMitBA/MIPnipoDbsmk0/HmARcTLtiqlJ +MYVWIs5kOxmXEK/TfPJRPf1dDUWJ+292t3dDcgx0QQ7vipbpYiIMXsMewqQYySuS +Dtzu20PUxAYz5lIRXPzbKhOU6/aDHUcEnwxWbq7R4aD82901jh77JvYKqxGguE2N +9uaByQECgYEA3anw9RiaQNsHVqhfha9EhpWbsPJtkCaEXVK6NKgWSyEjZy3MdAp5 +0a8IjwXui5q9BSF4+dno766fXtXhZfD8M6iExioAy//iCEqnHh80ZScQ6k9xEKxk +oxqVUYsEZppYXifAZfU73r4MpOMpFlas8nCsesGUVlqrkWL/e92ZD10CgYEAzayR +5xfQJp5XnGJH7N13nn6u6NF8khgRKxfsfqTKd1Sl7bgcFfmQAcRbdcSxMf6oBdZO +r+W1zG+7YsJtd5po9csFGQX0m/aEZun+Ffi79Vp0P9vfuy3T+bnRo5f52GmJmnPM +61EB9CLAvBrd0l0MX91htY11FwyJSDvImKFd5MECgYAm6AAqFOJmRct4816oyUWe +1b2ZBkQizA/pjW6vdV1MXImpP4mmSHxvSGiZKfJfwI4yy1g/inbvMtg4PhQs32p0 +6rw7R/4R0FztFaVVjSaWJpA6gC0ZPxj+49iXkm34UFj4VcPYYX3br8HqYxDAIgCD +ITG07itKKOn6P8UWCaQm5QKBgQCmr+eHfNsrkUS770MPiuW5RD6JXc4xsOOpIzh9 +4xxb3fSkVoQcoye85uCg74oUVKjkIi2fjPHr/9nEToLdXf0WxzUYdKUsCXyA078j +G3VpgaeZYZ9PWfLj/18R0MeiRtZIoPVA+WQ18jx1tuhz5wlyYD8iHsT4qyZPrnQC +jzVDgQKBgDdhYgzZEHLaZsM+kVZasX39cL9pWKukukhYtsJ+O3DJaLfv3tS4+uDt +k6PbXh/HfIE8Np+urRGJ3DA3TxgDGxWe0rQVX10Om2n4eSgQH2o7TCP6BbzPXlby +EEanqVzcceGE+b2bViy63eWMQsm4bwiL7+zsSmPWrB72ZZ5vBZiq +-----END RSA PRIVATE KEY----- + diff --git a/lp/priv/gettext/en/LC_MESSAGES/errors.po b/lp/priv/gettext/en/LC_MESSAGES/errors.po new file mode 100644 index 0000000..a589998 --- /dev/null +++ b/lp/priv/gettext/en/LC_MESSAGES/errors.po @@ -0,0 +1,97 @@ +## `msgid`s in this file come from POT (.pot) files. +## +## Do not add, change, or remove `msgid`s manually here as +## they're tied to the ones in the corresponding POT file +## (with the same domain). +## +## Use `mix gettext.extract --merge` or `mix gettext.merge` +## to merge POT files into PO files. +msgid "" +msgstr "" +"Language: en\n" + +## From Ecto.Changeset.cast/4 +msgid "can't be blank" +msgstr "" + +## From Ecto.Changeset.unique_constraint/3 +msgid "has already been taken" +msgstr "" + +## From Ecto.Changeset.put_change/3 +msgid "is invalid" +msgstr "" + +## From Ecto.Changeset.validate_acceptance/3 +msgid "must be accepted" +msgstr "" + +## From Ecto.Changeset.validate_format/3 +msgid "has invalid format" +msgstr "" + +## From Ecto.Changeset.validate_subset/3 +msgid "has an invalid entry" +msgstr "" + +## From Ecto.Changeset.validate_exclusion/3 +msgid "is reserved" +msgstr "" + +## From Ecto.Changeset.validate_confirmation/3 +msgid "does not match confirmation" +msgstr "" + +## From Ecto.Changeset.no_assoc_constraint/3 +msgid "is still associated with this entry" +msgstr "" + +msgid "are still associated with this entry" +msgstr "" + +## From Ecto.Changeset.validate_length/3 +msgid "should be %{count} character(s)" +msgid_plural "should be %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should have %{count} item(s)" +msgid_plural "should have %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at least %{count} character(s)" +msgid_plural "should be at least %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should have at least %{count} item(s)" +msgid_plural "should have at least %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at most %{count} character(s)" +msgid_plural "should be at most %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should have at most %{count} item(s)" +msgid_plural "should have at most %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +## From Ecto.Changeset.validate_number/3 +msgid "must be less than %{number}" +msgstr "" + +msgid "must be greater than %{number}" +msgstr "" + +msgid "must be less than or equal to %{number}" +msgstr "" + +msgid "must be greater than or equal to %{number}" +msgstr "" + +msgid "must be equal to %{number}" +msgstr "" diff --git a/lp/priv/gettext/errors.pot b/lp/priv/gettext/errors.pot new file mode 100644 index 0000000..39a220b --- /dev/null +++ b/lp/priv/gettext/errors.pot @@ -0,0 +1,95 @@ +## This is a PO Template file. +## +## `msgid`s here are often extracted from source code. +## Add new translations manually only if they're dynamic +## translations that can't be statically extracted. +## +## Run `mix gettext.extract` to bring this file up to +## date. Leave `msgstr`s empty as changing them here has no +## effect: edit them in PO (`.po`) files instead. + +## From Ecto.Changeset.cast/4 +msgid "can't be blank" +msgstr "" + +## From Ecto.Changeset.unique_constraint/3 +msgid "has already been taken" +msgstr "" + +## From Ecto.Changeset.put_change/3 +msgid "is invalid" +msgstr "" + +## From Ecto.Changeset.validate_acceptance/3 +msgid "must be accepted" +msgstr "" + +## From Ecto.Changeset.validate_format/3 +msgid "has invalid format" +msgstr "" + +## From Ecto.Changeset.validate_subset/3 +msgid "has an invalid entry" +msgstr "" + +## From Ecto.Changeset.validate_exclusion/3 +msgid "is reserved" +msgstr "" + +## From Ecto.Changeset.validate_confirmation/3 +msgid "does not match confirmation" +msgstr "" + +## From Ecto.Changeset.no_assoc_constraint/3 +msgid "is still associated with this entry" +msgstr "" + +msgid "are still associated with this entry" +msgstr "" + +## From Ecto.Changeset.validate_length/3 +msgid "should be %{count} character(s)" +msgid_plural "should be %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should have %{count} item(s)" +msgid_plural "should have %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at least %{count} character(s)" +msgid_plural "should be at least %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should have at least %{count} item(s)" +msgid_plural "should have at least %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at most %{count} character(s)" +msgid_plural "should be at most %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should have at most %{count} item(s)" +msgid_plural "should have at most %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +## From Ecto.Changeset.validate_number/3 +msgid "must be less than %{number}" +msgstr "" + +msgid "must be greater than %{number}" +msgstr "" + +msgid "must be less than or equal to %{number}" +msgstr "" + +msgid "must be greater than or equal to %{number}" +msgstr "" + +msgid "must be equal to %{number}" +msgstr "" diff --git a/lp/priv/repo/migrations/.formatter.exs b/lp/priv/repo/migrations/.formatter.exs new file mode 100644 index 0000000..49f9151 --- /dev/null +++ b/lp/priv/repo/migrations/.formatter.exs @@ -0,0 +1,4 @@ +[ + import_deps: [:ecto_sql], + inputs: ["*.exs"] +] diff --git a/lp/priv/repo/seeds.exs b/lp/priv/repo/seeds.exs new file mode 100644 index 0000000..9fc4aa0 --- /dev/null +++ b/lp/priv/repo/seeds.exs @@ -0,0 +1,11 @@ +# Script for populating the database. You can run it as: +# +# mix run priv/repo/seeds.exs +# +# Inside the script, you can read and write to any of your +# repositories directly: +# +# Lp.Repo.insert!(%Lp.SomeSchema{}) +# +# We recommend using the bang functions (`insert!`, `update!` +# and so on) as they will fail if something goes wrong. diff --git a/lp/priv/static/css/app.css b/lp/priv/static/css/app.css new file mode 100644 index 0000000..b93e479 --- /dev/null +++ b/lp/priv/static/css/app.css @@ -0,0 +1,257 @@ +/* Includes some default style for the starter application. + * This can be safely deleted to start fresh. + */ + +/* Milligram v1.3.0 https://milligram.github.io + * Copyright (c) 2017 CJ Patoilo Licensed under the MIT license + */ + +*,*:after,*:before{box-sizing:inherit}html{box-sizing:border-box;font-size:62.5%}body{color:#000000;font-family:'Helvetica', 'Arial', sans-serif;font-size:1.6em;font-weight:300;line-height:1.6}blockquote{border-left:0.3rem solid #d1d1d1;margin-left:0;margin-right:0;padding:1rem 1.5rem}blockquote *:last-child{margin-bottom:0}.button,button,input[type='button'],input[type='reset'],input[type='submit']{background-color:#0069d9;border:0.1rem solid #0069d9;border-radius:.4rem;color:#fff;cursor:pointer;display:inline-block;font-size:1.1rem;font-weight:700;height:3.8rem;letter-spacing:.1rem;line-height:3.8rem;padding:0 3.0rem;text-align:center;text-decoration:none;text-transform:uppercase;white-space:nowrap}.button:focus,.button:hover,button:focus,button:hover,input[type='button']:focus,input[type='button']:hover,input[type='reset']:focus,input[type='reset']:hover,input[type='submit']:focus,input[type='submit']:hover{background-color:#606c76;border-color:#606c76;color:#fff;outline:0}.button[disabled],button[disabled],input[type='button'][disabled],input[type='reset'][disabled],input[type='submit'][disabled]{cursor:default;opacity:.5}.button[disabled]:focus,.button[disabled]:hover,button[disabled]:focus,button[disabled]:hover,input[type='button'][disabled]:focus,input[type='button'][disabled]:hover,input[type='reset'][disabled]:focus,input[type='reset'][disabled]:hover,input[type='submit'][disabled]:focus,input[type='submit'][disabled]:hover{background-color:#0069d9;border-color:#0069d9}.button.button-outline,button.button-outline,input[type='button'].button-outline,input[type='reset'].button-outline,input[type='submit'].button-outline{background-color:transparent;color:#0069d9}.button.button-outline:focus,.button.button-outline:hover,button.button-outline:focus,button.button-outline:hover,input[type='button'].button-outline:focus,input[type='button'].button-outline:hover,input[type='reset'].button-outline:focus,input[type='reset'].button-outline:hover,input[type='submit'].button-outline:focus,input[type='submit'].button-outline:hover{background-color:transparent;border-color:#606c76;color:#606c76}.button.button-outline[disabled]:focus,.button.button-outline[disabled]:hover,button.button-outline[disabled]:focus,button.button-outline[disabled]:hover,input[type='button'].button-outline[disabled]:focus,input[type='button'].button-outline[disabled]:hover,input[type='reset'].button-outline[disabled]:focus,input[type='reset'].button-outline[disabled]:hover,input[type='submit'].button-outline[disabled]:focus,input[type='submit'].button-outline[disabled]:hover{border-color:inherit;color:#0069d9}.button.button-clear,button.button-clear,input[type='button'].button-clear,input[type='reset'].button-clear,input[type='submit'].button-clear{background-color:transparent;border-color:transparent;color:#0069d9}.button.button-clear:focus,.button.button-clear:hover,button.button-clear:focus,button.button-clear:hover,input[type='button'].button-clear:focus,input[type='button'].button-clear:hover,input[type='reset'].button-clear:focus,input[type='reset'].button-clear:hover,input[type='submit'].button-clear:focus,input[type='submit'].button-clear:hover{background-color:transparent;border-color:transparent;color:#606c76}.button.button-clear[disabled]:focus,.button.button-clear[disabled]:hover,button.button-clear[disabled]:focus,button.button-clear[disabled]:hover,input[type='button'].button-clear[disabled]:focus,input[type='button'].button-clear[disabled]:hover,input[type='reset'].button-clear[disabled]:focus,input[type='reset'].button-clear[disabled]:hover,input[type='submit'].button-clear[disabled]:focus,input[type='submit'].button-clear[disabled]:hover{color:#0069d9}code{background:#f4f5f6;border-radius:.4rem;font-size:86%;margin:0 .2rem;padding:.2rem .5rem;white-space:nowrap}pre{background:#f4f5f6;border-left:0.3rem solid #0069d9;overflow-y:hidden}pre>code{border-radius:0;display:block;padding:1rem 1.5rem;white-space:pre}hr{border:0;border-top:0.1rem solid #f4f5f6;margin:3.0rem 0}input[type='email'],input[type='number'],input[type='password'],input[type='search'],input[type='tel'],input[type='text'],input[type='url'],textarea,select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;border:0.1rem solid #d1d1d1;border-radius:.4rem;box-shadow:none;box-sizing:inherit;height:3.8rem;padding:.6rem 1.0rem;width:100%}input[type='email']:focus,input[type='number']:focus,input[type='password']:focus,input[type='search']:focus,input[type='tel']:focus,input[type='text']:focus,input[type='url']:focus,textarea:focus,select:focus{border-color:#0069d9;outline:0}select{background:url('data:image/svg+xml;utf8,') center right no-repeat;padding-right:3.0rem}select:focus{background-image:url('data:image/svg+xml;utf8,')}textarea{min-height:6.5rem}label,legend{display:block;font-size:1.6rem;font-weight:700;margin-bottom:.5rem}fieldset{border-width:0;padding:0}input[type='checkbox'],input[type='radio']{display:inline}.label-inline{display:inline-block;font-weight:normal;margin-left:.5rem}.row{display:flex;flex-direction:column;padding:0;width:100%}.row.row-no-padding{padding:0}.row.row-no-padding>.column{padding:0}.row.row-wrap{flex-wrap:wrap}.row.row-top{align-items:flex-start}.row.row-bottom{align-items:flex-end}.row.row-center{align-items:center}.row.row-stretch{align-items:stretch}.row.row-baseline{align-items:baseline}.row .column{display:block;flex:1 1 auto;margin-left:0;max-width:100%;width:100%}.row .column.column-offset-10{margin-left:10%}.row .column.column-offset-20{margin-left:20%}.row .column.column-offset-25{margin-left:25%}.row .column.column-offset-33,.row .column.column-offset-34{margin-left:33.3333%}.row .column.column-offset-50{margin-left:50%}.row .column.column-offset-66,.row .column.column-offset-67{margin-left:66.6666%}.row .column.column-offset-75{margin-left:75%}.row .column.column-offset-80{margin-left:80%}.row .column.column-offset-90{margin-left:90%}.row .column.column-10{flex:0 0 10%;max-width:10%}.row .column.column-20{flex:0 0 20%;max-width:20%}.row .column.column-25{flex:0 0 25%;max-width:25%}.row .column.column-33,.row .column.column-34{flex:0 0 33.3333%;max-width:33.3333%}.row .column.column-40{flex:0 0 40%;max-width:40%}.row .column.column-50{flex:0 0 50%;max-width:50%}.row .column.column-60{flex:0 0 60%;max-width:60%}.row .column.column-66,.row .column.column-67{flex:0 0 66.6666%;max-width:66.6666%}.row .column.column-75{flex:0 0 75%;max-width:75%}.row .column.column-80{flex:0 0 80%;max-width:80%}.row .column.column-90{flex:0 0 90%;max-width:90%}.row .column .column-top{align-self:flex-start}.row .column .column-bottom{align-self:flex-end}.row .column .column-center{-ms-grid-row-align:center;align-self:center}@media (min-width: 40rem){.row{flex-direction:row;margin-left:-1.0rem;width:calc(100% + 2.0rem)}.row .column{margin-bottom:inherit;padding:0 1.0rem}}a{color:#0069d9;text-decoration:none}a:focus,a:hover{color:#606c76}dl,ol,ul{list-style:none;margin-top:0;padding-left:0}dl dl,dl ol,dl ul,ol dl,ol ol,ol ul,ul dl,ul ol,ul ul{font-size:90%;margin:1.5rem 0 1.5rem 3.0rem}ol{list-style:decimal inside}ul{list-style:circle inside}.button,button,dd,dt,li{margin-bottom:1.0rem}fieldset,input,select,textarea{margin-bottom:1.5rem}blockquote,dl,figure,form,ol,p,pre,table,ul{margin-bottom:2.5rem}table{border-spacing:0;width:100%}td,th{border-bottom:0.1rem solid #e1e1e1;padding:1.2rem 1.5rem;text-align:left}td:first-child,th:first-child{padding-left:0}td:last-child,th:last-child{padding-right:0}b,strong{font-weight:bold}p{margin-top:0}h1,h2,h3,h4,h5,h6{font-weight:300;letter-spacing:-.1rem;margin-bottom:2.0rem;margin-top:0}h1{font-size:4.6rem;line-height:1.2}h2{font-size:3.6rem;line-height:1.25}h3{font-size:2.8rem;line-height:1.3}h4{font-size:2.2rem;letter-spacing:-.08rem;line-height:1.35}h5{font-size:1.8rem;letter-spacing:-.05rem;line-height:1.5}h6{font-size:1.6rem;letter-spacing:0;line-height:1.4}img{max-width:100%}.clearfix:after{clear:both;content:' ';display:table}.float-left{float:left}.float-right{float:right} + +/* General style */ +h1{font-size: 3.6rem; line-height: 1.25} +h2{font-size: 2.8rem; line-height: 1.3} +h3{font-size: 2.2rem; letter-spacing: -.08rem; line-height: 1.35} +h4{font-size: 1.8rem; letter-spacing: -.05rem; line-height: 1.5} +h5{font-size: 1.6rem; letter-spacing: 0; line-height: 1.4} +h6{font-size: 1.4rem; letter-spacing: 0; line-height: 1.2} +pre{padding: 1em;} + +.container{ + margin: 0 auto; + max-width: 80.0rem; + padding: 0 2.0rem; + position: relative; + width: 100% +} +select { + width: auto; +} + +/* Phoenix promo and logo */ +.phx-hero { + text-align: center; + border-bottom: 1px solid #e3e3e3; + background: #eee; + border-radius: 6px; + padding: 3em 3em 1em; + margin-bottom: 3rem; + font-weight: 200; + font-size: 120%; +} +.phx-hero input { + background: #ffffff; +} +.phx-logo { + min-width: 300px; + margin: 1rem; + display: block; +} +.phx-logo img { + width: auto; + display: block; +} + +/* Headers */ +header { + width: 100%; + background: #fdfdfd; + border-bottom: 1px solid #eaeaea; + margin-bottom: 2rem; +} +header section { + align-items: center; + display: flex; + flex-direction: column; + justify-content: space-between; +} +header section :first-child { + order: 2; +} +header section :last-child { + order: 1; +} +header nav ul, +header nav li { + margin: 0; + padding: 0; + display: block; + text-align: right; + white-space: nowrap; +} +header nav ul { + margin: 1rem; + margin-top: 0; +} +header nav a { + display: block; +} + +@media (min-width: 40.0rem) { /* Small devices (landscape phones, 576px and up) */ + header section { + flex-direction: row; + } + header nav ul { + margin: 1rem; + } + .phx-logo { + flex-basis: 527px; + margin: 2rem 1rem; + } +} + +/* Make clicks pass-through */ +#nprogress { + pointer-events: none; +} + +#nprogress .bar { + background: #29d; + + position: fixed; + z-index: 1031; + top: 0; + left: 0; + + width: 100%; + height: 2px; +} + +/* 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; } + +.phx-modal { + opacity: 1 !important; + position: fixed; + z-index: 1; + left: 0; + top: 0; + width: 100%; + height: 100%; + overflow: auto; + background-color: black; + background-color: rgba(0, 0, 0, 0.4); } + +.phx-modal-content { + background-color: #fefefe; + margin: 15% auto; + padding: 20px; + border: 1px solid #888; + width: 80%; } + +.phx-modal-close { + color: #aaa; + float: right; + font-size: 28px; + font-weight: bold; } + +.phx-modal-close:hover, +.phx-modal-close:focus { + color: black; + text-decoration: none; + cursor: pointer; } + +/* Alerts and form errors */ +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; } + +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; } + +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; } + +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; } + +.alert p { + margin-bottom: 0; } + +.alert:empty { + display: none; } + +.invalid-feedback { + color: #a94442; + display: block; + margin: -1rem 0 2rem; } + diff --git a/lp/priv/static/favicon.ico b/lp/priv/static/favicon.ico new file mode 100644 index 0000000..73de524 Binary files /dev/null and b/lp/priv/static/favicon.ico differ diff --git a/lp/priv/static/images/phoenix.png b/lp/priv/static/images/phoenix.png new file mode 100644 index 0000000..9c81075 Binary files /dev/null and b/lp/priv/static/images/phoenix.png differ diff --git a/lp/priv/static/js/app.js b/lp/priv/static/js/app.js new file mode 100644 index 0000000..32ac13a --- /dev/null +++ b/lp/priv/static/js/app.js @@ -0,0 +1,169 @@ +/******/ (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 A;\n }), n.d(t, \"Serializer\", function () {\n return M;\n }), n.d(t, \"Socket\", function () {\n return J;\n }), n.d(t, \"LongPoll\", function () {\n return H;\n }), n.d(t, \"Ajax\", function () {\n return D;\n }), n.d(t, \"Presence\", function () {\n return B;\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 R = \"phx_close\",\n S = \"phx_error\",\n T = \"phx_join\",\n w = \"phx_reply\",\n E = \"phx_leave\",\n x = [R, S, T, w, E],\n O = \"longpoll\",\n P = \"websocket\",\n L = function (e) {\n if (\"function\" == typeof e) return e;\n return function () {\n return e;\n };\n },\n _ = 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 A = function () {\n function e(t, n, i) {\n var o = this;\n c(this, e), this.state = g, this.topic = t, this.params = L(n || {}), this.socket = i, this.bindings = [], this.bindingRef = 0, this.timeout = this.socket.timeout, this.joinedOnce = !1, this.joinPush = new _(this, T, this.params, this.timeout), this.pushBuffer = [], this.stateChangeRefs = [], this.rejoinTimer = new I(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 _(o, E, L({}), o.timeout).send(), o.state = k, o.joinPush.reset(), o.socket.isConnected() && o.rejoinTimer.scheduleTimeout();\n }), this.on(w, 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(R, e);\n }\n }, {\n key: \"onError\",\n value: function (e) {\n return this.on(S, 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 _(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(R, \"leave\");\n },\n i = new _(this, E, L({}), 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 x.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 M = {\n encode: function (e, t) {\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 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 },\n J = 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 || H, this.defaultEncoder = M.encode, this.defaultDecoder = M.decode, this.closeWasClean = !1, this.unloaded = !1, this.binaryType = i.binaryType || \"arraybuffer\", this.transport !== H ? (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 = L(i.params || {}), this.endPoint = \"\".concat(t, \"/\").concat(P), this.vsn = i.vsn || \"2.0.0\", this.heartbeatTimer = null, this.pendingHeartbeatRef = null, this.reconnectTimer = new I(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 = D.appendParams(D.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 = L(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(S);\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 A(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.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 H = 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(\"(.*)/\" + P), \"$1/\" + O);\n }\n }, {\n key: \"endpointURL\",\n value: function () {\n return D.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 || D.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 D.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 D = 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 D.states = {\n complete: 4\n };\n\n var B = 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 I = 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/YShlLHQpOnZvaWQgMH19ZnVuY3Rpb24gYShlLHQpeyhudWxsPT10fHx0PmUubGVuZ3RoKSYmKHQ9ZS5sZW5ndGgpO2Zvcih2YXIgbj0wLGk9bmV3IEFycmF5KHQpO248dDtuKyspaVtuXT1lW25dO3JldHVybiBpfWZ1bmN0aW9uIGMoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIHUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIGk9dFtuXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMSxpLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBpJiYoaS53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsaS5rZXksaSl9fWZ1bmN0aW9uIGgoZSx0LG4pe3JldHVybiB0JiZ1KGUucHJvdG90eXBlLHQpLG4mJnUoZSxuKSxlfW4ucih0KSxuLmQodCxcIkNoYW5uZWxcIiwoZnVuY3Rpb24oKXtyZXR1cm4gQX0pKSxuLmQodCxcIlNlcmlhbGl6ZXJcIiwoZnVuY3Rpb24oKXtyZXR1cm4gTX0pKSxuLmQodCxcIlNvY2tldFwiLChmdW5jdGlvbigpe3JldHVybiBKfSkpLG4uZCh0LFwiTG9uZ1BvbGxcIiwoZnVuY3Rpb24oKXtyZXR1cm4gSH0pKSxuLmQodCxcIkFqYXhcIiwoZnVuY3Rpb24oKXtyZXR1cm4gRH0pKSxuLmQodCxcIlByZXNlbmNlXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEJ9KSk7dmFyIGw9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjpudWxsLGY9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6bnVsbCxkPWx8fGZ8fHZvaWQgMCxwPTAsdj0xLHk9MixtPTMsZz1cImNsb3NlZFwiLGs9XCJlcnJvcmVkXCIsYj1cImpvaW5lZFwiLGo9XCJqb2luaW5nXCIsQz1cImxlYXZpbmdcIixSPVwicGh4X2Nsb3NlXCIsUz1cInBoeF9lcnJvclwiLFQ9XCJwaHhfam9pblwiLHc9XCJwaHhfcmVwbHlcIixFPVwicGh4X2xlYXZlXCIseD1bUixTLFQsdyxFXSxPPVwibG9uZ3BvbGxcIixQPVwid2Vic29ja2V0XCIsTD1mdW5jdGlvbihlKXtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBlKXJldHVybiBlO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlfX0sXz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuLGksbyl7Yyh0aGlzLGUpLHRoaXMuY2hhbm5lbD10LHRoaXMuZXZlbnQ9bix0aGlzLnBheWxvYWQ9aXx8ZnVuY3Rpb24oKXtyZXR1cm57fX0sdGhpcy5yZWNlaXZlZFJlc3A9bnVsbCx0aGlzLnRpbWVvdXQ9byx0aGlzLnRpbWVvdXRUaW1lcj1udWxsLHRoaXMucmVjSG9va3M9W10sdGhpcy5zZW50PSExfXJldHVybiBoKGUsW3trZXk6XCJyZXNlbmRcIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnRpbWVvdXQ9ZSx0aGlzLnJlc2V0KCksdGhpcy5zZW5kKCl9fSx7a2V5Olwic2VuZFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5oYXNSZWNlaXZlZChcInRpbWVvdXRcIil8fCh0aGlzLnN0YXJ0VGltZW91dCgpLHRoaXMuc2VudD0hMCx0aGlzLmNoYW5uZWwuc29ja2V0LnB1c2goe3RvcGljOnRoaXMuY2hhbm5lbC50b3BpYyxldmVudDp0aGlzLmV2ZW50LHBheWxvYWQ6dGhpcy5wYXlsb2FkKCkscmVmOnRoaXMucmVmLGpvaW5fcmVmOnRoaXMuY2hhbm5lbC5qb2luUmVmKCl9KSl9fSx7a2V5OlwicmVjZWl2ZVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuaGFzUmVjZWl2ZWQoZSkmJnQodGhpcy5yZWNlaXZlZFJlc3AucmVzcG9uc2UpLHRoaXMucmVjSG9va3MucHVzaCh7c3RhdHVzOmUsY2FsbGJhY2s6dH0pLHRoaXN9fSx7a2V5OlwicmVzZXRcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuY2FuY2VsUmVmRXZlbnQoKSx0aGlzLnJlZj1udWxsLHRoaXMucmVmRXZlbnQ9bnVsbCx0aGlzLnJlY2VpdmVkUmVzcD1udWxsLHRoaXMuc2VudD0hMX19LHtrZXk6XCJtYXRjaFJlY2VpdmVcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lLnN0YXR1cyxuPWUucmVzcG9uc2U7ZS5yZWY7dGhpcy5yZWNIb29rcy5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnN0YXR1cz09PXR9KSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2FsbGJhY2sobil9KSl9fSx7a2V5OlwiY2FuY2VsUmVmRXZlbnRcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMucmVmRXZlbnQmJnRoaXMuY2hhbm5lbC5vZmYodGhpcy5yZWZFdmVudCl9fSx7a2V5OlwiY2FuY2VsVGltZW91dFwiLHZhbHVlOmZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMudGltZW91dFRpbWVyKSx0aGlzLnRpbWVvdXRUaW1lcj1udWxsfX0se2tleTpcInN0YXJ0VGltZW91dFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLnRpbWVvdXRUaW1lciYmdGhpcy5jYW5jZWxUaW1lb3V0KCksdGhpcy5yZWY9dGhpcy5jaGFubmVsLnNvY2tldC5tYWtlUmVmKCksdGhpcy5yZWZFdmVudD10aGlzLmNoYW5uZWwucmVwbHlFdmVudE5hbWUodGhpcy5yZWYpLHRoaXMuY2hhbm5lbC5vbih0aGlzLnJlZkV2ZW50LChmdW5jdGlvbih0KXtlLmNhbmNlbFJlZkV2ZW50KCksZS5jYW5jZWxUaW1lb3V0KCksZS5yZWNlaXZlZFJlc3A9dCxlLm1hdGNoUmVjZWl2ZSh0KX0pKSx0aGlzLnRpbWVvdXRUaW1lcj1zZXRUaW1lb3V0KChmdW5jdGlvbigpe2UudHJpZ2dlcihcInRpbWVvdXRcIix7fSl9KSx0aGlzLnRpbWVvdXQpfX0se2tleTpcImhhc1JlY2VpdmVkXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVjZWl2ZWRSZXNwJiZ0aGlzLnJlY2VpdmVkUmVzcC5zdGF0dXM9PT1lfX0se2tleTpcInRyaWdnZXJcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3RoaXMuY2hhbm5lbC50cmlnZ2VyKHRoaXMucmVmRXZlbnQse3N0YXR1czplLHJlc3BvbnNlOnR9KX19XSksZX0oKSxBPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0LG4saSl7dmFyIG89dGhpcztjKHRoaXMsZSksdGhpcy5zdGF0ZT1nLHRoaXMudG9waWM9dCx0aGlzLnBhcmFtcz1MKG58fHt9KSx0aGlzLnNvY2tldD1pLHRoaXMuYmluZGluZ3M9W10sdGhpcy5iaW5kaW5nUmVmPTAsdGhpcy50aW1lb3V0PXRoaXMuc29ja2V0LnRpbWVvdXQsdGhpcy5qb2luZWRPbmNlPSExLHRoaXMuam9pblB1c2g9bmV3IF8odGhpcyxULHRoaXMucGFyYW1zLHRoaXMudGltZW91dCksdGhpcy5wdXNoQnVmZmVyPVtdLHRoaXMuc3RhdGVDaGFuZ2VSZWZzPVtdLHRoaXMucmVqb2luVGltZXI9bmV3IEkoKGZ1bmN0aW9uKCl7by5zb2NrZXQuaXNDb25uZWN0ZWQoKSYmby5yZWpvaW4oKX0pLHRoaXMuc29ja2V0LnJlam9pbkFmdGVyTXMpLHRoaXMuc3RhdGVDaGFuZ2VSZWZzLnB1c2godGhpcy5zb2NrZXQub25FcnJvcigoZnVuY3Rpb24oKXtyZXR1cm4gby5yZWpvaW5UaW1lci5yZXNldCgpfSkpKSx0aGlzLnN0YXRlQ2hhbmdlUmVmcy5wdXNoKHRoaXMuc29ja2V0Lm9uT3BlbigoZnVuY3Rpb24oKXtvLnJlam9pblRpbWVyLnJlc2V0KCksby5pc0Vycm9yZWQoKSYmby5yZWpvaW4oKX0pKSksdGhpcy5qb2luUHVzaC5yZWNlaXZlKFwib2tcIiwoZnVuY3Rpb24oKXtvLnN0YXRlPWIsby5yZWpvaW5UaW1lci5yZXNldCgpLG8ucHVzaEJ1ZmZlci5mb3JFYWNoKChmdW5jdGlvbihlKXtyZXR1cm4gZS5zZW5kKCl9KSksby5wdXNoQnVmZmVyPVtdfSkpLHRoaXMuam9pblB1c2gucmVjZWl2ZShcImVycm9yXCIsKGZ1bmN0aW9uKCl7by5zdGF0ZT1rLG8uc29ja2V0LmlzQ29ubmVjdGVkKCkmJm8ucmVqb2luVGltZXIuc2NoZWR1bGVUaW1lb3V0KCl9KSksdGhpcy5vbkNsb3NlKChmdW5jdGlvbigpe28ucmVqb2luVGltZXIucmVzZXQoKSxvLnNvY2tldC5oYXNMb2dnZXIoKSYmby5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLFwiY2xvc2UgXCIuY29uY2F0KG8udG9waWMsXCIgXCIpLmNvbmNhdChvLmpvaW5SZWYoKSkpLG8uc3RhdGU9ZyxvLnNvY2tldC5yZW1vdmUobyl9KSksdGhpcy5vbkVycm9yKChmdW5jdGlvbihlKXtvLnNvY2tldC5oYXNMb2dnZXIoKSYmby5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLFwiZXJyb3IgXCIuY29uY2F0KG8udG9waWMpLGUpLG8uaXNKb2luaW5nKCkmJm8uam9pblB1c2gucmVzZXQoKSxvLnN0YXRlPWssby5zb2NrZXQuaXNDb25uZWN0ZWQoKSYmby5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKX0pKSx0aGlzLmpvaW5QdXNoLnJlY2VpdmUoXCJ0aW1lb3V0XCIsKGZ1bmN0aW9uKCl7by5zb2NrZXQuaGFzTG9nZ2VyKCkmJm8uc29ja2V0LmxvZyhcImNoYW5uZWxcIixcInRpbWVvdXQgXCIuY29uY2F0KG8udG9waWMsXCIgKFwiKS5jb25jYXQoby5qb2luUmVmKCksXCIpXCIpLG8uam9pblB1c2gudGltZW91dCksbmV3IF8obyxFLEwoe30pLG8udGltZW91dCkuc2VuZCgpLG8uc3RhdGU9ayxvLmpvaW5QdXNoLnJlc2V0KCksby5zb2NrZXQuaXNDb25uZWN0ZWQoKSYmby5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKX0pKSx0aGlzLm9uKHcsKGZ1bmN0aW9uKGUsdCl7by50cmlnZ2VyKG8ucmVwbHlFdmVudE5hbWUodCksZSl9KSl9cmV0dXJuIGgoZSxbe2tleTpcImpvaW5cIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp0aGlzLnRpbWVvdXQ7aWYodGhpcy5qb2luZWRPbmNlKXRocm93IG5ldyBFcnJvcihcInRyaWVkIHRvIGpvaW4gbXVsdGlwbGUgdGltZXMuICdqb2luJyBjYW4gb25seSBiZSBjYWxsZWQgYSBzaW5nbGUgdGltZSBwZXIgY2hhbm5lbCBpbnN0YW5jZVwiKTtyZXR1cm4gdGhpcy50aW1lb3V0PWUsdGhpcy5qb2luZWRPbmNlPSEwLHRoaXMucmVqb2luKCksdGhpcy5qb2luUHVzaH19LHtrZXk6XCJvbkNsb3NlXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vbihSLGUpfX0se2tleTpcIm9uRXJyb3JcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vbihTLChmdW5jdGlvbih0KXtyZXR1cm4gZSh0KX0pKX19LHtrZXk6XCJvblwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5iaW5kaW5nUmVmKys7cmV0dXJuIHRoaXMuYmluZGluZ3MucHVzaCh7ZXZlbnQ6ZSxyZWY6bixjYWxsYmFjazp0fSksbn19LHtrZXk6XCJvZmZcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3RoaXMuYmluZGluZ3M9dGhpcy5iaW5kaW5ncy5maWx0ZXIoKGZ1bmN0aW9uKG4pe3JldHVybiEobi5ldmVudD09PWUmJih2b2lkIDA9PT10fHx0PT09bi5yZWYpKX0pKX19LHtrZXk6XCJjYW5QdXNoXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKSYmdGhpcy5pc0pvaW5lZCgpfX0se2tleTpcInB1c2hcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp0aGlzLnRpbWVvdXQ7aWYoIXRoaXMuam9pbmVkT25jZSl0aHJvdyBuZXcgRXJyb3IoXCJ0cmllZCB0byBwdXNoICdcIi5jb25jYXQoZSxcIicgdG8gJ1wiKS5jb25jYXQodGhpcy50b3BpYyxcIicgYmVmb3JlIGpvaW5pbmcuIFVzZSBjaGFubmVsLmpvaW4oKSBiZWZvcmUgcHVzaGluZyBldmVudHNcIikpO3ZhciBpPW5ldyBfKHRoaXMsZSwoZnVuY3Rpb24oKXtyZXR1cm4gdH0pLG4pO3JldHVybiB0aGlzLmNhblB1c2goKT9pLnNlbmQoKTooaS5zdGFydFRpbWVvdXQoKSx0aGlzLnB1c2hCdWZmZXIucHVzaChpKSksaX19LHtrZXk6XCJsZWF2ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp0aGlzLnRpbWVvdXQ7dGhpcy5yZWpvaW5UaW1lci5yZXNldCgpLHRoaXMuam9pblB1c2guY2FuY2VsVGltZW91dCgpLHRoaXMuc3RhdGU9Qzt2YXIgbj1mdW5jdGlvbigpe2Uuc29ja2V0Lmhhc0xvZ2dlcigpJiZlLnNvY2tldC5sb2coXCJjaGFubmVsXCIsXCJsZWF2ZSBcIi5jb25jYXQoZS50b3BpYykpLGUudHJpZ2dlcihSLFwibGVhdmVcIil9LGk9bmV3IF8odGhpcyxFLEwoe30pLHQpO3JldHVybiBpLnJlY2VpdmUoXCJva1wiLChmdW5jdGlvbigpe3JldHVybiBuKCl9KSkucmVjZWl2ZShcInRpbWVvdXRcIiwoZnVuY3Rpb24oKXtyZXR1cm4gbigpfSkpLGkuc2VuZCgpLHRoaXMuY2FuUHVzaCgpfHxpLnRyaWdnZXIoXCJva1wiLHt9KSxpfX0se2tleTpcIm9uTWVzc2FnZVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdH19LHtrZXk6XCJpc0xpZmVjeWNsZUV2ZW50XCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHguaW5kZXhPZihlKT49MH19LHtrZXk6XCJpc01lbWJlclwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLGkpe3JldHVybiB0aGlzLnRvcGljPT09ZSYmKCFpfHxpPT09dGhpcy5qb2luUmVmKCl8fCF0aGlzLmlzTGlmZWN5Y2xlRXZlbnQodCl8fCh0aGlzLnNvY2tldC5oYXNMb2dnZXIoKSYmdGhpcy5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLFwiZHJvcHBpbmcgb3V0ZGF0ZWQgbWVzc2FnZVwiLHt0b3BpYzplLGV2ZW50OnQscGF5bG9hZDpuLGpvaW5SZWY6aX0pLCExKSl9fSx7a2V5Olwiam9pblJlZlwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuam9pblB1c2gucmVmfX0se2tleTpcInJlam9pblwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnRoaXMudGltZW91dDt0aGlzLmlzTGVhdmluZygpfHwodGhpcy5zb2NrZXQubGVhdmVPcGVuVG9waWModGhpcy50b3BpYyksdGhpcy5zdGF0ZT1qLHRoaXMuam9pblB1c2gucmVzZW5kKGUpKX19LHtrZXk6XCJ0cmlnZ2VyXCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4saSl7dmFyIG89dGhpcy5vbk1lc3NhZ2UoZSx0LG4saSk7aWYodCYmIW8pdGhyb3cgbmV3IEVycm9yKFwiY2hhbm5lbCBvbk1lc3NhZ2UgY2FsbGJhY2tzIG11c3QgcmV0dXJuIHRoZSBwYXlsb2FkLCBtb2RpZmllZCBvciB1bm1vZGlmaWVkXCIpO2Zvcih2YXIgcj10aGlzLmJpbmRpbmdzLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQuZXZlbnQ9PT1lfSkpLHM9MDtzPHIubGVuZ3RoO3MrKyl7cltzXS5jYWxsYmFjayhvLG4saXx8dGhpcy5qb2luUmVmKCkpfX19LHtrZXk6XCJyZXBseUV2ZW50TmFtZVwiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVyblwiY2hhbl9yZXBseV9cIi5jb25jYXQoZSl9fSx7a2V5OlwiaXNDbG9zZWRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlPT09Z319LHtrZXk6XCJpc0Vycm9yZWRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlPT09a319LHtrZXk6XCJpc0pvaW5lZFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGU9PT1ifX0se2tleTpcImlzSm9pbmluZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGU9PT1qfX0se2tleTpcImlzTGVhdmluZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGU9PT1DfX1dKSxlfSgpLE09e2VuY29kZTpmdW5jdGlvbihlLHQpe3ZhciBuPVtlLmpvaW5fcmVmLGUucmVmLGUudG9waWMsZS5ldmVudCxlLnBheWxvYWRdO3JldHVybiB0KEpTT04uc3RyaW5naWZ5KG4pKX0sZGVjb2RlOmZ1bmN0aW9uKGUsdCl7dmFyIG49cihKU09OLnBhcnNlKGUpLDUpO3JldHVybiB0KHtqb2luX3JlZjpuWzBdLHJlZjpuWzFdLHRvcGljOm5bMl0sZXZlbnQ6blszXSxwYXlsb2FkOm5bNF19KX19LEo9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe3ZhciBuPXRoaXMsaT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307Yyh0aGlzLGUpLHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3M9e29wZW46W10sY2xvc2U6W10sZXJyb3I6W10sbWVzc2FnZTpbXX0sdGhpcy5jaGFubmVscz1bXSx0aGlzLnNlbmRCdWZmZXI9W10sdGhpcy5yZWY9MCx0aGlzLnRpbWVvdXQ9aS50aW1lb3V0fHwxZTQsdGhpcy50cmFuc3BvcnQ9aS50cmFuc3BvcnR8fGQuV2ViU29ja2V0fHxILHRoaXMuZGVmYXVsdEVuY29kZXI9TS5lbmNvZGUsdGhpcy5kZWZhdWx0RGVjb2Rlcj1NLmRlY29kZSx0aGlzLmNsb3NlV2FzQ2xlYW49ITEsdGhpcy51bmxvYWRlZD0hMSx0aGlzLmJpbmFyeVR5cGU9aS5iaW5hcnlUeXBlfHxcImFycmF5YnVmZmVyXCIsdGhpcy50cmFuc3BvcnQhPT1IPyh0aGlzLmVuY29kZT1pLmVuY29kZXx8dGhpcy5kZWZhdWx0RW5jb2Rlcix0aGlzLmRlY29kZT1pLmRlY29kZXx8dGhpcy5kZWZhdWx0RGVjb2Rlcik6KHRoaXMuZW5jb2RlPXRoaXMuZGVmYXVsdEVuY29kZXIsdGhpcy5kZWNvZGU9dGhpcy5kZWZhdWx0RGVjb2RlciksZiYmZi5hZGRFdmVudExpc3RlbmVyJiZmLmFkZEV2ZW50TGlzdGVuZXIoXCJ1bmxvYWRcIiwoZnVuY3Rpb24oZSl7bi5jb25uJiYobi51bmxvYWRlZD0hMCxuLmFibm9ybWFsQ2xvc2UoXCJ1bmxvYWRlZFwiKSl9KSksdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zPWkuaGVhcnRiZWF0SW50ZXJ2YWxNc3x8M2U0LHRoaXMucmVqb2luQWZ0ZXJNcz1mdW5jdGlvbihlKXtyZXR1cm4gaS5yZWpvaW5BZnRlck1zP2kucmVqb2luQWZ0ZXJNcyhlKTpbMWUzLDJlMyw1ZTNdW2UtMV18fDFlNH0sdGhpcy5yZWNvbm5lY3RBZnRlck1zPWZ1bmN0aW9uKGUpe3JldHVybiBuLnVubG9hZGVkPzEwMDppLnJlY29ubmVjdEFmdGVyTXM/aS5yZWNvbm5lY3RBZnRlck1zKGUpOlsxMCw1MCwxMDAsMTUwLDIwMCwyNTAsNTAwLDFlMywyZTNdW2UtMV18fDVlM30sdGhpcy5sb2dnZXI9aS5sb2dnZXJ8fG51bGwsdGhpcy5sb25ncG9sbGVyVGltZW91dD1pLmxvbmdwb2xsZXJUaW1lb3V0fHwyZTQsdGhpcy5wYXJhbXM9TChpLnBhcmFtc3x8e30pLHRoaXMuZW5kUG9pbnQ9XCJcIi5jb25jYXQodCxcIi9cIikuY29uY2F0KFApLHRoaXMudnNuPWkudnNufHxcIjIuMC4wXCIsdGhpcy5oZWFydGJlYXRUaW1lcj1udWxsLHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZj1udWxsLHRoaXMucmVjb25uZWN0VGltZXI9bmV3IEkoKGZ1bmN0aW9uKCl7bi50ZWFyZG93bigoZnVuY3Rpb24oKXtyZXR1cm4gbi5jb25uZWN0KCl9KSl9KSx0aGlzLnJlY29ubmVjdEFmdGVyTXMpfXJldHVybiBoKGUsW3trZXk6XCJwcm90b2NvbFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGxvY2F0aW9uLnByb3RvY29sLm1hdGNoKC9eaHR0cHMvKT9cIndzc1wiOlwid3NcIn19LHtrZXk6XCJlbmRQb2ludFVSTFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9RC5hcHBlbmRQYXJhbXMoRC5hcHBlbmRQYXJhbXModGhpcy5lbmRQb2ludCx0aGlzLnBhcmFtcygpKSx7dnNuOnRoaXMudnNufSk7cmV0dXJuXCIvXCIhPT1lLmNoYXJBdCgwKT9lOlwiL1wiPT09ZS5jaGFyQXQoMSk/XCJcIi5jb25jYXQodGhpcy5wcm90b2NvbCgpLFwiOlwiKS5jb25jYXQoZSk6XCJcIi5jb25jYXQodGhpcy5wcm90b2NvbCgpLFwiOi8vXCIpLmNvbmNhdChsb2NhdGlvbi5ob3N0KS5jb25jYXQoZSl9fSx7a2V5OlwiZGlzY29ubmVjdFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt0aGlzLmNsb3NlV2FzQ2xlYW49ITAsdGhpcy5yZWNvbm5lY3RUaW1lci5yZXNldCgpLHRoaXMudGVhcmRvd24oZSx0LG4pfX0se2tleTpcImNvbm5lY3RcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2UmJihjb25zb2xlJiZjb25zb2xlLmxvZyhcInBhc3NpbmcgcGFyYW1zIHRvIGNvbm5lY3QgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCBwYXNzIDpwYXJhbXMgdG8gdGhlIFNvY2tldCBjb25zdHJ1Y3RvclwiKSx0aGlzLnBhcmFtcz1MKGUpKSx0aGlzLmNvbm58fCh0aGlzLmNsb3NlV2FzQ2xlYW49ITEsdGhpcy5jb25uPW5ldyB0aGlzLnRyYW5zcG9ydCh0aGlzLmVuZFBvaW50VVJMKCkpLHRoaXMuY29ubi5iaW5hcnlUeXBlPXRoaXMuYmluYXJ5VHlwZSx0aGlzLmNvbm4udGltZW91dD10aGlzLmxvbmdwb2xsZXJUaW1lb3V0LHRoaXMuY29ubi5vbm9wZW49ZnVuY3Rpb24oKXtyZXR1cm4gdC5vbkNvbm5PcGVuKCl9LHRoaXMuY29ubi5vbmVycm9yPWZ1bmN0aW9uKGUpe3JldHVybiB0Lm9uQ29ubkVycm9yKGUpfSx0aGlzLmNvbm4ub25tZXNzYWdlPWZ1bmN0aW9uKGUpe3JldHVybiB0Lm9uQ29ubk1lc3NhZ2UoZSl9LHRoaXMuY29ubi5vbmNsb3NlPWZ1bmN0aW9uKGUpe3JldHVybiB0Lm9uQ29ubkNsb3NlKGUpfSl9fSx7a2V5OlwibG9nXCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3RoaXMubG9nZ2VyKGUsdCxuKX19LHtrZXk6XCJoYXNMb2dnZXJcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBudWxsIT09dGhpcy5sb2dnZXJ9fSx7a2V5Olwib25PcGVuXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5tYWtlUmVmKCk7cmV0dXJuIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3Mub3Blbi5wdXNoKFt0LGVdKSx0fX0se2tleTpcIm9uQ2xvc2VcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLm1ha2VSZWYoKTtyZXR1cm4gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5jbG9zZS5wdXNoKFt0LGVdKSx0fX0se2tleTpcIm9uRXJyb3JcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLm1ha2VSZWYoKTtyZXR1cm4gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5lcnJvci5wdXNoKFt0LGVdKSx0fX0se2tleTpcIm9uTWVzc2FnZVwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubWFrZVJlZigpO3JldHVybiB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm1lc3NhZ2UucHVzaChbdCxlXSksdH19LHtrZXk6XCJvbkNvbm5PcGVuXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmhhc0xvZ2dlcigpJiZ0aGlzLmxvZyhcInRyYW5zcG9ydFwiLFwiY29ubmVjdGVkIHRvIFwiLmNvbmNhdCh0aGlzLmVuZFBvaW50VVJMKCkpKSx0aGlzLnVubG9hZGVkPSExLHRoaXMuY2xvc2VXYXNDbGVhbj0hMSx0aGlzLmZsdXNoU2VuZEJ1ZmZlcigpLHRoaXMucmVjb25uZWN0VGltZXIucmVzZXQoKSx0aGlzLnJlc2V0SGVhcnRiZWF0KCksdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5vcGVuLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JldHVybigwLHIoZSwyKVsxXSkoKX0pKX19LHtrZXk6XCJyZXNldEhlYXJ0YmVhdFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLmNvbm4mJnRoaXMuY29ubi5za2lwSGVhcnRiZWF0fHwodGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmPW51bGwsY2xlYXJJbnRlcnZhbCh0aGlzLmhlYXJ0YmVhdFRpbWVyKSx0aGlzLmhlYXJ0YmVhdFRpbWVyPXNldEludGVydmFsKChmdW5jdGlvbigpe3JldHVybiBlLnNlbmRIZWFydGJlYXQoKX0pLHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcykpfX0se2tleTpcInRlYXJkb3duXCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXM7aWYoIXRoaXMuY29ubilyZXR1cm4gZSYmZSgpO3RoaXMud2FpdEZvckJ1ZmZlckRvbmUoKGZ1bmN0aW9uKCl7aS5jb25uJiYodD9pLmNvbm4uY2xvc2UodCxufHxcIlwiKTppLmNvbm4uY2xvc2UoKSksaS53YWl0Rm9yU29ja2V0Q2xvc2VkKChmdW5jdGlvbigpe2kuY29ubiYmKGkuY29ubi5vbmNsb3NlPWZ1bmN0aW9uKCl7fSxpLmNvbm49bnVsbCksZSYmZSgpfSkpfSkpfX0se2tleTpcIndhaXRGb3JCdWZmZXJEb25lXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToxOzUhPT1uJiZ0aGlzLmNvbm4mJnRoaXMuY29ubi5idWZmZXJlZEFtb3VudD9zZXRUaW1lb3V0KChmdW5jdGlvbigpe3Qud2FpdEZvckJ1ZmZlckRvbmUoZSxuKzEpfSksMTUwKm4pOmUoKX19LHtrZXk6XCJ3YWl0Rm9yU29ja2V0Q2xvc2VkXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToxOzUhPT1uJiZ0aGlzLmNvbm4mJnRoaXMuY29ubi5yZWFkeVN0YXRlIT09bT9zZXRUaW1lb3V0KChmdW5jdGlvbigpe3Qud2FpdEZvclNvY2tldENsb3NlZChlLG4rMSl9KSwxNTAqbik6ZSgpfX0se2tleTpcIm9uQ29ubkNsb3NlXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5oYXNMb2dnZXIoKSYmdGhpcy5sb2coXCJ0cmFuc3BvcnRcIixcImNsb3NlXCIsZSksdGhpcy50cmlnZ2VyQ2hhbkVycm9yKCksY2xlYXJJbnRlcnZhbCh0aGlzLmhlYXJ0YmVhdFRpbWVyKSx0aGlzLmNsb3NlV2FzQ2xlYW58fHRoaXMucmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCksdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5jbG9zZS5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4oMCxyKHQsMilbMV0pKGUpfSkpfX0se2tleTpcIm9uQ29ubkVycm9yXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5oYXNMb2dnZXIoKSYmdGhpcy5sb2coXCJ0cmFuc3BvcnRcIixlKSx0aGlzLnRyaWdnZXJDaGFuRXJyb3IoKSx0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLmVycm9yLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybigwLHIodCwyKVsxXSkoZSl9KSl9fSx7a2V5OlwidHJpZ2dlckNoYW5FcnJvclwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5jaGFubmVscy5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmlzRXJyb3JlZCgpfHxlLmlzTGVhdmluZygpfHxlLmlzQ2xvc2VkKCl8fGUudHJpZ2dlcihTKX0pKX19LHtrZXk6XCJjb25uZWN0aW9uU3RhdGVcIix2YWx1ZTpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLmNvbm4mJnRoaXMuY29ubi5yZWFkeVN0YXRlKXtjYXNlIHA6cmV0dXJuXCJjb25uZWN0aW5nXCI7Y2FzZSB2OnJldHVyblwib3BlblwiO2Nhc2UgeTpyZXR1cm5cImNsb3NpbmdcIjtkZWZhdWx0OnJldHVyblwiY2xvc2VkXCJ9fX0se2tleTpcImlzQ29ubmVjdGVkXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5cIm9wZW5cIj09PXRoaXMuY29ubmVjdGlvblN0YXRlKCl9fSx7a2V5OlwicmVtb3ZlXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vZmYoZS5zdGF0ZUNoYW5nZVJlZnMpLHRoaXMuY2hhbm5lbHM9dGhpcy5jaGFubmVscy5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmpvaW5SZWYoKSE9PWUuam9pblJlZigpfSkpfX0se2tleTpcIm9mZlwiLHZhbHVlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzKXRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3NbdF09dGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrc1t0XS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3ZhciBuPXIodCwxKVswXTtyZXR1cm4tMT09PWUuaW5kZXhPZihuKX0pKX19LHtrZXk6XCJjaGFubmVsXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LG49bmV3IEEoZSx0LHRoaXMpO3JldHVybiB0aGlzLmNoYW5uZWxzLnB1c2gobiksbn19LHtrZXk6XCJwdXNoXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZih0aGlzLmhhc0xvZ2dlcigpKXt2YXIgbj1lLnRvcGljLGk9ZS5ldmVudCxvPWUucGF5bG9hZCxyPWUucmVmLHM9ZS5qb2luX3JlZjt0aGlzLmxvZyhcInB1c2hcIixcIlwiLmNvbmNhdChuLFwiIFwiKS5jb25jYXQoaSxcIiAoXCIpLmNvbmNhdChzLFwiLCBcIikuY29uY2F0KHIsXCIpXCIpLG8pfXRoaXMuaXNDb25uZWN0ZWQoKT90aGlzLmVuY29kZShlLChmdW5jdGlvbihlKXtyZXR1cm4gdC5jb25uLnNlbmQoZSl9KSk6dGhpcy5zZW5kQnVmZmVyLnB1c2goKGZ1bmN0aW9uKCl7cmV0dXJuIHQuZW5jb2RlKGUsKGZ1bmN0aW9uKGUpe3JldHVybiB0LmNvbm4uc2VuZChlKX0pKX0pKX19LHtrZXk6XCJtYWtlUmVmXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJlZisxO3JldHVybiBlPT09dGhpcy5yZWY/dGhpcy5yZWY9MDp0aGlzLnJlZj1lLHRoaXMucmVmLnRvU3RyaW5nKCl9fSx7a2V5Olwic2VuZEhlYXJ0YmVhdFwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0Nvbm5lY3RlZCgpKXtpZih0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYpcmV0dXJuIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZj1udWxsLHRoaXMuaGFzTG9nZ2VyKCkmJnRoaXMubG9nKFwidHJhbnNwb3J0XCIsXCJoZWFydGJlYXQgdGltZW91dC4gQXR0ZW1wdGluZyB0byByZS1lc3RhYmxpc2ggY29ubmVjdGlvblwiKSx2b2lkIHRoaXMuYWJub3JtYWxDbG9zZShcImhlYXJ0YmVhdCB0aW1lb3V0XCIpO3RoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZj10aGlzLm1ha2VSZWYoKSx0aGlzLnB1c2goe3RvcGljOlwicGhvZW5peFwiLGV2ZW50OlwiaGVhcnRiZWF0XCIscGF5bG9hZDp7fSxyZWY6dGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmfSl9fX0se2tleTpcImFibm9ybWFsQ2xvc2VcIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLmNsb3NlV2FzQ2xlYW49ITEsdGhpcy5jb25uLmNsb3NlKDFlMyxlKX19LHtrZXk6XCJmbHVzaFNlbmRCdWZmZXJcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuaXNDb25uZWN0ZWQoKSYmdGhpcy5zZW5kQnVmZmVyLmxlbmd0aD4wJiYodGhpcy5zZW5kQnVmZmVyLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JldHVybiBlKCl9KSksdGhpcy5zZW5kQnVmZmVyPVtdKX19LHtrZXk6XCJvbkNvbm5NZXNzYWdlXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLmRlY29kZShlLmRhdGEsKGZ1bmN0aW9uKGUpe3ZhciBuPWUudG9waWMsaT1lLmV2ZW50LG89ZS5wYXlsb2FkLHM9ZS5yZWYsYT1lLmpvaW5fcmVmO3MmJnM9PT10LnBlbmRpbmdIZWFydGJlYXRSZWYmJih0LnBlbmRpbmdIZWFydGJlYXRSZWY9bnVsbCksdC5oYXNMb2dnZXIoKSYmdC5sb2coXCJyZWNlaXZlXCIsXCJcIi5jb25jYXQoby5zdGF0dXN8fFwiXCIsXCIgXCIpLmNvbmNhdChuLFwiIFwiKS5jb25jYXQoaSxcIiBcIikuY29uY2F0KHMmJlwiKFwiK3MrXCIpXCJ8fFwiXCIpLG8pO2Zvcih2YXIgYz0wO2M8dC5jaGFubmVscy5sZW5ndGg7YysrKXt2YXIgdT10LmNoYW5uZWxzW2NdO3UuaXNNZW1iZXIobixpLG8sYSkmJnUudHJpZ2dlcihpLG8scyxhKX1mb3IodmFyIGg9MDtoPHQuc3RhdGVDaGFuZ2VDYWxsYmFja3MubWVzc2FnZS5sZW5ndGg7aCsrKXsoMCxyKHQuc3RhdGVDaGFuZ2VDYWxsYmFja3MubWVzc2FnZVtoXSwyKVsxXSkoZSl9fSkpfX0se2tleTpcImxlYXZlT3BlblRvcGljXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jaGFubmVscy5maW5kKChmdW5jdGlvbih0KXtyZXR1cm4gdC50b3BpYz09PWUmJih0LmlzSm9pbmVkKCl8fHQuaXNKb2luaW5nKCkpfSkpO3QmJih0aGlzLmhhc0xvZ2dlcigpJiZ0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCdsZWF2aW5nIGR1cGxpY2F0ZSB0b3BpYyBcIicuY29uY2F0KGUsJ1wiJykpLHQubGVhdmUoKSl9fV0pLGV9KCksSD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7Yyh0aGlzLGUpLHRoaXMuZW5kUG9pbnQ9bnVsbCx0aGlzLnRva2VuPW51bGwsdGhpcy5za2lwSGVhcnRiZWF0PSEwLHRoaXMub25vcGVuPWZ1bmN0aW9uKCl7fSx0aGlzLm9uZXJyb3I9ZnVuY3Rpb24oKXt9LHRoaXMub25tZXNzYWdlPWZ1bmN0aW9uKCl7fSx0aGlzLm9uY2xvc2U9ZnVuY3Rpb24oKXt9LHRoaXMucG9sbEVuZHBvaW50PXRoaXMubm9ybWFsaXplRW5kcG9pbnQodCksdGhpcy5yZWFkeVN0YXRlPXAsdGhpcy5wb2xsKCl9cmV0dXJuIGgoZSxbe2tleTpcIm5vcm1hbGl6ZUVuZHBvaW50XCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShcIndzOi8vXCIsXCJodHRwOi8vXCIpLnJlcGxhY2UoXCJ3c3M6Ly9cIixcImh0dHBzOi8vXCIpLnJlcGxhY2UobmV3IFJlZ0V4cChcIiguKikvXCIrUCksXCIkMS9cIitPKX19LHtrZXk6XCJlbmRwb2ludFVSTFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIEQuYXBwZW5kUGFyYW1zKHRoaXMucG9sbEVuZHBvaW50LHt0b2tlbjp0aGlzLnRva2VufSl9fSx7a2V5OlwiY2xvc2VBbmRSZXRyeVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5jbG9zZSgpLHRoaXMucmVhZHlTdGF0ZT1wfX0se2tleTpcIm9udGltZW91dFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5vbmVycm9yKFwidGltZW91dFwiKSx0aGlzLmNsb3NlQW5kUmV0cnkoKX19LHtrZXk6XCJwb2xsXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMucmVhZHlTdGF0ZSE9PXYmJnRoaXMucmVhZHlTdGF0ZSE9PXB8fEQucmVxdWVzdChcIkdFVFwiLHRoaXMuZW5kcG9pbnRVUkwoKSxcImFwcGxpY2F0aW9uL2pzb25cIixudWxsLHRoaXMudGltZW91dCx0aGlzLm9udGltZW91dC5iaW5kKHRoaXMpLChmdW5jdGlvbih0KXtpZih0KXt2YXIgbj10LnN0YXR1cyxpPXQudG9rZW4sbz10Lm1lc3NhZ2VzO2UudG9rZW49aX1lbHNlIG49MDtzd2l0Y2gobil7Y2FzZSAyMDA6by5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gZS5vbm1lc3NhZ2Uoe2RhdGE6dH0pfSkpLGUucG9sbCgpO2JyZWFrO2Nhc2UgMjA0OmUucG9sbCgpO2JyZWFrO2Nhc2UgNDEwOmUucmVhZHlTdGF0ZT12LGUub25vcGVuKCksZS5wb2xsKCk7YnJlYWs7Y2FzZSA0MDM6ZS5vbmVycm9yKCksZS5jbG9zZSgpO2JyZWFrO2Nhc2UgMDpjYXNlIDUwMDplLm9uZXJyb3IoKSxlLmNsb3NlQW5kUmV0cnkoKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihcInVuaGFuZGxlZCBwb2xsIHN0YXR1cyBcIi5jb25jYXQobikpfX0pKX19LHtrZXk6XCJzZW5kXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztELnJlcXVlc3QoXCJQT1NUXCIsdGhpcy5lbmRwb2ludFVSTCgpLFwiYXBwbGljYXRpb24vanNvblwiLGUsdGhpcy50aW1lb3V0LHRoaXMub25lcnJvci5iaW5kKHRoaXMsXCJ0aW1lb3V0XCIpLChmdW5jdGlvbihlKXtlJiYyMDA9PT1lLnN0YXR1c3x8KHQub25lcnJvcihlJiZlLnN0YXR1cyksdC5jbG9zZUFuZFJldHJ5KCkpfSkpfX0se2tleTpcImNsb3NlXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt0aGlzLnJlYWR5U3RhdGU9bSx0aGlzLm9uY2xvc2UoKX19XSksZX0oKSxEPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe2ModGhpcyxlKX1yZXR1cm4gaChlLG51bGwsW3trZXk6XCJyZXF1ZXN0XCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4saSxvLHIscyl7aWYoZC5YRG9tYWluUmVxdWVzdCl7dmFyIGE9bmV3IFhEb21haW5SZXF1ZXN0O3RoaXMueGRvbWFpblJlcXVlc3QoYSxlLHQsaSxvLHIscyl9ZWxzZXt2YXIgYz1uZXcgZC5YTUxIdHRwUmVxdWVzdDt0aGlzLnhoclJlcXVlc3QoYyxlLHQsbixpLG8scixzKX19fSx7a2V5OlwieGRvbWFpblJlcXVlc3RcIix2YWx1ZTpmdW5jdGlvbihlLHQsbixpLG8scixzKXt2YXIgYT10aGlzO2UudGltZW91dD1vLGUub3Blbih0LG4pLGUub25sb2FkPWZ1bmN0aW9uKCl7dmFyIHQ9YS5wYXJzZUpTT04oZS5yZXNwb25zZVRleHQpO3MmJnModCl9LHImJihlLm9udGltZW91dD1yKSxlLm9ucHJvZ3Jlc3M9ZnVuY3Rpb24oKXt9LGUuc2VuZChpKX19LHtrZXk6XCJ4aHJSZXF1ZXN0XCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4saSxvLHIscyxhKXt2YXIgYz10aGlzO2Uub3Blbih0LG4sITApLGUudGltZW91dD1yLGUuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLGkpLGUub25lcnJvcj1mdW5jdGlvbigpe2EmJmEobnVsbCl9LGUub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoZS5yZWFkeVN0YXRlPT09Yy5zdGF0ZXMuY29tcGxldGUmJmEpe3ZhciB0PWMucGFyc2VKU09OKGUucmVzcG9uc2VUZXh0KTthKHQpfX0scyYmKGUub250aW1lb3V0PXMpLGUuc2VuZChvKX19LHtrZXk6XCJwYXJzZUpTT05cIix2YWx1ZTpmdW5jdGlvbihlKXtpZighZXx8XCJcIj09PWUpcmV0dXJuIG51bGw7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoKHQpe3JldHVybiBjb25zb2xlJiZjb25zb2xlLmxvZyhcImZhaWxlZCB0byBwYXJzZSBKU09OIHJlc3BvbnNlXCIsZSksbnVsbH19fSx7a2V5Olwic2VyaWFsaXplXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1bXTtmb3IodmFyIGkgaW4gZSlpZihlLmhhc093blByb3BlcnR5KGkpKXt2YXIgcj10P1wiXCIuY29uY2F0KHQsXCJbXCIpLmNvbmNhdChpLFwiXVwiKTppLHM9ZVtpXTtcIm9iamVjdFwiPT09byhzKT9uLnB1c2godGhpcy5zZXJpYWxpemUocyxyKSk6bi5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChyKStcIj1cIitlbmNvZGVVUklDb21wb25lbnQocykpfXJldHVybiBuLmpvaW4oXCImXCIpfX0se2tleTpcImFwcGVuZFBhcmFtc1wiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7aWYoMD09PU9iamVjdC5rZXlzKHQpLmxlbmd0aClyZXR1cm4gZTt2YXIgbj1lLm1hdGNoKC9cXD8vKT9cIiZcIjpcIj9cIjtyZXR1cm5cIlwiLmNvbmNhdChlKS5jb25jYXQobikuY29uY2F0KHRoaXMuc2VyaWFsaXplKHQpKX19XSksZX0oKTtELnN0YXRlcz17Y29tcGxldGU6NH07dmFyIEI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe3ZhciBuPXRoaXMsaT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307Yyh0aGlzLGUpO3ZhciBvPWkuZXZlbnRzfHx7c3RhdGU6XCJwcmVzZW5jZV9zdGF0ZVwiLGRpZmY6XCJwcmVzZW5jZV9kaWZmXCJ9O3RoaXMuc3RhdGU9e30sdGhpcy5wZW5kaW5nRGlmZnM9W10sdGhpcy5jaGFubmVsPXQsdGhpcy5qb2luUmVmPW51bGwsdGhpcy5jYWxsZXI9e29uSm9pbjpmdW5jdGlvbigpe30sb25MZWF2ZTpmdW5jdGlvbigpe30sb25TeW5jOmZ1bmN0aW9uKCl7fX0sdGhpcy5jaGFubmVsLm9uKG8uc3RhdGUsKGZ1bmN0aW9uKHQpe3ZhciBpPW4uY2FsbGVyLG89aS5vbkpvaW4scj1pLm9uTGVhdmUscz1pLm9uU3luYztuLmpvaW5SZWY9bi5jaGFubmVsLmpvaW5SZWYoKSxuLnN0YXRlPWUuc3luY1N0YXRlKG4uc3RhdGUsdCxvLHIpLG4ucGVuZGluZ0RpZmZzLmZvckVhY2goKGZ1bmN0aW9uKHQpe24uc3RhdGU9ZS5zeW5jRGlmZihuLnN0YXRlLHQsbyxyKX0pKSxuLnBlbmRpbmdEaWZmcz1bXSxzKCl9KSksdGhpcy5jaGFubmVsLm9uKG8uZGlmZiwoZnVuY3Rpb24odCl7dmFyIGk9bi5jYWxsZXIsbz1pLm9uSm9pbixyPWkub25MZWF2ZSxzPWkub25TeW5jO24uaW5QZW5kaW5nU3luY1N0YXRlKCk/bi5wZW5kaW5nRGlmZnMucHVzaCh0KToobi5zdGF0ZT1lLnN5bmNEaWZmKG4uc3RhdGUsdCxvLHIpLHMoKSl9KSl9cmV0dXJuIGgoZSxbe2tleTpcIm9uSm9pblwiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuY2FsbGVyLm9uSm9pbj1lfX0se2tleTpcIm9uTGVhdmVcIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLmNhbGxlci5vbkxlYXZlPWV9fSx7a2V5Olwib25TeW5jXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5jYWxsZXIub25TeW5jPWV9fSx7a2V5OlwibGlzdFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBlLmxpc3QodGhpcy5zdGF0ZSx0KX19LHtrZXk6XCJpblBlbmRpbmdTeW5jU3RhdGVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiF0aGlzLmpvaW5SZWZ8fHRoaXMuam9pblJlZiE9PXRoaXMuY2hhbm5lbC5qb2luUmVmKCl9fV0sW3trZXk6XCJzeW5jU3RhdGVcIix2YWx1ZTpmdW5jdGlvbihlLHQsbixpKXt2YXIgbz10aGlzLHI9dGhpcy5jbG9uZShlKSxzPXt9LGE9e307cmV0dXJuIHRoaXMubWFwKHIsKGZ1bmN0aW9uKGUsbil7dFtlXXx8KGFbZV09bil9KSksdGhpcy5tYXAodCwoZnVuY3Rpb24oZSx0KXt2YXIgbj1yW2VdO2lmKG4pe3ZhciBpPXQubWV0YXMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS5waHhfcmVmfSkpLGM9bi5tZXRhcy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBoeF9yZWZ9KSksdT10Lm1ldGFzLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGMuaW5kZXhPZihlLnBoeF9yZWYpPDB9KSksaD1uLm1ldGFzLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGkuaW5kZXhPZihlLnBoeF9yZWYpPDB9KSk7dS5sZW5ndGg+MCYmKHNbZV09dCxzW2VdLm1ldGFzPXUpLGgubGVuZ3RoPjAmJihhW2VdPW8uY2xvbmUobiksYVtlXS5tZXRhcz1oKX1lbHNlIHNbZV09dH0pKSx0aGlzLnN5bmNEaWZmKHIse2pvaW5zOnMsbGVhdmVzOmF9LG4saSl9fSx7a2V5Olwic3luY0RpZmZcIix2YWx1ZTpmdW5jdGlvbihlLHQsbixvKXt2YXIgcj10LmpvaW5zLHM9dC5sZWF2ZXMsYT10aGlzLmNsb25lKGUpO3JldHVybiBufHwobj1mdW5jdGlvbigpe30pLG98fChvPWZ1bmN0aW9uKCl7fSksdGhpcy5tYXAociwoZnVuY3Rpb24oZSx0KXt2YXIgbz1hW2VdO2lmKGFbZV09dCxvKXt2YXIgcixzPWFbZV0ubWV0YXMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS5waHhfcmVmfSkpLGM9by5tZXRhcy5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBzLmluZGV4T2YoZS5waHhfcmVmKTwwfSkpOyhyPWFbZV0ubWV0YXMpLnVuc2hpZnQuYXBwbHkocixpKGMpKX1uKGUsbyx0KX0pKSx0aGlzLm1hcChzLChmdW5jdGlvbihlLHQpe3ZhciBuPWFbZV07aWYobil7dmFyIGk9dC5tZXRhcy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBoeF9yZWZ9KSk7bi5tZXRhcz1uLm1ldGFzLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGkuaW5kZXhPZihlLnBoeF9yZWYpPDB9KSksbyhlLG4sdCksMD09PW4ubWV0YXMubGVuZ3RoJiZkZWxldGUgYVtlXX19KSksYX19LHtrZXk6XCJsaXN0XCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8KHQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdH0pLHRoaXMubWFwKGUsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQoZSxuKX0pKX19LHtrZXk6XCJtYXBcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKS5tYXAoKGZ1bmN0aW9uKG4pe3JldHVybiB0KG4sZVtuXSl9KSl9fSx7a2V5OlwiY2xvbmVcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlKSl9fV0pLGV9KCksST1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuKXtjKHRoaXMsZSksdGhpcy5jYWxsYmFjaz10LHRoaXMudGltZXJDYWxjPW4sdGhpcy50aW1lcj1udWxsLHRoaXMudHJpZXM9MH1yZXR1cm4gaChlLFt7a2V5OlwicmVzZXRcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMudHJpZXM9MCxjbGVhclRpbWVvdXQodGhpcy50aW1lcil9fSx7a2V5Olwic2NoZWR1bGVUaW1lb3V0XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2NsZWFyVGltZW91dCh0aGlzLnRpbWVyKSx0aGlzLnRpbWVyPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZS50cmllcz1lLnRyaWVzKzEsZS5jYWxsYmFjaygpfSksdGhpcy50aW1lckNhbGModGhpcy50cmllcysxKSl9fV0pLGV9KCl9XSl9KSk7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBIiwic291cmNlUm9vdCI6IiJ9\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 c = !!a && a.createRange && \"createContextualFragment\" in a.createRange();\n\n function s(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) : c ? 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 = s(n);\n var u = i.getNodeKey || y,\n c = 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 x = i.onBeforeElChildrenUpdated || m,\n S = !0 === i.childrenOnly,\n A = 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 T(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 = A[i];\n r && l(t, r) ? (t.parentNode.replaceChild(r, t), I(r, t)) : T(t);\n } else T(t);\n\n t = n;\n }\n }\n\n function I(t, n, i) {\n var r = u(n);\n\n if (r && delete A[r], !i) {\n if (!1 === b(t, n)) return;\n if (e(t, n), k(t), !1 === x(t, n)) return;\n }\n\n \"TEXTAREA\" !== t.nodeName ? function (e, t) {\n var n,\n i,\n r,\n o,\n s,\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 && ((s = A[n]) ? r === s ? y = !1 : (e.insertBefore(s, v), i ? P(i) : L(v, e, !0), v = s) : y = !1) : i && (y = !1), (y = !1 !== y && l(v, d)) && I(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 && (s = A[n]) && l(s, d)) e.appendChild(s), I(s, d);else {\n var b = c(d);\n !1 !== b && (b && (d = b), d.actualize && (d = d.actualize(e.ownerDocument || a)), e.appendChild(d), T(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 && (A[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 (I(D, n, S), C) for (var R = 0, O = C.length; R < O; R++) {\n var H = A[C[R]];\n H && L(H, H.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 c = u.length - 1; c >= 0; c--) i = (n = u[c]).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 s = e.attributes, l = s.length - 1; l >= 0; l--) i = (n = s[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 I(e) || S(e) || D(e) || T();\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 x(e) {\n return function (e) {\n if (Array.isArray(e)) return _(e);\n }(e) || S(e) || D(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 A(e, t) {\n if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n }\n\n function C(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 P(e, t, n) {\n return t && C(e.prototype, t), n && C(e, n), e;\n }\n\n function L(e, t) {\n return I(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) || D(e, t) || T();\n }\n\n function T() {\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 I(e) {\n if (Array.isArray(e)) return e;\n }\n\n function D(e, t) {\n if (e) {\n if (\"string\" == typeof e) return _(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) ? _(e, t) : void 0;\n }\n }\n\n function _(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 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 $;\n }), n.d(t, \"Rendered\", function () {\n return te;\n }), n.d(t, \"LiveSocket\", function () {\n return ne;\n }), n.d(t, \"Browser\", function () {\n return ie;\n }), n.d(t, \"DOM\", function () {\n return re;\n }), n.d(t, \"View\", function () {\n return ue;\n });\n\n var R = [1e3, 3e3],\n O = \"data-phx-view\",\n H = [\"phx-click-loading\", \"phx-change-loading\", \"phx-submit-loading\", \"phx-keydown-loading\", \"phx-keyup-loading\", \"phx-blur-loading\", \"phx-focus-loading\"],\n j = \"data-phx-component\",\n M = \"data-phx-ref\",\n B = \"[\".concat(O, \"]\"),\n U = [\"text\", \"textarea\", \"number\", \"email\", \"password\", \"search\", \"tel\", \"url\", \"date\", \"time\"],\n J = [\"checkbox\", \"radio\"],\n F = \"data-phx-static\",\n V = 1,\n q = \"phx-\",\n W = {\n debounce: 300,\n throttle: 300\n },\n K = function (e, t) {\n return console.error && console.error(e, t);\n };\n\n var $ = 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 z = 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(B)));\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 (e) {\n var t,\n n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {},\n i = new FormData(e),\n r = new URLSearchParams(),\n o = function (e) {\n if (\"undefined\" == typeof Symbol || null == e[Symbol.iterator]) {\n if (Array.isArray(e) || (e = D(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 }(i.entries());\n\n try {\n for (o.s(); !(t = o.n()).done;) {\n var a = L(t.value, 2),\n u = a[0],\n c = a[1];\n r.append(u, c);\n }\n } catch (e) {\n o.e(e);\n } finally {\n o.f();\n }\n\n for (var s in n) r.append(s, n[s]);\n\n return r.toString();\n },\n te = function () {\n function e(t, n) {\n A(this, e), this.viewId = t, this.rendered = {}, this.mergeDiff(n);\n }\n\n return P(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 }]), P(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 = z(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] || K(\"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 c = L(Array.from(a.childNodes).reduce(function (e, n, r) {\n var a = L(e, 2),\n c = a[0],\n s = a[1];\n return n.nodeType === Node.ELEMENT_NODE ? n.getAttribute(j) ? [c, !0] : (n.setAttribute(j, t), n.id || (n.id = \"\".concat(i.parentViewId(), \"-\").concat(t, \"-\").concat(r)), u && (n.setAttribute(\"data-phx-skip\", \"\"), n.innerHTML = \"\"), [!0, s]) : \"\" !== n.nodeValue.trim() ? (K(\"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, s]) : (n.remove(), [c, s]);\n }, [!1, !1]), 2),\n s = c[0],\n l = c[1];\n return s || l ? !s && l ? (K(\"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 : (K(\"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(j, t), n;\n }\n }]), e;\n }(),\n ne = function () {\n function e(t, n) {\n var i = this,\n r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {};\n if (A(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 || q, this.opts = r, this.params = X(r.params || {}), this.viewLogger = r.viewLogger, this.metadataCallbacks = r.metadata || {}, this.defaults = Object.assign(z(W), 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 = z(window.location), this.hooks = r.hooks || {}, this.loaderTimeout = r.loaderTimeout || V, this.boundTopLevelEvents = !1, this.domCallbacks = r.dom || {\n onBeforeElUpdated: X()\n }, 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 P(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, x(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 = L(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 = L(n(), 2),\n u = a[0],\n c = a[1];\n $(e, t, u, c);\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) {\n var t = this.getLatencySim();\n if (!t) return e();\n console.log(\"simulating \".concat(t, \"ms of latency from client to server\"));\n var n = {\n receives: [],\n receive: function (e, t) {\n this.receives.push([e, t]);\n }\n };\n return setTimeout(function () {\n n.receives.reduce(function (e, t) {\n var n = L(t, 2),\n i = n[0],\n r = n[1];\n return e.receive(i, r);\n }, e());\n }, t), n;\n }\n }, {\n key: \"reloadWithJitter\",\n value: function (e) {\n var t = this;\n e.destroy(), this.disconnect();\n var n = R[0],\n i = R[1],\n r = Math.floor(Math.random() * (i - n + 1)) + n,\n o = ie.updateLocal(e.name(), \"consecutive-reloads\", 0, function (e) {\n return e + 1;\n });\n this.log(e, \"join\", function () {\n return [\"encountered \".concat(o, \" consecutive reloads\")];\n }), o > 10 && (this.log(e, \"join\", function () {\n return [\"exceeded \".concat(10, \" consecutive reloads. Entering failsafe mode\")];\n }), r = 3e4), setTimeout(function () {\n t.hasPendingLink() ? window.location = t.pendingLink : window.location.reload();\n }, r);\n }\n }, {\n key: \"getHookCallbacks\",\n value: function (e) {\n return 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 re.all(document, \"\".concat(B, \":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(), ie.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(), ie.fetchPage(e, function (a, u) {\n if (200 !== a) return n.redirect(e);\n var c = document.createElement(\"template\");\n c.innerHTML = u;\n var s = c.content.childNodes[0];\n if (!s || !n.isPhxView(s)) return n.redirect(e);\n n.joinRootView(s, 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 ue(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(B), 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, 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 c = r.getAttribute(e.binding(\"key\")),\n s = t.key && t.key.toLowerCase();\n c && c.toLowerCase() !== s || 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 }));\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 }) : re.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 var e = this;\n [!0, !1].forEach(function (t) {\n var n = t ? e.binding(\"capture-click\") : e.binding(\"click\");\n window.addEventListener(\"click\", function (i) {\n var r = null,\n o = (r = t ? i.target.matches(\"[\".concat(n, \"]\")) ? i.target : i.target.querySelector(\"[\".concat(n, \"]\")) : G(i.target, n)) && r.getAttribute(n);\n o && (\"#\" === r.getAttribute(\"href\") && i.preventDefault(), e.debounce(r, i, function () {\n e.withinOwners(r, function (t, n) {\n t.pushEvent(\"click\", r, n, o, e.eventMeta(\"click\", i, r));\n });\n }));\n }, t);\n });\n }\n }, {\n key: \"bindNav\",\n value: function () {\n var e = this;\n\n if (ie.canPushState()) {\n history.scrollRestoration && (history.scrollRestoration = \"manual\");\n var t = null;\n window.addEventListener(\"scroll\", function (e) {\n clearTimeout(t), t = setTimeout(function () {\n ie.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 re.dispatchEvent(window, \"phx:page-loading-start\", e);\n\n var n = function () {\n return re.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 ie.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 ie.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 ie.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 = z(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 = re.private(r, \"prev-iteration\") || {},\n c = u.at,\n s = u.type;\n c === a - 1 && n !== s || (re.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 re.putPrivate(r, \"phx-has-focused\", !0), re.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 re.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 ie = {\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 && ie.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 re = {\n byId: function (e) {\n return document.getElementById(e) || K(\"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 findComponentNodeList: function (e, t) {\n var n = this.all(e, B),\n i = this.all(e, \"[\".concat(j, '=\"').concat(t, '\"]'));\n return 0 === n.length ? i : i.filter(function (e) {\n return !n.some(function (t) {\n return t.contains(e);\n });\n });\n },\n findPhxChildrenInFragment: function (e, t) {\n var n = document.createElement(\"template\");\n return n.innerHTML = e, this.findPhxChildren(n.content, t);\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(B, \"[\").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(j, '=\"').concat(i, '\"] [').concat(j, \"]\");\n return n.all(e, r).map(function (e) {\n return parseInt(e.getAttribute(j));\n }).forEach(function (e) {\n return t.delete(e);\n }), t;\n }, i);\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 = z(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 c = e.getAttribute(n),\n s = e.getAttribute(r);\n \"\" === c && (c = i), \"\" === s && (s = o);\n var l = c || s;\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 s ? u.deletePrivate(e, \"throttled\") : a();\n });\n if (isNaN(d)) return K(\"invalid throttle/debounce value: \".concat(l));\n\n if (s) {\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 = L(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 = L(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 = L(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(\"#\".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 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 = t.attributes, r = i.length - 1; r >= 0; r--) {\n var o = i[r].name;\n n.indexOf(o) < 0 && e.setAttribute(o, t.getAttribute(o));\n }\n\n for (var a = e.attributes, u = a.length - 1; u >= 0; u--) {\n var c = a[u].name;\n t.hasAttribute(c) || e.removeAttribute(c);\n }\n },\n mergeFocusedInput: function (e, t) {\n e instanceof HTMLSelectElement || re.mergeAttrs(e, t, [\"value\"]), 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 (re.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 U.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(M);\n return null === i || (re.isFormInput(e) || null !== e.getAttribute(n) ? (re.putPrivate(e, M, t), !1) : (H.forEach(function (n) {\n e.classList.contains(n) && t.classList.add(n);\n }), t.setAttribute(M, i), !0));\n },\n cleanChildNodes: function (e, t) {\n if (re.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() || K(\"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 oe = function () {\n function e(t, n, i) {\n A(this, e);\n var r = new Set(),\n o = new Set(x(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 = x(o).filter(function (e) {\n return !r.has(e);\n });\n }\n\n return P(e, [{\n key: \"perform\",\n value: function () {\n var e = re.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 ae = function () {\n function e(t, n, i, r, o) {\n A(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 beforediscarded: [],\n beforephxChildAdded: [],\n afteradded: [],\n afterupdated: [],\n afterdiscarded: [],\n afterphxChildAdded: []\n };\n }\n\n return P(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) && re.isFormInput(e)) return re.mergeFocusedInput(e, t), !1;\n }\n });\n }\n }]), P(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 re.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() : i;\n\n if (!this.isCIDPatch() || o) {\n var a = n.getActiveElement(),\n u = a && re.hasSelectionRange(a) ? a : {},\n c = u.selectionStart,\n s = 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(j),\n onBeforeNodeAdded: function (t) {\n return re.discardError(o, t, d), e.trackBefore(\"added\", t), t;\n },\n onNodeAdded: function (n) {\n re.isNowTriggerFormExternal(n, f) && (m = n), re.isPhxChild(n) && t.ownsElement(n) && e.trackAfter(\"phxChildAdded\", n), v.push(n);\n },\n onNodeDiscarded: function (t) {\n re.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 || !re.isPhxUpdate(t.parentNode, l, [\"append\", \"prepend\"]) || !t.id) && !e.skipCIDSibling(t) && (e.trackBefore(\"discarded\", t), !0);\n },\n onElUpdated: function (e) {\n re.isNowTriggerFormExternal(e, f) && (m = e), p.push(e);\n },\n onBeforeElUpdated: function (t, n) {\n if (re.cleanChildNodes(n, l), e.skipCIDSibling(n)) return !1;\n if (\"ignore\" === t.getAttribute(l)) return e.trackBefore(\"updated\", t, n), re.mergeAttrs(t, n), p.push(t), !1;\n if (\"number\" === t.type && t.validity && t.validity.badInput) return !1;\n if (!re.syncPendingRef(t, n, h)) return !1;\n\n if (re.isPhxChild(n)) {\n var i = t.getAttribute(F);\n return re.mergeAttrs(t, n), t.setAttribute(F, i), t.setAttribute(\"data-phx-root-id\", e.rootID), !1;\n }\n\n return re.copyPrivates(n, t), re.discardError(o, n, d), a && t.isSameNode(a) && re.isFormInput(t) && !e.forceFocusedSelectUpdate(t, n) ? (e.trackBefore(\"updated\", t, n), re.mergeFocusedInput(t, n), re.syncAttrsToProps(t), p.push(t), !1) : (re.isPhxUpdate(n, l, [\"append\", \"prepend\"]) && g.push(new oe(t, n, n.getAttribute(l))), re.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 re.restoreFocus(a, c, s);\n }), re.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 return !0 === e.multiple || 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 () {\n if (this.isCIDPatch()) {\n var e = k(re.findComponentNodeList(this.container, this.targetCID)),\n t = e[0];\n return 0 === e.slice(1).length ? t : t && t.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(j) === this.targetCID.toString();\n if (!o || a) return t;\n var u = null,\n c = document.createElement(\"template\");\n u = re.cloneNode(i);\n var s = k(re.findComponentNodeList(u, this.targetCID)),\n l = s[0],\n d = s.slice(1);\n return c.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(j) !== r.targetCID.toString() && (e.setAttribute(\"data-phx-skip\", \"\"), e.innerHTML = \"\");\n }), Array.from(c.content.childNodes).forEach(function (e) {\n return u.insertBefore(e, l);\n }), l.remove(), u.outerHTML;\n }\n }]), e;\n }(),\n ue = function () {\n function e(t, n, i, r, o) {\n var a = this;\n A(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.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.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 P(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 = re.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(F);\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.viewHooks[n].__trigger__(\"beforeDestroy\"), e.destroyHook(e.viewHooks[n]);\n };\n\n 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].__trigger__(\"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].__trigger__(\"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 = re.findComponentNodeList(this.el, e);\n 0 === i.length ? K(\"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 && K('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 [\"\", z(t)];\n });\n var i = te.extract(t),\n r = i.diff,\n o = i.reply,\n a = i.events,\n u = i.title;\n return u && re.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.joinCount++, this.childJoins = 0, this.joinPending = !0, this.flash = null, ie.dropLocal(this.name(), \"consecutive-reloads\"), this.applyDiff(\"mount\", n, function (n) {\n var i = n.diff,\n r = n.events;\n t.rendered = new te(t.id, i);\n var o = t.renderContainer(null, \"join\");\n t.dropPendingRefs();\n var a = t.formsForRecovery(o);\n t.joinCount > 1 && 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 re.all(this.el, \"[\".concat(M, \"]\"), function (e) {\n return e.removeAttribute(M);\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 === re.findPhxChildrenInFragment(t, this.id).filter(function (e) {\n var t = e.id && i.el.querySelector(\"#\".concat(e.id)),\n n = t && t.getAttribute(F);\n return n && e.setAttribute(F, 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 = re.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 = L(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 ae(this, this.el, this.id, t, null);\n\n if (r.markPrunableContentForRemoval(), this.performPatch(r, !1), this.joinNewChildren(), re.all(this.el, \"[\".concat(this.binding(\"hook\"), \"]\"), function (e) {\n var t = i.addHook(e);\n t && t.__trigger__(\"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 && \"ignore\" === e.getAttribute(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.__trigger__(\"beforeUpdate\"), n;\n }\n }, {\n key: \"triggerUpdatedHook\",\n value: function (e) {\n e.__trigger__(\"updated\");\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 var t = n.addHook(e);\n t && t.__trigger__(\"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.triggerUpdatedHook(n.getHook(e));\n }), e.before(\"discarded\", function (e) {\n var t = n.getHook(e);\n t && t.__trigger__(\"beforeDestroy\");\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 re.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 = L(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 re.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 ae(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) : 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 ae(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[se.elementID(e)];\n }\n }, {\n key: \"addHook\",\n value: function (e) {\n if (!se.elementID(e) && e.getAttribute) {\n var t = 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 || K('no DOM ID for hook \"'.concat(t, '\". Hooks require a unique ID on each element.'), e);\n var i = new se(this, e, n);\n return this.viewHooks[se.elementID(i.el)] = i, i;\n }\n\n null !== t && K('unknown hook found for \"'.concat(t, '\"'), e);\n }\n }\n }\n }, {\n key: \"destroyHook\",\n value: function (e) {\n e.__trigger__(\"destroyed\"), e.__cleanup__(), delete this.viewHooks[se.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 () {\n return e.onClose();\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(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 () {\n if (!this.isDestroyed()) {\n if (this.isJoinPending() || this.liveSocket.hasPendingLink()) 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(), 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() && re.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 = L(e ? e() : [null, []], 2),\n a = o[0],\n u = L(o[1], 1)[0],\n c = function () {};\n\n return u && null !== u.getAttribute(this.binding(\"page-loading\")) && (c = this.liveSocket.withPageLoading({\n kind: \"element\",\n target: u\n })), \"number\" != typeof n.cid && delete n.cid, this.liveSocket.wrapPush(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), c(), r(e, t);\n });\n });\n }\n }, {\n key: \"undoRefs\",\n value: function (e) {\n var t = this;\n re.all(this.el, \"[\".concat(M, '=\"').concat(e, '\"]'), function (e) {\n e.removeAttribute(M), 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\")), H.forEach(function (t) {\n return re.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 = re.private(e, M);\n\n if (i) {\n var r = t.triggerBeforeUpdateHook(e, i);\n ae.patchEl(e, i, t.liveSocket.getActiveElement()), r && t.triggerUpdatedHook(r), re.deletePrivate(e, M);\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(M, 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(j);\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(j, \"]\")), 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 var r = L(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: \"pushInput\",\n value: function (e, t, n, i, r) {\n var o = this;\n this.pushWithReply(function () {\n return o.putRef([e, e.form], \"change\");\n }, \"event\", {\n type: \"form\",\n event: n,\n value: ee(e.form, {\n _target: i.name\n }),\n cid: this.targetComponentID(e.form, t)\n }, r);\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);\n };\n\n this.pushWithReply(function () {\n var t = re.all(e, \"[\".concat(r.binding(\"disable-with\"), \"]\")),\n n = re.all(e, \"button\").filter(o),\n i = re.all(e, \"input,textarea,select\").filter(o);\n return n.forEach(function (e) {\n e.setAttribute(\"data-phx-disabled\", e.disabled), e.disabled = !0;\n }), i.forEach(function (e) {\n e.setAttribute(\"data-phx-readonly\", e.readOnly), e.readOnly = !0;\n }), e.setAttribute(r.binding(\"page-loading\"), \"\"), r.putRef([e].concat(t).concat(n).concat(i), \"submit\");\n }, \"event\", {\n type: \"form\",\n event: n,\n value: ee(e),\n cid: this.targetComponentID(e, t)\n }, i);\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 n = this.binding(\"change\"),\n i = document.createElement(\"template\");\n return i.innerHTML = e, re.all(this.el, \"form[\".concat(n, \"]\")).filter(function (e) {\n return t.ownsElement(e);\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 = this,\n n = e.filter(function (e) {\n return 0 === re.findComponentNodeList(t.el, e).length;\n });\n n.length > 0 && this.pushWithReply(null, \"cids_destroyed\", {\n cids: n\n }, function () {\n t.rendered.pruneCIDs(n);\n });\n }\n }, {\n key: \"ownsElement\",\n value: function (e) {\n return e.getAttribute(\"data-phx-parent-id\") === this.id || Z(e.closest(B), 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 re.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 ce = 1,\n se = function () {\n function e(t, n, i) {\n for (var r in A(this, e), this.__view = t, this.__liveSocket = t.liveSocket, this.__callbacks = i, this.__listeners = new Set(), this.el = n, this.viewName = t.name(), this.el.phxHookId = this.constructor.makeID(), this.__callbacks) this[r] = this.__callbacks[r];\n }\n\n return P(e, null, [{\n key: \"makeID\",\n value: function () {\n return ce++;\n }\n }, {\n key: \"elementID\",\n value: function (e) {\n return e.phxHookId;\n }\n }]), P(e, [{\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 }, {\n key: \"__trigger__\",\n value: function (e) {\n var t = this.__callbacks[e];\n t && t.call(this);\n }\n }]), e;\n }();\n\n t.default = ne;\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/dm9pZCAwOmRvY3VtZW50LHU9ISFhJiZcImNvbnRlbnRcImluIGEuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpLGM9ISFhJiZhLmNyZWF0ZVJhbmdlJiZcImNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudFwiaW4gYS5jcmVhdGVSYW5nZSgpO2Z1bmN0aW9uIHMoZSl7cmV0dXJuIGU9ZS50cmltKCksdT9mdW5jdGlvbihlKXt2YXIgdD1hLmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtyZXR1cm4gdC5pbm5lckhUTUw9ZSx0LmNvbnRlbnQuY2hpbGROb2Rlc1swXX0oZSk6Yz9mdW5jdGlvbihlKXtyZXR1cm4gaXx8KGk9YS5jcmVhdGVSYW5nZSgpKS5zZWxlY3ROb2RlKGEuYm9keSksaS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoZSkuY2hpbGROb2Rlc1swXX0oZSk6ZnVuY3Rpb24oZSl7dmFyIHQ9YS5jcmVhdGVFbGVtZW50KFwiYm9keVwiKTtyZXR1cm4gdC5pbm5lckhUTUw9ZSx0LmNoaWxkTm9kZXNbMF19KGUpfWZ1bmN0aW9uIGwoZSx0KXt2YXIgbixpLHI9ZS5ub2RlTmFtZSxvPXQubm9kZU5hbWU7cmV0dXJuIHI9PT1vfHwobj1yLmNoYXJDb2RlQXQoMCksaT1vLmNoYXJDb2RlQXQoMCksbjw9OTAmJmk+PTk3P3I9PT1vLnRvVXBwZXJDYXNlKCk6aTw9OTAmJm4+PTk3JiZvPT09ci50b1VwcGVyQ2FzZSgpKX1mdW5jdGlvbiBkKGUsdCxuKXtlW25dIT09dFtuXSYmKGVbbl09dFtuXSxlW25dP2Uuc2V0QXR0cmlidXRlKG4sXCJcIik6ZS5yZW1vdmVBdHRyaWJ1dGUobikpfXZhciBoPXtPUFRJT046ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnBhcmVudE5vZGU7aWYobil7dmFyIGk9bi5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO1wiT1BUR1JPVVBcIj09PWkmJihpPShuPW4ucGFyZW50Tm9kZSkmJm4ubm9kZU5hbWUudG9VcHBlckNhc2UoKSksXCJTRUxFQ1RcIiE9PWl8fG4uaGFzQXR0cmlidXRlKFwibXVsdGlwbGVcIil8fChlLmhhc0F0dHJpYnV0ZShcInNlbGVjdGVkXCIpJiYhdC5zZWxlY3RlZCYmKGUuc2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIixcInNlbGVjdGVkXCIpLGUucmVtb3ZlQXR0cmlidXRlKFwic2VsZWN0ZWRcIikpLG4uc2VsZWN0ZWRJbmRleD0tMSl9ZChlLHQsXCJzZWxlY3RlZFwiKX0sSU5QVVQ6ZnVuY3Rpb24oZSx0KXtkKGUsdCxcImNoZWNrZWRcIiksZChlLHQsXCJkaXNhYmxlZFwiKSxlLnZhbHVlIT09dC52YWx1ZSYmKGUudmFsdWU9dC52YWx1ZSksdC5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKXx8ZS5yZW1vdmVBdHRyaWJ1dGUoXCJ2YWx1ZVwiKX0sVEVYVEFSRUE6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LnZhbHVlO2UudmFsdWUhPT1uJiYoZS52YWx1ZT1uKTt2YXIgaT1lLmZpcnN0Q2hpbGQ7aWYoaSl7dmFyIHI9aS5ub2RlVmFsdWU7aWYocj09bnx8IW4mJnI9PWUucGxhY2Vob2xkZXIpcmV0dXJuO2kubm9kZVZhbHVlPW59fSxTRUxFQ1Q6ZnVuY3Rpb24oZSx0KXtpZighdC5oYXNBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSl7Zm9yKHZhciBuLGkscj0tMSxvPTAsYT1lLmZpcnN0Q2hpbGQ7YTspaWYoXCJPUFRHUk9VUFwiPT09KGk9YS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpKSlhPShuPWEpLmZpcnN0Q2hpbGQ7ZWxzZXtpZihcIk9QVElPTlwiPT09aSl7aWYoYS5oYXNBdHRyaWJ1dGUoXCJzZWxlY3RlZFwiKSl7cj1vO2JyZWFrfW8rK30hKGE9YS5uZXh0U2libGluZykmJm4mJihhPW4ubmV4dFNpYmxpbmcsbj1udWxsKX1lLnNlbGVjdGVkSW5kZXg9cn19fSxmPTEsdj0xMSxwPTMsZz04O2Z1bmN0aW9uIG0oKXt9ZnVuY3Rpb24geShlKXtpZihlKXJldHVybiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoXCJpZFwiKXx8ZS5pZH12YXIgYj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxuLGkpe2lmKGl8fChpPXt9KSxcInN0cmluZ1wiPT10eXBlb2YgbilpZihcIiNkb2N1bWVudFwiPT09dC5ub2RlTmFtZXx8XCJIVE1MXCI9PT10Lm5vZGVOYW1lfHxcIkJPRFlcIj09PXQubm9kZU5hbWUpe3ZhciByPW47KG49YS5jcmVhdGVFbGVtZW50KFwiaHRtbFwiKSkuaW5uZXJIVE1MPXJ9ZWxzZSBuPXMobik7dmFyIHU9aS5nZXROb2RlS2V5fHx5LGM9aS5vbkJlZm9yZU5vZGVBZGRlZHx8bSxkPWkub25Ob2RlQWRkZWR8fG0sYj1pLm9uQmVmb3JlRWxVcGRhdGVkfHxtLGs9aS5vbkVsVXBkYXRlZHx8bSx3PWkub25CZWZvcmVOb2RlRGlzY2FyZGVkfHxtLEU9aS5vbk5vZGVEaXNjYXJkZWR8fG0seD1pLm9uQmVmb3JlRWxDaGlsZHJlblVwZGF0ZWR8fG0sUz0hMD09PWkuY2hpbGRyZW5Pbmx5LEE9T2JqZWN0LmNyZWF0ZShudWxsKSxDPVtdO2Z1bmN0aW9uIFAoZSl7Qy5wdXNoKGUpfWZ1bmN0aW9uIEwoZSx0LG4peyExIT09dyhlKSYmKHQmJnQucmVtb3ZlQ2hpbGQoZSksRShlKSxmdW5jdGlvbiBlKHQsbil7aWYodC5ub2RlVHlwZT09PWYpZm9yKHZhciBpPXQuZmlyc3RDaGlsZDtpOyl7dmFyIHI9dm9pZCAwO24mJihyPXUoaSkpP1Aocik6KEUoaSksaS5maXJzdENoaWxkJiZlKGksbikpLGk9aS5uZXh0U2libGluZ319KGUsbikpfWZ1bmN0aW9uIFQoZSl7ZChlKTtmb3IodmFyIHQ9ZS5maXJzdENoaWxkO3Q7KXt2YXIgbj10Lm5leHRTaWJsaW5nLGk9dSh0KTtpZihpKXt2YXIgcj1BW2ldO3ImJmwodCxyKT8odC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChyLHQpLEkocix0KSk6VCh0KX1lbHNlIFQodCk7dD1ufX1mdW5jdGlvbiBJKHQsbixpKXt2YXIgcj11KG4pO2lmKHImJmRlbGV0ZSBBW3JdLCFpKXtpZighMT09PWIodCxuKSlyZXR1cm47aWYoZSh0LG4pLGsodCksITE9PT14KHQsbikpcmV0dXJufVwiVEVYVEFSRUFcIiE9PXQubm9kZU5hbWU/ZnVuY3Rpb24oZSx0KXt2YXIgbixpLHIsbyxzLGQ9dC5maXJzdENoaWxkLHY9ZS5maXJzdENoaWxkO2U6Zm9yKDtkOyl7Zm9yKG89ZC5uZXh0U2libGluZyxuPXUoZCk7djspe2lmKHI9di5uZXh0U2libGluZyxkLmlzU2FtZU5vZGUmJmQuaXNTYW1lTm9kZSh2KSl7ZD1vLHY9cjtjb250aW51ZSBlfWk9dSh2KTt2YXIgbT12Lm5vZGVUeXBlLHk9dm9pZCAwO2lmKG09PT1kLm5vZGVUeXBlJiYobT09PWY/KG4/biE9PWkmJigocz1BW25dKT9yPT09cz95PSExOihlLmluc2VydEJlZm9yZShzLHYpLGk/UChpKTpMKHYsZSwhMCksdj1zKTp5PSExKTppJiYoeT0hMSksKHk9ITEhPT15JiZsKHYsZCkpJiZJKHYsZCkpOm0hPT1wJiZtIT1nfHwoeT0hMCx2Lm5vZGVWYWx1ZSE9PWQubm9kZVZhbHVlJiYodi5ub2RlVmFsdWU9ZC5ub2RlVmFsdWUpKSkseSl7ZD1vLHY9cjtjb250aW51ZSBlfWk/UChpKTpMKHYsZSwhMCksdj1yfWlmKG4mJihzPUFbbl0pJiZsKHMsZCkpZS5hcHBlbmRDaGlsZChzKSxJKHMsZCk7ZWxzZXt2YXIgYj1jKGQpOyExIT09YiYmKGImJihkPWIpLGQuYWN0dWFsaXplJiYoZD1kLmFjdHVhbGl6ZShlLm93bmVyRG9jdW1lbnR8fGEpKSxlLmFwcGVuZENoaWxkKGQpLFQoZCkpfWQ9byx2PXJ9IWZ1bmN0aW9uKGUsdCxuKXtmb3IoO3Q7KXt2YXIgaT10Lm5leHRTaWJsaW5nOyhuPXUodCkpP1Aobik6TCh0LGUsITApLHQ9aX19KGUsdixpKTt2YXIgaz1oW2Uubm9kZU5hbWVdO2smJmsoZSx0KX0odCxuKTpoLlRFWFRBUkVBKHQsbil9IWZ1bmN0aW9uIGUodCl7aWYodC5ub2RlVHlwZT09PWZ8fHQubm9kZVR5cGU9PT12KWZvcih2YXIgbj10LmZpcnN0Q2hpbGQ7bjspe3ZhciBpPXUobik7aSYmKEFbaV09biksZShuKSxuPW4ubmV4dFNpYmxpbmd9fSh0KTt2YXIgRD10LF89RC5ub2RlVHlwZSxOPW4ubm9kZVR5cGU7aWYoIVMpaWYoXz09PWYpTj09PWY/bCh0LG4pfHwoRSh0KSxEPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWUuZmlyc3RDaGlsZDtuOyl7dmFyIGk9bi5uZXh0U2libGluZzt0LmFwcGVuZENoaWxkKG4pLG49aX1yZXR1cm4gdH0odCxmdW5jdGlvbihlLHQpe3JldHVybiB0JiZ0IT09bz9hLmNyZWF0ZUVsZW1lbnROUyh0LGUpOmEuY3JlYXRlRWxlbWVudChlKX0obi5ub2RlTmFtZSxuLm5hbWVzcGFjZVVSSSkpKTpEPW47ZWxzZSBpZihfPT09cHx8Xz09PWcpe2lmKE49PT1fKXJldHVybiBELm5vZGVWYWx1ZSE9PW4ubm9kZVZhbHVlJiYoRC5ub2RlVmFsdWU9bi5ub2RlVmFsdWUpLEQ7RD1ufWlmKEQ9PT1uKUUodCk7ZWxzZXtpZihuLmlzU2FtZU5vZGUmJm4uaXNTYW1lTm9kZShEKSlyZXR1cm47aWYoSShELG4sUyksQylmb3IodmFyIFI9MCxPPUMubGVuZ3RoO1I8TztSKyspe3ZhciBIPUFbQ1tSXV07SCYmTChILEgucGFyZW50Tm9kZSwhMSl9fXJldHVybiFTJiZEIT09dCYmdC5wYXJlbnROb2RlJiYoRC5hY3R1YWxpemUmJihEPUQuYWN0dWFsaXplKHQub3duZXJEb2N1bWVudHx8YSkpLHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoRCx0KSksRH19KGZ1bmN0aW9uKGUsdCl7dmFyIG4saSxvLGEsdT10LmF0dHJpYnV0ZXM7aWYodC5ub2RlVHlwZSE9PXImJmUubm9kZVR5cGUhPT1yKXtmb3IodmFyIGM9dS5sZW5ndGgtMTtjPj0wO2MtLSlpPShuPXVbY10pLm5hbWUsbz1uLm5hbWVzcGFjZVVSSSxhPW4udmFsdWUsbz8oaT1uLmxvY2FsTmFtZXx8aSxlLmdldEF0dHJpYnV0ZU5TKG8saSkhPT1hJiYoXCJ4bWxuc1wiPT09bi5wcmVmaXgmJihpPW4ubmFtZSksZS5zZXRBdHRyaWJ1dGVOUyhvLGksYSkpKTplLmdldEF0dHJpYnV0ZShpKSE9PWEmJmUuc2V0QXR0cmlidXRlKGksYSk7Zm9yKHZhciBzPWUuYXR0cmlidXRlcyxsPXMubGVuZ3RoLTE7bD49MDtsLS0paT0obj1zW2xdKS5uYW1lLChvPW4ubmFtZXNwYWNlVVJJKT8oaT1uLmxvY2FsTmFtZXx8aSx0Lmhhc0F0dHJpYnV0ZU5TKG8saSl8fGUucmVtb3ZlQXR0cmlidXRlTlMobyxpKSk6dC5oYXNBdHRyaWJ1dGUoaSl8fGUucmVtb3ZlQXR0cmlidXRlKGkpfX0pO2Z1bmN0aW9uIGsoZSl7cmV0dXJuIEkoZSl8fFMoZSl8fEQoZSl8fFQoKX1mdW5jdGlvbiB3KGUsdCl7dmFyIG49T2JqZWN0LmtleXMoZSk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIGk9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTt0JiYoaT1pLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpLmVudW1lcmFibGV9KSksbi5wdXNoLmFwcGx5KG4saSl9cmV0dXJuIG59ZnVuY3Rpb24gRShlLHQsbil7cmV0dXJuIHQgaW4gZT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6ZVt0XT1uLGV9ZnVuY3Rpb24geChlKXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gXyhlKX0oZSl8fFMoZSl8fEQoZSl8fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9KCl9ZnVuY3Rpb24gUyhlKXtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKXJldHVybiBBcnJheS5mcm9tKGUpfWZ1bmN0aW9uIEEoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIEMoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIGk9dFtuXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMSxpLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBpJiYoaS53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsaS5rZXksaSl9fWZ1bmN0aW9uIFAoZSx0LG4pe3JldHVybiB0JiZDKGUucHJvdG90eXBlLHQpLG4mJkMoZSxuKSxlfWZ1bmN0aW9uIEwoZSx0KXtyZXR1cm4gSShlKXx8ZnVuY3Rpb24oZSx0KXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgU3ltYm9sfHwhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpKXJldHVybjt2YXIgbj1bXSxpPSEwLHI9ITEsbz12b2lkIDA7dHJ5e2Zvcih2YXIgYSx1PWVbU3ltYm9sLml0ZXJhdG9yXSgpOyEoaT0oYT11Lm5leHQoKSkuZG9uZSkmJihuLnB1c2goYS52YWx1ZSksIXR8fG4ubGVuZ3RoIT09dCk7aT0hMCk7fWNhdGNoKGUpe3I9ITAsbz1lfWZpbmFsbHl7dHJ5e2l8fG51bGw9PXUucmV0dXJufHx1LnJldHVybigpfWZpbmFsbHl7aWYocil0aHJvdyBvfX1yZXR1cm4gbn0oZSx0KXx8RChlLHQpfHxUKCl9ZnVuY3Rpb24gVCgpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9ZnVuY3Rpb24gSShlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlfWZ1bmN0aW9uIEQoZSx0KXtpZihlKXtpZihcInN0cmluZ1wiPT10eXBlb2YgZSlyZXR1cm4gXyhlLHQpO3ZhciBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKTtyZXR1cm5cIk9iamVjdFwiPT09biYmZS5jb25zdHJ1Y3RvciYmKG49ZS5jb25zdHJ1Y3Rvci5uYW1lKSxcIk1hcFwiPT09bnx8XCJTZXRcIj09PW4/QXJyYXkuZnJvbShlKTpcIkFyZ3VtZW50c1wiPT09bnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3Qobik/XyhlLHQpOnZvaWQgMH19ZnVuY3Rpb24gXyhlLHQpeyhudWxsPT10fHx0PmUubGVuZ3RoKSYmKHQ9ZS5sZW5ndGgpO2Zvcih2YXIgbj0wLGk9bmV3IEFycmF5KHQpO248dDtuKyspaVtuXT1lW25dO3JldHVybiBpfWZ1bmN0aW9uIE4oZSl7XCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO3JldHVybihOPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIGV9KShlKX1uLmQodCxcImRlYnVnXCIsZnVuY3Rpb24oKXtyZXR1cm4gJH0pLG4uZCh0LFwiUmVuZGVyZWRcIixmdW5jdGlvbigpe3JldHVybiB0ZX0pLG4uZCh0LFwiTGl2ZVNvY2tldFwiLGZ1bmN0aW9uKCl7cmV0dXJuIG5lfSksbi5kKHQsXCJCcm93c2VyXCIsZnVuY3Rpb24oKXtyZXR1cm4gaWV9KSxuLmQodCxcIkRPTVwiLGZ1bmN0aW9uKCl7cmV0dXJuIHJlfSksbi5kKHQsXCJWaWV3XCIsZnVuY3Rpb24oKXtyZXR1cm4gdWV9KTt2YXIgUj1bMWUzLDNlM10sTz1cImRhdGEtcGh4LXZpZXdcIixIPVtcInBoeC1jbGljay1sb2FkaW5nXCIsXCJwaHgtY2hhbmdlLWxvYWRpbmdcIixcInBoeC1zdWJtaXQtbG9hZGluZ1wiLFwicGh4LWtleWRvd24tbG9hZGluZ1wiLFwicGh4LWtleXVwLWxvYWRpbmdcIixcInBoeC1ibHVyLWxvYWRpbmdcIixcInBoeC1mb2N1cy1sb2FkaW5nXCJdLGo9XCJkYXRhLXBoeC1jb21wb25lbnRcIixNPVwiZGF0YS1waHgtcmVmXCIsQj1cIltcIi5jb25jYXQoTyxcIl1cIiksVT1bXCJ0ZXh0XCIsXCJ0ZXh0YXJlYVwiLFwibnVtYmVyXCIsXCJlbWFpbFwiLFwicGFzc3dvcmRcIixcInNlYXJjaFwiLFwidGVsXCIsXCJ1cmxcIixcImRhdGVcIixcInRpbWVcIl0sSj1bXCJjaGVja2JveFwiLFwicmFkaW9cIl0sRj1cImRhdGEtcGh4LXN0YXRpY1wiLFY9MSxxPVwicGh4LVwiLFc9e2RlYm91bmNlOjMwMCx0aHJvdHRsZTozMDB9LEs9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gY29uc29sZS5lcnJvciYmY29uc29sZS5lcnJvcihlLHQpfTt2YXIgJD1mdW5jdGlvbihlLHQsbixpKXtlLmxpdmVTb2NrZXQuaXNEZWJ1Z0VuYWJsZWQoKSYmY29uc29sZS5sb2coXCJcIi5jb25jYXQoZS5pZCxcIiBcIikuY29uY2F0KHQsXCI6IFwiKS5jb25jYXQobixcIiAtIFwiKSxpKX0sWD1mdW5jdGlvbihlKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiBlP2U6ZnVuY3Rpb24oKXtyZXR1cm4gZX19LHo9ZnVuY3Rpb24oZSl7cmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZSkpfSxHPWZ1bmN0aW9uKGUsdCxuKXtkb3tpZihlLm1hdGNoZXMoXCJbXCIuY29uY2F0KHQsXCJdXCIpKSlyZXR1cm4gZTtlPWUucGFyZW50RWxlbWVudHx8ZS5wYXJlbnROb2RlfXdoaWxlKG51bGwhPT1lJiYxPT09ZS5ub2RlVHlwZSYmIShuJiZuLmlzU2FtZU5vZGUoZSl8fGUubWF0Y2hlcyhCKSkpO3JldHVybiBudWxsfSxZPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT09ZSYmXCJvYmplY3RcIj09PU4oZSkmJiEoZSBpbnN0YW5jZW9mIEFycmF5KX0sUT1mdW5jdGlvbihlKXtmb3IodmFyIHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0sWj1mdW5jdGlvbihlLHQpe3JldHVybiBlJiZ0KGUpfSxlZT1mdW5jdGlvbihlKXt2YXIgdCxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxpPW5ldyBGb3JtRGF0YShlKSxyPW5ldyBVUkxTZWFyY2hQYXJhbXMsbz1mdW5jdGlvbihlKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgU3ltYm9sfHxudWxsPT1lW1N5bWJvbC5pdGVyYXRvcl0pe2lmKEFycmF5LmlzQXJyYXkoZSl8fChlPUQoZSkpKXt2YXIgdD0wLG49ZnVuY3Rpb24oKXt9O3JldHVybntzOm4sbjpmdW5jdGlvbigpe3JldHVybiB0Pj1lLmxlbmd0aD97ZG9uZTohMH06e2RvbmU6ITEsdmFsdWU6ZVt0KytdfX0sZTpmdW5jdGlvbihlKXt0aHJvdyBlfSxmOm59fXRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKX12YXIgaSxyLG89ITAsYT0hMTtyZXR1cm57czpmdW5jdGlvbigpe2k9ZVtTeW1ib2wuaXRlcmF0b3JdKCl9LG46ZnVuY3Rpb24oKXt2YXIgZT1pLm5leHQoKTtyZXR1cm4gbz1lLmRvbmUsZX0sZTpmdW5jdGlvbihlKXthPSEwLHI9ZX0sZjpmdW5jdGlvbigpe3RyeXtvfHxudWxsPT1pLnJldHVybnx8aS5yZXR1cm4oKX1maW5hbGx5e2lmKGEpdGhyb3cgcn19fX0oaS5lbnRyaWVzKCkpO3RyeXtmb3Ioby5zKCk7ISh0PW8ubigpKS5kb25lOyl7dmFyIGE9TCh0LnZhbHVlLDIpLHU9YVswXSxjPWFbMV07ci5hcHBlbmQodSxjKX19Y2F0Y2goZSl7by5lKGUpfWZpbmFsbHl7by5mKCl9Zm9yKHZhciBzIGluIG4pci5hcHBlbmQocyxuW3NdKTtyZXR1cm4gci50b1N0cmluZygpfSx0ZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuKXtBKHRoaXMsZSksdGhpcy52aWV3SWQ9dCx0aGlzLnJlbmRlcmVkPXt9LHRoaXMubWVyZ2VEaWZmKG4pfXJldHVybiBQKGUsbnVsbCxbe2tleTpcImV4dHJhY3RcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lLnIsbj1lLmUsaT1lLnQ7cmV0dXJuIGRlbGV0ZSBlLnIsZGVsZXRlIGUuZSxkZWxldGUgZS50LHtkaWZmOmUsdGl0bGU6aSxyZXBseTp0fHxudWxsLGV2ZW50czpufHxbXX19fV0pLFAoZSxbe2tleTpcInBhcmVudFZpZXdJZFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlld0lkfX0se2tleTpcInRvU3RyaW5nXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVjdXJzaXZlVG9TdHJpbmcodGhpcy5yZW5kZXJlZCx0aGlzLnJlbmRlcmVkLmMsZSl9fSx7a2V5OlwicmVjdXJzaXZlVG9TdHJpbmdcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06ZS5jLG49YXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDAsaT17YnVmZmVyOlwiXCIsY29tcG9uZW50czp0LG9ubHlDaWRzOm49bj9uZXcgU2V0KG4pOm51bGx9O3JldHVybiB0aGlzLnRvT3V0cHV0QnVmZmVyKGUsaSksaS5idWZmZXJ9fSx7a2V5OlwiY29tcG9uZW50Q0lEc1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3Qua2V5cyhlLmN8fHt9KS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHBhcnNlSW50KGUpfSl9fSx7a2V5OlwiaXNDb21wb25lbnRPbmx5RGlmZlwiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiEhZS5jJiYxPT09T2JqZWN0LmtleXMoZSkubGVuZ3RofX0se2tleTpcImdldENvbXBvbmVudFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY1t0XX19LHtrZXk6XCJtZXJnZURpZmZcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lLmM7aWYoZGVsZXRlIGUuYyx0aGlzLnJlbmRlcmVkPXRoaXMucmVjdXJzaXZlTWVyZ2UodGhpcy5yZW5kZXJlZCxlKSx0aGlzLnJlbmRlcmVkLmM9dGhpcy5yZW5kZXJlZC5jfHx7fSx0KXt2YXIgbj10aGlzLnJlbmRlcmVkLmM7Zm9yKHZhciBpIGluIHQpe3ZhciByPXRbaV0sbz1yLGE9by5zO2lmKFwibnVtYmVyXCI9PXR5cGVvZiBhKXtmb3IoO1wibnVtYmVyXCI9PXR5cGVvZiBhOylhPShvPWE+MD90W2FdOm5bLWFdKS5zO289eihvKSx0aGlzLmRvUmVjdXJzaXZlTWVyZ2UobyxyKSxvLnM9YX1lbHNlIG89bltpXXx8e30sbz10aGlzLnJlY3Vyc2l2ZU1lcmdlKG8scik7dFtpXT1vfWZvcih2YXIgdSBpbiB0KW5bdV09dFt1XTtlLmM9dH19fSx7a2V5OlwicmVjdXJzaXZlTWVyZ2VcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDAhPT10LnM/dDoodGhpcy5kb1JlY3Vyc2l2ZU1lcmdlKGUsdCksZSl9fSx7a2V5OlwiZG9SZWN1cnNpdmVNZXJnZVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIHQpe3ZhciBpPXRbbl0scj1lW25dO1koaSkmJnZvaWQgMD09PWkucyYmWShyKT90aGlzLmRvUmVjdXJzaXZlTWVyZ2UocixpKTplW25dPWl9fX0se2tleTpcImNvbXBvbmVudFRvU3RyaW5nXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVjdXJzaXZlQ0lEVG9TdHJpbmcodGhpcy5yZW5kZXJlZC5jLGUpfX0se2tleTpcInBydW5lQ0lEc1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBkZWxldGUgdC5yZW5kZXJlZC5jW2VdfSl9fSx7a2V5OlwiZ2V0XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlZH19LHtrZXk6XCJpc05ld0ZpbmdlcnByaW50XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4hIShhcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30pLnN9fSx7a2V5OlwidG9PdXRwdXRCdWZmZXJcIix2YWx1ZTpmdW5jdGlvbihlLHQpe2lmKGUuZClyZXR1cm4gdGhpcy5jb21wcmVoZW5zaW9uVG9CdWZmZXIoZSx0KTt2YXIgbj1lLnM7dC5idWZmZXIrPW5bMF07Zm9yKHZhciBpPTE7aTxuLmxlbmd0aDtpKyspdGhpcy5keW5hbWljVG9CdWZmZXIoZVtpLTFdLHQpLHQuYnVmZmVyKz1uW2ldfX0se2tleTpcImNvbXByZWhlbnNpb25Ub0J1ZmZlclwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWUuZCxpPWUucyxyPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPW5bcl07dC5idWZmZXIrPWlbMF07Zm9yKHZhciBhPTE7YTxpLmxlbmd0aDthKyspdGhpcy5keW5hbWljVG9CdWZmZXIob1thLTFdLHQpLHQuYnVmZmVyKz1pW2FdfX19LHtrZXk6XCJkeW5hbWljVG9CdWZmZXJcIix2YWx1ZTpmdW5jdGlvbihlLHQpe1wibnVtYmVyXCI9PXR5cGVvZiBlP3QuYnVmZmVyKz10aGlzLnJlY3Vyc2l2ZUNJRFRvU3RyaW5nKHQuY29tcG9uZW50cyxlLHQub25seUNpZHMpOlkoZSk/dGhpcy50b091dHB1dEJ1ZmZlcihlLHQpOnQuYnVmZmVyKz1lfX0se2tleTpcInJlY3Vyc2l2ZUNJRFRvU3RyaW5nXCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXMscj1lW3RdfHxLKFwibm8gY29tcG9uZW50IGZvciBDSUQgXCIuY29uY2F0KHQpLGUpLG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO28uaW5uZXJIVE1MPXRoaXMucmVjdXJzaXZlVG9TdHJpbmcocixlLG4pO3ZhciBhPW8uY29udGVudCx1PW4mJiFuLmhhcyh0KSxjPUwoQXJyYXkuZnJvbShhLmNoaWxkTm9kZXMpLnJlZHVjZShmdW5jdGlvbihlLG4scil7dmFyIGE9TChlLDIpLGM9YVswXSxzPWFbMV07cmV0dXJuIG4ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERT9uLmdldEF0dHJpYnV0ZShqKT9bYywhMF06KG4uc2V0QXR0cmlidXRlKGosdCksbi5pZHx8KG4uaWQ9XCJcIi5jb25jYXQoaS5wYXJlbnRWaWV3SWQoKSxcIi1cIikuY29uY2F0KHQsXCItXCIpLmNvbmNhdChyKSksdSYmKG4uc2V0QXR0cmlidXRlKFwiZGF0YS1waHgtc2tpcFwiLFwiXCIpLG4uaW5uZXJIVE1MPVwiXCIpLFshMCxzXSk6XCJcIiE9PW4ubm9kZVZhbHVlLnRyaW0oKT8oSyhcIm9ubHkgSFRNTCBlbGVtZW50IHRhZ3MgYXJlIGFsbG93ZWQgYXQgdGhlIHJvb3Qgb2YgY29tcG9uZW50cy5cXG5cXG5cIisnZ290OiBcIicuY29uY2F0KG4ubm9kZVZhbHVlLnRyaW0oKSwnXCJcXG5cXG4nKStcIndpdGhpbjpcXG5cIixvLmlubmVySFRNTC50cmltKCkpLG4ucmVwbGFjZVdpdGgoaS5jcmVhdGVTcGFuKG4ubm9kZVZhbHVlLHQpKSxbITAsc10pOihuLnJlbW92ZSgpLFtjLHNdKX0sWyExLCExXSksMikscz1jWzBdLGw9Y1sxXTtyZXR1cm4gc3x8bD8hcyYmbD8oSyhcImV4cGVjdGVkIGF0IGxlYXN0IG9uZSBIVE1MIGVsZW1lbnQgdGFnIGRpcmVjdGx5IGluc2lkZSBhIGNvbXBvbmVudCwgYnV0IG9ubHkgc3ViY29tcG9uZW50cyB3ZXJlIGZvdW5kLiBBIGNvbXBvbmVudCBtdXN0IHJlbmRlciBhdCBsZWFzdCBvbmUgSFRNTCB0YWcgZGlyZWN0bHkgaW5zaWRlIGl0c2VsZi5cIixvLmlubmVySFRNTC50cmltKCkpLG8uaW5uZXJIVE1MKTpvLmlubmVySFRNTDooSyhcImV4cGVjdGVkIGF0IGxlYXN0IG9uZSBIVE1MIGVsZW1lbnQgdGFnIGluc2lkZSBhIGNvbXBvbmVudCwgYnV0IHRoZSBjb21wb25lbnQgaXMgZW1wdHk6XFxuXCIsby5pbm5lckhUTUwudHJpbSgpKSx0aGlzLmNyZWF0ZVNwYW4oXCJcIix0KS5vdXRlckhUTUwpfX0se2tleTpcImNyZWF0ZVNwYW5cIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO3JldHVybiBuLmlubmVyVGV4dD1lLG4uc2V0QXR0cmlidXRlKGosdCksbn19XSksZX0oKSxuZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuKXt2YXIgaT10aGlzLHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9O2lmKEEodGhpcyxlKSx0aGlzLnVubG9hZGVkPSExLCFufHxcIk9iamVjdFwiPT09bi5jb25zdHJ1Y3Rvci5uYW1lKXRocm93IG5ldyBFcnJvcignXFxuICAgICAgYSBwaG9lbml4IFNvY2tldCBtdXN0IGJlIHByb3ZpZGVkIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIExpdmVTb2NrZXQgY29uc3RydWN0b3IuIEZvciBleGFtcGxlOlxcblxcbiAgICAgICAgICBpbXBvcnQge1NvY2tldH0gZnJvbSBcInBob2VuaXhcIlxcbiAgICAgICAgICBpbXBvcnQge0xpdmVTb2NrZXR9IGZyb20gXCJwaG9lbml4X2xpdmVfdmlld1wiXFxuICAgICAgICAgIGxldCBsaXZlU29ja2V0ID0gbmV3IExpdmVTb2NrZXQoXCIvbGl2ZVwiLCBTb2NrZXQsIHsuLi59KVxcbiAgICAgICcpO3RoaXMuc29ja2V0PW5ldyBuKHQsciksdGhpcy5iaW5kaW5nUHJlZml4PXIuYmluZGluZ1ByZWZpeHx8cSx0aGlzLm9wdHM9cix0aGlzLnBhcmFtcz1YKHIucGFyYW1zfHx7fSksdGhpcy52aWV3TG9nZ2VyPXIudmlld0xvZ2dlcix0aGlzLm1ldGFkYXRhQ2FsbGJhY2tzPXIubWV0YWRhdGF8fHt9LHRoaXMuZGVmYXVsdHM9T2JqZWN0LmFzc2lnbih6KFcpLHIuZGVmYXVsdHN8fHt9KSx0aGlzLmFjdGl2ZUVsZW1lbnQ9bnVsbCx0aGlzLnByZXZBY3RpdmU9bnVsbCx0aGlzLnNpbGVuY2VkPSExLHRoaXMubWFpbj1udWxsLHRoaXMubGlua1JlZj0wLHRoaXMucm9vdHM9e30sdGhpcy5ocmVmPXdpbmRvdy5sb2NhdGlvbi5ocmVmLHRoaXMucGVuZGluZ0xpbms9bnVsbCx0aGlzLmN1cnJlbnRMb2NhdGlvbj16KHdpbmRvdy5sb2NhdGlvbiksdGhpcy5ob29rcz1yLmhvb2tzfHx7fSx0aGlzLmxvYWRlclRpbWVvdXQ9ci5sb2FkZXJUaW1lb3V0fHxWLHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cz0hMSx0aGlzLmRvbUNhbGxiYWNrcz1yLmRvbXx8e29uQmVmb3JlRWxVcGRhdGVkOlgoKX0sd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ1bmxvYWRcIixmdW5jdGlvbihlKXtpLnVubG9hZGVkPSEwfSksdGhpcy5zb2NrZXQub25PcGVuKGZ1bmN0aW9uKCl7aS5pc1VubG9hZGVkKCkmJndpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKX0pfXJldHVybiBQKGUsW3trZXk6XCJpc1Byb2ZpbGVFbmFibGVkXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5cInRydWVcIj09PXNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJwaHg6bGl2ZS1zb2NrZXQ6cHJvZmlsaW5nXCIpfX0se2tleTpcImlzRGVidWdFbmFibGVkXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5cInRydWVcIj09PXNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJwaHg6bGl2ZS1zb2NrZXQ6ZGVidWdcIil9fSx7a2V5OlwiZW5hYmxlRGVidWdcIix2YWx1ZTpmdW5jdGlvbigpe3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oXCJwaHg6bGl2ZS1zb2NrZXQ6ZGVidWdcIixcInRydWVcIil9fSx7a2V5OlwiZW5hYmxlUHJvZmlsaW5nXCIsdmFsdWU6ZnVuY3Rpb24oKXtzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwicGh4OmxpdmUtc29ja2V0OnByb2ZpbGluZ1wiLFwidHJ1ZVwiKX19LHtrZXk6XCJkaXNhYmxlRGVidWdcIix2YWx1ZTpmdW5jdGlvbigpe3Nlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oXCJwaHg6bGl2ZS1zb2NrZXQ6ZGVidWdcIil9fSx7a2V5OlwiZGlzYWJsZVByb2ZpbGluZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7c2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShcInBoeDpsaXZlLXNvY2tldDpwcm9maWxpbmdcIil9fSx7a2V5OlwiZW5hYmxlTGF0ZW5jeVNpbVwiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuZW5hYmxlRGVidWcoKSxjb25zb2xlLmxvZyhcImxhdGVuY3kgc2ltdWxhdG9yIGVuYWJsZWQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGlzIGJyb3dzZXIgc2Vzc2lvbi4gQ2FsbCBkaXNhYmxlTGF0ZW5jeVNpbSgpIHRvIGRpc2FibGVcIiksc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInBoeDpsaXZlLXNvY2tldDpsYXRlbmN5LXNpbVwiLGUpfX0se2tleTpcImRpc2FibGVMYXRlbmN5U2ltXCIsdmFsdWU6ZnVuY3Rpb24oKXtzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFwicGh4OmxpdmUtc29ja2V0OmxhdGVuY3ktc2ltXCIpfX0se2tleTpcImdldExhdGVuY3lTaW1cIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJwaHg6bGl2ZS1zb2NrZXQ6bGF0ZW5jeS1zaW1cIik7cmV0dXJuIGU/cGFyc2VJbnQoZSk6bnVsbH19LHtrZXk6XCJnZXRTb2NrZXRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNvY2tldH19LHtrZXk6XCJjb25uZWN0XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZnVuY3Rpb24oKXtlLmpvaW5Sb290Vmlld3MoKSYmKGUuYmluZFRvcExldmVsRXZlbnRzKCksZS5zb2NrZXQuY29ubmVjdCgpKX07W1wiY29tcGxldGVcIixcImxvYWRlZFwiLFwiaW50ZXJhY3RpdmVcIl0uaW5kZXhPZihkb2N1bWVudC5yZWFkeVN0YXRlKT49MD90KCk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIixmdW5jdGlvbigpe3JldHVybiB0KCl9KX19LHtrZXk6XCJkaXNjb25uZWN0XCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5zb2NrZXQuZGlzY29ubmVjdChlKX19LHtrZXk6XCJ0cmlnZ2VyRE9NXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbjsobj10aGlzLmRvbUNhbGxiYWNrcylbZV0uYXBwbHkobix4KHQpKX19LHtrZXk6XCJ0aW1lXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtpZighdGhpcy5pc1Byb2ZpbGVFbmFibGVkKCl8fCFjb25zb2xlLnRpbWUpcmV0dXJuIHQoKTtjb25zb2xlLnRpbWUoZSk7dmFyIG49dCgpO3JldHVybiBjb25zb2xlLnRpbWVFbmQoZSksbn19LHtrZXk6XCJsb2dcIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7aWYodGhpcy52aWV3TG9nZ2VyKXt2YXIgaT1MKG4oKSwyKSxyPWlbMF0sbz1pWzFdO3RoaXMudmlld0xvZ2dlcihlLHQscixvKX1lbHNlIGlmKHRoaXMuaXNEZWJ1Z0VuYWJsZWQoKSl7dmFyIGE9TChuKCksMiksdT1hWzBdLGM9YVsxXTskKGUsdCx1LGMpfX19LHtrZXk6XCJvbkNoYW5uZWxcIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7dmFyIGk9dGhpcztlLm9uKHQsZnVuY3Rpb24oZSl7dmFyIHQ9aS5nZXRMYXRlbmN5U2ltKCk7dD8oY29uc29sZS5sb2coXCJzaW11bGF0aW5nIFwiLmNvbmNhdCh0LFwibXMgb2YgbGF0ZW5jeSBmcm9tIHNlcnZlciB0byBjbGllbnRcIikpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gbihlKX0sdCkpOm4oZSl9KX19LHtrZXk6XCJ3cmFwUHVzaFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0TGF0ZW5jeVNpbSgpO2lmKCF0KXJldHVybiBlKCk7Y29uc29sZS5sb2coXCJzaW11bGF0aW5nIFwiLmNvbmNhdCh0LFwibXMgb2YgbGF0ZW5jeSBmcm9tIGNsaWVudCB0byBzZXJ2ZXJcIikpO3ZhciBuPXtyZWNlaXZlczpbXSxyZWNlaXZlOmZ1bmN0aW9uKGUsdCl7dGhpcy5yZWNlaXZlcy5wdXNoKFtlLHRdKX19O3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5yZWNlaXZlcy5yZWR1Y2UoZnVuY3Rpb24oZSx0KXt2YXIgbj1MKHQsMiksaT1uWzBdLHI9blsxXTtyZXR1cm4gZS5yZWNlaXZlKGkscil9LGUoKSl9LHQpLG59fSx7a2V5OlwicmVsb2FkV2l0aEppdHRlclwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7ZS5kZXN0cm95KCksdGhpcy5kaXNjb25uZWN0KCk7dmFyIG49UlswXSxpPVJbMV0scj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKGktbisxKSkrbixvPWllLnVwZGF0ZUxvY2FsKGUubmFtZSgpLFwiY29uc2VjdXRpdmUtcmVsb2Fkc1wiLDAsZnVuY3Rpb24oZSl7cmV0dXJuIGUrMX0pO3RoaXMubG9nKGUsXCJqb2luXCIsZnVuY3Rpb24oKXtyZXR1cm5bXCJlbmNvdW50ZXJlZCBcIi5jb25jYXQobyxcIiBjb25zZWN1dGl2ZSByZWxvYWRzXCIpXX0pLG8+MTAmJih0aGlzLmxvZyhlLFwiam9pblwiLGZ1bmN0aW9uKCl7cmV0dXJuW1wiZXhjZWVkZWQgXCIuY29uY2F0KDEwLFwiIGNvbnNlY3V0aXZlIHJlbG9hZHMuIEVudGVyaW5nIGZhaWxzYWZlIG1vZGVcIildfSkscj0zZTQpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0Lmhhc1BlbmRpbmdMaW5rKCk/d2luZG93LmxvY2F0aW9uPXQucGVuZGluZ0xpbms6d2luZG93LmxvY2F0aW9uLnJlbG9hZCgpfSxyKX19LHtrZXk6XCJnZXRIb29rQ2FsbGJhY2tzXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuaG9va3NbZV19fSx7a2V5OlwiaXNVbmxvYWRlZFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5sb2FkZWR9fSx7a2V5OlwiaXNDb25uZWN0ZWRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpfX0se2tleTpcImdldEJpbmRpbmdQcmVmaXhcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJpbmRpbmdQcmVmaXh9fSx7a2V5OlwiYmluZGluZ1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVyblwiXCIuY29uY2F0KHRoaXMuZ2V0QmluZGluZ1ByZWZpeCgpKS5jb25jYXQoZSl9fSx7a2V5OlwiY2hhbm5lbFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuc29ja2V0LmNoYW5uZWwoZSx0KX19LHtrZXk6XCJqb2luUm9vdFZpZXdzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ITE7cmV0dXJuIHJlLmFsbChkb2N1bWVudCxcIlwiLmNvbmNhdChCLFwiOm5vdChbXCIpLmNvbmNhdChcImRhdGEtcGh4LXBhcmVudC1pZFwiLFwiXSlcIiksZnVuY3Rpb24obil7aWYoIWUuZ2V0Um9vdEJ5SWQobi5pZCkpe3ZhciBpPWUuam9pblJvb3RWaWV3KG4sZS5nZXRIcmVmKCkpO2Uucm9vdD1lLnJvb3R8fGksbi5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1tYWluXCIpJiYoZS5tYWluPWkpfXQ9ITB9KSx0fX0se2tleTpcInJlZGlyZWN0XCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt0aGlzLmRpc2Nvbm5lY3QoKSxpZS5yZWRpcmVjdChlLHQpfX0se2tleTpcInJlcGxhY2VNYWluXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwscj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106dGhpcy5zZXRQZW5kaW5nTGluayhlKSxvPXRoaXMubWFpbi5lbDt0aGlzLm1haW4uc2hvd0xvYWRlcih0aGlzLmxvYWRlclRpbWVvdXQpLHRoaXMubWFpbi5kZXN0cm95KCksaWUuZmV0Y2hQYWdlKGUsZnVuY3Rpb24oYSx1KXtpZigyMDAhPT1hKXJldHVybiBuLnJlZGlyZWN0KGUpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtjLmlubmVySFRNTD11O3ZhciBzPWMuY29udGVudC5jaGlsZE5vZGVzWzBdO2lmKCFzfHwhbi5pc1BoeFZpZXcocykpcmV0dXJuIG4ucmVkaXJlY3QoZSk7bi5qb2luUm9vdFZpZXcocyxlLHQsZnVuY3Rpb24oZSx0KXsxPT09dCYmKG4uY29tbWl0UGVuZGluZ0xpbmsocik/KG8ucmVwbGFjZVdpdGgoZS5lbCksbi5tYWluPWUsaSYmaSgpKTplLmRlc3Ryb3koKSl9KX0pfX0se2tleTpcImlzUGh4Vmlld1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSYmbnVsbCE9PWUuZ2V0QXR0cmlidXRlKE8pfX0se2tleTpcImpvaW5Sb290Vmlld1wiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLGkpe3ZhciByPW5ldyB1ZShlLHRoaXMsbnVsbCx0LG4pO3JldHVybiB0aGlzLnJvb3RzW3IuaWRdPXIsci5qb2luKGkpLHJ9fSx7a2V5Olwib3duZXJcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMsaT1aKGUuY2xvc2VzdChCKSxmdW5jdGlvbihlKXtyZXR1cm4gbi5nZXRWaWV3QnlFbChlKX0pO2kmJnQoaSl9fSx7a2V5Olwid2l0aGluT3duZXJzXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3RoaXMub3duZXIoZSxmdW5jdGlvbihpKXt2YXIgcj1lLmdldEF0dHJpYnV0ZShuLmJpbmRpbmcoXCJ0YXJnZXRcIikpO251bGw9PT1yP3QoaSxlKTppLndpdGhpblRhcmdldHMocix0KX0pfX0se2tleTpcImdldFZpZXdCeUVsXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1yb290LWlkXCIpO3JldHVybiBaKHRoaXMuZ2V0Um9vdEJ5SWQodCksZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0RGVzY2VuZGVudEJ5RWwoZSl9KX19LHtrZXk6XCJnZXRSb290QnlJZFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJvb3RzW2VdfX0se2tleTpcImRlc3Ryb3lBbGxWaWV3c1wiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHRoaXMucm9vdHMpdGhpcy5yb290c1tlXS5kZXN0cm95KCksZGVsZXRlIHRoaXMucm9vdHNbZV19fSx7a2V5OlwiZGVzdHJveVZpZXdCeUVsXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXRSb290QnlJZChlLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LXJvb3QtaWRcIikpO3QmJnQuZGVzdHJveURlc2NlbmRlbnQoZS5pZCl9fSx7a2V5Olwic2V0QWN0aXZlRWxlbWVudFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYodGhpcy5hY3RpdmVFbGVtZW50IT09ZSl7dGhpcy5hY3RpdmVFbGVtZW50PWU7dmFyIG49ZnVuY3Rpb24oKXtlPT09dC5hY3RpdmVFbGVtZW50JiYodC5hY3RpdmVFbGVtZW50PW51bGwpLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIix0KSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLHQpfTtlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsbiksZS5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIixuKX19fSx7a2V5OlwiZ2V0QWN0aXZlRWxlbWVudFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1kb2N1bWVudC5ib2R5P3RoaXMuYWN0aXZlRWxlbWVudHx8ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDpkb2N1bWVudC5hY3RpdmVFbGVtZW50fHxkb2N1bWVudC5ib2R5fX0se2tleTpcImRyb3BBY3RpdmVFbGVtZW50XCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5wcmV2QWN0aXZlJiZlLm93bnNFbGVtZW50KHRoaXMucHJldkFjdGl2ZSkmJih0aGlzLnByZXZBY3RpdmU9bnVsbCl9fSx7a2V5OlwicmVzdG9yZVByZXZpb3VzbHlBY3RpdmVGb2N1c1wiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5wcmV2QWN0aXZlJiZ0aGlzLnByZXZBY3RpdmUhPT1kb2N1bWVudC5ib2R5JiZ0aGlzLnByZXZBY3RpdmUuZm9jdXMoKX19LHtrZXk6XCJibHVyQWN0aXZlRWxlbWVudFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5wcmV2QWN0aXZlPXRoaXMuZ2V0QWN0aXZlRWxlbWVudCgpLHRoaXMucHJldkFjdGl2ZSE9PWRvY3VtZW50LmJvZHkmJnRoaXMucHJldkFjdGl2ZS5ibHVyKCl9fSx7a2V5OlwiYmluZFRvcExldmVsRXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuYm91bmRUb3BMZXZlbEV2ZW50c3x8KHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cz0hMCx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VzaG93XCIsZnVuY3Rpb24odCl7dC5wZXJzaXN0ZWQmJihlLndpdGhQYWdlTG9hZGluZyh7dG86d2luZG93LmxvY2F0aW9uLmhyZWYsa2luZDpcInJlZGlyZWN0XCJ9KSx3aW5kb3cubG9jYXRpb24ucmVsb2FkKCkpfSksdGhpcy5iaW5kQ2xpY2tzKCksdGhpcy5iaW5kTmF2KCksdGhpcy5iaW5kRm9ybXMoKSx0aGlzLmJpbmQoe2tleXVwOlwia2V5dXBcIixrZXlkb3duOlwia2V5ZG93blwifSxmdW5jdGlvbih0LG4saSxyLG8sYSx1KXt2YXIgYz1yLmdldEF0dHJpYnV0ZShlLmJpbmRpbmcoXCJrZXlcIikpLHM9dC5rZXkmJnQua2V5LnRvTG93ZXJDYXNlKCk7YyYmYy50b0xvd2VyQ2FzZSgpIT09c3x8aS5wdXNoS2V5KHIsbyxuLGEsZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW3RdP2FyZ3VtZW50c1t0XTp7fTt0JTI/dyhPYmplY3QobiksITApLmZvckVhY2goZnVuY3Rpb24odCl7RShlLHQsblt0XSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTp3KE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KSl9KX1yZXR1cm4gZX0oe2tleTp0LmtleX0sZS5ldmVudE1ldGEobix0LHIpKSl9KSx0aGlzLmJpbmQoe2JsdXI6XCJmb2N1c291dFwiLGZvY3VzOlwiZm9jdXNpblwifSxmdW5jdGlvbih0LG4saSxyLG8sYSx1KXt1fHxpLnB1c2hFdmVudChuLHIsbyxhLGUuZXZlbnRNZXRhKG4sdCxyKSl9KSx0aGlzLmJpbmQoe2JsdXI6XCJibHVyXCIsZm9jdXM6XCJmb2N1c1wifSxmdW5jdGlvbih0LG4saSxyLG8sYSx1KXt1JiZcIndpbmRvd1wiIT09IXUmJmkucHVzaEV2ZW50KG4scixvLGEsZS5ldmVudE1ldGEobix0LHIpKX0pKX19LHtrZXk6XCJldmVudE1ldGFcIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7dmFyIGk9dGhpcy5tZXRhZGF0YUNhbGxiYWNrc1tlXTtyZXR1cm4gaT9pKHQsbik6e319fSx7a2V5Olwic2V0UGVuZGluZ0xpbmtcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5saW5rUmVmKyssdGhpcy5wZW5kaW5nTGluaz1lLHRoaXMubGlua1JlZn19LHtrZXk6XCJjb21taXRQZW5kaW5nTGlua1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmxpbmtSZWY9PT1lJiYodGhpcy5ocmVmPXRoaXMucGVuZGluZ0xpbmssdGhpcy5wZW5kaW5nTGluaz1udWxsLCEwKX19LHtrZXk6XCJnZXRIcmVmXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ocmVmfX0se2tleTpcImhhc1BlbmRpbmdMaW5rXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMucGVuZGluZ0xpbmt9fSx7a2V5OlwiYmluZFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcyxpPWZ1bmN0aW9uKGkpe3ZhciByPWVbaV07bi5vbihyLGZ1bmN0aW9uKGUpe3ZhciByPW4uYmluZGluZyhpKSxvPW4uYmluZGluZyhcIndpbmRvdy1cIi5jb25jYXQoaSkpLGE9ZS50YXJnZXQuZ2V0QXR0cmlidXRlJiZlLnRhcmdldC5nZXRBdHRyaWJ1dGUocik7YT9uLmRlYm91bmNlKGUudGFyZ2V0LGUsZnVuY3Rpb24oKXtuLndpdGhpbk93bmVycyhlLnRhcmdldCxmdW5jdGlvbihuLHIpe3QoZSxpLG4sZS50YXJnZXQscixhLG51bGwpfSl9KTpyZS5hbGwoZG9jdW1lbnQsXCJbXCIuY29uY2F0KG8sXCJdXCIpLGZ1bmN0aW9uKHIpe3ZhciBhPXIuZ2V0QXR0cmlidXRlKG8pO24uZGVib3VuY2UocixlLGZ1bmN0aW9uKCl7bi53aXRoaW5Pd25lcnMocixmdW5jdGlvbihuLG8pe3QoZSxpLG4scixvLGEsXCJ3aW5kb3dcIil9KX0pfSl9KX07Zm9yKHZhciByIGluIGUpaShyKX19LHtrZXk6XCJiaW5kQ2xpY2tzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO1shMCwhMV0uZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbj10P2UuYmluZGluZyhcImNhcHR1cmUtY2xpY2tcIik6ZS5iaW5kaW5nKFwiY2xpY2tcIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLGZ1bmN0aW9uKGkpe3ZhciByPW51bGwsbz0ocj10P2kudGFyZ2V0Lm1hdGNoZXMoXCJbXCIuY29uY2F0KG4sXCJdXCIpKT9pLnRhcmdldDppLnRhcmdldC5xdWVyeVNlbGVjdG9yKFwiW1wiLmNvbmNhdChuLFwiXVwiKSk6RyhpLnRhcmdldCxuKSkmJnIuZ2V0QXR0cmlidXRlKG4pO28mJihcIiNcIj09PXIuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSYmaS5wcmV2ZW50RGVmYXVsdCgpLGUuZGVib3VuY2UocixpLGZ1bmN0aW9uKCl7ZS53aXRoaW5Pd25lcnMocixmdW5jdGlvbih0LG4pe3QucHVzaEV2ZW50KFwiY2xpY2tcIixyLG4sbyxlLmV2ZW50TWV0YShcImNsaWNrXCIsaSxyKSl9KX0pKX0sdCl9KX19LHtrZXk6XCJiaW5kTmF2XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKGllLmNhblB1c2hTdGF0ZSgpKXtoaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uJiYoaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbj1cIm1hbnVhbFwiKTt2YXIgdD1udWxsO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsZnVuY3Rpb24oZSl7Y2xlYXJUaW1lb3V0KHQpLHQ9c2V0VGltZW91dChmdW5jdGlvbigpe2llLnVwZGF0ZUN1cnJlbnRTdGF0ZShmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihlLHtzY3JvbGw6d2luZG93LnNjcm9sbFl9KX0pfSwxMDApfSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLGZ1bmN0aW9uKHQpe2lmKGUucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pKXt2YXIgbj10LnN0YXRlfHx7fSxpPW4udHlwZSxyPW4uaWQsbz1uLnJvb3QsYT1uLnNjcm9sbCx1PXdpbmRvdy5sb2NhdGlvbi5ocmVmO2UubWFpbi5pc0Nvbm5lY3RlZCgpJiZcInBhdGNoXCI9PT1pJiZyPT09ZS5tYWluLmlkP2UubWFpbi5wdXNoTGlua1BhdGNoKHUsbnVsbCk6ZS5yZXBsYWNlTWFpbih1LG51bGwsZnVuY3Rpb24oKXtvJiZlLnJlcGxhY2VSb290SGlzdG9yeSgpLFwibnVtYmVyXCI9PXR5cGVvZiBhJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7d2luZG93LnNjcm9sbFRvKDAsYSl9LDApfSl9fSwhMSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLGZ1bmN0aW9uKHQpe3ZhciBuPUcodC50YXJnZXQsXCJkYXRhLXBoeC1saW5rXCIpLGk9biYmbi5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1saW5rXCIpLHI9dC5tZXRhS2V5fHx0LmN0cmxLZXl8fDE9PT10LmJ1dHRvbjtpZihpJiZlLmlzQ29ubmVjdGVkKCkmJmUubWFpbiYmIXIpe3ZhciBvPW4uaHJlZixhPW4uZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtbGluay1zdGF0ZVwiKTtpZih0LnByZXZlbnREZWZhdWx0KCksZS5wZW5kaW5nTGluayE9PW8paWYoXCJwYXRjaFwiPT09aSllLnB1c2hIaXN0b3J5UGF0Y2gobyxhLG4pO2Vsc2V7aWYoXCJyZWRpcmVjdFwiIT09aSl0aHJvdyBuZXcgRXJyb3IoXCJleHBlY3RlZCBcIi5jb25jYXQoXCJkYXRhLXBoeC1saW5rXCIsJyB0byBiZSBcInBhdGNoXCIgb3IgXCJyZWRpcmVjdFwiLCBnb3Q6ICcpLmNvbmNhdChpKSk7ZS5oaXN0b3J5UmVkaXJlY3QobyxhKX19fSwhMSl9fX0se2tleTpcIndpdGhQYWdlTG9hZGluZ1wiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmUuZGlzcGF0Y2hFdmVudCh3aW5kb3csXCJwaHg6cGFnZS1sb2FkaW5nLXN0YXJ0XCIsZSk7dmFyIG49ZnVuY3Rpb24oKXtyZXR1cm4gcmUuZGlzcGF0Y2hFdmVudCh3aW5kb3csXCJwaHg6cGFnZS1sb2FkaW5nLXN0b3BcIixlKX07cmV0dXJuIHQ/dChuKTpufX0se2tleTpcInB1c2hIaXN0b3J5UGF0Y2hcIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7dmFyIGk9dGhpczt0aGlzLndpdGhQYWdlTG9hZGluZyh7dG86ZSxraW5kOlwicGF0Y2hcIn0sZnVuY3Rpb24ocil7aS5tYWluLnB1c2hMaW5rUGF0Y2goZSxuLGZ1bmN0aW9uKCl7aS5oaXN0b3J5UGF0Y2goZSx0KSxyKCl9KX0pfX0se2tleTpcImhpc3RvcnlQYXRjaFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7aWUucHVzaFN0YXRlKHQse3R5cGU6XCJwYXRjaFwiLGlkOnRoaXMubWFpbi5pZH0sZSksdGhpcy5yZWdpc3Rlck5ld0xvY2F0aW9uKHdpbmRvdy5sb2NhdGlvbil9fSx7a2V5OlwiaGlzdG9yeVJlZGlyZWN0XCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXMscj13aW5kb3cuc2Nyb2xsWTt0aGlzLndpdGhQYWdlTG9hZGluZyh7dG86ZSxraW5kOlwicmVkaXJlY3RcIn0sZnVuY3Rpb24obyl7aS5yZXBsYWNlTWFpbihlLG4sZnVuY3Rpb24oKXtpZS5wdXNoU3RhdGUodCx7dHlwZTpcInJlZGlyZWN0XCIsaWQ6aS5tYWluLmlkLHNjcm9sbDpyfSxlKSxpLnJlZ2lzdGVyTmV3TG9jYXRpb24od2luZG93LmxvY2F0aW9uKSxvKCl9KX0pfX0se2tleTpcInJlcGxhY2VSb290SGlzdG9yeVwiLHZhbHVlOmZ1bmN0aW9uKCl7aWUucHVzaFN0YXRlKFwicmVwbGFjZVwiLHtyb290OiEwLHR5cGU6XCJwYXRjaFwiLGlkOnRoaXMubWFpbi5pZH0pfX0se2tleTpcInJlZ2lzdGVyTmV3TG9jYXRpb25cIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmN1cnJlbnRMb2NhdGlvbjtyZXR1cm4gdC5wYXRobmFtZSt0LnNlYXJjaCE9PWUucGF0aG5hbWUrZS5zZWFyY2gmJih0aGlzLmN1cnJlbnRMb2NhdGlvbj16KGUpLCEwKX19LHtrZXk6XCJiaW5kRm9ybXNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD0wO3RoaXMub24oXCJzdWJtaXRcIixmdW5jdGlvbih0KXt2YXIgbj10LnRhcmdldC5nZXRBdHRyaWJ1dGUoZS5iaW5kaW5nKFwic3VibWl0XCIpKTtuJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQudGFyZ2V0LmRpc2FibGVkPSEwLGUud2l0aGluT3duZXJzKHQudGFyZ2V0LGZ1bmN0aW9uKGUsaSl7cmV0dXJuIGUuc3VibWl0Rm9ybSh0LnRhcmdldCxpLG4pfSkpfSwhMSk7Zm9yKHZhciBuPWZ1bmN0aW9uKCl7dmFyIG49cltpXTtlLm9uKG4sZnVuY3Rpb24oaSl7dmFyIHI9aS50YXJnZXQsbz1yLmZvcm0mJnIuZm9ybS5nZXRBdHRyaWJ1dGUoZS5iaW5kaW5nKFwiY2hhbmdlXCIpKTtpZihvJiYoXCJudW1iZXJcIiE9PXIudHlwZXx8IXIudmFsaWRpdHl8fCFyLnZhbGlkaXR5LmJhZElucHV0KSl7dmFyIGE9dDt0Kys7dmFyIHU9cmUucHJpdmF0ZShyLFwicHJldi1pdGVyYXRpb25cIil8fHt9LGM9dS5hdCxzPXUudHlwZTtjPT09YS0xJiZuIT09c3x8KHJlLnB1dFByaXZhdGUocixcInByZXYtaXRlcmF0aW9uXCIse2F0OmEsdHlwZTpufSksZS5kZWJvdW5jZShyLGksZnVuY3Rpb24oKXtlLndpdGhpbk93bmVycyhyLmZvcm0sZnVuY3Rpb24odCxuKXtyZS5wdXRQcml2YXRlKHIsXCJwaHgtaGFzLWZvY3VzZWRcIiwhMCkscmUuaXNUZXh0dWFsSW5wdXQocil8fGUuc2V0QWN0aXZlRWxlbWVudChyKSx0LnB1c2hJbnB1dChyLG4sbyxpLnRhcmdldCl9KX0pKX19LCExKX0saT0wLHI9W1wiY2hhbmdlXCIsXCJpbnB1dFwiXTtpPHIubGVuZ3RoO2krKyluKCl9fSx7a2V5OlwiZGVib3VuY2VcIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7dmFyIGk9dGhpcy5iaW5kaW5nKFwiZGVib3VuY2VcIikscj10aGlzLmJpbmRpbmcoXCJ0aHJvdHRsZVwiKSxvPXRoaXMuZGVmYXVsdHMuZGVib3VuY2UudG9TdHJpbmcoKSxhPXRoaXMuZGVmYXVsdHMudGhyb3R0bGUudG9TdHJpbmcoKTtyZS5kZWJvdW5jZShlLHQsaSxvLHIsYSxuKX19LHtrZXk6XCJzaWxlbmNlRXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5zaWxlbmNlZD0hMCxlKCksdGhpcy5zaWxlbmNlZD0hMX19LHtrZXk6XCJvblwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpczt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGUpe24uc2lsZW5jZWR8fHQoZSl9KX19XSksZX0oKSxpZT17Y2FuUHVzaFN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PWhpc3RvcnkucHVzaFN0YXRlfSxkcm9wTG9jYWw6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMubG9jYWxLZXkoZSx0KSl9LHVwZGF0ZUxvY2FsOmZ1bmN0aW9uKGUsdCxuLGkpe3ZhciByPXRoaXMuZ2V0TG9jYWwoZSx0KSxvPXRoaXMubG9jYWxLZXkoZSx0KSxhPW51bGw9PT1yP246aShyKTtyZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKG8sSlNPTi5zdHJpbmdpZnkoYSkpLGF9LGdldExvY2FsOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIEpTT04ucGFyc2Uod2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxLZXkoZSx0KSkpfSxmZXRjaFBhZ2U6ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3Q7bi5vcGVuKFwiR0VUXCIsZSwhMCksbi50aW1lb3V0PTNlNCxuLnNldFJlcXVlc3RIZWFkZXIoXCJjb250ZW50LXR5cGVcIixcInRleHQvaHRtbFwiKSxuLnNldFJlcXVlc3RIZWFkZXIoXCJjYWNoZS1jb250cm9sXCIsXCJtYXgtYWdlPTAsIG5vLWNhY2hlLCBuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBwb3N0LWNoZWNrPTAsIHByZS1jaGVjaz0wXCIpLG4uc2V0UmVxdWVzdEhlYWRlcihcIngtcmVxdWVzdGVkLXdpdGhcIixcImxpdmUtbGlua1wiKSxuLm9uZXJyb3I9ZnVuY3Rpb24oKXtyZXR1cm4gdCg0MDApfSxuLm9udGltZW91dD1mdW5jdGlvbigpe3JldHVybiB0KDUwNCl9LG4ub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoND09PW4ucmVhZHlTdGF0ZSl7dmFyIGk9bmV3IFVSTChlKSxyPWkucGF0aG5hbWUraS5zZWFyY2gsbz1aKG4uZ2V0UmVzcG9uc2VIZWFkZXIoXCJ4LXJlc3BvbnNlLXVybFwiKXx8bi5yZXNwb25zZVVSTCxmdW5jdGlvbihlKXtyZXR1cm4gbmV3IFVSTChlKX0pLGE9bz9vLnBhdGhuYW1lK28uc2VhcmNoOm51bGw7cmV0dXJuXCJsaXZlLWxpbmtcIiE9PW4uZ2V0UmVzcG9uc2VIZWFkZXIoXCJ4LXJlcXVlc3RlZC13aXRoXCIpP3QoNDAwKTpudWxsPT09b3x8YSE9cj90KDMwMik6MjAwIT09bi5zdGF0dXM/dChuLnN0YXR1cyk6dm9pZCB0KDIwMCxuLnJlc3BvbnNlVGV4dCl9fSxuLnNlbmQoKX0sdXBkYXRlQ3VycmVudFN0YXRlOmZ1bmN0aW9uKGUpe3RoaXMuY2FuUHVzaFN0YXRlKCkmJmhpc3RvcnkucmVwbGFjZVN0YXRlKGUoaGlzdG9yeS5zdGF0ZXx8e30pLFwiXCIsd2luZG93LmxvY2F0aW9uLmhyZWYpfSxwdXNoU3RhdGU6ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuY2FuUHVzaFN0YXRlKCkpe2lmKG4hPT13aW5kb3cubG9jYXRpb24uaHJlZil7aWYoXCJyZWRpcmVjdFwiPT10LnR5cGUmJnQuc2Nyb2xsKXt2YXIgaT1oaXN0b3J5LnN0YXRlfHx7fTtpLnNjcm9sbD10LnNjcm9sbCxoaXN0b3J5LnJlcGxhY2VTdGF0ZShpLFwiXCIsd2luZG93LmxvY2F0aW9uLmhyZWYpfWRlbGV0ZSB0LnNjcm9sbCxoaXN0b3J5W2UrXCJTdGF0ZVwiXSh0LFwiXCIsbnx8bnVsbCk7dmFyIHI9dGhpcy5nZXRIYXNoVGFyZ2V0RWwod2luZG93LmxvY2F0aW9uLmhhc2gpO3I/ci5zY3JvbGxJbnRvVmlldygpOlwicmVkaXJlY3RcIj09PXQudHlwZSYmd2luZG93LnNjcm9sbCgwLDApfX1lbHNlIHRoaXMucmVkaXJlY3Qobil9LHNldENvb2tpZTpmdW5jdGlvbihlLHQpe2RvY3VtZW50LmNvb2tpZT1cIlwiLmNvbmNhdChlLFwiPVwiKS5jb25jYXQodCl9LGdldENvb2tpZTpmdW5jdGlvbihlKXtyZXR1cm4gZG9jdW1lbnQuY29va2llLnJlcGxhY2UobmV3IFJlZ0V4cChcIig/Oig/Ol58Lio7cyopXCIuY29uY2F0KGUsXCJzKj1zKihbXjtdKikuKiQpfF4uKiRcIikpLFwiJDFcIil9LHJlZGlyZWN0OmZ1bmN0aW9uKGUsdCl7dCYmaWUuc2V0Q29va2llKFwiX19waG9lbml4X2ZsYXNoX19cIix0K1wiOyBtYXgtYWdlPTYwMDAwOyBwYXRoPS9cIiksd2luZG93LmxvY2F0aW9uPWV9LGxvY2FsS2V5OmZ1bmN0aW9uKGUsdCl7cmV0dXJuXCJcIi5jb25jYXQoZSxcIi1cIikuY29uY2F0KHQpfSxnZXRIYXNoVGFyZ2V0RWw6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50b1N0cmluZygpLnN1YnN0cmluZygxKTtpZihcIlwiIT09dClyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodCl8fGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2FbbmFtZT1cIicuY29uY2F0KHQsJ1wiXScpKX19LHJlPXtieUlkOmZ1bmN0aW9uKGUpe3JldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKXx8SyhcIm5vIGlkIGZvdW5kIGZvciBcIi5jb25jYXQoZSkpfSxyZW1vdmVDbGFzczpmdW5jdGlvbihlLHQpe2UuY2xhc3NMaXN0LnJlbW92ZSh0KSwwPT09ZS5jbGFzc0xpc3QubGVuZ3RoJiZlLnJlbW92ZUF0dHJpYnV0ZShcImNsYXNzXCIpfSxhbGw6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPUFycmF5LmZyb20oZS5xdWVyeVNlbGVjdG9yQWxsKHQpKTtyZXR1cm4gbj9pLmZvckVhY2gobik6aX0sZmluZENvbXBvbmVudE5vZGVMaXN0OmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5hbGwoZSxCKSxpPXRoaXMuYWxsKGUsXCJbXCIuY29uY2F0KGosJz1cIicpLmNvbmNhdCh0LCdcIl0nKSk7cmV0dXJuIDA9PT1uLmxlbmd0aD9pOmkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFuLnNvbWUoZnVuY3Rpb24odCl7cmV0dXJuIHQuY29udGFpbnMoZSl9KX0pfSxmaW5kUGh4Q2hpbGRyZW5JbkZyYWdtZW50OmZ1bmN0aW9uKGUsdCl7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO3JldHVybiBuLmlubmVySFRNTD1lLHRoaXMuZmluZFBoeENoaWxkcmVuKG4uY29udGVudCx0KX0saXNQaHhVcGRhdGU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLmdldEF0dHJpYnV0ZSYmbi5pbmRleE9mKGUuZ2V0QXR0cmlidXRlKHQpKT49MH0sZmluZFBoeENoaWxkcmVuOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYWxsKGUsXCJcIi5jb25jYXQoQixcIltcIikuY29uY2F0KFwiZGF0YS1waHgtcGFyZW50LWlkXCIsJz1cIicpLmNvbmNhdCh0LCdcIl0nKSl9LGZpbmRQYXJlbnRDSURzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcyxpPW5ldyBTZXQodCk7cmV0dXJuIHQucmVkdWNlKGZ1bmN0aW9uKHQsaSl7dmFyIHI9XCJbXCIuY29uY2F0KGosJz1cIicpLmNvbmNhdChpLCdcIl0gWycpLmNvbmNhdChqLFwiXVwiKTtyZXR1cm4gbi5hbGwoZSxyKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHBhcnNlSW50KGUuZ2V0QXR0cmlidXRlKGopKX0pLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIHQuZGVsZXRlKGUpfSksdH0saSl9LHByaXZhdGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5waHhQcml2YXRlJiZlLnBoeFByaXZhdGVbdF19LGRlbGV0ZVByaXZhdGU6ZnVuY3Rpb24oZSx0KXtlLnBoeFByaXZhdGUmJmRlbGV0ZSBlLnBoeFByaXZhdGVbdF19LHB1dFByaXZhdGU6ZnVuY3Rpb24oZSx0LG4pe2UucGh4UHJpdmF0ZXx8KGUucGh4UHJpdmF0ZT17fSksZS5waHhQcml2YXRlW3RdPW59LGNvcHlQcml2YXRlczpmdW5jdGlvbihlLHQpe3QucGh4UHJpdmF0ZSYmKGUucGh4UHJpdmF0ZT16KHQucGh4UHJpdmF0ZSkpfSxwdXRUaXRsZTpmdW5jdGlvbihlKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwidGl0bGVcIikuZGF0YXNldCxuPXQucHJlZml4LGk9dC5zdWZmaXg7ZG9jdW1lbnQudGl0bGU9XCJcIi5jb25jYXQobnx8XCJcIikuY29uY2F0KGUpLmNvbmNhdChpfHxcIlwiKX0sZGVib3VuY2U6ZnVuY3Rpb24oZSx0LG4saSxyLG8sYSl7dmFyIHU9dGhpcyxjPWUuZ2V0QXR0cmlidXRlKG4pLHM9ZS5nZXRBdHRyaWJ1dGUocik7XCJcIj09PWMmJihjPWkpLFwiXCI9PT1zJiYocz1vKTt2YXIgbD1jfHxzO3N3aXRjaChsKXtjYXNlIG51bGw6cmV0dXJuIGEoKTtjYXNlXCJibHVyXCI6cmV0dXJuIHZvaWQodGhpcy5vbmNlKGUsXCJkZWJvdW5jZS1ibHVyXCIpJiZlLmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsZnVuY3Rpb24oKXtyZXR1cm4gYSgpfSkpO2RlZmF1bHQ6dmFyIGQ9cGFyc2VJbnQobCksaD10aGlzLmluY0N5Y2xlKGUsXCJkZWJvdW5jZS10cmlnZ2VyXCIsZnVuY3Rpb24oKXtyZXR1cm4gcz91LmRlbGV0ZVByaXZhdGUoZSxcInRocm90dGxlZFwiKTphKCl9KTtpZihpc05hTihkKSlyZXR1cm4gSyhcImludmFsaWQgdGhyb3R0bGUvZGVib3VuY2UgdmFsdWU6IFwiLmNvbmNhdChsKSk7aWYocyl7dmFyIGY9ITE7aWYoXCJrZXlkb3duXCI9PT10LnR5cGUpe3ZhciB2PXRoaXMucHJpdmF0ZShlLFwiZGVib3VuY2UtcHJldi1rZXlcIik7dGhpcy5wdXRQcml2YXRlKGUsXCJkZWJvdW5jZS1wcmV2LWtleVwiLHQua2V5KSxmPXYhPT10LmtleX1pZighZiYmdGhpcy5wcml2YXRlKGUsXCJ0aHJvdHRsZWRcIikpcmV0dXJuITE7YSgpLHRoaXMucHV0UHJpdmF0ZShlLFwidGhyb3R0bGVkXCIsITApLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gdS50cmlnZ2VyQ3ljbGUoZSxcImRlYm91bmNlLXRyaWdnZXJcIil9LGQpfWVsc2Ugc2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiB1LnRyaWdnZXJDeWNsZShlLFwiZGVib3VuY2UtdHJpZ2dlclwiLGgpfSxkKTtlLmZvcm0mJnRoaXMub25jZShlLmZvcm0sXCJiaW5kLWRlYm91bmNlXCIpJiZlLmZvcm0uYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLGZ1bmN0aW9uKHQpe0FycmF5LmZyb20obmV3IEZvcm1EYXRhKGUuZm9ybSkuZW50cmllcygpLGZ1bmN0aW9uKHQpe3ZhciBuPUwodCwyKSxpPW5bMF0scj0oblsxXSxlLmZvcm0ucXVlcnlTZWxlY3RvcignW25hbWU9XCInLmNvbmNhdChpLCdcIl0nKSkpO3UuaW5jQ3ljbGUocixcImRlYm91bmNlLXRyaWdnZXJcIiksdS5kZWxldGVQcml2YXRlKHIsXCJ0aHJvdHRsZWRcIil9KX0pLHRoaXMub25jZShlLFwiYmluZC1kZWJvdW5jZVwiKSYmZS5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLGZ1bmN0aW9uKHQpe3JldHVybiB1LnRyaWdnZXJDeWNsZShlLFwiZGVib3VuY2UtdHJpZ2dlclwiKX0pfX0sdHJpZ2dlckN5Y2xlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1MKHRoaXMucHJpdmF0ZShlLHQpLDIpLHI9aVswXSxvPWlbMV07bnx8KG49ciksbj09PXImJih0aGlzLmluY0N5Y2xlKGUsdCksbygpKX0sb25jZTpmdW5jdGlvbihlLHQpe3JldHVybiEwIT09dGhpcy5wcml2YXRlKGUsdCkmJih0aGlzLnB1dFByaXZhdGUoZSx0LCEwKSwhMCl9LGluY0N5Y2xlOmZ1bmN0aW9uKGUsdCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOmZ1bmN0aW9uKCl7fSxpPUwodGhpcy5wcml2YXRlKGUsdCl8fFswLG5dLDIpLHI9aVswXTtpWzFdO3JldHVybiByKyssdGhpcy5wdXRQcml2YXRlKGUsdCxbcixuXSkscn0sZGlzY2FyZEVycm9yOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10LmdldEF0dHJpYnV0ZSYmdC5nZXRBdHRyaWJ1dGUobikscj1pJiZlLnF1ZXJ5U2VsZWN0b3IoXCIjXCIuY29uY2F0KGkpKTtyJiYodGhpcy5wcml2YXRlKHIsXCJwaHgtaGFzLWZvY3VzZWRcIil8fHRoaXMucHJpdmF0ZShyLmZvcm0sXCJwaHgtaGFzLXN1Ym1pdHRlZFwiKXx8dC5jbGFzc0xpc3QuYWRkKFwicGh4LW5vLWZlZWRiYWNrXCIpKX0saXNQaHhDaGlsZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtcGFyZW50LWlkXCIpfSxkaXNwYXRjaEV2ZW50OmZ1bmN0aW9uKGUsdCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGk9bmV3IEN1c3RvbUV2ZW50KHQse2J1YmJsZXM6ITAsY2FuY2VsYWJsZTohMCxkZXRhaWw6bn0pO2UuZGlzcGF0Y2hFdmVudChpKX0sY2xvbmVOb2RlOmZ1bmN0aW9uKGUsdCl7aWYodm9pZCAwPT09dClyZXR1cm4gZS5jbG9uZU5vZGUoITApO3ZhciBuPWUuY2xvbmVOb2RlKCExKTtyZXR1cm4gbi5pbm5lckhUTUw9dCxufSxtZXJnZUF0dHJzOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpbXSxpPXQuYXR0cmlidXRlcyxyPWkubGVuZ3RoLTE7cj49MDtyLS0pe3ZhciBvPWlbcl0ubmFtZTtuLmluZGV4T2Yobyk8MCYmZS5zZXRBdHRyaWJ1dGUobyx0LmdldEF0dHJpYnV0ZShvKSl9Zm9yKHZhciBhPWUuYXR0cmlidXRlcyx1PWEubGVuZ3RoLTE7dT49MDt1LS0pe3ZhciBjPWFbdV0ubmFtZTt0Lmhhc0F0dHJpYnV0ZShjKXx8ZS5yZW1vdmVBdHRyaWJ1dGUoYyl9fSxtZXJnZUZvY3VzZWRJbnB1dDpmdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudHx8cmUubWVyZ2VBdHRycyhlLHQsW1widmFsdWVcIl0pLHQucmVhZE9ubHk/ZS5zZXRBdHRyaWJ1dGUoXCJyZWFkb25seVwiLCEwKTplLnJlbW92ZUF0dHJpYnV0ZShcInJlYWRvbmx5XCIpfSxoYXNTZWxlY3Rpb25SYW5nZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5zZXRTZWxlY3Rpb25SYW5nZSYmKFwidGV4dFwiPT09ZS50eXBlfHxcInRleHRhcmVhXCI9PT1lLnR5cGUpfSxyZXN0b3JlRm9jdXM6ZnVuY3Rpb24oZSx0LG4pe2lmKHJlLmlzVGV4dHVhbElucHV0KGUpKXt2YXIgaT1lLm1hdGNoZXMoXCI6Zm9jdXNcIik7ZS5yZWFkT25seSYmZS5ibHVyKCksaXx8ZS5mb2N1cygpLHRoaXMuaGFzU2VsZWN0aW9uUmFuZ2UoZSkmJmUuc2V0U2VsZWN0aW9uUmFuZ2UodCxuKX19LGlzRm9ybUlucHV0OmZ1bmN0aW9uKGUpe3JldHVybi9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhKSQvaS50ZXN0KGUudGFnTmFtZSkmJlwiYnV0dG9uXCIhPT1lLnR5cGV9LHN5bmNBdHRyc1RvUHJvcHM6ZnVuY3Rpb24oZSl7ZSBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQmJkouaW5kZXhPZihlLnR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKSk+PTAmJihlLmNoZWNrZWQ9bnVsbCE9PWUuZ2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiKSl9LGlzVGV4dHVhbElucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBVLmluZGV4T2YoZS50eXBlKT49MH0saXNOb3dUcmlnZ2VyRm9ybUV4dGVybmFsOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlJiZudWxsIT09ZS5nZXRBdHRyaWJ1dGUodCl9LHN5bmNQZW5kaW5nUmVmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1lLmdldEF0dHJpYnV0ZShNKTtyZXR1cm4gbnVsbD09PWl8fChyZS5pc0Zvcm1JbnB1dChlKXx8bnVsbCE9PWUuZ2V0QXR0cmlidXRlKG4pPyhyZS5wdXRQcml2YXRlKGUsTSx0KSwhMSk6KEguZm9yRWFjaChmdW5jdGlvbihuKXtlLmNsYXNzTGlzdC5jb250YWlucyhuKSYmdC5jbGFzc0xpc3QuYWRkKG4pfSksdC5zZXRBdHRyaWJ1dGUoTSxpKSwhMCkpfSxjbGVhbkNoaWxkTm9kZXM6ZnVuY3Rpb24oZSx0KXtpZihyZS5pc1BoeFVwZGF0ZShlLHQsW1wiYXBwZW5kXCIsXCJwcmVwZW5kXCJdKSl7dmFyIG49W107ZS5jaGlsZE5vZGVzLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5pZHx8KGUubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSYmXCJcIj09PWUubm9kZVZhbHVlLnRyaW0oKXx8SyhcIm9ubHkgSFRNTCBlbGVtZW50IHRhZ3Mgd2l0aCBhbiBpZCBhcmUgYWxsb3dlZCBpbnNpZGUgY29udGFpbmVycyB3aXRoIHBoeC11cGRhdGUuXFxuXFxuXCIrJ3JlbW92aW5nIGlsbGVnYWwgbm9kZTogXCInLmNvbmNhdCgoZS5vdXRlckhUTUx8fGUubm9kZVZhbHVlKS50cmltKCksJ1wiXFxuXFxuJykpLG4ucHVzaChlKSl9KSxuLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVtb3ZlKCl9KX19fSxvZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuLGkpe0EodGhpcyxlKTt2YXIgcj1uZXcgU2V0LG89bmV3IFNldCh4KG4uY2hpbGRyZW4pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5pZH0pKSxhPVtdO0FycmF5LmZyb20odC5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbihlKXtpZihlLmlkJiYoci5hZGQoZS5pZCksby5oYXMoZS5pZCkpKXt2YXIgdD1lLnByZXZpb3VzRWxlbWVudFNpYmxpbmcmJmUucHJldmlvdXNFbGVtZW50U2libGluZy5pZDthLnB1c2goe2VsZW1lbnRJZDplLmlkLHByZXZpb3VzRWxlbWVudElkOnR9KX19KSx0aGlzLmNvbnRhaW5lcklkPW4uaWQsdGhpcy51cGRhdGVUeXBlPWksdGhpcy5lbGVtZW50c1RvTW9kaWZ5PWEsdGhpcy5lbGVtZW50SWRzVG9BZGQ9eChvKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIXIuaGFzKGUpfSl9cmV0dXJuIFAoZSxbe2tleTpcInBlcmZvcm1cIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXJlLmJ5SWQodGhpcy5jb250YWluZXJJZCk7dGhpcy5lbGVtZW50c1RvTW9kaWZ5LmZvckVhY2goZnVuY3Rpb24odCl7dC5wcmV2aW91c0VsZW1lbnRJZD9aKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHQucHJldmlvdXNFbGVtZW50SWQpLGZ1bmN0aW9uKGUpe1ooZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodC5lbGVtZW50SWQpLGZ1bmN0aW9uKHQpe3QucHJldmlvdXNFbGVtZW50U2libGluZyYmdC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmlkPT1lLmlkfHxlLmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyZW5kXCIsdCl9KX0pOlooZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodC5lbGVtZW50SWQpLGZ1bmN0aW9uKHQpe251bGw9PXQucHJldmlvdXNFbGVtZW50U2libGluZ3x8ZS5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmJlZ2luXCIsdCl9KX0pLFwicHJlcGVuZFwiPT10aGlzLnVwZGF0ZVR5cGUmJnRoaXMuZWxlbWVudElkc1RvQWRkLnJldmVyc2UoKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe1ooZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodCksZnVuY3Rpb24odCl7cmV0dXJuIGUuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJiZWdpblwiLHQpfSl9KX19XSksZX0oKSxhZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuLGkscixvKXtBKHRoaXMsZSksdGhpcy52aWV3PXQsdGhpcy5saXZlU29ja2V0PXQubGl2ZVNvY2tldCx0aGlzLmNvbnRhaW5lcj1uLHRoaXMuaWQ9aSx0aGlzLnJvb3RJRD10LnJvb3QuaWQsdGhpcy5odG1sPXIsdGhpcy50YXJnZXRDSUQ9byx0aGlzLmNpZFBhdGNoPVwibnVtYmVyXCI9PXR5cGVvZiB0aGlzLnRhcmdldENJRCx0aGlzLmNhbGxiYWNrcz17YmVmb3JlYWRkZWQ6W10sYmVmb3JldXBkYXRlZDpbXSxiZWZvcmVkaXNjYXJkZWQ6W10sYmVmb3JlcGh4Q2hpbGRBZGRlZDpbXSxhZnRlcmFkZGVkOltdLGFmdGVydXBkYXRlZDpbXSxhZnRlcmRpc2NhcmRlZDpbXSxhZnRlcnBoeENoaWxkQWRkZWQ6W119fXJldHVybiBQKGUsbnVsbCxbe2tleTpcInBhdGNoRWxcIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7YihlLHQse2NoaWxkcmVuT25seTohMSxvbkJlZm9yZUVsVXBkYXRlZDpmdW5jdGlvbihlLHQpe2lmKG4mJm4uaXNTYW1lTm9kZShlKSYmcmUuaXNGb3JtSW5wdXQoZSkpcmV0dXJuIHJlLm1lcmdlRm9jdXNlZElucHV0KGUsdCksITF9fSl9fV0pLFAoZSxbe2tleTpcImJlZm9yZVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dGhpcy5jYWxsYmFja3NbXCJiZWZvcmVcIi5jb25jYXQoZSldLnB1c2godCl9fSx7a2V5OlwiYWZ0ZXJcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3RoaXMuY2FsbGJhY2tzW1wiYWZ0ZXJcIi5jb25jYXQoZSldLnB1c2godCl9fSx7a2V5OlwidHJhY2tCZWZvcmVcIix2YWx1ZTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheSh0PjE/dC0xOjApLGk9MTtpPHQ7aSsrKW5baS0xXT1hcmd1bWVudHNbaV07dGhpcy5jYWxsYmFja3NbXCJiZWZvcmVcIi5jb25jYXQoZSldLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXBwbHkodm9pZCAwLG4pfSl9fSx7a2V5OlwidHJhY2tBZnRlclwiLHZhbHVlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KHQ+MT90LTE6MCksaT0xO2k8dDtpKyspbltpLTFdPWFyZ3VtZW50c1tpXTt0aGlzLmNhbGxiYWNrc1tcImFmdGVyXCIuY29uY2F0KGUpXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmFwcGx5KHZvaWQgMCxuKX0pfX0se2tleTpcIm1hcmtQcnVuYWJsZUNvbnRlbnRGb3JSZW1vdmFsXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZS5hbGwodGhpcy5jb250YWluZXIsXCJbcGh4LXVwZGF0ZT1hcHBlbmRdID4gKiwgW3BoeC11cGRhdGU9cHJlcGVuZF0gPiAqXCIsZnVuY3Rpb24oZSl7ZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1yZW1vdmVcIixcIlwiKX0pfX0se2tleTpcInBlcmZvcm1cIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLnZpZXcsbj10aGlzLmxpdmVTb2NrZXQsaT10aGlzLmNvbnRhaW5lcixyPXRoaXMuaHRtbCxvPXRoaXMuaXNDSURQYXRjaCgpP3RoaXMudGFyZ2V0Q0lEQ29udGFpbmVyKCk6aTtpZighdGhpcy5pc0NJRFBhdGNoKCl8fG8pe3ZhciBhPW4uZ2V0QWN0aXZlRWxlbWVudCgpLHU9YSYmcmUuaGFzU2VsZWN0aW9uUmFuZ2UoYSk/YTp7fSxjPXUuc2VsZWN0aW9uU3RhcnQscz11LnNlbGVjdGlvbkVuZCxsPW4uYmluZGluZyhcInVwZGF0ZVwiKSxkPW4uYmluZGluZyhcImZlZWRiYWNrLWZvclwiKSxoPW4uYmluZGluZyhcImRpc2FibGUtd2l0aFwiKSxmPW4uYmluZGluZyhcInRyaWdnZXItYWN0aW9uXCIpLHY9W10scD1bXSxnPVtdLG09bnVsbCx5PW4udGltZShcInByZW1vcnBoIGNvbnRhaW5lciBwcmVwXCIsZnVuY3Rpb24oKXtyZXR1cm4gZS5idWlsZERpZmZIVE1MKGkscixsLG8pfSk7cmV0dXJuIHRoaXMudHJhY2tCZWZvcmUoXCJhZGRlZFwiLGkpLHRoaXMudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsaSxpKSxuLnRpbWUoXCJtb3JwaGRvbVwiLGZ1bmN0aW9uKCl7YihvLHkse2NoaWxkcmVuT25seTpudWxsPT09by5nZXRBdHRyaWJ1dGUoaiksb25CZWZvcmVOb2RlQWRkZWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHJlLmRpc2NhcmRFcnJvcihvLHQsZCksZS50cmFja0JlZm9yZShcImFkZGVkXCIsdCksdH0sb25Ob2RlQWRkZWQ6ZnVuY3Rpb24obil7cmUuaXNOb3dUcmlnZ2VyRm9ybUV4dGVybmFsKG4sZikmJihtPW4pLHJlLmlzUGh4Q2hpbGQobikmJnQub3duc0VsZW1lbnQobikmJmUudHJhY2tBZnRlcihcInBoeENoaWxkQWRkZWRcIixuKSx2LnB1c2gobil9LG9uTm9kZURpc2NhcmRlZDpmdW5jdGlvbih0KXtyZS5pc1BoeENoaWxkKHQpJiZuLmRlc3Ryb3lWaWV3QnlFbCh0KSxlLnRyYWNrQWZ0ZXIoXCJkaXNjYXJkZWRcIix0KX0sb25CZWZvcmVOb2RlRGlzY2FyZGVkOmZ1bmN0aW9uKHQpe3JldHVybiEoIXQuZ2V0QXR0cmlidXRlfHxudWxsPT09dC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1yZW1vdmVcIikpfHwobnVsbD09PXQucGFyZW50Tm9kZXx8IXJlLmlzUGh4VXBkYXRlKHQucGFyZW50Tm9kZSxsLFtcImFwcGVuZFwiLFwicHJlcGVuZFwiXSl8fCF0LmlkKSYmKCFlLnNraXBDSURTaWJsaW5nKHQpJiYoZS50cmFja0JlZm9yZShcImRpc2NhcmRlZFwiLHQpLCEwKSl9LG9uRWxVcGRhdGVkOmZ1bmN0aW9uKGUpe3JlLmlzTm93VHJpZ2dlckZvcm1FeHRlcm5hbChlLGYpJiYobT1lKSxwLnB1c2goZSl9LG9uQmVmb3JlRWxVcGRhdGVkOmZ1bmN0aW9uKHQsbil7aWYocmUuY2xlYW5DaGlsZE5vZGVzKG4sbCksZS5za2lwQ0lEU2libGluZyhuKSlyZXR1cm4hMTtpZihcImlnbm9yZVwiPT09dC5nZXRBdHRyaWJ1dGUobCkpcmV0dXJuIGUudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsdCxuKSxyZS5tZXJnZUF0dHJzKHQsbikscC5wdXNoKHQpLCExO2lmKFwibnVtYmVyXCI9PT10LnR5cGUmJnQudmFsaWRpdHkmJnQudmFsaWRpdHkuYmFkSW5wdXQpcmV0dXJuITE7aWYoIXJlLnN5bmNQZW5kaW5nUmVmKHQsbixoKSlyZXR1cm4hMTtpZihyZS5pc1BoeENoaWxkKG4pKXt2YXIgaT10LmdldEF0dHJpYnV0ZShGKTtyZXR1cm4gcmUubWVyZ2VBdHRycyh0LG4pLHQuc2V0QXR0cmlidXRlKEYsaSksdC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1yb290LWlkXCIsZS5yb290SUQpLCExfXJldHVybiByZS5jb3B5UHJpdmF0ZXMobix0KSxyZS5kaXNjYXJkRXJyb3IobyxuLGQpLGEmJnQuaXNTYW1lTm9kZShhKSYmcmUuaXNGb3JtSW5wdXQodCkmJiFlLmZvcmNlRm9jdXNlZFNlbGVjdFVwZGF0ZSh0LG4pPyhlLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLHQsbikscmUubWVyZ2VGb2N1c2VkSW5wdXQodCxuKSxyZS5zeW5jQXR0cnNUb1Byb3BzKHQpLHAucHVzaCh0KSwhMSk6KHJlLmlzUGh4VXBkYXRlKG4sbCxbXCJhcHBlbmRcIixcInByZXBlbmRcIl0pJiZnLnB1c2gobmV3IG9lKHQsbixuLmdldEF0dHJpYnV0ZShsKSkpLHJlLnN5bmNBdHRyc1RvUHJvcHMobiksZS50cmFja0JlZm9yZShcInVwZGF0ZWRcIix0LG4pLCEwKX19KX0pLG4uaXNEZWJ1Z0VuYWJsZWQoKSYmZnVuY3Rpb24oKXtmb3IodmFyIGU9bmV3IFNldCx0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqW2lkXVwiKSxuPTAsaT10Lmxlbmd0aDtuPGk7bisrKWUuaGFzKHRbbl0uaWQpP2NvbnNvbGUuZXJyb3IoXCJNdWx0aXBsZSBJRHMgZGV0ZWN0ZWQ6IFwiLmNvbmNhdCh0W25dLmlkLFwiLiBFbnN1cmUgdW5pcXVlIGVsZW1lbnQgaWRzLlwiKSk6ZS5hZGQodFtuXS5pZCl9KCksZy5sZW5ndGg+MCYmbi50aW1lKFwicG9zdC1tb3JwaCBhcHBlbmQvcHJlcGVuZCByZXN0b3JhdGlvblwiLGZ1bmN0aW9uKCl7Zy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBlcmZvcm0oKX0pfSksbi5zaWxlbmNlRXZlbnRzKGZ1bmN0aW9uKCl7cmV0dXJuIHJlLnJlc3RvcmVGb2N1cyhhLGMscyl9KSxyZS5kaXNwYXRjaEV2ZW50KGRvY3VtZW50LFwicGh4OnVwZGF0ZVwiKSx2LmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGUudHJhY2tBZnRlcihcImFkZGVkXCIsdCl9KSxwLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGUudHJhY2tBZnRlcihcInVwZGF0ZWRcIix0KX0pLG0mJihuLmRpc2Nvbm5lY3QoKSxtLnN1Ym1pdCgpKSwhMH19fSx7a2V5OlwiZm9yY2VGb2N1c2VkU2VsZWN0VXBkYXRlXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4hMD09PWUubXVsdGlwbGV8fGUuaW5uZXJIVE1MIT10LmlubmVySFRNTH19LHtrZXk6XCJpc0NJRFBhdGNoXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaWRQYXRjaH19LHtrZXk6XCJza2lwQ0lEU2libGluZ1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJm51bGwhPT1lLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LXNraXBcIil9fSx7a2V5OlwidGFyZ2V0Q0lEQ29udGFpbmVyXCIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzQ0lEUGF0Y2goKSl7dmFyIGU9ayhyZS5maW5kQ29tcG9uZW50Tm9kZUxpc3QodGhpcy5jb250YWluZXIsdGhpcy50YXJnZXRDSUQpKSx0PWVbMF07cmV0dXJuIDA9PT1lLnNsaWNlKDEpLmxlbmd0aD90OnQmJnQucGFyZW50Tm9kZX19fSx7a2V5OlwiYnVpbGREaWZmSFRNTFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLGkpe3ZhciByPXRoaXMsbz10aGlzLmlzQ0lEUGF0Y2goKSxhPW8mJmkuZ2V0QXR0cmlidXRlKGopPT09dGhpcy50YXJnZXRDSUQudG9TdHJpbmcoKTtpZighb3x8YSlyZXR1cm4gdDt2YXIgdT1udWxsLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO3U9cmUuY2xvbmVOb2RlKGkpO3ZhciBzPWsocmUuZmluZENvbXBvbmVudE5vZGVMaXN0KHUsdGhpcy50YXJnZXRDSUQpKSxsPXNbMF0sZD1zLnNsaWNlKDEpO3JldHVybiBjLmlubmVySFRNTD10LGQuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZW1vdmUoKX0pLEFycmF5LmZyb20odS5jaGlsZE5vZGVzKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuaWQmJmUubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmZS5nZXRBdHRyaWJ1dGUoaikhPT1yLnRhcmdldENJRC50b1N0cmluZygpJiYoZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1za2lwXCIsXCJcIiksZS5pbm5lckhUTUw9XCJcIil9KSxBcnJheS5mcm9tKGMuY29udGVudC5jaGlsZE5vZGVzKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiB1Lmluc2VydEJlZm9yZShlLGwpfSksbC5yZW1vdmUoKSx1Lm91dGVySFRNTH19XSksZX0oKSx1ZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuLGkscixvKXt2YXIgYT10aGlzO0EodGhpcyxlKSx0aGlzLmxpdmVTb2NrZXQ9bix0aGlzLmZsYXNoPW8sdGhpcy5wYXJlbnQ9aSx0aGlzLnJvb3Q9aT9pLnJvb3Q6dGhpcyx0aGlzLmVsPXQsdGhpcy5pZD10aGlzLmVsLmlkLHRoaXMudmlldz10aGlzLmVsLmdldEF0dHJpYnV0ZShPKSx0aGlzLnJlZj0wLHRoaXMuY2hpbGRKb2lucz0wLHRoaXMubG9hZGVyVGltZXI9bnVsbCx0aGlzLnBlbmRpbmdEaWZmcz1bXSx0aGlzLmhyZWY9cix0aGlzLmpvaW5Db3VudD10aGlzLnBhcmVudD90aGlzLnBhcmVudC5qb2luQ291bnQtMTowLHRoaXMuam9pblBlbmRpbmc9ITAsdGhpcy5kZXN0cm95ZWQ9ITEsdGhpcy5qb2luQ2FsbGJhY2s9ZnVuY3Rpb24oKXt9LHRoaXMuc3RvcENhbGxiYWNrPWZ1bmN0aW9uKCl7fSx0aGlzLnBlbmRpbmdKb2luT3BzPXRoaXMucGFyZW50P251bGw6W10sdGhpcy52aWV3SG9va3M9e30sdGhpcy5jaGlsZHJlbj10aGlzLnBhcmVudD9udWxsOnt9LHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLmlkXT17fSx0aGlzLmNoYW5uZWw9dGhpcy5saXZlU29ja2V0LmNoYW5uZWwoXCJsdjpcIi5jb25jYXQodGhpcy5pZCksZnVuY3Rpb24oKXtyZXR1cm57dXJsOmEuaHJlZixwYXJhbXM6YS5jb25uZWN0UGFyYW1zKCksc2Vzc2lvbjphLmdldFNlc3Npb24oKSxzdGF0aWM6YS5nZXRTdGF0aWMoKSxmbGFzaDphLmZsYXNofX0pLHRoaXMuc2hvd0xvYWRlcih0aGlzLmxpdmVTb2NrZXQubG9hZGVyVGltZW91dCksdGhpcy5iaW5kQ2hhbm5lbCgpfXJldHVybiBQKGUsW3trZXk6XCJpc01haW5cIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxpdmVTb2NrZXQubWFpbj09PXRoaXN9fSx7a2V5OlwiY29ubmVjdFBhcmFtc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5saXZlU29ja2V0LnBhcmFtcyh0aGlzLnZpZXcpLHQ9cmUuYWxsKGRvY3VtZW50LFwiW1wiLmNvbmNhdCh0aGlzLmJpbmRpbmcoXCJ0cmFjay1zdGF0aWNcIiksXCJdXCIpKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3JjfHxlLmhyZWZ9KS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIGV9KTtyZXR1cm4gdC5sZW5ndGg+MCYmKGUuX3RyYWNrX3N0YXRpYz10KSxlLl9tb3VudHM9dGhpcy5qb2luQ291bnQsZX19LHtrZXk6XCJuYW1lXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWV3fX0se2tleTpcImlzQ29ubmVjdGVkXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGFubmVsLmNhblB1c2goKX19LHtrZXk6XCJnZXRTZXNzaW9uXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1zZXNzaW9uXCIpfX0se2tleTpcImdldFN0YXRpY1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5lbC5nZXRBdHRyaWJ1dGUoRik7cmV0dXJuXCJcIj09PWU/bnVsbDplfX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06ZnVuY3Rpb24oKXt9O3RoaXMuZGVzdHJveUFsbENoaWxkcmVuKCksdGhpcy5kZXN0cm95ZWQ9ITAsZGVsZXRlIHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLmlkXSx0aGlzLnBhcmVudCYmZGVsZXRlIHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLnBhcmVudC5pZF1bdGhpcy5pZF0sY2xlYXJUaW1lb3V0KHRoaXMubG9hZGVyVGltZXIpO3ZhciBuPWZ1bmN0aW9uKCl7Zm9yKHZhciBuIGluIHQoKSxlLnZpZXdIb29rcyllLnZpZXdIb29rc1tuXS5fX3RyaWdnZXJfXyhcImJlZm9yZURlc3Ryb3lcIiksZS5kZXN0cm95SG9vayhlLnZpZXdIb29rc1tuXSl9O3RoaXMubG9nKFwiZGVzdHJveWVkXCIsZnVuY3Rpb24oKXtyZXR1cm5bXCJ0aGUgY2hpbGQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBwYXJlbnRcIl19KSx0aGlzLmNoYW5uZWwubGVhdmUoKS5yZWNlaXZlKFwib2tcIixuKS5yZWNlaXZlKFwiZXJyb3JcIixuKS5yZWNlaXZlKFwidGltZW91dFwiLG4pfX0se2tleTpcInNldENvbnRhaW5lckNsYXNzZXNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlO3RoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZShcInBoeC1jb25uZWN0ZWRcIixcInBoeC1kaXNjb25uZWN0ZWRcIixcInBoeC1lcnJvclwiKSwoZT10aGlzLmVsLmNsYXNzTGlzdCkuYWRkLmFwcGx5KGUsYXJndW1lbnRzKX19LHtrZXk6XCJpc0xvYWRpbmdcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsLmNsYXNzTGlzdC5jb250YWlucyhcInBoeC1kaXNjb25uZWN0ZWRcIil9fSx7a2V5Olwic2hvd0xvYWRlclwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYoY2xlYXJUaW1lb3V0KHRoaXMubG9hZGVyVGltZXIpLGUpdGhpcy5sb2FkZXJUaW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIHQuc2hvd0xvYWRlcigpfSxlKTtlbHNle2Zvcih2YXIgbiBpbiB0aGlzLnZpZXdIb29rcyl0aGlzLnZpZXdIb29rc1tuXS5fX3RyaWdnZXJfXyhcImRpc2Nvbm5lY3RlZFwiKTt0aGlzLnNldENvbnRhaW5lckNsYXNzZXMoXCJwaHgtZGlzY29ubmVjdGVkXCIpfX19LHtrZXk6XCJoaWRlTG9hZGVyXCIsdmFsdWU6ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodGhpcy5sb2FkZXJUaW1lciksdGhpcy5zZXRDb250YWluZXJDbGFzc2VzKFwicGh4LWNvbm5lY3RlZFwiKX19LHtrZXk6XCJ0cmlnZ2VyUmVjb25uZWN0ZWRcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgZSBpbiB0aGlzLnZpZXdIb29rcyl0aGlzLnZpZXdIb29rc1tlXS5fX3RyaWdnZXJfXyhcInJlY29ubmVjdGVkXCIpfX0se2tleTpcImxvZ1wiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dGhpcy5saXZlU29ja2V0LmxvZyh0aGlzLGUsdCl9fSx7a2V5Olwid2l0aGluVGFyZ2V0c1wiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztpZigvXigwfFsxLTldXFxkKikkLy50ZXN0KGUpKXt2YXIgaT1yZS5maW5kQ29tcG9uZW50Tm9kZUxpc3QodGhpcy5lbCxlKTswPT09aS5sZW5ndGg/SyhcIm5vIGNvbXBvbmVudCBmb3VuZCBtYXRjaGluZyBwaHgtdGFyZ2V0IG9mIFwiLmNvbmNhdChlKSk6dCh0aGlzLGlbMF0pfWVsc2V7dmFyIHI9QXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGUpKTswPT09ci5sZW5ndGgmJksoJ25vdGhpbmcgZm91bmQgbWF0Y2hpbmcgdGhlIHBoeC10YXJnZXQgc2VsZWN0b3IgXCInLmNvbmNhdChlLCdcIicpKSxyLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIG4ubGl2ZVNvY2tldC5vd25lcihlLGZ1bmN0aW9uKG4pe3JldHVybiB0KG4sZSl9KX0pfX19LHtrZXk6XCJhcHBseURpZmZcIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7dGhpcy5sb2coZSxmdW5jdGlvbigpe3JldHVybltcIlwiLHoodCldfSk7dmFyIGk9dGUuZXh0cmFjdCh0KSxyPWkuZGlmZixvPWkucmVwbHksYT1pLmV2ZW50cyx1PWkudGl0bGU7cmV0dXJuIHUmJnJlLnB1dFRpdGxlKHUpLG4oe2RpZmY6cixyZXBseTpvLGV2ZW50czphfSksb319LHtrZXk6XCJvbkpvaW5cIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49ZS5yZW5kZXJlZDt0aGlzLmpvaW5Db3VudCsrLHRoaXMuY2hpbGRKb2lucz0wLHRoaXMuam9pblBlbmRpbmc9ITAsdGhpcy5mbGFzaD1udWxsLGllLmRyb3BMb2NhbCh0aGlzLm5hbWUoKSxcImNvbnNlY3V0aXZlLXJlbG9hZHNcIiksdGhpcy5hcHBseURpZmYoXCJtb3VudFwiLG4sZnVuY3Rpb24obil7dmFyIGk9bi5kaWZmLHI9bi5ldmVudHM7dC5yZW5kZXJlZD1uZXcgdGUodC5pZCxpKTt2YXIgbz10LnJlbmRlckNvbnRhaW5lcihudWxsLFwiam9pblwiKTt0LmRyb3BQZW5kaW5nUmVmcygpO3ZhciBhPXQuZm9ybXNGb3JSZWNvdmVyeShvKTt0LmpvaW5Db3VudD4xJiZhLmxlbmd0aD4wP2EuZm9yRWFjaChmdW5jdGlvbihlLG4pe3QucHVzaEZvcm1SZWNvdmVyeShlLGZ1bmN0aW9uKGUpe249PT1hLmxlbmd0aC0xJiZ0Lm9uSm9pbkNvbXBsZXRlKGUsbyxyKX0pfSk6dC5vbkpvaW5Db21wbGV0ZShlLG8scil9KX19LHtrZXk6XCJkcm9wUGVuZGluZ1JlZnNcIix2YWx1ZTpmdW5jdGlvbigpe3JlLmFsbCh0aGlzLmVsLFwiW1wiLmNvbmNhdChNLFwiXVwiKSxmdW5jdGlvbihlKXtyZXR1cm4gZS5yZW1vdmVBdHRyaWJ1dGUoTSl9KX19LHtrZXk6XCJvbkpvaW5Db21wbGV0ZVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10aGlzLHI9ZS5saXZlX3BhdGNoO2lmKHRoaXMuam9pbkNvdW50PjF8fHRoaXMucGFyZW50JiYhdGhpcy5wYXJlbnQuaXNKb2luUGVuZGluZygpKXJldHVybiB0aGlzLmFwcGx5Sm9pblBhdGNoKHIsdCxuKTswPT09cmUuZmluZFBoeENoaWxkcmVuSW5GcmFnbWVudCh0LHRoaXMuaWQpLmZpbHRlcihmdW5jdGlvbihlKXt2YXIgdD1lLmlkJiZpLmVsLnF1ZXJ5U2VsZWN0b3IoXCIjXCIuY29uY2F0KGUuaWQpKSxuPXQmJnQuZ2V0QXR0cmlidXRlKEYpO3JldHVybiBuJiZlLnNldEF0dHJpYnV0ZShGLG4pLGkuam9pbkNoaWxkKGUpfSkubGVuZ3RoP3RoaXMucGFyZW50Pyh0aGlzLnJvb3QucGVuZGluZ0pvaW5PcHMucHVzaChbdGhpcyxmdW5jdGlvbigpe3JldHVybiBpLmFwcGx5Sm9pblBhdGNoKHIsdCxuKX1dKSx0aGlzLnBhcmVudC5hY2tKb2luKHRoaXMpKToodGhpcy5vbkFsbENoaWxkSm9pbnNDb21wbGV0ZSgpLHRoaXMuYXBwbHlKb2luUGF0Y2gocix0LG4pKTp0aGlzLnJvb3QucGVuZGluZ0pvaW5PcHMucHVzaChbdGhpcyxmdW5jdGlvbigpe3JldHVybiBpLmFwcGx5Sm9pblBhdGNoKHIsdCxuKX1dKX19LHtrZXk6XCJhdHRhY2hUcnVlRG9jRWxcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZWw9cmUuYnlJZCh0aGlzLmlkKSx0aGlzLmVsLnNldEF0dHJpYnV0ZShcImRhdGEtcGh4LXJvb3QtaWRcIix0aGlzLnJvb3QuaWQpfX0se2tleTpcImRpc3BhdGNoRXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oZSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PUwoZSwyKSxuPXRbMF0saT10WzFdO3dpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChcInBoeDpob29rOlwiLmNvbmNhdChuKSx7ZGV0YWlsOml9KSl9KX19LHtrZXk6XCJhcHBseUpvaW5QYXRjaFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10aGlzO3RoaXMuYXR0YWNoVHJ1ZURvY0VsKCk7dmFyIHI9bmV3IGFlKHRoaXMsdGhpcy5lbCx0aGlzLmlkLHQsbnVsbCk7aWYoci5tYXJrUHJ1bmFibGVDb250ZW50Rm9yUmVtb3ZhbCgpLHRoaXMucGVyZm9ybVBhdGNoKHIsITEpLHRoaXMuam9pbk5ld0NoaWxkcmVuKCkscmUuYWxsKHRoaXMuZWwsXCJbXCIuY29uY2F0KHRoaXMuYmluZGluZyhcImhvb2tcIiksXCJdXCIpLGZ1bmN0aW9uKGUpe3ZhciB0PWkuYWRkSG9vayhlKTt0JiZ0Ll9fdHJpZ2dlcl9fKFwibW91bnRlZFwiKX0pLHRoaXMuam9pblBlbmRpbmc9ITEsdGhpcy5kaXNwYXRjaEV2ZW50cyhuKSx0aGlzLmFwcGx5UGVuZGluZ1VwZGF0ZXMoKSxlKXt2YXIgbz1lLmtpbmQsYT1lLnRvO3RoaXMubGl2ZVNvY2tldC5oaXN0b3J5UGF0Y2goYSxvKX10aGlzLmhpZGVMb2FkZXIoKSx0aGlzLmpvaW5Db3VudD4xJiZ0aGlzLnRyaWdnZXJSZWNvbm5lY3RlZCgpLHRoaXMuc3RvcENhbGxiYWNrKCl9fSx7a2V5OlwidHJpZ2dlckJlZm9yZVVwZGF0ZUhvb2tcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3RoaXMubGl2ZVNvY2tldC50cmlnZ2VyRE9NKFwib25CZWZvcmVFbFVwZGF0ZWRcIixbZSx0XSk7dmFyIG49dGhpcy5nZXRIb29rKGUpLGk9biYmXCJpZ25vcmVcIj09PWUuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcInVwZGF0ZVwiKSk7aWYobiYmIWUuaXNFcXVhbE5vZGUodCkmJighaXx8IWZ1bmN0aW9uKGUsdCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpPT09SlNPTi5zdHJpbmdpZnkodCl9KGUuZGF0YXNldCx0LmRhdGFzZXQpKSlyZXR1cm4gbi5fX3RyaWdnZXJfXyhcImJlZm9yZVVwZGF0ZVwiKSxufX0se2tleTpcInRyaWdnZXJVcGRhdGVkSG9va1wiLHZhbHVlOmZ1bmN0aW9uKGUpe2UuX190cmlnZ2VyX18oXCJ1cGRhdGVkXCIpfX0se2tleTpcInBlcmZvcm1QYXRjaFwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcyxpPVtdLHI9ITEsbz1uZXcgU2V0O3JldHVybiBlLmFmdGVyKFwiYWRkZWRcIixmdW5jdGlvbihlKXt2YXIgdD1uLmFkZEhvb2soZSk7dCYmdC5fX3RyaWdnZXJfXyhcIm1vdW50ZWRcIil9KSxlLmFmdGVyKFwicGh4Q2hpbGRBZGRlZFwiLGZ1bmN0aW9uKGUpe3JldHVybiByPSEwfSksZS5iZWZvcmUoXCJ1cGRhdGVkXCIsZnVuY3Rpb24oZSx0KXtuLnRyaWdnZXJCZWZvcmVVcGRhdGVIb29rKGUsdCkmJm8uYWRkKGUuaWQpfSksZS5hZnRlcihcInVwZGF0ZWRcIixmdW5jdGlvbihlKXtvLmhhcyhlLmlkKSYmbi50cmlnZ2VyVXBkYXRlZEhvb2sobi5nZXRIb29rKGUpKX0pLGUuYmVmb3JlKFwiZGlzY2FyZGVkXCIsZnVuY3Rpb24oZSl7dmFyIHQ9bi5nZXRIb29rKGUpO3QmJnQuX190cmlnZ2VyX18oXCJiZWZvcmVEZXN0cm95XCIpfSksZS5hZnRlcihcImRpc2NhcmRlZFwiLGZ1bmN0aW9uKGUpe3ZhciB0PW4uY29tcG9uZW50SUQoZSk7XCJudW1iZXJcIj09dHlwZW9mIHQmJi0xPT09aS5pbmRleE9mKHQpJiZpLnB1c2godCk7dmFyIHI9bi5nZXRIb29rKGUpO3ImJm4uZGVzdHJveUhvb2socil9KSxlLnBlcmZvcm0oKSx0JiZ0aGlzLm1heWJlUHVzaENvbXBvbmVudHNEZXN0cm95ZWQoaSkscn19LHtrZXk6XCJqb2luTmV3Q2hpbGRyZW5cIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7cmUuZmluZFBoeENoaWxkcmVuKHRoaXMuZWwsdGhpcy5pZCkuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gZS5qb2luQ2hpbGQodCl9KX19LHtrZXk6XCJnZXRDaGlsZEJ5SWRcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdW2VdfX0se2tleTpcImdldERlc2NlbmRlbnRCeUVsXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuaWQ9PT10aGlzLmlkP3RoaXM6dGhpcy5jaGlsZHJlbltlLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LXBhcmVudC1pZFwiKV1bZS5pZF19fSx7a2V5OlwiZGVzdHJveURlc2NlbmRlbnRcIix2YWx1ZTpmdW5jdGlvbihlKXtmb3IodmFyIHQgaW4gdGhpcy5yb290LmNoaWxkcmVuKWZvcih2YXIgbiBpbiB0aGlzLnJvb3QuY2hpbGRyZW5bdF0paWYobj09PWUpcmV0dXJuIHRoaXMucm9vdC5jaGlsZHJlblt0XVtuXS5kZXN0cm95KCl9fSx7a2V5Olwiam9pbkNoaWxkXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXRoaXMuZ2V0Q2hpbGRCeUlkKHQuaWQpKXt2YXIgbj1uZXcgZSh0LHRoaXMubGl2ZVNvY2tldCx0aGlzKTtyZXR1cm4gdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdW24uaWRdPW4sbi5qb2luKCksdGhpcy5jaGlsZEpvaW5zKyssITB9fX0se2tleTpcImlzSm9pblBlbmRpbmdcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmpvaW5QZW5kaW5nfX0se2tleTpcImFja0pvaW5cIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLmNoaWxkSm9pbnMtLSwwPT09dGhpcy5jaGlsZEpvaW5zJiYodGhpcy5wYXJlbnQ/dGhpcy5wYXJlbnQuYWNrSm9pbih0aGlzKTp0aGlzLm9uQWxsQ2hpbGRKb2luc0NvbXBsZXRlKCkpfX0se2tleTpcIm9uQWxsQ2hpbGRKb2luc0NvbXBsZXRlXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmpvaW5DYWxsYmFjaygpLHRoaXMucGVuZGluZ0pvaW5PcHMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1MKGUsMiksbj10WzBdLGk9dFsxXTtuLmlzRGVzdHJveWVkKCl8fGkoKX0pLHRoaXMucGVuZGluZ0pvaW5PcHM9W119fSx7a2V5OlwidXBkYXRlXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2lmKHRoaXMuaXNKb2luUGVuZGluZygpfHx0aGlzLmxpdmVTb2NrZXQuaGFzUGVuZGluZ0xpbmsoKSlyZXR1cm4gdGhpcy5wZW5kaW5nRGlmZnMucHVzaCh7ZGlmZjplLGV2ZW50czp0fSk7dGhpcy5yZW5kZXJlZC5tZXJnZURpZmYoZSk7dmFyIGk9ITE7dGhpcy5yZW5kZXJlZC5pc0NvbXBvbmVudE9ubHlEaWZmKGUpP3RoaXMubGl2ZVNvY2tldC50aW1lKFwiY29tcG9uZW50IHBhdGNoIGNvbXBsZXRlXCIsZnVuY3Rpb24oKXtyZS5maW5kUGFyZW50Q0lEcyhuLmVsLG4ucmVuZGVyZWQuY29tcG9uZW50Q0lEcyhlKSkuZm9yRWFjaChmdW5jdGlvbih0KXtuLmNvbXBvbmVudFBhdGNoKG4ucmVuZGVyZWQuZ2V0Q29tcG9uZW50KGUsdCksdCkmJihpPSEwKX0pfSk6UShlKXx8dGhpcy5saXZlU29ja2V0LnRpbWUoXCJmdWxsIHBhdGNoIGNvbXBsZXRlXCIsZnVuY3Rpb24oKXt2YXIgdD1uLnJlbmRlckNvbnRhaW5lcihlLFwidXBkYXRlXCIpLHI9bmV3IGFlKG4sbi5lbCxuLmlkLHQsbnVsbCk7aT1uLnBlcmZvcm1QYXRjaChyLCEwKX0pLHRoaXMuZGlzcGF0Y2hFdmVudHModCksaSYmdGhpcy5qb2luTmV3Q2hpbGRyZW4oKX19LHtrZXk6XCJyZW5kZXJDb250YWluZXJcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7cmV0dXJuIHRoaXMubGl2ZVNvY2tldC50aW1lKFwidG9TdHJpbmcgZGlmZiAoXCIuY29uY2F0KHQsXCIpXCIpLGZ1bmN0aW9uKCl7dmFyIHQ9bi5lbC50YWdOYW1lLGk9ZT9uLnJlbmRlcmVkLmNvbXBvbmVudENJRHMoZSk6bnVsbCxyPW4ucmVuZGVyZWQudG9TdHJpbmcoaSk7cmV0dXJuXCI8XCIuY29uY2F0KHQsXCI+XCIpLmNvbmNhdChyLFwiPC9cIikuY29uY2F0KHQsXCI+XCIpfSl9fSx7a2V5OlwiY29tcG9uZW50UGF0Y2hcIix2YWx1ZTpmdW5jdGlvbihlLHQpe2lmKFEoZSkpcmV0dXJuITE7dmFyIG49dGhpcy5yZW5kZXJlZC5jb21wb25lbnRUb1N0cmluZyh0KSxpPW5ldyBhZSh0aGlzLHRoaXMuZWwsdGhpcy5pZCxuLHQpO3JldHVybiB0aGlzLnBlcmZvcm1QYXRjaChpLCEwKX19LHtrZXk6XCJnZXRIb29rXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudmlld0hvb2tzW3NlLmVsZW1lbnRJRChlKV19fSx7a2V5OlwiYWRkSG9va1wiLHZhbHVlOmZ1bmN0aW9uKGUpe2lmKCFzZS5lbGVtZW50SUQoZSkmJmUuZ2V0QXR0cmlidXRlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJob29rXCIpKTtpZighdHx8dGhpcy5vd25zRWxlbWVudChlKSl7dmFyIG49dGhpcy5saXZlU29ja2V0LmdldEhvb2tDYWxsYmFja3ModCk7aWYobil7ZS5pZHx8Sygnbm8gRE9NIElEIGZvciBob29rIFwiJy5jb25jYXQodCwnXCIuIEhvb2tzIHJlcXVpcmUgYSB1bmlxdWUgSUQgb24gZWFjaCBlbGVtZW50LicpLGUpO3ZhciBpPW5ldyBzZSh0aGlzLGUsbik7cmV0dXJuIHRoaXMudmlld0hvb2tzW3NlLmVsZW1lbnRJRChpLmVsKV09aSxpfW51bGwhPT10JiZLKCd1bmtub3duIGhvb2sgZm91bmQgZm9yIFwiJy5jb25jYXQodCwnXCInKSxlKX19fX0se2tleTpcImRlc3Ryb3lIb29rXCIsdmFsdWU6ZnVuY3Rpb24oZSl7ZS5fX3RyaWdnZXJfXyhcImRlc3Ryb3llZFwiKSxlLl9fY2xlYW51cF9fKCksZGVsZXRlIHRoaXMudmlld0hvb2tzW3NlLmVsZW1lbnRJRChlLmVsKV19fSx7a2V5OlwiYXBwbHlQZW5kaW5nVXBkYXRlc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLnBlbmRpbmdEaWZmcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPXQuZGlmZixpPXQuZXZlbnRzO3JldHVybiBlLnVwZGF0ZShuLGkpfSksdGhpcy5wZW5kaW5nRGlmZnM9W119fSx7a2V5Olwib25DaGFubmVsXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3RoaXMubGl2ZVNvY2tldC5vbkNoYW5uZWwodGhpcy5jaGFubmVsLGUsZnVuY3Rpb24oZSl7bi5pc0pvaW5QZW5kaW5nKCk/bi5yb290LnBlbmRpbmdKb2luT3BzLnB1c2goW24sZnVuY3Rpb24oKXtyZXR1cm4gdChlKX1dKTp0KGUpfSl9fSx7a2V5OlwiYmluZENoYW5uZWxcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5saXZlU29ja2V0Lm9uQ2hhbm5lbCh0aGlzLmNoYW5uZWwsXCJkaWZmXCIsZnVuY3Rpb24odCl7ZS5hcHBseURpZmYoXCJ1cGRhdGVcIix0LGZ1bmN0aW9uKHQpe3ZhciBuPXQuZGlmZixpPXQuZXZlbnRzO3JldHVybiBlLnVwZGF0ZShuLGkpfSl9KSx0aGlzLm9uQ2hhbm5lbChcInJlZGlyZWN0XCIsZnVuY3Rpb24odCl7dmFyIG49dC50byxpPXQuZmxhc2g7cmV0dXJuIGUub25SZWRpcmVjdCh7dG86bixmbGFzaDppfSl9KSx0aGlzLm9uQ2hhbm5lbChcImxpdmVfcGF0Y2hcIixmdW5jdGlvbih0KXtyZXR1cm4gZS5vbkxpdmVQYXRjaCh0KX0pLHRoaXMub25DaGFubmVsKFwibGl2ZV9yZWRpcmVjdFwiLGZ1bmN0aW9uKHQpe3JldHVybiBlLm9uTGl2ZVJlZGlyZWN0KHQpfSksdGhpcy5jaGFubmVsLm9uRXJyb3IoZnVuY3Rpb24odCl7cmV0dXJuIGUub25FcnJvcih0KX0pLHRoaXMuY2hhbm5lbC5vbkNsb3NlKGZ1bmN0aW9uKCl7cmV0dXJuIGUub25DbG9zZSgpfSl9fSx7a2V5OlwiZGVzdHJveUFsbENoaWxkcmVuXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdKXRoaXMuZ2V0Q2hpbGRCeUlkKGUpLmRlc3Ryb3koKX19LHtrZXk6XCJvbkxpdmVSZWRpcmVjdFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWUudG8sbj1lLmtpbmQsaT1lLmZsYXNoLHI9dGhpcy5leHBhbmRVUkwodCk7dGhpcy5saXZlU29ja2V0Lmhpc3RvcnlSZWRpcmVjdChyLG4saSl9fSx7a2V5Olwib25MaXZlUGF0Y2hcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lLnRvLG49ZS5raW5kO3RoaXMuaHJlZj10aGlzLmV4cGFuZFVSTCh0KSx0aGlzLmxpdmVTb2NrZXQuaGlzdG9yeVBhdGNoKHQsbil9fSx7a2V5OlwiZXhwYW5kVVJMXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3RhcnRzV2l0aChcIi9cIik/XCJcIi5jb25jYXQod2luZG93LmxvY2F0aW9uLnByb3RvY29sLFwiLy9cIikuY29uY2F0KHdpbmRvdy5sb2NhdGlvbi5ob3N0KS5jb25jYXQoZSk6ZX19LHtrZXk6XCJvblJlZGlyZWN0XCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50byxuPWUuZmxhc2g7dGhpcy5saXZlU29ja2V0LnJlZGlyZWN0KHQsbil9fSx7a2V5OlwiaXNEZXN0cm95ZWRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRlc3Ryb3llZH19LHtrZXk6XCJqb2luXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLnBhcmVudHx8KHRoaXMuc3RvcENhbGxiYWNrPXRoaXMubGl2ZVNvY2tldC53aXRoUGFnZUxvYWRpbmcoe3RvOnRoaXMuaHJlZixraW5kOlwiaW5pdGlhbFwifSkpLHRoaXMuam9pbkNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIGUmJmUodCx0LmpvaW5Db3VudCl9LHRoaXMubGl2ZVNvY2tldC53cmFwUHVzaChmdW5jdGlvbigpe3JldHVybiB0LmNoYW5uZWwuam9pbigpLnJlY2VpdmUoXCJva1wiLGZ1bmN0aW9uKGUpe3JldHVybiB0Lm9uSm9pbihlKX0pLnJlY2VpdmUoXCJlcnJvclwiLGZ1bmN0aW9uKGUpe3JldHVybiB0Lm9uSm9pbkVycm9yKGUpfSkucmVjZWl2ZShcInRpbWVvdXRcIixmdW5jdGlvbigpe3JldHVybiB0Lm9uSm9pbkVycm9yKHtyZWFzb246XCJ0aW1lb3V0XCJ9KX0pfSl9fSx7a2V5Olwib25Kb2luRXJyb3JcIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4oZS5yZWRpcmVjdHx8ZS5saXZlX3JlZGlyZWN0KSYmKHRoaXMuam9pblBlbmRpbmc9ITEsdGhpcy5jaGFubmVsLmxlYXZlKCkpLGUucmVkaXJlY3Q/dGhpcy5vblJlZGlyZWN0KGUucmVkaXJlY3QpOmUubGl2ZV9yZWRpcmVjdD90aGlzLm9uTGl2ZVJlZGlyZWN0KGUubGl2ZV9yZWRpcmVjdCk6KHRoaXMubG9nKFwiZXJyb3JcIixmdW5jdGlvbigpe3JldHVybltcInVuYWJsZSB0byBqb2luXCIsZV19KSx0aGlzLmxpdmVTb2NrZXQucmVsb2FkV2l0aEppdHRlcih0aGlzKSl9fSx7a2V5Olwib25DbG9zZVwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNEZXN0cm95ZWQoKSl7aWYodGhpcy5pc0pvaW5QZW5kaW5nKCl8fHRoaXMubGl2ZVNvY2tldC5oYXNQZW5kaW5nTGluaygpKXJldHVybiB0aGlzLmxpdmVTb2NrZXQucmVsb2FkV2l0aEppdHRlcih0aGlzKTt0aGlzLmRlc3Ryb3lBbGxDaGlsZHJlbigpLHRoaXMubGl2ZVNvY2tldC5kcm9wQWN0aXZlRWxlbWVudCh0aGlzKSxkb2N1bWVudC5hY3RpdmVFbGVtZW50JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKSx0aGlzLmxpdmVTb2NrZXQuaXNVbmxvYWRlZCgpJiZ0aGlzLnNob3dMb2FkZXIoMjAwKX19fSx7a2V5Olwib25FcnJvclwiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMub25DbG9zZSgpLHRoaXMubG9nKFwiZXJyb3JcIixmdW5jdGlvbigpe3JldHVybltcInZpZXcgY3Jhc2hlZFwiLGVdfSksdGhpcy5saXZlU29ja2V0LmlzVW5sb2FkZWQoKXx8dGhpcy5kaXNwbGF5RXJyb3IoKX19LHtrZXk6XCJkaXNwbGF5RXJyb3JcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuaXNNYWluKCkmJnJlLmRpc3BhdGNoRXZlbnQod2luZG93LFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLHt0bzp0aGlzLmhyZWYsa2luZDpcImVycm9yXCJ9KSx0aGlzLnNob3dMb2FkZXIoKSx0aGlzLnNldENvbnRhaW5lckNsYXNzZXMoXCJwaHgtZGlzY29ubmVjdGVkXCIsXCJwaHgtZXJyb3JcIil9fSx7a2V5OlwicHVzaFdpdGhSZXBseVwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10aGlzLHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOmZ1bmN0aW9uKCl7fSxvPUwoZT9lKCk6W251bGwsW11dLDIpLGE9b1swXSx1PUwob1sxXSwxKVswXSxjPWZ1bmN0aW9uKCl7fTtyZXR1cm4gdSYmbnVsbCE9PXUuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcInBhZ2UtbG9hZGluZ1wiKSkmJihjPXRoaXMubGl2ZVNvY2tldC53aXRoUGFnZUxvYWRpbmcoe2tpbmQ6XCJlbGVtZW50XCIsdGFyZ2V0OnV9KSksXCJudW1iZXJcIiE9dHlwZW9mIG4uY2lkJiZkZWxldGUgbi5jaWQsdGhpcy5saXZlU29ja2V0LndyYXBQdXNoKGZ1bmN0aW9uKCl7cmV0dXJuIGkuY2hhbm5lbC5wdXNoKHQsbiwzZTQpLnJlY2VpdmUoXCJva1wiLGZ1bmN0aW9uKGUpe3ZhciB0PW51bGw7bnVsbCE9PWEmJmkudW5kb1JlZnMoYSksZS5kaWZmJiYodD1pLmFwcGx5RGlmZihcInVwZGF0ZVwiLGUuZGlmZixmdW5jdGlvbihlKXt2YXIgdD1lLmRpZmYsbj1lLmV2ZW50cztpLnVwZGF0ZSh0LG4pfSkpLGUucmVkaXJlY3QmJmkub25SZWRpcmVjdChlLnJlZGlyZWN0KSxlLmxpdmVfcGF0Y2gmJmkub25MaXZlUGF0Y2goZS5saXZlX3BhdGNoKSxlLmxpdmVfcmVkaXJlY3QmJmkub25MaXZlUmVkaXJlY3QoZS5saXZlX3JlZGlyZWN0KSxjKCkscihlLHQpfSl9KX19LHtrZXk6XCJ1bmRvUmVmc1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmUuYWxsKHRoaXMuZWwsXCJbXCIuY29uY2F0KE0sJz1cIicpLmNvbmNhdChlLCdcIl0nKSxmdW5jdGlvbihlKXtlLnJlbW92ZUF0dHJpYnV0ZShNKSxudWxsIT09ZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1yZWFkb25seVwiKSYmKGUucmVhZE9ubHk9ITEsZS5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLXBoeC1yZWFkb25seVwiKSksbnVsbCE9PWUuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtZGlzYWJsZWRcIikmJihlLmRpc2FibGVkPSExLGUucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1waHgtZGlzYWJsZWRcIikpLEguZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gcmUucmVtb3ZlQ2xhc3MoZSx0KX0pO3ZhciBuPWUuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtZGlzYWJsZS13aXRoLXJlc3RvcmVcIik7bnVsbCE9PW4mJihlLmlubmVyVGV4dD1uLGUucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1waHgtZGlzYWJsZS13aXRoLXJlc3RvcmVcIikpO3ZhciBpPXJlLnByaXZhdGUoZSxNKTtpZihpKXt2YXIgcj10LnRyaWdnZXJCZWZvcmVVcGRhdGVIb29rKGUsaSk7YWUucGF0Y2hFbChlLGksdC5saXZlU29ja2V0LmdldEFjdGl2ZUVsZW1lbnQoKSksciYmdC50cmlnZ2VyVXBkYXRlZEhvb2socikscmUuZGVsZXRlUHJpdmF0ZShlLE0pfX0pfX0se2tleTpcInB1dFJlZlwiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5yZWYrKyxpPXRoaXMuYmluZGluZyhcImRpc2FibGUtd2l0aFwiKTtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2xhc3NMaXN0LmFkZChcInBoeC1cIi5jb25jYXQodCxcIi1sb2FkaW5nXCIpKSxlLnNldEF0dHJpYnV0ZShNLG4pO3ZhciByPWUuZ2V0QXR0cmlidXRlKGkpO251bGwhPT1yJiYoZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1kaXNhYmxlLXdpdGgtcmVzdG9yZVwiKXx8ZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1kaXNhYmxlLXdpdGgtcmVzdG9yZVwiLGUuaW5uZXJUZXh0KSxlLmlubmVyVGV4dD1yKX0pLFtuLGVdfX0se2tleTpcImNvbXBvbmVudElEXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKGopO3JldHVybiB0P3BhcnNlSW50KHQpOm51bGx9fSx7a2V5OlwidGFyZ2V0Q29tcG9uZW50SURcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiBlLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJ0YXJnZXRcIikpP3RoaXMuY2xvc2VzdENvbXBvbmVudElEKHQpOm51bGx9fSx7a2V5OlwiY2xvc2VzdENvbXBvbmVudElEXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gZT9aKGUuY2xvc2VzdChcIltcIi5jb25jYXQoaixcIl1cIikpLGZ1bmN0aW9uKGUpe3JldHVybiB0Lm93bnNFbGVtZW50KGUpJiZ0LmNvbXBvbmVudElEKGUpfSk6bnVsbH19LHtrZXk6XCJwdXNoSG9va0V2ZW50XCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4saSl7dmFyIHI9TCh0aGlzLnB1dFJlZihbXSxcImhvb2tcIiksMiksbz1yWzBdLGE9clsxXTtyZXR1cm4gdGhpcy5wdXNoV2l0aFJlcGx5KGZ1bmN0aW9uKCl7cmV0dXJuW28sYV19LFwiZXZlbnRcIix7dHlwZTpcImhvb2tcIixldmVudDp0LHZhbHVlOm4sY2lkOnRoaXMuY2xvc2VzdENvbXBvbmVudElEKGUpfSxmdW5jdGlvbihlLHQpe3JldHVybiBpKHQsbyl9KSxvfX0se2tleTpcImV4dHJhY3RNZXRhXCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49dGhpcy5iaW5kaW5nKFwidmFsdWUtXCIpLGk9MDtpPGUuYXR0cmlidXRlcy5sZW5ndGg7aSsrKXt2YXIgcj1lLmF0dHJpYnV0ZXNbaV0ubmFtZTtyLnN0YXJ0c1dpdGgobikmJih0W3IucmVwbGFjZShuLFwiXCIpXT1lLmdldEF0dHJpYnV0ZShyKSl9cmV0dXJuIHZvaWQgMCE9PWUudmFsdWUmJih0LnZhbHVlPWUudmFsdWUsXCJJTlBVVFwiPT09ZS50YWdOYW1lJiZKLmluZGV4T2YoZS50eXBlKT49MCYmIWUuY2hlY2tlZCYmZGVsZXRlIHQudmFsdWUpLHR9fSx7a2V5OlwicHVzaEV2ZW50XCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4saSxyKXt2YXIgbz10aGlzO3RoaXMucHVzaFdpdGhSZXBseShmdW5jdGlvbigpe3JldHVybiBvLnB1dFJlZihbdF0sZSl9LFwiZXZlbnRcIix7dHlwZTplLGV2ZW50OmksdmFsdWU6dGhpcy5leHRyYWN0TWV0YSh0LHIpLGNpZDp0aGlzLnRhcmdldENvbXBvbmVudElEKHQsbil9KX19LHtrZXk6XCJwdXNoS2V5XCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4saSxyKXt2YXIgbz10aGlzO3RoaXMucHVzaFdpdGhSZXBseShmdW5jdGlvbigpe3JldHVybiBvLnB1dFJlZihbZV0sbil9LFwiZXZlbnRcIix7dHlwZTpuLGV2ZW50OmksdmFsdWU6dGhpcy5leHRyYWN0TWV0YShlLHIpLGNpZDp0aGlzLnRhcmdldENvbXBvbmVudElEKGUsdCl9KX19LHtrZXk6XCJwdXNoSW5wdXRcIix2YWx1ZTpmdW5jdGlvbihlLHQsbixpLHIpe3ZhciBvPXRoaXM7dGhpcy5wdXNoV2l0aFJlcGx5KGZ1bmN0aW9uKCl7cmV0dXJuIG8ucHV0UmVmKFtlLGUuZm9ybV0sXCJjaGFuZ2VcIil9LFwiZXZlbnRcIix7dHlwZTpcImZvcm1cIixldmVudDpuLHZhbHVlOmVlKGUuZm9ybSx7X3RhcmdldDppLm5hbWV9KSxjaWQ6dGhpcy50YXJnZXRDb21wb25lbnRJRChlLmZvcm0sdCl9LHIpfX0se2tleTpcInB1c2hGb3JtU3VibWl0XCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4saSl7dmFyIHI9dGhpcyxvPWZ1bmN0aW9uKGUpe3JldHVybiFHKGUsXCJcIi5jb25jYXQoci5iaW5kaW5nKFwidXBkYXRlXCIpLFwiPWlnbm9yZVwiKSxlLmZvcm0pfTt0aGlzLnB1c2hXaXRoUmVwbHkoZnVuY3Rpb24oKXt2YXIgdD1yZS5hbGwoZSxcIltcIi5jb25jYXQoci5iaW5kaW5nKFwiZGlzYWJsZS13aXRoXCIpLFwiXVwiKSksbj1yZS5hbGwoZSxcImJ1dHRvblwiKS5maWx0ZXIobyksaT1yZS5hbGwoZSxcImlucHV0LHRleHRhcmVhLHNlbGVjdFwiKS5maWx0ZXIobyk7cmV0dXJuIG4uZm9yRWFjaChmdW5jdGlvbihlKXtlLnNldEF0dHJpYnV0ZShcImRhdGEtcGh4LWRpc2FibGVkXCIsZS5kaXNhYmxlZCksZS5kaXNhYmxlZD0hMH0pLGkuZm9yRWFjaChmdW5jdGlvbihlKXtlLnNldEF0dHJpYnV0ZShcImRhdGEtcGh4LXJlYWRvbmx5XCIsZS5yZWFkT25seSksZS5yZWFkT25seT0hMH0pLGUuc2V0QXR0cmlidXRlKHIuYmluZGluZyhcInBhZ2UtbG9hZGluZ1wiKSxcIlwiKSxyLnB1dFJlZihbZV0uY29uY2F0KHQpLmNvbmNhdChuKS5jb25jYXQoaSksXCJzdWJtaXRcIil9LFwiZXZlbnRcIix7dHlwZTpcImZvcm1cIixldmVudDpuLHZhbHVlOmVlKGUpLGNpZDp0aGlzLnRhcmdldENvbXBvbmVudElEKGUsdCl9LGkpfX0se2tleTpcInB1c2hGb3JtUmVjb3ZlcnlcIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7dGhpcy5saXZlU29ja2V0LndpdGhpbk93bmVycyhlLGZ1bmN0aW9uKGkscil7dmFyIG89ZS5lbGVtZW50c1swXSxhPWUuZ2V0QXR0cmlidXRlKG4uYmluZGluZyhcImF1dG8tcmVjb3ZlclwiKSl8fGUuZ2V0QXR0cmlidXRlKG4uYmluZGluZyhcImNoYW5nZVwiKSk7aS5wdXNoSW5wdXQobyxyLGEsbyx0KX0pfX0se2tleTpcInB1c2hMaW5rUGF0Y2hcIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7dmFyIGk9dGhpcyxyPXRoaXMubGl2ZVNvY2tldC5zZXRQZW5kaW5nTGluayhlKSxvPXQ/ZnVuY3Rpb24oKXtyZXR1cm4gaS5wdXRSZWYoW3RdLFwiY2xpY2tcIil9Om51bGw7dGhpcy5wdXNoV2l0aFJlcGx5KG8sXCJsaW5rXCIse3VybDplfSxmdW5jdGlvbih0KXt0LmxpbmtfcmVkaXJlY3Q/aS5saXZlU29ja2V0LnJlcGxhY2VNYWluKGUsbnVsbCxuLHIpOmkubGl2ZVNvY2tldC5jb21taXRQZW5kaW5nTGluayhyKSYmKGkuaHJlZj1lLGkuYXBwbHlQZW5kaW5nVXBkYXRlcygpLG4mJm4oKSl9KS5yZWNlaXZlKFwidGltZW91dFwiLGZ1bmN0aW9uKCl7cmV0dXJuIGkubGl2ZVNvY2tldC5yZWRpcmVjdCh3aW5kb3cubG9jYXRpb24uaHJlZil9KX19LHtrZXk6XCJmb3Jtc0ZvclJlY292ZXJ5XCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXRoaXMuYmluZGluZyhcImNoYW5nZVwiKSxpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtyZXR1cm4gaS5pbm5lckhUTUw9ZSxyZS5hbGwodGhpcy5lbCxcImZvcm1bXCIuY29uY2F0KG4sXCJdXCIpKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIHQub3duc0VsZW1lbnQoZSl9KS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuXCJpZ25vcmVcIiE9PWUuZ2V0QXR0cmlidXRlKHQuYmluZGluZyhcImF1dG8tcmVjb3ZlclwiKSl9KS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGkuY29udGVudC5xdWVyeVNlbGVjdG9yKFwiZm9ybVtcIi5jb25jYXQobiwnPVwiJykuY29uY2F0KGUuZ2V0QXR0cmlidXRlKG4pLCdcIl0nKSl9KX19LHtrZXk6XCJtYXliZVB1c2hDb21wb25lbnRzRGVzdHJveWVkXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPWUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiAwPT09cmUuZmluZENvbXBvbmVudE5vZGVMaXN0KHQuZWwsZSkubGVuZ3RofSk7bi5sZW5ndGg+MCYmdGhpcy5wdXNoV2l0aFJlcGx5KG51bGwsXCJjaWRzX2Rlc3Ryb3llZFwiLHtjaWRzOm59LGZ1bmN0aW9uKCl7dC5yZW5kZXJlZC5wcnVuZUNJRHMobil9KX19LHtrZXk6XCJvd25zRWxlbWVudFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LXBhcmVudC1pZFwiKT09PXRoaXMuaWR8fFooZS5jbG9zZXN0KEIpLGZ1bmN0aW9uKGUpe3JldHVybiBlLmlkfSk9PT10aGlzLmlkfX0se2tleTpcInN1Ym1pdEZvcm1cIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7dmFyIGk9dGhpcztyZS5wdXRQcml2YXRlKGUsXCJwaHgtaGFzLXN1Ym1pdHRlZFwiLCEwKSx0aGlzLmxpdmVTb2NrZXQuYmx1ckFjdGl2ZUVsZW1lbnQodGhpcyksdGhpcy5wdXNoRm9ybVN1Ym1pdChlLHQsbixmdW5jdGlvbigpe2kubGl2ZVNvY2tldC5yZXN0b3JlUHJldmlvdXNseUFjdGl2ZUZvY3VzKCl9KX19LHtrZXk6XCJiaW5kaW5nXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMubGl2ZVNvY2tldC5iaW5kaW5nKGUpfX1dKSxlfSgpLGNlPTEsc2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsbixpKXtmb3IodmFyIHIgaW4gQSh0aGlzLGUpLHRoaXMuX192aWV3PXQsdGhpcy5fX2xpdmVTb2NrZXQ9dC5saXZlU29ja2V0LHRoaXMuX19jYWxsYmFja3M9aSx0aGlzLl9fbGlzdGVuZXJzPW5ldyBTZXQsdGhpcy5lbD1uLHRoaXMudmlld05hbWU9dC5uYW1lKCksdGhpcy5lbC5waHhIb29rSWQ9dGhpcy5jb25zdHJ1Y3Rvci5tYWtlSUQoKSx0aGlzLl9fY2FsbGJhY2tzKXRoaXNbcl09dGhpcy5fX2NhbGxiYWNrc1tyXX1yZXR1cm4gUChlLG51bGwsW3trZXk6XCJtYWtlSURcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBjZSsrfX0se2tleTpcImVsZW1lbnRJRFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnBoeEhvb2tJZH19XSksUChlLFt7a2V5OlwicHVzaEV2ZW50XCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOmZ1bmN0aW9uKCl7fTtyZXR1cm4gdGhpcy5fX3ZpZXcucHVzaEhvb2tFdmVudChudWxsLGUsdCxuKX19LHtrZXk6XCJwdXNoRXZlbnRUb1wiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGk9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOmZ1bmN0aW9uKCl7fTtyZXR1cm4gdGhpcy5fX3ZpZXcud2l0aGluVGFyZ2V0cyhlLGZ1bmN0aW9uKGUscil7cmV0dXJuIGUucHVzaEhvb2tFdmVudChyLHQsbixpKX0pfX0se2tleTpcImhhbmRsZUV2ZW50XCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1mdW5jdGlvbihuLGkpe3JldHVybiBpP2U6dChuLmRldGFpbCl9O3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBoeDpob29rOlwiLmNvbmNhdChlKSxuKSx0aGlzLl9fbGlzdGVuZXJzLmFkZChuKSxufX0se2tleTpcInJlbW92ZUhhbmRsZUV2ZW50XCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZShudWxsLCEwKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBoeDpob29rOlwiLmNvbmNhdCh0KSxlKSx0aGlzLl9fbGlzdGVuZXJzLmRlbGV0ZShlKX19LHtrZXk6XCJfX2NsZWFudXBfX1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9fbGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGUucmVtb3ZlSGFuZGxlRXZlbnQodCl9KX19LHtrZXk6XCJfX3RyaWdnZXJfX1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX19jYWxsYmFja3NbZV07dCYmdC5jYWxsKHRoaXMpfX1dKSxlfSgpO3QuZGVmYXVsdD1uZX0sZnVuY3Rpb24oZSx0KXt2YXIgbjtuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7dHJ5e249bnx8RnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpfHwoMCxldmFsKShcInRoaXNcIil9Y2F0Y2goZSl7XCJvYmplY3RcIj09dHlwZW9mIHdpbmRvdyYmKG49d2luZG93KX1lLmV4cG9ydHM9bn0sZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbih0KXt0LlBob2VuaXh8fCh0LlBob2VuaXg9e30pLGUuZXhwb3J0cz10LlBob2VuaXguTGl2ZVZpZXc9bigwKX0pLmNhbGwodGhpcyxuKDEpKX1dKX0pOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../deps/phoenix_live_view/priv/static/phoenix_live_view.js\n"); + +/***/ }), + +/***/ "./css/app.scss": +/*!**********************!*\ + !*** ./css/app.scss ***! + \**********************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// extracted by mini-css-extract-plugin//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9jc3MvYXBwLnNjc3MuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jc3MvYXBwLnNjc3M/MjQyYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./css/app.scss\n"); + +/***/ }), + +/***/ "./js/app.js": +/*!*******************!*\ + !*** ./js/app.js ***! + \*******************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _css_app_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../css/app.scss */ \"./css/app.scss\");\n/* harmony import */ var _css_app_scss__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_css_app_scss__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var phoenix_html__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! phoenix_html */ \"../deps/phoenix_html/priv/static/phoenix_html.js\");\n/* harmony import */ var phoenix_html__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(phoenix_html__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var phoenix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! phoenix */ \"../deps/phoenix/priv/static/phoenix.js\");\n/* harmony import */ var phoenix__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(phoenix__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var nprogress__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! nprogress */ \"./node_modules/nprogress/nprogress.js\");\n/* harmony import */ var nprogress__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(nprogress__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var phoenix_live_view__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! phoenix_live_view */ \"../deps/phoenix_live_view/priv/static/phoenix_live_view.js\");\n/* harmony import */ var phoenix_live_view__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(phoenix_live_view__WEBPACK_IMPORTED_MODULE_4__);\n// We need to import the CSS so that webpack will load it.\n// The MiniCssExtractPlugin is used to separate it out into\n// its own CSS file.\n // webpack automatically bundles all modules in your\n// entry points. Those entry points can be configured\n// in \"webpack.config.js\".\n//\n// Import deps with the dep name or local files with a relative path, for example:\n//\n// import {Socket} from \"phoenix\"\n// import socket from \"./socket\"\n//\n\n\n\n\n\nvar csrfToken = document.querySelector(\"meta[name='csrf-token']\").getAttribute(\"content\");\nvar liveSocket = new phoenix_live_view__WEBPACK_IMPORTED_MODULE_4__[\"LiveSocket\"](\"/live\", phoenix__WEBPACK_IMPORTED_MODULE_2__[\"Socket\"], {\n params: {\n _csrf_token: csrfToken\n }\n}); // Show progress bar on live navigation and form submits\n\nwindow.addEventListener(\"phx:page-loading-start\", function (info) {\n return nprogress__WEBPACK_IMPORTED_MODULE_3___default.a.start();\n});\nwindow.addEventListener(\"phx:page-loading-stop\", function (info) {\n return nprogress__WEBPACK_IMPORTED_MODULE_3___default.a.done();\n}); // connect if there are any LiveViews on the page\n\nliveSocket.connect(); // expose liveSocket on window for web console debug logs and latency simulation:\n// >> liveSocket.enableDebug()\n// >> liveSocket.enableLatencySim(1000) // enabled for duration of browser session\n// >> liveSocket.disableLatencySim()\n\nwindow.liveSocket = liveSocket;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9qcy9hcHAuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9hcHAuanM/NzQ3MyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBXZSBuZWVkIHRvIGltcG9ydCB0aGUgQ1NTIHNvIHRoYXQgd2VicGFjayB3aWxsIGxvYWQgaXQuXG4vLyBUaGUgTWluaUNzc0V4dHJhY3RQbHVnaW4gaXMgdXNlZCB0byBzZXBhcmF0ZSBpdCBvdXQgaW50b1xuLy8gaXRzIG93biBDU1MgZmlsZS5cbmltcG9ydCBcIi4uL2Nzcy9hcHAuc2Nzc1wiXG5cbi8vIHdlYnBhY2sgYXV0b21hdGljYWxseSBidW5kbGVzIGFsbCBtb2R1bGVzIGluIHlvdXJcbi8vIGVudHJ5IHBvaW50cy4gVGhvc2UgZW50cnkgcG9pbnRzIGNhbiBiZSBjb25maWd1cmVkXG4vLyBpbiBcIndlYnBhY2suY29uZmlnLmpzXCIuXG4vL1xuLy8gSW1wb3J0IGRlcHMgd2l0aCB0aGUgZGVwIG5hbWUgb3IgbG9jYWwgZmlsZXMgd2l0aCBhIHJlbGF0aXZlIHBhdGgsIGZvciBleGFtcGxlOlxuLy9cbi8vICAgICBpbXBvcnQge1NvY2tldH0gZnJvbSBcInBob2VuaXhcIlxuLy8gICAgIGltcG9ydCBzb2NrZXQgZnJvbSBcIi4vc29ja2V0XCJcbi8vXG5pbXBvcnQgXCJwaG9lbml4X2h0bWxcIlxuaW1wb3J0IHtTb2NrZXR9IGZyb20gXCJwaG9lbml4XCJcbmltcG9ydCBOUHJvZ3Jlc3MgZnJvbSBcIm5wcm9ncmVzc1wiXG5pbXBvcnQge0xpdmVTb2NrZXR9IGZyb20gXCJwaG9lbml4X2xpdmVfdmlld1wiXG5cbmxldCBjc3JmVG9rZW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdjc3JmLXRva2VuJ11cIikuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKVxubGV0IGxpdmVTb2NrZXQgPSBuZXcgTGl2ZVNvY2tldChcIi9saXZlXCIsIFNvY2tldCwge3BhcmFtczoge19jc3JmX3Rva2VuOiBjc3JmVG9rZW59fSlcblxuLy8gU2hvdyBwcm9ncmVzcyBiYXIgb24gbGl2ZSBuYXZpZ2F0aW9uIGFuZCBmb3JtIHN1Ym1pdHNcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLCBpbmZvID0+IE5Qcm9ncmVzcy5zdGFydCgpKVxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwaHg6cGFnZS1sb2FkaW5nLXN0b3BcIiwgaW5mbyA9PiBOUHJvZ3Jlc3MuZG9uZSgpKVxuXG4vLyBjb25uZWN0IGlmIHRoZXJlIGFyZSBhbnkgTGl2ZVZpZXdzIG9uIHRoZSBwYWdlXG5saXZlU29ja2V0LmNvbm5lY3QoKVxuXG4vLyBleHBvc2UgbGl2ZVNvY2tldCBvbiB3aW5kb3cgZm9yIHdlYiBjb25zb2xlIGRlYnVnIGxvZ3MgYW5kIGxhdGVuY3kgc2ltdWxhdGlvbjpcbi8vID4+IGxpdmVTb2NrZXQuZW5hYmxlRGVidWcoKVxuLy8gPj4gbGl2ZVNvY2tldC5lbmFibGVMYXRlbmN5U2ltKDEwMDApICAvLyBlbmFibGVkIGZvciBkdXJhdGlvbiBvZiBicm93c2VyIHNlc3Npb25cbi8vID4+IGxpdmVTb2NrZXQuZGlzYWJsZUxhdGVuY3lTaW0oKVxud2luZG93LmxpdmVTb2NrZXQgPSBsaXZlU29ja2V0XG5cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./js/app.js\n"); + +/***/ }), + +/***/ "./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"); + + +/***/ }) + +/******/ }); \ No newline at end of file diff --git a/lp/priv/static/js/old.js b/lp/priv/static/js/old.js new file mode 100644 index 0000000..41d470d --- /dev/null +++ b/lp/priv/static/js/old.js @@ -0,0 +1,197 @@ +//__________________ https://gamecult.games/user/plugins/backtotop/assets/js/return-to-top.js +// ===== Scroll to Top ==== +$(window).scroll(function () { + if ($(this).scrollTop() >= 50) { // If page is scrolled more than 50px + $('#return-to-top').fadeIn(200); // Fade in the arrow + } else { + $('#return-to-top').fadeOut(200); // Else fade out the arrow + } +}); +$('#return-to-top').click(function () { // When arrow is clicked + $('body,html').animate({ + scrollTop: 0 // Scroll to top of body + }, 500); +}); +// __________________ https://gamecult.games/user/plugins/simplesearch/js/simplesearch.js +((function(){ + if (!Element.prototype.matches) { + Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector; + } + var findAncestor = function(el, selector) { + while ((el = el.parentElement) && !((el.matches || el.matchesSelector).call(el, selector))) {} + return el; + }; + + var fields = document.querySelectorAll('input[name="searchfield"][data-search-input]'); + Array.prototype.forEach.call(fields, function(field) { + var form = findAncestor(field, 'form[data-simplesearch-form]'), + min = field.getAttribute('data-min') || false, + location = field.getAttribute('data-search-input'), + separator = field.getAttribute('data-search-separator'); + + if (min) { + var invalid = field.getAttribute('data-search-invalid'); + field.addEventListener('keydown', function() { + field.setCustomValidity(field.value.length >= min ? '' : invalid); + }); + } + + form.addEventListener('submit', function(event) { + event.preventDefault(); + + if (field.checkValidity()) { + window.location.href = location + separator + field.value; + } + }); + }); +})()); + +//_______________ https://gamecult.games/user/themes/klb4/js/jquery.treemenu.js +/* + treeMenu - jQuery plugin + version: 0.6 + + Copyright 2014 Stepan Krapivin + +*/ +(function($){ + $.fn.treemenu = function(options) { + options = options || {}; + options.delay = options.delay || 0; + options.openActive = options.openActive || false; + options.closeOther = options.closeOther || false; + options.activeSelector = options.activeSelector || ".active"; + + this.addClass("treemenu"); + + if (!options.nonroot) { + this.addClass("treemenu-root"); + } + + options.nonroot = true; + + this.find("> li").each(function() { + e = $(this); + var subtree = e.find('> ul'); + var button = e.find('.toggler').eq(0); + + if(button.length == 0) { + // create toggler + var button = $(''); + button.addClass('toggler'); + e.prepend(button); + } + + if(subtree.length > 0) { + subtree.hide(); + + e.addClass('tree-closed'); + + e.find(button).click(function() { + var li = $(this).parent('li'); + + if (options.closeOther && li.hasClass('tree-closed')) { + var siblings = li.parent('ul').find("li:not(.tree-empty)"); + siblings.removeClass("tree-opened"); + siblings.addClass("tree-closed"); + siblings.removeClass(options.activeSelector); + siblings.find('> ul').slideUp(options.delay); + } + + li.find('> ul').slideToggle(options.delay); + li.toggleClass('tree-opened'); + li.toggleClass('tree-closed'); + li.toggleClass(options.activeSelector); + }); + + $(this).find('> ul').treemenu(options); + } else { + $(this).addClass('tree-empty'); + } + }); + + if (options.openActive) { + var cls = this.attr("class"); + + this.find(options.activeSelector).each(function(){ + var el = $(this).parent(); + + while (el.attr("class") !== cls) { + el.find('> ul').show(); + if(el.prop("tagName") === 'UL') { + el.show(); + } else if (el.prop("tagName") === 'LI') { + el.removeClass('tree-closed'); + el.addClass("tree-opened"); + el.show(); + } + + el = el.parent(); + } + }); + } + + return this; + } +})(jQuery); + +//____________________________ https://gamecult.games/user/themes/klb4/js/site.js +var isTouch = window.DocumentTouch && document instanceof DocumentTouch; + +function scrollHeader() { + // Has scrolled class on header + var zvalue = $(document).scrollTop(); + if ( zvalue > 75 ) + $("#header").addClass("scrolled"); + else + $("#header").removeClass("scrolled"); +} + +function parallaxBackground() { + $('.parallax').css('background-positionY', ($(window).scrollTop() * 0.3) + 'px'); +} + +jQuery(document).ready(function($){ + + scrollHeader(); + + // Scroll Events + if (!isTouch){ + $(document).scroll(function() { + scrollHeader(); + parallaxBackground(); + }); + }; + + // Touch scroll + $(document).on({ + 'touchmove': function(e) { + scrollHeader(); // Replace this with your code. + } + }); + + //Smooth scroll to start + $('#to-start').click(function(){ + var start_y = $('#start').position().top; + var header_offset = 45; + window.scroll({ top: start_y - header_offset, left: 0, behavior: 'smooth' }); + return false; + }); + + //Smooth scroll to top + $('#to-top').click(function(){ + window.scroll({ top: 0, left: 0, behavior: 'smooth' }); + return false; + }); + + // Responsive Menu + $('#toggle').click(function () { + $(this).toggleClass('active'); + $('#overlay').toggleClass('open'); + $('body').toggleClass('mobile-nav-open'); + }); + + // Tree Menu + $(".tree").treemenu({delay:300}); + +}); \ No newline at end of file diff --git a/lp/priv/static/robots.txt b/lp/priv/static/robots.txt new file mode 100644 index 0000000..3c9c7c0 --- /dev/null +++ b/lp/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: / diff --git a/lp/test/lp_web/live/page_live_test.exs b/lp/test/lp_web/live/page_live_test.exs new file mode 100644 index 0000000..eae34c5 --- /dev/null +++ b/lp/test/lp_web/live/page_live_test.exs @@ -0,0 +1,11 @@ +defmodule LpWeb.PageLiveTest do + use LpWeb.ConnCase + + import Phoenix.LiveViewTest + + test "disconnected and connected render", %{conn: conn} do + {:ok, page_live, disconnected_html} = live(conn, "/") + assert disconnected_html =~ "Welcome to Phoenix!" + assert render(page_live) =~ "Welcome to Phoenix!" + end +end diff --git a/lp/test/lp_web/views/error_view_test.exs b/lp/test/lp_web/views/error_view_test.exs new file mode 100644 index 0000000..1351eb2 --- /dev/null +++ b/lp/test/lp_web/views/error_view_test.exs @@ -0,0 +1,14 @@ +defmodule LpWeb.ErrorViewTest do + use LpWeb.ConnCase, async: true + + # Bring render/3 and render_to_string/3 for testing custom views + import Phoenix.View + + test "renders 404.html" do + assert render_to_string(LpWeb.ErrorView, "404.html", []) == "Not Found" + end + + test "renders 500.html" do + assert render_to_string(LpWeb.ErrorView, "500.html", []) == "Internal Server Error" + end +end diff --git a/lp/test/lp_web/views/layout_view_test.exs b/lp/test/lp_web/views/layout_view_test.exs new file mode 100644 index 0000000..f955b0d --- /dev/null +++ b/lp/test/lp_web/views/layout_view_test.exs @@ -0,0 +1,8 @@ +defmodule LpWeb.LayoutViewTest do + use LpWeb.ConnCase, async: true + + # When testing helpers, you may want to import Phoenix.HTML and + # use functions such as safe_to_string() to convert the helper + # result into an HTML string. + # import Phoenix.HTML +end diff --git a/lp/test/support/channel_case.ex b/lp/test/support/channel_case.ex new file mode 100644 index 0000000..9b896d0 --- /dev/null +++ b/lp/test/support/channel_case.ex @@ -0,0 +1,40 @@ +defmodule LpWeb.ChannelCase do + @moduledoc """ + This module defines the test case to be used by + channel tests. + + Such tests rely on `Phoenix.ChannelTest` and also + import other functionality to make it easier + to build common data structures and query the data layer. + + Finally, if the test case interacts with the database, + we enable the SQL sandbox, so changes done to the database + are reverted at the end of every test. If you are using + PostgreSQL, you can even run database tests asynchronously + by setting `use LpWeb.ChannelCase, async: true`, although + this option is not recommended for other databases. + """ + + use ExUnit.CaseTemplate + + using do + quote do + # Import conveniences for testing with channels + import Phoenix.ChannelTest + import LpWeb.ChannelCase + + # The default endpoint for testing + @endpoint LpWeb.Endpoint + end + end + + setup tags do + :ok = Ecto.Adapters.SQL.Sandbox.checkout(Lp.Repo) + + unless tags[:async] do + Ecto.Adapters.SQL.Sandbox.mode(Lp.Repo, {:shared, self()}) + end + + :ok + end +end diff --git a/lp/test/support/conn_case.ex b/lp/test/support/conn_case.ex new file mode 100644 index 0000000..3204f94 --- /dev/null +++ b/lp/test/support/conn_case.ex @@ -0,0 +1,43 @@ +defmodule LpWeb.ConnCase do + @moduledoc """ + This module defines the test case to be used by + tests that require setting up a connection. + + Such tests rely on `Phoenix.ConnTest` and also + import other functionality to make it easier + to build common data structures and query the data layer. + + Finally, if the test case interacts with the database, + we enable the SQL sandbox, so changes done to the database + are reverted at the end of every test. If you are using + PostgreSQL, you can even run database tests asynchronously + by setting `use LpWeb.ConnCase, async: true`, although + this option is not recommended for other databases. + """ + + use ExUnit.CaseTemplate + + using do + quote do + # Import conveniences for testing with connections + import Plug.Conn + import Phoenix.ConnTest + import LpWeb.ConnCase + + alias LpWeb.Router.Helpers, as: Routes + + # The default endpoint for testing + @endpoint LpWeb.Endpoint + end + end + + setup tags do + :ok = Ecto.Adapters.SQL.Sandbox.checkout(Lp.Repo) + + unless tags[:async] do + Ecto.Adapters.SQL.Sandbox.mode(Lp.Repo, {:shared, self()}) + end + + {:ok, conn: Phoenix.ConnTest.build_conn()} + end +end diff --git a/lp/test/support/data_case.ex b/lp/test/support/data_case.ex new file mode 100644 index 0000000..73b6a88 --- /dev/null +++ b/lp/test/support/data_case.ex @@ -0,0 +1,55 @@ +defmodule Lp.DataCase do + @moduledoc """ + This module defines the setup for tests requiring + access to the application's data layer. + + You may define functions here to be used as helpers in + your tests. + + Finally, if the test case interacts with the database, + we enable the SQL sandbox, so changes done to the database + are reverted at the end of every test. If you are using + PostgreSQL, you can even run database tests asynchronously + by setting `use Lp.DataCase, async: true`, although + this option is not recommended for other databases. + """ + + use ExUnit.CaseTemplate + + using do + quote do + alias Lp.Repo + + import Ecto + import Ecto.Changeset + import Ecto.Query + import Lp.DataCase + end + end + + setup tags do + :ok = Ecto.Adapters.SQL.Sandbox.checkout(Lp.Repo) + + unless tags[:async] do + Ecto.Adapters.SQL.Sandbox.mode(Lp.Repo, {:shared, self()}) + end + + :ok + end + + @doc """ + A helper that transforms changeset errors into a map of messages. + + assert {:error, changeset} = Accounts.create_user(%{password: "short"}) + assert "password is too short" in errors_on(changeset).password + assert %{password: ["password is too short"]} = errors_on(changeset) + + """ + def errors_on(changeset) do + Ecto.Changeset.traverse_errors(changeset, fn {message, opts} -> + Regex.replace(~r"%{(\w+)}", message, fn _, key -> + opts |> Keyword.get(String.to_existing_atom(key), key) |> to_string() + end) + end) + end +end diff --git a/lp/test/test_helper.exs b/lp/test/test_helper.exs new file mode 100644 index 0000000..5df81ec --- /dev/null +++ b/lp/test/test_helper.exs @@ -0,0 +1,2 @@ +ExUnit.start() +Ecto.Adapters.SQL.Sandbox.mode(Lp.Repo, :manual)