diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
new file mode 100644
index 0000000..0a170ac
--- /dev/null
+++ b/.devcontainer/Dockerfile
@@ -0,0 +1,47 @@
+FROM mcr.microsoft.com/devcontainers/base:jammy
+
+RUN apt update
+RUN apt install -y git curl inotify-tools wget
+
+# Erlang Deps
+RUN apt-get -y install build-essential autoconf m4 libncurses5-dev libwxgtk3.0-gtk3-dev libwxgtk-webview3.0-gtk3-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev libssh-dev unixodbc-dev xsltproc fop libxml2-utils libncurses-dev openjdk-11-jdk
+
+# Install Postgres
+ENV PGUSER=postgres
+ENV PGHOST=127.0.0.1
+RUN sudo sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
+RUN curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc|sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg
+RUN apt update
+RUN apt install -y postgresql-16
+# Postgres from anywhere!
+RUN sh -c 'echo "host all all all trust" > /etc/postgresql/16/main/pg_hba.conf'
+
+# Install ASDF
+RUN git clone https://github.com/asdf-vm/asdf.git /opt/asdf --branch v0.13.1
+
+# install Fly
+RUN curl -L https://fly.io/install.sh | sudo -u vscode sh
+RUN sh -c 'echo "export FLYCTL_INSTALL=/home/vscode/.fly" >> /home/vscode/.bashrc'
+RUN sh -c 'echo "export PATH=\"/home/vscode/.fly/bin:$PATH\"" >> /home/vscode/.bashrc'
+
+# install Elixir and Erlang
+ARG ELIXIR_VERSION=1.16.0
+ARG ERLANG_VERSION=26.2.1
+RUN sh -c 'echo "source /opt/asdf/asdf.sh" >> /home/vscode/.bashrc'
+RUN sudo -u vscode bash -c 'source /opt/asdf/asdf.sh && asdf plugin-add erlang https://github.com/asdf-vm/asdf-erlang.git'
+RUN sudo -u vscode bash -c "source /opt/asdf/asdf.sh && asdf install erlang $ERLANG_VERSION && asdf global erlang $ERLANG_VERSION"
+RUN sudo -u vscode bash -c 'source /opt/asdf/asdf.sh && asdf plugin-add elixir https://github.com/asdf-vm/asdf-elixir.git'
+RUN sudo -u vscode bash -c "source /opt/asdf/asdf.sh && asdf install elixir $ELIXIR_VERSION && asdf global elixir $ELIXIR_VERSION"
+
+# install NodeJS and Yarn
+ARG NODEJS_VERSION=21.6.1
+RUN sudo -u vscode bash -c 'source /opt/asdf/asdf.sh && asdf plugin-add nodejs https://github.com/asdf-vm/asdf-nodejs.git'
+RUN sudo -u vscode bash -c "source /opt/asdf/asdf.sh && asdf install nodejs $NODEJS_VERSION && asdf global nodejs $NODEJS_VERSION"
+RUN sudo -u vscode bash -c 'source /opt/asdf/asdf.sh && npm install --global yarn'
+
+# locale
+ENV LANG en_US.UTF-8
+ENV LC_ALL en_US.UTF-8
+ENV LANGUAGE en_US:en
+
+CMD ["/bin/bash"]
\ No newline at end of file
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
new file mode 100644
index 0000000..7159be9
--- /dev/null
+++ b/.devcontainer/devcontainer.json
@@ -0,0 +1,22 @@
+{
+ "name": "Ubuntu",
+ "build": {"dockerfile": "Dockerfile"},
+ "postCreateCommand": ". .devcontainer/init.sh",
+ "forwardPorts": [4000, 5432],
+
+ "customizations": {
+ "vscode": {
+ "extensions": [
+ "github.codespaces",
+ "tamasfe.even-better-toml",
+ "phoenixframework.phoenix",
+ "JakeBecker.elixir-ls",
+ "mechatroner.rainbow-csv",
+ "Arsen.darcula-theme-for-elixir",
+ "bradlc.vscode-tailwindcss",
+ "ms-azuretools.vscode-docker",
+ "ckolkman.vscode-postgres"
+ ]
+ }
+ }
+}
diff --git a/.devcontainer/init.sh b/.devcontainer/init.sh
new file mode 100644
index 0000000..0860fd3
--- /dev/null
+++ b/.devcontainer/init.sh
@@ -0,0 +1,3 @@
+sudo service postgresql start
+cd assets && yarn install && cd ..
+mix setup
\ No newline at end of file
diff --git a/.formatter.exs b/.formatter.exs
new file mode 100644
index 0000000..ef8840c
--- /dev/null
+++ b/.formatter.exs
@@ -0,0 +1,6 @@
+[
+ import_deps: [:ecto, :ecto_sql, :phoenix],
+ subdirectories: ["priv/*/migrations"],
+ plugins: [Phoenix.LiveView.HTMLFormatter],
+ inputs: ["*.{heex,ex,exs}", "{config,lib,test}/**/*.{heex,ex,exs}", "priv/*/seeds.exs"]
+]
diff --git a/.github/workflows/fly.yml b/.github/workflows/fly.yml
new file mode 100644
index 0000000..5bc64da
--- /dev/null
+++ b/.github/workflows/fly.yml
@@ -0,0 +1,37 @@
+name: Fly Deploy
+on:
+ push:
+ branches:
+ - main
+jobs:
+
+ test:
+ name: Test
+ runs-on: ubuntu-latest
+ services:
+ db:
+ image: postgres:latest
+ ports: ['5432:5432']
+ env:
+ POSTGRES_PASSWORD: postgres
+ options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
+ steps:
+ - uses: actions/checkout@v2
+ - uses: erlef/setup-beam@v1
+ with:
+ otp-version: '26.2.1'
+ elixir-version: '1.16.0'
+ - run: mix deps.get
+ - run: mix test
+
+ deploy:
+ name: Deploy app
+ runs-on: ubuntu-latest
+ needs:
+ - test
+ steps:
+ - uses: actions/checkout@v3
+ - uses: superfly/flyctl-actions/setup-flyctl@master
+ - run: flyctl deploy --remote-only
+ env:
+ FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..808a8b9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,37 @@
+# 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
+
+# Temporary files, for example, from tests.
+/tmp/
+
+# Ignore package tarball (built via "mix hex.build").
+multi_tenant-*.tar
+
+# Ignore assets that are produced by build tools.
+/priv/static/assets/
+
+# Ignore digested assets cache.
+/priv/static/cache_manifest.json
+
+# In case you use Node.js/npm, you want to ignore these.
+npm-debug.log
+/assets/node_modules/
+
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..18d8b60
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,31 @@
+{
+ // Use IntelliSense to learn about possible attributes.
+ // Hover to view descriptions of existing attributes.
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "type": "mix_task",
+ "name": "mix (Default task)",
+ "request": "launch",
+ "exitAfterTaskReturns": false,
+ "task": "phx.server",
+ "projectDir": "${workspaceRoot}"
+ },
+ {
+ "type": "mix_task",
+ "name": "mix test",
+ "request": "launch",
+ "task": "test",
+ "taskArgs": [
+ "--trace"
+ ],
+ "startApps": true,
+ "projectDir": "${workspaceRoot}",
+ "requireFiles": [
+ "test/**/test_helper.exs",
+ "test/**/*_test.exs"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..da1e2c7
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,52 @@
+{
+ "workbench.startupEditor": "newUntitledFile",
+ "files.associations": {
+ "*.csv": "plaintext",
+ "*.heex": "phoenix-heex"
+ },
+ "editor.columnSelection": false,
+ "redhat.telemetry.enabled": false,
+ "[xml]": {
+ "editor.defaultFormatter": "redhat.vscode-xml"
+ },
+ "git.confirmSync": false,
+ "editor.inlineSuggest.enabled": true,
+ "[markdown]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "workbench.colorTheme": "Darcula theme for Elixir",
+
+ "elixirLS.suggestSpecs": false,
+ "elixirLS.dialyzerEnabled": true,
+ "elixirLS.signatureAfterComplete": false,
+ "elixirLS.fetchDeps": false,
+
+ "files.exclude": {
+ "**/_build": true,
+ "**/deps": true,
+ "**/priv/static": true,
+ "**/.elixir_ls": true
+ },
+
+ "[elixir]": {
+ "editor.formatOnSave": true,
+ "editor.defaultFormatter": "JakeBecker.elixir-ls"
+ },
+
+ "[phoenix-heex]": {
+ "editor.formatOnSave": true,
+ "editor.defaultFormatter": "JakeBecker.elixir-ls"
+ },
+
+ "emmet.includeLanguages": {
+ "elixir": "html",
+ "phoenix-heex": "html"
+ },
+ "emmet.triggerExpansionOnTab": true,
+ "tailwindCSS.includeLanguages": {
+ "phoenix-heex": "html",
+ "elixir": "html",
+ // ...
+ },
+ }
+
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..6f6682f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,18 @@
+# MultiTenant
+
+To start your Phoenix server:
+
+ * Run `mix setup` to install and setup dependencies
+ * Start Phoenix endpoint with `mix phx.server` or inside IEx with `iex -S 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/assets/css/app.css b/assets/css/app.css
new file mode 100644
index 0000000..378c8f9
--- /dev/null
+++ b/assets/css/app.css
@@ -0,0 +1,5 @@
+@import "tailwindcss/base";
+@import "tailwindcss/components";
+@import "tailwindcss/utilities";
+
+/* This file is for your main application CSS */
diff --git a/assets/js/app.js b/assets/js/app.js
new file mode 100644
index 0000000..df0cdd9
--- /dev/null
+++ b/assets/js/app.js
@@ -0,0 +1,41 @@
+// If you want to use Phoenix channels, run `mix help phx.gen.channel`
+// to get started and then uncomment the line below.
+// import "./user_socket.js"
+
+// You can include dependencies in two ways.
+//
+// The simplest option is to put them in assets/vendor and
+// import them using relative paths:
+//
+// import "../vendor/some-package.js"
+//
+// Alternatively, you can `npm install some-package --prefix assets` and import
+// them using a path starting with the package name:
+//
+// import "some-package"
+//
+
+// Include phoenix_html to handle method=PUT/DELETE in forms and buttons.
+import "phoenix_html"
+// Establish Phoenix Socket and LiveView configuration.
+import {Socket} from "phoenix"
+import {LiveSocket} from "phoenix_live_view"
+import topbar from "../vendor/topbar"
+
+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
+topbar.config({barColors: {0: "#29d"}, shadowColor: "rgba(0, 0, 0, .3)"})
+window.addEventListener("phx:page-loading-start", _info => topbar.show(300))
+window.addEventListener("phx:page-loading-stop", _info => topbar.hide())
+
+// 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/assets/tailwind.config.js b/assets/tailwind.config.js
new file mode 100644
index 0000000..4d9f5ba
--- /dev/null
+++ b/assets/tailwind.config.js
@@ -0,0 +1,68 @@
+// See the Tailwind configuration guide for advanced usage
+// https://tailwindcss.com/docs/configuration
+
+const plugin = require("tailwindcss/plugin")
+const fs = require("fs")
+const path = require("path")
+
+module.exports = {
+ content: [
+ "./js/**/*.js",
+ "../lib/multi_tenant_web.ex",
+ "../lib/multi_tenant_web/**/*.*ex"
+ ],
+ theme: {
+ extend: {
+ colors: {
+ brand: "#FD4F00",
+ }
+ },
+ },
+ plugins: [
+ require("@tailwindcss/forms"),
+ // Allows prefixing tailwind classes with LiveView classes to add rules
+ // only when LiveView classes are applied, for example:
+ //
+ //
+ //
+ plugin(({addVariant}) => addVariant("phx-no-feedback", [".phx-no-feedback&", ".phx-no-feedback &"])),
+ plugin(({addVariant}) => addVariant("phx-click-loading", [".phx-click-loading&", ".phx-click-loading &"])),
+ plugin(({addVariant}) => addVariant("phx-submit-loading", [".phx-submit-loading&", ".phx-submit-loading &"])),
+ plugin(({addVariant}) => addVariant("phx-change-loading", [".phx-change-loading&", ".phx-change-loading &"])),
+
+ // Embeds Heroicons (https://heroicons.com) into your app.css bundle
+ // See your `CoreComponents.icon/1` for more information.
+ //
+ plugin(function({matchComponents, theme}) {
+ let iconsDir = path.join(__dirname, "./vendor/heroicons/optimized")
+ let values = {}
+ let icons = [
+ ["", "/24/outline"],
+ ["-solid", "/24/solid"],
+ ["-mini", "/20/solid"]
+ ]
+ icons.forEach(([suffix, dir]) => {
+ fs.readdirSync(path.join(iconsDir, dir)).forEach(file => {
+ let name = path.basename(file, ".svg") + suffix
+ values[name] = {name, fullPath: path.join(iconsDir, dir, file)}
+ })
+ })
+ matchComponents({
+ "hero": ({name, fullPath}) => {
+ let content = fs.readFileSync(fullPath).toString().replace(/\r?\n|\r/g, "")
+ return {
+ [`--hero-${name}`]: `url('data:image/svg+xml;utf8,${content}')`,
+ "-webkit-mask": `var(--hero-${name})`,
+ "mask": `var(--hero-${name})`,
+ "mask-repeat": "no-repeat",
+ "background-color": "currentColor",
+ "vertical-align": "middle",
+ "display": "inline-block",
+ "width": theme("spacing.5"),
+ "height": theme("spacing.5")
+ }
+ }
+ }, {values})
+ })
+ ]
+}
diff --git a/assets/vendor/heroicons/LICENSE.md b/assets/vendor/heroicons/LICENSE.md
new file mode 100644
index 0000000..1ac3e40
--- /dev/null
+++ b/assets/vendor/heroicons/LICENSE.md
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 Refactoring UI Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/assets/vendor/heroicons/UPGRADE.md b/assets/vendor/heroicons/UPGRADE.md
new file mode 100644
index 0000000..5a140b9
--- /dev/null
+++ b/assets/vendor/heroicons/UPGRADE.md
@@ -0,0 +1,6 @@
+You are running heroicons v2.0.16. To upgrade in place, you can run the following command,
+where your `HERO_VSN` export is your desired version:
+
+ export HERO_VSN="2.0.16" ; \
+ curl -L "https://github.com/tailwindlabs/heroicons/archive/refs/tags/v${HERO_VSN}.tar.gz" | \
+ tar -xvz --strip-components=1 heroicons-${HERO_VSN}/optimized
diff --git a/assets/vendor/heroicons/optimized/20/solid/academic-cap.svg b/assets/vendor/heroicons/optimized/20/solid/academic-cap.svg
new file mode 100644
index 0000000..bb980e6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/academic-cap.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/adjustments-horizontal.svg b/assets/vendor/heroicons/optimized/20/solid/adjustments-horizontal.svg
new file mode 100644
index 0000000..13f9251
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/adjustments-horizontal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/adjustments-vertical.svg b/assets/vendor/heroicons/optimized/20/solid/adjustments-vertical.svg
new file mode 100644
index 0000000..6f75b6c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/adjustments-vertical.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/archive-box-arrow-down.svg b/assets/vendor/heroicons/optimized/20/solid/archive-box-arrow-down.svg
new file mode 100644
index 0000000..5ccef9d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/archive-box-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/archive-box-x-mark.svg b/assets/vendor/heroicons/optimized/20/solid/archive-box-x-mark.svg
new file mode 100644
index 0000000..73acbef
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/archive-box-x-mark.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/archive-box.svg b/assets/vendor/heroicons/optimized/20/solid/archive-box.svg
new file mode 100644
index 0000000..2205ae8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/archive-box.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-down-circle.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-down-circle.svg
new file mode 100644
index 0000000..bb21a89
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-down-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-down-left.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-down-left.svg
new file mode 100644
index 0000000..f0c3624
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-down-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-down-on-square-stack.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-down-on-square-stack.svg
new file mode 100644
index 0000000..d9c4db0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-down-on-square-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-down-on-square.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-down-on-square.svg
new file mode 100644
index 0000000..4e8ee0f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-down-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-down-right.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-down-right.svg
new file mode 100644
index 0000000..65cdada
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-down-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-down-tray.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-down-tray.svg
new file mode 100644
index 0000000..5c3589d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-down-tray.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-down.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-down.svg
new file mode 100644
index 0000000..8d577b1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-left-circle.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-left-circle.svg
new file mode 100644
index 0000000..8cce243
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-left-circle.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-left-on-rectangle.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-left-on-rectangle.svg
new file mode 100644
index 0000000..74d0699
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-left-on-rectangle.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-left.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-left.svg
new file mode 100644
index 0000000..c7efd30
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-long-down.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-long-down.svg
new file mode 100644
index 0000000..d263061
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-long-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-long-left.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-long-left.svg
new file mode 100644
index 0000000..297553c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-long-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-long-right.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-long-right.svg
new file mode 100644
index 0000000..eea945e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-long-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-long-up.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-long-up.svg
new file mode 100644
index 0000000..193ff97
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-long-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-path-rounded-square.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-path-rounded-square.svg
new file mode 100644
index 0000000..7d3deb5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-path-rounded-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-path.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-path.svg
new file mode 100644
index 0000000..1a31b4c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-path.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-right-circle.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-right-circle.svg
new file mode 100644
index 0000000..4178da9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-right-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-right-on-rectangle.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-right-on-rectangle.svg
new file mode 100644
index 0000000..27c4dff
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-right-on-rectangle.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-right.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-right.svg
new file mode 100644
index 0000000..95cc517
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-small-down.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-small-down.svg
new file mode 100644
index 0000000..b986c6c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-small-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-small-left.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-small-left.svg
new file mode 100644
index 0000000..0cb7e71
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-small-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-small-right.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-small-right.svg
new file mode 100644
index 0000000..16beb5e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-small-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-small-up.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-small-up.svg
new file mode 100644
index 0000000..7fda0e5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-small-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-top-right-on-square.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-top-right-on-square.svg
new file mode 100644
index 0000000..c93df54
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-top-right-on-square.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-trending-down.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-trending-down.svg
new file mode 100644
index 0000000..5ec7c03
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-trending-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-trending-up.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-trending-up.svg
new file mode 100644
index 0000000..67af2cc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-trending-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-up-circle.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-up-circle.svg
new file mode 100644
index 0000000..21d87f2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-up-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-up-left.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-up-left.svg
new file mode 100644
index 0000000..fb50038
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-up-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-up-on-square-stack.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-up-on-square-stack.svg
new file mode 100644
index 0000000..0df0ed2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-up-on-square-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-up-on-square.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-up-on-square.svg
new file mode 100644
index 0000000..01f18a8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-up-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-up-right.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-up-right.svg
new file mode 100644
index 0000000..4841916
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-up-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-up-tray.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-up-tray.svg
new file mode 100644
index 0000000..832afe5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-up-tray.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-up.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-up.svg
new file mode 100644
index 0000000..24b12b7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-down.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-down.svg
new file mode 100644
index 0000000..6839676
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-left.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-left.svg
new file mode 100644
index 0000000..6691aa4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-right.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-right.svg
new file mode 100644
index 0000000..9a6e23b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-up.svg b/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-up.svg
new file mode 100644
index 0000000..8e65bf8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrow-uturn-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrows-pointing-in.svg b/assets/vendor/heroicons/optimized/20/solid/arrows-pointing-in.svg
new file mode 100644
index 0000000..6275807
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrows-pointing-in.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrows-pointing-out.svg b/assets/vendor/heroicons/optimized/20/solid/arrows-pointing-out.svg
new file mode 100644
index 0000000..14e1bcd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrows-pointing-out.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrows-right-left.svg b/assets/vendor/heroicons/optimized/20/solid/arrows-right-left.svg
new file mode 100644
index 0000000..87616d3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrows-right-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/arrows-up-down.svg b/assets/vendor/heroicons/optimized/20/solid/arrows-up-down.svg
new file mode 100644
index 0000000..b9c43d9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/arrows-up-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/at-symbol.svg b/assets/vendor/heroicons/optimized/20/solid/at-symbol.svg
new file mode 100644
index 0000000..a9e960d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/at-symbol.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/backspace.svg b/assets/vendor/heroicons/optimized/20/solid/backspace.svg
new file mode 100644
index 0000000..d3c1686
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/backspace.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/backward.svg b/assets/vendor/heroicons/optimized/20/solid/backward.svg
new file mode 100644
index 0000000..8d341b2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/backward.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/banknotes.svg b/assets/vendor/heroicons/optimized/20/solid/banknotes.svg
new file mode 100644
index 0000000..979c586
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/banknotes.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-2.svg b/assets/vendor/heroicons/optimized/20/solid/bars-2.svg
new file mode 100644
index 0000000..4ce1e19
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bars-2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-3-bottom-left.svg b/assets/vendor/heroicons/optimized/20/solid/bars-3-bottom-left.svg
new file mode 100644
index 0000000..ebf785d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bars-3-bottom-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-3-bottom-right.svg b/assets/vendor/heroicons/optimized/20/solid/bars-3-bottom-right.svg
new file mode 100644
index 0000000..af69c3d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bars-3-bottom-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-3-center-left.svg b/assets/vendor/heroicons/optimized/20/solid/bars-3-center-left.svg
new file mode 100644
index 0000000..ee8a526
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bars-3-center-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-3.svg b/assets/vendor/heroicons/optimized/20/solid/bars-3.svg
new file mode 100644
index 0000000..d164cfd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bars-3.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-4.svg b/assets/vendor/heroicons/optimized/20/solid/bars-4.svg
new file mode 100644
index 0000000..8e3f650
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bars-4.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-arrow-down.svg b/assets/vendor/heroicons/optimized/20/solid/bars-arrow-down.svg
new file mode 100644
index 0000000..fd8f98d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bars-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bars-arrow-up.svg b/assets/vendor/heroicons/optimized/20/solid/bars-arrow-up.svg
new file mode 100644
index 0000000..ba77dbe
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bars-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/battery-0.svg b/assets/vendor/heroicons/optimized/20/solid/battery-0.svg
new file mode 100644
index 0000000..2320f7e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/battery-0.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/battery-100.svg b/assets/vendor/heroicons/optimized/20/solid/battery-100.svg
new file mode 100644
index 0000000..e04408f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/battery-100.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/battery-50.svg b/assets/vendor/heroicons/optimized/20/solid/battery-50.svg
new file mode 100644
index 0000000..e5e8498
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/battery-50.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/beaker.svg b/assets/vendor/heroicons/optimized/20/solid/beaker.svg
new file mode 100644
index 0000000..025c46b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/beaker.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bell-alert.svg b/assets/vendor/heroicons/optimized/20/solid/bell-alert.svg
new file mode 100644
index 0000000..c84dc7c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bell-alert.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bell-slash.svg b/assets/vendor/heroicons/optimized/20/solid/bell-slash.svg
new file mode 100644
index 0000000..a4296ac
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bell-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bell-snooze.svg b/assets/vendor/heroicons/optimized/20/solid/bell-snooze.svg
new file mode 100644
index 0000000..ad4f8c5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bell-snooze.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bell.svg b/assets/vendor/heroicons/optimized/20/solid/bell.svg
new file mode 100644
index 0000000..2a81bba
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bell.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bolt-slash.svg b/assets/vendor/heroicons/optimized/20/solid/bolt-slash.svg
new file mode 100644
index 0000000..e4c2499
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bolt-slash.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bolt.svg b/assets/vendor/heroicons/optimized/20/solid/bolt.svg
new file mode 100644
index 0000000..53f4fb9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bolt.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/book-open.svg b/assets/vendor/heroicons/optimized/20/solid/book-open.svg
new file mode 100644
index 0000000..99cf0d4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/book-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bookmark-slash.svg b/assets/vendor/heroicons/optimized/20/solid/bookmark-slash.svg
new file mode 100644
index 0000000..1442fd4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bookmark-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bookmark-square.svg b/assets/vendor/heroicons/optimized/20/solid/bookmark-square.svg
new file mode 100644
index 0000000..849c425
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bookmark-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bookmark.svg b/assets/vendor/heroicons/optimized/20/solid/bookmark.svg
new file mode 100644
index 0000000..a3e68de
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bookmark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/briefcase.svg b/assets/vendor/heroicons/optimized/20/solid/briefcase.svg
new file mode 100644
index 0000000..275f4b3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/briefcase.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/bug-ant.svg b/assets/vendor/heroicons/optimized/20/solid/bug-ant.svg
new file mode 100644
index 0000000..bc86615
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/bug-ant.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/building-library.svg b/assets/vendor/heroicons/optimized/20/solid/building-library.svg
new file mode 100644
index 0000000..610bce7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/building-library.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/building-office-2.svg b/assets/vendor/heroicons/optimized/20/solid/building-office-2.svg
new file mode 100644
index 0000000..b25c33d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/building-office-2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/building-office.svg b/assets/vendor/heroicons/optimized/20/solid/building-office.svg
new file mode 100644
index 0000000..8fb3fab
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/building-office.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/building-storefront.svg b/assets/vendor/heroicons/optimized/20/solid/building-storefront.svg
new file mode 100644
index 0000000..0d7da7c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/building-storefront.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cake.svg b/assets/vendor/heroicons/optimized/20/solid/cake.svg
new file mode 100644
index 0000000..c58d3b9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cake.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/calculator.svg b/assets/vendor/heroicons/optimized/20/solid/calculator.svg
new file mode 100644
index 0000000..cc26160
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/calculator.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/calendar-days.svg b/assets/vendor/heroicons/optimized/20/solid/calendar-days.svg
new file mode 100644
index 0000000..ded2318
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/calendar-days.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/calendar.svg b/assets/vendor/heroicons/optimized/20/solid/calendar.svg
new file mode 100644
index 0000000..dea374d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/calendar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/camera.svg b/assets/vendor/heroicons/optimized/20/solid/camera.svg
new file mode 100644
index 0000000..17356ae
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/camera.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chart-bar-square.svg b/assets/vendor/heroicons/optimized/20/solid/chart-bar-square.svg
new file mode 100644
index 0000000..6d5b976
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chart-bar-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chart-bar.svg b/assets/vendor/heroicons/optimized/20/solid/chart-bar.svg
new file mode 100644
index 0000000..c496112
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chart-pie.svg b/assets/vendor/heroicons/optimized/20/solid/chart-pie.svg
new file mode 100644
index 0000000..37d18c9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chart-pie.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-bottom-center-text.svg b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-bottom-center-text.svg
new file mode 100644
index 0000000..fee91be
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-bottom-center-text.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-bottom-center.svg b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-bottom-center.svg
new file mode 100644
index 0000000..24de840
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-bottom-center.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left-ellipsis.svg b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left-ellipsis.svg
new file mode 100644
index 0000000..7e2b06c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left-ellipsis.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left-right.svg b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left-right.svg
new file mode 100644
index 0000000..fceca7f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left-right.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left.svg b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left.svg
new file mode 100644
index 0000000..cd706f9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-oval-left-ellipsis.svg b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-oval-left-ellipsis.svg
new file mode 100644
index 0000000..88d9c32
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-oval-left-ellipsis.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chat-bubble-oval-left.svg b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-oval-left.svg
new file mode 100644
index 0000000..f3b3883
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chat-bubble-oval-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/check-badge.svg b/assets/vendor/heroicons/optimized/20/solid/check-badge.svg
new file mode 100644
index 0000000..b13190c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/check-badge.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/check-circle.svg b/assets/vendor/heroicons/optimized/20/solid/check-circle.svg
new file mode 100644
index 0000000..dbbc905
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/check-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/check.svg b/assets/vendor/heroicons/optimized/20/solid/check.svg
new file mode 100644
index 0000000..d1956aa
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-double-down.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-double-down.svg
new file mode 100644
index 0000000..3c65193
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chevron-double-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-double-left.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-double-left.svg
new file mode 100644
index 0000000..a41e615
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chevron-double-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-double-right.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-double-right.svg
new file mode 100644
index 0000000..d78c932
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chevron-double-right.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-double-up.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-double-up.svg
new file mode 100644
index 0000000..f7ac668
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chevron-double-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-down.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-down.svg
new file mode 100644
index 0000000..6b63dfb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chevron-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-left.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-left.svg
new file mode 100644
index 0000000..b484a40
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chevron-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-right.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-right.svg
new file mode 100644
index 0000000..9ce3745
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chevron-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-up-down.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-up-down.svg
new file mode 100644
index 0000000..2499bb1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chevron-up-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/chevron-up.svg b/assets/vendor/heroicons/optimized/20/solid/chevron-up.svg
new file mode 100644
index 0000000..8aaaa1f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/chevron-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/circle-stack.svg b/assets/vendor/heroicons/optimized/20/solid/circle-stack.svg
new file mode 100644
index 0000000..fae2090
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/circle-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/clipboard-document-check.svg b/assets/vendor/heroicons/optimized/20/solid/clipboard-document-check.svg
new file mode 100644
index 0000000..2447012
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/clipboard-document-check.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/clipboard-document-list.svg b/assets/vendor/heroicons/optimized/20/solid/clipboard-document-list.svg
new file mode 100644
index 0000000..a78b24c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/clipboard-document-list.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/clipboard-document.svg b/assets/vendor/heroicons/optimized/20/solid/clipboard-document.svg
new file mode 100644
index 0000000..f29a433
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/clipboard-document.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/clipboard.svg b/assets/vendor/heroicons/optimized/20/solid/clipboard.svg
new file mode 100644
index 0000000..3b2a7ff
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/clipboard.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/clock.svg b/assets/vendor/heroicons/optimized/20/solid/clock.svg
new file mode 100644
index 0000000..d72dd62
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/clock.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cloud-arrow-down.svg b/assets/vendor/heroicons/optimized/20/solid/cloud-arrow-down.svg
new file mode 100644
index 0000000..cb32c04
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cloud-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cloud-arrow-up.svg b/assets/vendor/heroicons/optimized/20/solid/cloud-arrow-up.svg
new file mode 100644
index 0000000..06b2c4a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cloud-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cloud.svg b/assets/vendor/heroicons/optimized/20/solid/cloud.svg
new file mode 100644
index 0000000..c5eb0c8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cloud.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/code-bracket-square.svg b/assets/vendor/heroicons/optimized/20/solid/code-bracket-square.svg
new file mode 100644
index 0000000..e4e3530
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/code-bracket-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/code-bracket.svg b/assets/vendor/heroicons/optimized/20/solid/code-bracket.svg
new file mode 100644
index 0000000..4adfd32
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/code-bracket.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cog-6-tooth.svg b/assets/vendor/heroicons/optimized/20/solid/cog-6-tooth.svg
new file mode 100644
index 0000000..435032f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cog-6-tooth.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cog-8-tooth.svg b/assets/vendor/heroicons/optimized/20/solid/cog-8-tooth.svg
new file mode 100644
index 0000000..0450feb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cog-8-tooth.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cog.svg b/assets/vendor/heroicons/optimized/20/solid/cog.svg
new file mode 100644
index 0000000..10f43b5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cog.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/command-line.svg b/assets/vendor/heroicons/optimized/20/solid/command-line.svg
new file mode 100644
index 0000000..59cf34c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/command-line.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/computer-desktop.svg b/assets/vendor/heroicons/optimized/20/solid/computer-desktop.svg
new file mode 100644
index 0000000..4eeac1b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/computer-desktop.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cpu-chip.svg b/assets/vendor/heroicons/optimized/20/solid/cpu-chip.svg
new file mode 100644
index 0000000..f7c49b4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cpu-chip.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/credit-card.svg b/assets/vendor/heroicons/optimized/20/solid/credit-card.svg
new file mode 100644
index 0000000..d650fea
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/credit-card.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cube-transparent.svg b/assets/vendor/heroicons/optimized/20/solid/cube-transparent.svg
new file mode 100644
index 0000000..bfe9dae
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cube-transparent.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cube.svg b/assets/vendor/heroicons/optimized/20/solid/cube.svg
new file mode 100644
index 0000000..c3436ed
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cube.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/currency-bangladeshi.svg b/assets/vendor/heroicons/optimized/20/solid/currency-bangladeshi.svg
new file mode 100644
index 0000000..2a27260
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/currency-bangladeshi.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/currency-dollar.svg b/assets/vendor/heroicons/optimized/20/solid/currency-dollar.svg
new file mode 100644
index 0000000..1b00de7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/currency-dollar.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/currency-euro.svg b/assets/vendor/heroicons/optimized/20/solid/currency-euro.svg
new file mode 100644
index 0000000..43fda8e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/currency-euro.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/currency-pound.svg b/assets/vendor/heroicons/optimized/20/solid/currency-pound.svg
new file mode 100644
index 0000000..9bc57fe
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/currency-pound.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/currency-rupee.svg b/assets/vendor/heroicons/optimized/20/solid/currency-rupee.svg
new file mode 100644
index 0000000..67da528
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/currency-rupee.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/currency-yen.svg b/assets/vendor/heroicons/optimized/20/solid/currency-yen.svg
new file mode 100644
index 0000000..68fca06
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/currency-yen.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cursor-arrow-rays.svg b/assets/vendor/heroicons/optimized/20/solid/cursor-arrow-rays.svg
new file mode 100644
index 0000000..d2d36a7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cursor-arrow-rays.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/cursor-arrow-ripple.svg b/assets/vendor/heroicons/optimized/20/solid/cursor-arrow-ripple.svg
new file mode 100644
index 0000000..89ccfda
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/cursor-arrow-ripple.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/device-phone-mobile.svg b/assets/vendor/heroicons/optimized/20/solid/device-phone-mobile.svg
new file mode 100644
index 0000000..68fac4f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/device-phone-mobile.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/device-tablet.svg b/assets/vendor/heroicons/optimized/20/solid/device-tablet.svg
new file mode 100644
index 0000000..2490e1f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/device-tablet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/document-arrow-down.svg b/assets/vendor/heroicons/optimized/20/solid/document-arrow-down.svg
new file mode 100644
index 0000000..a51461d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/document-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/document-arrow-up.svg b/assets/vendor/heroicons/optimized/20/solid/document-arrow-up.svg
new file mode 100644
index 0000000..d55aacd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/document-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/document-chart-bar.svg b/assets/vendor/heroicons/optimized/20/solid/document-chart-bar.svg
new file mode 100644
index 0000000..8d5f60a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/document-chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/document-check.svg b/assets/vendor/heroicons/optimized/20/solid/document-check.svg
new file mode 100644
index 0000000..b28da14
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/document-check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/document-duplicate.svg b/assets/vendor/heroicons/optimized/20/solid/document-duplicate.svg
new file mode 100644
index 0000000..64768cf
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/document-duplicate.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/document-magnifying-glass.svg b/assets/vendor/heroicons/optimized/20/solid/document-magnifying-glass.svg
new file mode 100644
index 0000000..0dc8eba
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/document-magnifying-glass.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/document-minus.svg b/assets/vendor/heroicons/optimized/20/solid/document-minus.svg
new file mode 100644
index 0000000..bf7af06
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/document-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/document-plus.svg b/assets/vendor/heroicons/optimized/20/solid/document-plus.svg
new file mode 100644
index 0000000..133cc82
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/document-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/document-text.svg b/assets/vendor/heroicons/optimized/20/solid/document-text.svg
new file mode 100644
index 0000000..f7d91ba
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/document-text.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/document.svg b/assets/vendor/heroicons/optimized/20/solid/document.svg
new file mode 100644
index 0000000..aa7070c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/document.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/ellipsis-horizontal-circle.svg b/assets/vendor/heroicons/optimized/20/solid/ellipsis-horizontal-circle.svg
new file mode 100644
index 0000000..799cf88
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/ellipsis-horizontal-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/ellipsis-horizontal.svg b/assets/vendor/heroicons/optimized/20/solid/ellipsis-horizontal.svg
new file mode 100644
index 0000000..a82211c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/ellipsis-horizontal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/ellipsis-vertical.svg b/assets/vendor/heroicons/optimized/20/solid/ellipsis-vertical.svg
new file mode 100644
index 0000000..ac9c83f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/ellipsis-vertical.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/envelope-open.svg b/assets/vendor/heroicons/optimized/20/solid/envelope-open.svg
new file mode 100644
index 0000000..a60035b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/envelope-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/envelope.svg b/assets/vendor/heroicons/optimized/20/solid/envelope.svg
new file mode 100644
index 0000000..b582b8f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/envelope.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/exclamation-circle.svg b/assets/vendor/heroicons/optimized/20/solid/exclamation-circle.svg
new file mode 100644
index 0000000..3cf5b59
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/exclamation-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/exclamation-triangle.svg b/assets/vendor/heroicons/optimized/20/solid/exclamation-triangle.svg
new file mode 100644
index 0000000..a6cc02f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/exclamation-triangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/eye-dropper.svg b/assets/vendor/heroicons/optimized/20/solid/eye-dropper.svg
new file mode 100644
index 0000000..cce0833
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/eye-dropper.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/eye-slash.svg b/assets/vendor/heroicons/optimized/20/solid/eye-slash.svg
new file mode 100644
index 0000000..cc2e222
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/eye-slash.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/eye.svg b/assets/vendor/heroicons/optimized/20/solid/eye.svg
new file mode 100644
index 0000000..b17cec9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/eye.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/face-frown.svg b/assets/vendor/heroicons/optimized/20/solid/face-frown.svg
new file mode 100644
index 0000000..8cbb3b3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/face-frown.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/face-smile.svg b/assets/vendor/heroicons/optimized/20/solid/face-smile.svg
new file mode 100644
index 0000000..434c83e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/face-smile.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/film.svg b/assets/vendor/heroicons/optimized/20/solid/film.svg
new file mode 100644
index 0000000..9573445
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/film.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/finger-print.svg b/assets/vendor/heroicons/optimized/20/solid/finger-print.svg
new file mode 100644
index 0000000..409d67e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/finger-print.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/fire.svg b/assets/vendor/heroicons/optimized/20/solid/fire.svg
new file mode 100644
index 0000000..88fb85e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/fire.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/flag.svg b/assets/vendor/heroicons/optimized/20/solid/flag.svg
new file mode 100644
index 0000000..b790f05
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/flag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/folder-arrow-down.svg b/assets/vendor/heroicons/optimized/20/solid/folder-arrow-down.svg
new file mode 100644
index 0000000..4c2a915
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/folder-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/folder-minus.svg b/assets/vendor/heroicons/optimized/20/solid/folder-minus.svg
new file mode 100644
index 0000000..248388b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/folder-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/folder-open.svg b/assets/vendor/heroicons/optimized/20/solid/folder-open.svg
new file mode 100644
index 0000000..79d245e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/folder-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/folder-plus.svg b/assets/vendor/heroicons/optimized/20/solid/folder-plus.svg
new file mode 100644
index 0000000..0780a54
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/folder-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/folder.svg b/assets/vendor/heroicons/optimized/20/solid/folder.svg
new file mode 100644
index 0000000..c92e0ff
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/folder.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/forward.svg b/assets/vendor/heroicons/optimized/20/solid/forward.svg
new file mode 100644
index 0000000..11fd161
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/forward.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/funnel.svg b/assets/vendor/heroicons/optimized/20/solid/funnel.svg
new file mode 100644
index 0000000..af3078f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/funnel.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/gif.svg b/assets/vendor/heroicons/optimized/20/solid/gif.svg
new file mode 100644
index 0000000..ff1cd38
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/gif.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/gift-top.svg b/assets/vendor/heroicons/optimized/20/solid/gift-top.svg
new file mode 100644
index 0000000..d650d04
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/gift-top.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/gift.svg b/assets/vendor/heroicons/optimized/20/solid/gift.svg
new file mode 100644
index 0000000..90362ab
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/gift.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/globe-alt.svg b/assets/vendor/heroicons/optimized/20/solid/globe-alt.svg
new file mode 100644
index 0000000..c8ff599
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/globe-alt.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/globe-americas.svg b/assets/vendor/heroicons/optimized/20/solid/globe-americas.svg
new file mode 100644
index 0000000..7de8723
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/globe-americas.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/globe-asia-australia.svg b/assets/vendor/heroicons/optimized/20/solid/globe-asia-australia.svg
new file mode 100644
index 0000000..b3da4dd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/globe-asia-australia.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/globe-europe-africa.svg b/assets/vendor/heroicons/optimized/20/solid/globe-europe-africa.svg
new file mode 100644
index 0000000..92db1e1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/globe-europe-africa.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/hand-raised.svg b/assets/vendor/heroicons/optimized/20/solid/hand-raised.svg
new file mode 100644
index 0000000..caa27db
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/hand-raised.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/hand-thumb-down.svg b/assets/vendor/heroicons/optimized/20/solid/hand-thumb-down.svg
new file mode 100644
index 0000000..06ffbe0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/hand-thumb-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/hand-thumb-up.svg b/assets/vendor/heroicons/optimized/20/solid/hand-thumb-up.svg
new file mode 100644
index 0000000..3d67d98
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/hand-thumb-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/hashtag.svg b/assets/vendor/heroicons/optimized/20/solid/hashtag.svg
new file mode 100644
index 0000000..29c9f10
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/hashtag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/heart.svg b/assets/vendor/heroicons/optimized/20/solid/heart.svg
new file mode 100644
index 0000000..96e63d9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/heart.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/home-modern.svg b/assets/vendor/heroicons/optimized/20/solid/home-modern.svg
new file mode 100644
index 0000000..95033a3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/home-modern.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/home.svg b/assets/vendor/heroicons/optimized/20/solid/home.svg
new file mode 100644
index 0000000..ae2acdc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/home.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/identification.svg b/assets/vendor/heroicons/optimized/20/solid/identification.svg
new file mode 100644
index 0000000..7a8338c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/identification.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/inbox-arrow-down.svg b/assets/vendor/heroicons/optimized/20/solid/inbox-arrow-down.svg
new file mode 100644
index 0000000..37f464e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/inbox-arrow-down.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/inbox-stack.svg b/assets/vendor/heroicons/optimized/20/solid/inbox-stack.svg
new file mode 100644
index 0000000..b8f22d1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/inbox-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/inbox.svg b/assets/vendor/heroicons/optimized/20/solid/inbox.svg
new file mode 100644
index 0000000..87ae30d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/inbox.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/information-circle.svg b/assets/vendor/heroicons/optimized/20/solid/information-circle.svg
new file mode 100644
index 0000000..25ac644
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/information-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/key.svg b/assets/vendor/heroicons/optimized/20/solid/key.svg
new file mode 100644
index 0000000..97e8ad8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/key.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/language.svg b/assets/vendor/heroicons/optimized/20/solid/language.svg
new file mode 100644
index 0000000..e7524be
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/language.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/lifebuoy.svg b/assets/vendor/heroicons/optimized/20/solid/lifebuoy.svg
new file mode 100644
index 0000000..79134c1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/lifebuoy.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/light-bulb.svg b/assets/vendor/heroicons/optimized/20/solid/light-bulb.svg
new file mode 100644
index 0000000..415e374
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/light-bulb.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/link.svg b/assets/vendor/heroicons/optimized/20/solid/link.svg
new file mode 100644
index 0000000..e820413
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/link.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/list-bullet.svg b/assets/vendor/heroicons/optimized/20/solid/list-bullet.svg
new file mode 100644
index 0000000..3637934
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/list-bullet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/lock-closed.svg b/assets/vendor/heroicons/optimized/20/solid/lock-closed.svg
new file mode 100644
index 0000000..e7e1dc1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/lock-closed.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/lock-open.svg b/assets/vendor/heroicons/optimized/20/solid/lock-open.svg
new file mode 100644
index 0000000..2ac4b14
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/lock-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-circle.svg b/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-circle.svg
new file mode 100644
index 0000000..e025769
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-circle.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-minus.svg b/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-minus.svg
new file mode 100644
index 0000000..a8fb7a2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-minus.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-plus.svg b/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-plus.svg
new file mode 100644
index 0000000..e55fc4c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/magnifying-glass-plus.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/magnifying-glass.svg b/assets/vendor/heroicons/optimized/20/solid/magnifying-glass.svg
new file mode 100644
index 0000000..d90520a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/magnifying-glass.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/map-pin.svg b/assets/vendor/heroicons/optimized/20/solid/map-pin.svg
new file mode 100644
index 0000000..7adc8a9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/map-pin.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/map.svg b/assets/vendor/heroicons/optimized/20/solid/map.svg
new file mode 100644
index 0000000..7e25c7b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/map.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/megaphone.svg b/assets/vendor/heroicons/optimized/20/solid/megaphone.svg
new file mode 100644
index 0000000..cf73785
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/megaphone.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/microphone.svg b/assets/vendor/heroicons/optimized/20/solid/microphone.svg
new file mode 100644
index 0000000..635ded0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/microphone.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/minus-circle.svg b/assets/vendor/heroicons/optimized/20/solid/minus-circle.svg
new file mode 100644
index 0000000..5c361e2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/minus-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/minus-small.svg b/assets/vendor/heroicons/optimized/20/solid/minus-small.svg
new file mode 100644
index 0000000..4e041d3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/minus-small.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/minus.svg b/assets/vendor/heroicons/optimized/20/solid/minus.svg
new file mode 100644
index 0000000..6d8dd24
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/moon.svg b/assets/vendor/heroicons/optimized/20/solid/moon.svg
new file mode 100644
index 0000000..b592110
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/moon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/musical-note.svg b/assets/vendor/heroicons/optimized/20/solid/musical-note.svg
new file mode 100644
index 0000000..c7f0aa8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/musical-note.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/newspaper.svg b/assets/vendor/heroicons/optimized/20/solid/newspaper.svg
new file mode 100644
index 0000000..be785e3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/newspaper.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/no-symbol.svg b/assets/vendor/heroicons/optimized/20/solid/no-symbol.svg
new file mode 100644
index 0000000..8463da2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/no-symbol.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/paint-brush.svg b/assets/vendor/heroicons/optimized/20/solid/paint-brush.svg
new file mode 100644
index 0000000..c2db8c0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/paint-brush.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/paper-airplane.svg b/assets/vendor/heroicons/optimized/20/solid/paper-airplane.svg
new file mode 100644
index 0000000..35315ad
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/paper-airplane.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/paper-clip.svg b/assets/vendor/heroicons/optimized/20/solid/paper-clip.svg
new file mode 100644
index 0000000..b38155e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/paper-clip.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/pause-circle.svg b/assets/vendor/heroicons/optimized/20/solid/pause-circle.svg
new file mode 100644
index 0000000..732530a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/pause-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/pause.svg b/assets/vendor/heroicons/optimized/20/solid/pause.svg
new file mode 100644
index 0000000..b6544ba
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/pause.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/pencil-square.svg b/assets/vendor/heroicons/optimized/20/solid/pencil-square.svg
new file mode 100644
index 0000000..129ee44
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/pencil-square.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/pencil.svg b/assets/vendor/heroicons/optimized/20/solid/pencil.svg
new file mode 100644
index 0000000..fa50498
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/pencil.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/phone-arrow-down-left.svg b/assets/vendor/heroicons/optimized/20/solid/phone-arrow-down-left.svg
new file mode 100644
index 0000000..feeb636
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/phone-arrow-down-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/phone-arrow-up-right.svg b/assets/vendor/heroicons/optimized/20/solid/phone-arrow-up-right.svg
new file mode 100644
index 0000000..e1d9331
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/phone-arrow-up-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/phone-x-mark.svg b/assets/vendor/heroicons/optimized/20/solid/phone-x-mark.svg
new file mode 100644
index 0000000..6f1fd36
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/phone-x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/phone.svg b/assets/vendor/heroicons/optimized/20/solid/phone.svg
new file mode 100644
index 0000000..5fd57fc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/phone.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/photo.svg b/assets/vendor/heroicons/optimized/20/solid/photo.svg
new file mode 100644
index 0000000..db063d3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/photo.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/play-circle.svg b/assets/vendor/heroicons/optimized/20/solid/play-circle.svg
new file mode 100644
index 0000000..d1587b7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/play-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/play-pause.svg b/assets/vendor/heroicons/optimized/20/solid/play-pause.svg
new file mode 100644
index 0000000..cdfa63b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/play-pause.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/play.svg b/assets/vendor/heroicons/optimized/20/solid/play.svg
new file mode 100644
index 0000000..2cd53e1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/play.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/plus-circle.svg b/assets/vendor/heroicons/optimized/20/solid/plus-circle.svg
new file mode 100644
index 0000000..3925a14
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/plus-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/plus-small.svg b/assets/vendor/heroicons/optimized/20/solid/plus-small.svg
new file mode 100644
index 0000000..eb22598
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/plus-small.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/plus.svg b/assets/vendor/heroicons/optimized/20/solid/plus.svg
new file mode 100644
index 0000000..218ab93
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/power.svg b/assets/vendor/heroicons/optimized/20/solid/power.svg
new file mode 100644
index 0000000..1603820
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/power.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/presentation-chart-bar.svg b/assets/vendor/heroicons/optimized/20/solid/presentation-chart-bar.svg
new file mode 100644
index 0000000..e1a4242
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/presentation-chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/presentation-chart-line.svg b/assets/vendor/heroicons/optimized/20/solid/presentation-chart-line.svg
new file mode 100644
index 0000000..2e9281f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/presentation-chart-line.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/printer.svg b/assets/vendor/heroicons/optimized/20/solid/printer.svg
new file mode 100644
index 0000000..81d93dc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/printer.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/puzzle-piece.svg b/assets/vendor/heroicons/optimized/20/solid/puzzle-piece.svg
new file mode 100644
index 0000000..e5329e5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/puzzle-piece.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/qr-code.svg b/assets/vendor/heroicons/optimized/20/solid/qr-code.svg
new file mode 100644
index 0000000..d5daf2a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/qr-code.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/question-mark-circle.svg b/assets/vendor/heroicons/optimized/20/solid/question-mark-circle.svg
new file mode 100644
index 0000000..893dab5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/question-mark-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/queue-list.svg b/assets/vendor/heroicons/optimized/20/solid/queue-list.svg
new file mode 100644
index 0000000..91f5b57
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/queue-list.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/radio.svg b/assets/vendor/heroicons/optimized/20/solid/radio.svg
new file mode 100644
index 0000000..9a12c8b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/radio.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/receipt-percent.svg b/assets/vendor/heroicons/optimized/20/solid/receipt-percent.svg
new file mode 100644
index 0000000..1a8f254
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/receipt-percent.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/receipt-refund.svg b/assets/vendor/heroicons/optimized/20/solid/receipt-refund.svg
new file mode 100644
index 0000000..a134c56
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/receipt-refund.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/rectangle-group.svg b/assets/vendor/heroicons/optimized/20/solid/rectangle-group.svg
new file mode 100644
index 0000000..599d5f4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/rectangle-group.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/rectangle-stack.svg b/assets/vendor/heroicons/optimized/20/solid/rectangle-stack.svg
new file mode 100644
index 0000000..94b5654
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/rectangle-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/rocket-launch.svg b/assets/vendor/heroicons/optimized/20/solid/rocket-launch.svg
new file mode 100644
index 0000000..b97e89e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/rocket-launch.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/rss.svg b/assets/vendor/heroicons/optimized/20/solid/rss.svg
new file mode 100644
index 0000000..538ae9a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/rss.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/scale.svg b/assets/vendor/heroicons/optimized/20/solid/scale.svg
new file mode 100644
index 0000000..60b0ed9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/scale.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/scissors.svg b/assets/vendor/heroicons/optimized/20/solid/scissors.svg
new file mode 100644
index 0000000..3122658
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/scissors.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/server-stack.svg b/assets/vendor/heroicons/optimized/20/solid/server-stack.svg
new file mode 100644
index 0000000..2247dbe
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/server-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/server.svg b/assets/vendor/heroicons/optimized/20/solid/server.svg
new file mode 100644
index 0000000..6c8899b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/server.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/share.svg b/assets/vendor/heroicons/optimized/20/solid/share.svg
new file mode 100644
index 0000000..e5aafee
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/share.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/shield-check.svg b/assets/vendor/heroicons/optimized/20/solid/shield-check.svg
new file mode 100644
index 0000000..a8572d4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/shield-check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/shield-exclamation.svg b/assets/vendor/heroicons/optimized/20/solid/shield-exclamation.svg
new file mode 100644
index 0000000..8562de4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/shield-exclamation.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/shopping-bag.svg b/assets/vendor/heroicons/optimized/20/solid/shopping-bag.svg
new file mode 100644
index 0000000..e70c815
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/shopping-bag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/shopping-cart.svg b/assets/vendor/heroicons/optimized/20/solid/shopping-cart.svg
new file mode 100644
index 0000000..855a631
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/shopping-cart.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/signal-slash.svg b/assets/vendor/heroicons/optimized/20/solid/signal-slash.svg
new file mode 100644
index 0000000..822179a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/signal-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/signal.svg b/assets/vendor/heroicons/optimized/20/solid/signal.svg
new file mode 100644
index 0000000..7539204
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/signal.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/sparkles.svg b/assets/vendor/heroicons/optimized/20/solid/sparkles.svg
new file mode 100644
index 0000000..a247c94
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/sparkles.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/speaker-wave.svg b/assets/vendor/heroicons/optimized/20/solid/speaker-wave.svg
new file mode 100644
index 0000000..2e6b3e0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/speaker-wave.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/speaker-x-mark.svg b/assets/vendor/heroicons/optimized/20/solid/speaker-x-mark.svg
new file mode 100644
index 0000000..0c39f61
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/speaker-x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/square-2-stack.svg b/assets/vendor/heroicons/optimized/20/solid/square-2-stack.svg
new file mode 100644
index 0000000..177d43a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/square-2-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/square-3-stack-3d.svg b/assets/vendor/heroicons/optimized/20/solid/square-3-stack-3d.svg
new file mode 100644
index 0000000..7d6b44f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/square-3-stack-3d.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/squares-2x2.svg b/assets/vendor/heroicons/optimized/20/solid/squares-2x2.svg
new file mode 100644
index 0000000..47c1817
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/squares-2x2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/squares-plus.svg b/assets/vendor/heroicons/optimized/20/solid/squares-plus.svg
new file mode 100644
index 0000000..019eb37
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/squares-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/star.svg b/assets/vendor/heroicons/optimized/20/solid/star.svg
new file mode 100644
index 0000000..a870365
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/star.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/stop-circle.svg b/assets/vendor/heroicons/optimized/20/solid/stop-circle.svg
new file mode 100644
index 0000000..9167a64
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/stop-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/stop.svg b/assets/vendor/heroicons/optimized/20/solid/stop.svg
new file mode 100644
index 0000000..b0e40db
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/stop.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/sun.svg b/assets/vendor/heroicons/optimized/20/solid/sun.svg
new file mode 100644
index 0000000..449e36c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/sun.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/swatch.svg b/assets/vendor/heroicons/optimized/20/solid/swatch.svg
new file mode 100644
index 0000000..1089548
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/swatch.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/table-cells.svg b/assets/vendor/heroicons/optimized/20/solid/table-cells.svg
new file mode 100644
index 0000000..aa8eacd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/table-cells.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/tag.svg b/assets/vendor/heroicons/optimized/20/solid/tag.svg
new file mode 100644
index 0000000..d6c9c8b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/tag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/ticket.svg b/assets/vendor/heroicons/optimized/20/solid/ticket.svg
new file mode 100644
index 0000000..7d04b01
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/ticket.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/trash.svg b/assets/vendor/heroicons/optimized/20/solid/trash.svg
new file mode 100644
index 0000000..16bd5c6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/trash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/trophy.svg b/assets/vendor/heroicons/optimized/20/solid/trophy.svg
new file mode 100644
index 0000000..e2ebdaf
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/trophy.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/truck.svg b/assets/vendor/heroicons/optimized/20/solid/truck.svg
new file mode 100644
index 0000000..a50085a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/truck.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/tv.svg b/assets/vendor/heroicons/optimized/20/solid/tv.svg
new file mode 100644
index 0000000..b0c7209
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/tv.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/user-circle.svg b/assets/vendor/heroicons/optimized/20/solid/user-circle.svg
new file mode 100644
index 0000000..abd6c98
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/user-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/user-group.svg b/assets/vendor/heroicons/optimized/20/solid/user-group.svg
new file mode 100644
index 0000000..dc83736
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/user-group.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/user-minus.svg b/assets/vendor/heroicons/optimized/20/solid/user-minus.svg
new file mode 100644
index 0000000..b092b77
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/user-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/user-plus.svg b/assets/vendor/heroicons/optimized/20/solid/user-plus.svg
new file mode 100644
index 0000000..afd5965
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/user-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/user.svg b/assets/vendor/heroicons/optimized/20/solid/user.svg
new file mode 100644
index 0000000..4d9b2ee
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/user.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/users.svg b/assets/vendor/heroicons/optimized/20/solid/users.svg
new file mode 100644
index 0000000..43526a6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/users.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/variable.svg b/assets/vendor/heroicons/optimized/20/solid/variable.svg
new file mode 100644
index 0000000..3460817
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/variable.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/video-camera-slash.svg b/assets/vendor/heroicons/optimized/20/solid/video-camera-slash.svg
new file mode 100644
index 0000000..95b9413
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/video-camera-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/video-camera.svg b/assets/vendor/heroicons/optimized/20/solid/video-camera.svg
new file mode 100644
index 0000000..4d22f16
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/video-camera.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/view-columns.svg b/assets/vendor/heroicons/optimized/20/solid/view-columns.svg
new file mode 100644
index 0000000..1111492
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/view-columns.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/viewfinder-circle.svg b/assets/vendor/heroicons/optimized/20/solid/viewfinder-circle.svg
new file mode 100644
index 0000000..5cfe9fb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/viewfinder-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/wallet.svg b/assets/vendor/heroicons/optimized/20/solid/wallet.svg
new file mode 100644
index 0000000..6ce8050
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/wallet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/wifi.svg b/assets/vendor/heroicons/optimized/20/solid/wifi.svg
new file mode 100644
index 0000000..f3c7118
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/wifi.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/window.svg b/assets/vendor/heroicons/optimized/20/solid/window.svg
new file mode 100644
index 0000000..9110a2b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/window.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/wrench-screwdriver.svg b/assets/vendor/heroicons/optimized/20/solid/wrench-screwdriver.svg
new file mode 100644
index 0000000..2ad879f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/wrench-screwdriver.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/wrench.svg b/assets/vendor/heroicons/optimized/20/solid/wrench.svg
new file mode 100644
index 0000000..2643e00
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/wrench.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/x-circle.svg b/assets/vendor/heroicons/optimized/20/solid/x-circle.svg
new file mode 100644
index 0000000..a660014
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/x-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/20/solid/x-mark.svg b/assets/vendor/heroicons/optimized/20/solid/x-mark.svg
new file mode 100644
index 0000000..0635bac
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/20/solid/x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/academic-cap.svg b/assets/vendor/heroicons/optimized/24/outline/academic-cap.svg
new file mode 100644
index 0000000..fc18107
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/academic-cap.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/adjustments-horizontal.svg b/assets/vendor/heroicons/optimized/24/outline/adjustments-horizontal.svg
new file mode 100644
index 0000000..e859e5d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/adjustments-horizontal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/adjustments-vertical.svg b/assets/vendor/heroicons/optimized/24/outline/adjustments-vertical.svg
new file mode 100644
index 0000000..6153809
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/adjustments-vertical.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/archive-box-arrow-down.svg b/assets/vendor/heroicons/optimized/24/outline/archive-box-arrow-down.svg
new file mode 100644
index 0000000..1a0a830
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/archive-box-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/archive-box-x-mark.svg b/assets/vendor/heroicons/optimized/24/outline/archive-box-x-mark.svg
new file mode 100644
index 0000000..49bd087
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/archive-box-x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/archive-box.svg b/assets/vendor/heroicons/optimized/24/outline/archive-box.svg
new file mode 100644
index 0000000..704f353
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/archive-box.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-down-circle.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-down-circle.svg
new file mode 100644
index 0000000..248b0e8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-down-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-down-left.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-down-left.svg
new file mode 100644
index 0000000..262b5ff
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-down-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-down-on-square-stack.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-down-on-square-stack.svg
new file mode 100644
index 0000000..42a5b84
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-down-on-square-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-down-on-square.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-down-on-square.svg
new file mode 100644
index 0000000..da1b827
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-down-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-down-right.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-down-right.svg
new file mode 100644
index 0000000..9cc7a30
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-down-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-down-tray.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-down-tray.svg
new file mode 100644
index 0000000..a77546c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-down-tray.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-down.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-down.svg
new file mode 100644
index 0000000..b5b04fd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-left-circle.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-left-circle.svg
new file mode 100644
index 0000000..849cc5f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-left-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-left-on-rectangle.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-left-on-rectangle.svg
new file mode 100644
index 0000000..0d6a3cc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-left-on-rectangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-left.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-left.svg
new file mode 100644
index 0000000..49f15d4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-long-down.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-long-down.svg
new file mode 100644
index 0000000..eb7a92b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-long-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-long-left.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-long-left.svg
new file mode 100644
index 0000000..d3e9005
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-long-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-long-right.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-long-right.svg
new file mode 100644
index 0000000..413d6b5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-long-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-long-up.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-long-up.svg
new file mode 100644
index 0000000..fb029f4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-long-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-path-rounded-square.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-path-rounded-square.svg
new file mode 100644
index 0000000..0cfe39e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-path-rounded-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-path.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-path.svg
new file mode 100644
index 0000000..7da4fd2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-path.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-right-circle.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-right-circle.svg
new file mode 100644
index 0000000..e7bcb80
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-right-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-right-on-rectangle.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-right-on-rectangle.svg
new file mode 100644
index 0000000..2b49bec
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-right-on-rectangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-right.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-right.svg
new file mode 100644
index 0000000..8527a52
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-small-down.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-small-down.svg
new file mode 100644
index 0000000..1f1a210
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-small-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-small-left.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-small-left.svg
new file mode 100644
index 0000000..778cb17
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-small-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-small-right.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-small-right.svg
new file mode 100644
index 0000000..1b5fc64
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-small-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-small-up.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-small-up.svg
new file mode 100644
index 0000000..4ed197e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-small-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-top-right-on-square.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-top-right-on-square.svg
new file mode 100644
index 0000000..c4a9239
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-top-right-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-trending-down.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-trending-down.svg
new file mode 100644
index 0000000..aebbb18
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-trending-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-trending-up.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-trending-up.svg
new file mode 100644
index 0000000..868f3d3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-trending-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-up-circle.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-up-circle.svg
new file mode 100644
index 0000000..51340d6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-up-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-up-left.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-up-left.svg
new file mode 100644
index 0000000..ba4e54e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-up-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-up-on-square-stack.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-up-on-square-stack.svg
new file mode 100644
index 0000000..0d4d823
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-up-on-square-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-up-on-square.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-up-on-square.svg
new file mode 100644
index 0000000..2c38ea0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-up-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-up-right.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-up-right.svg
new file mode 100644
index 0000000..0b7a372
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-up-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-up-tray.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-up-tray.svg
new file mode 100644
index 0000000..448b853
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-up-tray.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-up.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-up.svg
new file mode 100644
index 0000000..e269624
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-down.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-down.svg
new file mode 100644
index 0000000..51f9929
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-left.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-left.svg
new file mode 100644
index 0000000..b8f240e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-right.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-right.svg
new file mode 100644
index 0000000..ece5091
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-up.svg b/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-up.svg
new file mode 100644
index 0000000..b76c54b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrow-uturn-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrows-pointing-in.svg b/assets/vendor/heroicons/optimized/24/outline/arrows-pointing-in.svg
new file mode 100644
index 0000000..0a8872d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrows-pointing-in.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrows-pointing-out.svg b/assets/vendor/heroicons/optimized/24/outline/arrows-pointing-out.svg
new file mode 100644
index 0000000..936ac45
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrows-pointing-out.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrows-right-left.svg b/assets/vendor/heroicons/optimized/24/outline/arrows-right-left.svg
new file mode 100644
index 0000000..18890f3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrows-right-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/arrows-up-down.svg b/assets/vendor/heroicons/optimized/24/outline/arrows-up-down.svg
new file mode 100644
index 0000000..da4cdf3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/arrows-up-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/at-symbol.svg b/assets/vendor/heroicons/optimized/24/outline/at-symbol.svg
new file mode 100644
index 0000000..fe2f644
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/at-symbol.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/backspace.svg b/assets/vendor/heroicons/optimized/24/outline/backspace.svg
new file mode 100644
index 0000000..f76c5df
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/backspace.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/backward.svg b/assets/vendor/heroicons/optimized/24/outline/backward.svg
new file mode 100644
index 0000000..fb1da49
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/backward.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/banknotes.svg b/assets/vendor/heroicons/optimized/24/outline/banknotes.svg
new file mode 100644
index 0000000..0603b0d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/banknotes.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-2.svg b/assets/vendor/heroicons/optimized/24/outline/bars-2.svg
new file mode 100644
index 0000000..9c49ca2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bars-2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-3-bottom-left.svg b/assets/vendor/heroicons/optimized/24/outline/bars-3-bottom-left.svg
new file mode 100644
index 0000000..e23bbc3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bars-3-bottom-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-3-bottom-right.svg b/assets/vendor/heroicons/optimized/24/outline/bars-3-bottom-right.svg
new file mode 100644
index 0000000..a0f683d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bars-3-bottom-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-3-center-left.svg b/assets/vendor/heroicons/optimized/24/outline/bars-3-center-left.svg
new file mode 100644
index 0000000..a8e83e1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bars-3-center-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-3.svg b/assets/vendor/heroicons/optimized/24/outline/bars-3.svg
new file mode 100644
index 0000000..a7cf320
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bars-3.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-4.svg b/assets/vendor/heroicons/optimized/24/outline/bars-4.svg
new file mode 100644
index 0000000..f34bddf
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bars-4.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-arrow-down.svg b/assets/vendor/heroicons/optimized/24/outline/bars-arrow-down.svg
new file mode 100644
index 0000000..200fd3a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bars-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bars-arrow-up.svg b/assets/vendor/heroicons/optimized/24/outline/bars-arrow-up.svg
new file mode 100644
index 0000000..d88bf4e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bars-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/battery-0.svg b/assets/vendor/heroicons/optimized/24/outline/battery-0.svg
new file mode 100644
index 0000000..fd2aa9d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/battery-0.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/battery-100.svg b/assets/vendor/heroicons/optimized/24/outline/battery-100.svg
new file mode 100644
index 0000000..ba012c6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/battery-100.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/battery-50.svg b/assets/vendor/heroicons/optimized/24/outline/battery-50.svg
new file mode 100644
index 0000000..f6f9838
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/battery-50.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/beaker.svg b/assets/vendor/heroicons/optimized/24/outline/beaker.svg
new file mode 100644
index 0000000..2d143fd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/beaker.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bell-alert.svg b/assets/vendor/heroicons/optimized/24/outline/bell-alert.svg
new file mode 100644
index 0000000..c4af427
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bell-alert.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bell-slash.svg b/assets/vendor/heroicons/optimized/24/outline/bell-slash.svg
new file mode 100644
index 0000000..2df7520
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bell-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bell-snooze.svg b/assets/vendor/heroicons/optimized/24/outline/bell-snooze.svg
new file mode 100644
index 0000000..117de29
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bell-snooze.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bell.svg b/assets/vendor/heroicons/optimized/24/outline/bell.svg
new file mode 100644
index 0000000..63ab153
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bell.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bolt-slash.svg b/assets/vendor/heroicons/optimized/24/outline/bolt-slash.svg
new file mode 100644
index 0000000..13af346
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bolt-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bolt.svg b/assets/vendor/heroicons/optimized/24/outline/bolt.svg
new file mode 100644
index 0000000..5e629fe
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bolt.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/book-open.svg b/assets/vendor/heroicons/optimized/24/outline/book-open.svg
new file mode 100644
index 0000000..a4153b6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/book-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bookmark-slash.svg b/assets/vendor/heroicons/optimized/24/outline/bookmark-slash.svg
new file mode 100644
index 0000000..f3ae625
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bookmark-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bookmark-square.svg b/assets/vendor/heroicons/optimized/24/outline/bookmark-square.svg
new file mode 100644
index 0000000..00e5cc3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bookmark-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bookmark.svg b/assets/vendor/heroicons/optimized/24/outline/bookmark.svg
new file mode 100644
index 0000000..6d06e4f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bookmark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/briefcase.svg b/assets/vendor/heroicons/optimized/24/outline/briefcase.svg
new file mode 100644
index 0000000..adab6ff
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/briefcase.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/bug-ant.svg b/assets/vendor/heroicons/optimized/24/outline/bug-ant.svg
new file mode 100644
index 0000000..ac04fad
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/bug-ant.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/building-library.svg b/assets/vendor/heroicons/optimized/24/outline/building-library.svg
new file mode 100644
index 0000000..4e2e1da
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/building-library.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/building-office-2.svg b/assets/vendor/heroicons/optimized/24/outline/building-office-2.svg
new file mode 100644
index 0000000..45e063c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/building-office-2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/building-office.svg b/assets/vendor/heroicons/optimized/24/outline/building-office.svg
new file mode 100644
index 0000000..0efd982
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/building-office.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/building-storefront.svg b/assets/vendor/heroicons/optimized/24/outline/building-storefront.svg
new file mode 100644
index 0000000..31fca55
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/building-storefront.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cake.svg b/assets/vendor/heroicons/optimized/24/outline/cake.svg
new file mode 100644
index 0000000..a603e90
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cake.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/calculator.svg b/assets/vendor/heroicons/optimized/24/outline/calculator.svg
new file mode 100644
index 0000000..d97740e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/calculator.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/calendar-days.svg b/assets/vendor/heroicons/optimized/24/outline/calendar-days.svg
new file mode 100644
index 0000000..64b5f8f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/calendar-days.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/calendar.svg b/assets/vendor/heroicons/optimized/24/outline/calendar.svg
new file mode 100644
index 0000000..5e44911
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/calendar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/camera.svg b/assets/vendor/heroicons/optimized/24/outline/camera.svg
new file mode 100644
index 0000000..b8bdae3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/camera.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chart-bar-square.svg b/assets/vendor/heroicons/optimized/24/outline/chart-bar-square.svg
new file mode 100644
index 0000000..d7fa42c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chart-bar-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chart-bar.svg b/assets/vendor/heroicons/optimized/24/outline/chart-bar.svg
new file mode 100644
index 0000000..27f20fa
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chart-pie.svg b/assets/vendor/heroicons/optimized/24/outline/chart-pie.svg
new file mode 100644
index 0000000..fa51c16
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chart-pie.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-bottom-center-text.svg b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-bottom-center-text.svg
new file mode 100644
index 0000000..4bc306e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-bottom-center-text.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-bottom-center.svg b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-bottom-center.svg
new file mode 100644
index 0000000..d59d02a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-bottom-center.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left-ellipsis.svg b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left-ellipsis.svg
new file mode 100644
index 0000000..9a0ec73
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left-ellipsis.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left-right.svg b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left-right.svg
new file mode 100644
index 0000000..4d366b8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left.svg b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left.svg
new file mode 100644
index 0000000..a41bf1e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-oval-left-ellipsis.svg b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-oval-left-ellipsis.svg
new file mode 100644
index 0000000..83d1751
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-oval-left-ellipsis.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chat-bubble-oval-left.svg b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-oval-left.svg
new file mode 100644
index 0000000..d0d0d89
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chat-bubble-oval-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/check-badge.svg b/assets/vendor/heroicons/optimized/24/outline/check-badge.svg
new file mode 100644
index 0000000..8d6b79a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/check-badge.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/check-circle.svg b/assets/vendor/heroicons/optimized/24/outline/check-circle.svg
new file mode 100644
index 0000000..d4471d6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/check-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/check.svg b/assets/vendor/heroicons/optimized/24/outline/check.svg
new file mode 100644
index 0000000..7644e30
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-double-down.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-double-down.svg
new file mode 100644
index 0000000..d7e9370
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chevron-double-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-double-left.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-double-left.svg
new file mode 100644
index 0000000..95834af
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chevron-double-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-double-right.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-double-right.svg
new file mode 100644
index 0000000..37a809d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chevron-double-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-double-up.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-double-up.svg
new file mode 100644
index 0000000..5182691
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chevron-double-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-down.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-down.svg
new file mode 100644
index 0000000..b38efa5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chevron-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-left.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-left.svg
new file mode 100644
index 0000000..73fe99a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chevron-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-right.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-right.svg
new file mode 100644
index 0000000..1e31bfd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chevron-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-up-down.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-up-down.svg
new file mode 100644
index 0000000..27b1d4f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chevron-up-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/chevron-up.svg b/assets/vendor/heroicons/optimized/24/outline/chevron-up.svg
new file mode 100644
index 0000000..713a6f1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/chevron-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/circle-stack.svg b/assets/vendor/heroicons/optimized/24/outline/circle-stack.svg
new file mode 100644
index 0000000..b8fb769
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/circle-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/clipboard-document-check.svg b/assets/vendor/heroicons/optimized/24/outline/clipboard-document-check.svg
new file mode 100644
index 0000000..7bb03a1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/clipboard-document-check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/clipboard-document-list.svg b/assets/vendor/heroicons/optimized/24/outline/clipboard-document-list.svg
new file mode 100644
index 0000000..4670777
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/clipboard-document-list.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/clipboard-document.svg b/assets/vendor/heroicons/optimized/24/outline/clipboard-document.svg
new file mode 100644
index 0000000..783a333
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/clipboard-document.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/clipboard.svg b/assets/vendor/heroicons/optimized/24/outline/clipboard.svg
new file mode 100644
index 0000000..ad9b943
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/clipboard.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/clock.svg b/assets/vendor/heroicons/optimized/24/outline/clock.svg
new file mode 100644
index 0000000..337196c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/clock.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cloud-arrow-down.svg b/assets/vendor/heroicons/optimized/24/outline/cloud-arrow-down.svg
new file mode 100644
index 0000000..7074791
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cloud-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cloud-arrow-up.svg b/assets/vendor/heroicons/optimized/24/outline/cloud-arrow-up.svg
new file mode 100644
index 0000000..8b45081
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cloud-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cloud.svg b/assets/vendor/heroicons/optimized/24/outline/cloud.svg
new file mode 100644
index 0000000..55fd725
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cloud.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/code-bracket-square.svg b/assets/vendor/heroicons/optimized/24/outline/code-bracket-square.svg
new file mode 100644
index 0000000..8308024
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/code-bracket-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/code-bracket.svg b/assets/vendor/heroicons/optimized/24/outline/code-bracket.svg
new file mode 100644
index 0000000..3361add
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/code-bracket.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cog-6-tooth.svg b/assets/vendor/heroicons/optimized/24/outline/cog-6-tooth.svg
new file mode 100644
index 0000000..d585645
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cog-6-tooth.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cog-8-tooth.svg b/assets/vendor/heroicons/optimized/24/outline/cog-8-tooth.svg
new file mode 100644
index 0000000..28f85f4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cog-8-tooth.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cog.svg b/assets/vendor/heroicons/optimized/24/outline/cog.svg
new file mode 100644
index 0000000..f2bad9f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cog.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/command-line.svg b/assets/vendor/heroicons/optimized/24/outline/command-line.svg
new file mode 100644
index 0000000..baaf362
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/command-line.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/computer-desktop.svg b/assets/vendor/heroicons/optimized/24/outline/computer-desktop.svg
new file mode 100644
index 0000000..fb9a6e0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/computer-desktop.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cpu-chip.svg b/assets/vendor/heroicons/optimized/24/outline/cpu-chip.svg
new file mode 100644
index 0000000..cabc435
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cpu-chip.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/credit-card.svg b/assets/vendor/heroicons/optimized/24/outline/credit-card.svg
new file mode 100644
index 0000000..3c0c917
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/credit-card.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cube-transparent.svg b/assets/vendor/heroicons/optimized/24/outline/cube-transparent.svg
new file mode 100644
index 0000000..5a8adac
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cube-transparent.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cube.svg b/assets/vendor/heroicons/optimized/24/outline/cube.svg
new file mode 100644
index 0000000..70b0091
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cube.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/currency-bangladeshi.svg b/assets/vendor/heroicons/optimized/24/outline/currency-bangladeshi.svg
new file mode 100644
index 0000000..7f2fca3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/currency-bangladeshi.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/currency-dollar.svg b/assets/vendor/heroicons/optimized/24/outline/currency-dollar.svg
new file mode 100644
index 0000000..d376f4c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/currency-dollar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/currency-euro.svg b/assets/vendor/heroicons/optimized/24/outline/currency-euro.svg
new file mode 100644
index 0000000..8b9dd2e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/currency-euro.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/currency-pound.svg b/assets/vendor/heroicons/optimized/24/outline/currency-pound.svg
new file mode 100644
index 0000000..8e7c52d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/currency-pound.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/currency-rupee.svg b/assets/vendor/heroicons/optimized/24/outline/currency-rupee.svg
new file mode 100644
index 0000000..078bf05
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/currency-rupee.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/currency-yen.svg b/assets/vendor/heroicons/optimized/24/outline/currency-yen.svg
new file mode 100644
index 0000000..254011a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/currency-yen.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cursor-arrow-rays.svg b/assets/vendor/heroicons/optimized/24/outline/cursor-arrow-rays.svg
new file mode 100644
index 0000000..c29d0fd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cursor-arrow-rays.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/cursor-arrow-ripple.svg b/assets/vendor/heroicons/optimized/24/outline/cursor-arrow-ripple.svg
new file mode 100644
index 0000000..500a04c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/cursor-arrow-ripple.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/device-phone-mobile.svg b/assets/vendor/heroicons/optimized/24/outline/device-phone-mobile.svg
new file mode 100644
index 0000000..1caf911
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/device-phone-mobile.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/device-tablet.svg b/assets/vendor/heroicons/optimized/24/outline/device-tablet.svg
new file mode 100644
index 0000000..7090ecb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/device-tablet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/document-arrow-down.svg b/assets/vendor/heroicons/optimized/24/outline/document-arrow-down.svg
new file mode 100644
index 0000000..04f6e65
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/document-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/document-arrow-up.svg b/assets/vendor/heroicons/optimized/24/outline/document-arrow-up.svg
new file mode 100644
index 0000000..c0ca80f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/document-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/document-chart-bar.svg b/assets/vendor/heroicons/optimized/24/outline/document-chart-bar.svg
new file mode 100644
index 0000000..2ffa3fe
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/document-chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/document-check.svg b/assets/vendor/heroicons/optimized/24/outline/document-check.svg
new file mode 100644
index 0000000..5ea7d9c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/document-check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/document-duplicate.svg b/assets/vendor/heroicons/optimized/24/outline/document-duplicate.svg
new file mode 100644
index 0000000..acc6464
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/document-duplicate.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/document-magnifying-glass.svg b/assets/vendor/heroicons/optimized/24/outline/document-magnifying-glass.svg
new file mode 100644
index 0000000..f94eff6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/document-magnifying-glass.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/document-minus.svg b/assets/vendor/heroicons/optimized/24/outline/document-minus.svg
new file mode 100644
index 0000000..173cb1f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/document-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/document-plus.svg b/assets/vendor/heroicons/optimized/24/outline/document-plus.svg
new file mode 100644
index 0000000..9ec31ad
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/document-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/document-text.svg b/assets/vendor/heroicons/optimized/24/outline/document-text.svg
new file mode 100644
index 0000000..cd77136
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/document-text.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/document.svg b/assets/vendor/heroicons/optimized/24/outline/document.svg
new file mode 100644
index 0000000..863a8aa
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/document.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/ellipsis-horizontal-circle.svg b/assets/vendor/heroicons/optimized/24/outline/ellipsis-horizontal-circle.svg
new file mode 100644
index 0000000..09aac53
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/ellipsis-horizontal-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/ellipsis-horizontal.svg b/assets/vendor/heroicons/optimized/24/outline/ellipsis-horizontal.svg
new file mode 100644
index 0000000..7541be5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/ellipsis-horizontal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/ellipsis-vertical.svg b/assets/vendor/heroicons/optimized/24/outline/ellipsis-vertical.svg
new file mode 100644
index 0000000..4676cf3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/ellipsis-vertical.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/envelope-open.svg b/assets/vendor/heroicons/optimized/24/outline/envelope-open.svg
new file mode 100644
index 0000000..ff9dccd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/envelope-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/envelope.svg b/assets/vendor/heroicons/optimized/24/outline/envelope.svg
new file mode 100644
index 0000000..ae8ff72
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/envelope.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/exclamation-circle.svg b/assets/vendor/heroicons/optimized/24/outline/exclamation-circle.svg
new file mode 100644
index 0000000..25ef36f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/exclamation-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/exclamation-triangle.svg b/assets/vendor/heroicons/optimized/24/outline/exclamation-triangle.svg
new file mode 100644
index 0000000..c9742f1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/exclamation-triangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/eye-dropper.svg b/assets/vendor/heroicons/optimized/24/outline/eye-dropper.svg
new file mode 100644
index 0000000..c7263e1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/eye-dropper.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/eye-slash.svg b/assets/vendor/heroicons/optimized/24/outline/eye-slash.svg
new file mode 100644
index 0000000..072c9f2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/eye-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/eye.svg b/assets/vendor/heroicons/optimized/24/outline/eye.svg
new file mode 100644
index 0000000..2a54d63
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/eye.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/face-frown.svg b/assets/vendor/heroicons/optimized/24/outline/face-frown.svg
new file mode 100644
index 0000000..ba0cab3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/face-frown.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/face-smile.svg b/assets/vendor/heroicons/optimized/24/outline/face-smile.svg
new file mode 100644
index 0000000..5246524
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/face-smile.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/film.svg b/assets/vendor/heroicons/optimized/24/outline/film.svg
new file mode 100644
index 0000000..d76e594
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/film.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/finger-print.svg b/assets/vendor/heroicons/optimized/24/outline/finger-print.svg
new file mode 100644
index 0000000..0c1eeb2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/finger-print.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/fire.svg b/assets/vendor/heroicons/optimized/24/outline/fire.svg
new file mode 100644
index 0000000..54c9748
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/fire.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/flag.svg b/assets/vendor/heroicons/optimized/24/outline/flag.svg
new file mode 100644
index 0000000..dff4126
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/flag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/folder-arrow-down.svg b/assets/vendor/heroicons/optimized/24/outline/folder-arrow-down.svg
new file mode 100644
index 0000000..96290cd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/folder-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/folder-minus.svg b/assets/vendor/heroicons/optimized/24/outline/folder-minus.svg
new file mode 100644
index 0000000..824cb0e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/folder-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/folder-open.svg b/assets/vendor/heroicons/optimized/24/outline/folder-open.svg
new file mode 100644
index 0000000..0721502
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/folder-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/folder-plus.svg b/assets/vendor/heroicons/optimized/24/outline/folder-plus.svg
new file mode 100644
index 0000000..3df62d2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/folder-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/folder.svg b/assets/vendor/heroicons/optimized/24/outline/folder.svg
new file mode 100644
index 0000000..3054819
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/folder.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/forward.svg b/assets/vendor/heroicons/optimized/24/outline/forward.svg
new file mode 100644
index 0000000..cc80dc9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/forward.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/funnel.svg b/assets/vendor/heroicons/optimized/24/outline/funnel.svg
new file mode 100644
index 0000000..338fa52
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/funnel.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/gif.svg b/assets/vendor/heroicons/optimized/24/outline/gif.svg
new file mode 100644
index 0000000..ba8a186
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/gif.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/gift-top.svg b/assets/vendor/heroicons/optimized/24/outline/gift-top.svg
new file mode 100644
index 0000000..055b6d2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/gift-top.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/gift.svg b/assets/vendor/heroicons/optimized/24/outline/gift.svg
new file mode 100644
index 0000000..5445815
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/gift.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/globe-alt.svg b/assets/vendor/heroicons/optimized/24/outline/globe-alt.svg
new file mode 100644
index 0000000..a605be0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/globe-alt.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/globe-americas.svg b/assets/vendor/heroicons/optimized/24/outline/globe-americas.svg
new file mode 100644
index 0000000..5d1a5cb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/globe-americas.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/globe-asia-australia.svg b/assets/vendor/heroicons/optimized/24/outline/globe-asia-australia.svg
new file mode 100644
index 0000000..f4898fa
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/globe-asia-australia.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/globe-europe-africa.svg b/assets/vendor/heroicons/optimized/24/outline/globe-europe-africa.svg
new file mode 100644
index 0000000..c8f797d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/globe-europe-africa.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/hand-raised.svg b/assets/vendor/heroicons/optimized/24/outline/hand-raised.svg
new file mode 100644
index 0000000..859f1ab
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/hand-raised.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/hand-thumb-down.svg b/assets/vendor/heroicons/optimized/24/outline/hand-thumb-down.svg
new file mode 100644
index 0000000..c588a53
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/hand-thumb-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/hand-thumb-up.svg b/assets/vendor/heroicons/optimized/24/outline/hand-thumb-up.svg
new file mode 100644
index 0000000..66ca9c3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/hand-thumb-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/hashtag.svg b/assets/vendor/heroicons/optimized/24/outline/hashtag.svg
new file mode 100644
index 0000000..3ae1060
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/hashtag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/heart.svg b/assets/vendor/heroicons/optimized/24/outline/heart.svg
new file mode 100644
index 0000000..1084768
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/heart.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/home-modern.svg b/assets/vendor/heroicons/optimized/24/outline/home-modern.svg
new file mode 100644
index 0000000..20f4e2c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/home-modern.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/home.svg b/assets/vendor/heroicons/optimized/24/outline/home.svg
new file mode 100644
index 0000000..9543375
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/home.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/identification.svg b/assets/vendor/heroicons/optimized/24/outline/identification.svg
new file mode 100644
index 0000000..bfd302a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/identification.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/inbox-arrow-down.svg b/assets/vendor/heroicons/optimized/24/outline/inbox-arrow-down.svg
new file mode 100644
index 0000000..db6ebda
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/inbox-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/inbox-stack.svg b/assets/vendor/heroicons/optimized/24/outline/inbox-stack.svg
new file mode 100644
index 0000000..6c1e55c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/inbox-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/inbox.svg b/assets/vendor/heroicons/optimized/24/outline/inbox.svg
new file mode 100644
index 0000000..56b35cb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/inbox.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/information-circle.svg b/assets/vendor/heroicons/optimized/24/outline/information-circle.svg
new file mode 100644
index 0000000..c7fa9d7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/information-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/key.svg b/assets/vendor/heroicons/optimized/24/outline/key.svg
new file mode 100644
index 0000000..e9684cd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/key.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/language.svg b/assets/vendor/heroicons/optimized/24/outline/language.svg
new file mode 100644
index 0000000..0c606ef
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/language.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/lifebuoy.svg b/assets/vendor/heroicons/optimized/24/outline/lifebuoy.svg
new file mode 100644
index 0000000..1660e99
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/lifebuoy.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/light-bulb.svg b/assets/vendor/heroicons/optimized/24/outline/light-bulb.svg
new file mode 100644
index 0000000..e3f2d9a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/light-bulb.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/link.svg b/assets/vendor/heroicons/optimized/24/outline/link.svg
new file mode 100644
index 0000000..916a703
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/link.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/list-bullet.svg b/assets/vendor/heroicons/optimized/24/outline/list-bullet.svg
new file mode 100644
index 0000000..1474573
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/list-bullet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/lock-closed.svg b/assets/vendor/heroicons/optimized/24/outline/lock-closed.svg
new file mode 100644
index 0000000..08b23c9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/lock-closed.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/lock-open.svg b/assets/vendor/heroicons/optimized/24/outline/lock-open.svg
new file mode 100644
index 0000000..c5595dd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/lock-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-circle.svg b/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-circle.svg
new file mode 100644
index 0000000..e71f8bf
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-minus.svg b/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-minus.svg
new file mode 100644
index 0000000..6bd11c1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-plus.svg b/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-plus.svg
new file mode 100644
index 0000000..5dab7de
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/magnifying-glass-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/magnifying-glass.svg b/assets/vendor/heroicons/optimized/24/outline/magnifying-glass.svg
new file mode 100644
index 0000000..7cff88f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/magnifying-glass.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/map-pin.svg b/assets/vendor/heroicons/optimized/24/outline/map-pin.svg
new file mode 100644
index 0000000..1f272f4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/map-pin.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/map.svg b/assets/vendor/heroicons/optimized/24/outline/map.svg
new file mode 100644
index 0000000..f96c988
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/map.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/megaphone.svg b/assets/vendor/heroicons/optimized/24/outline/megaphone.svg
new file mode 100644
index 0000000..ec19508
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/megaphone.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/microphone.svg b/assets/vendor/heroicons/optimized/24/outline/microphone.svg
new file mode 100644
index 0000000..670b34f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/microphone.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/minus-circle.svg b/assets/vendor/heroicons/optimized/24/outline/minus-circle.svg
new file mode 100644
index 0000000..b9630fc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/minus-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/minus-small.svg b/assets/vendor/heroicons/optimized/24/outline/minus-small.svg
new file mode 100644
index 0000000..3e1a8b7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/minus-small.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/minus.svg b/assets/vendor/heroicons/optimized/24/outline/minus.svg
new file mode 100644
index 0000000..781994c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/moon.svg b/assets/vendor/heroicons/optimized/24/outline/moon.svg
new file mode 100644
index 0000000..91501fd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/moon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/musical-note.svg b/assets/vendor/heroicons/optimized/24/outline/musical-note.svg
new file mode 100644
index 0000000..c0667fc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/musical-note.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/newspaper.svg b/assets/vendor/heroicons/optimized/24/outline/newspaper.svg
new file mode 100644
index 0000000..0a4ac57
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/newspaper.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/no-symbol.svg b/assets/vendor/heroicons/optimized/24/outline/no-symbol.svg
new file mode 100644
index 0000000..19b0bd0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/no-symbol.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/paint-brush.svg b/assets/vendor/heroicons/optimized/24/outline/paint-brush.svg
new file mode 100644
index 0000000..b66098f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/paint-brush.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/paper-airplane.svg b/assets/vendor/heroicons/optimized/24/outline/paper-airplane.svg
new file mode 100644
index 0000000..32da43e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/paper-airplane.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/paper-clip.svg b/assets/vendor/heroicons/optimized/24/outline/paper-clip.svg
new file mode 100644
index 0000000..1d78d81
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/paper-clip.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/pause-circle.svg b/assets/vendor/heroicons/optimized/24/outline/pause-circle.svg
new file mode 100644
index 0000000..a9a9e93
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/pause-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/pause.svg b/assets/vendor/heroicons/optimized/24/outline/pause.svg
new file mode 100644
index 0000000..9843f7b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/pause.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/pencil-square.svg b/assets/vendor/heroicons/optimized/24/outline/pencil-square.svg
new file mode 100644
index 0000000..3de435b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/pencil-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/pencil.svg b/assets/vendor/heroicons/optimized/24/outline/pencil.svg
new file mode 100644
index 0000000..0c8759a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/pencil.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/phone-arrow-down-left.svg b/assets/vendor/heroicons/optimized/24/outline/phone-arrow-down-left.svg
new file mode 100644
index 0000000..b1b2e61
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/phone-arrow-down-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/phone-arrow-up-right.svg b/assets/vendor/heroicons/optimized/24/outline/phone-arrow-up-right.svg
new file mode 100644
index 0000000..faaf659
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/phone-arrow-up-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/phone-x-mark.svg b/assets/vendor/heroicons/optimized/24/outline/phone-x-mark.svg
new file mode 100644
index 0000000..0b8de6d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/phone-x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/phone.svg b/assets/vendor/heroicons/optimized/24/outline/phone.svg
new file mode 100644
index 0000000..6f73149
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/phone.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/photo.svg b/assets/vendor/heroicons/optimized/24/outline/photo.svg
new file mode 100644
index 0000000..6982a11
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/photo.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/play-circle.svg b/assets/vendor/heroicons/optimized/24/outline/play-circle.svg
new file mode 100644
index 0000000..3a2fa63
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/play-circle.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/play-pause.svg b/assets/vendor/heroicons/optimized/24/outline/play-pause.svg
new file mode 100644
index 0000000..4ce4e55
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/play-pause.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/play.svg b/assets/vendor/heroicons/optimized/24/outline/play.svg
new file mode 100644
index 0000000..c0ae6de
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/play.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/plus-circle.svg b/assets/vendor/heroicons/optimized/24/outline/plus-circle.svg
new file mode 100644
index 0000000..4da4d1f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/plus-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/plus-small.svg b/assets/vendor/heroicons/optimized/24/outline/plus-small.svg
new file mode 100644
index 0000000..991ed59
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/plus-small.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/plus.svg b/assets/vendor/heroicons/optimized/24/outline/plus.svg
new file mode 100644
index 0000000..0480817
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/power.svg b/assets/vendor/heroicons/optimized/24/outline/power.svg
new file mode 100644
index 0000000..c4b2706
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/power.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/presentation-chart-bar.svg b/assets/vendor/heroicons/optimized/24/outline/presentation-chart-bar.svg
new file mode 100644
index 0000000..87d8a6d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/presentation-chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/presentation-chart-line.svg b/assets/vendor/heroicons/optimized/24/outline/presentation-chart-line.svg
new file mode 100644
index 0000000..2262e1f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/presentation-chart-line.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/printer.svg b/assets/vendor/heroicons/optimized/24/outline/printer.svg
new file mode 100644
index 0000000..6f7c5fa
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/printer.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/puzzle-piece.svg b/assets/vendor/heroicons/optimized/24/outline/puzzle-piece.svg
new file mode 100644
index 0000000..13aa1a5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/puzzle-piece.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/qr-code.svg b/assets/vendor/heroicons/optimized/24/outline/qr-code.svg
new file mode 100644
index 0000000..662a4bd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/qr-code.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/question-mark-circle.svg b/assets/vendor/heroicons/optimized/24/outline/question-mark-circle.svg
new file mode 100644
index 0000000..9fb2542
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/question-mark-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/queue-list.svg b/assets/vendor/heroicons/optimized/24/outline/queue-list.svg
new file mode 100644
index 0000000..91c3f11
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/queue-list.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/radio.svg b/assets/vendor/heroicons/optimized/24/outline/radio.svg
new file mode 100644
index 0000000..f9c177a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/radio.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/receipt-percent.svg b/assets/vendor/heroicons/optimized/24/outline/receipt-percent.svg
new file mode 100644
index 0000000..2d19255
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/receipt-percent.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/receipt-refund.svg b/assets/vendor/heroicons/optimized/24/outline/receipt-refund.svg
new file mode 100644
index 0000000..dc569fc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/receipt-refund.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/rectangle-group.svg b/assets/vendor/heroicons/optimized/24/outline/rectangle-group.svg
new file mode 100644
index 0000000..b184964
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/rectangle-group.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/rectangle-stack.svg b/assets/vendor/heroicons/optimized/24/outline/rectangle-stack.svg
new file mode 100644
index 0000000..e1c0272
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/rectangle-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/rocket-launch.svg b/assets/vendor/heroicons/optimized/24/outline/rocket-launch.svg
new file mode 100644
index 0000000..6400ee8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/rocket-launch.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/rss.svg b/assets/vendor/heroicons/optimized/24/outline/rss.svg
new file mode 100644
index 0000000..1c36b21
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/rss.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/scale.svg b/assets/vendor/heroicons/optimized/24/outline/scale.svg
new file mode 100644
index 0000000..500e3c6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/scale.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/scissors.svg b/assets/vendor/heroicons/optimized/24/outline/scissors.svg
new file mode 100644
index 0000000..a23dc81
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/scissors.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/server-stack.svg b/assets/vendor/heroicons/optimized/24/outline/server-stack.svg
new file mode 100644
index 0000000..3b7fe32
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/server-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/server.svg b/assets/vendor/heroicons/optimized/24/outline/server.svg
new file mode 100644
index 0000000..c1675f3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/server.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/share.svg b/assets/vendor/heroicons/optimized/24/outline/share.svg
new file mode 100644
index 0000000..125b6d1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/share.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/shield-check.svg b/assets/vendor/heroicons/optimized/24/outline/shield-check.svg
new file mode 100644
index 0000000..f9fa2b9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/shield-check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/shield-exclamation.svg b/assets/vendor/heroicons/optimized/24/outline/shield-exclamation.svg
new file mode 100644
index 0000000..b52a2ff
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/shield-exclamation.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/shopping-bag.svg b/assets/vendor/heroicons/optimized/24/outline/shopping-bag.svg
new file mode 100644
index 0000000..f5a51bd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/shopping-bag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/shopping-cart.svg b/assets/vendor/heroicons/optimized/24/outline/shopping-cart.svg
new file mode 100644
index 0000000..661477b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/shopping-cart.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/signal-slash.svg b/assets/vendor/heroicons/optimized/24/outline/signal-slash.svg
new file mode 100644
index 0000000..62992c3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/signal-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/signal.svg b/assets/vendor/heroicons/optimized/24/outline/signal.svg
new file mode 100644
index 0000000..56114d3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/signal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/sparkles.svg b/assets/vendor/heroicons/optimized/24/outline/sparkles.svg
new file mode 100644
index 0000000..5a78b09
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/sparkles.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/speaker-wave.svg b/assets/vendor/heroicons/optimized/24/outline/speaker-wave.svg
new file mode 100644
index 0000000..1b6dde7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/speaker-wave.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/speaker-x-mark.svg b/assets/vendor/heroicons/optimized/24/outline/speaker-x-mark.svg
new file mode 100644
index 0000000..427e21e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/speaker-x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/square-2-stack.svg b/assets/vendor/heroicons/optimized/24/outline/square-2-stack.svg
new file mode 100644
index 0000000..bc5e253
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/square-2-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/square-3-stack-3d.svg b/assets/vendor/heroicons/optimized/24/outline/square-3-stack-3d.svg
new file mode 100644
index 0000000..8af2704
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/square-3-stack-3d.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/squares-2x2.svg b/assets/vendor/heroicons/optimized/24/outline/squares-2x2.svg
new file mode 100644
index 0000000..601366d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/squares-2x2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/squares-plus.svg b/assets/vendor/heroicons/optimized/24/outline/squares-plus.svg
new file mode 100644
index 0000000..b8033c1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/squares-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/star.svg b/assets/vendor/heroicons/optimized/24/outline/star.svg
new file mode 100644
index 0000000..98aa481
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/star.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/stop-circle.svg b/assets/vendor/heroicons/optimized/24/outline/stop-circle.svg
new file mode 100644
index 0000000..b570e8e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/stop-circle.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/stop.svg b/assets/vendor/heroicons/optimized/24/outline/stop.svg
new file mode 100644
index 0000000..4ee917a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/stop.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/sun.svg b/assets/vendor/heroicons/optimized/24/outline/sun.svg
new file mode 100644
index 0000000..5667cb3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/sun.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/swatch.svg b/assets/vendor/heroicons/optimized/24/outline/swatch.svg
new file mode 100644
index 0000000..5b136eb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/swatch.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/table-cells.svg b/assets/vendor/heroicons/optimized/24/outline/table-cells.svg
new file mode 100644
index 0000000..cb37937
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/table-cells.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/tag.svg b/assets/vendor/heroicons/optimized/24/outline/tag.svg
new file mode 100644
index 0000000..9620545
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/tag.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/ticket.svg b/assets/vendor/heroicons/optimized/24/outline/ticket.svg
new file mode 100644
index 0000000..da2d69e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/ticket.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/trash.svg b/assets/vendor/heroicons/optimized/24/outline/trash.svg
new file mode 100644
index 0000000..0d32d58
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/trash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/trophy.svg b/assets/vendor/heroicons/optimized/24/outline/trophy.svg
new file mode 100644
index 0000000..f846e52
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/trophy.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/truck.svg b/assets/vendor/heroicons/optimized/24/outline/truck.svg
new file mode 100644
index 0000000..6e1ea69
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/truck.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/tv.svg b/assets/vendor/heroicons/optimized/24/outline/tv.svg
new file mode 100644
index 0000000..7b8a706
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/tv.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/user-circle.svg b/assets/vendor/heroicons/optimized/24/outline/user-circle.svg
new file mode 100644
index 0000000..a177f26
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/user-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/user-group.svg b/assets/vendor/heroicons/optimized/24/outline/user-group.svg
new file mode 100644
index 0000000..4e7089b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/user-group.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/user-minus.svg b/assets/vendor/heroicons/optimized/24/outline/user-minus.svg
new file mode 100644
index 0000000..703478e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/user-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/user-plus.svg b/assets/vendor/heroicons/optimized/24/outline/user-plus.svg
new file mode 100644
index 0000000..24533d1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/user-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/user.svg b/assets/vendor/heroicons/optimized/24/outline/user.svg
new file mode 100644
index 0000000..e9b6c20
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/user.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/users.svg b/assets/vendor/heroicons/optimized/24/outline/users.svg
new file mode 100644
index 0000000..87304a0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/users.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/variable.svg b/assets/vendor/heroicons/optimized/24/outline/variable.svg
new file mode 100644
index 0000000..81fab04
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/variable.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/video-camera-slash.svg b/assets/vendor/heroicons/optimized/24/outline/video-camera-slash.svg
new file mode 100644
index 0000000..d1de13e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/video-camera-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/video-camera.svg b/assets/vendor/heroicons/optimized/24/outline/video-camera.svg
new file mode 100644
index 0000000..aae1a19
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/video-camera.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/view-columns.svg b/assets/vendor/heroicons/optimized/24/outline/view-columns.svg
new file mode 100644
index 0000000..22a668e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/view-columns.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/viewfinder-circle.svg b/assets/vendor/heroicons/optimized/24/outline/viewfinder-circle.svg
new file mode 100644
index 0000000..0583eef
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/viewfinder-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/wallet.svg b/assets/vendor/heroicons/optimized/24/outline/wallet.svg
new file mode 100644
index 0000000..8f19d64
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/wallet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/wifi.svg b/assets/vendor/heroicons/optimized/24/outline/wifi.svg
new file mode 100644
index 0000000..084b3e1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/wifi.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/window.svg b/assets/vendor/heroicons/optimized/24/outline/window.svg
new file mode 100644
index 0000000..4ffea71
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/window.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/wrench-screwdriver.svg b/assets/vendor/heroicons/optimized/24/outline/wrench-screwdriver.svg
new file mode 100644
index 0000000..1023ae9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/wrench-screwdriver.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/wrench.svg b/assets/vendor/heroicons/optimized/24/outline/wrench.svg
new file mode 100644
index 0000000..de3a6e2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/wrench.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/x-circle.svg b/assets/vendor/heroicons/optimized/24/outline/x-circle.svg
new file mode 100644
index 0000000..294ba20
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/x-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/outline/x-mark.svg b/assets/vendor/heroicons/optimized/24/outline/x-mark.svg
new file mode 100644
index 0000000..a6d9eb7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/outline/x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/academic-cap.svg b/assets/vendor/heroicons/optimized/24/solid/academic-cap.svg
new file mode 100644
index 0000000..2a13ef2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/academic-cap.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/adjustments-horizontal.svg b/assets/vendor/heroicons/optimized/24/solid/adjustments-horizontal.svg
new file mode 100644
index 0000000..ed9b950
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/adjustments-horizontal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/adjustments-vertical.svg b/assets/vendor/heroicons/optimized/24/solid/adjustments-vertical.svg
new file mode 100644
index 0000000..fc4b90c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/adjustments-vertical.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/archive-box-arrow-down.svg b/assets/vendor/heroicons/optimized/24/solid/archive-box-arrow-down.svg
new file mode 100644
index 0000000..5999b72
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/archive-box-arrow-down.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/archive-box-x-mark.svg b/assets/vendor/heroicons/optimized/24/solid/archive-box-x-mark.svg
new file mode 100644
index 0000000..e7dd0d6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/archive-box-x-mark.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/archive-box.svg b/assets/vendor/heroicons/optimized/24/solid/archive-box.svg
new file mode 100644
index 0000000..74e0471
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/archive-box.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-down-circle.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-down-circle.svg
new file mode 100644
index 0000000..c85a4ff
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-down-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-down-left.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-down-left.svg
new file mode 100644
index 0000000..5cd0d4d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-down-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-down-on-square-stack.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-down-on-square-stack.svg
new file mode 100644
index 0000000..d2ef0b3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-down-on-square-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-down-on-square.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-down-on-square.svg
new file mode 100644
index 0000000..35eab41
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-down-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-down-right.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-down-right.svg
new file mode 100644
index 0000000..8c60942
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-down-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-down-tray.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-down-tray.svg
new file mode 100644
index 0000000..a18c62d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-down-tray.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-down.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-down.svg
new file mode 100644
index 0000000..5cb396b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-left-circle.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-left-circle.svg
new file mode 100644
index 0000000..a937f8e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-left-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-left-on-rectangle.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-left-on-rectangle.svg
new file mode 100644
index 0000000..972a85e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-left-on-rectangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-left.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-left.svg
new file mode 100644
index 0000000..51bef70
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-long-down.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-long-down.svg
new file mode 100644
index 0000000..891774e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-long-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-long-left.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-long-left.svg
new file mode 100644
index 0000000..aa12c0c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-long-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-long-right.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-long-right.svg
new file mode 100644
index 0000000..0bcb6a0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-long-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-long-up.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-long-up.svg
new file mode 100644
index 0000000..b36d8e0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-long-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-path-rounded-square.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-path-rounded-square.svg
new file mode 100644
index 0000000..0808a57
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-path-rounded-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-path.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-path.svg
new file mode 100644
index 0000000..48a71fd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-path.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-right-circle.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-right-circle.svg
new file mode 100644
index 0000000..424f75a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-right-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-right-on-rectangle.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-right-on-rectangle.svg
new file mode 100644
index 0000000..73a7a7e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-right-on-rectangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-right.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-right.svg
new file mode 100644
index 0000000..1b1bbd1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-small-down.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-small-down.svg
new file mode 100644
index 0000000..790993f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-small-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-small-left.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-small-left.svg
new file mode 100644
index 0000000..231b1b2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-small-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-small-right.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-small-right.svg
new file mode 100644
index 0000000..5d91261
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-small-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-small-up.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-small-up.svg
new file mode 100644
index 0000000..33b31cf
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-small-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-top-right-on-square.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-top-right-on-square.svg
new file mode 100644
index 0000000..ac1bc37
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-top-right-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-trending-down.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-trending-down.svg
new file mode 100644
index 0000000..f46b609
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-trending-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-trending-up.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-trending-up.svg
new file mode 100644
index 0000000..f2ece6e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-trending-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-up-circle.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-up-circle.svg
new file mode 100644
index 0000000..0a9999f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-up-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-up-left.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-up-left.svg
new file mode 100644
index 0000000..b6f9c2e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-up-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-up-on-square-stack.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-up-on-square-stack.svg
new file mode 100644
index 0000000..b661da7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-up-on-square-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-up-on-square.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-up-on-square.svg
new file mode 100644
index 0000000..cba893e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-up-on-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-up-right.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-up-right.svg
new file mode 100644
index 0000000..7554631
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-up-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-up-tray.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-up-tray.svg
new file mode 100644
index 0000000..19093f6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-up-tray.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-up.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-up.svg
new file mode 100644
index 0000000..16f6c79
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-down.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-down.svg
new file mode 100644
index 0000000..6975024
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-left.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-left.svg
new file mode 100644
index 0000000..f0b679a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-right.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-right.svg
new file mode 100644
index 0000000..2da0f98
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-up.svg b/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-up.svg
new file mode 100644
index 0000000..8cfe23d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrow-uturn-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrows-pointing-in.svg b/assets/vendor/heroicons/optimized/24/solid/arrows-pointing-in.svg
new file mode 100644
index 0000000..604920f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrows-pointing-in.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrows-pointing-out.svg b/assets/vendor/heroicons/optimized/24/solid/arrows-pointing-out.svg
new file mode 100644
index 0000000..2399662
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrows-pointing-out.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrows-right-left.svg b/assets/vendor/heroicons/optimized/24/solid/arrows-right-left.svg
new file mode 100644
index 0000000..93fb7f1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrows-right-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/arrows-up-down.svg b/assets/vendor/heroicons/optimized/24/solid/arrows-up-down.svg
new file mode 100644
index 0000000..356e9ca
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/arrows-up-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/at-symbol.svg b/assets/vendor/heroicons/optimized/24/solid/at-symbol.svg
new file mode 100644
index 0000000..a02c654
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/at-symbol.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/backspace.svg b/assets/vendor/heroicons/optimized/24/solid/backspace.svg
new file mode 100644
index 0000000..e5a79c2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/backspace.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/backward.svg b/assets/vendor/heroicons/optimized/24/solid/backward.svg
new file mode 100644
index 0000000..bdf2a01
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/backward.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/banknotes.svg b/assets/vendor/heroicons/optimized/24/solid/banknotes.svg
new file mode 100644
index 0000000..1cc1803
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/banknotes.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-2.svg b/assets/vendor/heroicons/optimized/24/solid/bars-2.svg
new file mode 100644
index 0000000..6ee47ab
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bars-2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-3-bottom-left.svg b/assets/vendor/heroicons/optimized/24/solid/bars-3-bottom-left.svg
new file mode 100644
index 0000000..a804c11
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bars-3-bottom-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-3-bottom-right.svg b/assets/vendor/heroicons/optimized/24/solid/bars-3-bottom-right.svg
new file mode 100644
index 0000000..2fd11ad
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bars-3-bottom-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-3-center-left.svg b/assets/vendor/heroicons/optimized/24/solid/bars-3-center-left.svg
new file mode 100644
index 0000000..9a2c170
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bars-3-center-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-3.svg b/assets/vendor/heroicons/optimized/24/solid/bars-3.svg
new file mode 100644
index 0000000..85584e8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bars-3.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-4.svg b/assets/vendor/heroicons/optimized/24/solid/bars-4.svg
new file mode 100644
index 0000000..e3591d1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bars-4.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-arrow-down.svg b/assets/vendor/heroicons/optimized/24/solid/bars-arrow-down.svg
new file mode 100644
index 0000000..10140b8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bars-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bars-arrow-up.svg b/assets/vendor/heroicons/optimized/24/solid/bars-arrow-up.svg
new file mode 100644
index 0000000..4b3d4a7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bars-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/battery-0.svg b/assets/vendor/heroicons/optimized/24/solid/battery-0.svg
new file mode 100644
index 0000000..f03a737
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/battery-0.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/battery-100.svg b/assets/vendor/heroicons/optimized/24/solid/battery-100.svg
new file mode 100644
index 0000000..62e4ec9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/battery-100.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/battery-50.svg b/assets/vendor/heroicons/optimized/24/solid/battery-50.svg
new file mode 100644
index 0000000..63344d7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/battery-50.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/beaker.svg b/assets/vendor/heroicons/optimized/24/solid/beaker.svg
new file mode 100644
index 0000000..e0b73cc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/beaker.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bell-alert.svg b/assets/vendor/heroicons/optimized/24/solid/bell-alert.svg
new file mode 100644
index 0000000..f280b00
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bell-alert.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bell-slash.svg b/assets/vendor/heroicons/optimized/24/solid/bell-slash.svg
new file mode 100644
index 0000000..0ef076c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bell-slash.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bell-snooze.svg b/assets/vendor/heroicons/optimized/24/solid/bell-snooze.svg
new file mode 100644
index 0000000..cf93ae0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bell-snooze.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bell.svg b/assets/vendor/heroicons/optimized/24/solid/bell.svg
new file mode 100644
index 0000000..818496e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bell.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bolt-slash.svg b/assets/vendor/heroicons/optimized/24/solid/bolt-slash.svg
new file mode 100644
index 0000000..59d24f7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bolt-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bolt.svg b/assets/vendor/heroicons/optimized/24/solid/bolt.svg
new file mode 100644
index 0000000..596c47a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bolt.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/book-open.svg b/assets/vendor/heroicons/optimized/24/solid/book-open.svg
new file mode 100644
index 0000000..2e0a181
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/book-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bookmark-slash.svg b/assets/vendor/heroicons/optimized/24/solid/bookmark-slash.svg
new file mode 100644
index 0000000..8435a02
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bookmark-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bookmark-square.svg b/assets/vendor/heroicons/optimized/24/solid/bookmark-square.svg
new file mode 100644
index 0000000..a4d3ca5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bookmark-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bookmark.svg b/assets/vendor/heroicons/optimized/24/solid/bookmark.svg
new file mode 100644
index 0000000..e9f3fb7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bookmark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/briefcase.svg b/assets/vendor/heroicons/optimized/24/solid/briefcase.svg
new file mode 100644
index 0000000..a66af56
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/briefcase.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/bug-ant.svg b/assets/vendor/heroicons/optimized/24/solid/bug-ant.svg
new file mode 100644
index 0000000..3c16cbc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/bug-ant.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/building-library.svg b/assets/vendor/heroicons/optimized/24/solid/building-library.svg
new file mode 100644
index 0000000..90f8640
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/building-library.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/building-office-2.svg b/assets/vendor/heroicons/optimized/24/solid/building-office-2.svg
new file mode 100644
index 0000000..240eedb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/building-office-2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/building-office.svg b/assets/vendor/heroicons/optimized/24/solid/building-office.svg
new file mode 100644
index 0000000..9883e33
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/building-office.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/building-storefront.svg b/assets/vendor/heroicons/optimized/24/solid/building-storefront.svg
new file mode 100644
index 0000000..f3b54ba
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/building-storefront.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cake.svg b/assets/vendor/heroicons/optimized/24/solid/cake.svg
new file mode 100644
index 0000000..f13b308
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cake.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/calculator.svg b/assets/vendor/heroicons/optimized/24/solid/calculator.svg
new file mode 100644
index 0000000..e058510
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/calculator.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/calendar-days.svg b/assets/vendor/heroicons/optimized/24/solid/calendar-days.svg
new file mode 100644
index 0000000..0df9b16
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/calendar-days.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/calendar.svg b/assets/vendor/heroicons/optimized/24/solid/calendar.svg
new file mode 100644
index 0000000..27e208c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/calendar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/camera.svg b/assets/vendor/heroicons/optimized/24/solid/camera.svg
new file mode 100644
index 0000000..e58165d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/camera.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chart-bar-square.svg b/assets/vendor/heroicons/optimized/24/solid/chart-bar-square.svg
new file mode 100644
index 0000000..d4af840
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chart-bar-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chart-bar.svg b/assets/vendor/heroicons/optimized/24/solid/chart-bar.svg
new file mode 100644
index 0000000..abe5349
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chart-pie.svg b/assets/vendor/heroicons/optimized/24/solid/chart-pie.svg
new file mode 100644
index 0000000..5aea729
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chart-pie.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-bottom-center-text.svg b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-bottom-center-text.svg
new file mode 100644
index 0000000..bff24c4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-bottom-center-text.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-bottom-center.svg b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-bottom-center.svg
new file mode 100644
index 0000000..eab7a41
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-bottom-center.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left-ellipsis.svg b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left-ellipsis.svg
new file mode 100644
index 0000000..1ee6159
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left-ellipsis.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left-right.svg b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left-right.svg
new file mode 100644
index 0000000..80ad26d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left-right.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left.svg b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left.svg
new file mode 100644
index 0000000..3dd81b7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-oval-left-ellipsis.svg b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-oval-left-ellipsis.svg
new file mode 100644
index 0000000..815c6d7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-oval-left-ellipsis.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chat-bubble-oval-left.svg b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-oval-left.svg
new file mode 100644
index 0000000..473b921
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chat-bubble-oval-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/check-badge.svg b/assets/vendor/heroicons/optimized/24/solid/check-badge.svg
new file mode 100644
index 0000000..058b329
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/check-badge.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/check-circle.svg b/assets/vendor/heroicons/optimized/24/solid/check-circle.svg
new file mode 100644
index 0000000..2b90831
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/check-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/check.svg b/assets/vendor/heroicons/optimized/24/solid/check.svg
new file mode 100644
index 0000000..2a6bc17
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-double-down.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-double-down.svg
new file mode 100644
index 0000000..ddbe304
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chevron-double-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-double-left.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-double-left.svg
new file mode 100644
index 0000000..5c6539d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chevron-double-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-double-right.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-double-right.svg
new file mode 100644
index 0000000..7e25238
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chevron-double-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-double-up.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-double-up.svg
new file mode 100644
index 0000000..029e687
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chevron-double-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-down.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-down.svg
new file mode 100644
index 0000000..4f9ce7e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chevron-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-left.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-left.svg
new file mode 100644
index 0000000..2d89e8b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chevron-left.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-right.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-right.svg
new file mode 100644
index 0000000..36e4859
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chevron-right.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-up-down.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-up-down.svg
new file mode 100644
index 0000000..58edbc3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chevron-up-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/chevron-up.svg b/assets/vendor/heroicons/optimized/24/solid/chevron-up.svg
new file mode 100644
index 0000000..9abe9cd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/chevron-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/circle-stack.svg b/assets/vendor/heroicons/optimized/24/solid/circle-stack.svg
new file mode 100644
index 0000000..5a49d80
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/circle-stack.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/clipboard-document-check.svg b/assets/vendor/heroicons/optimized/24/solid/clipboard-document-check.svg
new file mode 100644
index 0000000..21ec021
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/clipboard-document-check.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/clipboard-document-list.svg b/assets/vendor/heroicons/optimized/24/solid/clipboard-document-list.svg
new file mode 100644
index 0000000..d60bed5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/clipboard-document-list.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/clipboard-document.svg b/assets/vendor/heroicons/optimized/24/solid/clipboard-document.svg
new file mode 100644
index 0000000..d70b708
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/clipboard-document.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/clipboard.svg b/assets/vendor/heroicons/optimized/24/solid/clipboard.svg
new file mode 100644
index 0000000..c09970f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/clipboard.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/clock.svg b/assets/vendor/heroicons/optimized/24/solid/clock.svg
new file mode 100644
index 0000000..1d6fb4a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/clock.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cloud-arrow-down.svg b/assets/vendor/heroicons/optimized/24/solid/cloud-arrow-down.svg
new file mode 100644
index 0000000..d6cf7c5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cloud-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cloud-arrow-up.svg b/assets/vendor/heroicons/optimized/24/solid/cloud-arrow-up.svg
new file mode 100644
index 0000000..7e0dcee
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cloud-arrow-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cloud.svg b/assets/vendor/heroicons/optimized/24/solid/cloud.svg
new file mode 100644
index 0000000..95d0c73
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cloud.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/code-bracket-square.svg b/assets/vendor/heroicons/optimized/24/solid/code-bracket-square.svg
new file mode 100644
index 0000000..103f73b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/code-bracket-square.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/code-bracket.svg b/assets/vendor/heroicons/optimized/24/solid/code-bracket.svg
new file mode 100644
index 0000000..9f331ef
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/code-bracket.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cog-6-tooth.svg b/assets/vendor/heroicons/optimized/24/solid/cog-6-tooth.svg
new file mode 100644
index 0000000..ba6fca5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cog-6-tooth.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cog-8-tooth.svg b/assets/vendor/heroicons/optimized/24/solid/cog-8-tooth.svg
new file mode 100644
index 0000000..9b9b1a6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cog-8-tooth.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cog.svg b/assets/vendor/heroicons/optimized/24/solid/cog.svg
new file mode 100644
index 0000000..e854f73
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cog.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/command-line.svg b/assets/vendor/heroicons/optimized/24/solid/command-line.svg
new file mode 100644
index 0000000..e2a0af8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/command-line.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/computer-desktop.svg b/assets/vendor/heroicons/optimized/24/solid/computer-desktop.svg
new file mode 100644
index 0000000..5b7f2ef
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/computer-desktop.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cpu-chip.svg b/assets/vendor/heroicons/optimized/24/solid/cpu-chip.svg
new file mode 100644
index 0000000..e20f6fb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cpu-chip.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/credit-card.svg b/assets/vendor/heroicons/optimized/24/solid/credit-card.svg
new file mode 100644
index 0000000..fe4dc14
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/credit-card.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cube-transparent.svg b/assets/vendor/heroicons/optimized/24/solid/cube-transparent.svg
new file mode 100644
index 0000000..5577f26
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cube-transparent.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cube.svg b/assets/vendor/heroicons/optimized/24/solid/cube.svg
new file mode 100644
index 0000000..b0029f2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cube.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/currency-bangladeshi.svg b/assets/vendor/heroicons/optimized/24/solid/currency-bangladeshi.svg
new file mode 100644
index 0000000..ca13c68
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/currency-bangladeshi.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/currency-dollar.svg b/assets/vendor/heroicons/optimized/24/solid/currency-dollar.svg
new file mode 100644
index 0000000..e0155df
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/currency-dollar.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/currency-euro.svg b/assets/vendor/heroicons/optimized/24/solid/currency-euro.svg
new file mode 100644
index 0000000..2926c25
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/currency-euro.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/currency-pound.svg b/assets/vendor/heroicons/optimized/24/solid/currency-pound.svg
new file mode 100644
index 0000000..547f725
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/currency-pound.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/currency-rupee.svg b/assets/vendor/heroicons/optimized/24/solid/currency-rupee.svg
new file mode 100644
index 0000000..2ee9b46
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/currency-rupee.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/currency-yen.svg b/assets/vendor/heroicons/optimized/24/solid/currency-yen.svg
new file mode 100644
index 0000000..65ef9bc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/currency-yen.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cursor-arrow-rays.svg b/assets/vendor/heroicons/optimized/24/solid/cursor-arrow-rays.svg
new file mode 100644
index 0000000..c0e462b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cursor-arrow-rays.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/cursor-arrow-ripple.svg b/assets/vendor/heroicons/optimized/24/solid/cursor-arrow-ripple.svg
new file mode 100644
index 0000000..867faa4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/cursor-arrow-ripple.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/device-phone-mobile.svg b/assets/vendor/heroicons/optimized/24/solid/device-phone-mobile.svg
new file mode 100644
index 0000000..eec0738
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/device-phone-mobile.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/device-tablet.svg b/assets/vendor/heroicons/optimized/24/solid/device-tablet.svg
new file mode 100644
index 0000000..88e2cc8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/device-tablet.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/document-arrow-down.svg b/assets/vendor/heroicons/optimized/24/solid/document-arrow-down.svg
new file mode 100644
index 0000000..77ac19c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/document-arrow-down.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/document-arrow-up.svg b/assets/vendor/heroicons/optimized/24/solid/document-arrow-up.svg
new file mode 100644
index 0000000..bc26cb9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/document-arrow-up.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/document-chart-bar.svg b/assets/vendor/heroicons/optimized/24/solid/document-chart-bar.svg
new file mode 100644
index 0000000..83d0eac
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/document-chart-bar.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/document-check.svg b/assets/vendor/heroicons/optimized/24/solid/document-check.svg
new file mode 100644
index 0000000..e827854
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/document-check.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/document-duplicate.svg b/assets/vendor/heroicons/optimized/24/solid/document-duplicate.svg
new file mode 100644
index 0000000..fa7375d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/document-duplicate.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/document-magnifying-glass.svg b/assets/vendor/heroicons/optimized/24/solid/document-magnifying-glass.svg
new file mode 100644
index 0000000..ab165f7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/document-magnifying-glass.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/document-minus.svg b/assets/vendor/heroicons/optimized/24/solid/document-minus.svg
new file mode 100644
index 0000000..265c6eb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/document-minus.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/document-plus.svg b/assets/vendor/heroicons/optimized/24/solid/document-plus.svg
new file mode 100644
index 0000000..5e31459
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/document-plus.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/document-text.svg b/assets/vendor/heroicons/optimized/24/solid/document-text.svg
new file mode 100644
index 0000000..73b30cd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/document-text.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/document.svg b/assets/vendor/heroicons/optimized/24/solid/document.svg
new file mode 100644
index 0000000..a05f20f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/document.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/ellipsis-horizontal-circle.svg b/assets/vendor/heroicons/optimized/24/solid/ellipsis-horizontal-circle.svg
new file mode 100644
index 0000000..6ec2b50
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/ellipsis-horizontal-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/ellipsis-horizontal.svg b/assets/vendor/heroicons/optimized/24/solid/ellipsis-horizontal.svg
new file mode 100644
index 0000000..ddb5a3f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/ellipsis-horizontal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/ellipsis-vertical.svg b/assets/vendor/heroicons/optimized/24/solid/ellipsis-vertical.svg
new file mode 100644
index 0000000..792c0ae
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/ellipsis-vertical.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/envelope-open.svg b/assets/vendor/heroicons/optimized/24/solid/envelope-open.svg
new file mode 100644
index 0000000..e6bf97b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/envelope-open.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/envelope.svg b/assets/vendor/heroicons/optimized/24/solid/envelope.svg
new file mode 100644
index 0000000..702341b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/envelope.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/exclamation-circle.svg b/assets/vendor/heroicons/optimized/24/solid/exclamation-circle.svg
new file mode 100644
index 0000000..fdaadc0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/exclamation-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/exclamation-triangle.svg b/assets/vendor/heroicons/optimized/24/solid/exclamation-triangle.svg
new file mode 100644
index 0000000..627a712
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/exclamation-triangle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/eye-dropper.svg b/assets/vendor/heroicons/optimized/24/solid/eye-dropper.svg
new file mode 100644
index 0000000..15b16d0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/eye-dropper.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/eye-slash.svg b/assets/vendor/heroicons/optimized/24/solid/eye-slash.svg
new file mode 100644
index 0000000..11ef99b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/eye-slash.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/eye.svg b/assets/vendor/heroicons/optimized/24/solid/eye.svg
new file mode 100644
index 0000000..a648db3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/eye.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/face-frown.svg b/assets/vendor/heroicons/optimized/24/solid/face-frown.svg
new file mode 100644
index 0000000..7040d58
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/face-frown.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/face-smile.svg b/assets/vendor/heroicons/optimized/24/solid/face-smile.svg
new file mode 100644
index 0000000..d5e75a2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/face-smile.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/film.svg b/assets/vendor/heroicons/optimized/24/solid/film.svg
new file mode 100644
index 0000000..fbd26cc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/film.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/finger-print.svg b/assets/vendor/heroicons/optimized/24/solid/finger-print.svg
new file mode 100644
index 0000000..68e72b4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/finger-print.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/fire.svg b/assets/vendor/heroicons/optimized/24/solid/fire.svg
new file mode 100644
index 0000000..93b1b1f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/fire.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/flag.svg b/assets/vendor/heroicons/optimized/24/solid/flag.svg
new file mode 100644
index 0000000..8c67b01
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/flag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/folder-arrow-down.svg b/assets/vendor/heroicons/optimized/24/solid/folder-arrow-down.svg
new file mode 100644
index 0000000..5d963b4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/folder-arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/folder-minus.svg b/assets/vendor/heroicons/optimized/24/solid/folder-minus.svg
new file mode 100644
index 0000000..d0292b8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/folder-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/folder-open.svg b/assets/vendor/heroicons/optimized/24/solid/folder-open.svg
new file mode 100644
index 0000000..b9d80ba
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/folder-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/folder-plus.svg b/assets/vendor/heroicons/optimized/24/solid/folder-plus.svg
new file mode 100644
index 0000000..efaf949
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/folder-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/folder.svg b/assets/vendor/heroicons/optimized/24/solid/folder.svg
new file mode 100644
index 0000000..a7847f8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/folder.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/forward.svg b/assets/vendor/heroicons/optimized/24/solid/forward.svg
new file mode 100644
index 0000000..de90863
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/forward.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/funnel.svg b/assets/vendor/heroicons/optimized/24/solid/funnel.svg
new file mode 100644
index 0000000..fe5699f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/funnel.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/gif.svg b/assets/vendor/heroicons/optimized/24/solid/gif.svg
new file mode 100644
index 0000000..283e6e5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/gif.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/gift-top.svg b/assets/vendor/heroicons/optimized/24/solid/gift-top.svg
new file mode 100644
index 0000000..4bd4e6f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/gift-top.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/gift.svg b/assets/vendor/heroicons/optimized/24/solid/gift.svg
new file mode 100644
index 0000000..2ca6c92
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/gift.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/globe-alt.svg b/assets/vendor/heroicons/optimized/24/solid/globe-alt.svg
new file mode 100644
index 0000000..0cbacae
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/globe-alt.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/globe-americas.svg b/assets/vendor/heroicons/optimized/24/solid/globe-americas.svg
new file mode 100644
index 0000000..5ae0d5d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/globe-americas.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/globe-asia-australia.svg b/assets/vendor/heroicons/optimized/24/solid/globe-asia-australia.svg
new file mode 100644
index 0000000..14249d6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/globe-asia-australia.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/globe-europe-africa.svg b/assets/vendor/heroicons/optimized/24/solid/globe-europe-africa.svg
new file mode 100644
index 0000000..49a78fd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/globe-europe-africa.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/hand-raised.svg b/assets/vendor/heroicons/optimized/24/solid/hand-raised.svg
new file mode 100644
index 0000000..1717d51
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/hand-raised.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/hand-thumb-down.svg b/assets/vendor/heroicons/optimized/24/solid/hand-thumb-down.svg
new file mode 100644
index 0000000..7a2b9a6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/hand-thumb-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/hand-thumb-up.svg b/assets/vendor/heroicons/optimized/24/solid/hand-thumb-up.svg
new file mode 100644
index 0000000..4942d2d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/hand-thumb-up.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/hashtag.svg b/assets/vendor/heroicons/optimized/24/solid/hashtag.svg
new file mode 100644
index 0000000..29e677d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/hashtag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/heart.svg b/assets/vendor/heroicons/optimized/24/solid/heart.svg
new file mode 100644
index 0000000..b5f0d95
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/heart.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/home-modern.svg b/assets/vendor/heroicons/optimized/24/solid/home-modern.svg
new file mode 100644
index 0000000..488685a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/home-modern.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/home.svg b/assets/vendor/heroicons/optimized/24/solid/home.svg
new file mode 100644
index 0000000..ec0bae1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/home.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/identification.svg b/assets/vendor/heroicons/optimized/24/solid/identification.svg
new file mode 100644
index 0000000..829b24d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/identification.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/inbox-arrow-down.svg b/assets/vendor/heroicons/optimized/24/solid/inbox-arrow-down.svg
new file mode 100644
index 0000000..4fd220b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/inbox-arrow-down.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/inbox-stack.svg b/assets/vendor/heroicons/optimized/24/solid/inbox-stack.svg
new file mode 100644
index 0000000..fffab99
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/inbox-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/inbox.svg b/assets/vendor/heroicons/optimized/24/solid/inbox.svg
new file mode 100644
index 0000000..b74380e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/inbox.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/information-circle.svg b/assets/vendor/heroicons/optimized/24/solid/information-circle.svg
new file mode 100644
index 0000000..bd2723b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/information-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/key.svg b/assets/vendor/heroicons/optimized/24/solid/key.svg
new file mode 100644
index 0000000..6acee27
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/key.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/language.svg b/assets/vendor/heroicons/optimized/24/solid/language.svg
new file mode 100644
index 0000000..60d1aee
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/language.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/lifebuoy.svg b/assets/vendor/heroicons/optimized/24/solid/lifebuoy.svg
new file mode 100644
index 0000000..9ddc8d4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/lifebuoy.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/light-bulb.svg b/assets/vendor/heroicons/optimized/24/solid/light-bulb.svg
new file mode 100644
index 0000000..ff49cb3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/light-bulb.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/link.svg b/assets/vendor/heroicons/optimized/24/solid/link.svg
new file mode 100644
index 0000000..a6dc093
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/link.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/list-bullet.svg b/assets/vendor/heroicons/optimized/24/solid/list-bullet.svg
new file mode 100644
index 0000000..7983877
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/list-bullet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/lock-closed.svg b/assets/vendor/heroicons/optimized/24/solid/lock-closed.svg
new file mode 100644
index 0000000..8a5a6d7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/lock-closed.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/lock-open.svg b/assets/vendor/heroicons/optimized/24/solid/lock-open.svg
new file mode 100644
index 0000000..4562f7e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/lock-open.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-circle.svg b/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-circle.svg
new file mode 100644
index 0000000..17a6f28
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-circle.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-minus.svg b/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-minus.svg
new file mode 100644
index 0000000..06ae161
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-plus.svg b/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-plus.svg
new file mode 100644
index 0000000..92040d0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/magnifying-glass-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/magnifying-glass.svg b/assets/vendor/heroicons/optimized/24/solid/magnifying-glass.svg
new file mode 100644
index 0000000..b602e08
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/magnifying-glass.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/map-pin.svg b/assets/vendor/heroicons/optimized/24/solid/map-pin.svg
new file mode 100644
index 0000000..92e6785
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/map-pin.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/map.svg b/assets/vendor/heroicons/optimized/24/solid/map.svg
new file mode 100644
index 0000000..9d4f7dd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/map.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/megaphone.svg b/assets/vendor/heroicons/optimized/24/solid/megaphone.svg
new file mode 100644
index 0000000..b1f1e10
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/megaphone.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/microphone.svg b/assets/vendor/heroicons/optimized/24/solid/microphone.svg
new file mode 100644
index 0000000..a5f4cb6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/microphone.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/minus-circle.svg b/assets/vendor/heroicons/optimized/24/solid/minus-circle.svg
new file mode 100644
index 0000000..8c981ab
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/minus-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/minus-small.svg b/assets/vendor/heroicons/optimized/24/solid/minus-small.svg
new file mode 100644
index 0000000..782213e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/minus-small.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/minus.svg b/assets/vendor/heroicons/optimized/24/solid/minus.svg
new file mode 100644
index 0000000..1fa7117
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/moon.svg b/assets/vendor/heroicons/optimized/24/solid/moon.svg
new file mode 100644
index 0000000..97d5c5a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/moon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/musical-note.svg b/assets/vendor/heroicons/optimized/24/solid/musical-note.svg
new file mode 100644
index 0000000..a9ab9b5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/musical-note.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/newspaper.svg b/assets/vendor/heroicons/optimized/24/solid/newspaper.svg
new file mode 100644
index 0000000..d1f2c1e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/newspaper.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/no-symbol.svg b/assets/vendor/heroicons/optimized/24/solid/no-symbol.svg
new file mode 100644
index 0000000..42eb771
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/no-symbol.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/paint-brush.svg b/assets/vendor/heroicons/optimized/24/solid/paint-brush.svg
new file mode 100644
index 0000000..35fd5a6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/paint-brush.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/paper-airplane.svg b/assets/vendor/heroicons/optimized/24/solid/paper-airplane.svg
new file mode 100644
index 0000000..9365a57
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/paper-airplane.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/paper-clip.svg b/assets/vendor/heroicons/optimized/24/solid/paper-clip.svg
new file mode 100644
index 0000000..0a0dcdd
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/paper-clip.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/pause-circle.svg b/assets/vendor/heroicons/optimized/24/solid/pause-circle.svg
new file mode 100644
index 0000000..4fe4f2b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/pause-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/pause.svg b/assets/vendor/heroicons/optimized/24/solid/pause.svg
new file mode 100644
index 0000000..2e121ac
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/pause.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/pencil-square.svg b/assets/vendor/heroicons/optimized/24/solid/pencil-square.svg
new file mode 100644
index 0000000..5f4aaf8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/pencil-square.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/pencil.svg b/assets/vendor/heroicons/optimized/24/solid/pencil.svg
new file mode 100644
index 0000000..78ec61a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/pencil.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/phone-arrow-down-left.svg b/assets/vendor/heroicons/optimized/24/solid/phone-arrow-down-left.svg
new file mode 100644
index 0000000..06f3ba0
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/phone-arrow-down-left.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/phone-arrow-up-right.svg b/assets/vendor/heroicons/optimized/24/solid/phone-arrow-up-right.svg
new file mode 100644
index 0000000..678c4f6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/phone-arrow-up-right.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/phone-x-mark.svg b/assets/vendor/heroicons/optimized/24/solid/phone-x-mark.svg
new file mode 100644
index 0000000..a017a7d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/phone-x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/phone.svg b/assets/vendor/heroicons/optimized/24/solid/phone.svg
new file mode 100644
index 0000000..ca2a6bc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/phone.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/photo.svg b/assets/vendor/heroicons/optimized/24/solid/photo.svg
new file mode 100644
index 0000000..57e023d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/photo.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/play-circle.svg b/assets/vendor/heroicons/optimized/24/solid/play-circle.svg
new file mode 100644
index 0000000..752273a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/play-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/play-pause.svg b/assets/vendor/heroicons/optimized/24/solid/play-pause.svg
new file mode 100644
index 0000000..e5bb17c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/play-pause.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/play.svg b/assets/vendor/heroicons/optimized/24/solid/play.svg
new file mode 100644
index 0000000..da0e4e2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/play.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/plus-circle.svg b/assets/vendor/heroicons/optimized/24/solid/plus-circle.svg
new file mode 100644
index 0000000..b45f965
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/plus-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/plus-small.svg b/assets/vendor/heroicons/optimized/24/solid/plus-small.svg
new file mode 100644
index 0000000..0c4b744
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/plus-small.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/plus.svg b/assets/vendor/heroicons/optimized/24/solid/plus.svg
new file mode 100644
index 0000000..85d3b14
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/power.svg b/assets/vendor/heroicons/optimized/24/solid/power.svg
new file mode 100644
index 0000000..2bf830f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/power.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/presentation-chart-bar.svg b/assets/vendor/heroicons/optimized/24/solid/presentation-chart-bar.svg
new file mode 100644
index 0000000..cb0bc9a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/presentation-chart-bar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/presentation-chart-line.svg b/assets/vendor/heroicons/optimized/24/solid/presentation-chart-line.svg
new file mode 100644
index 0000000..54e10b2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/presentation-chart-line.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/printer.svg b/assets/vendor/heroicons/optimized/24/solid/printer.svg
new file mode 100644
index 0000000..4fce791
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/printer.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/puzzle-piece.svg b/assets/vendor/heroicons/optimized/24/solid/puzzle-piece.svg
new file mode 100644
index 0000000..4f85b37
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/puzzle-piece.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/qr-code.svg b/assets/vendor/heroicons/optimized/24/solid/qr-code.svg
new file mode 100644
index 0000000..7f676ca
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/qr-code.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/question-mark-circle.svg b/assets/vendor/heroicons/optimized/24/solid/question-mark-circle.svg
new file mode 100644
index 0000000..2ae51be
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/question-mark-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/queue-list.svg b/assets/vendor/heroicons/optimized/24/solid/queue-list.svg
new file mode 100644
index 0000000..536fd88
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/queue-list.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/radio.svg b/assets/vendor/heroicons/optimized/24/solid/radio.svg
new file mode 100644
index 0000000..92ca514
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/radio.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/receipt-percent.svg b/assets/vendor/heroicons/optimized/24/solid/receipt-percent.svg
new file mode 100644
index 0000000..5eb6371
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/receipt-percent.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/receipt-refund.svg b/assets/vendor/heroicons/optimized/24/solid/receipt-refund.svg
new file mode 100644
index 0000000..6a1a154
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/receipt-refund.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/rectangle-group.svg b/assets/vendor/heroicons/optimized/24/solid/rectangle-group.svg
new file mode 100644
index 0000000..289d198
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/rectangle-group.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/rectangle-stack.svg b/assets/vendor/heroicons/optimized/24/solid/rectangle-stack.svg
new file mode 100644
index 0000000..82a1334
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/rectangle-stack.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/rocket-launch.svg b/assets/vendor/heroicons/optimized/24/solid/rocket-launch.svg
new file mode 100644
index 0000000..522fc64
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/rocket-launch.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/rss.svg b/assets/vendor/heroicons/optimized/24/solid/rss.svg
new file mode 100644
index 0000000..b9a8ab2
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/rss.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/scale.svg b/assets/vendor/heroicons/optimized/24/solid/scale.svg
new file mode 100644
index 0000000..b7e57c7
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/scale.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/scissors.svg b/assets/vendor/heroicons/optimized/24/solid/scissors.svg
new file mode 100644
index 0000000..9c971b3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/scissors.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/server-stack.svg b/assets/vendor/heroicons/optimized/24/solid/server-stack.svg
new file mode 100644
index 0000000..c0d3074
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/server-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/server.svg b/assets/vendor/heroicons/optimized/24/solid/server.svg
new file mode 100644
index 0000000..55f9aed
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/server.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/share.svg b/assets/vendor/heroicons/optimized/24/solid/share.svg
new file mode 100644
index 0000000..8f45dfc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/share.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/shield-check.svg b/assets/vendor/heroicons/optimized/24/solid/shield-check.svg
new file mode 100644
index 0000000..2596ace
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/shield-check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/shield-exclamation.svg b/assets/vendor/heroicons/optimized/24/solid/shield-exclamation.svg
new file mode 100644
index 0000000..ce53fcc
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/shield-exclamation.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/shopping-bag.svg b/assets/vendor/heroicons/optimized/24/solid/shopping-bag.svg
new file mode 100644
index 0000000..e6503ee
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/shopping-bag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/shopping-cart.svg b/assets/vendor/heroicons/optimized/24/solid/shopping-cart.svg
new file mode 100644
index 0000000..931a12f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/shopping-cart.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/signal-slash.svg b/assets/vendor/heroicons/optimized/24/solid/signal-slash.svg
new file mode 100644
index 0000000..21c65cb
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/signal-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/signal.svg b/assets/vendor/heroicons/optimized/24/solid/signal.svg
new file mode 100644
index 0000000..9027aef
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/signal.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/sparkles.svg b/assets/vendor/heroicons/optimized/24/solid/sparkles.svg
new file mode 100644
index 0000000..0d8d0c1
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/sparkles.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/speaker-wave.svg b/assets/vendor/heroicons/optimized/24/solid/speaker-wave.svg
new file mode 100644
index 0000000..bd84477
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/speaker-wave.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/speaker-x-mark.svg b/assets/vendor/heroicons/optimized/24/solid/speaker-x-mark.svg
new file mode 100644
index 0000000..e71f1b6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/speaker-x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/square-2-stack.svg b/assets/vendor/heroicons/optimized/24/solid/square-2-stack.svg
new file mode 100644
index 0000000..c3726a5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/square-2-stack.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/square-3-stack-3d.svg b/assets/vendor/heroicons/optimized/24/solid/square-3-stack-3d.svg
new file mode 100644
index 0000000..8ed638d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/square-3-stack-3d.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/squares-2x2.svg b/assets/vendor/heroicons/optimized/24/solid/squares-2x2.svg
new file mode 100644
index 0000000..475f6c3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/squares-2x2.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/squares-plus.svg b/assets/vendor/heroicons/optimized/24/solid/squares-plus.svg
new file mode 100644
index 0000000..88a2dda
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/squares-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/star.svg b/assets/vendor/heroicons/optimized/24/solid/star.svg
new file mode 100644
index 0000000..8509819
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/star.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/stop-circle.svg b/assets/vendor/heroicons/optimized/24/solid/stop-circle.svg
new file mode 100644
index 0000000..8e57a2c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/stop-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/stop.svg b/assets/vendor/heroicons/optimized/24/solid/stop.svg
new file mode 100644
index 0000000..1bf426f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/stop.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/sun.svg b/assets/vendor/heroicons/optimized/24/solid/sun.svg
new file mode 100644
index 0000000..1b597fa
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/sun.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/swatch.svg b/assets/vendor/heroicons/optimized/24/solid/swatch.svg
new file mode 100644
index 0000000..9b26c03
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/swatch.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/table-cells.svg b/assets/vendor/heroicons/optimized/24/solid/table-cells.svg
new file mode 100644
index 0000000..151a30c
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/table-cells.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/tag.svg b/assets/vendor/heroicons/optimized/24/solid/tag.svg
new file mode 100644
index 0000000..efcd01b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/tag.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/ticket.svg b/assets/vendor/heroicons/optimized/24/solid/ticket.svg
new file mode 100644
index 0000000..e947c41
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/ticket.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/trash.svg b/assets/vendor/heroicons/optimized/24/solid/trash.svg
new file mode 100644
index 0000000..ed7bf43
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/trash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/trophy.svg b/assets/vendor/heroicons/optimized/24/solid/trophy.svg
new file mode 100644
index 0000000..ed7ee15
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/trophy.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/truck.svg b/assets/vendor/heroicons/optimized/24/solid/truck.svg
new file mode 100644
index 0000000..c218da6
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/truck.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/tv.svg b/assets/vendor/heroicons/optimized/24/solid/tv.svg
new file mode 100644
index 0000000..8f27026
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/tv.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/user-circle.svg b/assets/vendor/heroicons/optimized/24/solid/user-circle.svg
new file mode 100644
index 0000000..978d0b8
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/user-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/user-group.svg b/assets/vendor/heroicons/optimized/24/solid/user-group.svg
new file mode 100644
index 0000000..7ae7600
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/user-group.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/user-minus.svg b/assets/vendor/heroicons/optimized/24/solid/user-minus.svg
new file mode 100644
index 0000000..062a7c9
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/user-minus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/user-plus.svg b/assets/vendor/heroicons/optimized/24/solid/user-plus.svg
new file mode 100644
index 0000000..ef313fa
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/user-plus.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/user.svg b/assets/vendor/heroicons/optimized/24/solid/user.svg
new file mode 100644
index 0000000..207213d
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/user.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/users.svg b/assets/vendor/heroicons/optimized/24/solid/users.svg
new file mode 100644
index 0000000..2959115
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/users.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/variable.svg b/assets/vendor/heroicons/optimized/24/solid/variable.svg
new file mode 100644
index 0000000..5601cac
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/variable.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/video-camera-slash.svg b/assets/vendor/heroicons/optimized/24/solid/video-camera-slash.svg
new file mode 100644
index 0000000..2a344d5
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/video-camera-slash.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/video-camera.svg b/assets/vendor/heroicons/optimized/24/solid/video-camera.svg
new file mode 100644
index 0000000..55bf7b4
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/video-camera.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/view-columns.svg b/assets/vendor/heroicons/optimized/24/solid/view-columns.svg
new file mode 100644
index 0000000..f7295e3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/view-columns.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/viewfinder-circle.svg b/assets/vendor/heroicons/optimized/24/solid/viewfinder-circle.svg
new file mode 100644
index 0000000..e04b727
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/viewfinder-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/wallet.svg b/assets/vendor/heroicons/optimized/24/solid/wallet.svg
new file mode 100644
index 0000000..001b38a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/wallet.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/wifi.svg b/assets/vendor/heroicons/optimized/24/solid/wifi.svg
new file mode 100644
index 0000000..eb4fd4e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/wifi.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/window.svg b/assets/vendor/heroicons/optimized/24/solid/window.svg
new file mode 100644
index 0000000..4de83b3
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/window.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/wrench-screwdriver.svg b/assets/vendor/heroicons/optimized/24/solid/wrench-screwdriver.svg
new file mode 100644
index 0000000..b7e0e9e
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/wrench-screwdriver.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/wrench.svg b/assets/vendor/heroicons/optimized/24/solid/wrench.svg
new file mode 100644
index 0000000..3b61d5b
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/wrench.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/x-circle.svg b/assets/vendor/heroicons/optimized/24/solid/x-circle.svg
new file mode 100644
index 0000000..913782a
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/x-circle.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/heroicons/optimized/24/solid/x-mark.svg b/assets/vendor/heroicons/optimized/24/solid/x-mark.svg
new file mode 100644
index 0000000..e525a8f
--- /dev/null
+++ b/assets/vendor/heroicons/optimized/24/solid/x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/vendor/topbar.js b/assets/vendor/topbar.js
new file mode 100644
index 0000000..4195727
--- /dev/null
+++ b/assets/vendor/topbar.js
@@ -0,0 +1,165 @@
+/**
+ * @license MIT
+ * topbar 2.0.0, 2023-02-04
+ * https://buunguyen.github.io/topbar
+ * Copyright (c) 2021 Buu Nguyen
+ */
+(function (window, document) {
+ "use strict";
+
+ // https://gist.github.com/paulirish/1579671
+ (function () {
+ var lastTime = 0;
+ var vendors = ["ms", "moz", "webkit", "o"];
+ for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
+ window.requestAnimationFrame =
+ window[vendors[x] + "RequestAnimationFrame"];
+ window.cancelAnimationFrame =
+ window[vendors[x] + "CancelAnimationFrame"] ||
+ window[vendors[x] + "CancelRequestAnimationFrame"];
+ }
+ if (!window.requestAnimationFrame)
+ window.requestAnimationFrame = function (callback, element) {
+ var currTime = new Date().getTime();
+ var timeToCall = Math.max(0, 16 - (currTime - lastTime));
+ var id = window.setTimeout(function () {
+ callback(currTime + timeToCall);
+ }, timeToCall);
+ lastTime = currTime + timeToCall;
+ return id;
+ };
+ if (!window.cancelAnimationFrame)
+ window.cancelAnimationFrame = function (id) {
+ clearTimeout(id);
+ };
+ })();
+
+ var canvas,
+ currentProgress,
+ showing,
+ progressTimerId = null,
+ fadeTimerId = null,
+ delayTimerId = null,
+ addEvent = function (elem, type, handler) {
+ if (elem.addEventListener) elem.addEventListener(type, handler, false);
+ else if (elem.attachEvent) elem.attachEvent("on" + type, handler);
+ else elem["on" + type] = handler;
+ },
+ options = {
+ autoRun: true,
+ barThickness: 3,
+ barColors: {
+ 0: "rgba(26, 188, 156, .9)",
+ ".25": "rgba(52, 152, 219, .9)",
+ ".50": "rgba(241, 196, 15, .9)",
+ ".75": "rgba(230, 126, 34, .9)",
+ "1.0": "rgba(211, 84, 0, .9)",
+ },
+ shadowBlur: 10,
+ shadowColor: "rgba(0, 0, 0, .6)",
+ className: null,
+ },
+ repaint = function () {
+ canvas.width = window.innerWidth;
+ canvas.height = options.barThickness * 5; // need space for shadow
+
+ var ctx = canvas.getContext("2d");
+ ctx.shadowBlur = options.shadowBlur;
+ ctx.shadowColor = options.shadowColor;
+
+ var lineGradient = ctx.createLinearGradient(0, 0, canvas.width, 0);
+ for (var stop in options.barColors)
+ lineGradient.addColorStop(stop, options.barColors[stop]);
+ ctx.lineWidth = options.barThickness;
+ ctx.beginPath();
+ ctx.moveTo(0, options.barThickness / 2);
+ ctx.lineTo(
+ Math.ceil(currentProgress * canvas.width),
+ options.barThickness / 2
+ );
+ ctx.strokeStyle = lineGradient;
+ ctx.stroke();
+ },
+ createCanvas = function () {
+ canvas = document.createElement("canvas");
+ var style = canvas.style;
+ style.position = "fixed";
+ style.top = style.left = style.right = style.margin = style.padding = 0;
+ style.zIndex = 100001;
+ style.display = "none";
+ if (options.className) canvas.classList.add(options.className);
+ document.body.appendChild(canvas);
+ addEvent(window, "resize", repaint);
+ },
+ topbar = {
+ config: function (opts) {
+ for (var key in opts)
+ if (options.hasOwnProperty(key)) options[key] = opts[key];
+ },
+ show: function (delay) {
+ if (showing) return;
+ if (delay) {
+ if (delayTimerId) return;
+ delayTimerId = setTimeout(() => topbar.show(), delay);
+ } else {
+ showing = true;
+ if (fadeTimerId !== null) window.cancelAnimationFrame(fadeTimerId);
+ if (!canvas) createCanvas();
+ canvas.style.opacity = 1;
+ canvas.style.display = "block";
+ topbar.progress(0);
+ if (options.autoRun) {
+ (function loop() {
+ progressTimerId = window.requestAnimationFrame(loop);
+ topbar.progress(
+ "+" + 0.05 * Math.pow(1 - Math.sqrt(currentProgress), 2)
+ );
+ })();
+ }
+ }
+ },
+ progress: function (to) {
+ if (typeof to === "undefined") return currentProgress;
+ if (typeof to === "string") {
+ to =
+ (to.indexOf("+") >= 0 || to.indexOf("-") >= 0
+ ? currentProgress
+ : 0) + parseFloat(to);
+ }
+ currentProgress = to > 1 ? 1 : to;
+ repaint();
+ return currentProgress;
+ },
+ hide: function () {
+ clearTimeout(delayTimerId);
+ delayTimerId = null;
+ if (!showing) return;
+ showing = false;
+ if (progressTimerId != null) {
+ window.cancelAnimationFrame(progressTimerId);
+ progressTimerId = null;
+ }
+ (function loop() {
+ if (topbar.progress("+.1") >= 1) {
+ canvas.style.opacity -= 0.05;
+ if (canvas.style.opacity <= 0.05) {
+ canvas.style.display = "none";
+ fadeTimerId = null;
+ return;
+ }
+ }
+ fadeTimerId = window.requestAnimationFrame(loop);
+ })();
+ },
+ };
+
+ if (typeof module === "object" && typeof module.exports === "object") {
+ module.exports = topbar;
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return topbar;
+ });
+ } else {
+ this.topbar = topbar;
+ }
+}.call(this, window, document));
diff --git a/assets/yarn.lock b/assets/yarn.lock
new file mode 100644
index 0000000..fb57ccd
--- /dev/null
+++ b/assets/yarn.lock
@@ -0,0 +1,4 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
diff --git a/config/config.exs b/config/config.exs
new file mode 100644
index 0000000..d072fd4
--- /dev/null
+++ b/config/config.exs
@@ -0,0 +1,66 @@
+# This file is responsible for configuring your application
+# and its dependencies with the aid of the Config module.
+#
+# This configuration file is loaded before any dependency and
+# is restricted to this project.
+
+# General application configuration
+import Config
+
+config :multi_tenant,
+ ecto_repos: [MultiTenant.Repo],
+ generators: [timestamp_type: :utc_datetime]
+
+# Configures the endpoint
+config :multi_tenant, MultiTenantWeb.Endpoint,
+ url: [host: "localhost"],
+ adapter: Phoenix.Endpoint.Cowboy2Adapter,
+ render_errors: [
+ formats: [html: MultiTenantWeb.ErrorHTML, json: MultiTenantWeb.ErrorJSON],
+ layout: false
+ ],
+ pubsub_server: MultiTenant.PubSub,
+ live_view: [signing_salt: "rTi1WyOL"]
+
+# Configures the mailer
+#
+# By default it uses the "Local" adapter which stores the emails
+# locally. You can see the emails in your browser, at "/dev/mailbox".
+#
+# For production it's recommended to configure a different adapter
+# at the `config/runtime.exs`.
+config :multi_tenant, MultiTenant.Mailer, adapter: Swoosh.Adapters.Local
+
+# Configure esbuild (the version is required)
+config :esbuild,
+ version: "0.17.11",
+ default: [
+ args:
+ ~w(js/app.js --bundle --target=es2017 --outdir=../priv/static/assets --external:/fonts/* --external:/images/*),
+ cd: Path.expand("../assets", __DIR__),
+ env: %{"NODE_PATH" => Path.expand("../deps", __DIR__)}
+ ]
+
+# Configure tailwind (the version is required)
+config :tailwind,
+ version: "3.3.2",
+ default: [
+ args: ~w(
+ --config=tailwind.config.js
+ --input=css/app.css
+ --output=../priv/static/assets/app.css
+ ),
+ cd: Path.expand("../assets", __DIR__)
+ ]
+
+# 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
+
+# Import environment specific config. This must remain at the bottom
+# of this file so it overrides the configuration defined above.
+import_config "#{config_env()}.exs"
diff --git a/config/dev.exs b/config/dev.exs
new file mode 100644
index 0000000..82482ab
--- /dev/null
+++ b/config/dev.exs
@@ -0,0 +1,82 @@
+import Config
+
+# Configure your database
+config :multi_tenant, MultiTenant.Repo,
+ username: "postgres",
+ password: "postgres",
+ hostname: "localhost",
+ database: "multi_tenant_dev",
+ stacktrace: true,
+ 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 can use it
+# to bundle .js and .css sources.
+config :multi_tenant, MultiTenantWeb.Endpoint,
+ # Binding to loopback ipv4 address prevents access from other machines.
+ # Change to `ip: {0, 0, 0, 0}` to allow access from other machines.
+ http: [ip: {127, 0, 0, 1}, port: 4000],
+ check_origin: false,
+ code_reloader: true,
+ debug_errors: true,
+ secret_key_base: "ZGq9GQkqZ6scP4FA/mwdt365QxampWRun/iRLGkpkMo7s+87Qrn6+yh5fmq/+ZIk",
+ watchers: [
+ esbuild: {Esbuild, :install_and_run, [:default, ~w(--sourcemap=inline --watch)]},
+ tailwind: {Tailwind, :install_and_run, [:default, ~w(--watch)]}
+ ]
+
+# ## 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
+#
+# Run `mix help phx.gen.cert` for more information.
+#
+# The `http:` config above can be replaced with:
+#
+# https: [
+# port: 4001,
+# cipher_suite: :strong,
+# keyfile: "priv/cert/selfsigned_key.pem",
+# certfile: "priv/cert/selfsigned.pem"
+# ],
+#
+# 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 :multi_tenant, MultiTenantWeb.Endpoint,
+ live_reload: [
+ patterns: [
+ ~r"priv/static/.*(js|css|png|jpeg|jpg|gif|svg)$",
+ ~r"priv/gettext/.*(po)$",
+ ~r"lib/multi_tenant_web/(controllers|live|components)/.*(ex|heex)$"
+ ]
+ ]
+
+# Enable dev routes for dashboard and mailbox
+config :multi_tenant, dev_routes: true
+
+# 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
+
+# Include HEEx debug annotations as HTML comments in rendered markup
+config :phoenix_live_view, :debug_heex_annotations, true
+
+# Disable swoosh api client as it is only required for production adapters.
+config :swoosh, :api_client, false
diff --git a/config/prod.exs b/config/prod.exs
new file mode 100644
index 0000000..9dd350f
--- /dev/null
+++ b/config/prod.exs
@@ -0,0 +1,21 @@
+import Config
+
+# Note we also include the path to a cache manifest
+# containing the digested version of static files. This
+# manifest is generated by the `mix assets.deploy` task,
+# which you should run after static files are built and
+# before starting your production server.
+config :multi_tenant, MultiTenantWeb.Endpoint,
+ cache_static_manifest: "priv/static/cache_manifest.json"
+
+# Configures Swoosh API Client
+config :swoosh, api_client: Swoosh.ApiClient.Finch, finch_name: MultiTenant.Finch
+
+# Disable Swoosh Local Memory Storage
+config :swoosh, local: false
+
+# Do not print debug messages in production
+config :logger, level: :info
+
+# Runtime production configuration, including reading
+# of environment variables, is done on config/runtime.exs.
diff --git a/config/runtime.exs b/config/runtime.exs
new file mode 100644
index 0000000..10479c2
--- /dev/null
+++ b/config/runtime.exs
@@ -0,0 +1,117 @@
+import Config
+
+# config/runtime.exs is executed for all environments, including
+# during releases. It is executed after compilation and before the
+# system starts, so it is typically used to load production configuration
+# and secrets from environment variables or elsewhere. Do not define
+# any compile-time configuration in here, as it won't be applied.
+# The block below contains prod specific runtime configuration.
+
+# ## Using releases
+#
+# If you use `mix release`, you need to explicitly enable the server
+# by passing the PHX_SERVER=true when you start it:
+#
+# PHX_SERVER=true bin/multi_tenant start
+#
+# Alternatively, you can use `mix phx.gen.release` to generate a `bin/server`
+# script that automatically sets the env var above.
+if System.get_env("PHX_SERVER") do
+ config :multi_tenant, MultiTenantWeb.Endpoint, server: true
+end
+
+if config_env() == :prod do
+ database_url =
+ System.get_env("DATABASE_URL") ||
+ raise """
+ environment variable DATABASE_URL is missing.
+ For example: ecto://USER:PASS@HOST/DATABASE
+ """
+
+ maybe_ipv6 = if System.get_env("ECTO_IPV6") in ~w(true 1), do: [:inet6], else: []
+
+ config :multi_tenant, MultiTenant.Repo,
+ # ssl: true,
+ url: database_url,
+ pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10"),
+ socket_options: maybe_ipv6
+
+ # The secret key base is used to sign/encrypt cookies and other secrets.
+ # A default value is used in config/dev.exs and config/test.exs but you
+ # want to use a different value for prod and you most likely don't want
+ # to check this value into version control, so we use an environment
+ # variable instead.
+ 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
+ """
+
+ host = System.get_env("PHX_HOST") || "example.com"
+ port = String.to_integer(System.get_env("PORT") || "4000")
+
+ config :multi_tenant, :dns_cluster_query, System.get_env("DNS_CLUSTER_QUERY")
+
+ config :multi_tenant, MultiTenantWeb.Endpoint,
+ url: [host: host, port: 443, scheme: "https"],
+ http: [
+ # Enable IPv6 and bind on all interfaces.
+ # Set it to {0, 0, 0, 0, 0, 0, 0, 1} for local network only access.
+ # See the documentation on https://hexdocs.pm/plug_cowboy/Plug.Cowboy.html
+ # for details about using IPv6 vs IPv4 and loopback vs public addresses.
+ ip: {0, 0, 0, 0, 0, 0, 0, 0},
+ port: port
+ ],
+ secret_key_base: secret_key_base
+
+ # ## SSL Support
+ #
+ # To get SSL working, you will need to add the `https` key
+ # to your endpoint configuration:
+ #
+ # config :multi_tenant, MultiTenantWeb.Endpoint,
+ # https: [
+ # ...,
+ # port: 443,
+ # cipher_suite: :strong,
+ # keyfile: System.get_env("SOME_APP_SSL_KEY_PATH"),
+ # certfile: System.get_env("SOME_APP_SSL_CERT_PATH")
+ # ]
+ #
+ # 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 :multi_tenant, MultiTenantWeb.Endpoint,
+ # force_ssl: [hsts: true]
+ #
+ # Check `Plug.SSL` for all available options in `force_ssl`.
+
+ # ## Configuring the mailer
+ #
+ # In production you need to configure the mailer to use a different adapter.
+ # Also, you may need to configure the Swoosh API client of your choice if you
+ # are not using SMTP. Here is an example of the configuration:
+ #
+ # config :multi_tenant, MultiTenant.Mailer,
+ # adapter: Swoosh.Adapters.Mailgun,
+ # api_key: System.get_env("MAILGUN_API_KEY"),
+ # domain: System.get_env("MAILGUN_DOMAIN")
+ #
+ # For this example you need include a HTTP client required by Swoosh API client.
+ # Swoosh supports Hackney and Finch out of the box:
+ #
+ # config :swoosh, :api_client, Swoosh.ApiClient.Hackney
+ #
+ # See https://hexdocs.pm/swoosh/Swoosh.html#module-installation for details.
+end
diff --git a/config/test.exs b/config/test.exs
new file mode 100644
index 0000000..587890f
--- /dev/null
+++ b/config/test.exs
@@ -0,0 +1,33 @@
+import 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 :multi_tenant, MultiTenant.Repo,
+ username: "postgres",
+ password: "postgres",
+ hostname: "localhost",
+ database: "multi_tenant_test#{System.get_env("MIX_TEST_PARTITION")}",
+ pool: Ecto.Adapters.SQL.Sandbox,
+ pool_size: 10
+
+# We don't run a server during test. If one is required,
+# you can enable the server option below.
+config :multi_tenant, MultiTenantWeb.Endpoint,
+ http: [ip: {127, 0, 0, 1}, port: 4002],
+ secret_key_base: "kItRDxtb3Fj/DYhK36/AXqkgKeToWj4ap801vhHvFHjGN+cpGdOh/fyU3XiBW9qH",
+ server: false
+
+# In test we don't send emails.
+config :multi_tenant, MultiTenant.Mailer, adapter: Swoosh.Adapters.Test
+
+# Disable swoosh api client as it is only required for production adapters.
+config :swoosh, :api_client, false
+
+# Print only warnings and errors during test
+config :logger, level: :warning
+
+# Initialize plugs at runtime for faster test compilation
+config :phoenix, :plug_init_mode, :runtime
diff --git a/lib/multi_tenant.ex b/lib/multi_tenant.ex
new file mode 100644
index 0000000..ccdddb9
--- /dev/null
+++ b/lib/multi_tenant.ex
@@ -0,0 +1,9 @@
+defmodule MultiTenant do
+ @moduledoc """
+ MultiTenant 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/lib/multi_tenant/application.ex b/lib/multi_tenant/application.ex
new file mode 100644
index 0000000..b07bc4f
--- /dev/null
+++ b/lib/multi_tenant/application.ex
@@ -0,0 +1,36 @@
+defmodule MultiTenant.Application do
+ # See https://hexdocs.pm/elixir/Application.html
+ # for more information on OTP Applications
+ @moduledoc false
+
+ use Application
+
+ @impl true
+ def start(_type, _args) do
+ children = [
+ MultiTenantWeb.Telemetry,
+ MultiTenant.Repo,
+ {DNSCluster, query: Application.get_env(:multi_tenant, :dns_cluster_query) || :ignore},
+ {Phoenix.PubSub, name: MultiTenant.PubSub},
+ # Start the Finch HTTP client for sending emails
+ {Finch, name: MultiTenant.Finch},
+ # Start a worker by calling: MultiTenant.Worker.start_link(arg)
+ # {MultiTenant.Worker, arg},
+ # Start to serve requests, typically the last entry
+ MultiTenantWeb.Endpoint
+ ]
+
+ # See https://hexdocs.pm/elixir/Supervisor.html
+ # for other strategies and supported options
+ opts = [strategy: :one_for_one, name: MultiTenant.Supervisor]
+ Supervisor.start_link(children, opts)
+ end
+
+ # Tell Phoenix to update the endpoint configuration
+ # whenever the application is updated.
+ @impl true
+ def config_change(changed, _new, removed) do
+ MultiTenantWeb.Endpoint.config_change(changed, removed)
+ :ok
+ end
+end
diff --git a/lib/multi_tenant/mailer.ex b/lib/multi_tenant/mailer.ex
new file mode 100644
index 0000000..9655a22
--- /dev/null
+++ b/lib/multi_tenant/mailer.ex
@@ -0,0 +1,3 @@
+defmodule MultiTenant.Mailer do
+ use Swoosh.Mailer, otp_app: :multi_tenant
+end
diff --git a/lib/multi_tenant/notes.ex b/lib/multi_tenant/notes.ex
new file mode 100644
index 0000000..fe16db3
--- /dev/null
+++ b/lib/multi_tenant/notes.ex
@@ -0,0 +1,34 @@
+defmodule MultiTenant.Notes do
+ import Ecto.Query, warn: false
+ alias MultiTenant.Repo
+ alias MultiTenant.Notes.Note
+
+ def list() do
+ Note
+ |> order_by(desc: :inserted_at)
+ |> Repo.all()
+ end
+
+ def get!(id), do: Repo.get!(Note, id)
+
+ def create(attrs \\ %{}) do
+ %Note{}
+ |> Note.changeset(attrs)
+ |> Repo.insert()
+ end
+
+ def update(%Note{} = note, attrs) do
+ note
+ |> Note.changeset(attrs)
+ |> Repo.update()
+ end
+
+ def delete(%Note{} = note) do
+ note
+ |> Repo.delete()
+ end
+
+ def changeset(%Note{} = note, attrs \\ %{}) do
+ Note.changeset(note, attrs)
+ end
+end
diff --git a/lib/multi_tenant/notes/note.ex b/lib/multi_tenant/notes/note.ex
new file mode 100644
index 0000000..a15f29d
--- /dev/null
+++ b/lib/multi_tenant/notes/note.ex
@@ -0,0 +1,18 @@
+defmodule MultiTenant.Notes.Note do
+ use Ecto.Schema
+ import Ecto.Changeset
+
+ schema "notes" do
+ field :title, :string
+ field :body, :string
+
+ timestamps(type: :utc_datetime)
+ end
+
+ @doc false
+ def changeset(note, attrs) do
+ note
+ |> cast(attrs, [:title, :body])
+ |> validate_required([:title])
+ end
+end
diff --git a/lib/multi_tenant/repo.ex b/lib/multi_tenant/repo.ex
new file mode 100644
index 0000000..2e53500
--- /dev/null
+++ b/lib/multi_tenant/repo.ex
@@ -0,0 +1,5 @@
+defmodule MultiTenant.Repo do
+ use Ecto.Repo,
+ otp_app: :multi_tenant,
+ adapter: Ecto.Adapters.Postgres
+end
diff --git a/lib/multi_tenant/todos.ex b/lib/multi_tenant/todos.ex
new file mode 100644
index 0000000..b2127b4
--- /dev/null
+++ b/lib/multi_tenant/todos.ex
@@ -0,0 +1,34 @@
+defmodule MultiTenant.Todos do
+ import Ecto.Query, warn: false
+ alias MultiTenant.Repo
+ alias MultiTenant.Todos.Todo
+
+ def list() do
+ Todo
+ |> order_by(desc: :inserted_at)
+ |> Repo.all()
+ end
+
+ def get!(id), do: Repo.get!(Todo, id)
+
+ def create(attrs \\ %{}) do
+ %Todo{}
+ |> Todo.changeset(attrs)
+ |> Repo.insert()
+ end
+
+ def update(%Todo{} = todo, attrs) do
+ todo
+ |> Todo.changeset(attrs)
+ |> Repo.update()
+ end
+
+ def delete(%Todo{} = todo) do
+ todo
+ |> Repo.delete()
+ end
+
+ def changeset(%Todo{} = todo, attrs \\ %{}) do
+ Todo.changeset(todo, attrs)
+ end
+end
diff --git a/lib/multi_tenant/todos/todo.ex b/lib/multi_tenant/todos/todo.ex
new file mode 100644
index 0000000..a061289
--- /dev/null
+++ b/lib/multi_tenant/todos/todo.ex
@@ -0,0 +1,18 @@
+defmodule MultiTenant.Todos.Todo do
+ use Ecto.Schema
+ import Ecto.Changeset
+
+ schema "todos" do
+ field :name, :string
+ field :done, :boolean
+
+ timestamps(type: :utc_datetime)
+ end
+
+ @doc false
+ def changeset(note, attrs) do
+ note
+ |> cast(attrs, [:name, :done])
+ |> validate_required([:name, :done])
+ end
+end
diff --git a/lib/multi_tenant_web.ex b/lib/multi_tenant_web.ex
new file mode 100644
index 0000000..56f33d9
--- /dev/null
+++ b/lib/multi_tenant_web.ex
@@ -0,0 +1,113 @@
+defmodule MultiTenantWeb do
+ @moduledoc """
+ The entrypoint for defining your web interface, such
+ as controllers, components, channels, and so on.
+
+ This can be used in your application as:
+
+ use MultiTenantWeb, :controller
+ use MultiTenantWeb, :html
+
+ The definitions below will be executed for every controller,
+ component, etc, so keep them short and clean, focused
+ on imports, uses and aliases.
+
+ Do NOT define functions inside the quoted expressions
+ below. Instead, define additional modules and import
+ those modules here.
+ """
+
+ def static_paths, do: ~w(assets fonts images favicon.ico robots.txt)
+
+ def router do
+ quote do
+ use Phoenix.Router, helpers: false
+
+ # Import common connection and controller functions to use in pipelines
+ import Plug.Conn
+ import Phoenix.Controller
+ import Phoenix.LiveView.Router
+ end
+ end
+
+ def channel do
+ quote do
+ use Phoenix.Channel
+ end
+ end
+
+ def controller do
+ quote do
+ use Phoenix.Controller,
+ formats: [:html, :json],
+ layouts: [html: MultiTenantWeb.Layouts]
+
+ import Plug.Conn
+ import MultiTenantWeb.Gettext
+
+ unquote(verified_routes())
+ end
+ end
+
+ def live_view do
+ quote do
+ use Phoenix.LiveView,
+ layout: {MultiTenantWeb.Layouts, :app}
+
+ unquote(html_helpers())
+ end
+ end
+
+ def live_component do
+ quote do
+ use Phoenix.LiveComponent
+
+ unquote(html_helpers())
+ end
+ end
+
+ def html do
+ quote do
+ use Phoenix.Component
+
+ # Import convenience functions from controllers
+ import Phoenix.Controller,
+ only: [get_csrf_token: 0, view_module: 1, view_template: 1]
+
+ # Include general helpers for rendering HTML
+ unquote(html_helpers())
+ end
+ end
+
+ defp html_helpers do
+ quote do
+ # HTML escaping functionality
+ import Phoenix.HTML
+ # Core UI components and translation
+ import MultiTenantWeb.CoreComponents
+ import MultiTenantWeb.Gettext
+
+ # Shortcut for generating JS commands
+ alias Phoenix.LiveView.JS
+
+ # Routes generation with the ~p sigil
+ unquote(verified_routes())
+ end
+ end
+
+ def verified_routes do
+ quote do
+ use Phoenix.VerifiedRoutes,
+ endpoint: MultiTenantWeb.Endpoint,
+ router: MultiTenantWeb.Router,
+ statics: MultiTenantWeb.static_paths()
+ end
+ end
+
+ @doc """
+ When used, dispatch to the appropriate controller/view/etc.
+ """
+ defmacro __using__(which) when is_atom(which) do
+ apply(__MODULE__, which, [])
+ end
+end
diff --git a/lib/multi_tenant_web/components/core_components.ex b/lib/multi_tenant_web/components/core_components.ex
new file mode 100644
index 0000000..12681e7
--- /dev/null
+++ b/lib/multi_tenant_web/components/core_components.ex
@@ -0,0 +1,674 @@
+defmodule MultiTenantWeb.CoreComponents do
+ @moduledoc """
+ Provides core UI components.
+
+ At first glance, this module may seem daunting, but its goal is to provide
+ core building blocks for your application, such as modals, tables, and
+ forms. The components consist mostly of markup and are well-documented
+ with doc strings and declarative assigns. You may customize and style
+ them in any way you want, based on your application growth and needs.
+
+ The default components use Tailwind CSS, a utility-first CSS framework.
+ See the [Tailwind CSS documentation](https://tailwindcss.com) to learn
+ how to customize them or feel free to swap in another framework altogether.
+
+ Icons are provided by [heroicons](https://heroicons.com). See `icon/1` for usage.
+ """
+ use Phoenix.Component
+
+ alias Phoenix.LiveView.JS
+ import MultiTenantWeb.Gettext
+
+ @doc """
+ Renders a modal.
+
+ ## Examples
+
+ <.modal id="confirm-modal">
+ This is a modal.
+
+
+ JS commands may be passed to the `:on_cancel` to configure
+ the closing/cancel event, for example:
+
+ <.modal id="confirm" on_cancel={JS.navigate(~p"/posts")}>
+ This is another modal.
+
+
+ """
+ attr :id, :string, required: true
+ attr :show, :boolean, default: false
+ attr :on_cancel, JS, default: %JS{}
+ slot :inner_block, required: true
+
+ def modal(assigns) do
+ ~H"""
+
+
+
+
+
+ <.focus_wrap
+ id={"#{@id}-container"}
+ phx-window-keydown={JS.exec("data-cancel", to: "##{@id}")}
+ phx-key="escape"
+ phx-click-away={JS.exec("data-cancel", to: "##{@id}")}
+ class="shadow-zinc-700/10 ring-zinc-700/10 relative hidden rounded-2xl bg-white p-14 shadow-lg ring-1 transition"
+ >
+
+
+ <.icon name="hero-x-mark-solid" class="h-5 w-5" />
+
+
+
+ <%= render_slot(@inner_block) %>
+
+
+
+
+
+
+ """
+ end
+
+ @doc """
+ Renders flash notices.
+
+ ## Examples
+
+ <.flash kind={:info} flash={@flash} />
+ <.flash kind={:info} phx-mounted={show("#flash")}>Welcome Back!
+ """
+ attr :id, :string, doc: "the optional id of flash container"
+ attr :flash, :map, default: %{}, doc: "the map of flash messages to display"
+ attr :title, :string, default: nil
+ attr :kind, :atom, values: [:info, :error], doc: "used for styling and flash lookup"
+ attr :rest, :global, doc: "the arbitrary HTML attributes to add to the flash container"
+
+ slot :inner_block, doc: "the optional inner block that renders the flash message"
+
+ def flash(assigns) do
+ assigns = assign_new(assigns, :id, fn -> "flash-#{assigns.kind}" end)
+
+ ~H"""
+
hide("##{@id}")}
+ role="alert"
+ class={[
+ "fixed top-2 right-2 mr-2 w-80 sm:w-96 z-50 rounded-lg p-3 ring-1",
+ @kind == :info && "bg-emerald-50 text-emerald-800 ring-emerald-500 fill-cyan-900",
+ @kind == :error && "bg-rose-50 text-rose-900 shadow-md ring-rose-500 fill-rose-900"
+ ]}
+ {@rest}
+ >
+
+ <.icon :if={@kind == :info} name="hero-information-circle-mini" class="h-4 w-4" />
+ <.icon :if={@kind == :error} name="hero-exclamation-circle-mini" class="h-4 w-4" />
+ <%= @title %>
+
+
<%= msg %>
+
+ <.icon name="hero-x-mark-solid" class="h-5 w-5 opacity-40 group-hover:opacity-70" />
+
+
+ """
+ end
+
+ @doc """
+ Shows the flash group with standard titles and content.
+
+ ## Examples
+
+ <.flash_group flash={@flash} />
+ """
+ attr :flash, :map, required: true, doc: "the map of flash messages"
+ attr :id, :string, default: "flash-group", doc: "the optional id of flash container"
+
+ def flash_group(assigns) do
+ ~H"""
+
+ <.flash kind={:info} title="Success!" flash={@flash} />
+ <.flash kind={:error} title="Error!" flash={@flash} />
+ <.flash
+ id="client-error"
+ kind={:error}
+ title="We can't find the internet"
+ phx-disconnected={show(".phx-client-error #client-error")}
+ phx-connected={hide("#client-error")}
+ hidden
+ >
+ Attempting to reconnect <.icon name="hero-arrow-path" class="ml-1 h-3 w-3 animate-spin" />
+
+
+ <.flash
+ id="server-error"
+ kind={:error}
+ title="Something went wrong!"
+ phx-disconnected={show(".phx-server-error #server-error")}
+ phx-connected={hide("#server-error")}
+ hidden
+ >
+ Hang in there while we get back on track
+ <.icon name="hero-arrow-path" class="ml-1 h-3 w-3 animate-spin" />
+
+
+ """
+ end
+
+ @doc """
+ Renders a simple form.
+
+ ## Examples
+
+ <.simple_form for={@form} phx-change="validate" phx-submit="save">
+ <.input field={@form[:email]} label="Email"/>
+ <.input field={@form[:username]} label="Username" />
+ <:actions>
+ <.button>Save
+
+
+ """
+ attr :for, :any, required: true, doc: "the datastructure for the form"
+ attr :as, :any, default: nil, doc: "the server side parameter to collect all input under"
+
+ attr :rest, :global,
+ include: ~w(autocomplete name rel action enctype method novalidate target multipart),
+ doc: "the arbitrary HTML attributes to apply to the form tag"
+
+ slot :inner_block, required: true
+ slot :actions, doc: "the slot for form actions, such as a submit button"
+
+ def simple_form(assigns) do
+ ~H"""
+ <.form :let={f} for={@for} as={@as} {@rest}>
+
+ <%= render_slot(@inner_block, f) %>
+
+ <%= render_slot(action, f) %>
+
+
+
+ """
+ end
+
+ @doc """
+ Renders a button.
+
+ ## Examples
+
+ <.button>Send!
+ <.button phx-click="go" class="ml-2">Send!
+ """
+ attr :type, :string, default: nil
+ attr :class, :string, default: nil
+ attr :rest, :global, include: ~w(disabled form name value)
+
+ slot :inner_block, required: true
+
+ def button(assigns) do
+ ~H"""
+
+ <%= render_slot(@inner_block) %>
+
+ """
+ end
+
+ @doc """
+ Renders an input with label and error messages.
+
+ A `Phoenix.HTML.FormField` may be passed as argument,
+ which is used to retrieve the input name, id, and values.
+ Otherwise all attributes may be passed explicitly.
+
+ ## Types
+
+ This function accepts all HTML input types, considering that:
+
+ * You may also set `type="select"` to render a `
` tag
+
+ * `type="checkbox"` is used exclusively to render boolean values
+
+ * For live file uploads, see `Phoenix.Component.live_file_input/1`
+
+ See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input
+ for more information.
+
+ ## Examples
+
+ <.input field={@form[:email]} type="email" />
+ <.input name="my-input" errors={["oh no!"]} />
+ """
+ attr :id, :any, default: nil
+ attr :name, :any
+ attr :label, :string, default: nil
+ attr :value, :any
+
+ attr :type, :string,
+ default: "text",
+ values: ~w(checkbox color date datetime-local email file hidden month number password
+ range radio search select tel text textarea time url week)
+
+ attr :field, Phoenix.HTML.FormField,
+ doc: "a form field struct retrieved from the form, for example: @form[:email]"
+
+ attr :errors, :list, default: []
+ attr :checked, :boolean, doc: "the checked flag for checkbox inputs"
+ attr :prompt, :string, default: nil, doc: "the prompt for select inputs"
+ attr :options, :list, doc: "the options to pass to Phoenix.HTML.Form.options_for_select/2"
+ attr :multiple, :boolean, default: false, doc: "the multiple flag for select inputs"
+
+ attr :rest, :global,
+ include: ~w(accept autocomplete capture cols disabled form list max maxlength min minlength
+ multiple pattern placeholder readonly required rows size step)
+
+ slot :inner_block
+
+ def input(%{field: %Phoenix.HTML.FormField{} = field} = assigns) do
+ assigns
+ |> assign(field: nil, id: assigns.id || field.id)
+ |> assign(:errors, Enum.map(field.errors, &translate_error(&1)))
+ |> assign_new(:name, fn -> if assigns.multiple, do: field.name <> "[]", else: field.name end)
+ |> assign_new(:value, fn -> field.value end)
+ |> input()
+ end
+
+ def input(%{type: "checkbox"} = assigns) do
+ assigns =
+ assign_new(assigns, :checked, fn ->
+ Phoenix.HTML.Form.normalize_value("checkbox", assigns[:value])
+ end)
+
+ ~H"""
+
+
+
+
+ <%= @label %>
+
+ <.error :for={msg <- @errors}><%= msg %>
+
+ """
+ end
+
+ def input(%{type: "select"} = assigns) do
+ ~H"""
+
+ <.label for={@id}><%= @label %>
+
+ <%= @prompt %>
+ <%= Phoenix.HTML.Form.options_for_select(@options, @value) %>
+
+ <.error :for={msg <- @errors}><%= msg %>
+
+ """
+ end
+
+ def input(%{type: "textarea"} = assigns) do
+ ~H"""
+
+ <.label for={@id}><%= @label %>
+
+ <.error :for={msg <- @errors}><%= msg %>
+
+ """
+ end
+
+ # All other inputs text, datetime-local, url, password, etc. are handled here...
+ def input(assigns) do
+ ~H"""
+
+ <.label for={@id}><%= @label %>
+
+ <.error :for={msg <- @errors}><%= msg %>
+
+ """
+ end
+
+ @doc """
+ Renders a label.
+ """
+ attr :for, :string, default: nil
+ slot :inner_block, required: true
+
+ def label(assigns) do
+ ~H"""
+
+ <%= render_slot(@inner_block) %>
+
+ """
+ end
+
+ @doc """
+ Generates a generic error message.
+ """
+ slot :inner_block, required: true
+
+ def error(assigns) do
+ ~H"""
+
+ <.icon name="hero-exclamation-circle-mini" class="mt-0.5 h-5 w-5 flex-none" />
+ <%= render_slot(@inner_block) %>
+
+ """
+ end
+
+ @doc """
+ Renders a header with title.
+ """
+ attr :class, :string, default: nil
+
+ slot :inner_block, required: true
+ slot :subtitle
+ slot :actions
+
+ def header(assigns) do
+ ~H"""
+
+ """
+ end
+
+ @doc ~S"""
+ Renders a table with generic styling.
+
+ ## Examples
+
+ <.table id="users" rows={@users}>
+ <:col :let={user} label="id"><%= user.id %>
+ <:col :let={user} label="username"><%= user.username %>
+
+ """
+ attr :id, :string, required: true
+ attr :rows, :list, required: true
+ attr :row_id, :any, default: nil, doc: "the function for generating the row id"
+ attr :row_click, :any, default: nil, doc: "the function for handling phx-click on each row"
+
+ attr :row_item, :any,
+ default: &Function.identity/1,
+ doc: "the function for mapping each row before calling the :col and :action slots"
+
+ slot :col, required: true do
+ attr :label, :string
+ end
+
+ slot :action, doc: "the slot for showing user actions in the last table column"
+
+ def table(assigns) do
+ assigns =
+ with %{rows: %Phoenix.LiveView.LiveStream{}} <- assigns do
+ assign(assigns, row_id: assigns.row_id || fn {id, _item} -> id end)
+ end
+
+ ~H"""
+
+
+
+
+ <%= col[:label] %>
+
+ <%= gettext("Actions") %>
+
+
+
+
+
+
+
+
+
+ <%= render_slot(col, @row_item.(row)) %>
+
+
+
+
+
+
+
+ <%= render_slot(action, @row_item.(row)) %>
+
+
+
+
+
+
+
+ """
+ end
+
+ @doc """
+ Renders a data list.
+
+ ## Examples
+
+ <.list>
+ <:item title="Title"><%= @post.title %>
+ <:item title="Views"><%= @post.views %>
+
+ """
+ slot :item, required: true do
+ attr :title, :string, required: true
+ end
+
+ def list(assigns) do
+ ~H"""
+
+
+
+
<%= item.title %>
+ <%= render_slot(item) %>
+
+
+
+ """
+ end
+
+ @doc """
+ Renders a back navigation link.
+
+ ## Examples
+
+ <.back navigate={~p"/posts"}>Back to posts
+ """
+ attr :navigate, :any, required: true
+ slot :inner_block, required: true
+
+ def back(assigns) do
+ ~H"""
+
+ <.link
+ navigate={@navigate}
+ class="text-sm font-semibold leading-6 text-zinc-900 hover:text-zinc-700"
+ >
+ <.icon name="hero-arrow-left-solid" class="h-3 w-3" />
+ <%= render_slot(@inner_block) %>
+
+
+ """
+ end
+
+ @doc """
+ Renders a [Heroicon](https://heroicons.com).
+
+ Heroicons come in three styles – outline, solid, and mini.
+ By default, the outline style is used, but solid and mini may
+ be applied by using the `-solid` and `-mini` suffix.
+
+ You can customize the size and colors of the icons by setting
+ width, height, and background color classes.
+
+ Icons are extracted from your `assets/vendor/heroicons` directory and bundled
+ within your compiled app.css by the plugin in your `assets/tailwind.config.js`.
+
+ ## Examples
+
+ <.icon name="hero-x-mark-solid" />
+ <.icon name="hero-arrow-path" class="ml-1 w-3 h-3 animate-spin" />
+ """
+ attr :name, :string, required: true
+ attr :class, :string, default: nil
+
+ def icon(%{name: "hero-" <> _} = assigns) do
+ ~H"""
+
+ """
+ end
+
+ ## JS Commands
+
+ def show(js \\ %JS{}, selector) do
+ JS.show(js,
+ to: selector,
+ transition:
+ {"transition-all transform ease-out duration-300",
+ "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95",
+ "opacity-100 translate-y-0 sm:scale-100"}
+ )
+ end
+
+ def hide(js \\ %JS{}, selector) do
+ JS.hide(js,
+ to: selector,
+ time: 200,
+ transition:
+ {"transition-all transform ease-in duration-200",
+ "opacity-100 translate-y-0 sm:scale-100",
+ "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"}
+ )
+ end
+
+ def show_modal(js \\ %JS{}, id) when is_binary(id) do
+ js
+ |> JS.show(to: "##{id}")
+ |> JS.show(
+ to: "##{id}-bg",
+ transition: {"transition-all transform ease-out duration-300", "opacity-0", "opacity-100"}
+ )
+ |> show("##{id}-container")
+ |> JS.add_class("overflow-hidden", to: "body")
+ |> JS.focus_first(to: "##{id}-content")
+ end
+
+ def hide_modal(js \\ %JS{}, id) do
+ js
+ |> JS.hide(
+ to: "##{id}-bg",
+ transition: {"transition-all transform ease-in duration-200", "opacity-100", "opacity-0"}
+ )
+ |> hide("##{id}-container")
+ |> JS.hide(to: "##{id}", transition: {"block", "block", "hidden"})
+ |> JS.remove_class("overflow-hidden", to: "body")
+ |> JS.pop_focus()
+ 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 the number of files with plural rules
+ # dngettext("errors", "1 file", "%{count} files", count)
+ #
+ # However the error messages in our forms and APIs are generated
+ # dynamically, so we need to translate them by calling Gettext
+ # with our gettext backend as first argument. Translations are
+ # available in the errors.po file (as we use the "errors" domain).
+ if count = opts[:count] do
+ Gettext.dngettext(MultiTenantWeb.Gettext, "errors", msg, msg, count, opts)
+ else
+ Gettext.dgettext(MultiTenantWeb.Gettext, "errors", msg, opts)
+ end
+ end
+
+ @doc """
+ Translates the errors for a field from a keyword list of errors.
+ """
+ def translate_errors(errors, field) when is_list(errors) do
+ for {^field, {msg, opts}} <- errors, do: translate_error({msg, opts})
+ end
+end
diff --git a/lib/multi_tenant_web/components/layouts.ex b/lib/multi_tenant_web/components/layouts.ex
new file mode 100644
index 0000000..ab73734
--- /dev/null
+++ b/lib/multi_tenant_web/components/layouts.ex
@@ -0,0 +1,5 @@
+defmodule MultiTenantWeb.Layouts do
+ use MultiTenantWeb, :html
+
+ embed_templates "layouts/*"
+end
diff --git a/lib/multi_tenant_web/components/layouts/app.html.heex b/lib/multi_tenant_web/components/layouts/app.html.heex
new file mode 100644
index 0000000..e1e65ba
--- /dev/null
+++ b/lib/multi_tenant_web/components/layouts/app.html.heex
@@ -0,0 +1,26 @@
+
+
+
+ <.flash_group flash={@flash} />
+ <%= @inner_content %>
+
+
diff --git a/lib/multi_tenant_web/components/layouts/root.html.heex b/lib/multi_tenant_web/components/layouts/root.html.heex
new file mode 100644
index 0000000..261941f
--- /dev/null
+++ b/lib/multi_tenant_web/components/layouts/root.html.heex
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+ <.live_title suffix=" · Phoenix Framework">
+ <%= assigns[:page_title] || "MultiTenant" %>
+
+
+
+
+
+ <%= @inner_content %>
+
+
diff --git a/lib/multi_tenant_web/controllers/error_html.ex b/lib/multi_tenant_web/controllers/error_html.ex
new file mode 100644
index 0000000..b8e1f72
--- /dev/null
+++ b/lib/multi_tenant_web/controllers/error_html.ex
@@ -0,0 +1,19 @@
+defmodule MultiTenantWeb.ErrorHTML do
+ use MultiTenantWeb, :html
+
+ # If you want to customize your error pages,
+ # uncomment the embed_templates/1 call below
+ # and add pages to the error directory:
+ #
+ # * lib/multi_tenant_web/controllers/error_html/404.html.heex
+ # * lib/multi_tenant_web/controllers/error_html/500.html.heex
+ #
+ # embed_templates "error_html/*"
+
+ # The default is to render a plain text page based on
+ # the template name. For example, "404.html" becomes
+ # "Not Found".
+ def render(template, _assigns) do
+ Phoenix.Controller.status_message_from_template(template)
+ end
+end
diff --git a/lib/multi_tenant_web/controllers/error_json.ex b/lib/multi_tenant_web/controllers/error_json.ex
new file mode 100644
index 0000000..5e071f9
--- /dev/null
+++ b/lib/multi_tenant_web/controllers/error_json.ex
@@ -0,0 +1,15 @@
+defmodule MultiTenantWeb.ErrorJSON do
+ # If you want to customize a particular status code,
+ # you may add your own clauses, such as:
+ #
+ # def render("500.json", _assigns) do
+ # %{errors: %{detail: "Internal Server Error"}}
+ # end
+
+ # By default, Phoenix returns the status message from
+ # the template name. For example, "404.json" becomes
+ # "Not Found".
+ def render(template, _assigns) do
+ %{errors: %{detail: Phoenix.Controller.status_message_from_template(template)}}
+ end
+end
diff --git a/lib/multi_tenant_web/controllers/page_controller.ex b/lib/multi_tenant_web/controllers/page_controller.ex
new file mode 100644
index 0000000..8f5aff9
--- /dev/null
+++ b/lib/multi_tenant_web/controllers/page_controller.ex
@@ -0,0 +1,7 @@
+defmodule MultiTenantWeb.PageController do
+ use MultiTenantWeb, :controller
+
+ def home(conn, _params) do
+ render(conn, :home)
+ end
+end
diff --git a/lib/multi_tenant_web/controllers/page_html.ex b/lib/multi_tenant_web/controllers/page_html.ex
new file mode 100644
index 0000000..e13df8d
--- /dev/null
+++ b/lib/multi_tenant_web/controllers/page_html.ex
@@ -0,0 +1,5 @@
+defmodule MultiTenantWeb.PageHTML do
+ use MultiTenantWeb, :html
+
+ embed_templates "page_html/*"
+end
diff --git a/lib/multi_tenant_web/controllers/page_html/home.html.heex b/lib/multi_tenant_web/controllers/page_html/home.html.heex
new file mode 100644
index 0000000..f3e333e
--- /dev/null
+++ b/lib/multi_tenant_web/controllers/page_html/home.html.heex
@@ -0,0 +1 @@
+Hello World
diff --git a/lib/multi_tenant_web/endpoint.ex b/lib/multi_tenant_web/endpoint.ex
new file mode 100644
index 0000000..e342919
--- /dev/null
+++ b/lib/multi_tenant_web/endpoint.ex
@@ -0,0 +1,51 @@
+defmodule MultiTenantWeb.Endpoint do
+ use Phoenix.Endpoint, otp_app: :multi_tenant
+
+ # 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: "_multi_tenant_key",
+ signing_salt: "3k+vOR3k",
+ same_site: "Lax"
+ ]
+
+ 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: :multi_tenant,
+ gzip: false,
+ only: MultiTenantWeb.static_paths()
+
+ # 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: :multi_tenant
+ 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 MultiTenantWeb.Router
+end
diff --git a/lib/multi_tenant_web/gettext.ex b/lib/multi_tenant_web/gettext.ex
new file mode 100644
index 0000000..ab12aa3
--- /dev/null
+++ b/lib/multi_tenant_web/gettext.ex
@@ -0,0 +1,24 @@
+defmodule MultiTenantWeb.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 MultiTenantWeb.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: :multi_tenant
+end
diff --git a/lib/multi_tenant_web/live/notes_edit_live.ex b/lib/multi_tenant_web/live/notes_edit_live.ex
new file mode 100644
index 0000000..e16c112
--- /dev/null
+++ b/lib/multi_tenant_web/live/notes_edit_live.ex
@@ -0,0 +1,101 @@
+defmodule MultiTenantWeb.NotesEditLive do
+ alias MultiTenant.Notes
+ alias MultiTenant.Notes.Note
+ use MultiTenantWeb, :live_view
+
+ @impl true
+ def mount(_params, _session, socket) do
+ {:ok, socket}
+ end
+
+ @impl true
+ def handle_params(params, _url, socket) do
+ # this view is invoked with live_action of either "new" or "edit"
+ # call apply_action to handle the live_action
+ {:noreply, apply_action(socket, socket.assigns.live_action, params)}
+ end
+
+ defp apply_action(socket, :edit, %{"id" => id}) do
+ socket
+ |> assign(:page_title, "Edit Note")
+ |> assign_note(Notes.get!(id))
+ end
+
+ defp apply_action(socket, :new, _params) do
+ socket
+ |> assign(:page_title, "New Note")
+ |> assign_note(%Note{})
+ end
+
+ defp assign_note(socket, note) do
+ # assign the note and its HTML representation to the socket
+ socket
+ |> assign(:note, note)
+ |> assign(:form, to_form(Notes.changeset(note)))
+ end
+
+ @impl true
+ def handle_event("validate", %{"note" => note_params}, socket) do
+ changeset =
+ socket.assigns.note
+ |> Notes.changeset(note_params)
+ |> Map.put(:action, :validate)
+
+ {:noreply, assign(socket, form: to_form(changeset))}
+ end
+
+ @impl true
+ def handle_event("save", %{"note" => note_params}, socket),
+ do: save(socket, note_params, socket.assigns.live_action)
+
+ defp save(socket, note_params, :new) do
+ case Notes.create(note_params) do
+ {:ok, note} ->
+ {:noreply,
+ socket
+ |> assign_note(note)
+ |> put_flash(:info, "Note created successfully")
+ |> push_navigate(to: ~p"/notes/#{note.id}/edit")}
+
+ {:error, %Ecto.Changeset{} = changeset} ->
+ {:noreply, assign(socket, form: to_form(changeset))}
+ end
+ end
+
+ defp save(socket, note_params, :edit) do
+ case Notes.update(socket.assigns.note, note_params) do
+ {:ok, note} ->
+ {:noreply,
+ socket
+ |> assign_note(note)
+ |> put_flash(:info, "Note updated successfully")}
+
+ {:error, %Ecto.Changeset{} = changeset} ->
+ {:noreply, assign(socket, form: to_form(changeset))}
+ end
+ end
+
+ @impl true
+ def render(assigns) do
+ ~H"""
+
+ <.header>
+ <%= @page_title %>
+
+
+
+ <.simple_form for={@form} id="note-form" phx-change="validate" phx-submit="save">
+ <.input field={@form[:title]} type="text" label="Title" />
+ <.input field={@form[:body]} type="text" label="Body" />
+
+ <:actions>
+ <.button phx-disable-with="Saving...">
+ Save Note
+
+
+
+
+
+ """
+ end
+end
diff --git a/lib/multi_tenant_web/live/notes_live.ex b/lib/multi_tenant_web/live/notes_live.ex
new file mode 100644
index 0000000..eb4ce1c
--- /dev/null
+++ b/lib/multi_tenant_web/live/notes_live.ex
@@ -0,0 +1,56 @@
+defmodule MultiTenantWeb.NotesLive do
+ use MultiTenantWeb, :live_view
+ alias MultiTenant.Notes
+
+ @impl true
+ def mount(_params, _session, socket) do
+ {:ok,
+ socket
+ |> assign(:page_title, "Notes")
+ |> assign(:notes, Notes.list())}
+ end
+
+ @impl true
+ def handle_event("delete", %{"id" => id}, socket) do
+ note = Notes.get!(id)
+ {:ok, _} = Notes.delete(note)
+
+ {:noreply, socket |> assign(notes: Enum.filter(socket.assigns.notes, &(&1.id != note.id)))}
+ end
+
+ @impl true
+ def render(assigns) do
+ ~H"""
+ <.header>
+ Listing Notes
+ <:actions>
+ <.link patch={~p"/notes/new"}>
+ <.button>New note
+
+
+
+
+ <.table id="notes" rows={@notes}>
+ <:col :let={note} label="Title">
+ <%= note.title %>
+
+ <:col :let={note} label="Body">
+ <%= note.body %>
+
+ <:action :let={note}>
+ <.link patch={~p"/notes/#{note}/edit"}>
+ <.icon name="hero-pencil" />
+
+
+ <:action :let={note}>
+ <.link
+ phx-click={JS.push("delete", value: %{id: note.id}) |> hide("##{note.id}")}
+ data-confirm="Are you sure?"
+ >
+ <.icon name="hero-trash" />
+
+
+
+ """
+ end
+end
diff --git a/lib/multi_tenant_web/live/todos_edit_live.ex b/lib/multi_tenant_web/live/todos_edit_live.ex
new file mode 100644
index 0000000..e8e7256
--- /dev/null
+++ b/lib/multi_tenant_web/live/todos_edit_live.ex
@@ -0,0 +1,101 @@
+defmodule MultiTenantWeb.TodosEditLive do
+ alias MultiTenant.Todos
+ alias MultiTenant.Todos.Todo
+ use MultiTenantWeb, :live_view
+
+ @impl true
+ def mount(_params, _session, socket) do
+ {:ok, socket}
+ end
+
+ @impl true
+ def handle_params(params, _url, socket) do
+ # this view is invoked with live_action of either "new" or "edit"
+ # call apply_action to handle the live_action
+ {:noreply, apply_action(socket, socket.assigns.live_action, params)}
+ end
+
+ defp apply_action(socket, :edit, %{"id" => id}) do
+ socket
+ |> assign(:page_title, "Edit Todo")
+ |> assign_todo(Todos.get!(id))
+ end
+
+ defp apply_action(socket, :new, _params) do
+ socket
+ |> assign(:page_title, "New Todo")
+ |> assign_todo(%Todo{})
+ end
+
+ defp assign_todo(socket, todo) do
+ # assign the todo and its HTML representation to the socket
+ socket
+ |> assign(:todo, todo)
+ |> assign(:form, to_form(Todos.changeset(todo)))
+ end
+
+ @impl true
+ def handle_event("validate", %{"todo" => todo_params}, socket) do
+ changeset =
+ socket.assigns.todo
+ |> Todos.changeset(todo_params)
+ |> Map.put(:action, :validate)
+
+ {:noreply, assign(socket, form: to_form(changeset))}
+ end
+
+ @impl true
+ def handle_event("save", %{"todo" => todo_params}, socket),
+ do: save(socket, todo_params, socket.assigns.live_action)
+
+ defp save(socket, todo_params, :new) do
+ case Todos.create(todo_params) do
+ {:ok, todo} ->
+ {:noreply,
+ socket
+ |> assign_todo(todo)
+ |> put_flash(:info, "Todo created successfully")
+ |> push_navigate(to: ~p"/todos/#{todo.id}/edit")}
+
+ {:error, %Ecto.Changeset{} = changeset} ->
+ {:noreply, assign(socket, form: to_form(changeset))}
+ end
+ end
+
+ defp save(socket, todo_params, :edit) do
+ case Todos.update(socket.assigns.todo, todo_params) do
+ {:ok, todo} ->
+ {:noreply,
+ socket
+ |> assign_todo(todo)
+ |> put_flash(:info, "Todo updated successfully")}
+
+ {:error, %Ecto.Changeset{} = changeset} ->
+ {:noreply, assign(socket, form: to_form(changeset))}
+ end
+ end
+
+ @impl true
+ def render(assigns) do
+ ~H"""
+
+ <.header>
+ <%= @page_title %>
+
+
+
+ <.simple_form for={@form} id="todo-form" phx-change="validate" phx-submit="save">
+ <.input field={@form[:name]} type="text" label="Name" />
+ <.input field={@form[:done]} type="checkbox" label="Done?" />
+
+ <:actions>
+ <.button phx-disable-with="Saving...">
+ Save Todo
+
+
+
+
+
+ """
+ end
+end
diff --git a/lib/multi_tenant_web/live/todos_live.ex b/lib/multi_tenant_web/live/todos_live.ex
new file mode 100644
index 0000000..6d70ce8
--- /dev/null
+++ b/lib/multi_tenant_web/live/todos_live.ex
@@ -0,0 +1,56 @@
+defmodule MultiTenantWeb.TodosLive do
+ use MultiTenantWeb, :live_view
+ alias MultiTenant.Todos
+
+ @impl true
+ def mount(_params, _session, socket) do
+ {:ok,
+ socket
+ |> assign(:page_title, "Todos")
+ |> assign(:todos, Todos.list())}
+ end
+
+ @impl true
+ def handle_event("delete", %{"id" => id}, socket) do
+ todo = Todos.get!(id)
+ {:ok, _} = Todos.delete(todo)
+
+ {:noreply, socket |> assign(todos: Enum.filter(socket.assigns.todos, &(&1.id != todo.id)))}
+ end
+
+ @impl true
+ def render(assigns) do
+ ~H"""
+ <.header>
+ Listing Todos
+ <:actions>
+ <.link patch={~p"/todos/new"}>
+ <.button>New todo
+
+
+
+
+ <.table id="todos" rows={@todos}>
+ <:col :let={todo} label="Name">
+ <%= todo.name %>
+
+ <:col :let={todo} label="Done">
+ <%= todo.done %>
+
+ <:action :let={todo}>
+ <.link patch={~p"/todos/#{todo}/edit"}>
+ <.icon name="hero-pencil" />
+
+
+ <:action :let={todo}>
+ <.link
+ phx-click={JS.push("delete", value: %{id: todo.id}) |> hide("##{todo.id}")}
+ data-confirm="Are you sure?"
+ >
+ <.icon name="hero-trash" />
+
+
+
+ """
+ end
+end
diff --git a/lib/multi_tenant_web/router.ex b/lib/multi_tenant_web/router.ex
new file mode 100644
index 0000000..f072e0f
--- /dev/null
+++ b/lib/multi_tenant_web/router.ex
@@ -0,0 +1,52 @@
+defmodule MultiTenantWeb.Router do
+ use MultiTenantWeb, :router
+
+ pipeline :browser do
+ plug :accepts, ["html"]
+ plug :fetch_session
+ plug :fetch_live_flash
+ plug :put_root_layout, html: {MultiTenantWeb.Layouts, :root}
+ plug :protect_from_forgery
+ plug :put_secure_browser_headers
+ end
+
+ pipeline :api do
+ plug :accepts, ["json"]
+ end
+
+ scope "/", MultiTenantWeb do
+ pipe_through :browser
+
+ get "/", PageController, :home
+
+ live "/notes/new", NotesEditLive, :new
+ live "/notes/:id/edit", NotesEditLive, :edit
+ live "/notes", NotesLive, :index
+
+ live "/todos/new", TodosEditLive, :new
+ live "/todos/:id/edit", TodosEditLive, :edit
+ live "/todos", TodosLive, :index
+ end
+
+ # Other scopes may use custom stacks.
+ # scope "/api", MultiTenantWeb do
+ # pipe_through :api
+ # end
+
+ # Enable LiveDashboard and Swoosh mailbox preview in development
+ if Application.compile_env(:multi_tenant, :dev_routes) do
+ # 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).
+ import Phoenix.LiveDashboard.Router
+
+ scope "/dev" do
+ pipe_through :browser
+
+ live_dashboard "/dashboard", metrics: MultiTenantWeb.Telemetry
+ forward "/mailbox", Plug.Swoosh.MailboxPreview
+ end
+ end
+end
diff --git a/lib/multi_tenant_web/telemetry.ex b/lib/multi_tenant_web/telemetry.ex
new file mode 100644
index 0000000..adf4422
--- /dev/null
+++ b/lib/multi_tenant_web/telemetry.ex
@@ -0,0 +1,92 @@
+defmodule MultiTenantWeb.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.start.system_time",
+ unit: {:native, :millisecond}
+ ),
+ summary("phoenix.endpoint.stop.duration",
+ unit: {:native, :millisecond}
+ ),
+ summary("phoenix.router_dispatch.start.system_time",
+ tags: [:route],
+ unit: {:native, :millisecond}
+ ),
+ summary("phoenix.router_dispatch.exception.duration",
+ tags: [:route],
+ unit: {:native, :millisecond}
+ ),
+ summary("phoenix.router_dispatch.stop.duration",
+ tags: [:route],
+ unit: {:native, :millisecond}
+ ),
+ summary("phoenix.socket_connected.duration",
+ unit: {:native, :millisecond}
+ ),
+ summary("phoenix.channel_joined.duration",
+ unit: {:native, :millisecond}
+ ),
+ summary("phoenix.channel_handled_in.duration",
+ tags: [:event],
+ unit: {:native, :millisecond}
+ ),
+
+ # Database Metrics
+ summary("multi_tenant.repo.query.total_time",
+ unit: {:native, :millisecond},
+ description: "The sum of the other measurements"
+ ),
+ summary("multi_tenant.repo.query.decode_time",
+ unit: {:native, :millisecond},
+ description: "The time spent decoding the data received from the database"
+ ),
+ summary("multi_tenant.repo.query.query_time",
+ unit: {:native, :millisecond},
+ description: "The time spent executing the query"
+ ),
+ summary("multi_tenant.repo.query.queue_time",
+ unit: {:native, :millisecond},
+ description: "The time spent waiting for a database connection"
+ ),
+ summary("multi_tenant.repo.query.idle_time",
+ unit: {:native, :millisecond},
+ description:
+ "The time the connection spent waiting before being checked out for the query"
+ ),
+
+ # 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.
+ # {MultiTenantWeb, :count_users, []}
+ ]
+ end
+end
diff --git a/mix.exs b/mix.exs
new file mode 100644
index 0000000..bed1328
--- /dev/null
+++ b/mix.exs
@@ -0,0 +1,74 @@
+defmodule MultiTenant.MixProject do
+ use Mix.Project
+
+ def project do
+ [
+ app: :multi_tenant,
+ version: "0.1.0",
+ elixir: "~> 1.14",
+ elixirc_paths: elixirc_paths(Mix.env()),
+ 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: {MultiTenant.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.7.10"},
+ {:phoenix_ecto, "~> 4.4"},
+ {:ecto_sql, "~> 3.10"},
+ {:postgrex, ">= 0.0.0"},
+ {:phoenix_html, "~> 3.3"},
+ {:phoenix_live_reload, "~> 1.2", only: :dev},
+ {:phoenix_live_view, "~> 0.20.1"},
+ {:floki, ">= 0.30.0", only: :test},
+ {:phoenix_live_dashboard, "~> 0.8.2"},
+ {:esbuild, "~> 0.8", runtime: Mix.env() == :dev},
+ {:tailwind, "~> 0.2.0", runtime: Mix.env() == :dev},
+ {:swoosh, "~> 1.3"},
+ {:finch, "~> 0.13"},
+ {:telemetry_metrics, "~> 0.6"},
+ {:telemetry_poller, "~> 1.0"},
+ {:gettext, "~> 0.20"},
+ {:jason, "~> 1.2"},
+ {:dns_cluster, "~> 0.1.1"},
+ {:plug_cowboy, "~> 2.5"}
+ ]
+ 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", "assets.setup", "assets.build"],
+ "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"],
+ "assets.setup": ["tailwind.install --if-missing", "esbuild.install --if-missing"],
+ "assets.build": ["tailwind default", "esbuild default"],
+ "assets.deploy": ["tailwind default --minify", "esbuild default --minify", "phx.digest"]
+ ]
+ end
+end
diff --git a/mix.lock b/mix.lock
new file mode 100644
index 0000000..48eaa57
--- /dev/null
+++ b/mix.lock
@@ -0,0 +1,43 @@
+%{
+ "castore": {:hex, :castore, "1.0.5", "9eeebb394cc9a0f3ae56b813459f990abb0a3dedee1be6b27fdb50301930502f", [:mix], [], "hexpm", "8d7c597c3e4a64c395980882d4bca3cebb8d74197c590dc272cfd3b6a6310578"},
+ "cowboy": {:hex, :cowboy, "2.10.0", "ff9ffeff91dae4ae270dd975642997afe2a1179d94b1887863e43f681a203e26", [:make, :rebar3], [{:cowlib, "2.12.1", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "3afdccb7183cc6f143cb14d3cf51fa00e53db9ec80cdcd525482f5e99bc41d6b"},
+ "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"},
+ "cowlib": {:hex, :cowlib, "2.12.1", "a9fa9a625f1d2025fe6b462cb865881329b5caff8f1854d1cbc9f9533f00e1e1", [:make, :rebar3], [], "hexpm", "163b73f6367a7341b33c794c4e88e7dbfe6498ac42dcd69ef44c5bc5507c8db0"},
+ "db_connection": {:hex, :db_connection, "2.6.0", "77d835c472b5b67fc4f29556dee74bf511bbafecdcaf98c27d27fa5918152086", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c2f992d15725e721ec7fbc1189d4ecdb8afef76648c746a8e1cad35e3b8a35f3"},
+ "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"},
+ "dns_cluster": {:hex, :dns_cluster, "0.1.3", "0bc20a2c88ed6cc494f2964075c359f8c2d00e1bf25518a6a6c7fd277c9b0c66", [:mix], [], "hexpm", "46cb7c4a1b3e52c7ad4cbe33ca5079fbde4840dedeafca2baf77996c2da1bc33"},
+ "ecto": {:hex, :ecto, "3.11.1", "4b4972b717e7ca83d30121b12998f5fcdc62ba0ed4f20fd390f16f3270d85c3e", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ebd3d3772cd0dfcd8d772659e41ed527c28b2a8bde4b00fe03e0463da0f1983b"},
+ "ecto_sql": {:hex, :ecto_sql, "3.11.1", "e9abf28ae27ef3916b43545f9578b4750956ccea444853606472089e7d169470", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.11.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 0.17.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ce14063ab3514424276e7e360108ad6c2308f6d88164a076aac8a387e1fea634"},
+ "esbuild": {:hex, :esbuild, "0.8.1", "0cbf919f0eccb136d2eeef0df49c4acf55336de864e63594adcea3814f3edf41", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "25fc876a67c13cb0a776e7b5d7974851556baeda2085296c14ab48555ea7560f"},
+ "expo": {:hex, :expo, "0.5.1", "249e826a897cac48f591deba863b26c16682b43711dd15ee86b92f25eafd96d9", [:mix], [], "hexpm", "68a4233b0658a3d12ee00d27d37d856b1ba48607e7ce20fd376958d0ba6ce92b"},
+ "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"},
+ "finch": {:hex, :finch, "0.18.0", "944ac7d34d0bd2ac8998f79f7a811b21d87d911e77a786bc5810adb75632ada4", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.3", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2.6 or ~> 1.0", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "69f5045b042e531e53edc2574f15e25e735b522c37e2ddb766e15b979e03aa65"},
+ "floki": {:hex, :floki, "0.35.3", "0c8c6234aa71cb2b069cf801e8f8f30f8d096eb452c3dae2ccc409510ec32720", [:mix], [], "hexpm", "6d9f07f3fc76599f3b66c39f4a81ac62c8f4d9631140268db92aacad5d0e56d4"},
+ "gettext": {:hex, :gettext, "0.24.0", "6f4d90ac5f3111673cbefc4ebee96fe5f37a114861ab8c7b7d5b30a1108ce6d8", [:mix], [{:expo, "~> 0.5.1", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "bdf75cdfcbe9e4622dd18e034b227d77dd17f0f133853a1c73b97b3d6c770e8b"},
+ "hpax": {:hex, :hpax, "0.1.2", "09a75600d9d8bbd064cdd741f21fc06fc1f4cf3d0fcc335e5aa19be1a7235c84", [:mix], [], "hexpm", "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"},
+ "jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"},
+ "mime": {:hex, :mime, "2.0.5", "dc34c8efd439abe6ae0343edbb8556f4d63f178594894720607772a041b04b02", [:mix], [], "hexpm", "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c"},
+ "mint": {:hex, :mint, "1.5.2", "4805e059f96028948870d23d7783613b7e6b0e2fb4e98d720383852a760067fd", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "d77d9e9ce4eb35941907f1d3df38d8f750c357865353e21d335bdcdf6d892a02"},
+ "nimble_options": {:hex, :nimble_options, "1.1.0", "3b31a57ede9cb1502071fade751ab0c7b8dbe75a9a4c2b5bbb0943a690b63172", [:mix], [], "hexpm", "8bbbb3941af3ca9acc7835f5655ea062111c9c27bcac53e004460dfd19008a99"},
+ "nimble_pool": {:hex, :nimble_pool, "1.0.0", "5eb82705d138f4dd4423f69ceb19ac667b3b492ae570c9f5c900bb3d2f50a847", [:mix], [], "hexpm", "80be3b882d2d351882256087078e1b1952a28bf98d0a287be87e4a24a710b67a"},
+ "phoenix": {:hex, :phoenix, "1.7.11", "1d88fc6b05ab0c735b250932c4e6e33bfa1c186f76dcf623d8dd52f07d6379c7", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "b1ec57f2e40316b306708fe59b92a16b9f6f4bf50ccfa41aa8c7feb79e0ec02a"},
+ "phoenix_ecto": {:hex, :phoenix_ecto, "4.4.3", "86e9878f833829c3f66da03d75254c155d91d72a201eb56ae83482328dc7ca93", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "d36c401206f3011fefd63d04e8ef626ec8791975d9d107f9a0817d426f61ac07"},
+ "phoenix_html": {:hex, :phoenix_html, "3.3.3", "380b8fb45912b5638d2f1d925a3771b4516b9a78587249cabe394e0a5d579dc9", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "923ebe6fec6e2e3b3e569dfbdc6560de932cd54b000ada0208b5f45024bdd76c"},
+ "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.3", "7ff51c9b6609470f681fbea20578dede0e548302b0c8bdf338b5a753a4f045bf", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "f9470a0a8bae4f56430a23d42f977b5a6205fdba6559d76f932b876bfaec652d"},
+ "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.4.1", "2aff698f5e47369decde4357ba91fc9c37c6487a512b41732818f2204a8ef1d3", [: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", "9bffb834e7ddf08467fe54ae58b5785507aaba6255568ae22b4d46e2bb3615ab"},
+ "phoenix_live_view": {:hex, :phoenix_live_view, "0.20.7", "278804219cc85e00f59a02a07b8ea591d99b219877a3b984fb77ac3fdebfb696", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "4d533f5d6b09c6ff4fb1f41d61dcd90c7f076f25909d4a5481d71bd442b83dc9"},
+ "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"},
+ "phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"},
+ "plug": {:hex, :plug, "1.15.3", "712976f504418f6dff0a3e554c40d705a9bcf89a7ccef92fc6a5ef8f16a30a97", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "cc4365a3c010a56af402e0809208873d113e9c38c401cabd88027ef4f5c01fd2"},
+ "plug_cowboy": {:hex, :plug_cowboy, "2.7.0", "3ae9369c60641084363b08fe90267cbdd316df57e3557ea522114b30b63256ea", [:mix], [{:cowboy, "~> 2.7.0 or ~> 2.8.0 or ~> 2.9.0 or ~> 2.10.0", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "d85444fb8aa1f2fc62eabe83bbe387d81510d773886774ebdcb429b3da3c1a4a"},
+ "plug_crypto": {:hex, :plug_crypto, "2.0.0", "77515cc10af06645abbfb5e6ad7a3e9714f805ae118fa1a70205f80d2d70fe73", [:mix], [], "hexpm", "53695bae57cc4e54566d993eb01074e4d894b65a3766f1c43e2c61a1b0f45ea9"},
+ "postgrex": {:hex, :postgrex, "0.17.4", "5777781f80f53b7c431a001c8dad83ee167bcebcf3a793e3906efff680ab62b3", [:mix], [{: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]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "6458f7d5b70652bc81c3ea759f91736c16a31be000f306d3c64bcdfe9a18b3cc"},
+ "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"},
+ "swoosh": {:hex, :swoosh, "1.15.2", "490ea85a98e8fb5178c07039e0d8519839e38127724a58947a668c00db7574ee", [:mix], [{:bandit, ">= 1.0.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:req, "~> 0.4 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9f7739c02f6c7c0ca82ee397f3bfe0465dbe4c8a65372ac2a5584bf147dd5831"},
+ "tailwind": {:hex, :tailwind, "0.2.2", "9e27288b568ede1d88517e8c61259bc214a12d7eed271e102db4c93fcca9b2cd", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "ccfb5025179ea307f7f899d1bb3905cd0ac9f687ed77feebc8f67bdca78565c4"},
+ "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"},
+ "telemetry_metrics": {:hex, :telemetry_metrics, "0.6.2", "2caabe9344ec17eafe5403304771c3539f3b6e2f7fb6a6f602558c825d0d0bfb", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9b43db0dc33863930b9ef9d27137e78974756f5f198cae18409970ed6fa5b561"},
+ "telemetry_poller": {:hex, :telemetry_poller, "1.0.0", "db91bb424e07f2bb6e73926fcafbfcbcb295f0193e0a00e825e589a0a47e8453", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b3a24eafd66c3f42da30fc3ca7dda1e9d546c12250a2d60d7b81d264fbec4f6e"},
+ "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"},
+ "websock_adapter": {:hex, :websock_adapter, "0.5.5", "9dfeee8269b27e958a65b3e235b7e447769f66b5b5925385f5a569269164a210", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "4b977ba4a01918acbf77045ff88de7f6972c2a009213c515a445c48f224ffce9"},
+}
diff --git a/priv/gettext/en/LC_MESSAGES/errors.po b/priv/gettext/en/LC_MESSAGES/errors.po
new file mode 100644
index 0000000..844c4f5
--- /dev/null
+++ b/priv/gettext/en/LC_MESSAGES/errors.po
@@ -0,0 +1,112 @@
+## `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 have %{count} item(s)"
+msgid_plural "should have %{count} item(s)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "should be %{count} character(s)"
+msgid_plural "should be %{count} character(s)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "should be %{count} byte(s)"
+msgid_plural "should be %{count} byte(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 least %{count} character(s)"
+msgid_plural "should be at least %{count} character(s)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "should be at least %{count} byte(s)"
+msgid_plural "should be at least %{count} byte(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] ""
+
+msgid "should be at most %{count} character(s)"
+msgid_plural "should be at most %{count} character(s)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "should be at most %{count} byte(s)"
+msgid_plural "should be at most %{count} byte(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/priv/gettext/errors.pot b/priv/gettext/errors.pot
new file mode 100644
index 0000000..ccf5c68
--- /dev/null
+++ b/priv/gettext/errors.pot
@@ -0,0 +1,110 @@
+## 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 have %{count} item(s)"
+msgid_plural "should have %{count} item(s)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "should be %{count} character(s)"
+msgid_plural "should be %{count} character(s)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "should be %{count} byte(s)"
+msgid_plural "should be %{count} byte(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 least %{count} character(s)"
+msgid_plural "should be at least %{count} character(s)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "should be at least %{count} byte(s)"
+msgid_plural "should be at least %{count} byte(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] ""
+
+msgid "should be at most %{count} character(s)"
+msgid_plural "should be at most %{count} character(s)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "should be at most %{count} byte(s)"
+msgid_plural "should be at most %{count} byte(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/priv/repo/migrations/.formatter.exs b/priv/repo/migrations/.formatter.exs
new file mode 100644
index 0000000..49f9151
--- /dev/null
+++ b/priv/repo/migrations/.formatter.exs
@@ -0,0 +1,4 @@
+[
+ import_deps: [:ecto_sql],
+ inputs: ["*.exs"]
+]
diff --git a/priv/repo/migrations/20240218145725_init.exs b/priv/repo/migrations/20240218145725_init.exs
new file mode 100644
index 0000000..14e56b5
--- /dev/null
+++ b/priv/repo/migrations/20240218145725_init.exs
@@ -0,0 +1,17 @@
+defmodule MultiTenant.Repo.Migrations.Init do
+ use Ecto.Migration
+
+ def change do
+ create table(:todos) do
+ add :name, :string, null: false
+ add :done, :boolean, null: false, default: false
+ timestamps(type: :utc_datetime)
+ end
+
+ create table(:notes) do
+ add :title, :string, null: false
+ add :body, :string
+ timestamps(type: :utc_datetime)
+ end
+ end
+end
diff --git a/priv/repo/seeds.exs b/priv/repo/seeds.exs
new file mode 100644
index 0000000..6790414
--- /dev/null
+++ b/priv/repo/seeds.exs
@@ -0,0 +1,40 @@
+# 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:
+#
+# MultiTenant.Repo.insert!(%MultiTenant.SomeSchema{})
+#
+# We recommend using the bang functions (`insert!`, `update!`
+# and so on) as they will fail if something goes wrong.
+
+alias MultiTenant.Repo
+alias MultiTenant.Todos.Todo
+alias MultiTenant.Notes.Note
+
+Repo.insert!(%Note{
+ title: "First Note",
+ body: "This is the first note"
+})
+
+Repo.insert!(%Note{
+ title: "Second Note",
+ body: "This is the second note"
+})
+
+Repo.insert!(%Todo{
+ name: "First Todo",
+ done: false
+})
+
+Repo.insert!(%Todo{
+ name: "Second Todo",
+ done: false
+})
+
+Repo.insert!(%Todo{
+ name: "Third Todo",
+ done: true
+})
diff --git a/priv/static/favicon.ico b/priv/static/favicon.ico
new file mode 100644
index 0000000..7f372bf
Binary files /dev/null and b/priv/static/favicon.ico differ
diff --git a/priv/static/images/logo.svg b/priv/static/images/logo.svg
new file mode 100644
index 0000000..9f26bab
--- /dev/null
+++ b/priv/static/images/logo.svg
@@ -0,0 +1,6 @@
+
+
+
diff --git a/priv/static/robots.txt b/priv/static/robots.txt
new file mode 100644
index 0000000..26e06b5
--- /dev/null
+++ b/priv/static/robots.txt
@@ -0,0 +1,5 @@
+# See https://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/test/multi_tenant_web/controllers/error_html_test.exs b/test/multi_tenant_web/controllers/error_html_test.exs
new file mode 100644
index 0000000..1f37e4d
--- /dev/null
+++ b/test/multi_tenant_web/controllers/error_html_test.exs
@@ -0,0 +1,14 @@
+defmodule MultiTenantWeb.ErrorHTMLTest do
+ use MultiTenantWeb.ConnCase, async: true
+
+ # Bring render_to_string/4 for testing custom views
+ import Phoenix.Template
+
+ test "renders 404.html" do
+ assert render_to_string(MultiTenantWeb.ErrorHTML, "404", "html", []) == "Not Found"
+ end
+
+ test "renders 500.html" do
+ assert render_to_string(MultiTenantWeb.ErrorHTML, "500", "html", []) == "Internal Server Error"
+ end
+end
diff --git a/test/multi_tenant_web/controllers/error_json_test.exs b/test/multi_tenant_web/controllers/error_json_test.exs
new file mode 100644
index 0000000..ad12ced
--- /dev/null
+++ b/test/multi_tenant_web/controllers/error_json_test.exs
@@ -0,0 +1,12 @@
+defmodule MultiTenantWeb.ErrorJSONTest do
+ use MultiTenantWeb.ConnCase, async: true
+
+ test "renders 404" do
+ assert MultiTenantWeb.ErrorJSON.render("404.json", %{}) == %{errors: %{detail: "Not Found"}}
+ end
+
+ test "renders 500" do
+ assert MultiTenantWeb.ErrorJSON.render("500.json", %{}) ==
+ %{errors: %{detail: "Internal Server Error"}}
+ end
+end
diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex
new file mode 100644
index 0000000..c44f380
--- /dev/null
+++ b/test/support/conn_case.ex
@@ -0,0 +1,38 @@
+defmodule MultiTenantWeb.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 MultiTenantWeb.ConnCase, async: true`, although
+ this option is not recommended for other databases.
+ """
+
+ use ExUnit.CaseTemplate
+
+ using do
+ quote do
+ # The default endpoint for testing
+ @endpoint MultiTenantWeb.Endpoint
+
+ use MultiTenantWeb, :verified_routes
+
+ # Import conveniences for testing with connections
+ import Plug.Conn
+ import Phoenix.ConnTest
+ import MultiTenantWeb.ConnCase
+ end
+ end
+
+ setup tags do
+ MultiTenant.DataCase.setup_sandbox(tags)
+ {:ok, conn: Phoenix.ConnTest.build_conn()}
+ end
+end
diff --git a/test/support/data_case.ex b/test/support/data_case.ex
new file mode 100644
index 0000000..051f013
--- /dev/null
+++ b/test/support/data_case.ex
@@ -0,0 +1,58 @@
+defmodule MultiTenant.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 MultiTenant.DataCase, async: true`, although
+ this option is not recommended for other databases.
+ """
+
+ use ExUnit.CaseTemplate
+
+ using do
+ quote do
+ alias MultiTenant.Repo
+
+ import Ecto
+ import Ecto.Changeset
+ import Ecto.Query
+ import MultiTenant.DataCase
+ end
+ end
+
+ setup tags do
+ MultiTenant.DataCase.setup_sandbox(tags)
+ :ok
+ end
+
+ @doc """
+ Sets up the sandbox based on the test tags.
+ """
+ def setup_sandbox(tags) do
+ pid = Ecto.Adapters.SQL.Sandbox.start_owner!(MultiTenant.Repo, shared: not tags[:async])
+ on_exit(fn -> Ecto.Adapters.SQL.Sandbox.stop_owner(pid) end)
+ 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/test/test_helper.exs b/test/test_helper.exs
new file mode 100644
index 0000000..538a3bf
--- /dev/null
+++ b/test/test_helper.exs
@@ -0,0 +1,2 @@
+ExUnit.start()
+Ecto.Adapters.SQL.Sandbox.mode(MultiTenant.Repo, :manual)