diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7e35c18 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +deploy.sh +Makefile +README-AUTOSTRADA.html +README-AUTOSTRADA.MD +.vscode/launch.json diff --git a/assets/efs.go b/assets/efs.go new file mode 100644 index 0000000..4fe04bb --- /dev/null +++ b/assets/efs.go @@ -0,0 +1,8 @@ +package assets + +import ( + "embed" +) + +//go:embed "emails" "migrations" "templates" "static" +var EmbeddedFiles embed.FS diff --git a/assets/emails/example.tmpl b/assets/emails/example.tmpl new file mode 100644 index 0000000..f381541 --- /dev/null +++ b/assets/emails/example.tmpl @@ -0,0 +1,24 @@ +{{define "subject"}}Example subject{{end}} + +{{define "plainBody"}} +Hi {{.Name}}, + +This is an example body + +Sent at: {{now}} +{{end}} + +{{define "htmlBody"}} + + + + + + + +

Hi {{.Name}},

+

This is an example body

+

Sent at: {{now}}

+ + +{{end}} \ No newline at end of file diff --git a/assets/emails/forgotten-password.tmpl b/assets/emails/forgotten-password.tmpl new file mode 100644 index 0000000..9eb163e --- /dev/null +++ b/assets/emails/forgotten-password.tmpl @@ -0,0 +1,29 @@ +{{define "subject"}}Reset your password{{end}} + +{{define "plainBody"}} +Hi, + +Someone (hopefully you) has requested a password reset for your {{.BaseURL}} account. Follow the link below to set a new password: + +Please go to the following page and set a new password: + +{{.BaseURL}}/password-reset/{{.PlaintextToken}} + +If you don't wish to reset your password, disregard this email and no action will be taken. +{{end}} + +{{define "htmlBody"}} + + + + + + + +

Hi,

+

Someone (hopefully you) has requested a password reset for your {{.BaseURL}} account. Follow the link below to set a new password:

+

{{.BaseURL}}/password-reset/{{.PlaintextToken}}

+

If you don't wish to reset your password, disregard this email and no action will be taken.

+ + +{{end}} \ No newline at end of file diff --git a/assets/jstemplates/items/field-text.handlebars b/assets/jstemplates/items/field-text.handlebars new file mode 100644 index 0000000..8b24a76 --- /dev/null +++ b/assets/jstemplates/items/field-text.handlebars @@ -0,0 +1,4 @@ +
+
+
+
\ No newline at end of file diff --git a/assets/jstemplates/items/field-url.handlebars b/assets/jstemplates/items/field-url.handlebars new file mode 100644 index 0000000..b2c2c8f --- /dev/null +++ b/assets/jstemplates/items/field-url.handlebars @@ -0,0 +1,4 @@ +
+
+
+
\ No newline at end of file diff --git a/assets/migrations/000001_initalize_schema_migrations.down.sql b/assets/migrations/000001_initalize_schema_migrations.down.sql new file mode 100644 index 0000000..a1cab7f --- /dev/null +++ b/assets/migrations/000001_initalize_schema_migrations.down.sql @@ -0,0 +1 @@ +-- This file is deliberately empty. Don't edit or remove it. \ No newline at end of file diff --git a/assets/migrations/000001_initalize_schema_migrations.up.sql b/assets/migrations/000001_initalize_schema_migrations.up.sql new file mode 100644 index 0000000..a1cab7f --- /dev/null +++ b/assets/migrations/000001_initalize_schema_migrations.up.sql @@ -0,0 +1 @@ +-- This file is deliberately empty. Don't edit or remove it. \ No newline at end of file diff --git a/assets/migrations/000002_create_users_table.down.sql b/assets/migrations/000002_create_users_table.down.sql new file mode 100644 index 0000000..441087a --- /dev/null +++ b/assets/migrations/000002_create_users_table.down.sql @@ -0,0 +1 @@ +DROP TABLE users; \ No newline at end of file diff --git a/assets/migrations/000002_create_users_table.up.sql b/assets/migrations/000002_create_users_table.up.sql new file mode 100644 index 0000000..ab32a9b --- /dev/null +++ b/assets/migrations/000002_create_users_table.up.sql @@ -0,0 +1,6 @@ +CREATE TABLE users ( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + created TIMESTAMP NOT NULL, + email TEXT NOT NULL UNIQUE, + hashed_password TEXT NOT NULL +); diff --git a/assets/migrations/000003_create_password_resets_table.down.sql b/assets/migrations/000003_create_password_resets_table.down.sql new file mode 100644 index 0000000..d56c5bc --- /dev/null +++ b/assets/migrations/000003_create_password_resets_table.down.sql @@ -0,0 +1,4 @@ +DROP INDEX idx_password_resets_user_id; + +DROP TABLE password_resets; + diff --git a/assets/migrations/000003_create_password_resets_table.up.sql b/assets/migrations/000003_create_password_resets_table.up.sql new file mode 100644 index 0000000..f8128a3 --- /dev/null +++ b/assets/migrations/000003_create_password_resets_table.up.sql @@ -0,0 +1,7 @@ +CREATE TABLE password_resets ( + hashed_token TEXT NOT NULL PRIMARY KEY, + user_id INTEGER NOT NULL, + expiry TIMESTAMP NOT NULL +); + +CREATE INDEX idx_password_resets_user_id ON password_resets(user_id); diff --git a/assets/migrations/000004_create_bm_category_table.down.sql b/assets/migrations/000004_create_bm_category_table.down.sql new file mode 100644 index 0000000..a3f1ca2 --- /dev/null +++ b/assets/migrations/000004_create_bm_category_table.down.sql @@ -0,0 +1 @@ +DROP TABLE bm_category; \ No newline at end of file diff --git a/assets/migrations/000004_create_bm_category_table.up.sql b/assets/migrations/000004_create_bm_category_table.up.sql new file mode 100644 index 0000000..e8e1aea --- /dev/null +++ b/assets/migrations/000004_create_bm_category_table.up.sql @@ -0,0 +1,7 @@ +CREATE TABLE bm_category ( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + name TEXT, + parent_id INTEGER, + position INTEGER, + notebook_id INTEGER +); \ No newline at end of file diff --git a/assets/migrations/000005_create_bm_item_table.down.sql b/assets/migrations/000005_create_bm_item_table.down.sql new file mode 100644 index 0000000..c08d1a1 --- /dev/null +++ b/assets/migrations/000005_create_bm_item_table.down.sql @@ -0,0 +1 @@ +DROP TABLE bm_item; \ No newline at end of file diff --git a/assets/migrations/000005_create_bm_item_table.up.sql b/assets/migrations/000005_create_bm_item_table.up.sql new file mode 100644 index 0000000..d13746b --- /dev/null +++ b/assets/migrations/000005_create_bm_item_table.up.sql @@ -0,0 +1,17 @@ +CREATE TABLE bm_item ( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + type_id INTEGER NOT NULL, + title TEXT NOT NULL, + summary TEXT DEFAULT '', + summary_rendered TEXT DEFAULT '', + description TEXT NOT NULL DEFAULT '', + description_rendered BLOB DEFAULT '', + tags TEXT DEFAULT ' ', + active INTEGER DEFAULT 1, + hidden INTEGER DEFAULT 0, + crypted INTEGER DEFAULT 0, + categories TEXT DEFAULT '', + notebooks TEXT DEFAULT '', + on_dashboard INTEGER DEFAULT 0, + on_dashboard_position INTEGER DEFAULT 0 +); \ No newline at end of file diff --git a/assets/migrations/000006_create_bm_item_fields_table.down.sql b/assets/migrations/000006_create_bm_item_fields_table.down.sql new file mode 100644 index 0000000..c08d1a1 --- /dev/null +++ b/assets/migrations/000006_create_bm_item_fields_table.down.sql @@ -0,0 +1 @@ +DROP TABLE bm_item; \ No newline at end of file diff --git a/assets/migrations/000006_create_bm_item_fields_table.up.sql b/assets/migrations/000006_create_bm_item_fields_table.up.sql new file mode 100644 index 0000000..2052706 --- /dev/null +++ b/assets/migrations/000006_create_bm_item_fields_table.up.sql @@ -0,0 +1,6 @@ +CREATE TABLE bm_item_fields ( + item_id INTEGER NOT NULL, + type_field_id INTEGER NOT NULL, + "value" TEXT NOT NULL, + "counter" INTEGER DEFAULT 0 +); \ No newline at end of file diff --git a/assets/migrations/000007_create_bm_item_keywords_table.down.sql b/assets/migrations/000007_create_bm_item_keywords_table.down.sql new file mode 100644 index 0000000..9fb58bd --- /dev/null +++ b/assets/migrations/000007_create_bm_item_keywords_table.down.sql @@ -0,0 +1 @@ +DROP TABLE bm_item_keywords; \ No newline at end of file diff --git a/assets/migrations/000007_create_bm_item_keywords_table.up.sql b/assets/migrations/000007_create_bm_item_keywords_table.up.sql new file mode 100644 index 0000000..618d2b7 --- /dev/null +++ b/assets/migrations/000007_create_bm_item_keywords_table.up.sql @@ -0,0 +1,4 @@ +CREATE TABLE bm_item_keywords ( + item_id INTEGER, + keyword TEXT +); \ No newline at end of file diff --git a/assets/migrations/000008_create_bm_item_relations_table.down.sql b/assets/migrations/000008_create_bm_item_relations_table.down.sql new file mode 100644 index 0000000..6417452 --- /dev/null +++ b/assets/migrations/000008_create_bm_item_relations_table.down.sql @@ -0,0 +1 @@ +DROP TABLE bm_item_relations; \ No newline at end of file diff --git a/assets/migrations/000008_create_bm_item_relations_table.up.sql b/assets/migrations/000008_create_bm_item_relations_table.up.sql new file mode 100644 index 0000000..31faf83 --- /dev/null +++ b/assets/migrations/000008_create_bm_item_relations_table.up.sql @@ -0,0 +1,8 @@ +CREATE TABLE "bm_item_relations" ( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + "item_id" INTEGER NOT NULL, + "related_item_id" INTEGER NOT NULL, + "active" INTEGER NOT NULL DEFAULT 1, + "relation_type" TEXT DEFAULT '', + UNIQUE("item_id","related_item_id") +); \ No newline at end of file diff --git a/assets/migrations/000009_create_bm_item_notebook_table.down.sql b/assets/migrations/000009_create_bm_item_notebook_table.down.sql new file mode 100644 index 0000000..436abcd --- /dev/null +++ b/assets/migrations/000009_create_bm_item_notebook_table.down.sql @@ -0,0 +1 @@ +DROP TABLE bm_notebook; \ No newline at end of file diff --git a/assets/migrations/000009_create_bm_item_notebook_table.up.sql b/assets/migrations/000009_create_bm_item_notebook_table.up.sql new file mode 100644 index 0000000..d0924bd --- /dev/null +++ b/assets/migrations/000009_create_bm_item_notebook_table.up.sql @@ -0,0 +1,7 @@ +CREATE TABLE "bm_notebook" ( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + "title" TEXT DEFAULT '', + "hidden" INTEGER DEFAULT 0, + "icon" TEXT DEFAULT '', + "description" TEXT DEFAULT '' +); \ No newline at end of file diff --git a/assets/migrations/000010_create_bm_quicknote_table.down.sql b/assets/migrations/000010_create_bm_quicknote_table.down.sql new file mode 100644 index 0000000..f7ae96b --- /dev/null +++ b/assets/migrations/000010_create_bm_quicknote_table.down.sql @@ -0,0 +1 @@ +DROP TABLE bm_quicknote; \ No newline at end of file diff --git a/assets/migrations/000010_create_bm_quicknote_table.up.sql b/assets/migrations/000010_create_bm_quicknote_table.up.sql new file mode 100644 index 0000000..33df959 --- /dev/null +++ b/assets/migrations/000010_create_bm_quicknote_table.up.sql @@ -0,0 +1,6 @@ +CREATE TABLE "bm_quicknote" ( + "id" INTEGER, + "note" TEXT DEFAULT '', + "note_rendered" TEXT DEFAULT '', + PRIMARY KEY("id" AUTOINCREMENT) +); \ No newline at end of file diff --git a/assets/migrations/000011_create_bm_type_table.down.sql b/assets/migrations/000011_create_bm_type_table.down.sql new file mode 100644 index 0000000..964e114 --- /dev/null +++ b/assets/migrations/000011_create_bm_type_table.down.sql @@ -0,0 +1 @@ +DROP TABLE bm_type; \ No newline at end of file diff --git a/assets/migrations/000011_create_bm_type_table.up.sql b/assets/migrations/000011_create_bm_type_table.up.sql new file mode 100644 index 0000000..cbc3a13 --- /dev/null +++ b/assets/migrations/000011_create_bm_type_table.up.sql @@ -0,0 +1,11 @@ +CREATE TABLE "bm_type" ( + "id" INTEGER, + "title" TEXT, + "icon" NUMERIC, + "description" BLOB DEFAULT '', + "notebooks" BLOB DEFAULT '', + "show_summary" INTEGER DEFAULT '', + "show_description" INTEGER DEFAULT '', + "sections" TEXT, + PRIMARY KEY("id" AUTOINCREMENT) +); \ No newline at end of file diff --git a/assets/migrations/000012_create_bm_type_fields_table.down.sql b/assets/migrations/000012_create_bm_type_fields_table.down.sql new file mode 100644 index 0000000..964e114 --- /dev/null +++ b/assets/migrations/000012_create_bm_type_fields_table.down.sql @@ -0,0 +1 @@ +DROP TABLE bm_type; \ No newline at end of file diff --git a/assets/migrations/000012_create_bm_type_fields_table.up.sql b/assets/migrations/000012_create_bm_type_fields_table.up.sql new file mode 100644 index 0000000..e65adfb --- /dev/null +++ b/assets/migrations/000012_create_bm_type_fields_table.up.sql @@ -0,0 +1,13 @@ +CREATE TABLE "bm_type_fields" ( + "id" INTEGER, + "widget_id" INTEGER DEFAULT 0, + "type_id" INTEGER DEFAULT 0, + "title" TEXT DEFAULT '', + "position" INTEGER DEFAULT 0, + "valid_values" TEXT DEFAULT '', + "show_on_list" INTEGER DEFAULT 0, + "show_on_view" INTEGER DEFAULT 0, + "ui_section" TEXT DEFAULT '', + "is_multiple" INTEGER DEFAULT 0, + PRIMARY KEY("id" AUTOINCREMENT) +); \ No newline at end of file diff --git a/assets/migrations/000013_create_bm_widgets_table.down.sql b/assets/migrations/000013_create_bm_widgets_table.down.sql new file mode 100644 index 0000000..964e114 --- /dev/null +++ b/assets/migrations/000013_create_bm_widgets_table.down.sql @@ -0,0 +1 @@ +DROP TABLE bm_type; \ No newline at end of file diff --git a/assets/migrations/000013_create_bm_widgets_table.up.sql b/assets/migrations/000013_create_bm_widgets_table.up.sql new file mode 100644 index 0000000..9405d21 --- /dev/null +++ b/assets/migrations/000013_create_bm_widgets_table.up.sql @@ -0,0 +1,6 @@ +CREATE TABLE "bm_widgets" ( + "id" INTEGER, + "name" TEXT NOT NULL DEFAULT '', + "widget" TEXT, + PRIMARY KEY("id" AUTOINCREMENT) +); \ No newline at end of file diff --git a/assets/migrations/000014_create_bm_item_shares_table.down.sql b/assets/migrations/000014_create_bm_item_shares_table.down.sql new file mode 100644 index 0000000..f7756fb --- /dev/null +++ b/assets/migrations/000014_create_bm_item_shares_table.down.sql @@ -0,0 +1 @@ +DROP TABLE bm_item_shares; \ No newline at end of file diff --git a/assets/migrations/000014_create_bm_item_shares_table.up.sql b/assets/migrations/000014_create_bm_item_shares_table.up.sql new file mode 100644 index 0000000..115238c --- /dev/null +++ b/assets/migrations/000014_create_bm_item_shares_table.up.sql @@ -0,0 +1,10 @@ +CREATE TABLE "bm_item_shares" ( + "id" INTEGER, + "token" TEXT NOT NULL UNIQUE, + "item_id" INTEGER DEFAULT 0, + "read" INTEGER DEFAULT 0, + "update" INTEGER DEFAULT 0, + "start_datetime" TEXT DEFAULT 0, + "end_datetime" TEXT DEFAULT 0, + PRIMARY KEY("id" AUTOINCREMENT) +); \ No newline at end of file diff --git a/assets/static/bootstrap-icons/0-circle-fill.svg b/assets/static/bootstrap-icons/0-circle-fill.svg new file mode 100644 index 0000000..2f5f026 --- /dev/null +++ b/assets/static/bootstrap-icons/0-circle-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/0-circle.svg b/assets/static/bootstrap-icons/0-circle.svg new file mode 100644 index 0000000..5e84c8c --- /dev/null +++ b/assets/static/bootstrap-icons/0-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/0-square-fill.svg b/assets/static/bootstrap-icons/0-square-fill.svg new file mode 100644 index 0000000..cca049b --- /dev/null +++ b/assets/static/bootstrap-icons/0-square-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/0-square.svg b/assets/static/bootstrap-icons/0-square.svg new file mode 100644 index 0000000..73b7bc1 --- /dev/null +++ b/assets/static/bootstrap-icons/0-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/1-circle-fill.svg b/assets/static/bootstrap-icons/1-circle-fill.svg new file mode 100644 index 0000000..b10d0f3 --- /dev/null +++ b/assets/static/bootstrap-icons/1-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/1-circle.svg b/assets/static/bootstrap-icons/1-circle.svg new file mode 100644 index 0000000..2aa21f9 --- /dev/null +++ b/assets/static/bootstrap-icons/1-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/1-square-fill.svg b/assets/static/bootstrap-icons/1-square-fill.svg new file mode 100644 index 0000000..2ce792f --- /dev/null +++ b/assets/static/bootstrap-icons/1-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/1-square.svg b/assets/static/bootstrap-icons/1-square.svg new file mode 100644 index 0000000..773534a --- /dev/null +++ b/assets/static/bootstrap-icons/1-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/123.svg b/assets/static/bootstrap-icons/123.svg new file mode 100644 index 0000000..277d405 --- /dev/null +++ b/assets/static/bootstrap-icons/123.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/2-circle-fill.svg b/assets/static/bootstrap-icons/2-circle-fill.svg new file mode 100644 index 0000000..169df3a --- /dev/null +++ b/assets/static/bootstrap-icons/2-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/2-circle.svg b/assets/static/bootstrap-icons/2-circle.svg new file mode 100644 index 0000000..00260b6 --- /dev/null +++ b/assets/static/bootstrap-icons/2-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/2-square-fill.svg b/assets/static/bootstrap-icons/2-square-fill.svg new file mode 100644 index 0000000..2760ca7 --- /dev/null +++ b/assets/static/bootstrap-icons/2-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/2-square.svg b/assets/static/bootstrap-icons/2-square.svg new file mode 100644 index 0000000..4a79ed6 --- /dev/null +++ b/assets/static/bootstrap-icons/2-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/3-circle-fill.svg b/assets/static/bootstrap-icons/3-circle-fill.svg new file mode 100644 index 0000000..9aedc47 --- /dev/null +++ b/assets/static/bootstrap-icons/3-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/3-circle.svg b/assets/static/bootstrap-icons/3-circle.svg new file mode 100644 index 0000000..c2fc517 --- /dev/null +++ b/assets/static/bootstrap-icons/3-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/3-square-fill.svg b/assets/static/bootstrap-icons/3-square-fill.svg new file mode 100644 index 0000000..20c71a7 --- /dev/null +++ b/assets/static/bootstrap-icons/3-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/3-square.svg b/assets/static/bootstrap-icons/3-square.svg new file mode 100644 index 0000000..f0907cc --- /dev/null +++ b/assets/static/bootstrap-icons/3-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/4-circle-fill.svg b/assets/static/bootstrap-icons/4-circle-fill.svg new file mode 100644 index 0000000..51dc8a5 --- /dev/null +++ b/assets/static/bootstrap-icons/4-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/4-circle.svg b/assets/static/bootstrap-icons/4-circle.svg new file mode 100644 index 0000000..e25df51 --- /dev/null +++ b/assets/static/bootstrap-icons/4-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/4-square-fill.svg b/assets/static/bootstrap-icons/4-square-fill.svg new file mode 100644 index 0000000..ce3aa94 --- /dev/null +++ b/assets/static/bootstrap-icons/4-square-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/4-square.svg b/assets/static/bootstrap-icons/4-square.svg new file mode 100644 index 0000000..769102d --- /dev/null +++ b/assets/static/bootstrap-icons/4-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/5-circle-fill.svg b/assets/static/bootstrap-icons/5-circle-fill.svg new file mode 100644 index 0000000..915462d --- /dev/null +++ b/assets/static/bootstrap-icons/5-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/5-circle.svg b/assets/static/bootstrap-icons/5-circle.svg new file mode 100644 index 0000000..5ef620d --- /dev/null +++ b/assets/static/bootstrap-icons/5-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/5-square-fill.svg b/assets/static/bootstrap-icons/5-square-fill.svg new file mode 100644 index 0000000..2b066bb --- /dev/null +++ b/assets/static/bootstrap-icons/5-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/5-square.svg b/assets/static/bootstrap-icons/5-square.svg new file mode 100644 index 0000000..ad3e281 --- /dev/null +++ b/assets/static/bootstrap-icons/5-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/6-circle-fill.svg b/assets/static/bootstrap-icons/6-circle-fill.svg new file mode 100644 index 0000000..21b601a --- /dev/null +++ b/assets/static/bootstrap-icons/6-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/6-circle.svg b/assets/static/bootstrap-icons/6-circle.svg new file mode 100644 index 0000000..fc036b0 --- /dev/null +++ b/assets/static/bootstrap-icons/6-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/6-square-fill.svg b/assets/static/bootstrap-icons/6-square-fill.svg new file mode 100644 index 0000000..908706d --- /dev/null +++ b/assets/static/bootstrap-icons/6-square-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/6-square.svg b/assets/static/bootstrap-icons/6-square.svg new file mode 100644 index 0000000..ce28209 --- /dev/null +++ b/assets/static/bootstrap-icons/6-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/7-circle-fill.svg b/assets/static/bootstrap-icons/7-circle-fill.svg new file mode 100644 index 0000000..0f4f6d9 --- /dev/null +++ b/assets/static/bootstrap-icons/7-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/7-circle.svg b/assets/static/bootstrap-icons/7-circle.svg new file mode 100644 index 0000000..796f45c --- /dev/null +++ b/assets/static/bootstrap-icons/7-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/7-square-fill.svg b/assets/static/bootstrap-icons/7-square-fill.svg new file mode 100644 index 0000000..604186d --- /dev/null +++ b/assets/static/bootstrap-icons/7-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/7-square.svg b/assets/static/bootstrap-icons/7-square.svg new file mode 100644 index 0000000..f269032 --- /dev/null +++ b/assets/static/bootstrap-icons/7-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/8-circle-fill.svg b/assets/static/bootstrap-icons/8-circle-fill.svg new file mode 100644 index 0000000..579846b --- /dev/null +++ b/assets/static/bootstrap-icons/8-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/8-circle.svg b/assets/static/bootstrap-icons/8-circle.svg new file mode 100644 index 0000000..2dbb93e --- /dev/null +++ b/assets/static/bootstrap-icons/8-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/8-square-fill.svg b/assets/static/bootstrap-icons/8-square-fill.svg new file mode 100644 index 0000000..f8efe93 --- /dev/null +++ b/assets/static/bootstrap-icons/8-square-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/8-square.svg b/assets/static/bootstrap-icons/8-square.svg new file mode 100644 index 0000000..f29d225 --- /dev/null +++ b/assets/static/bootstrap-icons/8-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/9-circle-fill.svg b/assets/static/bootstrap-icons/9-circle-fill.svg new file mode 100644 index 0000000..b19b3f5 --- /dev/null +++ b/assets/static/bootstrap-icons/9-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/9-circle.svg b/assets/static/bootstrap-icons/9-circle.svg new file mode 100644 index 0000000..ff91949 --- /dev/null +++ b/assets/static/bootstrap-icons/9-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/9-square-fill.svg b/assets/static/bootstrap-icons/9-square-fill.svg new file mode 100644 index 0000000..e2ca2c3 --- /dev/null +++ b/assets/static/bootstrap-icons/9-square-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/9-square.svg b/assets/static/bootstrap-icons/9-square.svg new file mode 100644 index 0000000..3410f7b --- /dev/null +++ b/assets/static/bootstrap-icons/9-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/activity.svg b/assets/static/bootstrap-icons/activity.svg new file mode 100644 index 0000000..1ca946e --- /dev/null +++ b/assets/static/bootstrap-icons/activity.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/airplane-engines-fill.svg b/assets/static/bootstrap-icons/airplane-engines-fill.svg new file mode 100644 index 0000000..3d8f185 --- /dev/null +++ b/assets/static/bootstrap-icons/airplane-engines-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/airplane-engines.svg b/assets/static/bootstrap-icons/airplane-engines.svg new file mode 100644 index 0000000..2efc31e --- /dev/null +++ b/assets/static/bootstrap-icons/airplane-engines.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/airplane-fill.svg b/assets/static/bootstrap-icons/airplane-fill.svg new file mode 100644 index 0000000..b1e4fa3 --- /dev/null +++ b/assets/static/bootstrap-icons/airplane-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/airplane.svg b/assets/static/bootstrap-icons/airplane.svg new file mode 100644 index 0000000..5f937e1 --- /dev/null +++ b/assets/static/bootstrap-icons/airplane.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/alarm-fill.svg b/assets/static/bootstrap-icons/alarm-fill.svg new file mode 100644 index 0000000..a53c88f --- /dev/null +++ b/assets/static/bootstrap-icons/alarm-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/alarm.svg b/assets/static/bootstrap-icons/alarm.svg new file mode 100644 index 0000000..27160b3 --- /dev/null +++ b/assets/static/bootstrap-icons/alarm.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/alexa.svg b/assets/static/bootstrap-icons/alexa.svg new file mode 100644 index 0000000..0827c41 --- /dev/null +++ b/assets/static/bootstrap-icons/alexa.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/align-bottom.svg b/assets/static/bootstrap-icons/align-bottom.svg new file mode 100644 index 0000000..5c2569f --- /dev/null +++ b/assets/static/bootstrap-icons/align-bottom.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/align-center.svg b/assets/static/bootstrap-icons/align-center.svg new file mode 100644 index 0000000..ea4290b --- /dev/null +++ b/assets/static/bootstrap-icons/align-center.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/align-end.svg b/assets/static/bootstrap-icons/align-end.svg new file mode 100644 index 0000000..15429bb --- /dev/null +++ b/assets/static/bootstrap-icons/align-end.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/align-middle.svg b/assets/static/bootstrap-icons/align-middle.svg new file mode 100644 index 0000000..82f6801 --- /dev/null +++ b/assets/static/bootstrap-icons/align-middle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/align-start.svg b/assets/static/bootstrap-icons/align-start.svg new file mode 100644 index 0000000..75dca50 --- /dev/null +++ b/assets/static/bootstrap-icons/align-start.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/align-top.svg b/assets/static/bootstrap-icons/align-top.svg new file mode 100644 index 0000000..f354fc5 --- /dev/null +++ b/assets/static/bootstrap-icons/align-top.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/alipay.svg b/assets/static/bootstrap-icons/alipay.svg new file mode 100644 index 0000000..30b6fe7 --- /dev/null +++ b/assets/static/bootstrap-icons/alipay.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/alphabet-uppercase.svg b/assets/static/bootstrap-icons/alphabet-uppercase.svg new file mode 100644 index 0000000..d0887b5 --- /dev/null +++ b/assets/static/bootstrap-icons/alphabet-uppercase.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/alphabet.svg b/assets/static/bootstrap-icons/alphabet.svg new file mode 100644 index 0000000..5d097d7 --- /dev/null +++ b/assets/static/bootstrap-icons/alphabet.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/alt.svg b/assets/static/bootstrap-icons/alt.svg new file mode 100644 index 0000000..2141bcb --- /dev/null +++ b/assets/static/bootstrap-icons/alt.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/amazon.svg b/assets/static/bootstrap-icons/amazon.svg new file mode 100644 index 0000000..0752545 --- /dev/null +++ b/assets/static/bootstrap-icons/amazon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/amd.svg b/assets/static/bootstrap-icons/amd.svg new file mode 100644 index 0000000..ef0757c --- /dev/null +++ b/assets/static/bootstrap-icons/amd.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/android.svg b/assets/static/bootstrap-icons/android.svg new file mode 100644 index 0000000..4c1f097 --- /dev/null +++ b/assets/static/bootstrap-icons/android.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/android2.svg b/assets/static/bootstrap-icons/android2.svg new file mode 100644 index 0000000..f49c14e --- /dev/null +++ b/assets/static/bootstrap-icons/android2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/app-indicator.svg b/assets/static/bootstrap-icons/app-indicator.svg new file mode 100644 index 0000000..b28e219 --- /dev/null +++ b/assets/static/bootstrap-icons/app-indicator.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/app.svg b/assets/static/bootstrap-icons/app.svg new file mode 100644 index 0000000..b361308 --- /dev/null +++ b/assets/static/bootstrap-icons/app.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/apple.svg b/assets/static/bootstrap-icons/apple.svg new file mode 100644 index 0000000..58235c3 --- /dev/null +++ b/assets/static/bootstrap-icons/apple.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/archive-fill.svg b/assets/static/bootstrap-icons/archive-fill.svg new file mode 100644 index 0000000..e5ea32b --- /dev/null +++ b/assets/static/bootstrap-icons/archive-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/archive.svg b/assets/static/bootstrap-icons/archive.svg new file mode 100644 index 0000000..7bc5eb2 --- /dev/null +++ b/assets/static/bootstrap-icons/archive.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-90deg-down.svg b/assets/static/bootstrap-icons/arrow-90deg-down.svg new file mode 100644 index 0000000..7459597 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-90deg-down.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-90deg-left.svg b/assets/static/bootstrap-icons/arrow-90deg-left.svg new file mode 100644 index 0000000..4e17ab4 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-90deg-left.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-90deg-right.svg b/assets/static/bootstrap-icons/arrow-90deg-right.svg new file mode 100644 index 0000000..9fb6363 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-90deg-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-90deg-up.svg b/assets/static/bootstrap-icons/arrow-90deg-up.svg new file mode 100644 index 0000000..11be0de --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-90deg-up.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-bar-down.svg b/assets/static/bootstrap-icons/arrow-bar-down.svg new file mode 100644 index 0000000..1b212d5 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-bar-down.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-bar-left.svg b/assets/static/bootstrap-icons/arrow-bar-left.svg new file mode 100644 index 0000000..621bf2a --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-bar-left.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-bar-right.svg b/assets/static/bootstrap-icons/arrow-bar-right.svg new file mode 100644 index 0000000..0210410 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-bar-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-bar-up.svg b/assets/static/bootstrap-icons/arrow-bar-up.svg new file mode 100644 index 0000000..d5510da --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-bar-up.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-clockwise.svg b/assets/static/bootstrap-icons/arrow-clockwise.svg new file mode 100644 index 0000000..324d5af --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-clockwise.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-counterclockwise.svg b/assets/static/bootstrap-icons/arrow-counterclockwise.svg new file mode 100644 index 0000000..3d9ff62 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-counterclockwise.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-down-circle-fill.svg b/assets/static/bootstrap-icons/arrow-down-circle-fill.svg new file mode 100644 index 0000000..242eb58 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-down-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-down-circle.svg b/assets/static/bootstrap-icons/arrow-down-circle.svg new file mode 100644 index 0000000..42e96b5 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-down-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-down-left-circle-fill.svg b/assets/static/bootstrap-icons/arrow-down-left-circle-fill.svg new file mode 100644 index 0000000..e7f4735 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-down-left-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-down-left-circle.svg b/assets/static/bootstrap-icons/arrow-down-left-circle.svg new file mode 100644 index 0000000..f67491f --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-down-left-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-down-left-square-fill.svg b/assets/static/bootstrap-icons/arrow-down-left-square-fill.svg new file mode 100644 index 0000000..6e03bf2 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-down-left-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-down-left-square.svg b/assets/static/bootstrap-icons/arrow-down-left-square.svg new file mode 100644 index 0000000..1278d39 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-down-left-square.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-down-left.svg b/assets/static/bootstrap-icons/arrow-down-left.svg new file mode 100644 index 0000000..4011c77 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-down-left.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-down-right-circle-fill.svg b/assets/static/bootstrap-icons/arrow-down-right-circle-fill.svg new file mode 100644 index 0000000..4ff73b6 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-down-right-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-down-right-circle.svg b/assets/static/bootstrap-icons/arrow-down-right-circle.svg new file mode 100644 index 0000000..054e83f --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-down-right-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-down-right-square-fill.svg b/assets/static/bootstrap-icons/arrow-down-right-square-fill.svg new file mode 100644 index 0000000..a556e06 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-down-right-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-down-right-square.svg b/assets/static/bootstrap-icons/arrow-down-right-square.svg new file mode 100644 index 0000000..4bfb679 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-down-right-square.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-down-right.svg b/assets/static/bootstrap-icons/arrow-down-right.svg new file mode 100644 index 0000000..08aef16 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-down-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-down-short.svg b/assets/static/bootstrap-icons/arrow-down-short.svg new file mode 100644 index 0000000..66b7fa1 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-down-short.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-down-square-fill.svg b/assets/static/bootstrap-icons/arrow-down-square-fill.svg new file mode 100644 index 0000000..c9020dc --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-down-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-down-square.svg b/assets/static/bootstrap-icons/arrow-down-square.svg new file mode 100644 index 0000000..c492b71 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-down-square.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-down-up.svg b/assets/static/bootstrap-icons/arrow-down-up.svg new file mode 100644 index 0000000..04cb3a5 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-down-up.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-down.svg b/assets/static/bootstrap-icons/arrow-down.svg new file mode 100644 index 0000000..f66f74b --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-down.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-left-circle-fill.svg b/assets/static/bootstrap-icons/arrow-left-circle-fill.svg new file mode 100644 index 0000000..ae19d97 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-left-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-left-circle.svg b/assets/static/bootstrap-icons/arrow-left-circle.svg new file mode 100644 index 0000000..f3246ea --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-left-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-left-right.svg b/assets/static/bootstrap-icons/arrow-left-right.svg new file mode 100644 index 0000000..89c4003 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-left-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-left-short.svg b/assets/static/bootstrap-icons/arrow-left-short.svg new file mode 100644 index 0000000..abb15dd --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-left-short.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-left-square-fill.svg b/assets/static/bootstrap-icons/arrow-left-square-fill.svg new file mode 100644 index 0000000..3ee717e --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-left-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-left-square.svg b/assets/static/bootstrap-icons/arrow-left-square.svg new file mode 100644 index 0000000..8f09a48 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-left-square.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-left.svg b/assets/static/bootstrap-icons/arrow-left.svg new file mode 100644 index 0000000..587d4fe --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-left.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-repeat.svg b/assets/static/bootstrap-icons/arrow-repeat.svg new file mode 100644 index 0000000..b17dba4 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-repeat.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-return-left.svg b/assets/static/bootstrap-icons/arrow-return-left.svg new file mode 100644 index 0000000..3c13fc4 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-return-left.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-return-right.svg b/assets/static/bootstrap-icons/arrow-return-right.svg new file mode 100644 index 0000000..60d282c --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-return-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-right-circle-fill.svg b/assets/static/bootstrap-icons/arrow-right-circle-fill.svg new file mode 100644 index 0000000..32c21ea --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-right-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-right-circle.svg b/assets/static/bootstrap-icons/arrow-right-circle.svg new file mode 100644 index 0000000..ad7293e --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-right-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-right-short.svg b/assets/static/bootstrap-icons/arrow-right-short.svg new file mode 100644 index 0000000..fa238ff --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-right-short.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-right-square-fill.svg b/assets/static/bootstrap-icons/arrow-right-square-fill.svg new file mode 100644 index 0000000..c7c8eec --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-right-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-right-square.svg b/assets/static/bootstrap-icons/arrow-right-square.svg new file mode 100644 index 0000000..7a4b78b --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-right-square.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-right.svg b/assets/static/bootstrap-icons/arrow-right.svg new file mode 100644 index 0000000..2362904 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-through-heart-fill.svg b/assets/static/bootstrap-icons/arrow-through-heart-fill.svg new file mode 100644 index 0000000..e98bce1 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-through-heart-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-through-heart.svg b/assets/static/bootstrap-icons/arrow-through-heart.svg new file mode 100644 index 0000000..daf397b --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-through-heart.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-up-circle-fill.svg b/assets/static/bootstrap-icons/arrow-up-circle-fill.svg new file mode 100644 index 0000000..9e7ef36 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-up-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-up-circle.svg b/assets/static/bootstrap-icons/arrow-up-circle.svg new file mode 100644 index 0000000..e18a689 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-up-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-up-left-circle-fill.svg b/assets/static/bootstrap-icons/arrow-up-left-circle-fill.svg new file mode 100644 index 0000000..e1e2e97 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-up-left-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-up-left-circle.svg b/assets/static/bootstrap-icons/arrow-up-left-circle.svg new file mode 100644 index 0000000..3101b65 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-up-left-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-up-left-square-fill.svg b/assets/static/bootstrap-icons/arrow-up-left-square-fill.svg new file mode 100644 index 0000000..e699865 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-up-left-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-up-left-square.svg b/assets/static/bootstrap-icons/arrow-up-left-square.svg new file mode 100644 index 0000000..4f31190 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-up-left-square.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-up-left.svg b/assets/static/bootstrap-icons/arrow-up-left.svg new file mode 100644 index 0000000..938d0d0 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-up-left.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-up-right-circle-fill.svg b/assets/static/bootstrap-icons/arrow-up-right-circle-fill.svg new file mode 100644 index 0000000..0eb9b54 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-up-right-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-up-right-circle.svg b/assets/static/bootstrap-icons/arrow-up-right-circle.svg new file mode 100644 index 0000000..ed6ae41 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-up-right-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-up-right-square-fill.svg b/assets/static/bootstrap-icons/arrow-up-right-square-fill.svg new file mode 100644 index 0000000..c2246ec --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-up-right-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-up-right-square.svg b/assets/static/bootstrap-icons/arrow-up-right-square.svg new file mode 100644 index 0000000..b14940f --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-up-right-square.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-up-right.svg b/assets/static/bootstrap-icons/arrow-up-right.svg new file mode 100644 index 0000000..7b3794b --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-up-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-up-short.svg b/assets/static/bootstrap-icons/arrow-up-short.svg new file mode 100644 index 0000000..543089a --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-up-short.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-up-square-fill.svg b/assets/static/bootstrap-icons/arrow-up-square-fill.svg new file mode 100644 index 0000000..9d7f65f --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-up-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-up-square.svg b/assets/static/bootstrap-icons/arrow-up-square.svg new file mode 100644 index 0000000..bec15c4 --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-up-square.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrow-up.svg b/assets/static/bootstrap-icons/arrow-up.svg new file mode 100644 index 0000000..951521a --- /dev/null +++ b/assets/static/bootstrap-icons/arrow-up.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrows-angle-contract.svg b/assets/static/bootstrap-icons/arrows-angle-contract.svg new file mode 100644 index 0000000..1aa7875 --- /dev/null +++ b/assets/static/bootstrap-icons/arrows-angle-contract.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrows-angle-expand.svg b/assets/static/bootstrap-icons/arrows-angle-expand.svg new file mode 100644 index 0000000..578d3b6 --- /dev/null +++ b/assets/static/bootstrap-icons/arrows-angle-expand.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrows-collapse-vertical.svg b/assets/static/bootstrap-icons/arrows-collapse-vertical.svg new file mode 100644 index 0000000..0fc4477 --- /dev/null +++ b/assets/static/bootstrap-icons/arrows-collapse-vertical.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrows-collapse.svg b/assets/static/bootstrap-icons/arrows-collapse.svg new file mode 100644 index 0000000..ca055c3 --- /dev/null +++ b/assets/static/bootstrap-icons/arrows-collapse.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrows-expand-vertical.svg b/assets/static/bootstrap-icons/arrows-expand-vertical.svg new file mode 100644 index 0000000..9dbfac4 --- /dev/null +++ b/assets/static/bootstrap-icons/arrows-expand-vertical.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrows-expand.svg b/assets/static/bootstrap-icons/arrows-expand.svg new file mode 100644 index 0000000..99eb276 --- /dev/null +++ b/assets/static/bootstrap-icons/arrows-expand.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrows-fullscreen.svg b/assets/static/bootstrap-icons/arrows-fullscreen.svg new file mode 100644 index 0000000..7633e3f --- /dev/null +++ b/assets/static/bootstrap-icons/arrows-fullscreen.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrows-move.svg b/assets/static/bootstrap-icons/arrows-move.svg new file mode 100644 index 0000000..ef2b885 --- /dev/null +++ b/assets/static/bootstrap-icons/arrows-move.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrows-vertical.svg b/assets/static/bootstrap-icons/arrows-vertical.svg new file mode 100644 index 0000000..22f60fd --- /dev/null +++ b/assets/static/bootstrap-icons/arrows-vertical.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/arrows.svg b/assets/static/bootstrap-icons/arrows.svg new file mode 100644 index 0000000..a6bd3d7 --- /dev/null +++ b/assets/static/bootstrap-icons/arrows.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/aspect-ratio-fill.svg b/assets/static/bootstrap-icons/aspect-ratio-fill.svg new file mode 100644 index 0000000..6d6cb8d --- /dev/null +++ b/assets/static/bootstrap-icons/aspect-ratio-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/aspect-ratio.svg b/assets/static/bootstrap-icons/aspect-ratio.svg new file mode 100644 index 0000000..ee634b0 --- /dev/null +++ b/assets/static/bootstrap-icons/aspect-ratio.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/asterisk.svg b/assets/static/bootstrap-icons/asterisk.svg new file mode 100644 index 0000000..fbc13b7 --- /dev/null +++ b/assets/static/bootstrap-icons/asterisk.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/at.svg b/assets/static/bootstrap-icons/at.svg new file mode 100644 index 0000000..3cab29e --- /dev/null +++ b/assets/static/bootstrap-icons/at.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/award-fill.svg b/assets/static/bootstrap-icons/award-fill.svg new file mode 100644 index 0000000..f996790 --- /dev/null +++ b/assets/static/bootstrap-icons/award-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/award.svg b/assets/static/bootstrap-icons/award.svg new file mode 100644 index 0000000..67c760b --- /dev/null +++ b/assets/static/bootstrap-icons/award.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/back.svg b/assets/static/bootstrap-icons/back.svg new file mode 100644 index 0000000..9f55340 --- /dev/null +++ b/assets/static/bootstrap-icons/back.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/backpack-fill.svg b/assets/static/bootstrap-icons/backpack-fill.svg new file mode 100644 index 0000000..ec737a9 --- /dev/null +++ b/assets/static/bootstrap-icons/backpack-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/backpack.svg b/assets/static/bootstrap-icons/backpack.svg new file mode 100644 index 0000000..819aa29 --- /dev/null +++ b/assets/static/bootstrap-icons/backpack.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/backpack2-fill.svg b/assets/static/bootstrap-icons/backpack2-fill.svg new file mode 100644 index 0000000..3c9b4da --- /dev/null +++ b/assets/static/bootstrap-icons/backpack2-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/backpack2.svg b/assets/static/bootstrap-icons/backpack2.svg new file mode 100644 index 0000000..e0e4fe5 --- /dev/null +++ b/assets/static/bootstrap-icons/backpack2.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/backpack3-fill.svg b/assets/static/bootstrap-icons/backpack3-fill.svg new file mode 100644 index 0000000..4583c4f --- /dev/null +++ b/assets/static/bootstrap-icons/backpack3-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/backpack3.svg b/assets/static/bootstrap-icons/backpack3.svg new file mode 100644 index 0000000..819f8df --- /dev/null +++ b/assets/static/bootstrap-icons/backpack3.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/backpack4-fill.svg b/assets/static/bootstrap-icons/backpack4-fill.svg new file mode 100644 index 0000000..a3bba3a --- /dev/null +++ b/assets/static/bootstrap-icons/backpack4-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/backpack4.svg b/assets/static/bootstrap-icons/backpack4.svg new file mode 100644 index 0000000..140a12d --- /dev/null +++ b/assets/static/bootstrap-icons/backpack4.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/backspace-fill.svg b/assets/static/bootstrap-icons/backspace-fill.svg new file mode 100644 index 0000000..0787578 --- /dev/null +++ b/assets/static/bootstrap-icons/backspace-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/backspace-reverse-fill.svg b/assets/static/bootstrap-icons/backspace-reverse-fill.svg new file mode 100644 index 0000000..41c8dbb --- /dev/null +++ b/assets/static/bootstrap-icons/backspace-reverse-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/backspace-reverse.svg b/assets/static/bootstrap-icons/backspace-reverse.svg new file mode 100644 index 0000000..7b3fafd --- /dev/null +++ b/assets/static/bootstrap-icons/backspace-reverse.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/backspace.svg b/assets/static/bootstrap-icons/backspace.svg new file mode 100644 index 0000000..39b688f --- /dev/null +++ b/assets/static/bootstrap-icons/backspace.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-3d-fill.svg b/assets/static/bootstrap-icons/badge-3d-fill.svg new file mode 100644 index 0000000..750598c --- /dev/null +++ b/assets/static/bootstrap-icons/badge-3d-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-3d.svg b/assets/static/bootstrap-icons/badge-3d.svg new file mode 100644 index 0000000..b3153f2 --- /dev/null +++ b/assets/static/bootstrap-icons/badge-3d.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-4k-fill.svg b/assets/static/bootstrap-icons/badge-4k-fill.svg new file mode 100644 index 0000000..72f34b9 --- /dev/null +++ b/assets/static/bootstrap-icons/badge-4k-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-4k.svg b/assets/static/bootstrap-icons/badge-4k.svg new file mode 100644 index 0000000..3dfc9b1 --- /dev/null +++ b/assets/static/bootstrap-icons/badge-4k.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-8k-fill.svg b/assets/static/bootstrap-icons/badge-8k-fill.svg new file mode 100644 index 0000000..4bd9b80 --- /dev/null +++ b/assets/static/bootstrap-icons/badge-8k-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-8k.svg b/assets/static/bootstrap-icons/badge-8k.svg new file mode 100644 index 0000000..d11f82d --- /dev/null +++ b/assets/static/bootstrap-icons/badge-8k.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-ad-fill.svg b/assets/static/bootstrap-icons/badge-ad-fill.svg new file mode 100644 index 0000000..023f210 --- /dev/null +++ b/assets/static/bootstrap-icons/badge-ad-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-ad.svg b/assets/static/bootstrap-icons/badge-ad.svg new file mode 100644 index 0000000..616ad74 --- /dev/null +++ b/assets/static/bootstrap-icons/badge-ad.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-ar-fill.svg b/assets/static/bootstrap-icons/badge-ar-fill.svg new file mode 100644 index 0000000..48aee0f --- /dev/null +++ b/assets/static/bootstrap-icons/badge-ar-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-ar.svg b/assets/static/bootstrap-icons/badge-ar.svg new file mode 100644 index 0000000..0fc1975 --- /dev/null +++ b/assets/static/bootstrap-icons/badge-ar.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-cc-fill.svg b/assets/static/bootstrap-icons/badge-cc-fill.svg new file mode 100644 index 0000000..0f3d1f9 --- /dev/null +++ b/assets/static/bootstrap-icons/badge-cc-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-cc.svg b/assets/static/bootstrap-icons/badge-cc.svg new file mode 100644 index 0000000..d5f42e1 --- /dev/null +++ b/assets/static/bootstrap-icons/badge-cc.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-hd-fill.svg b/assets/static/bootstrap-icons/badge-hd-fill.svg new file mode 100644 index 0000000..96f0875 --- /dev/null +++ b/assets/static/bootstrap-icons/badge-hd-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-hd.svg b/assets/static/bootstrap-icons/badge-hd.svg new file mode 100644 index 0000000..5689042 --- /dev/null +++ b/assets/static/bootstrap-icons/badge-hd.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-sd-fill.svg b/assets/static/bootstrap-icons/badge-sd-fill.svg new file mode 100644 index 0000000..a37154a --- /dev/null +++ b/assets/static/bootstrap-icons/badge-sd-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-sd.svg b/assets/static/bootstrap-icons/badge-sd.svg new file mode 100644 index 0000000..df8d029 --- /dev/null +++ b/assets/static/bootstrap-icons/badge-sd.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-tm-fill.svg b/assets/static/bootstrap-icons/badge-tm-fill.svg new file mode 100644 index 0000000..632b569 --- /dev/null +++ b/assets/static/bootstrap-icons/badge-tm-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-tm.svg b/assets/static/bootstrap-icons/badge-tm.svg new file mode 100644 index 0000000..33de5c2 --- /dev/null +++ b/assets/static/bootstrap-icons/badge-tm.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-vo-fill.svg b/assets/static/bootstrap-icons/badge-vo-fill.svg new file mode 100644 index 0000000..1d27b07 --- /dev/null +++ b/assets/static/bootstrap-icons/badge-vo-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-vo.svg b/assets/static/bootstrap-icons/badge-vo.svg new file mode 100644 index 0000000..f5e2ece --- /dev/null +++ b/assets/static/bootstrap-icons/badge-vo.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-vr-fill.svg b/assets/static/bootstrap-icons/badge-vr-fill.svg new file mode 100644 index 0000000..e614af6 --- /dev/null +++ b/assets/static/bootstrap-icons/badge-vr-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-vr.svg b/assets/static/bootstrap-icons/badge-vr.svg new file mode 100644 index 0000000..c1c73dc --- /dev/null +++ b/assets/static/bootstrap-icons/badge-vr.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-wc-fill.svg b/assets/static/bootstrap-icons/badge-wc-fill.svg new file mode 100644 index 0000000..d16436a --- /dev/null +++ b/assets/static/bootstrap-icons/badge-wc-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/badge-wc.svg b/assets/static/bootstrap-icons/badge-wc.svg new file mode 100644 index 0000000..ea459ba --- /dev/null +++ b/assets/static/bootstrap-icons/badge-wc.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bag-check-fill.svg b/assets/static/bootstrap-icons/bag-check-fill.svg new file mode 100644 index 0000000..9976d5c --- /dev/null +++ b/assets/static/bootstrap-icons/bag-check-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bag-check.svg b/assets/static/bootstrap-icons/bag-check.svg new file mode 100644 index 0000000..a4e3278 --- /dev/null +++ b/assets/static/bootstrap-icons/bag-check.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bag-dash-fill.svg b/assets/static/bootstrap-icons/bag-dash-fill.svg new file mode 100644 index 0000000..ccb5589 --- /dev/null +++ b/assets/static/bootstrap-icons/bag-dash-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bag-dash.svg b/assets/static/bootstrap-icons/bag-dash.svg new file mode 100644 index 0000000..0997f33 --- /dev/null +++ b/assets/static/bootstrap-icons/bag-dash.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bag-fill.svg b/assets/static/bootstrap-icons/bag-fill.svg new file mode 100644 index 0000000..812fcfc --- /dev/null +++ b/assets/static/bootstrap-icons/bag-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bag-heart-fill.svg b/assets/static/bootstrap-icons/bag-heart-fill.svg new file mode 100644 index 0000000..4938b83 --- /dev/null +++ b/assets/static/bootstrap-icons/bag-heart-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bag-heart.svg b/assets/static/bootstrap-icons/bag-heart.svg new file mode 100644 index 0000000..e7b906a --- /dev/null +++ b/assets/static/bootstrap-icons/bag-heart.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bag-plus-fill.svg b/assets/static/bootstrap-icons/bag-plus-fill.svg new file mode 100644 index 0000000..b98f6b2 --- /dev/null +++ b/assets/static/bootstrap-icons/bag-plus-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bag-plus.svg b/assets/static/bootstrap-icons/bag-plus.svg new file mode 100644 index 0000000..0d7ddc6 --- /dev/null +++ b/assets/static/bootstrap-icons/bag-plus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bag-x-fill.svg b/assets/static/bootstrap-icons/bag-x-fill.svg new file mode 100644 index 0000000..cbe77df --- /dev/null +++ b/assets/static/bootstrap-icons/bag-x-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bag-x.svg b/assets/static/bootstrap-icons/bag-x.svg new file mode 100644 index 0000000..4f38008 --- /dev/null +++ b/assets/static/bootstrap-icons/bag-x.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bag.svg b/assets/static/bootstrap-icons/bag.svg new file mode 100644 index 0000000..acd0287 --- /dev/null +++ b/assets/static/bootstrap-icons/bag.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/balloon-fill.svg b/assets/static/bootstrap-icons/balloon-fill.svg new file mode 100644 index 0000000..2d57e2d --- /dev/null +++ b/assets/static/bootstrap-icons/balloon-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/balloon-heart-fill.svg b/assets/static/bootstrap-icons/balloon-heart-fill.svg new file mode 100644 index 0000000..ab17865 --- /dev/null +++ b/assets/static/bootstrap-icons/balloon-heart-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/balloon-heart.svg b/assets/static/bootstrap-icons/balloon-heart.svg new file mode 100644 index 0000000..0e056cb --- /dev/null +++ b/assets/static/bootstrap-icons/balloon-heart.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/balloon.svg b/assets/static/bootstrap-icons/balloon.svg new file mode 100644 index 0000000..6906cb3 --- /dev/null +++ b/assets/static/bootstrap-icons/balloon.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/ban-fill.svg b/assets/static/bootstrap-icons/ban-fill.svg new file mode 100644 index 0000000..0bb7df0 --- /dev/null +++ b/assets/static/bootstrap-icons/ban-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/ban.svg b/assets/static/bootstrap-icons/ban.svg new file mode 100644 index 0000000..5acfd41 --- /dev/null +++ b/assets/static/bootstrap-icons/ban.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bandaid-fill.svg b/assets/static/bootstrap-icons/bandaid-fill.svg new file mode 100644 index 0000000..052ad73 --- /dev/null +++ b/assets/static/bootstrap-icons/bandaid-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bandaid.svg b/assets/static/bootstrap-icons/bandaid.svg new file mode 100644 index 0000000..e09850e --- /dev/null +++ b/assets/static/bootstrap-icons/bandaid.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bank.svg b/assets/static/bootstrap-icons/bank.svg new file mode 100644 index 0000000..2e7f4f0 --- /dev/null +++ b/assets/static/bootstrap-icons/bank.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bank2.svg b/assets/static/bootstrap-icons/bank2.svg new file mode 100644 index 0000000..acc8ef9 --- /dev/null +++ b/assets/static/bootstrap-icons/bank2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bar-chart-fill.svg b/assets/static/bootstrap-icons/bar-chart-fill.svg new file mode 100644 index 0000000..7e4ebee --- /dev/null +++ b/assets/static/bootstrap-icons/bar-chart-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bar-chart-line-fill.svg b/assets/static/bootstrap-icons/bar-chart-line-fill.svg new file mode 100644 index 0000000..6808e6f --- /dev/null +++ b/assets/static/bootstrap-icons/bar-chart-line-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bar-chart-line.svg b/assets/static/bootstrap-icons/bar-chart-line.svg new file mode 100644 index 0000000..567a808 --- /dev/null +++ b/assets/static/bootstrap-icons/bar-chart-line.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bar-chart-steps.svg b/assets/static/bootstrap-icons/bar-chart-steps.svg new file mode 100644 index 0000000..346e97b --- /dev/null +++ b/assets/static/bootstrap-icons/bar-chart-steps.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bar-chart.svg b/assets/static/bootstrap-icons/bar-chart.svg new file mode 100644 index 0000000..8e57c80 --- /dev/null +++ b/assets/static/bootstrap-icons/bar-chart.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/basket-fill.svg b/assets/static/bootstrap-icons/basket-fill.svg new file mode 100644 index 0000000..b2e01f5 --- /dev/null +++ b/assets/static/bootstrap-icons/basket-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/basket.svg b/assets/static/bootstrap-icons/basket.svg new file mode 100644 index 0000000..418a5f9 --- /dev/null +++ b/assets/static/bootstrap-icons/basket.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/basket2-fill.svg b/assets/static/bootstrap-icons/basket2-fill.svg new file mode 100644 index 0000000..03c7079 --- /dev/null +++ b/assets/static/bootstrap-icons/basket2-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/basket2.svg b/assets/static/bootstrap-icons/basket2.svg new file mode 100644 index 0000000..9b78be2 --- /dev/null +++ b/assets/static/bootstrap-icons/basket2.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/basket3-fill.svg b/assets/static/bootstrap-icons/basket3-fill.svg new file mode 100644 index 0000000..e26f0ee --- /dev/null +++ b/assets/static/bootstrap-icons/basket3-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/basket3.svg b/assets/static/bootstrap-icons/basket3.svg new file mode 100644 index 0000000..57fa6a0 --- /dev/null +++ b/assets/static/bootstrap-icons/basket3.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/battery-charging.svg b/assets/static/bootstrap-icons/battery-charging.svg new file mode 100644 index 0000000..4ae74d2 --- /dev/null +++ b/assets/static/bootstrap-icons/battery-charging.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/battery-full.svg b/assets/static/bootstrap-icons/battery-full.svg new file mode 100644 index 0000000..bff6a3f --- /dev/null +++ b/assets/static/bootstrap-icons/battery-full.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/battery-half.svg b/assets/static/bootstrap-icons/battery-half.svg new file mode 100644 index 0000000..de57848 --- /dev/null +++ b/assets/static/bootstrap-icons/battery-half.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/battery.svg b/assets/static/bootstrap-icons/battery.svg new file mode 100644 index 0000000..2bacfa8 --- /dev/null +++ b/assets/static/bootstrap-icons/battery.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/behance.svg b/assets/static/bootstrap-icons/behance.svg new file mode 100644 index 0000000..805f142 --- /dev/null +++ b/assets/static/bootstrap-icons/behance.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bell-fill.svg b/assets/static/bootstrap-icons/bell-fill.svg new file mode 100644 index 0000000..a537c3a --- /dev/null +++ b/assets/static/bootstrap-icons/bell-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bell-slash-fill.svg b/assets/static/bootstrap-icons/bell-slash-fill.svg new file mode 100644 index 0000000..534dd13 --- /dev/null +++ b/assets/static/bootstrap-icons/bell-slash-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bell-slash.svg b/assets/static/bootstrap-icons/bell-slash.svg new file mode 100644 index 0000000..7817e2b --- /dev/null +++ b/assets/static/bootstrap-icons/bell-slash.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bell.svg b/assets/static/bootstrap-icons/bell.svg new file mode 100644 index 0000000..a71eba3 --- /dev/null +++ b/assets/static/bootstrap-icons/bell.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bezier.svg b/assets/static/bootstrap-icons/bezier.svg new file mode 100644 index 0000000..075b721 --- /dev/null +++ b/assets/static/bootstrap-icons/bezier.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bezier2.svg b/assets/static/bootstrap-icons/bezier2.svg new file mode 100644 index 0000000..8a59238 --- /dev/null +++ b/assets/static/bootstrap-icons/bezier2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bicycle.svg b/assets/static/bootstrap-icons/bicycle.svg new file mode 100644 index 0000000..3956545 --- /dev/null +++ b/assets/static/bootstrap-icons/bicycle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bing.svg b/assets/static/bootstrap-icons/bing.svg new file mode 100644 index 0000000..9368917 --- /dev/null +++ b/assets/static/bootstrap-icons/bing.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/binoculars-fill.svg b/assets/static/bootstrap-icons/binoculars-fill.svg new file mode 100644 index 0000000..d6d6dc0 --- /dev/null +++ b/assets/static/bootstrap-icons/binoculars-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/binoculars.svg b/assets/static/bootstrap-icons/binoculars.svg new file mode 100644 index 0000000..015d622 --- /dev/null +++ b/assets/static/bootstrap-icons/binoculars.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/blockquote-left.svg b/assets/static/bootstrap-icons/blockquote-left.svg new file mode 100644 index 0000000..f8b6b2d --- /dev/null +++ b/assets/static/bootstrap-icons/blockquote-left.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/blockquote-right.svg b/assets/static/bootstrap-icons/blockquote-right.svg new file mode 100644 index 0000000..afc81c9 --- /dev/null +++ b/assets/static/bootstrap-icons/blockquote-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bluetooth.svg b/assets/static/bootstrap-icons/bluetooth.svg new file mode 100644 index 0000000..8726e22 --- /dev/null +++ b/assets/static/bootstrap-icons/bluetooth.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/body-text.svg b/assets/static/bootstrap-icons/body-text.svg new file mode 100644 index 0000000..fd5e435 --- /dev/null +++ b/assets/static/bootstrap-icons/body-text.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/book-fill.svg b/assets/static/bootstrap-icons/book-fill.svg new file mode 100644 index 0000000..ddb0000 --- /dev/null +++ b/assets/static/bootstrap-icons/book-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/book-half.svg b/assets/static/bootstrap-icons/book-half.svg new file mode 100644 index 0000000..8eabe81 --- /dev/null +++ b/assets/static/bootstrap-icons/book-half.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/book.svg b/assets/static/bootstrap-icons/book.svg new file mode 100644 index 0000000..302acf0 --- /dev/null +++ b/assets/static/bootstrap-icons/book.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bookmark-check-fill.svg b/assets/static/bootstrap-icons/bookmark-check-fill.svg new file mode 100644 index 0000000..325fbde --- /dev/null +++ b/assets/static/bootstrap-icons/bookmark-check-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bookmark-check.svg b/assets/static/bootstrap-icons/bookmark-check.svg new file mode 100644 index 0000000..f4c9149 --- /dev/null +++ b/assets/static/bootstrap-icons/bookmark-check.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bookmark-dash-fill.svg b/assets/static/bootstrap-icons/bookmark-dash-fill.svg new file mode 100644 index 0000000..dbf9cc1 --- /dev/null +++ b/assets/static/bootstrap-icons/bookmark-dash-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bookmark-dash.svg b/assets/static/bootstrap-icons/bookmark-dash.svg new file mode 100644 index 0000000..115b448 --- /dev/null +++ b/assets/static/bootstrap-icons/bookmark-dash.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bookmark-fill.svg b/assets/static/bootstrap-icons/bookmark-fill.svg new file mode 100644 index 0000000..3c237a9 --- /dev/null +++ b/assets/static/bootstrap-icons/bookmark-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bookmark-heart-fill.svg b/assets/static/bootstrap-icons/bookmark-heart-fill.svg new file mode 100644 index 0000000..6647b7c --- /dev/null +++ b/assets/static/bootstrap-icons/bookmark-heart-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bookmark-heart.svg b/assets/static/bootstrap-icons/bookmark-heart.svg new file mode 100644 index 0000000..c368f5d --- /dev/null +++ b/assets/static/bootstrap-icons/bookmark-heart.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bookmark-plus-fill.svg b/assets/static/bootstrap-icons/bookmark-plus-fill.svg new file mode 100644 index 0000000..41e0733 --- /dev/null +++ b/assets/static/bootstrap-icons/bookmark-plus-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bookmark-plus.svg b/assets/static/bootstrap-icons/bookmark-plus.svg new file mode 100644 index 0000000..37b137c --- /dev/null +++ b/assets/static/bootstrap-icons/bookmark-plus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bookmark-star-fill.svg b/assets/static/bootstrap-icons/bookmark-star-fill.svg new file mode 100644 index 0000000..89fd335 --- /dev/null +++ b/assets/static/bootstrap-icons/bookmark-star-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bookmark-star.svg b/assets/static/bootstrap-icons/bookmark-star.svg new file mode 100644 index 0000000..2f792de --- /dev/null +++ b/assets/static/bootstrap-icons/bookmark-star.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bookmark-x-fill.svg b/assets/static/bootstrap-icons/bookmark-x-fill.svg new file mode 100644 index 0000000..acac0cf --- /dev/null +++ b/assets/static/bootstrap-icons/bookmark-x-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bookmark-x.svg b/assets/static/bootstrap-icons/bookmark-x.svg new file mode 100644 index 0000000..eb85c76 --- /dev/null +++ b/assets/static/bootstrap-icons/bookmark-x.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bookmark.svg b/assets/static/bootstrap-icons/bookmark.svg new file mode 100644 index 0000000..a21b14b --- /dev/null +++ b/assets/static/bootstrap-icons/bookmark.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bookmarks-fill.svg b/assets/static/bootstrap-icons/bookmarks-fill.svg new file mode 100644 index 0000000..abf5800 --- /dev/null +++ b/assets/static/bootstrap-icons/bookmarks-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bookmarks.svg b/assets/static/bootstrap-icons/bookmarks.svg new file mode 100644 index 0000000..ceb92bb --- /dev/null +++ b/assets/static/bootstrap-icons/bookmarks.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bookshelf.svg b/assets/static/bootstrap-icons/bookshelf.svg new file mode 100644 index 0000000..7f435d5 --- /dev/null +++ b/assets/static/bootstrap-icons/bookshelf.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/boombox-fill.svg b/assets/static/bootstrap-icons/boombox-fill.svg new file mode 100644 index 0000000..299e95e --- /dev/null +++ b/assets/static/bootstrap-icons/boombox-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/boombox.svg b/assets/static/bootstrap-icons/boombox.svg new file mode 100644 index 0000000..35af807 --- /dev/null +++ b/assets/static/bootstrap-icons/boombox.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bootstrap-fill.svg b/assets/static/bootstrap-icons/bootstrap-fill.svg new file mode 100644 index 0000000..21253b0 --- /dev/null +++ b/assets/static/bootstrap-icons/bootstrap-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bootstrap-icons.svg b/assets/static/bootstrap-icons/bootstrap-icons.svg new file mode 100644 index 0000000..b7d55a8 --- /dev/null +++ b/assets/static/bootstrap-icons/bootstrap-icons.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bootstrap-reboot.svg b/assets/static/bootstrap-icons/bootstrap-reboot.svg new file mode 100644 index 0000000..8d21030 --- /dev/null +++ b/assets/static/bootstrap-icons/bootstrap-reboot.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bootstrap.svg b/assets/static/bootstrap-icons/bootstrap.svg new file mode 100644 index 0000000..089e31f --- /dev/null +++ b/assets/static/bootstrap-icons/bootstrap.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/border-all.svg b/assets/static/bootstrap-icons/border-all.svg new file mode 100644 index 0000000..19128f2 --- /dev/null +++ b/assets/static/bootstrap-icons/border-all.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/border-bottom.svg b/assets/static/bootstrap-icons/border-bottom.svg new file mode 100644 index 0000000..84edcca --- /dev/null +++ b/assets/static/bootstrap-icons/border-bottom.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/border-center.svg b/assets/static/bootstrap-icons/border-center.svg new file mode 100644 index 0000000..a9cf9c4 --- /dev/null +++ b/assets/static/bootstrap-icons/border-center.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/border-inner.svg b/assets/static/bootstrap-icons/border-inner.svg new file mode 100644 index 0000000..6369007 --- /dev/null +++ b/assets/static/bootstrap-icons/border-inner.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/border-left.svg b/assets/static/bootstrap-icons/border-left.svg new file mode 100644 index 0000000..483c804 --- /dev/null +++ b/assets/static/bootstrap-icons/border-left.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/border-middle.svg b/assets/static/bootstrap-icons/border-middle.svg new file mode 100644 index 0000000..c9de407 --- /dev/null +++ b/assets/static/bootstrap-icons/border-middle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/border-outer.svg b/assets/static/bootstrap-icons/border-outer.svg new file mode 100644 index 0000000..4791bcb --- /dev/null +++ b/assets/static/bootstrap-icons/border-outer.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/border-right.svg b/assets/static/bootstrap-icons/border-right.svg new file mode 100644 index 0000000..23e09dc --- /dev/null +++ b/assets/static/bootstrap-icons/border-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/border-style.svg b/assets/static/bootstrap-icons/border-style.svg new file mode 100644 index 0000000..cec3fef --- /dev/null +++ b/assets/static/bootstrap-icons/border-style.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/border-top.svg b/assets/static/bootstrap-icons/border-top.svg new file mode 100644 index 0000000..77189df --- /dev/null +++ b/assets/static/bootstrap-icons/border-top.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/border-width.svg b/assets/static/bootstrap-icons/border-width.svg new file mode 100644 index 0000000..6175326 --- /dev/null +++ b/assets/static/bootstrap-icons/border-width.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/border.svg b/assets/static/bootstrap-icons/border.svg new file mode 100644 index 0000000..a6390f9 --- /dev/null +++ b/assets/static/bootstrap-icons/border.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bounding-box-circles.svg b/assets/static/bootstrap-icons/bounding-box-circles.svg new file mode 100644 index 0000000..02113ba --- /dev/null +++ b/assets/static/bootstrap-icons/bounding-box-circles.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bounding-box.svg b/assets/static/bootstrap-icons/bounding-box.svg new file mode 100644 index 0000000..e8be147 --- /dev/null +++ b/assets/static/bootstrap-icons/bounding-box.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box-arrow-down-left.svg b/assets/static/bootstrap-icons/box-arrow-down-left.svg new file mode 100644 index 0000000..20ffed9 --- /dev/null +++ b/assets/static/bootstrap-icons/box-arrow-down-left.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box-arrow-down-right.svg b/assets/static/bootstrap-icons/box-arrow-down-right.svg new file mode 100644 index 0000000..33780ef --- /dev/null +++ b/assets/static/bootstrap-icons/box-arrow-down-right.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box-arrow-down.svg b/assets/static/bootstrap-icons/box-arrow-down.svg new file mode 100644 index 0000000..bf33d51 --- /dev/null +++ b/assets/static/bootstrap-icons/box-arrow-down.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box-arrow-in-down-left.svg b/assets/static/bootstrap-icons/box-arrow-in-down-left.svg new file mode 100644 index 0000000..fe3c579 --- /dev/null +++ b/assets/static/bootstrap-icons/box-arrow-in-down-left.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box-arrow-in-down-right.svg b/assets/static/bootstrap-icons/box-arrow-in-down-right.svg new file mode 100644 index 0000000..07082eb --- /dev/null +++ b/assets/static/bootstrap-icons/box-arrow-in-down-right.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box-arrow-in-down.svg b/assets/static/bootstrap-icons/box-arrow-in-down.svg new file mode 100644 index 0000000..3b185d6 --- /dev/null +++ b/assets/static/bootstrap-icons/box-arrow-in-down.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box-arrow-in-left.svg b/assets/static/bootstrap-icons/box-arrow-in-left.svg new file mode 100644 index 0000000..1e1bc9a --- /dev/null +++ b/assets/static/bootstrap-icons/box-arrow-in-left.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box-arrow-in-right.svg b/assets/static/bootstrap-icons/box-arrow-in-right.svg new file mode 100644 index 0000000..5d78def --- /dev/null +++ b/assets/static/bootstrap-icons/box-arrow-in-right.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box-arrow-in-up-left.svg b/assets/static/bootstrap-icons/box-arrow-in-up-left.svg new file mode 100644 index 0000000..8401c43 --- /dev/null +++ b/assets/static/bootstrap-icons/box-arrow-in-up-left.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box-arrow-in-up-right.svg b/assets/static/bootstrap-icons/box-arrow-in-up-right.svg new file mode 100644 index 0000000..8a95e00 --- /dev/null +++ b/assets/static/bootstrap-icons/box-arrow-in-up-right.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box-arrow-in-up.svg b/assets/static/bootstrap-icons/box-arrow-in-up.svg new file mode 100644 index 0000000..6197bc3 --- /dev/null +++ b/assets/static/bootstrap-icons/box-arrow-in-up.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box-arrow-left.svg b/assets/static/bootstrap-icons/box-arrow-left.svg new file mode 100644 index 0000000..5d142b4 --- /dev/null +++ b/assets/static/bootstrap-icons/box-arrow-left.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box-arrow-right.svg b/assets/static/bootstrap-icons/box-arrow-right.svg new file mode 100644 index 0000000..682e033 --- /dev/null +++ b/assets/static/bootstrap-icons/box-arrow-right.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box-arrow-up-left.svg b/assets/static/bootstrap-icons/box-arrow-up-left.svg new file mode 100644 index 0000000..7dec12d --- /dev/null +++ b/assets/static/bootstrap-icons/box-arrow-up-left.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box-arrow-up-right.svg b/assets/static/bootstrap-icons/box-arrow-up-right.svg new file mode 100644 index 0000000..03f68d5 --- /dev/null +++ b/assets/static/bootstrap-icons/box-arrow-up-right.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box-arrow-up.svg b/assets/static/bootstrap-icons/box-arrow-up.svg new file mode 100644 index 0000000..8f76892 --- /dev/null +++ b/assets/static/bootstrap-icons/box-arrow-up.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box-fill.svg b/assets/static/bootstrap-icons/box-fill.svg new file mode 100644 index 0000000..b1fe407 --- /dev/null +++ b/assets/static/bootstrap-icons/box-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box-seam-fill.svg b/assets/static/bootstrap-icons/box-seam-fill.svg new file mode 100644 index 0000000..b9283c7 --- /dev/null +++ b/assets/static/bootstrap-icons/box-seam-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box-seam.svg b/assets/static/bootstrap-icons/box-seam.svg new file mode 100644 index 0000000..ec2cb8a --- /dev/null +++ b/assets/static/bootstrap-icons/box-seam.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box.svg b/assets/static/bootstrap-icons/box.svg new file mode 100644 index 0000000..01b34c7 --- /dev/null +++ b/assets/static/bootstrap-icons/box.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box2-fill.svg b/assets/static/bootstrap-icons/box2-fill.svg new file mode 100644 index 0000000..78e7583 --- /dev/null +++ b/assets/static/bootstrap-icons/box2-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box2-heart-fill.svg b/assets/static/bootstrap-icons/box2-heart-fill.svg new file mode 100644 index 0000000..49da486 --- /dev/null +++ b/assets/static/bootstrap-icons/box2-heart-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box2-heart.svg b/assets/static/bootstrap-icons/box2-heart.svg new file mode 100644 index 0000000..a5e413a --- /dev/null +++ b/assets/static/bootstrap-icons/box2-heart.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/box2.svg b/assets/static/bootstrap-icons/box2.svg new file mode 100644 index 0000000..bfeb554 --- /dev/null +++ b/assets/static/bootstrap-icons/box2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/boxes.svg b/assets/static/bootstrap-icons/boxes.svg new file mode 100644 index 0000000..af0d1d0 --- /dev/null +++ b/assets/static/bootstrap-icons/boxes.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/braces-asterisk.svg b/assets/static/bootstrap-icons/braces-asterisk.svg new file mode 100644 index 0000000..e159e9c --- /dev/null +++ b/assets/static/bootstrap-icons/braces-asterisk.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/braces.svg b/assets/static/bootstrap-icons/braces.svg new file mode 100644 index 0000000..d345d3b --- /dev/null +++ b/assets/static/bootstrap-icons/braces.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bricks.svg b/assets/static/bootstrap-icons/bricks.svg new file mode 100644 index 0000000..23c2c36 --- /dev/null +++ b/assets/static/bootstrap-icons/bricks.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/briefcase-fill.svg b/assets/static/bootstrap-icons/briefcase-fill.svg new file mode 100644 index 0000000..b37f2be --- /dev/null +++ b/assets/static/bootstrap-icons/briefcase-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/briefcase.svg b/assets/static/bootstrap-icons/briefcase.svg new file mode 100644 index 0000000..712998d --- /dev/null +++ b/assets/static/bootstrap-icons/briefcase.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/brightness-alt-high-fill.svg b/assets/static/bootstrap-icons/brightness-alt-high-fill.svg new file mode 100644 index 0000000..06f7d0c --- /dev/null +++ b/assets/static/bootstrap-icons/brightness-alt-high-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/brightness-alt-high.svg b/assets/static/bootstrap-icons/brightness-alt-high.svg new file mode 100644 index 0000000..e519ca7 --- /dev/null +++ b/assets/static/bootstrap-icons/brightness-alt-high.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/brightness-alt-low-fill.svg b/assets/static/bootstrap-icons/brightness-alt-low-fill.svg new file mode 100644 index 0000000..ab30837 --- /dev/null +++ b/assets/static/bootstrap-icons/brightness-alt-low-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/brightness-alt-low.svg b/assets/static/bootstrap-icons/brightness-alt-low.svg new file mode 100644 index 0000000..58bf6ed --- /dev/null +++ b/assets/static/bootstrap-icons/brightness-alt-low.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/brightness-high-fill.svg b/assets/static/bootstrap-icons/brightness-high-fill.svg new file mode 100644 index 0000000..b759b04 --- /dev/null +++ b/assets/static/bootstrap-icons/brightness-high-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/brightness-high.svg b/assets/static/bootstrap-icons/brightness-high.svg new file mode 100644 index 0000000..f00d050 --- /dev/null +++ b/assets/static/bootstrap-icons/brightness-high.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/brightness-low-fill.svg b/assets/static/bootstrap-icons/brightness-low-fill.svg new file mode 100644 index 0000000..fc55680 --- /dev/null +++ b/assets/static/bootstrap-icons/brightness-low-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/brightness-low.svg b/assets/static/bootstrap-icons/brightness-low.svg new file mode 100644 index 0000000..317918e --- /dev/null +++ b/assets/static/bootstrap-icons/brightness-low.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/brilliance.svg b/assets/static/bootstrap-icons/brilliance.svg new file mode 100644 index 0000000..f6b5da6 --- /dev/null +++ b/assets/static/bootstrap-icons/brilliance.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/broadcast-pin.svg b/assets/static/bootstrap-icons/broadcast-pin.svg new file mode 100644 index 0000000..9c5f4a6 --- /dev/null +++ b/assets/static/bootstrap-icons/broadcast-pin.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/broadcast.svg b/assets/static/bootstrap-icons/broadcast.svg new file mode 100644 index 0000000..b420a0b --- /dev/null +++ b/assets/static/bootstrap-icons/broadcast.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/browser-chrome.svg b/assets/static/bootstrap-icons/browser-chrome.svg new file mode 100644 index 0000000..63c344b --- /dev/null +++ b/assets/static/bootstrap-icons/browser-chrome.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/browser-edge.svg b/assets/static/bootstrap-icons/browser-edge.svg new file mode 100644 index 0000000..ed1dc7c --- /dev/null +++ b/assets/static/bootstrap-icons/browser-edge.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/browser-firefox.svg b/assets/static/bootstrap-icons/browser-firefox.svg new file mode 100644 index 0000000..ce0eabb --- /dev/null +++ b/assets/static/bootstrap-icons/browser-firefox.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/browser-safari.svg b/assets/static/bootstrap-icons/browser-safari.svg new file mode 100644 index 0000000..8c01296 --- /dev/null +++ b/assets/static/bootstrap-icons/browser-safari.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/brush-fill.svg b/assets/static/bootstrap-icons/brush-fill.svg new file mode 100644 index 0000000..db77615 --- /dev/null +++ b/assets/static/bootstrap-icons/brush-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/brush.svg b/assets/static/bootstrap-icons/brush.svg new file mode 100644 index 0000000..86d88ef --- /dev/null +++ b/assets/static/bootstrap-icons/brush.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bucket-fill.svg b/assets/static/bootstrap-icons/bucket-fill.svg new file mode 100644 index 0000000..c0c95ab --- /dev/null +++ b/assets/static/bootstrap-icons/bucket-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bucket.svg b/assets/static/bootstrap-icons/bucket.svg new file mode 100644 index 0000000..252e75b --- /dev/null +++ b/assets/static/bootstrap-icons/bucket.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bug-fill.svg b/assets/static/bootstrap-icons/bug-fill.svg new file mode 100644 index 0000000..a36ff37 --- /dev/null +++ b/assets/static/bootstrap-icons/bug-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bug.svg b/assets/static/bootstrap-icons/bug.svg new file mode 100644 index 0000000..296ef32 --- /dev/null +++ b/assets/static/bootstrap-icons/bug.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/building-add.svg b/assets/static/bootstrap-icons/building-add.svg new file mode 100644 index 0000000..c2c3670 --- /dev/null +++ b/assets/static/bootstrap-icons/building-add.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/building-check.svg b/assets/static/bootstrap-icons/building-check.svg new file mode 100644 index 0000000..95c3c54 --- /dev/null +++ b/assets/static/bootstrap-icons/building-check.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/building-dash.svg b/assets/static/bootstrap-icons/building-dash.svg new file mode 100644 index 0000000..1e1634b --- /dev/null +++ b/assets/static/bootstrap-icons/building-dash.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/building-down.svg b/assets/static/bootstrap-icons/building-down.svg new file mode 100644 index 0000000..8538cf6 --- /dev/null +++ b/assets/static/bootstrap-icons/building-down.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/building-exclamation.svg b/assets/static/bootstrap-icons/building-exclamation.svg new file mode 100644 index 0000000..ebfc709 --- /dev/null +++ b/assets/static/bootstrap-icons/building-exclamation.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/building-fill-add.svg b/assets/static/bootstrap-icons/building-fill-add.svg new file mode 100644 index 0000000..6bbe567 --- /dev/null +++ b/assets/static/bootstrap-icons/building-fill-add.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/building-fill-check.svg b/assets/static/bootstrap-icons/building-fill-check.svg new file mode 100644 index 0000000..c4f1881 --- /dev/null +++ b/assets/static/bootstrap-icons/building-fill-check.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/building-fill-dash.svg b/assets/static/bootstrap-icons/building-fill-dash.svg new file mode 100644 index 0000000..1ce28a6 --- /dev/null +++ b/assets/static/bootstrap-icons/building-fill-dash.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/building-fill-down.svg b/assets/static/bootstrap-icons/building-fill-down.svg new file mode 100644 index 0000000..b1c55cd --- /dev/null +++ b/assets/static/bootstrap-icons/building-fill-down.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/building-fill-exclamation.svg b/assets/static/bootstrap-icons/building-fill-exclamation.svg new file mode 100644 index 0000000..3491f24 --- /dev/null +++ b/assets/static/bootstrap-icons/building-fill-exclamation.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/building-fill-gear.svg b/assets/static/bootstrap-icons/building-fill-gear.svg new file mode 100644 index 0000000..747a1bc --- /dev/null +++ b/assets/static/bootstrap-icons/building-fill-gear.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/building-fill-lock.svg b/assets/static/bootstrap-icons/building-fill-lock.svg new file mode 100644 index 0000000..be73a41 --- /dev/null +++ b/assets/static/bootstrap-icons/building-fill-lock.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/building-fill-slash.svg b/assets/static/bootstrap-icons/building-fill-slash.svg new file mode 100644 index 0000000..d867309 --- /dev/null +++ b/assets/static/bootstrap-icons/building-fill-slash.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/building-fill-up.svg b/assets/static/bootstrap-icons/building-fill-up.svg new file mode 100644 index 0000000..d8cc4bc --- /dev/null +++ b/assets/static/bootstrap-icons/building-fill-up.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/building-fill-x.svg b/assets/static/bootstrap-icons/building-fill-x.svg new file mode 100644 index 0000000..236aae3 --- /dev/null +++ b/assets/static/bootstrap-icons/building-fill-x.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/building-fill.svg b/assets/static/bootstrap-icons/building-fill.svg new file mode 100644 index 0000000..6924b41 --- /dev/null +++ b/assets/static/bootstrap-icons/building-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/building-gear.svg b/assets/static/bootstrap-icons/building-gear.svg new file mode 100644 index 0000000..eabe790 --- /dev/null +++ b/assets/static/bootstrap-icons/building-gear.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/building-lock.svg b/assets/static/bootstrap-icons/building-lock.svg new file mode 100644 index 0000000..591a2e9 --- /dev/null +++ b/assets/static/bootstrap-icons/building-lock.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/building-slash.svg b/assets/static/bootstrap-icons/building-slash.svg new file mode 100644 index 0000000..c3f7787 --- /dev/null +++ b/assets/static/bootstrap-icons/building-slash.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/building-up.svg b/assets/static/bootstrap-icons/building-up.svg new file mode 100644 index 0000000..ff2d5d9 --- /dev/null +++ b/assets/static/bootstrap-icons/building-up.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/building-x.svg b/assets/static/bootstrap-icons/building-x.svg new file mode 100644 index 0000000..70e67a3 --- /dev/null +++ b/assets/static/bootstrap-icons/building-x.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/building.svg b/assets/static/bootstrap-icons/building.svg new file mode 100644 index 0000000..916b049 --- /dev/null +++ b/assets/static/bootstrap-icons/building.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/buildings-fill.svg b/assets/static/bootstrap-icons/buildings-fill.svg new file mode 100644 index 0000000..6aea68d --- /dev/null +++ b/assets/static/bootstrap-icons/buildings-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/buildings.svg b/assets/static/bootstrap-icons/buildings.svg new file mode 100644 index 0000000..3028498 --- /dev/null +++ b/assets/static/bootstrap-icons/buildings.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bullseye.svg b/assets/static/bootstrap-icons/bullseye.svg new file mode 100644 index 0000000..16c2207 --- /dev/null +++ b/assets/static/bootstrap-icons/bullseye.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bus-front-fill.svg b/assets/static/bootstrap-icons/bus-front-fill.svg new file mode 100644 index 0000000..de21228 --- /dev/null +++ b/assets/static/bootstrap-icons/bus-front-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/bus-front.svg b/assets/static/bootstrap-icons/bus-front.svg new file mode 100644 index 0000000..95c5df5 --- /dev/null +++ b/assets/static/bootstrap-icons/bus-front.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/c-circle-fill.svg b/assets/static/bootstrap-icons/c-circle-fill.svg new file mode 100644 index 0000000..c0adc18 --- /dev/null +++ b/assets/static/bootstrap-icons/c-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/c-circle.svg b/assets/static/bootstrap-icons/c-circle.svg new file mode 100644 index 0000000..ac3dfac --- /dev/null +++ b/assets/static/bootstrap-icons/c-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/c-square-fill.svg b/assets/static/bootstrap-icons/c-square-fill.svg new file mode 100644 index 0000000..b26a27e --- /dev/null +++ b/assets/static/bootstrap-icons/c-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/c-square.svg b/assets/static/bootstrap-icons/c-square.svg new file mode 100644 index 0000000..cdd74a3 --- /dev/null +++ b/assets/static/bootstrap-icons/c-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cake-fill.svg b/assets/static/bootstrap-icons/cake-fill.svg new file mode 100644 index 0000000..4370e02 --- /dev/null +++ b/assets/static/bootstrap-icons/cake-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cake.svg b/assets/static/bootstrap-icons/cake.svg new file mode 100644 index 0000000..500747b --- /dev/null +++ b/assets/static/bootstrap-icons/cake.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cake2-fill.svg b/assets/static/bootstrap-icons/cake2-fill.svg new file mode 100644 index 0000000..1ed25f7 --- /dev/null +++ b/assets/static/bootstrap-icons/cake2-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cake2.svg b/assets/static/bootstrap-icons/cake2.svg new file mode 100644 index 0000000..a10dc80 --- /dev/null +++ b/assets/static/bootstrap-icons/cake2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calculator-fill.svg b/assets/static/bootstrap-icons/calculator-fill.svg new file mode 100644 index 0000000..2933419 --- /dev/null +++ b/assets/static/bootstrap-icons/calculator-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calculator.svg b/assets/static/bootstrap-icons/calculator.svg new file mode 100644 index 0000000..cc9761e --- /dev/null +++ b/assets/static/bootstrap-icons/calculator.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar-check-fill.svg b/assets/static/bootstrap-icons/calendar-check-fill.svg new file mode 100644 index 0000000..967d182 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar-check-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar-check.svg b/assets/static/bootstrap-icons/calendar-check.svg new file mode 100644 index 0000000..f778cd2 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar-check.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar-date-fill.svg b/assets/static/bootstrap-icons/calendar-date-fill.svg new file mode 100644 index 0000000..59b31f2 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar-date-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar-date.svg b/assets/static/bootstrap-icons/calendar-date.svg new file mode 100644 index 0000000..b73c8f5 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar-date.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar-day-fill.svg b/assets/static/bootstrap-icons/calendar-day-fill.svg new file mode 100644 index 0000000..b9bcbf8 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar-day-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar-day.svg b/assets/static/bootstrap-icons/calendar-day.svg new file mode 100644 index 0000000..6f8d871 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar-day.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar-event-fill.svg b/assets/static/bootstrap-icons/calendar-event-fill.svg new file mode 100644 index 0000000..5b09eea --- /dev/null +++ b/assets/static/bootstrap-icons/calendar-event-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar-event.svg b/assets/static/bootstrap-icons/calendar-event.svg new file mode 100644 index 0000000..57c734b --- /dev/null +++ b/assets/static/bootstrap-icons/calendar-event.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar-fill.svg b/assets/static/bootstrap-icons/calendar-fill.svg new file mode 100644 index 0000000..789eb8b --- /dev/null +++ b/assets/static/bootstrap-icons/calendar-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar-heart-fill.svg b/assets/static/bootstrap-icons/calendar-heart-fill.svg new file mode 100644 index 0000000..63d9e4c --- /dev/null +++ b/assets/static/bootstrap-icons/calendar-heart-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar-heart.svg b/assets/static/bootstrap-icons/calendar-heart.svg new file mode 100644 index 0000000..8ed9c38 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar-heart.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar-minus-fill.svg b/assets/static/bootstrap-icons/calendar-minus-fill.svg new file mode 100644 index 0000000..8dad6e1 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar-minus-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar-minus.svg b/assets/static/bootstrap-icons/calendar-minus.svg new file mode 100644 index 0000000..ecd4e97 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar-minus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar-month-fill.svg b/assets/static/bootstrap-icons/calendar-month-fill.svg new file mode 100644 index 0000000..d8d56fe --- /dev/null +++ b/assets/static/bootstrap-icons/calendar-month-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar-month.svg b/assets/static/bootstrap-icons/calendar-month.svg new file mode 100644 index 0000000..95b6419 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar-month.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar-plus-fill.svg b/assets/static/bootstrap-icons/calendar-plus-fill.svg new file mode 100644 index 0000000..0ed0c83 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar-plus-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar-plus.svg b/assets/static/bootstrap-icons/calendar-plus.svg new file mode 100644 index 0000000..189b152 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar-plus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar-range-fill.svg b/assets/static/bootstrap-icons/calendar-range-fill.svg new file mode 100644 index 0000000..324def0 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar-range-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar-range.svg b/assets/static/bootstrap-icons/calendar-range.svg new file mode 100644 index 0000000..7db0947 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar-range.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar-week-fill.svg b/assets/static/bootstrap-icons/calendar-week-fill.svg new file mode 100644 index 0000000..ab2128d --- /dev/null +++ b/assets/static/bootstrap-icons/calendar-week-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar-week.svg b/assets/static/bootstrap-icons/calendar-week.svg new file mode 100644 index 0000000..b5dbcc9 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar-week.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar-x-fill.svg b/assets/static/bootstrap-icons/calendar-x-fill.svg new file mode 100644 index 0000000..450e114 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar-x-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar-x.svg b/assets/static/bootstrap-icons/calendar-x.svg new file mode 100644 index 0000000..dc85a91 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar-x.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar.svg b/assets/static/bootstrap-icons/calendar.svg new file mode 100644 index 0000000..d32ebe7 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2-check-fill.svg b/assets/static/bootstrap-icons/calendar2-check-fill.svg new file mode 100644 index 0000000..a0c36c5 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2-check-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2-check.svg b/assets/static/bootstrap-icons/calendar2-check.svg new file mode 100644 index 0000000..5429842 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2-check.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2-date-fill.svg b/assets/static/bootstrap-icons/calendar2-date-fill.svg new file mode 100644 index 0000000..93b3941 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2-date-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2-date.svg b/assets/static/bootstrap-icons/calendar2-date.svg new file mode 100644 index 0000000..61193cd --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2-date.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2-day-fill.svg b/assets/static/bootstrap-icons/calendar2-day-fill.svg new file mode 100644 index 0000000..b605453 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2-day-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2-day.svg b/assets/static/bootstrap-icons/calendar2-day.svg new file mode 100644 index 0000000..ce59878 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2-day.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2-event-fill.svg b/assets/static/bootstrap-icons/calendar2-event-fill.svg new file mode 100644 index 0000000..2b245d1 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2-event-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2-event.svg b/assets/static/bootstrap-icons/calendar2-event.svg new file mode 100644 index 0000000..36910dd --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2-event.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2-fill.svg b/assets/static/bootstrap-icons/calendar2-fill.svg new file mode 100644 index 0000000..b28e594 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2-heart-fill.svg b/assets/static/bootstrap-icons/calendar2-heart-fill.svg new file mode 100644 index 0000000..f3723cd --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2-heart-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2-heart.svg b/assets/static/bootstrap-icons/calendar2-heart.svg new file mode 100644 index 0000000..995d9b8 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2-heart.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2-minus-fill.svg b/assets/static/bootstrap-icons/calendar2-minus-fill.svg new file mode 100644 index 0000000..bf52a36 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2-minus-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2-minus.svg b/assets/static/bootstrap-icons/calendar2-minus.svg new file mode 100644 index 0000000..62e6bbc --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2-minus.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2-month-fill.svg b/assets/static/bootstrap-icons/calendar2-month-fill.svg new file mode 100644 index 0000000..24b9c69 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2-month-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2-month.svg b/assets/static/bootstrap-icons/calendar2-month.svg new file mode 100644 index 0000000..65d8295 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2-month.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2-plus-fill.svg b/assets/static/bootstrap-icons/calendar2-plus-fill.svg new file mode 100644 index 0000000..26a2047 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2-plus-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2-plus.svg b/assets/static/bootstrap-icons/calendar2-plus.svg new file mode 100644 index 0000000..728148f --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2-plus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2-range-fill.svg b/assets/static/bootstrap-icons/calendar2-range-fill.svg new file mode 100644 index 0000000..1ba46b6 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2-range-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2-range.svg b/assets/static/bootstrap-icons/calendar2-range.svg new file mode 100644 index 0000000..9a657f4 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2-range.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2-week-fill.svg b/assets/static/bootstrap-icons/calendar2-week-fill.svg new file mode 100644 index 0000000..f358667 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2-week-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2-week.svg b/assets/static/bootstrap-icons/calendar2-week.svg new file mode 100644 index 0000000..07906a9 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2-week.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2-x-fill.svg b/assets/static/bootstrap-icons/calendar2-x-fill.svg new file mode 100644 index 0000000..def799d --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2-x-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2-x.svg b/assets/static/bootstrap-icons/calendar2-x.svg new file mode 100644 index 0000000..d6f9e6f --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2-x.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar2.svg b/assets/static/bootstrap-icons/calendar2.svg new file mode 100644 index 0000000..957f993 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar2.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar3-event-fill.svg b/assets/static/bootstrap-icons/calendar3-event-fill.svg new file mode 100644 index 0000000..d228ccb --- /dev/null +++ b/assets/static/bootstrap-icons/calendar3-event-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar3-event.svg b/assets/static/bootstrap-icons/calendar3-event.svg new file mode 100644 index 0000000..f702c36 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar3-event.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar3-fill.svg b/assets/static/bootstrap-icons/calendar3-fill.svg new file mode 100644 index 0000000..f3bc116 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar3-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar3-range-fill.svg b/assets/static/bootstrap-icons/calendar3-range-fill.svg new file mode 100644 index 0000000..e21d0ee --- /dev/null +++ b/assets/static/bootstrap-icons/calendar3-range-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar3-range.svg b/assets/static/bootstrap-icons/calendar3-range.svg new file mode 100644 index 0000000..c19d9ca --- /dev/null +++ b/assets/static/bootstrap-icons/calendar3-range.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar3-week-fill.svg b/assets/static/bootstrap-icons/calendar3-week-fill.svg new file mode 100644 index 0000000..d828d85 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar3-week-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar3-week.svg b/assets/static/bootstrap-icons/calendar3-week.svg new file mode 100644 index 0000000..6d577b7 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar3-week.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar3.svg b/assets/static/bootstrap-icons/calendar3.svg new file mode 100644 index 0000000..8e2aedf --- /dev/null +++ b/assets/static/bootstrap-icons/calendar3.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar4-event.svg b/assets/static/bootstrap-icons/calendar4-event.svg new file mode 100644 index 0000000..0d29c0c --- /dev/null +++ b/assets/static/bootstrap-icons/calendar4-event.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar4-range.svg b/assets/static/bootstrap-icons/calendar4-range.svg new file mode 100644 index 0000000..b260479 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar4-range.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar4-week.svg b/assets/static/bootstrap-icons/calendar4-week.svg new file mode 100644 index 0000000..d934881 --- /dev/null +++ b/assets/static/bootstrap-icons/calendar4-week.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/calendar4.svg b/assets/static/bootstrap-icons/calendar4.svg new file mode 100644 index 0000000..69c474c --- /dev/null +++ b/assets/static/bootstrap-icons/calendar4.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/camera-fill.svg b/assets/static/bootstrap-icons/camera-fill.svg new file mode 100644 index 0000000..6aa0240 --- /dev/null +++ b/assets/static/bootstrap-icons/camera-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/camera-reels-fill.svg b/assets/static/bootstrap-icons/camera-reels-fill.svg new file mode 100644 index 0000000..6bd48de --- /dev/null +++ b/assets/static/bootstrap-icons/camera-reels-fill.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/camera-reels.svg b/assets/static/bootstrap-icons/camera-reels.svg new file mode 100644 index 0000000..0c6eca8 --- /dev/null +++ b/assets/static/bootstrap-icons/camera-reels.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/camera-video-fill.svg b/assets/static/bootstrap-icons/camera-video-fill.svg new file mode 100644 index 0000000..72dee37 --- /dev/null +++ b/assets/static/bootstrap-icons/camera-video-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/camera-video-off-fill.svg b/assets/static/bootstrap-icons/camera-video-off-fill.svg new file mode 100644 index 0000000..290dc19 --- /dev/null +++ b/assets/static/bootstrap-icons/camera-video-off-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/camera-video-off.svg b/assets/static/bootstrap-icons/camera-video-off.svg new file mode 100644 index 0000000..c9eb587 --- /dev/null +++ b/assets/static/bootstrap-icons/camera-video-off.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/camera-video.svg b/assets/static/bootstrap-icons/camera-video.svg new file mode 100644 index 0000000..a042d1a --- /dev/null +++ b/assets/static/bootstrap-icons/camera-video.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/camera.svg b/assets/static/bootstrap-icons/camera.svg new file mode 100644 index 0000000..3a926d5 --- /dev/null +++ b/assets/static/bootstrap-icons/camera.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/camera2.svg b/assets/static/bootstrap-icons/camera2.svg new file mode 100644 index 0000000..ba9521e --- /dev/null +++ b/assets/static/bootstrap-icons/camera2.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/capslock-fill.svg b/assets/static/bootstrap-icons/capslock-fill.svg new file mode 100644 index 0000000..f1c0bab --- /dev/null +++ b/assets/static/bootstrap-icons/capslock-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/capslock.svg b/assets/static/bootstrap-icons/capslock.svg new file mode 100644 index 0000000..b0b894a --- /dev/null +++ b/assets/static/bootstrap-icons/capslock.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/capsule-pill.svg b/assets/static/bootstrap-icons/capsule-pill.svg new file mode 100644 index 0000000..b9f3b54 --- /dev/null +++ b/assets/static/bootstrap-icons/capsule-pill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/capsule.svg b/assets/static/bootstrap-icons/capsule.svg new file mode 100644 index 0000000..53d1a66 --- /dev/null +++ b/assets/static/bootstrap-icons/capsule.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/car-front-fill.svg b/assets/static/bootstrap-icons/car-front-fill.svg new file mode 100644 index 0000000..a47a870 --- /dev/null +++ b/assets/static/bootstrap-icons/car-front-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/car-front.svg b/assets/static/bootstrap-icons/car-front.svg new file mode 100644 index 0000000..890e4cf --- /dev/null +++ b/assets/static/bootstrap-icons/car-front.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/card-checklist.svg b/assets/static/bootstrap-icons/card-checklist.svg new file mode 100644 index 0000000..3044e68 --- /dev/null +++ b/assets/static/bootstrap-icons/card-checklist.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/card-heading.svg b/assets/static/bootstrap-icons/card-heading.svg new file mode 100644 index 0000000..a6be873 --- /dev/null +++ b/assets/static/bootstrap-icons/card-heading.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/card-image.svg b/assets/static/bootstrap-icons/card-image.svg new file mode 100644 index 0000000..7343f77 --- /dev/null +++ b/assets/static/bootstrap-icons/card-image.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/card-list.svg b/assets/static/bootstrap-icons/card-list.svg new file mode 100644 index 0000000..6270802 --- /dev/null +++ b/assets/static/bootstrap-icons/card-list.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/card-text.svg b/assets/static/bootstrap-icons/card-text.svg new file mode 100644 index 0000000..8f7470c --- /dev/null +++ b/assets/static/bootstrap-icons/card-text.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/caret-down-fill.svg b/assets/static/bootstrap-icons/caret-down-fill.svg new file mode 100644 index 0000000..d7c3990 --- /dev/null +++ b/assets/static/bootstrap-icons/caret-down-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/caret-down-square-fill.svg b/assets/static/bootstrap-icons/caret-down-square-fill.svg new file mode 100644 index 0000000..63199bb --- /dev/null +++ b/assets/static/bootstrap-icons/caret-down-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/caret-down-square.svg b/assets/static/bootstrap-icons/caret-down-square.svg new file mode 100644 index 0000000..0372625 --- /dev/null +++ b/assets/static/bootstrap-icons/caret-down-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/caret-down.svg b/assets/static/bootstrap-icons/caret-down.svg new file mode 100644 index 0000000..627258a --- /dev/null +++ b/assets/static/bootstrap-icons/caret-down.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/caret-left-fill.svg b/assets/static/bootstrap-icons/caret-left-fill.svg new file mode 100644 index 0000000..d989dff --- /dev/null +++ b/assets/static/bootstrap-icons/caret-left-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/caret-left-square-fill.svg b/assets/static/bootstrap-icons/caret-left-square-fill.svg new file mode 100644 index 0000000..cc7e3a8 --- /dev/null +++ b/assets/static/bootstrap-icons/caret-left-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/caret-left-square.svg b/assets/static/bootstrap-icons/caret-left-square.svg new file mode 100644 index 0000000..5e8cb20 --- /dev/null +++ b/assets/static/bootstrap-icons/caret-left-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/caret-left.svg b/assets/static/bootstrap-icons/caret-left.svg new file mode 100644 index 0000000..4415336 --- /dev/null +++ b/assets/static/bootstrap-icons/caret-left.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/caret-right-fill.svg b/assets/static/bootstrap-icons/caret-right-fill.svg new file mode 100644 index 0000000..b445551 --- /dev/null +++ b/assets/static/bootstrap-icons/caret-right-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/caret-right-square-fill.svg b/assets/static/bootstrap-icons/caret-right-square-fill.svg new file mode 100644 index 0000000..2aded36 --- /dev/null +++ b/assets/static/bootstrap-icons/caret-right-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/caret-right-square.svg b/assets/static/bootstrap-icons/caret-right-square.svg new file mode 100644 index 0000000..a3a44e2 --- /dev/null +++ b/assets/static/bootstrap-icons/caret-right-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/caret-right.svg b/assets/static/bootstrap-icons/caret-right.svg new file mode 100644 index 0000000..7bcd8bb --- /dev/null +++ b/assets/static/bootstrap-icons/caret-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/caret-up-fill.svg b/assets/static/bootstrap-icons/caret-up-fill.svg new file mode 100644 index 0000000..a87820e --- /dev/null +++ b/assets/static/bootstrap-icons/caret-up-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/caret-up-square-fill.svg b/assets/static/bootstrap-icons/caret-up-square-fill.svg new file mode 100644 index 0000000..348fcf2 --- /dev/null +++ b/assets/static/bootstrap-icons/caret-up-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/caret-up-square.svg b/assets/static/bootstrap-icons/caret-up-square.svg new file mode 100644 index 0000000..8ac2af4 --- /dev/null +++ b/assets/static/bootstrap-icons/caret-up-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/caret-up.svg b/assets/static/bootstrap-icons/caret-up.svg new file mode 100644 index 0000000..8e33519 --- /dev/null +++ b/assets/static/bootstrap-icons/caret-up.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cart-check-fill.svg b/assets/static/bootstrap-icons/cart-check-fill.svg new file mode 100644 index 0000000..612358c --- /dev/null +++ b/assets/static/bootstrap-icons/cart-check-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cart-check.svg b/assets/static/bootstrap-icons/cart-check.svg new file mode 100644 index 0000000..68301db --- /dev/null +++ b/assets/static/bootstrap-icons/cart-check.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cart-dash-fill.svg b/assets/static/bootstrap-icons/cart-dash-fill.svg new file mode 100644 index 0000000..a335b07 --- /dev/null +++ b/assets/static/bootstrap-icons/cart-dash-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cart-dash.svg b/assets/static/bootstrap-icons/cart-dash.svg new file mode 100644 index 0000000..9c97c3b --- /dev/null +++ b/assets/static/bootstrap-icons/cart-dash.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cart-fill.svg b/assets/static/bootstrap-icons/cart-fill.svg new file mode 100644 index 0000000..974fc29 --- /dev/null +++ b/assets/static/bootstrap-icons/cart-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cart-plus-fill.svg b/assets/static/bootstrap-icons/cart-plus-fill.svg new file mode 100644 index 0000000..59e46e4 --- /dev/null +++ b/assets/static/bootstrap-icons/cart-plus-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cart-plus.svg b/assets/static/bootstrap-icons/cart-plus.svg new file mode 100644 index 0000000..2baaae4 --- /dev/null +++ b/assets/static/bootstrap-icons/cart-plus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cart-x-fill.svg b/assets/static/bootstrap-icons/cart-x-fill.svg new file mode 100644 index 0000000..7ca0688 --- /dev/null +++ b/assets/static/bootstrap-icons/cart-x-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cart-x.svg b/assets/static/bootstrap-icons/cart-x.svg new file mode 100644 index 0000000..2d8f213 --- /dev/null +++ b/assets/static/bootstrap-icons/cart-x.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cart.svg b/assets/static/bootstrap-icons/cart.svg new file mode 100644 index 0000000..0e0f96c --- /dev/null +++ b/assets/static/bootstrap-icons/cart.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cart2.svg b/assets/static/bootstrap-icons/cart2.svg new file mode 100644 index 0000000..ea7f696 --- /dev/null +++ b/assets/static/bootstrap-icons/cart2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cart3.svg b/assets/static/bootstrap-icons/cart3.svg new file mode 100644 index 0000000..af1b3c5 --- /dev/null +++ b/assets/static/bootstrap-icons/cart3.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cart4.svg b/assets/static/bootstrap-icons/cart4.svg new file mode 100644 index 0000000..4631ac9 --- /dev/null +++ b/assets/static/bootstrap-icons/cart4.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cash-coin.svg b/assets/static/bootstrap-icons/cash-coin.svg new file mode 100644 index 0000000..2904f15 --- /dev/null +++ b/assets/static/bootstrap-icons/cash-coin.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cash-stack.svg b/assets/static/bootstrap-icons/cash-stack.svg new file mode 100644 index 0000000..fc8c282 --- /dev/null +++ b/assets/static/bootstrap-icons/cash-stack.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cash.svg b/assets/static/bootstrap-icons/cash.svg new file mode 100644 index 0000000..18cbff3 --- /dev/null +++ b/assets/static/bootstrap-icons/cash.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cassette-fill.svg b/assets/static/bootstrap-icons/cassette-fill.svg new file mode 100644 index 0000000..18fd5e4 --- /dev/null +++ b/assets/static/bootstrap-icons/cassette-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cassette.svg b/assets/static/bootstrap-icons/cassette.svg new file mode 100644 index 0000000..2effe71 --- /dev/null +++ b/assets/static/bootstrap-icons/cassette.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cast.svg b/assets/static/bootstrap-icons/cast.svg new file mode 100644 index 0000000..01a9795 --- /dev/null +++ b/assets/static/bootstrap-icons/cast.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cc-circle-fill.svg b/assets/static/bootstrap-icons/cc-circle-fill.svg new file mode 100644 index 0000000..483d90c --- /dev/null +++ b/assets/static/bootstrap-icons/cc-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cc-circle.svg b/assets/static/bootstrap-icons/cc-circle.svg new file mode 100644 index 0000000..2dc2b4b --- /dev/null +++ b/assets/static/bootstrap-icons/cc-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cc-square-fill.svg b/assets/static/bootstrap-icons/cc-square-fill.svg new file mode 100644 index 0000000..b0a8350 --- /dev/null +++ b/assets/static/bootstrap-icons/cc-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cc-square.svg b/assets/static/bootstrap-icons/cc-square.svg new file mode 100644 index 0000000..b0f05b6 --- /dev/null +++ b/assets/static/bootstrap-icons/cc-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-dots-fill.svg b/assets/static/bootstrap-icons/chat-dots-fill.svg new file mode 100644 index 0000000..5f74345 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-dots-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-dots.svg b/assets/static/bootstrap-icons/chat-dots.svg new file mode 100644 index 0000000..20137cc --- /dev/null +++ b/assets/static/bootstrap-icons/chat-dots.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-fill.svg b/assets/static/bootstrap-icons/chat-fill.svg new file mode 100644 index 0000000..c896939 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-heart-fill.svg b/assets/static/bootstrap-icons/chat-heart-fill.svg new file mode 100644 index 0000000..ea01c34 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-heart-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-heart.svg b/assets/static/bootstrap-icons/chat-heart.svg new file mode 100644 index 0000000..8ea104e --- /dev/null +++ b/assets/static/bootstrap-icons/chat-heart.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-left-dots-fill.svg b/assets/static/bootstrap-icons/chat-left-dots-fill.svg new file mode 100644 index 0000000..a6614c3 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-left-dots-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-left-dots.svg b/assets/static/bootstrap-icons/chat-left-dots.svg new file mode 100644 index 0000000..35f466a --- /dev/null +++ b/assets/static/bootstrap-icons/chat-left-dots.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-left-fill.svg b/assets/static/bootstrap-icons/chat-left-fill.svg new file mode 100644 index 0000000..0de6e13 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-left-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-left-heart-fill.svg b/assets/static/bootstrap-icons/chat-left-heart-fill.svg new file mode 100644 index 0000000..cc9502c --- /dev/null +++ b/assets/static/bootstrap-icons/chat-left-heart-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-left-heart.svg b/assets/static/bootstrap-icons/chat-left-heart.svg new file mode 100644 index 0000000..ec11692 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-left-heart.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-left-quote-fill.svg b/assets/static/bootstrap-icons/chat-left-quote-fill.svg new file mode 100644 index 0000000..d634a12 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-left-quote-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-left-quote.svg b/assets/static/bootstrap-icons/chat-left-quote.svg new file mode 100644 index 0000000..376ceb1 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-left-quote.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-left-text-fill.svg b/assets/static/bootstrap-icons/chat-left-text-fill.svg new file mode 100644 index 0000000..a78e343 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-left-text-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-left-text.svg b/assets/static/bootstrap-icons/chat-left-text.svg new file mode 100644 index 0000000..88d1906 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-left-text.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-left.svg b/assets/static/bootstrap-icons/chat-left.svg new file mode 100644 index 0000000..d93f0af --- /dev/null +++ b/assets/static/bootstrap-icons/chat-left.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-quote-fill.svg b/assets/static/bootstrap-icons/chat-quote-fill.svg new file mode 100644 index 0000000..7150c44 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-quote-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-quote.svg b/assets/static/bootstrap-icons/chat-quote.svg new file mode 100644 index 0000000..aa0edc4 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-quote.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-right-dots-fill.svg b/assets/static/bootstrap-icons/chat-right-dots-fill.svg new file mode 100644 index 0000000..1020581 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-right-dots-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-right-dots.svg b/assets/static/bootstrap-icons/chat-right-dots.svg new file mode 100644 index 0000000..d9b8bd2 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-right-dots.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-right-fill.svg b/assets/static/bootstrap-icons/chat-right-fill.svg new file mode 100644 index 0000000..6381ddc --- /dev/null +++ b/assets/static/bootstrap-icons/chat-right-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-right-heart-fill.svg b/assets/static/bootstrap-icons/chat-right-heart-fill.svg new file mode 100644 index 0000000..cf4abfe --- /dev/null +++ b/assets/static/bootstrap-icons/chat-right-heart-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-right-heart.svg b/assets/static/bootstrap-icons/chat-right-heart.svg new file mode 100644 index 0000000..e6b3880 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-right-heart.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-right-quote-fill.svg b/assets/static/bootstrap-icons/chat-right-quote-fill.svg new file mode 100644 index 0000000..1c4e536 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-right-quote-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-right-quote.svg b/assets/static/bootstrap-icons/chat-right-quote.svg new file mode 100644 index 0000000..e9091bc --- /dev/null +++ b/assets/static/bootstrap-icons/chat-right-quote.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-right-text-fill.svg b/assets/static/bootstrap-icons/chat-right-text-fill.svg new file mode 100644 index 0000000..3455983 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-right-text-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-right-text.svg b/assets/static/bootstrap-icons/chat-right-text.svg new file mode 100644 index 0000000..88341af --- /dev/null +++ b/assets/static/bootstrap-icons/chat-right-text.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-right.svg b/assets/static/bootstrap-icons/chat-right.svg new file mode 100644 index 0000000..a930c9a --- /dev/null +++ b/assets/static/bootstrap-icons/chat-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-square-dots-fill.svg b/assets/static/bootstrap-icons/chat-square-dots-fill.svg new file mode 100644 index 0000000..09c97d1 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-square-dots-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-square-dots.svg b/assets/static/bootstrap-icons/chat-square-dots.svg new file mode 100644 index 0000000..b06c02f --- /dev/null +++ b/assets/static/bootstrap-icons/chat-square-dots.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-square-fill.svg b/assets/static/bootstrap-icons/chat-square-fill.svg new file mode 100644 index 0000000..4688831 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-square-heart-fill.svg b/assets/static/bootstrap-icons/chat-square-heart-fill.svg new file mode 100644 index 0000000..902e0b5 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-square-heart-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-square-heart.svg b/assets/static/bootstrap-icons/chat-square-heart.svg new file mode 100644 index 0000000..6ba687e --- /dev/null +++ b/assets/static/bootstrap-icons/chat-square-heart.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-square-quote-fill.svg b/assets/static/bootstrap-icons/chat-square-quote-fill.svg new file mode 100644 index 0000000..2496b70 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-square-quote-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-square-quote.svg b/assets/static/bootstrap-icons/chat-square-quote.svg new file mode 100644 index 0000000..a8f6b09 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-square-quote.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-square-text-fill.svg b/assets/static/bootstrap-icons/chat-square-text-fill.svg new file mode 100644 index 0000000..6ebf567 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-square-text-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-square-text.svg b/assets/static/bootstrap-icons/chat-square-text.svg new file mode 100644 index 0000000..1296f92 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-square-text.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-square.svg b/assets/static/bootstrap-icons/chat-square.svg new file mode 100644 index 0000000..4e13ae8 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-square.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-text-fill.svg b/assets/static/bootstrap-icons/chat-text-fill.svg new file mode 100644 index 0000000..93639f1 --- /dev/null +++ b/assets/static/bootstrap-icons/chat-text-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat-text.svg b/assets/static/bootstrap-icons/chat-text.svg new file mode 100644 index 0000000..f64f43f --- /dev/null +++ b/assets/static/bootstrap-icons/chat-text.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chat.svg b/assets/static/bootstrap-icons/chat.svg new file mode 100644 index 0000000..487d142 --- /dev/null +++ b/assets/static/bootstrap-icons/chat.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/check-all.svg b/assets/static/bootstrap-icons/check-all.svg new file mode 100644 index 0000000..f91fd77 --- /dev/null +++ b/assets/static/bootstrap-icons/check-all.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/check-circle-fill.svg b/assets/static/bootstrap-icons/check-circle-fill.svg new file mode 100644 index 0000000..0b7f412 --- /dev/null +++ b/assets/static/bootstrap-icons/check-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/check-circle.svg b/assets/static/bootstrap-icons/check-circle.svg new file mode 100644 index 0000000..016f607 --- /dev/null +++ b/assets/static/bootstrap-icons/check-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/check-lg.svg b/assets/static/bootstrap-icons/check-lg.svg new file mode 100644 index 0000000..63a8a3d --- /dev/null +++ b/assets/static/bootstrap-icons/check-lg.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/check-square-fill.svg b/assets/static/bootstrap-icons/check-square-fill.svg new file mode 100644 index 0000000..cbb56ed --- /dev/null +++ b/assets/static/bootstrap-icons/check-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/check-square.svg b/assets/static/bootstrap-icons/check-square.svg new file mode 100644 index 0000000..b7d1116 --- /dev/null +++ b/assets/static/bootstrap-icons/check-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/check.svg b/assets/static/bootstrap-icons/check.svg new file mode 100644 index 0000000..11ab547 --- /dev/null +++ b/assets/static/bootstrap-icons/check.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/check2-all.svg b/assets/static/bootstrap-icons/check2-all.svg new file mode 100644 index 0000000..cccc0b7 --- /dev/null +++ b/assets/static/bootstrap-icons/check2-all.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/check2-circle.svg b/assets/static/bootstrap-icons/check2-circle.svg new file mode 100644 index 0000000..166e661 --- /dev/null +++ b/assets/static/bootstrap-icons/check2-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/check2-square.svg b/assets/static/bootstrap-icons/check2-square.svg new file mode 100644 index 0000000..64c3669 --- /dev/null +++ b/assets/static/bootstrap-icons/check2-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/check2.svg b/assets/static/bootstrap-icons/check2.svg new file mode 100644 index 0000000..87168de --- /dev/null +++ b/assets/static/bootstrap-icons/check2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chevron-bar-contract.svg b/assets/static/bootstrap-icons/chevron-bar-contract.svg new file mode 100644 index 0000000..52ec3f6 --- /dev/null +++ b/assets/static/bootstrap-icons/chevron-bar-contract.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chevron-bar-down.svg b/assets/static/bootstrap-icons/chevron-bar-down.svg new file mode 100644 index 0000000..8c10216 --- /dev/null +++ b/assets/static/bootstrap-icons/chevron-bar-down.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chevron-bar-expand.svg b/assets/static/bootstrap-icons/chevron-bar-expand.svg new file mode 100644 index 0000000..1260a20 --- /dev/null +++ b/assets/static/bootstrap-icons/chevron-bar-expand.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chevron-bar-left.svg b/assets/static/bootstrap-icons/chevron-bar-left.svg new file mode 100644 index 0000000..36afeb7 --- /dev/null +++ b/assets/static/bootstrap-icons/chevron-bar-left.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chevron-bar-right.svg b/assets/static/bootstrap-icons/chevron-bar-right.svg new file mode 100644 index 0000000..b71e040 --- /dev/null +++ b/assets/static/bootstrap-icons/chevron-bar-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chevron-bar-up.svg b/assets/static/bootstrap-icons/chevron-bar-up.svg new file mode 100644 index 0000000..c5da175 --- /dev/null +++ b/assets/static/bootstrap-icons/chevron-bar-up.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chevron-compact-down.svg b/assets/static/bootstrap-icons/chevron-compact-down.svg new file mode 100644 index 0000000..53d9d9a --- /dev/null +++ b/assets/static/bootstrap-icons/chevron-compact-down.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chevron-compact-left.svg b/assets/static/bootstrap-icons/chevron-compact-left.svg new file mode 100644 index 0000000..277ddd8 --- /dev/null +++ b/assets/static/bootstrap-icons/chevron-compact-left.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chevron-compact-right.svg b/assets/static/bootstrap-icons/chevron-compact-right.svg new file mode 100644 index 0000000..24b5309 --- /dev/null +++ b/assets/static/bootstrap-icons/chevron-compact-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chevron-compact-up.svg b/assets/static/bootstrap-icons/chevron-compact-up.svg new file mode 100644 index 0000000..2a4f354 --- /dev/null +++ b/assets/static/bootstrap-icons/chevron-compact-up.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chevron-contract.svg b/assets/static/bootstrap-icons/chevron-contract.svg new file mode 100644 index 0000000..354ee86 --- /dev/null +++ b/assets/static/bootstrap-icons/chevron-contract.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chevron-double-down.svg b/assets/static/bootstrap-icons/chevron-double-down.svg new file mode 100644 index 0000000..bc99e59 --- /dev/null +++ b/assets/static/bootstrap-icons/chevron-double-down.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chevron-double-left.svg b/assets/static/bootstrap-icons/chevron-double-left.svg new file mode 100644 index 0000000..c4cd7f2 --- /dev/null +++ b/assets/static/bootstrap-icons/chevron-double-left.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chevron-double-right.svg b/assets/static/bootstrap-icons/chevron-double-right.svg new file mode 100644 index 0000000..dccd6c5 --- /dev/null +++ b/assets/static/bootstrap-icons/chevron-double-right.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chevron-double-up.svg b/assets/static/bootstrap-icons/chevron-double-up.svg new file mode 100644 index 0000000..ad7ba12 --- /dev/null +++ b/assets/static/bootstrap-icons/chevron-double-up.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chevron-down.svg b/assets/static/bootstrap-icons/chevron-down.svg new file mode 100644 index 0000000..a281907 --- /dev/null +++ b/assets/static/bootstrap-icons/chevron-down.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chevron-expand.svg b/assets/static/bootstrap-icons/chevron-expand.svg new file mode 100644 index 0000000..33e4ad8 --- /dev/null +++ b/assets/static/bootstrap-icons/chevron-expand.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chevron-left.svg b/assets/static/bootstrap-icons/chevron-left.svg new file mode 100644 index 0000000..5bcc1bb --- /dev/null +++ b/assets/static/bootstrap-icons/chevron-left.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chevron-right.svg b/assets/static/bootstrap-icons/chevron-right.svg new file mode 100644 index 0000000..ab39af8 --- /dev/null +++ b/assets/static/bootstrap-icons/chevron-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/chevron-up.svg b/assets/static/bootstrap-icons/chevron-up.svg new file mode 100644 index 0000000..4f3c7a0 --- /dev/null +++ b/assets/static/bootstrap-icons/chevron-up.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/circle-fill.svg b/assets/static/bootstrap-icons/circle-fill.svg new file mode 100644 index 0000000..e0d1b51 --- /dev/null +++ b/assets/static/bootstrap-icons/circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/circle-half.svg b/assets/static/bootstrap-icons/circle-half.svg new file mode 100644 index 0000000..497f6b7 --- /dev/null +++ b/assets/static/bootstrap-icons/circle-half.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/circle-square.svg b/assets/static/bootstrap-icons/circle-square.svg new file mode 100644 index 0000000..c0f62b7 --- /dev/null +++ b/assets/static/bootstrap-icons/circle-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/circle.svg b/assets/static/bootstrap-icons/circle.svg new file mode 100644 index 0000000..9bbabca --- /dev/null +++ b/assets/static/bootstrap-icons/circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard-check-fill.svg b/assets/static/bootstrap-icons/clipboard-check-fill.svg new file mode 100644 index 0000000..598e850 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard-check-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard-check.svg b/assets/static/bootstrap-icons/clipboard-check.svg new file mode 100644 index 0000000..cb9d8a2 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard-check.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard-data-fill.svg b/assets/static/bootstrap-icons/clipboard-data-fill.svg new file mode 100644 index 0000000..e4a9425 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard-data-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard-data.svg b/assets/static/bootstrap-icons/clipboard-data.svg new file mode 100644 index 0000000..622acbf --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard-data.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard-fill.svg b/assets/static/bootstrap-icons/clipboard-fill.svg new file mode 100644 index 0000000..176c5e4 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard-heart-fill.svg b/assets/static/bootstrap-icons/clipboard-heart-fill.svg new file mode 100644 index 0000000..92de0a8 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard-heart-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard-heart.svg b/assets/static/bootstrap-icons/clipboard-heart.svg new file mode 100644 index 0000000..c430ed2 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard-heart.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard-minus-fill.svg b/assets/static/bootstrap-icons/clipboard-minus-fill.svg new file mode 100644 index 0000000..e47f43f --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard-minus-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard-minus.svg b/assets/static/bootstrap-icons/clipboard-minus.svg new file mode 100644 index 0000000..d3675c4 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard-minus.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard-plus-fill.svg b/assets/static/bootstrap-icons/clipboard-plus-fill.svg new file mode 100644 index 0000000..8140aa8 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard-plus-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard-plus.svg b/assets/static/bootstrap-icons/clipboard-plus.svg new file mode 100644 index 0000000..1d095d7 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard-plus.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard-pulse.svg b/assets/static/bootstrap-icons/clipboard-pulse.svg new file mode 100644 index 0000000..a357209 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard-pulse.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard-x-fill.svg b/assets/static/bootstrap-icons/clipboard-x-fill.svg new file mode 100644 index 0000000..10fba82 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard-x-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard-x.svg b/assets/static/bootstrap-icons/clipboard-x.svg new file mode 100644 index 0000000..46df235 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard-x.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard.svg b/assets/static/bootstrap-icons/clipboard.svg new file mode 100644 index 0000000..b92f42a --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard2-check-fill.svg b/assets/static/bootstrap-icons/clipboard2-check-fill.svg new file mode 100644 index 0000000..b640432 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard2-check-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard2-check.svg b/assets/static/bootstrap-icons/clipboard2-check.svg new file mode 100644 index 0000000..aba15bf --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard2-check.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard2-data-fill.svg b/assets/static/bootstrap-icons/clipboard2-data-fill.svg new file mode 100644 index 0000000..56c127e --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard2-data-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard2-data.svg b/assets/static/bootstrap-icons/clipboard2-data.svg new file mode 100644 index 0000000..75ac6c6 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard2-data.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard2-fill.svg b/assets/static/bootstrap-icons/clipboard2-fill.svg new file mode 100644 index 0000000..6898571 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard2-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard2-heart-fill.svg b/assets/static/bootstrap-icons/clipboard2-heart-fill.svg new file mode 100644 index 0000000..ce98945 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard2-heart-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard2-heart.svg b/assets/static/bootstrap-icons/clipboard2-heart.svg new file mode 100644 index 0000000..879fef2 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard2-heart.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard2-minus-fill.svg b/assets/static/bootstrap-icons/clipboard2-minus-fill.svg new file mode 100644 index 0000000..fcd4b56 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard2-minus-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard2-minus.svg b/assets/static/bootstrap-icons/clipboard2-minus.svg new file mode 100644 index 0000000..f8c10e3 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard2-minus.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard2-plus-fill.svg b/assets/static/bootstrap-icons/clipboard2-plus-fill.svg new file mode 100644 index 0000000..be310e5 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard2-plus-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard2-plus.svg b/assets/static/bootstrap-icons/clipboard2-plus.svg new file mode 100644 index 0000000..33eaa28 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard2-plus.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard2-pulse-fill.svg b/assets/static/bootstrap-icons/clipboard2-pulse-fill.svg new file mode 100644 index 0000000..bc7d6b3 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard2-pulse-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard2-pulse.svg b/assets/static/bootstrap-icons/clipboard2-pulse.svg new file mode 100644 index 0000000..c641c61 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard2-pulse.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard2-x-fill.svg b/assets/static/bootstrap-icons/clipboard2-x-fill.svg new file mode 100644 index 0000000..08828c6 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard2-x-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard2-x.svg b/assets/static/bootstrap-icons/clipboard2-x.svg new file mode 100644 index 0000000..06832cc --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard2-x.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clipboard2.svg b/assets/static/bootstrap-icons/clipboard2.svg new file mode 100644 index 0000000..d0f4529 --- /dev/null +++ b/assets/static/bootstrap-icons/clipboard2.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clock-fill.svg b/assets/static/bootstrap-icons/clock-fill.svg new file mode 100644 index 0000000..148abcf --- /dev/null +++ b/assets/static/bootstrap-icons/clock-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clock-history.svg b/assets/static/bootstrap-icons/clock-history.svg new file mode 100644 index 0000000..f685e10 --- /dev/null +++ b/assets/static/bootstrap-icons/clock-history.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clock.svg b/assets/static/bootstrap-icons/clock.svg new file mode 100644 index 0000000..31c3c64 --- /dev/null +++ b/assets/static/bootstrap-icons/clock.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-arrow-down-fill.svg b/assets/static/bootstrap-icons/cloud-arrow-down-fill.svg new file mode 100644 index 0000000..1b23dc9 --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-arrow-down-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-arrow-down.svg b/assets/static/bootstrap-icons/cloud-arrow-down.svg new file mode 100644 index 0000000..bb79bbe --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-arrow-down.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-arrow-up-fill.svg b/assets/static/bootstrap-icons/cloud-arrow-up-fill.svg new file mode 100644 index 0000000..8366f05 --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-arrow-up-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-arrow-up.svg b/assets/static/bootstrap-icons/cloud-arrow-up.svg new file mode 100644 index 0000000..704756b --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-arrow-up.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-check-fill.svg b/assets/static/bootstrap-icons/cloud-check-fill.svg new file mode 100644 index 0000000..a71feee --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-check-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-check.svg b/assets/static/bootstrap-icons/cloud-check.svg new file mode 100644 index 0000000..d7599e9 --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-check.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-download-fill.svg b/assets/static/bootstrap-icons/cloud-download-fill.svg new file mode 100644 index 0000000..c8a44ba --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-download-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-download.svg b/assets/static/bootstrap-icons/cloud-download.svg new file mode 100644 index 0000000..b71d7d7 --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-download.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-drizzle-fill.svg b/assets/static/bootstrap-icons/cloud-drizzle-fill.svg new file mode 100644 index 0000000..0d381ae --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-drizzle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-drizzle.svg b/assets/static/bootstrap-icons/cloud-drizzle.svg new file mode 100644 index 0000000..f3c8599 --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-drizzle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-fill.svg b/assets/static/bootstrap-icons/cloud-fill.svg new file mode 100644 index 0000000..8849faa --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-fog-fill.svg b/assets/static/bootstrap-icons/cloud-fog-fill.svg new file mode 100644 index 0000000..214caba --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-fog-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-fog.svg b/assets/static/bootstrap-icons/cloud-fog.svg new file mode 100644 index 0000000..26a574a --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-fog.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-fog2-fill.svg b/assets/static/bootstrap-icons/cloud-fog2-fill.svg new file mode 100644 index 0000000..8f67dea --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-fog2-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-fog2.svg b/assets/static/bootstrap-icons/cloud-fog2.svg new file mode 100644 index 0000000..9b0664f --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-fog2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-hail-fill.svg b/assets/static/bootstrap-icons/cloud-hail-fill.svg new file mode 100644 index 0000000..0fa737f --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-hail-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-hail.svg b/assets/static/bootstrap-icons/cloud-hail.svg new file mode 100644 index 0000000..3206a02 --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-hail.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-haze-fill.svg b/assets/static/bootstrap-icons/cloud-haze-fill.svg new file mode 100644 index 0000000..aa16c2c --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-haze-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-haze.svg b/assets/static/bootstrap-icons/cloud-haze.svg new file mode 100644 index 0000000..578a565 --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-haze.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-haze2-fill.svg b/assets/static/bootstrap-icons/cloud-haze2-fill.svg new file mode 100644 index 0000000..3e22656 --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-haze2-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-haze2.svg b/assets/static/bootstrap-icons/cloud-haze2.svg new file mode 100644 index 0000000..c43d91c --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-haze2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-lightning-fill.svg b/assets/static/bootstrap-icons/cloud-lightning-fill.svg new file mode 100644 index 0000000..88fd930 --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-lightning-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-lightning-rain-fill.svg b/assets/static/bootstrap-icons/cloud-lightning-rain-fill.svg new file mode 100644 index 0000000..f5cd845 --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-lightning-rain-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-lightning-rain.svg b/assets/static/bootstrap-icons/cloud-lightning-rain.svg new file mode 100644 index 0000000..588b274 --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-lightning-rain.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-lightning.svg b/assets/static/bootstrap-icons/cloud-lightning.svg new file mode 100644 index 0000000..20c2680 --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-lightning.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-minus-fill.svg b/assets/static/bootstrap-icons/cloud-minus-fill.svg new file mode 100644 index 0000000..2fcc2bb --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-minus-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-minus.svg b/assets/static/bootstrap-icons/cloud-minus.svg new file mode 100644 index 0000000..54f47b2 --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-minus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-moon-fill.svg b/assets/static/bootstrap-icons/cloud-moon-fill.svg new file mode 100644 index 0000000..232dd4e --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-moon-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-moon.svg b/assets/static/bootstrap-icons/cloud-moon.svg new file mode 100644 index 0000000..cc91617 --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-moon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-plus-fill.svg b/assets/static/bootstrap-icons/cloud-plus-fill.svg new file mode 100644 index 0000000..5337dc4 --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-plus-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-plus.svg b/assets/static/bootstrap-icons/cloud-plus.svg new file mode 100644 index 0000000..9448796 --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-plus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-rain-fill.svg b/assets/static/bootstrap-icons/cloud-rain-fill.svg new file mode 100644 index 0000000..3ffee56 --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-rain-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-rain-heavy-fill.svg b/assets/static/bootstrap-icons/cloud-rain-heavy-fill.svg new file mode 100644 index 0000000..d92411b --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-rain-heavy-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-rain-heavy.svg b/assets/static/bootstrap-icons/cloud-rain-heavy.svg new file mode 100644 index 0000000..ee9ef85 --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-rain-heavy.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-rain.svg b/assets/static/bootstrap-icons/cloud-rain.svg new file mode 100644 index 0000000..e22f16c --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-rain.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-slash-fill.svg b/assets/static/bootstrap-icons/cloud-slash-fill.svg new file mode 100644 index 0000000..08a709b --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-slash-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-slash.svg b/assets/static/bootstrap-icons/cloud-slash.svg new file mode 100644 index 0000000..d7b680c --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-slash.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-sleet-fill.svg b/assets/static/bootstrap-icons/cloud-sleet-fill.svg new file mode 100644 index 0000000..1df3f33 --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-sleet-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-sleet.svg b/assets/static/bootstrap-icons/cloud-sleet.svg new file mode 100644 index 0000000..edc48c6 --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-sleet.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-snow-fill.svg b/assets/static/bootstrap-icons/cloud-snow-fill.svg new file mode 100644 index 0000000..32cda8d --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-snow-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-snow.svg b/assets/static/bootstrap-icons/cloud-snow.svg new file mode 100644 index 0000000..26150c4 --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-snow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-sun-fill.svg b/assets/static/bootstrap-icons/cloud-sun-fill.svg new file mode 100644 index 0000000..da5ecac --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-sun-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-sun.svg b/assets/static/bootstrap-icons/cloud-sun.svg new file mode 100644 index 0000000..caa95e9 --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-sun.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-upload-fill.svg b/assets/static/bootstrap-icons/cloud-upload-fill.svg new file mode 100644 index 0000000..2d0df59 --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-upload-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud-upload.svg b/assets/static/bootstrap-icons/cloud-upload.svg new file mode 100644 index 0000000..e5ca56e --- /dev/null +++ b/assets/static/bootstrap-icons/cloud-upload.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloud.svg b/assets/static/bootstrap-icons/cloud.svg new file mode 100644 index 0000000..de877ab --- /dev/null +++ b/assets/static/bootstrap-icons/cloud.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clouds-fill.svg b/assets/static/bootstrap-icons/clouds-fill.svg new file mode 100644 index 0000000..d70e817 --- /dev/null +++ b/assets/static/bootstrap-icons/clouds-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/clouds.svg b/assets/static/bootstrap-icons/clouds.svg new file mode 100644 index 0000000..7e253e7 --- /dev/null +++ b/assets/static/bootstrap-icons/clouds.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloudy-fill.svg b/assets/static/bootstrap-icons/cloudy-fill.svg new file mode 100644 index 0000000..7bf27b7 --- /dev/null +++ b/assets/static/bootstrap-icons/cloudy-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cloudy.svg b/assets/static/bootstrap-icons/cloudy.svg new file mode 100644 index 0000000..87c2017 --- /dev/null +++ b/assets/static/bootstrap-icons/cloudy.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/code-slash.svg b/assets/static/bootstrap-icons/code-slash.svg new file mode 100644 index 0000000..51a5c57 --- /dev/null +++ b/assets/static/bootstrap-icons/code-slash.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/code-square.svg b/assets/static/bootstrap-icons/code-square.svg new file mode 100644 index 0000000..30fdef3 --- /dev/null +++ b/assets/static/bootstrap-icons/code-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/code.svg b/assets/static/bootstrap-icons/code.svg new file mode 100644 index 0000000..c0760e9 --- /dev/null +++ b/assets/static/bootstrap-icons/code.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/coin.svg b/assets/static/bootstrap-icons/coin.svg new file mode 100644 index 0000000..fb94cc5 --- /dev/null +++ b/assets/static/bootstrap-icons/coin.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/collection-fill.svg b/assets/static/bootstrap-icons/collection-fill.svg new file mode 100644 index 0000000..4e5fbce --- /dev/null +++ b/assets/static/bootstrap-icons/collection-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/collection-play-fill.svg b/assets/static/bootstrap-icons/collection-play-fill.svg new file mode 100644 index 0000000..b6820d0 --- /dev/null +++ b/assets/static/bootstrap-icons/collection-play-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/collection-play.svg b/assets/static/bootstrap-icons/collection-play.svg new file mode 100644 index 0000000..0c59f5d --- /dev/null +++ b/assets/static/bootstrap-icons/collection-play.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/collection.svg b/assets/static/bootstrap-icons/collection.svg new file mode 100644 index 0000000..8b5d5fd --- /dev/null +++ b/assets/static/bootstrap-icons/collection.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/columns-gap.svg b/assets/static/bootstrap-icons/columns-gap.svg new file mode 100644 index 0000000..8b4bb4e --- /dev/null +++ b/assets/static/bootstrap-icons/columns-gap.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/columns.svg b/assets/static/bootstrap-icons/columns.svg new file mode 100644 index 0000000..17632df --- /dev/null +++ b/assets/static/bootstrap-icons/columns.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/command.svg b/assets/static/bootstrap-icons/command.svg new file mode 100644 index 0000000..64fa00b --- /dev/null +++ b/assets/static/bootstrap-icons/command.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/compass-fill.svg b/assets/static/bootstrap-icons/compass-fill.svg new file mode 100644 index 0000000..1396c1f --- /dev/null +++ b/assets/static/bootstrap-icons/compass-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/compass.svg b/assets/static/bootstrap-icons/compass.svg new file mode 100644 index 0000000..9b402f3 --- /dev/null +++ b/assets/static/bootstrap-icons/compass.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cone-striped.svg b/assets/static/bootstrap-icons/cone-striped.svg new file mode 100644 index 0000000..28a9529 --- /dev/null +++ b/assets/static/bootstrap-icons/cone-striped.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cone.svg b/assets/static/bootstrap-icons/cone.svg new file mode 100644 index 0000000..b1a7d97 --- /dev/null +++ b/assets/static/bootstrap-icons/cone.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/controller.svg b/assets/static/bootstrap-icons/controller.svg new file mode 100644 index 0000000..b7ceedb --- /dev/null +++ b/assets/static/bootstrap-icons/controller.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cookie.svg b/assets/static/bootstrap-icons/cookie.svg new file mode 100644 index 0000000..7a4b2fa --- /dev/null +++ b/assets/static/bootstrap-icons/cookie.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/copy.svg b/assets/static/bootstrap-icons/copy.svg new file mode 100644 index 0000000..b590680 --- /dev/null +++ b/assets/static/bootstrap-icons/copy.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cpu-fill.svg b/assets/static/bootstrap-icons/cpu-fill.svg new file mode 100644 index 0000000..ce6e294 --- /dev/null +++ b/assets/static/bootstrap-icons/cpu-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cpu.svg b/assets/static/bootstrap-icons/cpu.svg new file mode 100644 index 0000000..88c0d56 --- /dev/null +++ b/assets/static/bootstrap-icons/cpu.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/credit-card-2-back-fill.svg b/assets/static/bootstrap-icons/credit-card-2-back-fill.svg new file mode 100644 index 0000000..032fb4a --- /dev/null +++ b/assets/static/bootstrap-icons/credit-card-2-back-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/credit-card-2-back.svg b/assets/static/bootstrap-icons/credit-card-2-back.svg new file mode 100644 index 0000000..b29419c --- /dev/null +++ b/assets/static/bootstrap-icons/credit-card-2-back.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/credit-card-2-front-fill.svg b/assets/static/bootstrap-icons/credit-card-2-front-fill.svg new file mode 100644 index 0000000..06684d5 --- /dev/null +++ b/assets/static/bootstrap-icons/credit-card-2-front-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/credit-card-2-front.svg b/assets/static/bootstrap-icons/credit-card-2-front.svg new file mode 100644 index 0000000..0bbc290 --- /dev/null +++ b/assets/static/bootstrap-icons/credit-card-2-front.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/credit-card-fill.svg b/assets/static/bootstrap-icons/credit-card-fill.svg new file mode 100644 index 0000000..a4f899a --- /dev/null +++ b/assets/static/bootstrap-icons/credit-card-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/credit-card.svg b/assets/static/bootstrap-icons/credit-card.svg new file mode 100644 index 0000000..406233d --- /dev/null +++ b/assets/static/bootstrap-icons/credit-card.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/crop.svg b/assets/static/bootstrap-icons/crop.svg new file mode 100644 index 0000000..3b4bb60 --- /dev/null +++ b/assets/static/bootstrap-icons/crop.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/crosshair.svg b/assets/static/bootstrap-icons/crosshair.svg new file mode 100644 index 0000000..13bed74 --- /dev/null +++ b/assets/static/bootstrap-icons/crosshair.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/crosshair2.svg b/assets/static/bootstrap-icons/crosshair2.svg new file mode 100644 index 0000000..3c28586 --- /dev/null +++ b/assets/static/bootstrap-icons/crosshair2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cup-fill.svg b/assets/static/bootstrap-icons/cup-fill.svg new file mode 100644 index 0000000..7173787 --- /dev/null +++ b/assets/static/bootstrap-icons/cup-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cup-hot-fill.svg b/assets/static/bootstrap-icons/cup-hot-fill.svg new file mode 100644 index 0000000..9d7c465 --- /dev/null +++ b/assets/static/bootstrap-icons/cup-hot-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cup-hot.svg b/assets/static/bootstrap-icons/cup-hot.svg new file mode 100644 index 0000000..a6f7e89 --- /dev/null +++ b/assets/static/bootstrap-icons/cup-hot.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cup-straw.svg b/assets/static/bootstrap-icons/cup-straw.svg new file mode 100644 index 0000000..9388da9 --- /dev/null +++ b/assets/static/bootstrap-icons/cup-straw.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cup.svg b/assets/static/bootstrap-icons/cup.svg new file mode 100644 index 0000000..2694ac8 --- /dev/null +++ b/assets/static/bootstrap-icons/cup.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/currency-bitcoin.svg b/assets/static/bootstrap-icons/currency-bitcoin.svg new file mode 100644 index 0000000..0477ff8 --- /dev/null +++ b/assets/static/bootstrap-icons/currency-bitcoin.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/currency-dollar.svg b/assets/static/bootstrap-icons/currency-dollar.svg new file mode 100644 index 0000000..7ead9a7 --- /dev/null +++ b/assets/static/bootstrap-icons/currency-dollar.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/currency-euro.svg b/assets/static/bootstrap-icons/currency-euro.svg new file mode 100644 index 0000000..90c83d5 --- /dev/null +++ b/assets/static/bootstrap-icons/currency-euro.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/currency-exchange.svg b/assets/static/bootstrap-icons/currency-exchange.svg new file mode 100644 index 0000000..e332aa7 --- /dev/null +++ b/assets/static/bootstrap-icons/currency-exchange.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/currency-pound.svg b/assets/static/bootstrap-icons/currency-pound.svg new file mode 100644 index 0000000..4650876 --- /dev/null +++ b/assets/static/bootstrap-icons/currency-pound.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/currency-rupee.svg b/assets/static/bootstrap-icons/currency-rupee.svg new file mode 100644 index 0000000..4fdf9a2 --- /dev/null +++ b/assets/static/bootstrap-icons/currency-rupee.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/currency-yen.svg b/assets/static/bootstrap-icons/currency-yen.svg new file mode 100644 index 0000000..5bbf1a2 --- /dev/null +++ b/assets/static/bootstrap-icons/currency-yen.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cursor-fill.svg b/assets/static/bootstrap-icons/cursor-fill.svg new file mode 100644 index 0000000..093372b --- /dev/null +++ b/assets/static/bootstrap-icons/cursor-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cursor-text.svg b/assets/static/bootstrap-icons/cursor-text.svg new file mode 100644 index 0000000..27c057b --- /dev/null +++ b/assets/static/bootstrap-icons/cursor-text.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/cursor.svg b/assets/static/bootstrap-icons/cursor.svg new file mode 100644 index 0000000..e23e3fd --- /dev/null +++ b/assets/static/bootstrap-icons/cursor.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dash-circle-dotted.svg b/assets/static/bootstrap-icons/dash-circle-dotted.svg new file mode 100644 index 0000000..1c011e2 --- /dev/null +++ b/assets/static/bootstrap-icons/dash-circle-dotted.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dash-circle-fill.svg b/assets/static/bootstrap-icons/dash-circle-fill.svg new file mode 100644 index 0000000..ac4eae0 --- /dev/null +++ b/assets/static/bootstrap-icons/dash-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dash-circle.svg b/assets/static/bootstrap-icons/dash-circle.svg new file mode 100644 index 0000000..c4abdd2 --- /dev/null +++ b/assets/static/bootstrap-icons/dash-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dash-lg.svg b/assets/static/bootstrap-icons/dash-lg.svg new file mode 100644 index 0000000..454aa7d --- /dev/null +++ b/assets/static/bootstrap-icons/dash-lg.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dash-square-dotted.svg b/assets/static/bootstrap-icons/dash-square-dotted.svg new file mode 100644 index 0000000..90886c3 --- /dev/null +++ b/assets/static/bootstrap-icons/dash-square-dotted.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dash-square-fill.svg b/assets/static/bootstrap-icons/dash-square-fill.svg new file mode 100644 index 0000000..dbe0db2 --- /dev/null +++ b/assets/static/bootstrap-icons/dash-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dash-square.svg b/assets/static/bootstrap-icons/dash-square.svg new file mode 100644 index 0000000..9381872 --- /dev/null +++ b/assets/static/bootstrap-icons/dash-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dash.svg b/assets/static/bootstrap-icons/dash.svg new file mode 100644 index 0000000..c3834b4 --- /dev/null +++ b/assets/static/bootstrap-icons/dash.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/database-add.svg b/assets/static/bootstrap-icons/database-add.svg new file mode 100644 index 0000000..5f76340 --- /dev/null +++ b/assets/static/bootstrap-icons/database-add.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/database-check.svg b/assets/static/bootstrap-icons/database-check.svg new file mode 100644 index 0000000..29c02b8 --- /dev/null +++ b/assets/static/bootstrap-icons/database-check.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/database-dash.svg b/assets/static/bootstrap-icons/database-dash.svg new file mode 100644 index 0000000..184db0a --- /dev/null +++ b/assets/static/bootstrap-icons/database-dash.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/database-down.svg b/assets/static/bootstrap-icons/database-down.svg new file mode 100644 index 0000000..e077452 --- /dev/null +++ b/assets/static/bootstrap-icons/database-down.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/database-exclamation.svg b/assets/static/bootstrap-icons/database-exclamation.svg new file mode 100644 index 0000000..dbde50f --- /dev/null +++ b/assets/static/bootstrap-icons/database-exclamation.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/database-fill-add.svg b/assets/static/bootstrap-icons/database-fill-add.svg new file mode 100644 index 0000000..4273d5d --- /dev/null +++ b/assets/static/bootstrap-icons/database-fill-add.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/database-fill-check.svg b/assets/static/bootstrap-icons/database-fill-check.svg new file mode 100644 index 0000000..7690eed --- /dev/null +++ b/assets/static/bootstrap-icons/database-fill-check.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/database-fill-dash.svg b/assets/static/bootstrap-icons/database-fill-dash.svg new file mode 100644 index 0000000..48c468d --- /dev/null +++ b/assets/static/bootstrap-icons/database-fill-dash.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/database-fill-down.svg b/assets/static/bootstrap-icons/database-fill-down.svg new file mode 100644 index 0000000..c3560d8 --- /dev/null +++ b/assets/static/bootstrap-icons/database-fill-down.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/database-fill-exclamation.svg b/assets/static/bootstrap-icons/database-fill-exclamation.svg new file mode 100644 index 0000000..00073d0 --- /dev/null +++ b/assets/static/bootstrap-icons/database-fill-exclamation.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/database-fill-gear.svg b/assets/static/bootstrap-icons/database-fill-gear.svg new file mode 100644 index 0000000..94fc2e6 --- /dev/null +++ b/assets/static/bootstrap-icons/database-fill-gear.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/database-fill-lock.svg b/assets/static/bootstrap-icons/database-fill-lock.svg new file mode 100644 index 0000000..a948205 --- /dev/null +++ b/assets/static/bootstrap-icons/database-fill-lock.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/database-fill-slash.svg b/assets/static/bootstrap-icons/database-fill-slash.svg new file mode 100644 index 0000000..467e6bb --- /dev/null +++ b/assets/static/bootstrap-icons/database-fill-slash.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/database-fill-up.svg b/assets/static/bootstrap-icons/database-fill-up.svg new file mode 100644 index 0000000..07f2d39 --- /dev/null +++ b/assets/static/bootstrap-icons/database-fill-up.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/database-fill-x.svg b/assets/static/bootstrap-icons/database-fill-x.svg new file mode 100644 index 0000000..73ff269 --- /dev/null +++ b/assets/static/bootstrap-icons/database-fill-x.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/database-fill.svg b/assets/static/bootstrap-icons/database-fill.svg new file mode 100644 index 0000000..8603874 --- /dev/null +++ b/assets/static/bootstrap-icons/database-fill.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/database-gear.svg b/assets/static/bootstrap-icons/database-gear.svg new file mode 100644 index 0000000..451763c --- /dev/null +++ b/assets/static/bootstrap-icons/database-gear.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/database-lock.svg b/assets/static/bootstrap-icons/database-lock.svg new file mode 100644 index 0000000..e150cd2 --- /dev/null +++ b/assets/static/bootstrap-icons/database-lock.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/database-slash.svg b/assets/static/bootstrap-icons/database-slash.svg new file mode 100644 index 0000000..e0cc9f2 --- /dev/null +++ b/assets/static/bootstrap-icons/database-slash.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/database-up.svg b/assets/static/bootstrap-icons/database-up.svg new file mode 100644 index 0000000..63f7a10 --- /dev/null +++ b/assets/static/bootstrap-icons/database-up.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/database-x.svg b/assets/static/bootstrap-icons/database-x.svg new file mode 100644 index 0000000..f97779b --- /dev/null +++ b/assets/static/bootstrap-icons/database-x.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/database.svg b/assets/static/bootstrap-icons/database.svg new file mode 100644 index 0000000..231c50c --- /dev/null +++ b/assets/static/bootstrap-icons/database.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/device-hdd-fill.svg b/assets/static/bootstrap-icons/device-hdd-fill.svg new file mode 100644 index 0000000..d5380c0 --- /dev/null +++ b/assets/static/bootstrap-icons/device-hdd-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/device-hdd.svg b/assets/static/bootstrap-icons/device-hdd.svg new file mode 100644 index 0000000..5163a58 --- /dev/null +++ b/assets/static/bootstrap-icons/device-hdd.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/device-ssd-fill.svg b/assets/static/bootstrap-icons/device-ssd-fill.svg new file mode 100644 index 0000000..0d1f9c3 --- /dev/null +++ b/assets/static/bootstrap-icons/device-ssd-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/device-ssd.svg b/assets/static/bootstrap-icons/device-ssd.svg new file mode 100644 index 0000000..8405f21 --- /dev/null +++ b/assets/static/bootstrap-icons/device-ssd.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/diagram-2-fill.svg b/assets/static/bootstrap-icons/diagram-2-fill.svg new file mode 100644 index 0000000..397ae15 --- /dev/null +++ b/assets/static/bootstrap-icons/diagram-2-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/diagram-2.svg b/assets/static/bootstrap-icons/diagram-2.svg new file mode 100644 index 0000000..a6e5439 --- /dev/null +++ b/assets/static/bootstrap-icons/diagram-2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/diagram-3-fill.svg b/assets/static/bootstrap-icons/diagram-3-fill.svg new file mode 100644 index 0000000..7e47423 --- /dev/null +++ b/assets/static/bootstrap-icons/diagram-3-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/diagram-3.svg b/assets/static/bootstrap-icons/diagram-3.svg new file mode 100644 index 0000000..ee3fd6f --- /dev/null +++ b/assets/static/bootstrap-icons/diagram-3.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/diamond-fill.svg b/assets/static/bootstrap-icons/diamond-fill.svg new file mode 100644 index 0000000..1f86d1f --- /dev/null +++ b/assets/static/bootstrap-icons/diamond-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/diamond-half.svg b/assets/static/bootstrap-icons/diamond-half.svg new file mode 100644 index 0000000..68254b6 --- /dev/null +++ b/assets/static/bootstrap-icons/diamond-half.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/diamond.svg b/assets/static/bootstrap-icons/diamond.svg new file mode 100644 index 0000000..44e2855 --- /dev/null +++ b/assets/static/bootstrap-icons/diamond.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dice-1-fill.svg b/assets/static/bootstrap-icons/dice-1-fill.svg new file mode 100644 index 0000000..a32e2cf --- /dev/null +++ b/assets/static/bootstrap-icons/dice-1-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dice-1.svg b/assets/static/bootstrap-icons/dice-1.svg new file mode 100644 index 0000000..afc64b0 --- /dev/null +++ b/assets/static/bootstrap-icons/dice-1.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dice-2-fill.svg b/assets/static/bootstrap-icons/dice-2-fill.svg new file mode 100644 index 0000000..131013e --- /dev/null +++ b/assets/static/bootstrap-icons/dice-2-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dice-2.svg b/assets/static/bootstrap-icons/dice-2.svg new file mode 100644 index 0000000..ba1a79c --- /dev/null +++ b/assets/static/bootstrap-icons/dice-2.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dice-3-fill.svg b/assets/static/bootstrap-icons/dice-3-fill.svg new file mode 100644 index 0000000..158065d --- /dev/null +++ b/assets/static/bootstrap-icons/dice-3-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dice-3.svg b/assets/static/bootstrap-icons/dice-3.svg new file mode 100644 index 0000000..b64c675 --- /dev/null +++ b/assets/static/bootstrap-icons/dice-3.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dice-4-fill.svg b/assets/static/bootstrap-icons/dice-4-fill.svg new file mode 100644 index 0000000..7cf6e2c --- /dev/null +++ b/assets/static/bootstrap-icons/dice-4-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dice-4.svg b/assets/static/bootstrap-icons/dice-4.svg new file mode 100644 index 0000000..bd8bbf7 --- /dev/null +++ b/assets/static/bootstrap-icons/dice-4.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dice-5-fill.svg b/assets/static/bootstrap-icons/dice-5-fill.svg new file mode 100644 index 0000000..289cb45 --- /dev/null +++ b/assets/static/bootstrap-icons/dice-5-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dice-5.svg b/assets/static/bootstrap-icons/dice-5.svg new file mode 100644 index 0000000..cc96a35 --- /dev/null +++ b/assets/static/bootstrap-icons/dice-5.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dice-6-fill.svg b/assets/static/bootstrap-icons/dice-6-fill.svg new file mode 100644 index 0000000..9b3d652 --- /dev/null +++ b/assets/static/bootstrap-icons/dice-6-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dice-6.svg b/assets/static/bootstrap-icons/dice-6.svg new file mode 100644 index 0000000..47ba0aa --- /dev/null +++ b/assets/static/bootstrap-icons/dice-6.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/disc-fill.svg b/assets/static/bootstrap-icons/disc-fill.svg new file mode 100644 index 0000000..0d2d7f1 --- /dev/null +++ b/assets/static/bootstrap-icons/disc-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/disc.svg b/assets/static/bootstrap-icons/disc.svg new file mode 100644 index 0000000..360034c --- /dev/null +++ b/assets/static/bootstrap-icons/disc.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/discord.svg b/assets/static/bootstrap-icons/discord.svg new file mode 100644 index 0000000..9905364 --- /dev/null +++ b/assets/static/bootstrap-icons/discord.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/display-fill.svg b/assets/static/bootstrap-icons/display-fill.svg new file mode 100644 index 0000000..ed8e17e --- /dev/null +++ b/assets/static/bootstrap-icons/display-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/display.svg b/assets/static/bootstrap-icons/display.svg new file mode 100644 index 0000000..40a7d4d --- /dev/null +++ b/assets/static/bootstrap-icons/display.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/displayport-fill.svg b/assets/static/bootstrap-icons/displayport-fill.svg new file mode 100644 index 0000000..503a960 --- /dev/null +++ b/assets/static/bootstrap-icons/displayport-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/displayport.svg b/assets/static/bootstrap-icons/displayport.svg new file mode 100644 index 0000000..6b9e0bf --- /dev/null +++ b/assets/static/bootstrap-icons/displayport.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/distribute-horizontal.svg b/assets/static/bootstrap-icons/distribute-horizontal.svg new file mode 100644 index 0000000..3f7044f --- /dev/null +++ b/assets/static/bootstrap-icons/distribute-horizontal.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/distribute-vertical.svg b/assets/static/bootstrap-icons/distribute-vertical.svg new file mode 100644 index 0000000..cb77d1e --- /dev/null +++ b/assets/static/bootstrap-icons/distribute-vertical.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/door-closed-fill.svg b/assets/static/bootstrap-icons/door-closed-fill.svg new file mode 100644 index 0000000..1cad66b --- /dev/null +++ b/assets/static/bootstrap-icons/door-closed-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/door-closed.svg b/assets/static/bootstrap-icons/door-closed.svg new file mode 100644 index 0000000..e20b918 --- /dev/null +++ b/assets/static/bootstrap-icons/door-closed.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/door-open-fill.svg b/assets/static/bootstrap-icons/door-open-fill.svg new file mode 100644 index 0000000..38eaff0 --- /dev/null +++ b/assets/static/bootstrap-icons/door-open-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/door-open.svg b/assets/static/bootstrap-icons/door-open.svg new file mode 100644 index 0000000..328f353 --- /dev/null +++ b/assets/static/bootstrap-icons/door-open.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dot.svg b/assets/static/bootstrap-icons/dot.svg new file mode 100644 index 0000000..edc674e --- /dev/null +++ b/assets/static/bootstrap-icons/dot.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/download.svg b/assets/static/bootstrap-icons/download.svg new file mode 100644 index 0000000..90a34a3 --- /dev/null +++ b/assets/static/bootstrap-icons/download.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dpad-fill.svg b/assets/static/bootstrap-icons/dpad-fill.svg new file mode 100644 index 0000000..1c1153a --- /dev/null +++ b/assets/static/bootstrap-icons/dpad-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dpad.svg b/assets/static/bootstrap-icons/dpad.svg new file mode 100644 index 0000000..71ddb24 --- /dev/null +++ b/assets/static/bootstrap-icons/dpad.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dribbble.svg b/assets/static/bootstrap-icons/dribbble.svg new file mode 100644 index 0000000..725ff7f --- /dev/null +++ b/assets/static/bootstrap-icons/dribbble.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/dropbox.svg b/assets/static/bootstrap-icons/dropbox.svg new file mode 100644 index 0000000..d052f25 --- /dev/null +++ b/assets/static/bootstrap-icons/dropbox.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/droplet-fill.svg b/assets/static/bootstrap-icons/droplet-fill.svg new file mode 100644 index 0000000..85feddf --- /dev/null +++ b/assets/static/bootstrap-icons/droplet-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/droplet-half.svg b/assets/static/bootstrap-icons/droplet-half.svg new file mode 100644 index 0000000..bcd1c76 --- /dev/null +++ b/assets/static/bootstrap-icons/droplet-half.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/droplet.svg b/assets/static/bootstrap-icons/droplet.svg new file mode 100644 index 0000000..204ec67 --- /dev/null +++ b/assets/static/bootstrap-icons/droplet.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/duffle-fill.svg b/assets/static/bootstrap-icons/duffle-fill.svg new file mode 100644 index 0000000..885ee80 --- /dev/null +++ b/assets/static/bootstrap-icons/duffle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/duffle.svg b/assets/static/bootstrap-icons/duffle.svg new file mode 100644 index 0000000..1180de8 --- /dev/null +++ b/assets/static/bootstrap-icons/duffle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/ear-fill.svg b/assets/static/bootstrap-icons/ear-fill.svg new file mode 100644 index 0000000..2d135d6 --- /dev/null +++ b/assets/static/bootstrap-icons/ear-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/ear.svg b/assets/static/bootstrap-icons/ear.svg new file mode 100644 index 0000000..061fe2f --- /dev/null +++ b/assets/static/bootstrap-icons/ear.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/earbuds.svg b/assets/static/bootstrap-icons/earbuds.svg new file mode 100644 index 0000000..923bfca --- /dev/null +++ b/assets/static/bootstrap-icons/earbuds.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/easel-fill.svg b/assets/static/bootstrap-icons/easel-fill.svg new file mode 100644 index 0000000..8086507 --- /dev/null +++ b/assets/static/bootstrap-icons/easel-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/easel.svg b/assets/static/bootstrap-icons/easel.svg new file mode 100644 index 0000000..5c0f5a2 --- /dev/null +++ b/assets/static/bootstrap-icons/easel.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/easel2-fill.svg b/assets/static/bootstrap-icons/easel2-fill.svg new file mode 100644 index 0000000..309b438 --- /dev/null +++ b/assets/static/bootstrap-icons/easel2-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/easel2.svg b/assets/static/bootstrap-icons/easel2.svg new file mode 100644 index 0000000..74372fb --- /dev/null +++ b/assets/static/bootstrap-icons/easel2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/easel3-fill.svg b/assets/static/bootstrap-icons/easel3-fill.svg new file mode 100644 index 0000000..fc547ea --- /dev/null +++ b/assets/static/bootstrap-icons/easel3-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/easel3.svg b/assets/static/bootstrap-icons/easel3.svg new file mode 100644 index 0000000..f06a868 --- /dev/null +++ b/assets/static/bootstrap-icons/easel3.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/egg-fill.svg b/assets/static/bootstrap-icons/egg-fill.svg new file mode 100644 index 0000000..b70cf16 --- /dev/null +++ b/assets/static/bootstrap-icons/egg-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/egg-fried.svg b/assets/static/bootstrap-icons/egg-fried.svg new file mode 100644 index 0000000..b0cefbc --- /dev/null +++ b/assets/static/bootstrap-icons/egg-fried.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/egg.svg b/assets/static/bootstrap-icons/egg.svg new file mode 100644 index 0000000..f23d8d4 --- /dev/null +++ b/assets/static/bootstrap-icons/egg.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/eject-fill.svg b/assets/static/bootstrap-icons/eject-fill.svg new file mode 100644 index 0000000..9604988 --- /dev/null +++ b/assets/static/bootstrap-icons/eject-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/eject.svg b/assets/static/bootstrap-icons/eject.svg new file mode 100644 index 0000000..71a3ab6 --- /dev/null +++ b/assets/static/bootstrap-icons/eject.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-angry-fill.svg b/assets/static/bootstrap-icons/emoji-angry-fill.svg new file mode 100644 index 0000000..d14d92d --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-angry-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-angry.svg b/assets/static/bootstrap-icons/emoji-angry.svg new file mode 100644 index 0000000..ee925fe --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-angry.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-astonished-fill.svg b/assets/static/bootstrap-icons/emoji-astonished-fill.svg new file mode 100644 index 0000000..22a566f --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-astonished-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-astonished.svg b/assets/static/bootstrap-icons/emoji-astonished.svg new file mode 100644 index 0000000..13f7cdd --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-astonished.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-dizzy-fill.svg b/assets/static/bootstrap-icons/emoji-dizzy-fill.svg new file mode 100644 index 0000000..98ab490 --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-dizzy-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-dizzy.svg b/assets/static/bootstrap-icons/emoji-dizzy.svg new file mode 100644 index 0000000..fcef602 --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-dizzy.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-expressionless-fill.svg b/assets/static/bootstrap-icons/emoji-expressionless-fill.svg new file mode 100644 index 0000000..17ac348 --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-expressionless-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-expressionless.svg b/assets/static/bootstrap-icons/emoji-expressionless.svg new file mode 100644 index 0000000..8d7f68f --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-expressionless.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-frown-fill.svg b/assets/static/bootstrap-icons/emoji-frown-fill.svg new file mode 100644 index 0000000..7a16dfb --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-frown-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-frown.svg b/assets/static/bootstrap-icons/emoji-frown.svg new file mode 100644 index 0000000..696031b --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-frown.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-grimace-fill.svg b/assets/static/bootstrap-icons/emoji-grimace-fill.svg new file mode 100644 index 0000000..6cabf80 --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-grimace-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-grimace.svg b/assets/static/bootstrap-icons/emoji-grimace.svg new file mode 100644 index 0000000..75a2a09 --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-grimace.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-grin-fill.svg b/assets/static/bootstrap-icons/emoji-grin-fill.svg new file mode 100644 index 0000000..08c675e --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-grin-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-grin.svg b/assets/static/bootstrap-icons/emoji-grin.svg new file mode 100644 index 0000000..32bbf51 --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-grin.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-heart-eyes-fill.svg b/assets/static/bootstrap-icons/emoji-heart-eyes-fill.svg new file mode 100644 index 0000000..d34f6e8 --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-heart-eyes-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-heart-eyes.svg b/assets/static/bootstrap-icons/emoji-heart-eyes.svg new file mode 100644 index 0000000..5832822 --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-heart-eyes.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-kiss-fill.svg b/assets/static/bootstrap-icons/emoji-kiss-fill.svg new file mode 100644 index 0000000..15a9cdd --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-kiss-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-kiss.svg b/assets/static/bootstrap-icons/emoji-kiss.svg new file mode 100644 index 0000000..2348d97 --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-kiss.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-laughing-fill.svg b/assets/static/bootstrap-icons/emoji-laughing-fill.svg new file mode 100644 index 0000000..0130bf4 --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-laughing-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-laughing.svg b/assets/static/bootstrap-icons/emoji-laughing.svg new file mode 100644 index 0000000..76b87f5 --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-laughing.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-neutral-fill.svg b/assets/static/bootstrap-icons/emoji-neutral-fill.svg new file mode 100644 index 0000000..662603a --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-neutral-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-neutral.svg b/assets/static/bootstrap-icons/emoji-neutral.svg new file mode 100644 index 0000000..d6b60f8 --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-neutral.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-smile-fill.svg b/assets/static/bootstrap-icons/emoji-smile-fill.svg new file mode 100644 index 0000000..439dff0 --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-smile-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-smile-upside-down-fill.svg b/assets/static/bootstrap-icons/emoji-smile-upside-down-fill.svg new file mode 100644 index 0000000..2d6acca --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-smile-upside-down-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-smile-upside-down.svg b/assets/static/bootstrap-icons/emoji-smile-upside-down.svg new file mode 100644 index 0000000..d2d93ed --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-smile-upside-down.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-smile.svg b/assets/static/bootstrap-icons/emoji-smile.svg new file mode 100644 index 0000000..bba78da --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-smile.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-sunglasses-fill.svg b/assets/static/bootstrap-icons/emoji-sunglasses-fill.svg new file mode 100644 index 0000000..a1318c2 --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-sunglasses-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-sunglasses.svg b/assets/static/bootstrap-icons/emoji-sunglasses.svg new file mode 100644 index 0000000..188b56c --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-sunglasses.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-surprise-fill.svg b/assets/static/bootstrap-icons/emoji-surprise-fill.svg new file mode 100644 index 0000000..9f6f620 --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-surprise-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-surprise.svg b/assets/static/bootstrap-icons/emoji-surprise.svg new file mode 100644 index 0000000..af246bf --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-surprise.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-tear-fill.svg b/assets/static/bootstrap-icons/emoji-tear-fill.svg new file mode 100644 index 0000000..3ccf87d --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-tear-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-tear.svg b/assets/static/bootstrap-icons/emoji-tear.svg new file mode 100644 index 0000000..31b6597 --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-tear.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-wink-fill.svg b/assets/static/bootstrap-icons/emoji-wink-fill.svg new file mode 100644 index 0000000..2f3e480 --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-wink-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/emoji-wink.svg b/assets/static/bootstrap-icons/emoji-wink.svg new file mode 100644 index 0000000..7fe9116 --- /dev/null +++ b/assets/static/bootstrap-icons/emoji-wink.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-arrow-down-fill.svg b/assets/static/bootstrap-icons/envelope-arrow-down-fill.svg new file mode 100644 index 0000000..a5160e7 --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-arrow-down-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-arrow-down.svg b/assets/static/bootstrap-icons/envelope-arrow-down.svg new file mode 100644 index 0000000..36b6f54 --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-arrow-down.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-arrow-up-fill.svg b/assets/static/bootstrap-icons/envelope-arrow-up-fill.svg new file mode 100644 index 0000000..2757974 --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-arrow-up-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-arrow-up.svg b/assets/static/bootstrap-icons/envelope-arrow-up.svg new file mode 100644 index 0000000..ff2fae0 --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-arrow-up.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-at-fill.svg b/assets/static/bootstrap-icons/envelope-at-fill.svg new file mode 100644 index 0000000..e39ff38 --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-at-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-at.svg b/assets/static/bootstrap-icons/envelope-at.svg new file mode 100644 index 0000000..163c3ba --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-at.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-check-fill.svg b/assets/static/bootstrap-icons/envelope-check-fill.svg new file mode 100644 index 0000000..26d753a --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-check-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-check.svg b/assets/static/bootstrap-icons/envelope-check.svg new file mode 100644 index 0000000..fbc765b --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-check.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-dash-fill.svg b/assets/static/bootstrap-icons/envelope-dash-fill.svg new file mode 100644 index 0000000..6e9e745 --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-dash-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-dash.svg b/assets/static/bootstrap-icons/envelope-dash.svg new file mode 100644 index 0000000..d6457cf --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-dash.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-exclamation-fill.svg b/assets/static/bootstrap-icons/envelope-exclamation-fill.svg new file mode 100644 index 0000000..e14f047 --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-exclamation-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-exclamation.svg b/assets/static/bootstrap-icons/envelope-exclamation.svg new file mode 100644 index 0000000..4aca0a9 --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-exclamation.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-fill.svg b/assets/static/bootstrap-icons/envelope-fill.svg new file mode 100644 index 0000000..966ef94 --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-heart-fill.svg b/assets/static/bootstrap-icons/envelope-heart-fill.svg new file mode 100644 index 0000000..4158841 --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-heart-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-heart.svg b/assets/static/bootstrap-icons/envelope-heart.svg new file mode 100644 index 0000000..c886df2 --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-heart.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-open-fill.svg b/assets/static/bootstrap-icons/envelope-open-fill.svg new file mode 100644 index 0000000..972d0e3 --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-open-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-open-heart-fill.svg b/assets/static/bootstrap-icons/envelope-open-heart-fill.svg new file mode 100644 index 0000000..13263fa --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-open-heart-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-open-heart.svg b/assets/static/bootstrap-icons/envelope-open-heart.svg new file mode 100644 index 0000000..7018116 --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-open-heart.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-open.svg b/assets/static/bootstrap-icons/envelope-open.svg new file mode 100644 index 0000000..3daa2eb --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-open.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-paper-fill.svg b/assets/static/bootstrap-icons/envelope-paper-fill.svg new file mode 100644 index 0000000..c8a187c --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-paper-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-paper-heart-fill.svg b/assets/static/bootstrap-icons/envelope-paper-heart-fill.svg new file mode 100644 index 0000000..7f58d57 --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-paper-heart-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-paper-heart.svg b/assets/static/bootstrap-icons/envelope-paper-heart.svg new file mode 100644 index 0000000..73b91d9 --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-paper-heart.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-paper.svg b/assets/static/bootstrap-icons/envelope-paper.svg new file mode 100644 index 0000000..20fcc2a --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-paper.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-plus-fill.svg b/assets/static/bootstrap-icons/envelope-plus-fill.svg new file mode 100644 index 0000000..453a9fd --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-plus-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-plus.svg b/assets/static/bootstrap-icons/envelope-plus.svg new file mode 100644 index 0000000..7e960a0 --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-plus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-slash-fill.svg b/assets/static/bootstrap-icons/envelope-slash-fill.svg new file mode 100644 index 0000000..90eb7ef --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-slash-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-slash.svg b/assets/static/bootstrap-icons/envelope-slash.svg new file mode 100644 index 0000000..65cb167 --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-slash.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-x-fill.svg b/assets/static/bootstrap-icons/envelope-x-fill.svg new file mode 100644 index 0000000..8f6a79c --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-x-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope-x.svg b/assets/static/bootstrap-icons/envelope-x.svg new file mode 100644 index 0000000..ea74027 --- /dev/null +++ b/assets/static/bootstrap-icons/envelope-x.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/envelope.svg b/assets/static/bootstrap-icons/envelope.svg new file mode 100644 index 0000000..78bf1de --- /dev/null +++ b/assets/static/bootstrap-icons/envelope.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/eraser-fill.svg b/assets/static/bootstrap-icons/eraser-fill.svg new file mode 100644 index 0000000..c3866e1 --- /dev/null +++ b/assets/static/bootstrap-icons/eraser-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/eraser.svg b/assets/static/bootstrap-icons/eraser.svg new file mode 100644 index 0000000..fe62336 --- /dev/null +++ b/assets/static/bootstrap-icons/eraser.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/escape.svg b/assets/static/bootstrap-icons/escape.svg new file mode 100644 index 0000000..66176b6 --- /dev/null +++ b/assets/static/bootstrap-icons/escape.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/ethernet.svg b/assets/static/bootstrap-icons/ethernet.svg new file mode 100644 index 0000000..739a2de --- /dev/null +++ b/assets/static/bootstrap-icons/ethernet.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/ev-front-fill.svg b/assets/static/bootstrap-icons/ev-front-fill.svg new file mode 100644 index 0000000..53b947d --- /dev/null +++ b/assets/static/bootstrap-icons/ev-front-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/ev-front.svg b/assets/static/bootstrap-icons/ev-front.svg new file mode 100644 index 0000000..7f053a5 --- /dev/null +++ b/assets/static/bootstrap-icons/ev-front.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/ev-station-fill.svg b/assets/static/bootstrap-icons/ev-station-fill.svg new file mode 100644 index 0000000..a1ad007 --- /dev/null +++ b/assets/static/bootstrap-icons/ev-station-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/ev-station.svg b/assets/static/bootstrap-icons/ev-station.svg new file mode 100644 index 0000000..90470f6 --- /dev/null +++ b/assets/static/bootstrap-icons/ev-station.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/exclamation-circle-fill.svg b/assets/static/bootstrap-icons/exclamation-circle-fill.svg new file mode 100644 index 0000000..13ce7ab --- /dev/null +++ b/assets/static/bootstrap-icons/exclamation-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/exclamation-circle.svg b/assets/static/bootstrap-icons/exclamation-circle.svg new file mode 100644 index 0000000..f3befe0 --- /dev/null +++ b/assets/static/bootstrap-icons/exclamation-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/exclamation-diamond-fill.svg b/assets/static/bootstrap-icons/exclamation-diamond-fill.svg new file mode 100644 index 0000000..cb14aee --- /dev/null +++ b/assets/static/bootstrap-icons/exclamation-diamond-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/exclamation-diamond.svg b/assets/static/bootstrap-icons/exclamation-diamond.svg new file mode 100644 index 0000000..4881e6d --- /dev/null +++ b/assets/static/bootstrap-icons/exclamation-diamond.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/exclamation-lg.svg b/assets/static/bootstrap-icons/exclamation-lg.svg new file mode 100644 index 0000000..18f6a87 --- /dev/null +++ b/assets/static/bootstrap-icons/exclamation-lg.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/exclamation-octagon-fill.svg b/assets/static/bootstrap-icons/exclamation-octagon-fill.svg new file mode 100644 index 0000000..494010b --- /dev/null +++ b/assets/static/bootstrap-icons/exclamation-octagon-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/exclamation-octagon.svg b/assets/static/bootstrap-icons/exclamation-octagon.svg new file mode 100644 index 0000000..7f25938 --- /dev/null +++ b/assets/static/bootstrap-icons/exclamation-octagon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/exclamation-square-fill.svg b/assets/static/bootstrap-icons/exclamation-square-fill.svg new file mode 100644 index 0000000..d80a4e9 --- /dev/null +++ b/assets/static/bootstrap-icons/exclamation-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/exclamation-square.svg b/assets/static/bootstrap-icons/exclamation-square.svg new file mode 100644 index 0000000..2a0f2ae --- /dev/null +++ b/assets/static/bootstrap-icons/exclamation-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/exclamation-triangle-fill.svg b/assets/static/bootstrap-icons/exclamation-triangle-fill.svg new file mode 100644 index 0000000..52fd508 --- /dev/null +++ b/assets/static/bootstrap-icons/exclamation-triangle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/exclamation-triangle.svg b/assets/static/bootstrap-icons/exclamation-triangle.svg new file mode 100644 index 0000000..506b777 --- /dev/null +++ b/assets/static/bootstrap-icons/exclamation-triangle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/exclamation.svg b/assets/static/bootstrap-icons/exclamation.svg new file mode 100644 index 0000000..d39cb95 --- /dev/null +++ b/assets/static/bootstrap-icons/exclamation.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/exclude.svg b/assets/static/bootstrap-icons/exclude.svg new file mode 100644 index 0000000..ef18355 --- /dev/null +++ b/assets/static/bootstrap-icons/exclude.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/explicit-fill.svg b/assets/static/bootstrap-icons/explicit-fill.svg new file mode 100644 index 0000000..c0cb6f0 --- /dev/null +++ b/assets/static/bootstrap-icons/explicit-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/explicit.svg b/assets/static/bootstrap-icons/explicit.svg new file mode 100644 index 0000000..a7ffae7 --- /dev/null +++ b/assets/static/bootstrap-icons/explicit.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/exposure.svg b/assets/static/bootstrap-icons/exposure.svg new file mode 100644 index 0000000..9de0e64 --- /dev/null +++ b/assets/static/bootstrap-icons/exposure.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/eye-fill.svg b/assets/static/bootstrap-icons/eye-fill.svg new file mode 100644 index 0000000..288d2eb --- /dev/null +++ b/assets/static/bootstrap-icons/eye-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/eye-slash-fill.svg b/assets/static/bootstrap-icons/eye-slash-fill.svg new file mode 100644 index 0000000..10cca74 --- /dev/null +++ b/assets/static/bootstrap-icons/eye-slash-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/eye-slash.svg b/assets/static/bootstrap-icons/eye-slash.svg new file mode 100644 index 0000000..359c270 --- /dev/null +++ b/assets/static/bootstrap-icons/eye-slash.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/eye.svg b/assets/static/bootstrap-icons/eye.svg new file mode 100644 index 0000000..393b485 --- /dev/null +++ b/assets/static/bootstrap-icons/eye.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/eyedropper.svg b/assets/static/bootstrap-icons/eyedropper.svg new file mode 100644 index 0000000..4579888 --- /dev/null +++ b/assets/static/bootstrap-icons/eyedropper.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/eyeglasses.svg b/assets/static/bootstrap-icons/eyeglasses.svg new file mode 100644 index 0000000..6b2eb97 --- /dev/null +++ b/assets/static/bootstrap-icons/eyeglasses.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/facebook.svg b/assets/static/bootstrap-icons/facebook.svg new file mode 100644 index 0000000..5fc7cec --- /dev/null +++ b/assets/static/bootstrap-icons/facebook.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/fan.svg b/assets/static/bootstrap-icons/fan.svg new file mode 100644 index 0000000..ec8fe20 --- /dev/null +++ b/assets/static/bootstrap-icons/fan.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/fast-forward-btn-fill.svg b/assets/static/bootstrap-icons/fast-forward-btn-fill.svg new file mode 100644 index 0000000..fd750fe --- /dev/null +++ b/assets/static/bootstrap-icons/fast-forward-btn-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/fast-forward-btn.svg b/assets/static/bootstrap-icons/fast-forward-btn.svg new file mode 100644 index 0000000..5e68554 --- /dev/null +++ b/assets/static/bootstrap-icons/fast-forward-btn.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/fast-forward-circle-fill.svg b/assets/static/bootstrap-icons/fast-forward-circle-fill.svg new file mode 100644 index 0000000..3946fa3 --- /dev/null +++ b/assets/static/bootstrap-icons/fast-forward-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/fast-forward-circle.svg b/assets/static/bootstrap-icons/fast-forward-circle.svg new file mode 100644 index 0000000..e7f7158 --- /dev/null +++ b/assets/static/bootstrap-icons/fast-forward-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/fast-forward-fill.svg b/assets/static/bootstrap-icons/fast-forward-fill.svg new file mode 100644 index 0000000..ae17a7e --- /dev/null +++ b/assets/static/bootstrap-icons/fast-forward-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/fast-forward.svg b/assets/static/bootstrap-icons/fast-forward.svg new file mode 100644 index 0000000..2142979 --- /dev/null +++ b/assets/static/bootstrap-icons/fast-forward.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/feather.svg b/assets/static/bootstrap-icons/feather.svg new file mode 100644 index 0000000..f0462c2 --- /dev/null +++ b/assets/static/bootstrap-icons/feather.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/feather2.svg b/assets/static/bootstrap-icons/feather2.svg new file mode 100644 index 0000000..badc17a --- /dev/null +++ b/assets/static/bootstrap-icons/feather2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-arrow-down-fill.svg b/assets/static/bootstrap-icons/file-arrow-down-fill.svg new file mode 100644 index 0000000..5b5c552 --- /dev/null +++ b/assets/static/bootstrap-icons/file-arrow-down-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-arrow-down.svg b/assets/static/bootstrap-icons/file-arrow-down.svg new file mode 100644 index 0000000..f504b98 --- /dev/null +++ b/assets/static/bootstrap-icons/file-arrow-down.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-arrow-up-fill.svg b/assets/static/bootstrap-icons/file-arrow-up-fill.svg new file mode 100644 index 0000000..ef56199 --- /dev/null +++ b/assets/static/bootstrap-icons/file-arrow-up-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-arrow-up.svg b/assets/static/bootstrap-icons/file-arrow-up.svg new file mode 100644 index 0000000..9c88467 --- /dev/null +++ b/assets/static/bootstrap-icons/file-arrow-up.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-bar-graph-fill.svg b/assets/static/bootstrap-icons/file-bar-graph-fill.svg new file mode 100644 index 0000000..686b60b --- /dev/null +++ b/assets/static/bootstrap-icons/file-bar-graph-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-bar-graph.svg b/assets/static/bootstrap-icons/file-bar-graph.svg new file mode 100644 index 0000000..f953927 --- /dev/null +++ b/assets/static/bootstrap-icons/file-bar-graph.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-binary-fill.svg b/assets/static/bootstrap-icons/file-binary-fill.svg new file mode 100644 index 0000000..920c2a7 --- /dev/null +++ b/assets/static/bootstrap-icons/file-binary-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-binary.svg b/assets/static/bootstrap-icons/file-binary.svg new file mode 100644 index 0000000..0ecece7 --- /dev/null +++ b/assets/static/bootstrap-icons/file-binary.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-break-fill.svg b/assets/static/bootstrap-icons/file-break-fill.svg new file mode 100644 index 0000000..bdbe1b9 --- /dev/null +++ b/assets/static/bootstrap-icons/file-break-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-break.svg b/assets/static/bootstrap-icons/file-break.svg new file mode 100644 index 0000000..e94b3a3 --- /dev/null +++ b/assets/static/bootstrap-icons/file-break.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-check-fill.svg b/assets/static/bootstrap-icons/file-check-fill.svg new file mode 100644 index 0000000..cf165d3 --- /dev/null +++ b/assets/static/bootstrap-icons/file-check-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-check.svg b/assets/static/bootstrap-icons/file-check.svg new file mode 100644 index 0000000..10863e1 --- /dev/null +++ b/assets/static/bootstrap-icons/file-check.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-code-fill.svg b/assets/static/bootstrap-icons/file-code-fill.svg new file mode 100644 index 0000000..912ed0c --- /dev/null +++ b/assets/static/bootstrap-icons/file-code-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-code.svg b/assets/static/bootstrap-icons/file-code.svg new file mode 100644 index 0000000..58b0014 --- /dev/null +++ b/assets/static/bootstrap-icons/file-code.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-diff-fill.svg b/assets/static/bootstrap-icons/file-diff-fill.svg new file mode 100644 index 0000000..c108b87 --- /dev/null +++ b/assets/static/bootstrap-icons/file-diff-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-diff.svg b/assets/static/bootstrap-icons/file-diff.svg new file mode 100644 index 0000000..088c6de --- /dev/null +++ b/assets/static/bootstrap-icons/file-diff.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-arrow-down-fill.svg b/assets/static/bootstrap-icons/file-earmark-arrow-down-fill.svg new file mode 100644 index 0000000..3941f1f --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-arrow-down-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-arrow-down.svg b/assets/static/bootstrap-icons/file-earmark-arrow-down.svg new file mode 100644 index 0000000..37c4cd5 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-arrow-down.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-arrow-up-fill.svg b/assets/static/bootstrap-icons/file-earmark-arrow-up-fill.svg new file mode 100644 index 0000000..97a339d --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-arrow-up-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-arrow-up.svg b/assets/static/bootstrap-icons/file-earmark-arrow-up.svg new file mode 100644 index 0000000..1c827e9 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-arrow-up.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-bar-graph-fill.svg b/assets/static/bootstrap-icons/file-earmark-bar-graph-fill.svg new file mode 100644 index 0000000..a4c69b5 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-bar-graph-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-bar-graph.svg b/assets/static/bootstrap-icons/file-earmark-bar-graph.svg new file mode 100644 index 0000000..d367eca --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-bar-graph.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-binary-fill.svg b/assets/static/bootstrap-icons/file-earmark-binary-fill.svg new file mode 100644 index 0000000..a1f9933 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-binary-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-binary.svg b/assets/static/bootstrap-icons/file-earmark-binary.svg new file mode 100644 index 0000000..1528578 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-binary.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-break-fill.svg b/assets/static/bootstrap-icons/file-earmark-break-fill.svg new file mode 100644 index 0000000..e9aadce --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-break-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-break.svg b/assets/static/bootstrap-icons/file-earmark-break.svg new file mode 100644 index 0000000..4874715 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-break.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-check-fill.svg b/assets/static/bootstrap-icons/file-earmark-check-fill.svg new file mode 100644 index 0000000..f3e9eb3 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-check-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-check.svg b/assets/static/bootstrap-icons/file-earmark-check.svg new file mode 100644 index 0000000..dc36963 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-check.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-code-fill.svg b/assets/static/bootstrap-icons/file-earmark-code-fill.svg new file mode 100644 index 0000000..2c154fa --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-code-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-code.svg b/assets/static/bootstrap-icons/file-earmark-code.svg new file mode 100644 index 0000000..ccd3528 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-code.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-diff-fill.svg b/assets/static/bootstrap-icons/file-earmark-diff-fill.svg new file mode 100644 index 0000000..3b71e66 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-diff-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-diff.svg b/assets/static/bootstrap-icons/file-earmark-diff.svg new file mode 100644 index 0000000..97dfc0b --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-diff.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-easel-fill.svg b/assets/static/bootstrap-icons/file-earmark-easel-fill.svg new file mode 100644 index 0000000..e74c974 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-easel-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-easel.svg b/assets/static/bootstrap-icons/file-earmark-easel.svg new file mode 100644 index 0000000..2feeabc --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-easel.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-excel-fill.svg b/assets/static/bootstrap-icons/file-earmark-excel-fill.svg new file mode 100644 index 0000000..405a572 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-excel-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-excel.svg b/assets/static/bootstrap-icons/file-earmark-excel.svg new file mode 100644 index 0000000..5432bcf --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-excel.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-fill.svg b/assets/static/bootstrap-icons/file-earmark-fill.svg new file mode 100644 index 0000000..2f3ef6c --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-font-fill.svg b/assets/static/bootstrap-icons/file-earmark-font-fill.svg new file mode 100644 index 0000000..d3014bf --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-font-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-font.svg b/assets/static/bootstrap-icons/file-earmark-font.svg new file mode 100644 index 0000000..c9864cd --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-font.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-image-fill.svg b/assets/static/bootstrap-icons/file-earmark-image-fill.svg new file mode 100644 index 0000000..3ec76dc --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-image-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-image.svg b/assets/static/bootstrap-icons/file-earmark-image.svg new file mode 100644 index 0000000..1c3815d --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-image.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-lock-fill.svg b/assets/static/bootstrap-icons/file-earmark-lock-fill.svg new file mode 100644 index 0000000..4c45a61 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-lock-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-lock.svg b/assets/static/bootstrap-icons/file-earmark-lock.svg new file mode 100644 index 0000000..c8319a6 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-lock.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-lock2-fill.svg b/assets/static/bootstrap-icons/file-earmark-lock2-fill.svg new file mode 100644 index 0000000..76e8bd8 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-lock2-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-lock2.svg b/assets/static/bootstrap-icons/file-earmark-lock2.svg new file mode 100644 index 0000000..bd8f592 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-lock2.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-medical-fill.svg b/assets/static/bootstrap-icons/file-earmark-medical-fill.svg new file mode 100644 index 0000000..42a0581 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-medical-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-medical.svg b/assets/static/bootstrap-icons/file-earmark-medical.svg new file mode 100644 index 0000000..e24c90c --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-medical.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-minus-fill.svg b/assets/static/bootstrap-icons/file-earmark-minus-fill.svg new file mode 100644 index 0000000..a5dca2d --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-minus-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-minus.svg b/assets/static/bootstrap-icons/file-earmark-minus.svg new file mode 100644 index 0000000..cdc0026 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-minus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-music-fill.svg b/assets/static/bootstrap-icons/file-earmark-music-fill.svg new file mode 100644 index 0000000..b865e4e --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-music-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-music.svg b/assets/static/bootstrap-icons/file-earmark-music.svg new file mode 100644 index 0000000..e18ec85 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-music.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-pdf-fill.svg b/assets/static/bootstrap-icons/file-earmark-pdf-fill.svg new file mode 100644 index 0000000..219c5a3 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-pdf-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-pdf.svg b/assets/static/bootstrap-icons/file-earmark-pdf.svg new file mode 100644 index 0000000..51b9975 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-pdf.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-person-fill.svg b/assets/static/bootstrap-icons/file-earmark-person-fill.svg new file mode 100644 index 0000000..49ceda6 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-person-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-person.svg b/assets/static/bootstrap-icons/file-earmark-person.svg new file mode 100644 index 0000000..08a78cc --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-person.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-play-fill.svg b/assets/static/bootstrap-icons/file-earmark-play-fill.svg new file mode 100644 index 0000000..341eb37 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-play-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-play.svg b/assets/static/bootstrap-icons/file-earmark-play.svg new file mode 100644 index 0000000..abe215b --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-play.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-plus-fill.svg b/assets/static/bootstrap-icons/file-earmark-plus-fill.svg new file mode 100644 index 0000000..ef99c8a --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-plus-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-plus.svg b/assets/static/bootstrap-icons/file-earmark-plus.svg new file mode 100644 index 0000000..964e855 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-plus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-post-fill.svg b/assets/static/bootstrap-icons/file-earmark-post-fill.svg new file mode 100644 index 0000000..548773f --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-post-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-post.svg b/assets/static/bootstrap-icons/file-earmark-post.svg new file mode 100644 index 0000000..d9f44a1 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-post.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-ppt-fill.svg b/assets/static/bootstrap-icons/file-earmark-ppt-fill.svg new file mode 100644 index 0000000..e96a461 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-ppt-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-ppt.svg b/assets/static/bootstrap-icons/file-earmark-ppt.svg new file mode 100644 index 0000000..cab71bc --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-ppt.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-richtext-fill.svg b/assets/static/bootstrap-icons/file-earmark-richtext-fill.svg new file mode 100644 index 0000000..55da25c --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-richtext-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-richtext.svg b/assets/static/bootstrap-icons/file-earmark-richtext.svg new file mode 100644 index 0000000..3f3a6ad --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-richtext.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-ruled-fill.svg b/assets/static/bootstrap-icons/file-earmark-ruled-fill.svg new file mode 100644 index 0000000..ee90c80 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-ruled-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-ruled.svg b/assets/static/bootstrap-icons/file-earmark-ruled.svg new file mode 100644 index 0000000..ebd617e --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-ruled.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-slides-fill.svg b/assets/static/bootstrap-icons/file-earmark-slides-fill.svg new file mode 100644 index 0000000..e7f76f4 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-slides-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-slides.svg b/assets/static/bootstrap-icons/file-earmark-slides.svg new file mode 100644 index 0000000..e643cd3 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-slides.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-spreadsheet-fill.svg b/assets/static/bootstrap-icons/file-earmark-spreadsheet-fill.svg new file mode 100644 index 0000000..02ac9ec --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-spreadsheet-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-spreadsheet.svg b/assets/static/bootstrap-icons/file-earmark-spreadsheet.svg new file mode 100644 index 0000000..a6bb6e4 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-spreadsheet.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-text-fill.svg b/assets/static/bootstrap-icons/file-earmark-text-fill.svg new file mode 100644 index 0000000..bfedd6b --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-text-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-text.svg b/assets/static/bootstrap-icons/file-earmark-text.svg new file mode 100644 index 0000000..7ae53fc --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-text.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-word-fill.svg b/assets/static/bootstrap-icons/file-earmark-word-fill.svg new file mode 100644 index 0000000..259e767 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-word-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-word.svg b/assets/static/bootstrap-icons/file-earmark-word.svg new file mode 100644 index 0000000..ef4727c --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-word.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-x-fill.svg b/assets/static/bootstrap-icons/file-earmark-x-fill.svg new file mode 100644 index 0000000..f683966 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-x-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-x.svg b/assets/static/bootstrap-icons/file-earmark-x.svg new file mode 100644 index 0000000..4dd9da9 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-x.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-zip-fill.svg b/assets/static/bootstrap-icons/file-earmark-zip-fill.svg new file mode 100644 index 0000000..a17fa9e --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-zip-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark-zip.svg b/assets/static/bootstrap-icons/file-earmark-zip.svg new file mode 100644 index 0000000..f5f8ccc --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark-zip.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-earmark.svg b/assets/static/bootstrap-icons/file-earmark.svg new file mode 100644 index 0000000..d8d8774 --- /dev/null +++ b/assets/static/bootstrap-icons/file-earmark.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-easel-fill.svg b/assets/static/bootstrap-icons/file-easel-fill.svg new file mode 100644 index 0000000..fa9f915 --- /dev/null +++ b/assets/static/bootstrap-icons/file-easel-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-easel.svg b/assets/static/bootstrap-icons/file-easel.svg new file mode 100644 index 0000000..6366bc0 --- /dev/null +++ b/assets/static/bootstrap-icons/file-easel.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-excel-fill.svg b/assets/static/bootstrap-icons/file-excel-fill.svg new file mode 100644 index 0000000..bddcea2 --- /dev/null +++ b/assets/static/bootstrap-icons/file-excel-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-excel.svg b/assets/static/bootstrap-icons/file-excel.svg new file mode 100644 index 0000000..8bf2f5e --- /dev/null +++ b/assets/static/bootstrap-icons/file-excel.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-fill.svg b/assets/static/bootstrap-icons/file-fill.svg new file mode 100644 index 0000000..e5f8c4a --- /dev/null +++ b/assets/static/bootstrap-icons/file-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-font-fill.svg b/assets/static/bootstrap-icons/file-font-fill.svg new file mode 100644 index 0000000..6bda7b1 --- /dev/null +++ b/assets/static/bootstrap-icons/file-font-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-font.svg b/assets/static/bootstrap-icons/file-font.svg new file mode 100644 index 0000000..b75f9a4 --- /dev/null +++ b/assets/static/bootstrap-icons/file-font.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-image-fill.svg b/assets/static/bootstrap-icons/file-image-fill.svg new file mode 100644 index 0000000..7c73ece --- /dev/null +++ b/assets/static/bootstrap-icons/file-image-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-image.svg b/assets/static/bootstrap-icons/file-image.svg new file mode 100644 index 0000000..b063628 --- /dev/null +++ b/assets/static/bootstrap-icons/file-image.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-lock-fill.svg b/assets/static/bootstrap-icons/file-lock-fill.svg new file mode 100644 index 0000000..1f7c3f2 --- /dev/null +++ b/assets/static/bootstrap-icons/file-lock-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-lock.svg b/assets/static/bootstrap-icons/file-lock.svg new file mode 100644 index 0000000..195deef --- /dev/null +++ b/assets/static/bootstrap-icons/file-lock.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-lock2-fill.svg b/assets/static/bootstrap-icons/file-lock2-fill.svg new file mode 100644 index 0000000..82426e8 --- /dev/null +++ b/assets/static/bootstrap-icons/file-lock2-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-lock2.svg b/assets/static/bootstrap-icons/file-lock2.svg new file mode 100644 index 0000000..125a747 --- /dev/null +++ b/assets/static/bootstrap-icons/file-lock2.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-medical-fill.svg b/assets/static/bootstrap-icons/file-medical-fill.svg new file mode 100644 index 0000000..2f4d3b2 --- /dev/null +++ b/assets/static/bootstrap-icons/file-medical-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-medical.svg b/assets/static/bootstrap-icons/file-medical.svg new file mode 100644 index 0000000..07e8495 --- /dev/null +++ b/assets/static/bootstrap-icons/file-medical.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-minus-fill.svg b/assets/static/bootstrap-icons/file-minus-fill.svg new file mode 100644 index 0000000..99f7d53 --- /dev/null +++ b/assets/static/bootstrap-icons/file-minus-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-minus.svg b/assets/static/bootstrap-icons/file-minus.svg new file mode 100644 index 0000000..880409b --- /dev/null +++ b/assets/static/bootstrap-icons/file-minus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-music-fill.svg b/assets/static/bootstrap-icons/file-music-fill.svg new file mode 100644 index 0000000..38099f3 --- /dev/null +++ b/assets/static/bootstrap-icons/file-music-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-music.svg b/assets/static/bootstrap-icons/file-music.svg new file mode 100644 index 0000000..a24d41e --- /dev/null +++ b/assets/static/bootstrap-icons/file-music.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-pdf-fill.svg b/assets/static/bootstrap-icons/file-pdf-fill.svg new file mode 100644 index 0000000..c88d1b8 --- /dev/null +++ b/assets/static/bootstrap-icons/file-pdf-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-pdf.svg b/assets/static/bootstrap-icons/file-pdf.svg new file mode 100644 index 0000000..e7bdcba --- /dev/null +++ b/assets/static/bootstrap-icons/file-pdf.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-person-fill.svg b/assets/static/bootstrap-icons/file-person-fill.svg new file mode 100644 index 0000000..c212b00 --- /dev/null +++ b/assets/static/bootstrap-icons/file-person-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-person.svg b/assets/static/bootstrap-icons/file-person.svg new file mode 100644 index 0000000..e102abf --- /dev/null +++ b/assets/static/bootstrap-icons/file-person.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-play-fill.svg b/assets/static/bootstrap-icons/file-play-fill.svg new file mode 100644 index 0000000..a6dce8a --- /dev/null +++ b/assets/static/bootstrap-icons/file-play-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-play.svg b/assets/static/bootstrap-icons/file-play.svg new file mode 100644 index 0000000..d5505e3 --- /dev/null +++ b/assets/static/bootstrap-icons/file-play.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-plus-fill.svg b/assets/static/bootstrap-icons/file-plus-fill.svg new file mode 100644 index 0000000..bdb7ee0 --- /dev/null +++ b/assets/static/bootstrap-icons/file-plus-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-plus.svg b/assets/static/bootstrap-icons/file-plus.svg new file mode 100644 index 0000000..af41ae1 --- /dev/null +++ b/assets/static/bootstrap-icons/file-plus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-post-fill.svg b/assets/static/bootstrap-icons/file-post-fill.svg new file mode 100644 index 0000000..336f219 --- /dev/null +++ b/assets/static/bootstrap-icons/file-post-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-post.svg b/assets/static/bootstrap-icons/file-post.svg new file mode 100644 index 0000000..6807724 --- /dev/null +++ b/assets/static/bootstrap-icons/file-post.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-ppt-fill.svg b/assets/static/bootstrap-icons/file-ppt-fill.svg new file mode 100644 index 0000000..b8c3973 --- /dev/null +++ b/assets/static/bootstrap-icons/file-ppt-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-ppt.svg b/assets/static/bootstrap-icons/file-ppt.svg new file mode 100644 index 0000000..bee27d4 --- /dev/null +++ b/assets/static/bootstrap-icons/file-ppt.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-richtext-fill.svg b/assets/static/bootstrap-icons/file-richtext-fill.svg new file mode 100644 index 0000000..a98e5d7 --- /dev/null +++ b/assets/static/bootstrap-icons/file-richtext-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-richtext.svg b/assets/static/bootstrap-icons/file-richtext.svg new file mode 100644 index 0000000..3ceb420 --- /dev/null +++ b/assets/static/bootstrap-icons/file-richtext.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-ruled-fill.svg b/assets/static/bootstrap-icons/file-ruled-fill.svg new file mode 100644 index 0000000..8bfe726 --- /dev/null +++ b/assets/static/bootstrap-icons/file-ruled-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-ruled.svg b/assets/static/bootstrap-icons/file-ruled.svg new file mode 100644 index 0000000..7236cfc --- /dev/null +++ b/assets/static/bootstrap-icons/file-ruled.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-slides-fill.svg b/assets/static/bootstrap-icons/file-slides-fill.svg new file mode 100644 index 0000000..b75d3f7 --- /dev/null +++ b/assets/static/bootstrap-icons/file-slides-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-slides.svg b/assets/static/bootstrap-icons/file-slides.svg new file mode 100644 index 0000000..0e63548 --- /dev/null +++ b/assets/static/bootstrap-icons/file-slides.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-spreadsheet-fill.svg b/assets/static/bootstrap-icons/file-spreadsheet-fill.svg new file mode 100644 index 0000000..6db7eb6 --- /dev/null +++ b/assets/static/bootstrap-icons/file-spreadsheet-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-spreadsheet.svg b/assets/static/bootstrap-icons/file-spreadsheet.svg new file mode 100644 index 0000000..55b53ec --- /dev/null +++ b/assets/static/bootstrap-icons/file-spreadsheet.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-text-fill.svg b/assets/static/bootstrap-icons/file-text-fill.svg new file mode 100644 index 0000000..6da36b2 --- /dev/null +++ b/assets/static/bootstrap-icons/file-text-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-text.svg b/assets/static/bootstrap-icons/file-text.svg new file mode 100644 index 0000000..95dc704 --- /dev/null +++ b/assets/static/bootstrap-icons/file-text.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-word-fill.svg b/assets/static/bootstrap-icons/file-word-fill.svg new file mode 100644 index 0000000..6f578f0 --- /dev/null +++ b/assets/static/bootstrap-icons/file-word-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-word.svg b/assets/static/bootstrap-icons/file-word.svg new file mode 100644 index 0000000..732b59a --- /dev/null +++ b/assets/static/bootstrap-icons/file-word.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-x-fill.svg b/assets/static/bootstrap-icons/file-x-fill.svg new file mode 100644 index 0000000..0455659 --- /dev/null +++ b/assets/static/bootstrap-icons/file-x-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-x.svg b/assets/static/bootstrap-icons/file-x.svg new file mode 100644 index 0000000..5ab0b48 --- /dev/null +++ b/assets/static/bootstrap-icons/file-x.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-zip-fill.svg b/assets/static/bootstrap-icons/file-zip-fill.svg new file mode 100644 index 0000000..1d80366 --- /dev/null +++ b/assets/static/bootstrap-icons/file-zip-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file-zip.svg b/assets/static/bootstrap-icons/file-zip.svg new file mode 100644 index 0000000..e3b633e --- /dev/null +++ b/assets/static/bootstrap-icons/file-zip.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/file.svg b/assets/static/bootstrap-icons/file.svg new file mode 100644 index 0000000..4a5dd73 --- /dev/null +++ b/assets/static/bootstrap-icons/file.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/files-alt.svg b/assets/static/bootstrap-icons/files-alt.svg new file mode 100644 index 0000000..b42d764 --- /dev/null +++ b/assets/static/bootstrap-icons/files-alt.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/files.svg b/assets/static/bootstrap-icons/files.svg new file mode 100644 index 0000000..6170ab5 --- /dev/null +++ b/assets/static/bootstrap-icons/files.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-aac.svg b/assets/static/bootstrap-icons/filetype-aac.svg new file mode 100644 index 0000000..b6a5c47 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-aac.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-ai.svg b/assets/static/bootstrap-icons/filetype-ai.svg new file mode 100644 index 0000000..fe2bcaa --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-ai.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-bmp.svg b/assets/static/bootstrap-icons/filetype-bmp.svg new file mode 100644 index 0000000..587381c --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-bmp.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-cs.svg b/assets/static/bootstrap-icons/filetype-cs.svg new file mode 100644 index 0000000..90ed8de --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-cs.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-css.svg b/assets/static/bootstrap-icons/filetype-css.svg new file mode 100644 index 0000000..8f0864f --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-css.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-csv.svg b/assets/static/bootstrap-icons/filetype-csv.svg new file mode 100644 index 0000000..fa097aa --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-csv.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-doc.svg b/assets/static/bootstrap-icons/filetype-doc.svg new file mode 100644 index 0000000..f75847f --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-doc.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-docx.svg b/assets/static/bootstrap-icons/filetype-docx.svg new file mode 100644 index 0000000..1b6c172 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-docx.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-exe.svg b/assets/static/bootstrap-icons/filetype-exe.svg new file mode 100644 index 0000000..cdafeb1 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-exe.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-gif.svg b/assets/static/bootstrap-icons/filetype-gif.svg new file mode 100644 index 0000000..b39234f --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-gif.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-heic.svg b/assets/static/bootstrap-icons/filetype-heic.svg new file mode 100644 index 0000000..a022060 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-heic.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-html.svg b/assets/static/bootstrap-icons/filetype-html.svg new file mode 100644 index 0000000..1661a94 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-html.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-java.svg b/assets/static/bootstrap-icons/filetype-java.svg new file mode 100644 index 0000000..eeeab41 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-java.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-jpg.svg b/assets/static/bootstrap-icons/filetype-jpg.svg new file mode 100644 index 0000000..7d939ec --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-jpg.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-js.svg b/assets/static/bootstrap-icons/filetype-js.svg new file mode 100644 index 0000000..4f4a00c --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-js.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-json.svg b/assets/static/bootstrap-icons/filetype-json.svg new file mode 100644 index 0000000..a4ccced --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-json.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-jsx.svg b/assets/static/bootstrap-icons/filetype-jsx.svg new file mode 100644 index 0000000..256b5c5 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-jsx.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-key.svg b/assets/static/bootstrap-icons/filetype-key.svg new file mode 100644 index 0000000..d164bc8 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-key.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-m4p.svg b/assets/static/bootstrap-icons/filetype-m4p.svg new file mode 100644 index 0000000..ae8f611 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-m4p.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-md.svg b/assets/static/bootstrap-icons/filetype-md.svg new file mode 100644 index 0000000..40e5139 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-md.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-mdx.svg b/assets/static/bootstrap-icons/filetype-mdx.svg new file mode 100644 index 0000000..43a9153 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-mdx.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-mov.svg b/assets/static/bootstrap-icons/filetype-mov.svg new file mode 100644 index 0000000..27e6391 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-mov.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-mp3.svg b/assets/static/bootstrap-icons/filetype-mp3.svg new file mode 100644 index 0000000..f25e6a8 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-mp3.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-mp4.svg b/assets/static/bootstrap-icons/filetype-mp4.svg new file mode 100644 index 0000000..d27e9ff --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-mp4.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-otf.svg b/assets/static/bootstrap-icons/filetype-otf.svg new file mode 100644 index 0000000..f16eb61 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-otf.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-pdf.svg b/assets/static/bootstrap-icons/filetype-pdf.svg new file mode 100644 index 0000000..e8bb772 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-pdf.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-php.svg b/assets/static/bootstrap-icons/filetype-php.svg new file mode 100644 index 0000000..4d532df --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-php.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-png.svg b/assets/static/bootstrap-icons/filetype-png.svg new file mode 100644 index 0000000..659e266 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-png.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-ppt.svg b/assets/static/bootstrap-icons/filetype-ppt.svg new file mode 100644 index 0000000..e53b1ec --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-ppt.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-pptx.svg b/assets/static/bootstrap-icons/filetype-pptx.svg new file mode 100644 index 0000000..f68e939 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-pptx.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-psd.svg b/assets/static/bootstrap-icons/filetype-psd.svg new file mode 100644 index 0000000..6fefd08 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-psd.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-py.svg b/assets/static/bootstrap-icons/filetype-py.svg new file mode 100644 index 0000000..14fd4ef --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-py.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-raw.svg b/assets/static/bootstrap-icons/filetype-raw.svg new file mode 100644 index 0000000..da98185 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-raw.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-rb.svg b/assets/static/bootstrap-icons/filetype-rb.svg new file mode 100644 index 0000000..3466a1f --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-rb.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-sass.svg b/assets/static/bootstrap-icons/filetype-sass.svg new file mode 100644 index 0000000..3632662 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-sass.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-scss.svg b/assets/static/bootstrap-icons/filetype-scss.svg new file mode 100644 index 0000000..8d1935f --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-scss.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-sh.svg b/assets/static/bootstrap-icons/filetype-sh.svg new file mode 100644 index 0000000..592c408 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-sh.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-sql.svg b/assets/static/bootstrap-icons/filetype-sql.svg new file mode 100644 index 0000000..814137d --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-sql.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-svg.svg b/assets/static/bootstrap-icons/filetype-svg.svg new file mode 100644 index 0000000..222d9ac --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-svg.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-tiff.svg b/assets/static/bootstrap-icons/filetype-tiff.svg new file mode 100644 index 0000000..e101575 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-tiff.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-tsx.svg b/assets/static/bootstrap-icons/filetype-tsx.svg new file mode 100644 index 0000000..73dd643 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-tsx.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-ttf.svg b/assets/static/bootstrap-icons/filetype-ttf.svg new file mode 100644 index 0000000..9c93584 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-ttf.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-txt.svg b/assets/static/bootstrap-icons/filetype-txt.svg new file mode 100644 index 0000000..1e27bcf --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-txt.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-wav.svg b/assets/static/bootstrap-icons/filetype-wav.svg new file mode 100644 index 0000000..6725640 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-wav.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-woff.svg b/assets/static/bootstrap-icons/filetype-woff.svg new file mode 100644 index 0000000..f29a4b1 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-woff.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-xls.svg b/assets/static/bootstrap-icons/filetype-xls.svg new file mode 100644 index 0000000..5f79b16 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-xls.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-xlsx.svg b/assets/static/bootstrap-icons/filetype-xlsx.svg new file mode 100644 index 0000000..5202bf7 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-xlsx.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-xml.svg b/assets/static/bootstrap-icons/filetype-xml.svg new file mode 100644 index 0000000..ba9ffb6 --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-xml.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filetype-yml.svg b/assets/static/bootstrap-icons/filetype-yml.svg new file mode 100644 index 0000000..17a9ebe --- /dev/null +++ b/assets/static/bootstrap-icons/filetype-yml.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/film.svg b/assets/static/bootstrap-icons/film.svg new file mode 100644 index 0000000..40c2eb9 --- /dev/null +++ b/assets/static/bootstrap-icons/film.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filter-circle-fill.svg b/assets/static/bootstrap-icons/filter-circle-fill.svg new file mode 100644 index 0000000..1aa0f39 --- /dev/null +++ b/assets/static/bootstrap-icons/filter-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filter-circle.svg b/assets/static/bootstrap-icons/filter-circle.svg new file mode 100644 index 0000000..42c1b84 --- /dev/null +++ b/assets/static/bootstrap-icons/filter-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filter-left.svg b/assets/static/bootstrap-icons/filter-left.svg new file mode 100644 index 0000000..bb1ee92 --- /dev/null +++ b/assets/static/bootstrap-icons/filter-left.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filter-right.svg b/assets/static/bootstrap-icons/filter-right.svg new file mode 100644 index 0000000..6a5083c --- /dev/null +++ b/assets/static/bootstrap-icons/filter-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filter-square-fill.svg b/assets/static/bootstrap-icons/filter-square-fill.svg new file mode 100644 index 0000000..438b8c2 --- /dev/null +++ b/assets/static/bootstrap-icons/filter-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filter-square.svg b/assets/static/bootstrap-icons/filter-square.svg new file mode 100644 index 0000000..d243b0b --- /dev/null +++ b/assets/static/bootstrap-icons/filter-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/filter.svg b/assets/static/bootstrap-icons/filter.svg new file mode 100644 index 0000000..a7d7dac --- /dev/null +++ b/assets/static/bootstrap-icons/filter.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/fingerprint.svg b/assets/static/bootstrap-icons/fingerprint.svg new file mode 100644 index 0000000..08252bb --- /dev/null +++ b/assets/static/bootstrap-icons/fingerprint.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/fire.svg b/assets/static/bootstrap-icons/fire.svg new file mode 100644 index 0000000..a58e6dd --- /dev/null +++ b/assets/static/bootstrap-icons/fire.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/flag-fill.svg b/assets/static/bootstrap-icons/flag-fill.svg new file mode 100644 index 0000000..8b92331 --- /dev/null +++ b/assets/static/bootstrap-icons/flag-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/flag.svg b/assets/static/bootstrap-icons/flag.svg new file mode 100644 index 0000000..f8b6dab --- /dev/null +++ b/assets/static/bootstrap-icons/flag.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/floppy-fill.svg b/assets/static/bootstrap-icons/floppy-fill.svg new file mode 100644 index 0000000..87a43ce --- /dev/null +++ b/assets/static/bootstrap-icons/floppy-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/floppy.svg b/assets/static/bootstrap-icons/floppy.svg new file mode 100644 index 0000000..65ae562 --- /dev/null +++ b/assets/static/bootstrap-icons/floppy.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/floppy2-fill.svg b/assets/static/bootstrap-icons/floppy2-fill.svg new file mode 100644 index 0000000..61a6cdb --- /dev/null +++ b/assets/static/bootstrap-icons/floppy2-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/floppy2.svg b/assets/static/bootstrap-icons/floppy2.svg new file mode 100644 index 0000000..2412389 --- /dev/null +++ b/assets/static/bootstrap-icons/floppy2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/flower1.svg b/assets/static/bootstrap-icons/flower1.svg new file mode 100644 index 0000000..3495858 --- /dev/null +++ b/assets/static/bootstrap-icons/flower1.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/flower2.svg b/assets/static/bootstrap-icons/flower2.svg new file mode 100644 index 0000000..664a9c2 --- /dev/null +++ b/assets/static/bootstrap-icons/flower2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/flower3.svg b/assets/static/bootstrap-icons/flower3.svg new file mode 100644 index 0000000..66845c3 --- /dev/null +++ b/assets/static/bootstrap-icons/flower3.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/folder-check.svg b/assets/static/bootstrap-icons/folder-check.svg new file mode 100644 index 0000000..57c6466 --- /dev/null +++ b/assets/static/bootstrap-icons/folder-check.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/folder-fill.svg b/assets/static/bootstrap-icons/folder-fill.svg new file mode 100644 index 0000000..113350c --- /dev/null +++ b/assets/static/bootstrap-icons/folder-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/folder-minus.svg b/assets/static/bootstrap-icons/folder-minus.svg new file mode 100644 index 0000000..41db30b --- /dev/null +++ b/assets/static/bootstrap-icons/folder-minus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/folder-plus.svg b/assets/static/bootstrap-icons/folder-plus.svg new file mode 100644 index 0000000..85b5a18 --- /dev/null +++ b/assets/static/bootstrap-icons/folder-plus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/folder-symlink-fill.svg b/assets/static/bootstrap-icons/folder-symlink-fill.svg new file mode 100644 index 0000000..6407400 --- /dev/null +++ b/assets/static/bootstrap-icons/folder-symlink-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/folder-symlink.svg b/assets/static/bootstrap-icons/folder-symlink.svg new file mode 100644 index 0000000..7137637 --- /dev/null +++ b/assets/static/bootstrap-icons/folder-symlink.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/folder-x.svg b/assets/static/bootstrap-icons/folder-x.svg new file mode 100644 index 0000000..a6ed341 --- /dev/null +++ b/assets/static/bootstrap-icons/folder-x.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/folder.svg b/assets/static/bootstrap-icons/folder.svg new file mode 100644 index 0000000..a30c452 --- /dev/null +++ b/assets/static/bootstrap-icons/folder.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/folder2-open.svg b/assets/static/bootstrap-icons/folder2-open.svg new file mode 100644 index 0000000..7ffbb54 --- /dev/null +++ b/assets/static/bootstrap-icons/folder2-open.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/folder2.svg b/assets/static/bootstrap-icons/folder2.svg new file mode 100644 index 0000000..ce6a1af --- /dev/null +++ b/assets/static/bootstrap-icons/folder2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/font/bootstrap-icons.css b/assets/static/bootstrap-icons/font/bootstrap-icons.css new file mode 100644 index 0000000..bc84a5f --- /dev/null +++ b/assets/static/bootstrap-icons/font/bootstrap-icons.css @@ -0,0 +1,2078 @@ +/*! + * Bootstrap Icons v1.11.3 (https://icons.getbootstrap.com/) + * Copyright 2019-2024 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/icons/blob/main/LICENSE) + */ + +@font-face { + font-display: block; + font-family: "bootstrap-icons"; + src: url("./fonts/bootstrap-icons.woff2?dd67030699838ea613ee6dbda90effa6") format("woff2"), +url("./fonts/bootstrap-icons.woff?dd67030699838ea613ee6dbda90effa6") format("woff"); +} + +.bi::before, +[class^="bi-"]::before, +[class*=" bi-"]::before { + display: inline-block; + font-family: bootstrap-icons !important; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: -.125em; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.bi-123::before { content: "\f67f"; } +.bi-alarm-fill::before { content: "\f101"; } +.bi-alarm::before { content: "\f102"; } +.bi-align-bottom::before { content: "\f103"; } +.bi-align-center::before { content: "\f104"; } +.bi-align-end::before { content: "\f105"; } +.bi-align-middle::before { content: "\f106"; } +.bi-align-start::before { content: "\f107"; } +.bi-align-top::before { content: "\f108"; } +.bi-alt::before { content: "\f109"; } +.bi-app-indicator::before { content: "\f10a"; } +.bi-app::before { content: "\f10b"; } +.bi-archive-fill::before { content: "\f10c"; } +.bi-archive::before { content: "\f10d"; } +.bi-arrow-90deg-down::before { content: "\f10e"; } +.bi-arrow-90deg-left::before { content: "\f10f"; } +.bi-arrow-90deg-right::before { content: "\f110"; } +.bi-arrow-90deg-up::before { content: "\f111"; } +.bi-arrow-bar-down::before { content: "\f112"; } +.bi-arrow-bar-left::before { content: "\f113"; } +.bi-arrow-bar-right::before { content: "\f114"; } +.bi-arrow-bar-up::before { content: "\f115"; } +.bi-arrow-clockwise::before { content: "\f116"; } +.bi-arrow-counterclockwise::before { content: "\f117"; } +.bi-arrow-down-circle-fill::before { content: "\f118"; } +.bi-arrow-down-circle::before { content: "\f119"; } +.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } +.bi-arrow-down-left-circle::before { content: "\f11b"; } +.bi-arrow-down-left-square-fill::before { content: "\f11c"; } +.bi-arrow-down-left-square::before { content: "\f11d"; } +.bi-arrow-down-left::before { content: "\f11e"; } +.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } +.bi-arrow-down-right-circle::before { content: "\f120"; } +.bi-arrow-down-right-square-fill::before { content: "\f121"; } +.bi-arrow-down-right-square::before { content: "\f122"; } +.bi-arrow-down-right::before { content: "\f123"; } +.bi-arrow-down-short::before { content: "\f124"; } +.bi-arrow-down-square-fill::before { content: "\f125"; } +.bi-arrow-down-square::before { content: "\f126"; } +.bi-arrow-down-up::before { content: "\f127"; } +.bi-arrow-down::before { content: "\f128"; } +.bi-arrow-left-circle-fill::before { content: "\f129"; } +.bi-arrow-left-circle::before { content: "\f12a"; } +.bi-arrow-left-right::before { content: "\f12b"; } +.bi-arrow-left-short::before { content: "\f12c"; } +.bi-arrow-left-square-fill::before { content: "\f12d"; } +.bi-arrow-left-square::before { content: "\f12e"; } +.bi-arrow-left::before { content: "\f12f"; } +.bi-arrow-repeat::before { content: "\f130"; } +.bi-arrow-return-left::before { content: "\f131"; } +.bi-arrow-return-right::before { content: "\f132"; } +.bi-arrow-right-circle-fill::before { content: "\f133"; } +.bi-arrow-right-circle::before { content: "\f134"; } +.bi-arrow-right-short::before { content: "\f135"; } +.bi-arrow-right-square-fill::before { content: "\f136"; } +.bi-arrow-right-square::before { content: "\f137"; } +.bi-arrow-right::before { content: "\f138"; } +.bi-arrow-up-circle-fill::before { content: "\f139"; } +.bi-arrow-up-circle::before { content: "\f13a"; } +.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } +.bi-arrow-up-left-circle::before { content: "\f13c"; } +.bi-arrow-up-left-square-fill::before { content: "\f13d"; } +.bi-arrow-up-left-square::before { content: "\f13e"; } +.bi-arrow-up-left::before { content: "\f13f"; } +.bi-arrow-up-right-circle-fill::before { content: "\f140"; } +.bi-arrow-up-right-circle::before { content: "\f141"; } +.bi-arrow-up-right-square-fill::before { content: "\f142"; } +.bi-arrow-up-right-square::before { content: "\f143"; } +.bi-arrow-up-right::before { content: "\f144"; } +.bi-arrow-up-short::before { content: "\f145"; } +.bi-arrow-up-square-fill::before { content: "\f146"; } +.bi-arrow-up-square::before { content: "\f147"; } +.bi-arrow-up::before { content: "\f148"; } +.bi-arrows-angle-contract::before { content: "\f149"; } +.bi-arrows-angle-expand::before { content: "\f14a"; } +.bi-arrows-collapse::before { content: "\f14b"; } +.bi-arrows-expand::before { content: "\f14c"; } +.bi-arrows-fullscreen::before { content: "\f14d"; } +.bi-arrows-move::before { content: "\f14e"; } +.bi-aspect-ratio-fill::before { content: "\f14f"; } +.bi-aspect-ratio::before { content: "\f150"; } +.bi-asterisk::before { content: "\f151"; } +.bi-at::before { content: "\f152"; } +.bi-award-fill::before { content: "\f153"; } +.bi-award::before { content: "\f154"; } +.bi-back::before { content: "\f155"; } +.bi-backspace-fill::before { content: "\f156"; } +.bi-backspace-reverse-fill::before { content: "\f157"; } +.bi-backspace-reverse::before { content: "\f158"; } +.bi-backspace::before { content: "\f159"; } +.bi-badge-3d-fill::before { content: "\f15a"; } +.bi-badge-3d::before { content: "\f15b"; } +.bi-badge-4k-fill::before { content: "\f15c"; } +.bi-badge-4k::before { content: "\f15d"; } +.bi-badge-8k-fill::before { content: "\f15e"; } +.bi-badge-8k::before { content: "\f15f"; } +.bi-badge-ad-fill::before { content: "\f160"; } +.bi-badge-ad::before { content: "\f161"; } +.bi-badge-ar-fill::before { content: "\f162"; } +.bi-badge-ar::before { content: "\f163"; } +.bi-badge-cc-fill::before { content: "\f164"; } +.bi-badge-cc::before { content: "\f165"; } +.bi-badge-hd-fill::before { content: "\f166"; } +.bi-badge-hd::before { content: "\f167"; } +.bi-badge-tm-fill::before { content: "\f168"; } +.bi-badge-tm::before { content: "\f169"; } +.bi-badge-vo-fill::before { content: "\f16a"; } +.bi-badge-vo::before { content: "\f16b"; } +.bi-badge-vr-fill::before { content: "\f16c"; } +.bi-badge-vr::before { content: "\f16d"; } +.bi-badge-wc-fill::before { content: "\f16e"; } +.bi-badge-wc::before { content: "\f16f"; } +.bi-bag-check-fill::before { content: "\f170"; } +.bi-bag-check::before { content: "\f171"; } +.bi-bag-dash-fill::before { content: "\f172"; } +.bi-bag-dash::before { content: "\f173"; } +.bi-bag-fill::before { content: "\f174"; } +.bi-bag-plus-fill::before { content: "\f175"; } +.bi-bag-plus::before { content: "\f176"; } +.bi-bag-x-fill::before { content: "\f177"; } +.bi-bag-x::before { content: "\f178"; } +.bi-bag::before { content: "\f179"; } +.bi-bar-chart-fill::before { content: "\f17a"; } +.bi-bar-chart-line-fill::before { content: "\f17b"; } +.bi-bar-chart-line::before { content: "\f17c"; } +.bi-bar-chart-steps::before { content: "\f17d"; } +.bi-bar-chart::before { content: "\f17e"; } +.bi-basket-fill::before { content: "\f17f"; } +.bi-basket::before { content: "\f180"; } +.bi-basket2-fill::before { content: "\f181"; } +.bi-basket2::before { content: "\f182"; } +.bi-basket3-fill::before { content: "\f183"; } +.bi-basket3::before { content: "\f184"; } +.bi-battery-charging::before { content: "\f185"; } +.bi-battery-full::before { content: "\f186"; } +.bi-battery-half::before { content: "\f187"; } +.bi-battery::before { content: "\f188"; } +.bi-bell-fill::before { content: "\f189"; } +.bi-bell::before { content: "\f18a"; } +.bi-bezier::before { content: "\f18b"; } +.bi-bezier2::before { content: "\f18c"; } +.bi-bicycle::before { content: "\f18d"; } +.bi-binoculars-fill::before { content: "\f18e"; } +.bi-binoculars::before { content: "\f18f"; } +.bi-blockquote-left::before { content: "\f190"; } +.bi-blockquote-right::before { content: "\f191"; } +.bi-book-fill::before { content: "\f192"; } +.bi-book-half::before { content: "\f193"; } +.bi-book::before { content: "\f194"; } +.bi-bookmark-check-fill::before { content: "\f195"; } +.bi-bookmark-check::before { content: "\f196"; } +.bi-bookmark-dash-fill::before { content: "\f197"; } +.bi-bookmark-dash::before { content: "\f198"; } +.bi-bookmark-fill::before { content: "\f199"; } +.bi-bookmark-heart-fill::before { content: "\f19a"; } +.bi-bookmark-heart::before { content: "\f19b"; } +.bi-bookmark-plus-fill::before { content: "\f19c"; } +.bi-bookmark-plus::before { content: "\f19d"; } +.bi-bookmark-star-fill::before { content: "\f19e"; } +.bi-bookmark-star::before { content: "\f19f"; } +.bi-bookmark-x-fill::before { content: "\f1a0"; } +.bi-bookmark-x::before { content: "\f1a1"; } +.bi-bookmark::before { content: "\f1a2"; } +.bi-bookmarks-fill::before { content: "\f1a3"; } +.bi-bookmarks::before { content: "\f1a4"; } +.bi-bookshelf::before { content: "\f1a5"; } +.bi-bootstrap-fill::before { content: "\f1a6"; } +.bi-bootstrap-reboot::before { content: "\f1a7"; } +.bi-bootstrap::before { content: "\f1a8"; } +.bi-border-all::before { content: "\f1a9"; } +.bi-border-bottom::before { content: "\f1aa"; } +.bi-border-center::before { content: "\f1ab"; } +.bi-border-inner::before { content: "\f1ac"; } +.bi-border-left::before { content: "\f1ad"; } +.bi-border-middle::before { content: "\f1ae"; } +.bi-border-outer::before { content: "\f1af"; } +.bi-border-right::before { content: "\f1b0"; } +.bi-border-style::before { content: "\f1b1"; } +.bi-border-top::before { content: "\f1b2"; } +.bi-border-width::before { content: "\f1b3"; } +.bi-border::before { content: "\f1b4"; } +.bi-bounding-box-circles::before { content: "\f1b5"; } +.bi-bounding-box::before { content: "\f1b6"; } +.bi-box-arrow-down-left::before { content: "\f1b7"; } +.bi-box-arrow-down-right::before { content: "\f1b8"; } +.bi-box-arrow-down::before { content: "\f1b9"; } +.bi-box-arrow-in-down-left::before { content: "\f1ba"; } +.bi-box-arrow-in-down-right::before { content: "\f1bb"; } +.bi-box-arrow-in-down::before { content: "\f1bc"; } +.bi-box-arrow-in-left::before { content: "\f1bd"; } +.bi-box-arrow-in-right::before { content: "\f1be"; } +.bi-box-arrow-in-up-left::before { content: "\f1bf"; } +.bi-box-arrow-in-up-right::before { content: "\f1c0"; } +.bi-box-arrow-in-up::before { content: "\f1c1"; } +.bi-box-arrow-left::before { content: "\f1c2"; } +.bi-box-arrow-right::before { content: "\f1c3"; } +.bi-box-arrow-up-left::before { content: "\f1c4"; } +.bi-box-arrow-up-right::before { content: "\f1c5"; } +.bi-box-arrow-up::before { content: "\f1c6"; } +.bi-box-seam::before { content: "\f1c7"; } +.bi-box::before { content: "\f1c8"; } +.bi-braces::before { content: "\f1c9"; } +.bi-bricks::before { content: "\f1ca"; } +.bi-briefcase-fill::before { content: "\f1cb"; } +.bi-briefcase::before { content: "\f1cc"; } +.bi-brightness-alt-high-fill::before { content: "\f1cd"; } +.bi-brightness-alt-high::before { content: "\f1ce"; } +.bi-brightness-alt-low-fill::before { content: "\f1cf"; } +.bi-brightness-alt-low::before { content: "\f1d0"; } +.bi-brightness-high-fill::before { content: "\f1d1"; } +.bi-brightness-high::before { content: "\f1d2"; } +.bi-brightness-low-fill::before { content: "\f1d3"; } +.bi-brightness-low::before { content: "\f1d4"; } +.bi-broadcast-pin::before { content: "\f1d5"; } +.bi-broadcast::before { content: "\f1d6"; } +.bi-brush-fill::before { content: "\f1d7"; } +.bi-brush::before { content: "\f1d8"; } +.bi-bucket-fill::before { content: "\f1d9"; } +.bi-bucket::before { content: "\f1da"; } +.bi-bug-fill::before { content: "\f1db"; } +.bi-bug::before { content: "\f1dc"; } +.bi-building::before { content: "\f1dd"; } +.bi-bullseye::before { content: "\f1de"; } +.bi-calculator-fill::before { content: "\f1df"; } +.bi-calculator::before { content: "\f1e0"; } +.bi-calendar-check-fill::before { content: "\f1e1"; } +.bi-calendar-check::before { content: "\f1e2"; } +.bi-calendar-date-fill::before { content: "\f1e3"; } +.bi-calendar-date::before { content: "\f1e4"; } +.bi-calendar-day-fill::before { content: "\f1e5"; } +.bi-calendar-day::before { content: "\f1e6"; } +.bi-calendar-event-fill::before { content: "\f1e7"; } +.bi-calendar-event::before { content: "\f1e8"; } +.bi-calendar-fill::before { content: "\f1e9"; } +.bi-calendar-minus-fill::before { content: "\f1ea"; } +.bi-calendar-minus::before { content: "\f1eb"; } +.bi-calendar-month-fill::before { content: "\f1ec"; } +.bi-calendar-month::before { content: "\f1ed"; } +.bi-calendar-plus-fill::before { content: "\f1ee"; } +.bi-calendar-plus::before { content: "\f1ef"; } +.bi-calendar-range-fill::before { content: "\f1f0"; } +.bi-calendar-range::before { content: "\f1f1"; } +.bi-calendar-week-fill::before { content: "\f1f2"; } +.bi-calendar-week::before { content: "\f1f3"; } +.bi-calendar-x-fill::before { content: "\f1f4"; } +.bi-calendar-x::before { content: "\f1f5"; } +.bi-calendar::before { content: "\f1f6"; } +.bi-calendar2-check-fill::before { content: "\f1f7"; } +.bi-calendar2-check::before { content: "\f1f8"; } +.bi-calendar2-date-fill::before { content: "\f1f9"; } +.bi-calendar2-date::before { content: "\f1fa"; } +.bi-calendar2-day-fill::before { content: "\f1fb"; } +.bi-calendar2-day::before { content: "\f1fc"; } +.bi-calendar2-event-fill::before { content: "\f1fd"; } +.bi-calendar2-event::before { content: "\f1fe"; } +.bi-calendar2-fill::before { content: "\f1ff"; } +.bi-calendar2-minus-fill::before { content: "\f200"; } +.bi-calendar2-minus::before { content: "\f201"; } +.bi-calendar2-month-fill::before { content: "\f202"; } +.bi-calendar2-month::before { content: "\f203"; } +.bi-calendar2-plus-fill::before { content: "\f204"; } +.bi-calendar2-plus::before { content: "\f205"; } +.bi-calendar2-range-fill::before { content: "\f206"; } +.bi-calendar2-range::before { content: "\f207"; } +.bi-calendar2-week-fill::before { content: "\f208"; } +.bi-calendar2-week::before { content: "\f209"; } +.bi-calendar2-x-fill::before { content: "\f20a"; } +.bi-calendar2-x::before { content: "\f20b"; } +.bi-calendar2::before { content: "\f20c"; } +.bi-calendar3-event-fill::before { content: "\f20d"; } +.bi-calendar3-event::before { content: "\f20e"; } +.bi-calendar3-fill::before { content: "\f20f"; } +.bi-calendar3-range-fill::before { content: "\f210"; } +.bi-calendar3-range::before { content: "\f211"; } +.bi-calendar3-week-fill::before { content: "\f212"; } +.bi-calendar3-week::before { content: "\f213"; } +.bi-calendar3::before { content: "\f214"; } +.bi-calendar4-event::before { content: "\f215"; } +.bi-calendar4-range::before { content: "\f216"; } +.bi-calendar4-week::before { content: "\f217"; } +.bi-calendar4::before { content: "\f218"; } +.bi-camera-fill::before { content: "\f219"; } +.bi-camera-reels-fill::before { content: "\f21a"; } +.bi-camera-reels::before { content: "\f21b"; } +.bi-camera-video-fill::before { content: "\f21c"; } +.bi-camera-video-off-fill::before { content: "\f21d"; } +.bi-camera-video-off::before { content: "\f21e"; } +.bi-camera-video::before { content: "\f21f"; } +.bi-camera::before { content: "\f220"; } +.bi-camera2::before { content: "\f221"; } +.bi-capslock-fill::before { content: "\f222"; } +.bi-capslock::before { content: "\f223"; } +.bi-card-checklist::before { content: "\f224"; } +.bi-card-heading::before { content: "\f225"; } +.bi-card-image::before { content: "\f226"; } +.bi-card-list::before { content: "\f227"; } +.bi-card-text::before { content: "\f228"; } +.bi-caret-down-fill::before { content: "\f229"; } +.bi-caret-down-square-fill::before { content: "\f22a"; } +.bi-caret-down-square::before { content: "\f22b"; } +.bi-caret-down::before { content: "\f22c"; } +.bi-caret-left-fill::before { content: "\f22d"; } +.bi-caret-left-square-fill::before { content: "\f22e"; } +.bi-caret-left-square::before { content: "\f22f"; } +.bi-caret-left::before { content: "\f230"; } +.bi-caret-right-fill::before { content: "\f231"; } +.bi-caret-right-square-fill::before { content: "\f232"; } +.bi-caret-right-square::before { content: "\f233"; } +.bi-caret-right::before { content: "\f234"; } +.bi-caret-up-fill::before { content: "\f235"; } +.bi-caret-up-square-fill::before { content: "\f236"; } +.bi-caret-up-square::before { content: "\f237"; } +.bi-caret-up::before { content: "\f238"; } +.bi-cart-check-fill::before { content: "\f239"; } +.bi-cart-check::before { content: "\f23a"; } +.bi-cart-dash-fill::before { content: "\f23b"; } +.bi-cart-dash::before { content: "\f23c"; } +.bi-cart-fill::before { content: "\f23d"; } +.bi-cart-plus-fill::before { content: "\f23e"; } +.bi-cart-plus::before { content: "\f23f"; } +.bi-cart-x-fill::before { content: "\f240"; } +.bi-cart-x::before { content: "\f241"; } +.bi-cart::before { content: "\f242"; } +.bi-cart2::before { content: "\f243"; } +.bi-cart3::before { content: "\f244"; } +.bi-cart4::before { content: "\f245"; } +.bi-cash-stack::before { content: "\f246"; } +.bi-cash::before { content: "\f247"; } +.bi-cast::before { content: "\f248"; } +.bi-chat-dots-fill::before { content: "\f249"; } +.bi-chat-dots::before { content: "\f24a"; } +.bi-chat-fill::before { content: "\f24b"; } +.bi-chat-left-dots-fill::before { content: "\f24c"; } +.bi-chat-left-dots::before { content: "\f24d"; } +.bi-chat-left-fill::before { content: "\f24e"; } +.bi-chat-left-quote-fill::before { content: "\f24f"; } +.bi-chat-left-quote::before { content: "\f250"; } +.bi-chat-left-text-fill::before { content: "\f251"; } +.bi-chat-left-text::before { content: "\f252"; } +.bi-chat-left::before { content: "\f253"; } +.bi-chat-quote-fill::before { content: "\f254"; } +.bi-chat-quote::before { content: "\f255"; } +.bi-chat-right-dots-fill::before { content: "\f256"; } +.bi-chat-right-dots::before { content: "\f257"; } +.bi-chat-right-fill::before { content: "\f258"; } +.bi-chat-right-quote-fill::before { content: "\f259"; } +.bi-chat-right-quote::before { content: "\f25a"; } +.bi-chat-right-text-fill::before { content: "\f25b"; } +.bi-chat-right-text::before { content: "\f25c"; } +.bi-chat-right::before { content: "\f25d"; } +.bi-chat-square-dots-fill::before { content: "\f25e"; } +.bi-chat-square-dots::before { content: "\f25f"; } +.bi-chat-square-fill::before { content: "\f260"; } +.bi-chat-square-quote-fill::before { content: "\f261"; } +.bi-chat-square-quote::before { content: "\f262"; } +.bi-chat-square-text-fill::before { content: "\f263"; } +.bi-chat-square-text::before { content: "\f264"; } +.bi-chat-square::before { content: "\f265"; } +.bi-chat-text-fill::before { content: "\f266"; } +.bi-chat-text::before { content: "\f267"; } +.bi-chat::before { content: "\f268"; } +.bi-check-all::before { content: "\f269"; } +.bi-check-circle-fill::before { content: "\f26a"; } +.bi-check-circle::before { content: "\f26b"; } +.bi-check-square-fill::before { content: "\f26c"; } +.bi-check-square::before { content: "\f26d"; } +.bi-check::before { content: "\f26e"; } +.bi-check2-all::before { content: "\f26f"; } +.bi-check2-circle::before { content: "\f270"; } +.bi-check2-square::before { content: "\f271"; } +.bi-check2::before { content: "\f272"; } +.bi-chevron-bar-contract::before { content: "\f273"; } +.bi-chevron-bar-down::before { content: "\f274"; } +.bi-chevron-bar-expand::before { content: "\f275"; } +.bi-chevron-bar-left::before { content: "\f276"; } +.bi-chevron-bar-right::before { content: "\f277"; } +.bi-chevron-bar-up::before { content: "\f278"; } +.bi-chevron-compact-down::before { content: "\f279"; } +.bi-chevron-compact-left::before { content: "\f27a"; } +.bi-chevron-compact-right::before { content: "\f27b"; } +.bi-chevron-compact-up::before { content: "\f27c"; } +.bi-chevron-contract::before { content: "\f27d"; } +.bi-chevron-double-down::before { content: "\f27e"; } +.bi-chevron-double-left::before { content: "\f27f"; } +.bi-chevron-double-right::before { content: "\f280"; } +.bi-chevron-double-up::before { content: "\f281"; } +.bi-chevron-down::before { content: "\f282"; } +.bi-chevron-expand::before { content: "\f283"; } +.bi-chevron-left::before { content: "\f284"; } +.bi-chevron-right::before { content: "\f285"; } +.bi-chevron-up::before { content: "\f286"; } +.bi-circle-fill::before { content: "\f287"; } +.bi-circle-half::before { content: "\f288"; } +.bi-circle-square::before { content: "\f289"; } +.bi-circle::before { content: "\f28a"; } +.bi-clipboard-check::before { content: "\f28b"; } +.bi-clipboard-data::before { content: "\f28c"; } +.bi-clipboard-minus::before { content: "\f28d"; } +.bi-clipboard-plus::before { content: "\f28e"; } +.bi-clipboard-x::before { content: "\f28f"; } +.bi-clipboard::before { content: "\f290"; } +.bi-clock-fill::before { content: "\f291"; } +.bi-clock-history::before { content: "\f292"; } +.bi-clock::before { content: "\f293"; } +.bi-cloud-arrow-down-fill::before { content: "\f294"; } +.bi-cloud-arrow-down::before { content: "\f295"; } +.bi-cloud-arrow-up-fill::before { content: "\f296"; } +.bi-cloud-arrow-up::before { content: "\f297"; } +.bi-cloud-check-fill::before { content: "\f298"; } +.bi-cloud-check::before { content: "\f299"; } +.bi-cloud-download-fill::before { content: "\f29a"; } +.bi-cloud-download::before { content: "\f29b"; } +.bi-cloud-drizzle-fill::before { content: "\f29c"; } +.bi-cloud-drizzle::before { content: "\f29d"; } +.bi-cloud-fill::before { content: "\f29e"; } +.bi-cloud-fog-fill::before { content: "\f29f"; } +.bi-cloud-fog::before { content: "\f2a0"; } +.bi-cloud-fog2-fill::before { content: "\f2a1"; } +.bi-cloud-fog2::before { content: "\f2a2"; } +.bi-cloud-hail-fill::before { content: "\f2a3"; } +.bi-cloud-hail::before { content: "\f2a4"; } +.bi-cloud-haze-fill::before { content: "\f2a6"; } +.bi-cloud-haze::before { content: "\f2a7"; } +.bi-cloud-haze2-fill::before { content: "\f2a8"; } +.bi-cloud-lightning-fill::before { content: "\f2a9"; } +.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; } +.bi-cloud-lightning-rain::before { content: "\f2ab"; } +.bi-cloud-lightning::before { content: "\f2ac"; } +.bi-cloud-minus-fill::before { content: "\f2ad"; } +.bi-cloud-minus::before { content: "\f2ae"; } +.bi-cloud-moon-fill::before { content: "\f2af"; } +.bi-cloud-moon::before { content: "\f2b0"; } +.bi-cloud-plus-fill::before { content: "\f2b1"; } +.bi-cloud-plus::before { content: "\f2b2"; } +.bi-cloud-rain-fill::before { content: "\f2b3"; } +.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; } +.bi-cloud-rain-heavy::before { content: "\f2b5"; } +.bi-cloud-rain::before { content: "\f2b6"; } +.bi-cloud-slash-fill::before { content: "\f2b7"; } +.bi-cloud-slash::before { content: "\f2b8"; } +.bi-cloud-sleet-fill::before { content: "\f2b9"; } +.bi-cloud-sleet::before { content: "\f2ba"; } +.bi-cloud-snow-fill::before { content: "\f2bb"; } +.bi-cloud-snow::before { content: "\f2bc"; } +.bi-cloud-sun-fill::before { content: "\f2bd"; } +.bi-cloud-sun::before { content: "\f2be"; } +.bi-cloud-upload-fill::before { content: "\f2bf"; } +.bi-cloud-upload::before { content: "\f2c0"; } +.bi-cloud::before { content: "\f2c1"; } +.bi-clouds-fill::before { content: "\f2c2"; } +.bi-clouds::before { content: "\f2c3"; } +.bi-cloudy-fill::before { content: "\f2c4"; } +.bi-cloudy::before { content: "\f2c5"; } +.bi-code-slash::before { content: "\f2c6"; } +.bi-code-square::before { content: "\f2c7"; } +.bi-code::before { content: "\f2c8"; } +.bi-collection-fill::before { content: "\f2c9"; } +.bi-collection-play-fill::before { content: "\f2ca"; } +.bi-collection-play::before { content: "\f2cb"; } +.bi-collection::before { content: "\f2cc"; } +.bi-columns-gap::before { content: "\f2cd"; } +.bi-columns::before { content: "\f2ce"; } +.bi-command::before { content: "\f2cf"; } +.bi-compass-fill::before { content: "\f2d0"; } +.bi-compass::before { content: "\f2d1"; } +.bi-cone-striped::before { content: "\f2d2"; } +.bi-cone::before { content: "\f2d3"; } +.bi-controller::before { content: "\f2d4"; } +.bi-cpu-fill::before { content: "\f2d5"; } +.bi-cpu::before { content: "\f2d6"; } +.bi-credit-card-2-back-fill::before { content: "\f2d7"; } +.bi-credit-card-2-back::before { content: "\f2d8"; } +.bi-credit-card-2-front-fill::before { content: "\f2d9"; } +.bi-credit-card-2-front::before { content: "\f2da"; } +.bi-credit-card-fill::before { content: "\f2db"; } +.bi-credit-card::before { content: "\f2dc"; } +.bi-crop::before { content: "\f2dd"; } +.bi-cup-fill::before { content: "\f2de"; } +.bi-cup-straw::before { content: "\f2df"; } +.bi-cup::before { content: "\f2e0"; } +.bi-cursor-fill::before { content: "\f2e1"; } +.bi-cursor-text::before { content: "\f2e2"; } +.bi-cursor::before { content: "\f2e3"; } +.bi-dash-circle-dotted::before { content: "\f2e4"; } +.bi-dash-circle-fill::before { content: "\f2e5"; } +.bi-dash-circle::before { content: "\f2e6"; } +.bi-dash-square-dotted::before { content: "\f2e7"; } +.bi-dash-square-fill::before { content: "\f2e8"; } +.bi-dash-square::before { content: "\f2e9"; } +.bi-dash::before { content: "\f2ea"; } +.bi-diagram-2-fill::before { content: "\f2eb"; } +.bi-diagram-2::before { content: "\f2ec"; } +.bi-diagram-3-fill::before { content: "\f2ed"; } +.bi-diagram-3::before { content: "\f2ee"; } +.bi-diamond-fill::before { content: "\f2ef"; } +.bi-diamond-half::before { content: "\f2f0"; } +.bi-diamond::before { content: "\f2f1"; } +.bi-dice-1-fill::before { content: "\f2f2"; } +.bi-dice-1::before { content: "\f2f3"; } +.bi-dice-2-fill::before { content: "\f2f4"; } +.bi-dice-2::before { content: "\f2f5"; } +.bi-dice-3-fill::before { content: "\f2f6"; } +.bi-dice-3::before { content: "\f2f7"; } +.bi-dice-4-fill::before { content: "\f2f8"; } +.bi-dice-4::before { content: "\f2f9"; } +.bi-dice-5-fill::before { content: "\f2fa"; } +.bi-dice-5::before { content: "\f2fb"; } +.bi-dice-6-fill::before { content: "\f2fc"; } +.bi-dice-6::before { content: "\f2fd"; } +.bi-disc-fill::before { content: "\f2fe"; } +.bi-disc::before { content: "\f2ff"; } +.bi-discord::before { content: "\f300"; } +.bi-display-fill::before { content: "\f301"; } +.bi-display::before { content: "\f302"; } +.bi-distribute-horizontal::before { content: "\f303"; } +.bi-distribute-vertical::before { content: "\f304"; } +.bi-door-closed-fill::before { content: "\f305"; } +.bi-door-closed::before { content: "\f306"; } +.bi-door-open-fill::before { content: "\f307"; } +.bi-door-open::before { content: "\f308"; } +.bi-dot::before { content: "\f309"; } +.bi-download::before { content: "\f30a"; } +.bi-droplet-fill::before { content: "\f30b"; } +.bi-droplet-half::before { content: "\f30c"; } +.bi-droplet::before { content: "\f30d"; } +.bi-earbuds::before { content: "\f30e"; } +.bi-easel-fill::before { content: "\f30f"; } +.bi-easel::before { content: "\f310"; } +.bi-egg-fill::before { content: "\f311"; } +.bi-egg-fried::before { content: "\f312"; } +.bi-egg::before { content: "\f313"; } +.bi-eject-fill::before { content: "\f314"; } +.bi-eject::before { content: "\f315"; } +.bi-emoji-angry-fill::before { content: "\f316"; } +.bi-emoji-angry::before { content: "\f317"; } +.bi-emoji-dizzy-fill::before { content: "\f318"; } +.bi-emoji-dizzy::before { content: "\f319"; } +.bi-emoji-expressionless-fill::before { content: "\f31a"; } +.bi-emoji-expressionless::before { content: "\f31b"; } +.bi-emoji-frown-fill::before { content: "\f31c"; } +.bi-emoji-frown::before { content: "\f31d"; } +.bi-emoji-heart-eyes-fill::before { content: "\f31e"; } +.bi-emoji-heart-eyes::before { content: "\f31f"; } +.bi-emoji-laughing-fill::before { content: "\f320"; } +.bi-emoji-laughing::before { content: "\f321"; } +.bi-emoji-neutral-fill::before { content: "\f322"; } +.bi-emoji-neutral::before { content: "\f323"; } +.bi-emoji-smile-fill::before { content: "\f324"; } +.bi-emoji-smile-upside-down-fill::before { content: "\f325"; } +.bi-emoji-smile-upside-down::before { content: "\f326"; } +.bi-emoji-smile::before { content: "\f327"; } +.bi-emoji-sunglasses-fill::before { content: "\f328"; } +.bi-emoji-sunglasses::before { content: "\f329"; } +.bi-emoji-wink-fill::before { content: "\f32a"; } +.bi-emoji-wink::before { content: "\f32b"; } +.bi-envelope-fill::before { content: "\f32c"; } +.bi-envelope-open-fill::before { content: "\f32d"; } +.bi-envelope-open::before { content: "\f32e"; } +.bi-envelope::before { content: "\f32f"; } +.bi-eraser-fill::before { content: "\f330"; } +.bi-eraser::before { content: "\f331"; } +.bi-exclamation-circle-fill::before { content: "\f332"; } +.bi-exclamation-circle::before { content: "\f333"; } +.bi-exclamation-diamond-fill::before { content: "\f334"; } +.bi-exclamation-diamond::before { content: "\f335"; } +.bi-exclamation-octagon-fill::before { content: "\f336"; } +.bi-exclamation-octagon::before { content: "\f337"; } +.bi-exclamation-square-fill::before { content: "\f338"; } +.bi-exclamation-square::before { content: "\f339"; } +.bi-exclamation-triangle-fill::before { content: "\f33a"; } +.bi-exclamation-triangle::before { content: "\f33b"; } +.bi-exclamation::before { content: "\f33c"; } +.bi-exclude::before { content: "\f33d"; } +.bi-eye-fill::before { content: "\f33e"; } +.bi-eye-slash-fill::before { content: "\f33f"; } +.bi-eye-slash::before { content: "\f340"; } +.bi-eye::before { content: "\f341"; } +.bi-eyedropper::before { content: "\f342"; } +.bi-eyeglasses::before { content: "\f343"; } +.bi-facebook::before { content: "\f344"; } +.bi-file-arrow-down-fill::before { content: "\f345"; } +.bi-file-arrow-down::before { content: "\f346"; } +.bi-file-arrow-up-fill::before { content: "\f347"; } +.bi-file-arrow-up::before { content: "\f348"; } +.bi-file-bar-graph-fill::before { content: "\f349"; } +.bi-file-bar-graph::before { content: "\f34a"; } +.bi-file-binary-fill::before { content: "\f34b"; } +.bi-file-binary::before { content: "\f34c"; } +.bi-file-break-fill::before { content: "\f34d"; } +.bi-file-break::before { content: "\f34e"; } +.bi-file-check-fill::before { content: "\f34f"; } +.bi-file-check::before { content: "\f350"; } +.bi-file-code-fill::before { content: "\f351"; } +.bi-file-code::before { content: "\f352"; } +.bi-file-diff-fill::before { content: "\f353"; } +.bi-file-diff::before { content: "\f354"; } +.bi-file-earmark-arrow-down-fill::before { content: "\f355"; } +.bi-file-earmark-arrow-down::before { content: "\f356"; } +.bi-file-earmark-arrow-up-fill::before { content: "\f357"; } +.bi-file-earmark-arrow-up::before { content: "\f358"; } +.bi-file-earmark-bar-graph-fill::before { content: "\f359"; } +.bi-file-earmark-bar-graph::before { content: "\f35a"; } +.bi-file-earmark-binary-fill::before { content: "\f35b"; } +.bi-file-earmark-binary::before { content: "\f35c"; } +.bi-file-earmark-break-fill::before { content: "\f35d"; } +.bi-file-earmark-break::before { content: "\f35e"; } +.bi-file-earmark-check-fill::before { content: "\f35f"; } +.bi-file-earmark-check::before { content: "\f360"; } +.bi-file-earmark-code-fill::before { content: "\f361"; } +.bi-file-earmark-code::before { content: "\f362"; } +.bi-file-earmark-diff-fill::before { content: "\f363"; } +.bi-file-earmark-diff::before { content: "\f364"; } +.bi-file-earmark-easel-fill::before { content: "\f365"; } +.bi-file-earmark-easel::before { content: "\f366"; } +.bi-file-earmark-excel-fill::before { content: "\f367"; } +.bi-file-earmark-excel::before { content: "\f368"; } +.bi-file-earmark-fill::before { content: "\f369"; } +.bi-file-earmark-font-fill::before { content: "\f36a"; } +.bi-file-earmark-font::before { content: "\f36b"; } +.bi-file-earmark-image-fill::before { content: "\f36c"; } +.bi-file-earmark-image::before { content: "\f36d"; } +.bi-file-earmark-lock-fill::before { content: "\f36e"; } +.bi-file-earmark-lock::before { content: "\f36f"; } +.bi-file-earmark-lock2-fill::before { content: "\f370"; } +.bi-file-earmark-lock2::before { content: "\f371"; } +.bi-file-earmark-medical-fill::before { content: "\f372"; } +.bi-file-earmark-medical::before { content: "\f373"; } +.bi-file-earmark-minus-fill::before { content: "\f374"; } +.bi-file-earmark-minus::before { content: "\f375"; } +.bi-file-earmark-music-fill::before { content: "\f376"; } +.bi-file-earmark-music::before { content: "\f377"; } +.bi-file-earmark-person-fill::before { content: "\f378"; } +.bi-file-earmark-person::before { content: "\f379"; } +.bi-file-earmark-play-fill::before { content: "\f37a"; } +.bi-file-earmark-play::before { content: "\f37b"; } +.bi-file-earmark-plus-fill::before { content: "\f37c"; } +.bi-file-earmark-plus::before { content: "\f37d"; } +.bi-file-earmark-post-fill::before { content: "\f37e"; } +.bi-file-earmark-post::before { content: "\f37f"; } +.bi-file-earmark-ppt-fill::before { content: "\f380"; } +.bi-file-earmark-ppt::before { content: "\f381"; } +.bi-file-earmark-richtext-fill::before { content: "\f382"; } +.bi-file-earmark-richtext::before { content: "\f383"; } +.bi-file-earmark-ruled-fill::before { content: "\f384"; } +.bi-file-earmark-ruled::before { content: "\f385"; } +.bi-file-earmark-slides-fill::before { content: "\f386"; } +.bi-file-earmark-slides::before { content: "\f387"; } +.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; } +.bi-file-earmark-spreadsheet::before { content: "\f389"; } +.bi-file-earmark-text-fill::before { content: "\f38a"; } +.bi-file-earmark-text::before { content: "\f38b"; } +.bi-file-earmark-word-fill::before { content: "\f38c"; } +.bi-file-earmark-word::before { content: "\f38d"; } +.bi-file-earmark-x-fill::before { content: "\f38e"; } +.bi-file-earmark-x::before { content: "\f38f"; } +.bi-file-earmark-zip-fill::before { content: "\f390"; } +.bi-file-earmark-zip::before { content: "\f391"; } +.bi-file-earmark::before { content: "\f392"; } +.bi-file-easel-fill::before { content: "\f393"; } +.bi-file-easel::before { content: "\f394"; } +.bi-file-excel-fill::before { content: "\f395"; } +.bi-file-excel::before { content: "\f396"; } +.bi-file-fill::before { content: "\f397"; } +.bi-file-font-fill::before { content: "\f398"; } +.bi-file-font::before { content: "\f399"; } +.bi-file-image-fill::before { content: "\f39a"; } +.bi-file-image::before { content: "\f39b"; } +.bi-file-lock-fill::before { content: "\f39c"; } +.bi-file-lock::before { content: "\f39d"; } +.bi-file-lock2-fill::before { content: "\f39e"; } +.bi-file-lock2::before { content: "\f39f"; } +.bi-file-medical-fill::before { content: "\f3a0"; } +.bi-file-medical::before { content: "\f3a1"; } +.bi-file-minus-fill::before { content: "\f3a2"; } +.bi-file-minus::before { content: "\f3a3"; } +.bi-file-music-fill::before { content: "\f3a4"; } +.bi-file-music::before { content: "\f3a5"; } +.bi-file-person-fill::before { content: "\f3a6"; } +.bi-file-person::before { content: "\f3a7"; } +.bi-file-play-fill::before { content: "\f3a8"; } +.bi-file-play::before { content: "\f3a9"; } +.bi-file-plus-fill::before { content: "\f3aa"; } +.bi-file-plus::before { content: "\f3ab"; } +.bi-file-post-fill::before { content: "\f3ac"; } +.bi-file-post::before { content: "\f3ad"; } +.bi-file-ppt-fill::before { content: "\f3ae"; } +.bi-file-ppt::before { content: "\f3af"; } +.bi-file-richtext-fill::before { content: "\f3b0"; } +.bi-file-richtext::before { content: "\f3b1"; } +.bi-file-ruled-fill::before { content: "\f3b2"; } +.bi-file-ruled::before { content: "\f3b3"; } +.bi-file-slides-fill::before { content: "\f3b4"; } +.bi-file-slides::before { content: "\f3b5"; } +.bi-file-spreadsheet-fill::before { content: "\f3b6"; } +.bi-file-spreadsheet::before { content: "\f3b7"; } +.bi-file-text-fill::before { content: "\f3b8"; } +.bi-file-text::before { content: "\f3b9"; } +.bi-file-word-fill::before { content: "\f3ba"; } +.bi-file-word::before { content: "\f3bb"; } +.bi-file-x-fill::before { content: "\f3bc"; } +.bi-file-x::before { content: "\f3bd"; } +.bi-file-zip-fill::before { content: "\f3be"; } +.bi-file-zip::before { content: "\f3bf"; } +.bi-file::before { content: "\f3c0"; } +.bi-files-alt::before { content: "\f3c1"; } +.bi-files::before { content: "\f3c2"; } +.bi-film::before { content: "\f3c3"; } +.bi-filter-circle-fill::before { content: "\f3c4"; } +.bi-filter-circle::before { content: "\f3c5"; } +.bi-filter-left::before { content: "\f3c6"; } +.bi-filter-right::before { content: "\f3c7"; } +.bi-filter-square-fill::before { content: "\f3c8"; } +.bi-filter-square::before { content: "\f3c9"; } +.bi-filter::before { content: "\f3ca"; } +.bi-flag-fill::before { content: "\f3cb"; } +.bi-flag::before { content: "\f3cc"; } +.bi-flower1::before { content: "\f3cd"; } +.bi-flower2::before { content: "\f3ce"; } +.bi-flower3::before { content: "\f3cf"; } +.bi-folder-check::before { content: "\f3d0"; } +.bi-folder-fill::before { content: "\f3d1"; } +.bi-folder-minus::before { content: "\f3d2"; } +.bi-folder-plus::before { content: "\f3d3"; } +.bi-folder-symlink-fill::before { content: "\f3d4"; } +.bi-folder-symlink::before { content: "\f3d5"; } +.bi-folder-x::before { content: "\f3d6"; } +.bi-folder::before { content: "\f3d7"; } +.bi-folder2-open::before { content: "\f3d8"; } +.bi-folder2::before { content: "\f3d9"; } +.bi-fonts::before { content: "\f3da"; } +.bi-forward-fill::before { content: "\f3db"; } +.bi-forward::before { content: "\f3dc"; } +.bi-front::before { content: "\f3dd"; } +.bi-fullscreen-exit::before { content: "\f3de"; } +.bi-fullscreen::before { content: "\f3df"; } +.bi-funnel-fill::before { content: "\f3e0"; } +.bi-funnel::before { content: "\f3e1"; } +.bi-gear-fill::before { content: "\f3e2"; } +.bi-gear-wide-connected::before { content: "\f3e3"; } +.bi-gear-wide::before { content: "\f3e4"; } +.bi-gear::before { content: "\f3e5"; } +.bi-gem::before { content: "\f3e6"; } +.bi-geo-alt-fill::before { content: "\f3e7"; } +.bi-geo-alt::before { content: "\f3e8"; } +.bi-geo-fill::before { content: "\f3e9"; } +.bi-geo::before { content: "\f3ea"; } +.bi-gift-fill::before { content: "\f3eb"; } +.bi-gift::before { content: "\f3ec"; } +.bi-github::before { content: "\f3ed"; } +.bi-globe::before { content: "\f3ee"; } +.bi-globe2::before { content: "\f3ef"; } +.bi-google::before { content: "\f3f0"; } +.bi-graph-down::before { content: "\f3f1"; } +.bi-graph-up::before { content: "\f3f2"; } +.bi-grid-1x2-fill::before { content: "\f3f3"; } +.bi-grid-1x2::before { content: "\f3f4"; } +.bi-grid-3x2-gap-fill::before { content: "\f3f5"; } +.bi-grid-3x2-gap::before { content: "\f3f6"; } +.bi-grid-3x2::before { content: "\f3f7"; } +.bi-grid-3x3-gap-fill::before { content: "\f3f8"; } +.bi-grid-3x3-gap::before { content: "\f3f9"; } +.bi-grid-3x3::before { content: "\f3fa"; } +.bi-grid-fill::before { content: "\f3fb"; } +.bi-grid::before { content: "\f3fc"; } +.bi-grip-horizontal::before { content: "\f3fd"; } +.bi-grip-vertical::before { content: "\f3fe"; } +.bi-hammer::before { content: "\f3ff"; } +.bi-hand-index-fill::before { content: "\f400"; } +.bi-hand-index-thumb-fill::before { content: "\f401"; } +.bi-hand-index-thumb::before { content: "\f402"; } +.bi-hand-index::before { content: "\f403"; } +.bi-hand-thumbs-down-fill::before { content: "\f404"; } +.bi-hand-thumbs-down::before { content: "\f405"; } +.bi-hand-thumbs-up-fill::before { content: "\f406"; } +.bi-hand-thumbs-up::before { content: "\f407"; } +.bi-handbag-fill::before { content: "\f408"; } +.bi-handbag::before { content: "\f409"; } +.bi-hash::before { content: "\f40a"; } +.bi-hdd-fill::before { content: "\f40b"; } +.bi-hdd-network-fill::before { content: "\f40c"; } +.bi-hdd-network::before { content: "\f40d"; } +.bi-hdd-rack-fill::before { content: "\f40e"; } +.bi-hdd-rack::before { content: "\f40f"; } +.bi-hdd-stack-fill::before { content: "\f410"; } +.bi-hdd-stack::before { content: "\f411"; } +.bi-hdd::before { content: "\f412"; } +.bi-headphones::before { content: "\f413"; } +.bi-headset::before { content: "\f414"; } +.bi-heart-fill::before { content: "\f415"; } +.bi-heart-half::before { content: "\f416"; } +.bi-heart::before { content: "\f417"; } +.bi-heptagon-fill::before { content: "\f418"; } +.bi-heptagon-half::before { content: "\f419"; } +.bi-heptagon::before { content: "\f41a"; } +.bi-hexagon-fill::before { content: "\f41b"; } +.bi-hexagon-half::before { content: "\f41c"; } +.bi-hexagon::before { content: "\f41d"; } +.bi-hourglass-bottom::before { content: "\f41e"; } +.bi-hourglass-split::before { content: "\f41f"; } +.bi-hourglass-top::before { content: "\f420"; } +.bi-hourglass::before { content: "\f421"; } +.bi-house-door-fill::before { content: "\f422"; } +.bi-house-door::before { content: "\f423"; } +.bi-house-fill::before { content: "\f424"; } +.bi-house::before { content: "\f425"; } +.bi-hr::before { content: "\f426"; } +.bi-hurricane::before { content: "\f427"; } +.bi-image-alt::before { content: "\f428"; } +.bi-image-fill::before { content: "\f429"; } +.bi-image::before { content: "\f42a"; } +.bi-images::before { content: "\f42b"; } +.bi-inbox-fill::before { content: "\f42c"; } +.bi-inbox::before { content: "\f42d"; } +.bi-inboxes-fill::before { content: "\f42e"; } +.bi-inboxes::before { content: "\f42f"; } +.bi-info-circle-fill::before { content: "\f430"; } +.bi-info-circle::before { content: "\f431"; } +.bi-info-square-fill::before { content: "\f432"; } +.bi-info-square::before { content: "\f433"; } +.bi-info::before { content: "\f434"; } +.bi-input-cursor-text::before { content: "\f435"; } +.bi-input-cursor::before { content: "\f436"; } +.bi-instagram::before { content: "\f437"; } +.bi-intersect::before { content: "\f438"; } +.bi-journal-album::before { content: "\f439"; } +.bi-journal-arrow-down::before { content: "\f43a"; } +.bi-journal-arrow-up::before { content: "\f43b"; } +.bi-journal-bookmark-fill::before { content: "\f43c"; } +.bi-journal-bookmark::before { content: "\f43d"; } +.bi-journal-check::before { content: "\f43e"; } +.bi-journal-code::before { content: "\f43f"; } +.bi-journal-medical::before { content: "\f440"; } +.bi-journal-minus::before { content: "\f441"; } +.bi-journal-plus::before { content: "\f442"; } +.bi-journal-richtext::before { content: "\f443"; } +.bi-journal-text::before { content: "\f444"; } +.bi-journal-x::before { content: "\f445"; } +.bi-journal::before { content: "\f446"; } +.bi-journals::before { content: "\f447"; } +.bi-joystick::before { content: "\f448"; } +.bi-justify-left::before { content: "\f449"; } +.bi-justify-right::before { content: "\f44a"; } +.bi-justify::before { content: "\f44b"; } +.bi-kanban-fill::before { content: "\f44c"; } +.bi-kanban::before { content: "\f44d"; } +.bi-key-fill::before { content: "\f44e"; } +.bi-key::before { content: "\f44f"; } +.bi-keyboard-fill::before { content: "\f450"; } +.bi-keyboard::before { content: "\f451"; } +.bi-ladder::before { content: "\f452"; } +.bi-lamp-fill::before { content: "\f453"; } +.bi-lamp::before { content: "\f454"; } +.bi-laptop-fill::before { content: "\f455"; } +.bi-laptop::before { content: "\f456"; } +.bi-layer-backward::before { content: "\f457"; } +.bi-layer-forward::before { content: "\f458"; } +.bi-layers-fill::before { content: "\f459"; } +.bi-layers-half::before { content: "\f45a"; } +.bi-layers::before { content: "\f45b"; } +.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; } +.bi-layout-sidebar-inset::before { content: "\f45d"; } +.bi-layout-sidebar-reverse::before { content: "\f45e"; } +.bi-layout-sidebar::before { content: "\f45f"; } +.bi-layout-split::before { content: "\f460"; } +.bi-layout-text-sidebar-reverse::before { content: "\f461"; } +.bi-layout-text-sidebar::before { content: "\f462"; } +.bi-layout-text-window-reverse::before { content: "\f463"; } +.bi-layout-text-window::before { content: "\f464"; } +.bi-layout-three-columns::before { content: "\f465"; } +.bi-layout-wtf::before { content: "\f466"; } +.bi-life-preserver::before { content: "\f467"; } +.bi-lightbulb-fill::before { content: "\f468"; } +.bi-lightbulb-off-fill::before { content: "\f469"; } +.bi-lightbulb-off::before { content: "\f46a"; } +.bi-lightbulb::before { content: "\f46b"; } +.bi-lightning-charge-fill::before { content: "\f46c"; } +.bi-lightning-charge::before { content: "\f46d"; } +.bi-lightning-fill::before { content: "\f46e"; } +.bi-lightning::before { content: "\f46f"; } +.bi-link-45deg::before { content: "\f470"; } +.bi-link::before { content: "\f471"; } +.bi-linkedin::before { content: "\f472"; } +.bi-list-check::before { content: "\f473"; } +.bi-list-nested::before { content: "\f474"; } +.bi-list-ol::before { content: "\f475"; } +.bi-list-stars::before { content: "\f476"; } +.bi-list-task::before { content: "\f477"; } +.bi-list-ul::before { content: "\f478"; } +.bi-list::before { content: "\f479"; } +.bi-lock-fill::before { content: "\f47a"; } +.bi-lock::before { content: "\f47b"; } +.bi-mailbox::before { content: "\f47c"; } +.bi-mailbox2::before { content: "\f47d"; } +.bi-map-fill::before { content: "\f47e"; } +.bi-map::before { content: "\f47f"; } +.bi-markdown-fill::before { content: "\f480"; } +.bi-markdown::before { content: "\f481"; } +.bi-mask::before { content: "\f482"; } +.bi-megaphone-fill::before { content: "\f483"; } +.bi-megaphone::before { content: "\f484"; } +.bi-menu-app-fill::before { content: "\f485"; } +.bi-menu-app::before { content: "\f486"; } +.bi-menu-button-fill::before { content: "\f487"; } +.bi-menu-button-wide-fill::before { content: "\f488"; } +.bi-menu-button-wide::before { content: "\f489"; } +.bi-menu-button::before { content: "\f48a"; } +.bi-menu-down::before { content: "\f48b"; } +.bi-menu-up::before { content: "\f48c"; } +.bi-mic-fill::before { content: "\f48d"; } +.bi-mic-mute-fill::before { content: "\f48e"; } +.bi-mic-mute::before { content: "\f48f"; } +.bi-mic::before { content: "\f490"; } +.bi-minecart-loaded::before { content: "\f491"; } +.bi-minecart::before { content: "\f492"; } +.bi-moisture::before { content: "\f493"; } +.bi-moon-fill::before { content: "\f494"; } +.bi-moon-stars-fill::before { content: "\f495"; } +.bi-moon-stars::before { content: "\f496"; } +.bi-moon::before { content: "\f497"; } +.bi-mouse-fill::before { content: "\f498"; } +.bi-mouse::before { content: "\f499"; } +.bi-mouse2-fill::before { content: "\f49a"; } +.bi-mouse2::before { content: "\f49b"; } +.bi-mouse3-fill::before { content: "\f49c"; } +.bi-mouse3::before { content: "\f49d"; } +.bi-music-note-beamed::before { content: "\f49e"; } +.bi-music-note-list::before { content: "\f49f"; } +.bi-music-note::before { content: "\f4a0"; } +.bi-music-player-fill::before { content: "\f4a1"; } +.bi-music-player::before { content: "\f4a2"; } +.bi-newspaper::before { content: "\f4a3"; } +.bi-node-minus-fill::before { content: "\f4a4"; } +.bi-node-minus::before { content: "\f4a5"; } +.bi-node-plus-fill::before { content: "\f4a6"; } +.bi-node-plus::before { content: "\f4a7"; } +.bi-nut-fill::before { content: "\f4a8"; } +.bi-nut::before { content: "\f4a9"; } +.bi-octagon-fill::before { content: "\f4aa"; } +.bi-octagon-half::before { content: "\f4ab"; } +.bi-octagon::before { content: "\f4ac"; } +.bi-option::before { content: "\f4ad"; } +.bi-outlet::before { content: "\f4ae"; } +.bi-paint-bucket::before { content: "\f4af"; } +.bi-palette-fill::before { content: "\f4b0"; } +.bi-palette::before { content: "\f4b1"; } +.bi-palette2::before { content: "\f4b2"; } +.bi-paperclip::before { content: "\f4b3"; } +.bi-paragraph::before { content: "\f4b4"; } +.bi-patch-check-fill::before { content: "\f4b5"; } +.bi-patch-check::before { content: "\f4b6"; } +.bi-patch-exclamation-fill::before { content: "\f4b7"; } +.bi-patch-exclamation::before { content: "\f4b8"; } +.bi-patch-minus-fill::before { content: "\f4b9"; } +.bi-patch-minus::before { content: "\f4ba"; } +.bi-patch-plus-fill::before { content: "\f4bb"; } +.bi-patch-plus::before { content: "\f4bc"; } +.bi-patch-question-fill::before { content: "\f4bd"; } +.bi-patch-question::before { content: "\f4be"; } +.bi-pause-btn-fill::before { content: "\f4bf"; } +.bi-pause-btn::before { content: "\f4c0"; } +.bi-pause-circle-fill::before { content: "\f4c1"; } +.bi-pause-circle::before { content: "\f4c2"; } +.bi-pause-fill::before { content: "\f4c3"; } +.bi-pause::before { content: "\f4c4"; } +.bi-peace-fill::before { content: "\f4c5"; } +.bi-peace::before { content: "\f4c6"; } +.bi-pen-fill::before { content: "\f4c7"; } +.bi-pen::before { content: "\f4c8"; } +.bi-pencil-fill::before { content: "\f4c9"; } +.bi-pencil-square::before { content: "\f4ca"; } +.bi-pencil::before { content: "\f4cb"; } +.bi-pentagon-fill::before { content: "\f4cc"; } +.bi-pentagon-half::before { content: "\f4cd"; } +.bi-pentagon::before { content: "\f4ce"; } +.bi-people-fill::before { content: "\f4cf"; } +.bi-people::before { content: "\f4d0"; } +.bi-percent::before { content: "\f4d1"; } +.bi-person-badge-fill::before { content: "\f4d2"; } +.bi-person-badge::before { content: "\f4d3"; } +.bi-person-bounding-box::before { content: "\f4d4"; } +.bi-person-check-fill::before { content: "\f4d5"; } +.bi-person-check::before { content: "\f4d6"; } +.bi-person-circle::before { content: "\f4d7"; } +.bi-person-dash-fill::before { content: "\f4d8"; } +.bi-person-dash::before { content: "\f4d9"; } +.bi-person-fill::before { content: "\f4da"; } +.bi-person-lines-fill::before { content: "\f4db"; } +.bi-person-plus-fill::before { content: "\f4dc"; } +.bi-person-plus::before { content: "\f4dd"; } +.bi-person-square::before { content: "\f4de"; } +.bi-person-x-fill::before { content: "\f4df"; } +.bi-person-x::before { content: "\f4e0"; } +.bi-person::before { content: "\f4e1"; } +.bi-phone-fill::before { content: "\f4e2"; } +.bi-phone-landscape-fill::before { content: "\f4e3"; } +.bi-phone-landscape::before { content: "\f4e4"; } +.bi-phone-vibrate-fill::before { content: "\f4e5"; } +.bi-phone-vibrate::before { content: "\f4e6"; } +.bi-phone::before { content: "\f4e7"; } +.bi-pie-chart-fill::before { content: "\f4e8"; } +.bi-pie-chart::before { content: "\f4e9"; } +.bi-pin-angle-fill::before { content: "\f4ea"; } +.bi-pin-angle::before { content: "\f4eb"; } +.bi-pin-fill::before { content: "\f4ec"; } +.bi-pin::before { content: "\f4ed"; } +.bi-pip-fill::before { content: "\f4ee"; } +.bi-pip::before { content: "\f4ef"; } +.bi-play-btn-fill::before { content: "\f4f0"; } +.bi-play-btn::before { content: "\f4f1"; } +.bi-play-circle-fill::before { content: "\f4f2"; } +.bi-play-circle::before { content: "\f4f3"; } +.bi-play-fill::before { content: "\f4f4"; } +.bi-play::before { content: "\f4f5"; } +.bi-plug-fill::before { content: "\f4f6"; } +.bi-plug::before { content: "\f4f7"; } +.bi-plus-circle-dotted::before { content: "\f4f8"; } +.bi-plus-circle-fill::before { content: "\f4f9"; } +.bi-plus-circle::before { content: "\f4fa"; } +.bi-plus-square-dotted::before { content: "\f4fb"; } +.bi-plus-square-fill::before { content: "\f4fc"; } +.bi-plus-square::before { content: "\f4fd"; } +.bi-plus::before { content: "\f4fe"; } +.bi-power::before { content: "\f4ff"; } +.bi-printer-fill::before { content: "\f500"; } +.bi-printer::before { content: "\f501"; } +.bi-puzzle-fill::before { content: "\f502"; } +.bi-puzzle::before { content: "\f503"; } +.bi-question-circle-fill::before { content: "\f504"; } +.bi-question-circle::before { content: "\f505"; } +.bi-question-diamond-fill::before { content: "\f506"; } +.bi-question-diamond::before { content: "\f507"; } +.bi-question-octagon-fill::before { content: "\f508"; } +.bi-question-octagon::before { content: "\f509"; } +.bi-question-square-fill::before { content: "\f50a"; } +.bi-question-square::before { content: "\f50b"; } +.bi-question::before { content: "\f50c"; } +.bi-rainbow::before { content: "\f50d"; } +.bi-receipt-cutoff::before { content: "\f50e"; } +.bi-receipt::before { content: "\f50f"; } +.bi-reception-0::before { content: "\f510"; } +.bi-reception-1::before { content: "\f511"; } +.bi-reception-2::before { content: "\f512"; } +.bi-reception-3::before { content: "\f513"; } +.bi-reception-4::before { content: "\f514"; } +.bi-record-btn-fill::before { content: "\f515"; } +.bi-record-btn::before { content: "\f516"; } +.bi-record-circle-fill::before { content: "\f517"; } +.bi-record-circle::before { content: "\f518"; } +.bi-record-fill::before { content: "\f519"; } +.bi-record::before { content: "\f51a"; } +.bi-record2-fill::before { content: "\f51b"; } +.bi-record2::before { content: "\f51c"; } +.bi-reply-all-fill::before { content: "\f51d"; } +.bi-reply-all::before { content: "\f51e"; } +.bi-reply-fill::before { content: "\f51f"; } +.bi-reply::before { content: "\f520"; } +.bi-rss-fill::before { content: "\f521"; } +.bi-rss::before { content: "\f522"; } +.bi-rulers::before { content: "\f523"; } +.bi-save-fill::before { content: "\f524"; } +.bi-save::before { content: "\f525"; } +.bi-save2-fill::before { content: "\f526"; } +.bi-save2::before { content: "\f527"; } +.bi-scissors::before { content: "\f528"; } +.bi-screwdriver::before { content: "\f529"; } +.bi-search::before { content: "\f52a"; } +.bi-segmented-nav::before { content: "\f52b"; } +.bi-server::before { content: "\f52c"; } +.bi-share-fill::before { content: "\f52d"; } +.bi-share::before { content: "\f52e"; } +.bi-shield-check::before { content: "\f52f"; } +.bi-shield-exclamation::before { content: "\f530"; } +.bi-shield-fill-check::before { content: "\f531"; } +.bi-shield-fill-exclamation::before { content: "\f532"; } +.bi-shield-fill-minus::before { content: "\f533"; } +.bi-shield-fill-plus::before { content: "\f534"; } +.bi-shield-fill-x::before { content: "\f535"; } +.bi-shield-fill::before { content: "\f536"; } +.bi-shield-lock-fill::before { content: "\f537"; } +.bi-shield-lock::before { content: "\f538"; } +.bi-shield-minus::before { content: "\f539"; } +.bi-shield-plus::before { content: "\f53a"; } +.bi-shield-shaded::before { content: "\f53b"; } +.bi-shield-slash-fill::before { content: "\f53c"; } +.bi-shield-slash::before { content: "\f53d"; } +.bi-shield-x::before { content: "\f53e"; } +.bi-shield::before { content: "\f53f"; } +.bi-shift-fill::before { content: "\f540"; } +.bi-shift::before { content: "\f541"; } +.bi-shop-window::before { content: "\f542"; } +.bi-shop::before { content: "\f543"; } +.bi-shuffle::before { content: "\f544"; } +.bi-signpost-2-fill::before { content: "\f545"; } +.bi-signpost-2::before { content: "\f546"; } +.bi-signpost-fill::before { content: "\f547"; } +.bi-signpost-split-fill::before { content: "\f548"; } +.bi-signpost-split::before { content: "\f549"; } +.bi-signpost::before { content: "\f54a"; } +.bi-sim-fill::before { content: "\f54b"; } +.bi-sim::before { content: "\f54c"; } +.bi-skip-backward-btn-fill::before { content: "\f54d"; } +.bi-skip-backward-btn::before { content: "\f54e"; } +.bi-skip-backward-circle-fill::before { content: "\f54f"; } +.bi-skip-backward-circle::before { content: "\f550"; } +.bi-skip-backward-fill::before { content: "\f551"; } +.bi-skip-backward::before { content: "\f552"; } +.bi-skip-end-btn-fill::before { content: "\f553"; } +.bi-skip-end-btn::before { content: "\f554"; } +.bi-skip-end-circle-fill::before { content: "\f555"; } +.bi-skip-end-circle::before { content: "\f556"; } +.bi-skip-end-fill::before { content: "\f557"; } +.bi-skip-end::before { content: "\f558"; } +.bi-skip-forward-btn-fill::before { content: "\f559"; } +.bi-skip-forward-btn::before { content: "\f55a"; } +.bi-skip-forward-circle-fill::before { content: "\f55b"; } +.bi-skip-forward-circle::before { content: "\f55c"; } +.bi-skip-forward-fill::before { content: "\f55d"; } +.bi-skip-forward::before { content: "\f55e"; } +.bi-skip-start-btn-fill::before { content: "\f55f"; } +.bi-skip-start-btn::before { content: "\f560"; } +.bi-skip-start-circle-fill::before { content: "\f561"; } +.bi-skip-start-circle::before { content: "\f562"; } +.bi-skip-start-fill::before { content: "\f563"; } +.bi-skip-start::before { content: "\f564"; } +.bi-slack::before { content: "\f565"; } +.bi-slash-circle-fill::before { content: "\f566"; } +.bi-slash-circle::before { content: "\f567"; } +.bi-slash-square-fill::before { content: "\f568"; } +.bi-slash-square::before { content: "\f569"; } +.bi-slash::before { content: "\f56a"; } +.bi-sliders::before { content: "\f56b"; } +.bi-smartwatch::before { content: "\f56c"; } +.bi-snow::before { content: "\f56d"; } +.bi-snow2::before { content: "\f56e"; } +.bi-snow3::before { content: "\f56f"; } +.bi-sort-alpha-down-alt::before { content: "\f570"; } +.bi-sort-alpha-down::before { content: "\f571"; } +.bi-sort-alpha-up-alt::before { content: "\f572"; } +.bi-sort-alpha-up::before { content: "\f573"; } +.bi-sort-down-alt::before { content: "\f574"; } +.bi-sort-down::before { content: "\f575"; } +.bi-sort-numeric-down-alt::before { content: "\f576"; } +.bi-sort-numeric-down::before { content: "\f577"; } +.bi-sort-numeric-up-alt::before { content: "\f578"; } +.bi-sort-numeric-up::before { content: "\f579"; } +.bi-sort-up-alt::before { content: "\f57a"; } +.bi-sort-up::before { content: "\f57b"; } +.bi-soundwave::before { content: "\f57c"; } +.bi-speaker-fill::before { content: "\f57d"; } +.bi-speaker::before { content: "\f57e"; } +.bi-speedometer::before { content: "\f57f"; } +.bi-speedometer2::before { content: "\f580"; } +.bi-spellcheck::before { content: "\f581"; } +.bi-square-fill::before { content: "\f582"; } +.bi-square-half::before { content: "\f583"; } +.bi-square::before { content: "\f584"; } +.bi-stack::before { content: "\f585"; } +.bi-star-fill::before { content: "\f586"; } +.bi-star-half::before { content: "\f587"; } +.bi-star::before { content: "\f588"; } +.bi-stars::before { content: "\f589"; } +.bi-stickies-fill::before { content: "\f58a"; } +.bi-stickies::before { content: "\f58b"; } +.bi-sticky-fill::before { content: "\f58c"; } +.bi-sticky::before { content: "\f58d"; } +.bi-stop-btn-fill::before { content: "\f58e"; } +.bi-stop-btn::before { content: "\f58f"; } +.bi-stop-circle-fill::before { content: "\f590"; } +.bi-stop-circle::before { content: "\f591"; } +.bi-stop-fill::before { content: "\f592"; } +.bi-stop::before { content: "\f593"; } +.bi-stoplights-fill::before { content: "\f594"; } +.bi-stoplights::before { content: "\f595"; } +.bi-stopwatch-fill::before { content: "\f596"; } +.bi-stopwatch::before { content: "\f597"; } +.bi-subtract::before { content: "\f598"; } +.bi-suit-club-fill::before { content: "\f599"; } +.bi-suit-club::before { content: "\f59a"; } +.bi-suit-diamond-fill::before { content: "\f59b"; } +.bi-suit-diamond::before { content: "\f59c"; } +.bi-suit-heart-fill::before { content: "\f59d"; } +.bi-suit-heart::before { content: "\f59e"; } +.bi-suit-spade-fill::before { content: "\f59f"; } +.bi-suit-spade::before { content: "\f5a0"; } +.bi-sun-fill::before { content: "\f5a1"; } +.bi-sun::before { content: "\f5a2"; } +.bi-sunglasses::before { content: "\f5a3"; } +.bi-sunrise-fill::before { content: "\f5a4"; } +.bi-sunrise::before { content: "\f5a5"; } +.bi-sunset-fill::before { content: "\f5a6"; } +.bi-sunset::before { content: "\f5a7"; } +.bi-symmetry-horizontal::before { content: "\f5a8"; } +.bi-symmetry-vertical::before { content: "\f5a9"; } +.bi-table::before { content: "\f5aa"; } +.bi-tablet-fill::before { content: "\f5ab"; } +.bi-tablet-landscape-fill::before { content: "\f5ac"; } +.bi-tablet-landscape::before { content: "\f5ad"; } +.bi-tablet::before { content: "\f5ae"; } +.bi-tag-fill::before { content: "\f5af"; } +.bi-tag::before { content: "\f5b0"; } +.bi-tags-fill::before { content: "\f5b1"; } +.bi-tags::before { content: "\f5b2"; } +.bi-telegram::before { content: "\f5b3"; } +.bi-telephone-fill::before { content: "\f5b4"; } +.bi-telephone-forward-fill::before { content: "\f5b5"; } +.bi-telephone-forward::before { content: "\f5b6"; } +.bi-telephone-inbound-fill::before { content: "\f5b7"; } +.bi-telephone-inbound::before { content: "\f5b8"; } +.bi-telephone-minus-fill::before { content: "\f5b9"; } +.bi-telephone-minus::before { content: "\f5ba"; } +.bi-telephone-outbound-fill::before { content: "\f5bb"; } +.bi-telephone-outbound::before { content: "\f5bc"; } +.bi-telephone-plus-fill::before { content: "\f5bd"; } +.bi-telephone-plus::before { content: "\f5be"; } +.bi-telephone-x-fill::before { content: "\f5bf"; } +.bi-telephone-x::before { content: "\f5c0"; } +.bi-telephone::before { content: "\f5c1"; } +.bi-terminal-fill::before { content: "\f5c2"; } +.bi-terminal::before { content: "\f5c3"; } +.bi-text-center::before { content: "\f5c4"; } +.bi-text-indent-left::before { content: "\f5c5"; } +.bi-text-indent-right::before { content: "\f5c6"; } +.bi-text-left::before { content: "\f5c7"; } +.bi-text-paragraph::before { content: "\f5c8"; } +.bi-text-right::before { content: "\f5c9"; } +.bi-textarea-resize::before { content: "\f5ca"; } +.bi-textarea-t::before { content: "\f5cb"; } +.bi-textarea::before { content: "\f5cc"; } +.bi-thermometer-half::before { content: "\f5cd"; } +.bi-thermometer-high::before { content: "\f5ce"; } +.bi-thermometer-low::before { content: "\f5cf"; } +.bi-thermometer-snow::before { content: "\f5d0"; } +.bi-thermometer-sun::before { content: "\f5d1"; } +.bi-thermometer::before { content: "\f5d2"; } +.bi-three-dots-vertical::before { content: "\f5d3"; } +.bi-three-dots::before { content: "\f5d4"; } +.bi-toggle-off::before { content: "\f5d5"; } +.bi-toggle-on::before { content: "\f5d6"; } +.bi-toggle2-off::before { content: "\f5d7"; } +.bi-toggle2-on::before { content: "\f5d8"; } +.bi-toggles::before { content: "\f5d9"; } +.bi-toggles2::before { content: "\f5da"; } +.bi-tools::before { content: "\f5db"; } +.bi-tornado::before { content: "\f5dc"; } +.bi-trash-fill::before { content: "\f5dd"; } +.bi-trash::before { content: "\f5de"; } +.bi-trash2-fill::before { content: "\f5df"; } +.bi-trash2::before { content: "\f5e0"; } +.bi-tree-fill::before { content: "\f5e1"; } +.bi-tree::before { content: "\f5e2"; } +.bi-triangle-fill::before { content: "\f5e3"; } +.bi-triangle-half::before { content: "\f5e4"; } +.bi-triangle::before { content: "\f5e5"; } +.bi-trophy-fill::before { content: "\f5e6"; } +.bi-trophy::before { content: "\f5e7"; } +.bi-tropical-storm::before { content: "\f5e8"; } +.bi-truck-flatbed::before { content: "\f5e9"; } +.bi-truck::before { content: "\f5ea"; } +.bi-tsunami::before { content: "\f5eb"; } +.bi-tv-fill::before { content: "\f5ec"; } +.bi-tv::before { content: "\f5ed"; } +.bi-twitch::before { content: "\f5ee"; } +.bi-twitter::before { content: "\f5ef"; } +.bi-type-bold::before { content: "\f5f0"; } +.bi-type-h1::before { content: "\f5f1"; } +.bi-type-h2::before { content: "\f5f2"; } +.bi-type-h3::before { content: "\f5f3"; } +.bi-type-italic::before { content: "\f5f4"; } +.bi-type-strikethrough::before { content: "\f5f5"; } +.bi-type-underline::before { content: "\f5f6"; } +.bi-type::before { content: "\f5f7"; } +.bi-ui-checks-grid::before { content: "\f5f8"; } +.bi-ui-checks::before { content: "\f5f9"; } +.bi-ui-radios-grid::before { content: "\f5fa"; } +.bi-ui-radios::before { content: "\f5fb"; } +.bi-umbrella-fill::before { content: "\f5fc"; } +.bi-umbrella::before { content: "\f5fd"; } +.bi-union::before { content: "\f5fe"; } +.bi-unlock-fill::before { content: "\f5ff"; } +.bi-unlock::before { content: "\f600"; } +.bi-upc-scan::before { content: "\f601"; } +.bi-upc::before { content: "\f602"; } +.bi-upload::before { content: "\f603"; } +.bi-vector-pen::before { content: "\f604"; } +.bi-view-list::before { content: "\f605"; } +.bi-view-stacked::before { content: "\f606"; } +.bi-vinyl-fill::before { content: "\f607"; } +.bi-vinyl::before { content: "\f608"; } +.bi-voicemail::before { content: "\f609"; } +.bi-volume-down-fill::before { content: "\f60a"; } +.bi-volume-down::before { content: "\f60b"; } +.bi-volume-mute-fill::before { content: "\f60c"; } +.bi-volume-mute::before { content: "\f60d"; } +.bi-volume-off-fill::before { content: "\f60e"; } +.bi-volume-off::before { content: "\f60f"; } +.bi-volume-up-fill::before { content: "\f610"; } +.bi-volume-up::before { content: "\f611"; } +.bi-vr::before { content: "\f612"; } +.bi-wallet-fill::before { content: "\f613"; } +.bi-wallet::before { content: "\f614"; } +.bi-wallet2::before { content: "\f615"; } +.bi-watch::before { content: "\f616"; } +.bi-water::before { content: "\f617"; } +.bi-whatsapp::before { content: "\f618"; } +.bi-wifi-1::before { content: "\f619"; } +.bi-wifi-2::before { content: "\f61a"; } +.bi-wifi-off::before { content: "\f61b"; } +.bi-wifi::before { content: "\f61c"; } +.bi-wind::before { content: "\f61d"; } +.bi-window-dock::before { content: "\f61e"; } +.bi-window-sidebar::before { content: "\f61f"; } +.bi-window::before { content: "\f620"; } +.bi-wrench::before { content: "\f621"; } +.bi-x-circle-fill::before { content: "\f622"; } +.bi-x-circle::before { content: "\f623"; } +.bi-x-diamond-fill::before { content: "\f624"; } +.bi-x-diamond::before { content: "\f625"; } +.bi-x-octagon-fill::before { content: "\f626"; } +.bi-x-octagon::before { content: "\f627"; } +.bi-x-square-fill::before { content: "\f628"; } +.bi-x-square::before { content: "\f629"; } +.bi-x::before { content: "\f62a"; } +.bi-youtube::before { content: "\f62b"; } +.bi-zoom-in::before { content: "\f62c"; } +.bi-zoom-out::before { content: "\f62d"; } +.bi-bank::before { content: "\f62e"; } +.bi-bank2::before { content: "\f62f"; } +.bi-bell-slash-fill::before { content: "\f630"; } +.bi-bell-slash::before { content: "\f631"; } +.bi-cash-coin::before { content: "\f632"; } +.bi-check-lg::before { content: "\f633"; } +.bi-coin::before { content: "\f634"; } +.bi-currency-bitcoin::before { content: "\f635"; } +.bi-currency-dollar::before { content: "\f636"; } +.bi-currency-euro::before { content: "\f637"; } +.bi-currency-exchange::before { content: "\f638"; } +.bi-currency-pound::before { content: "\f639"; } +.bi-currency-yen::before { content: "\f63a"; } +.bi-dash-lg::before { content: "\f63b"; } +.bi-exclamation-lg::before { content: "\f63c"; } +.bi-file-earmark-pdf-fill::before { content: "\f63d"; } +.bi-file-earmark-pdf::before { content: "\f63e"; } +.bi-file-pdf-fill::before { content: "\f63f"; } +.bi-file-pdf::before { content: "\f640"; } +.bi-gender-ambiguous::before { content: "\f641"; } +.bi-gender-female::before { content: "\f642"; } +.bi-gender-male::before { content: "\f643"; } +.bi-gender-trans::before { content: "\f644"; } +.bi-headset-vr::before { content: "\f645"; } +.bi-info-lg::before { content: "\f646"; } +.bi-mastodon::before { content: "\f647"; } +.bi-messenger::before { content: "\f648"; } +.bi-piggy-bank-fill::before { content: "\f649"; } +.bi-piggy-bank::before { content: "\f64a"; } +.bi-pin-map-fill::before { content: "\f64b"; } +.bi-pin-map::before { content: "\f64c"; } +.bi-plus-lg::before { content: "\f64d"; } +.bi-question-lg::before { content: "\f64e"; } +.bi-recycle::before { content: "\f64f"; } +.bi-reddit::before { content: "\f650"; } +.bi-safe-fill::before { content: "\f651"; } +.bi-safe2-fill::before { content: "\f652"; } +.bi-safe2::before { content: "\f653"; } +.bi-sd-card-fill::before { content: "\f654"; } +.bi-sd-card::before { content: "\f655"; } +.bi-skype::before { content: "\f656"; } +.bi-slash-lg::before { content: "\f657"; } +.bi-translate::before { content: "\f658"; } +.bi-x-lg::before { content: "\f659"; } +.bi-safe::before { content: "\f65a"; } +.bi-apple::before { content: "\f65b"; } +.bi-microsoft::before { content: "\f65d"; } +.bi-windows::before { content: "\f65e"; } +.bi-behance::before { content: "\f65c"; } +.bi-dribbble::before { content: "\f65f"; } +.bi-line::before { content: "\f660"; } +.bi-medium::before { content: "\f661"; } +.bi-paypal::before { content: "\f662"; } +.bi-pinterest::before { content: "\f663"; } +.bi-signal::before { content: "\f664"; } +.bi-snapchat::before { content: "\f665"; } +.bi-spotify::before { content: "\f666"; } +.bi-stack-overflow::before { content: "\f667"; } +.bi-strava::before { content: "\f668"; } +.bi-wordpress::before { content: "\f669"; } +.bi-vimeo::before { content: "\f66a"; } +.bi-activity::before { content: "\f66b"; } +.bi-easel2-fill::before { content: "\f66c"; } +.bi-easel2::before { content: "\f66d"; } +.bi-easel3-fill::before { content: "\f66e"; } +.bi-easel3::before { content: "\f66f"; } +.bi-fan::before { content: "\f670"; } +.bi-fingerprint::before { content: "\f671"; } +.bi-graph-down-arrow::before { content: "\f672"; } +.bi-graph-up-arrow::before { content: "\f673"; } +.bi-hypnotize::before { content: "\f674"; } +.bi-magic::before { content: "\f675"; } +.bi-person-rolodex::before { content: "\f676"; } +.bi-person-video::before { content: "\f677"; } +.bi-person-video2::before { content: "\f678"; } +.bi-person-video3::before { content: "\f679"; } +.bi-person-workspace::before { content: "\f67a"; } +.bi-radioactive::before { content: "\f67b"; } +.bi-webcam-fill::before { content: "\f67c"; } +.bi-webcam::before { content: "\f67d"; } +.bi-yin-yang::before { content: "\f67e"; } +.bi-bandaid-fill::before { content: "\f680"; } +.bi-bandaid::before { content: "\f681"; } +.bi-bluetooth::before { content: "\f682"; } +.bi-body-text::before { content: "\f683"; } +.bi-boombox::before { content: "\f684"; } +.bi-boxes::before { content: "\f685"; } +.bi-dpad-fill::before { content: "\f686"; } +.bi-dpad::before { content: "\f687"; } +.bi-ear-fill::before { content: "\f688"; } +.bi-ear::before { content: "\f689"; } +.bi-envelope-check-fill::before { content: "\f68b"; } +.bi-envelope-check::before { content: "\f68c"; } +.bi-envelope-dash-fill::before { content: "\f68e"; } +.bi-envelope-dash::before { content: "\f68f"; } +.bi-envelope-exclamation-fill::before { content: "\f691"; } +.bi-envelope-exclamation::before { content: "\f692"; } +.bi-envelope-plus-fill::before { content: "\f693"; } +.bi-envelope-plus::before { content: "\f694"; } +.bi-envelope-slash-fill::before { content: "\f696"; } +.bi-envelope-slash::before { content: "\f697"; } +.bi-envelope-x-fill::before { content: "\f699"; } +.bi-envelope-x::before { content: "\f69a"; } +.bi-explicit-fill::before { content: "\f69b"; } +.bi-explicit::before { content: "\f69c"; } +.bi-git::before { content: "\f69d"; } +.bi-infinity::before { content: "\f69e"; } +.bi-list-columns-reverse::before { content: "\f69f"; } +.bi-list-columns::before { content: "\f6a0"; } +.bi-meta::before { content: "\f6a1"; } +.bi-nintendo-switch::before { content: "\f6a4"; } +.bi-pc-display-horizontal::before { content: "\f6a5"; } +.bi-pc-display::before { content: "\f6a6"; } +.bi-pc-horizontal::before { content: "\f6a7"; } +.bi-pc::before { content: "\f6a8"; } +.bi-playstation::before { content: "\f6a9"; } +.bi-plus-slash-minus::before { content: "\f6aa"; } +.bi-projector-fill::before { content: "\f6ab"; } +.bi-projector::before { content: "\f6ac"; } +.bi-qr-code-scan::before { content: "\f6ad"; } +.bi-qr-code::before { content: "\f6ae"; } +.bi-quora::before { content: "\f6af"; } +.bi-quote::before { content: "\f6b0"; } +.bi-robot::before { content: "\f6b1"; } +.bi-send-check-fill::before { content: "\f6b2"; } +.bi-send-check::before { content: "\f6b3"; } +.bi-send-dash-fill::before { content: "\f6b4"; } +.bi-send-dash::before { content: "\f6b5"; } +.bi-send-exclamation-fill::before { content: "\f6b7"; } +.bi-send-exclamation::before { content: "\f6b8"; } +.bi-send-fill::before { content: "\f6b9"; } +.bi-send-plus-fill::before { content: "\f6ba"; } +.bi-send-plus::before { content: "\f6bb"; } +.bi-send-slash-fill::before { content: "\f6bc"; } +.bi-send-slash::before { content: "\f6bd"; } +.bi-send-x-fill::before { content: "\f6be"; } +.bi-send-x::before { content: "\f6bf"; } +.bi-send::before { content: "\f6c0"; } +.bi-steam::before { content: "\f6c1"; } +.bi-terminal-dash::before { content: "\f6c3"; } +.bi-terminal-plus::before { content: "\f6c4"; } +.bi-terminal-split::before { content: "\f6c5"; } +.bi-ticket-detailed-fill::before { content: "\f6c6"; } +.bi-ticket-detailed::before { content: "\f6c7"; } +.bi-ticket-fill::before { content: "\f6c8"; } +.bi-ticket-perforated-fill::before { content: "\f6c9"; } +.bi-ticket-perforated::before { content: "\f6ca"; } +.bi-ticket::before { content: "\f6cb"; } +.bi-tiktok::before { content: "\f6cc"; } +.bi-window-dash::before { content: "\f6cd"; } +.bi-window-desktop::before { content: "\f6ce"; } +.bi-window-fullscreen::before { content: "\f6cf"; } +.bi-window-plus::before { content: "\f6d0"; } +.bi-window-split::before { content: "\f6d1"; } +.bi-window-stack::before { content: "\f6d2"; } +.bi-window-x::before { content: "\f6d3"; } +.bi-xbox::before { content: "\f6d4"; } +.bi-ethernet::before { content: "\f6d5"; } +.bi-hdmi-fill::before { content: "\f6d6"; } +.bi-hdmi::before { content: "\f6d7"; } +.bi-usb-c-fill::before { content: "\f6d8"; } +.bi-usb-c::before { content: "\f6d9"; } +.bi-usb-fill::before { content: "\f6da"; } +.bi-usb-plug-fill::before { content: "\f6db"; } +.bi-usb-plug::before { content: "\f6dc"; } +.bi-usb-symbol::before { content: "\f6dd"; } +.bi-usb::before { content: "\f6de"; } +.bi-boombox-fill::before { content: "\f6df"; } +.bi-displayport::before { content: "\f6e1"; } +.bi-gpu-card::before { content: "\f6e2"; } +.bi-memory::before { content: "\f6e3"; } +.bi-modem-fill::before { content: "\f6e4"; } +.bi-modem::before { content: "\f6e5"; } +.bi-motherboard-fill::before { content: "\f6e6"; } +.bi-motherboard::before { content: "\f6e7"; } +.bi-optical-audio-fill::before { content: "\f6e8"; } +.bi-optical-audio::before { content: "\f6e9"; } +.bi-pci-card::before { content: "\f6ea"; } +.bi-router-fill::before { content: "\f6eb"; } +.bi-router::before { content: "\f6ec"; } +.bi-thunderbolt-fill::before { content: "\f6ef"; } +.bi-thunderbolt::before { content: "\f6f0"; } +.bi-usb-drive-fill::before { content: "\f6f1"; } +.bi-usb-drive::before { content: "\f6f2"; } +.bi-usb-micro-fill::before { content: "\f6f3"; } +.bi-usb-micro::before { content: "\f6f4"; } +.bi-usb-mini-fill::before { content: "\f6f5"; } +.bi-usb-mini::before { content: "\f6f6"; } +.bi-cloud-haze2::before { content: "\f6f7"; } +.bi-device-hdd-fill::before { content: "\f6f8"; } +.bi-device-hdd::before { content: "\f6f9"; } +.bi-device-ssd-fill::before { content: "\f6fa"; } +.bi-device-ssd::before { content: "\f6fb"; } +.bi-displayport-fill::before { content: "\f6fc"; } +.bi-mortarboard-fill::before { content: "\f6fd"; } +.bi-mortarboard::before { content: "\f6fe"; } +.bi-terminal-x::before { content: "\f6ff"; } +.bi-arrow-through-heart-fill::before { content: "\f700"; } +.bi-arrow-through-heart::before { content: "\f701"; } +.bi-badge-sd-fill::before { content: "\f702"; } +.bi-badge-sd::before { content: "\f703"; } +.bi-bag-heart-fill::before { content: "\f704"; } +.bi-bag-heart::before { content: "\f705"; } +.bi-balloon-fill::before { content: "\f706"; } +.bi-balloon-heart-fill::before { content: "\f707"; } +.bi-balloon-heart::before { content: "\f708"; } +.bi-balloon::before { content: "\f709"; } +.bi-box2-fill::before { content: "\f70a"; } +.bi-box2-heart-fill::before { content: "\f70b"; } +.bi-box2-heart::before { content: "\f70c"; } +.bi-box2::before { content: "\f70d"; } +.bi-braces-asterisk::before { content: "\f70e"; } +.bi-calendar-heart-fill::before { content: "\f70f"; } +.bi-calendar-heart::before { content: "\f710"; } +.bi-calendar2-heart-fill::before { content: "\f711"; } +.bi-calendar2-heart::before { content: "\f712"; } +.bi-chat-heart-fill::before { content: "\f713"; } +.bi-chat-heart::before { content: "\f714"; } +.bi-chat-left-heart-fill::before { content: "\f715"; } +.bi-chat-left-heart::before { content: "\f716"; } +.bi-chat-right-heart-fill::before { content: "\f717"; } +.bi-chat-right-heart::before { content: "\f718"; } +.bi-chat-square-heart-fill::before { content: "\f719"; } +.bi-chat-square-heart::before { content: "\f71a"; } +.bi-clipboard-check-fill::before { content: "\f71b"; } +.bi-clipboard-data-fill::before { content: "\f71c"; } +.bi-clipboard-fill::before { content: "\f71d"; } +.bi-clipboard-heart-fill::before { content: "\f71e"; } +.bi-clipboard-heart::before { content: "\f71f"; } +.bi-clipboard-minus-fill::before { content: "\f720"; } +.bi-clipboard-plus-fill::before { content: "\f721"; } +.bi-clipboard-pulse::before { content: "\f722"; } +.bi-clipboard-x-fill::before { content: "\f723"; } +.bi-clipboard2-check-fill::before { content: "\f724"; } +.bi-clipboard2-check::before { content: "\f725"; } +.bi-clipboard2-data-fill::before { content: "\f726"; } +.bi-clipboard2-data::before { content: "\f727"; } +.bi-clipboard2-fill::before { content: "\f728"; } +.bi-clipboard2-heart-fill::before { content: "\f729"; } +.bi-clipboard2-heart::before { content: "\f72a"; } +.bi-clipboard2-minus-fill::before { content: "\f72b"; } +.bi-clipboard2-minus::before { content: "\f72c"; } +.bi-clipboard2-plus-fill::before { content: "\f72d"; } +.bi-clipboard2-plus::before { content: "\f72e"; } +.bi-clipboard2-pulse-fill::before { content: "\f72f"; } +.bi-clipboard2-pulse::before { content: "\f730"; } +.bi-clipboard2-x-fill::before { content: "\f731"; } +.bi-clipboard2-x::before { content: "\f732"; } +.bi-clipboard2::before { content: "\f733"; } +.bi-emoji-kiss-fill::before { content: "\f734"; } +.bi-emoji-kiss::before { content: "\f735"; } +.bi-envelope-heart-fill::before { content: "\f736"; } +.bi-envelope-heart::before { content: "\f737"; } +.bi-envelope-open-heart-fill::before { content: "\f738"; } +.bi-envelope-open-heart::before { content: "\f739"; } +.bi-envelope-paper-fill::before { content: "\f73a"; } +.bi-envelope-paper-heart-fill::before { content: "\f73b"; } +.bi-envelope-paper-heart::before { content: "\f73c"; } +.bi-envelope-paper::before { content: "\f73d"; } +.bi-filetype-aac::before { content: "\f73e"; } +.bi-filetype-ai::before { content: "\f73f"; } +.bi-filetype-bmp::before { content: "\f740"; } +.bi-filetype-cs::before { content: "\f741"; } +.bi-filetype-css::before { content: "\f742"; } +.bi-filetype-csv::before { content: "\f743"; } +.bi-filetype-doc::before { content: "\f744"; } +.bi-filetype-docx::before { content: "\f745"; } +.bi-filetype-exe::before { content: "\f746"; } +.bi-filetype-gif::before { content: "\f747"; } +.bi-filetype-heic::before { content: "\f748"; } +.bi-filetype-html::before { content: "\f749"; } +.bi-filetype-java::before { content: "\f74a"; } +.bi-filetype-jpg::before { content: "\f74b"; } +.bi-filetype-js::before { content: "\f74c"; } +.bi-filetype-jsx::before { content: "\f74d"; } +.bi-filetype-key::before { content: "\f74e"; } +.bi-filetype-m4p::before { content: "\f74f"; } +.bi-filetype-md::before { content: "\f750"; } +.bi-filetype-mdx::before { content: "\f751"; } +.bi-filetype-mov::before { content: "\f752"; } +.bi-filetype-mp3::before { content: "\f753"; } +.bi-filetype-mp4::before { content: "\f754"; } +.bi-filetype-otf::before { content: "\f755"; } +.bi-filetype-pdf::before { content: "\f756"; } +.bi-filetype-php::before { content: "\f757"; } +.bi-filetype-png::before { content: "\f758"; } +.bi-filetype-ppt::before { content: "\f75a"; } +.bi-filetype-psd::before { content: "\f75b"; } +.bi-filetype-py::before { content: "\f75c"; } +.bi-filetype-raw::before { content: "\f75d"; } +.bi-filetype-rb::before { content: "\f75e"; } +.bi-filetype-sass::before { content: "\f75f"; } +.bi-filetype-scss::before { content: "\f760"; } +.bi-filetype-sh::before { content: "\f761"; } +.bi-filetype-svg::before { content: "\f762"; } +.bi-filetype-tiff::before { content: "\f763"; } +.bi-filetype-tsx::before { content: "\f764"; } +.bi-filetype-ttf::before { content: "\f765"; } +.bi-filetype-txt::before { content: "\f766"; } +.bi-filetype-wav::before { content: "\f767"; } +.bi-filetype-woff::before { content: "\f768"; } +.bi-filetype-xls::before { content: "\f76a"; } +.bi-filetype-xml::before { content: "\f76b"; } +.bi-filetype-yml::before { content: "\f76c"; } +.bi-heart-arrow::before { content: "\f76d"; } +.bi-heart-pulse-fill::before { content: "\f76e"; } +.bi-heart-pulse::before { content: "\f76f"; } +.bi-heartbreak-fill::before { content: "\f770"; } +.bi-heartbreak::before { content: "\f771"; } +.bi-hearts::before { content: "\f772"; } +.bi-hospital-fill::before { content: "\f773"; } +.bi-hospital::before { content: "\f774"; } +.bi-house-heart-fill::before { content: "\f775"; } +.bi-house-heart::before { content: "\f776"; } +.bi-incognito::before { content: "\f777"; } +.bi-magnet-fill::before { content: "\f778"; } +.bi-magnet::before { content: "\f779"; } +.bi-person-heart::before { content: "\f77a"; } +.bi-person-hearts::before { content: "\f77b"; } +.bi-phone-flip::before { content: "\f77c"; } +.bi-plugin::before { content: "\f77d"; } +.bi-postage-fill::before { content: "\f77e"; } +.bi-postage-heart-fill::before { content: "\f77f"; } +.bi-postage-heart::before { content: "\f780"; } +.bi-postage::before { content: "\f781"; } +.bi-postcard-fill::before { content: "\f782"; } +.bi-postcard-heart-fill::before { content: "\f783"; } +.bi-postcard-heart::before { content: "\f784"; } +.bi-postcard::before { content: "\f785"; } +.bi-search-heart-fill::before { content: "\f786"; } +.bi-search-heart::before { content: "\f787"; } +.bi-sliders2-vertical::before { content: "\f788"; } +.bi-sliders2::before { content: "\f789"; } +.bi-trash3-fill::before { content: "\f78a"; } +.bi-trash3::before { content: "\f78b"; } +.bi-valentine::before { content: "\f78c"; } +.bi-valentine2::before { content: "\f78d"; } +.bi-wrench-adjustable-circle-fill::before { content: "\f78e"; } +.bi-wrench-adjustable-circle::before { content: "\f78f"; } +.bi-wrench-adjustable::before { content: "\f790"; } +.bi-filetype-json::before { content: "\f791"; } +.bi-filetype-pptx::before { content: "\f792"; } +.bi-filetype-xlsx::before { content: "\f793"; } +.bi-1-circle-fill::before { content: "\f796"; } +.bi-1-circle::before { content: "\f797"; } +.bi-1-square-fill::before { content: "\f798"; } +.bi-1-square::before { content: "\f799"; } +.bi-2-circle-fill::before { content: "\f79c"; } +.bi-2-circle::before { content: "\f79d"; } +.bi-2-square-fill::before { content: "\f79e"; } +.bi-2-square::before { content: "\f79f"; } +.bi-3-circle-fill::before { content: "\f7a2"; } +.bi-3-circle::before { content: "\f7a3"; } +.bi-3-square-fill::before { content: "\f7a4"; } +.bi-3-square::before { content: "\f7a5"; } +.bi-4-circle-fill::before { content: "\f7a8"; } +.bi-4-circle::before { content: "\f7a9"; } +.bi-4-square-fill::before { content: "\f7aa"; } +.bi-4-square::before { content: "\f7ab"; } +.bi-5-circle-fill::before { content: "\f7ae"; } +.bi-5-circle::before { content: "\f7af"; } +.bi-5-square-fill::before { content: "\f7b0"; } +.bi-5-square::before { content: "\f7b1"; } +.bi-6-circle-fill::before { content: "\f7b4"; } +.bi-6-circle::before { content: "\f7b5"; } +.bi-6-square-fill::before { content: "\f7b6"; } +.bi-6-square::before { content: "\f7b7"; } +.bi-7-circle-fill::before { content: "\f7ba"; } +.bi-7-circle::before { content: "\f7bb"; } +.bi-7-square-fill::before { content: "\f7bc"; } +.bi-7-square::before { content: "\f7bd"; } +.bi-8-circle-fill::before { content: "\f7c0"; } +.bi-8-circle::before { content: "\f7c1"; } +.bi-8-square-fill::before { content: "\f7c2"; } +.bi-8-square::before { content: "\f7c3"; } +.bi-9-circle-fill::before { content: "\f7c6"; } +.bi-9-circle::before { content: "\f7c7"; } +.bi-9-square-fill::before { content: "\f7c8"; } +.bi-9-square::before { content: "\f7c9"; } +.bi-airplane-engines-fill::before { content: "\f7ca"; } +.bi-airplane-engines::before { content: "\f7cb"; } +.bi-airplane-fill::before { content: "\f7cc"; } +.bi-airplane::before { content: "\f7cd"; } +.bi-alexa::before { content: "\f7ce"; } +.bi-alipay::before { content: "\f7cf"; } +.bi-android::before { content: "\f7d0"; } +.bi-android2::before { content: "\f7d1"; } +.bi-box-fill::before { content: "\f7d2"; } +.bi-box-seam-fill::before { content: "\f7d3"; } +.bi-browser-chrome::before { content: "\f7d4"; } +.bi-browser-edge::before { content: "\f7d5"; } +.bi-browser-firefox::before { content: "\f7d6"; } +.bi-browser-safari::before { content: "\f7d7"; } +.bi-c-circle-fill::before { content: "\f7da"; } +.bi-c-circle::before { content: "\f7db"; } +.bi-c-square-fill::before { content: "\f7dc"; } +.bi-c-square::before { content: "\f7dd"; } +.bi-capsule-pill::before { content: "\f7de"; } +.bi-capsule::before { content: "\f7df"; } +.bi-car-front-fill::before { content: "\f7e0"; } +.bi-car-front::before { content: "\f7e1"; } +.bi-cassette-fill::before { content: "\f7e2"; } +.bi-cassette::before { content: "\f7e3"; } +.bi-cc-circle-fill::before { content: "\f7e6"; } +.bi-cc-circle::before { content: "\f7e7"; } +.bi-cc-square-fill::before { content: "\f7e8"; } +.bi-cc-square::before { content: "\f7e9"; } +.bi-cup-hot-fill::before { content: "\f7ea"; } +.bi-cup-hot::before { content: "\f7eb"; } +.bi-currency-rupee::before { content: "\f7ec"; } +.bi-dropbox::before { content: "\f7ed"; } +.bi-escape::before { content: "\f7ee"; } +.bi-fast-forward-btn-fill::before { content: "\f7ef"; } +.bi-fast-forward-btn::before { content: "\f7f0"; } +.bi-fast-forward-circle-fill::before { content: "\f7f1"; } +.bi-fast-forward-circle::before { content: "\f7f2"; } +.bi-fast-forward-fill::before { content: "\f7f3"; } +.bi-fast-forward::before { content: "\f7f4"; } +.bi-filetype-sql::before { content: "\f7f5"; } +.bi-fire::before { content: "\f7f6"; } +.bi-google-play::before { content: "\f7f7"; } +.bi-h-circle-fill::before { content: "\f7fa"; } +.bi-h-circle::before { content: "\f7fb"; } +.bi-h-square-fill::before { content: "\f7fc"; } +.bi-h-square::before { content: "\f7fd"; } +.bi-indent::before { content: "\f7fe"; } +.bi-lungs-fill::before { content: "\f7ff"; } +.bi-lungs::before { content: "\f800"; } +.bi-microsoft-teams::before { content: "\f801"; } +.bi-p-circle-fill::before { content: "\f804"; } +.bi-p-circle::before { content: "\f805"; } +.bi-p-square-fill::before { content: "\f806"; } +.bi-p-square::before { content: "\f807"; } +.bi-pass-fill::before { content: "\f808"; } +.bi-pass::before { content: "\f809"; } +.bi-prescription::before { content: "\f80a"; } +.bi-prescription2::before { content: "\f80b"; } +.bi-r-circle-fill::before { content: "\f80e"; } +.bi-r-circle::before { content: "\f80f"; } +.bi-r-square-fill::before { content: "\f810"; } +.bi-r-square::before { content: "\f811"; } +.bi-repeat-1::before { content: "\f812"; } +.bi-repeat::before { content: "\f813"; } +.bi-rewind-btn-fill::before { content: "\f814"; } +.bi-rewind-btn::before { content: "\f815"; } +.bi-rewind-circle-fill::before { content: "\f816"; } +.bi-rewind-circle::before { content: "\f817"; } +.bi-rewind-fill::before { content: "\f818"; } +.bi-rewind::before { content: "\f819"; } +.bi-train-freight-front-fill::before { content: "\f81a"; } +.bi-train-freight-front::before { content: "\f81b"; } +.bi-train-front-fill::before { content: "\f81c"; } +.bi-train-front::before { content: "\f81d"; } +.bi-train-lightrail-front-fill::before { content: "\f81e"; } +.bi-train-lightrail-front::before { content: "\f81f"; } +.bi-truck-front-fill::before { content: "\f820"; } +.bi-truck-front::before { content: "\f821"; } +.bi-ubuntu::before { content: "\f822"; } +.bi-unindent::before { content: "\f823"; } +.bi-unity::before { content: "\f824"; } +.bi-universal-access-circle::before { content: "\f825"; } +.bi-universal-access::before { content: "\f826"; } +.bi-virus::before { content: "\f827"; } +.bi-virus2::before { content: "\f828"; } +.bi-wechat::before { content: "\f829"; } +.bi-yelp::before { content: "\f82a"; } +.bi-sign-stop-fill::before { content: "\f82b"; } +.bi-sign-stop-lights-fill::before { content: "\f82c"; } +.bi-sign-stop-lights::before { content: "\f82d"; } +.bi-sign-stop::before { content: "\f82e"; } +.bi-sign-turn-left-fill::before { content: "\f82f"; } +.bi-sign-turn-left::before { content: "\f830"; } +.bi-sign-turn-right-fill::before { content: "\f831"; } +.bi-sign-turn-right::before { content: "\f832"; } +.bi-sign-turn-slight-left-fill::before { content: "\f833"; } +.bi-sign-turn-slight-left::before { content: "\f834"; } +.bi-sign-turn-slight-right-fill::before { content: "\f835"; } +.bi-sign-turn-slight-right::before { content: "\f836"; } +.bi-sign-yield-fill::before { content: "\f837"; } +.bi-sign-yield::before { content: "\f838"; } +.bi-ev-station-fill::before { content: "\f839"; } +.bi-ev-station::before { content: "\f83a"; } +.bi-fuel-pump-diesel-fill::before { content: "\f83b"; } +.bi-fuel-pump-diesel::before { content: "\f83c"; } +.bi-fuel-pump-fill::before { content: "\f83d"; } +.bi-fuel-pump::before { content: "\f83e"; } +.bi-0-circle-fill::before { content: "\f83f"; } +.bi-0-circle::before { content: "\f840"; } +.bi-0-square-fill::before { content: "\f841"; } +.bi-0-square::before { content: "\f842"; } +.bi-rocket-fill::before { content: "\f843"; } +.bi-rocket-takeoff-fill::before { content: "\f844"; } +.bi-rocket-takeoff::before { content: "\f845"; } +.bi-rocket::before { content: "\f846"; } +.bi-stripe::before { content: "\f847"; } +.bi-subscript::before { content: "\f848"; } +.bi-superscript::before { content: "\f849"; } +.bi-trello::before { content: "\f84a"; } +.bi-envelope-at-fill::before { content: "\f84b"; } +.bi-envelope-at::before { content: "\f84c"; } +.bi-regex::before { content: "\f84d"; } +.bi-text-wrap::before { content: "\f84e"; } +.bi-sign-dead-end-fill::before { content: "\f84f"; } +.bi-sign-dead-end::before { content: "\f850"; } +.bi-sign-do-not-enter-fill::before { content: "\f851"; } +.bi-sign-do-not-enter::before { content: "\f852"; } +.bi-sign-intersection-fill::before { content: "\f853"; } +.bi-sign-intersection-side-fill::before { content: "\f854"; } +.bi-sign-intersection-side::before { content: "\f855"; } +.bi-sign-intersection-t-fill::before { content: "\f856"; } +.bi-sign-intersection-t::before { content: "\f857"; } +.bi-sign-intersection-y-fill::before { content: "\f858"; } +.bi-sign-intersection-y::before { content: "\f859"; } +.bi-sign-intersection::before { content: "\f85a"; } +.bi-sign-merge-left-fill::before { content: "\f85b"; } +.bi-sign-merge-left::before { content: "\f85c"; } +.bi-sign-merge-right-fill::before { content: "\f85d"; } +.bi-sign-merge-right::before { content: "\f85e"; } +.bi-sign-no-left-turn-fill::before { content: "\f85f"; } +.bi-sign-no-left-turn::before { content: "\f860"; } +.bi-sign-no-parking-fill::before { content: "\f861"; } +.bi-sign-no-parking::before { content: "\f862"; } +.bi-sign-no-right-turn-fill::before { content: "\f863"; } +.bi-sign-no-right-turn::before { content: "\f864"; } +.bi-sign-railroad-fill::before { content: "\f865"; } +.bi-sign-railroad::before { content: "\f866"; } +.bi-building-add::before { content: "\f867"; } +.bi-building-check::before { content: "\f868"; } +.bi-building-dash::before { content: "\f869"; } +.bi-building-down::before { content: "\f86a"; } +.bi-building-exclamation::before { content: "\f86b"; } +.bi-building-fill-add::before { content: "\f86c"; } +.bi-building-fill-check::before { content: "\f86d"; } +.bi-building-fill-dash::before { content: "\f86e"; } +.bi-building-fill-down::before { content: "\f86f"; } +.bi-building-fill-exclamation::before { content: "\f870"; } +.bi-building-fill-gear::before { content: "\f871"; } +.bi-building-fill-lock::before { content: "\f872"; } +.bi-building-fill-slash::before { content: "\f873"; } +.bi-building-fill-up::before { content: "\f874"; } +.bi-building-fill-x::before { content: "\f875"; } +.bi-building-fill::before { content: "\f876"; } +.bi-building-gear::before { content: "\f877"; } +.bi-building-lock::before { content: "\f878"; } +.bi-building-slash::before { content: "\f879"; } +.bi-building-up::before { content: "\f87a"; } +.bi-building-x::before { content: "\f87b"; } +.bi-buildings-fill::before { content: "\f87c"; } +.bi-buildings::before { content: "\f87d"; } +.bi-bus-front-fill::before { content: "\f87e"; } +.bi-bus-front::before { content: "\f87f"; } +.bi-ev-front-fill::before { content: "\f880"; } +.bi-ev-front::before { content: "\f881"; } +.bi-globe-americas::before { content: "\f882"; } +.bi-globe-asia-australia::before { content: "\f883"; } +.bi-globe-central-south-asia::before { content: "\f884"; } +.bi-globe-europe-africa::before { content: "\f885"; } +.bi-house-add-fill::before { content: "\f886"; } +.bi-house-add::before { content: "\f887"; } +.bi-house-check-fill::before { content: "\f888"; } +.bi-house-check::before { content: "\f889"; } +.bi-house-dash-fill::before { content: "\f88a"; } +.bi-house-dash::before { content: "\f88b"; } +.bi-house-down-fill::before { content: "\f88c"; } +.bi-house-down::before { content: "\f88d"; } +.bi-house-exclamation-fill::before { content: "\f88e"; } +.bi-house-exclamation::before { content: "\f88f"; } +.bi-house-gear-fill::before { content: "\f890"; } +.bi-house-gear::before { content: "\f891"; } +.bi-house-lock-fill::before { content: "\f892"; } +.bi-house-lock::before { content: "\f893"; } +.bi-house-slash-fill::before { content: "\f894"; } +.bi-house-slash::before { content: "\f895"; } +.bi-house-up-fill::before { content: "\f896"; } +.bi-house-up::before { content: "\f897"; } +.bi-house-x-fill::before { content: "\f898"; } +.bi-house-x::before { content: "\f899"; } +.bi-person-add::before { content: "\f89a"; } +.bi-person-down::before { content: "\f89b"; } +.bi-person-exclamation::before { content: "\f89c"; } +.bi-person-fill-add::before { content: "\f89d"; } +.bi-person-fill-check::before { content: "\f89e"; } +.bi-person-fill-dash::before { content: "\f89f"; } +.bi-person-fill-down::before { content: "\f8a0"; } +.bi-person-fill-exclamation::before { content: "\f8a1"; } +.bi-person-fill-gear::before { content: "\f8a2"; } +.bi-person-fill-lock::before { content: "\f8a3"; } +.bi-person-fill-slash::before { content: "\f8a4"; } +.bi-person-fill-up::before { content: "\f8a5"; } +.bi-person-fill-x::before { content: "\f8a6"; } +.bi-person-gear::before { content: "\f8a7"; } +.bi-person-lock::before { content: "\f8a8"; } +.bi-person-slash::before { content: "\f8a9"; } +.bi-person-up::before { content: "\f8aa"; } +.bi-scooter::before { content: "\f8ab"; } +.bi-taxi-front-fill::before { content: "\f8ac"; } +.bi-taxi-front::before { content: "\f8ad"; } +.bi-amd::before { content: "\f8ae"; } +.bi-database-add::before { content: "\f8af"; } +.bi-database-check::before { content: "\f8b0"; } +.bi-database-dash::before { content: "\f8b1"; } +.bi-database-down::before { content: "\f8b2"; } +.bi-database-exclamation::before { content: "\f8b3"; } +.bi-database-fill-add::before { content: "\f8b4"; } +.bi-database-fill-check::before { content: "\f8b5"; } +.bi-database-fill-dash::before { content: "\f8b6"; } +.bi-database-fill-down::before { content: "\f8b7"; } +.bi-database-fill-exclamation::before { content: "\f8b8"; } +.bi-database-fill-gear::before { content: "\f8b9"; } +.bi-database-fill-lock::before { content: "\f8ba"; } +.bi-database-fill-slash::before { content: "\f8bb"; } +.bi-database-fill-up::before { content: "\f8bc"; } +.bi-database-fill-x::before { content: "\f8bd"; } +.bi-database-fill::before { content: "\f8be"; } +.bi-database-gear::before { content: "\f8bf"; } +.bi-database-lock::before { content: "\f8c0"; } +.bi-database-slash::before { content: "\f8c1"; } +.bi-database-up::before { content: "\f8c2"; } +.bi-database-x::before { content: "\f8c3"; } +.bi-database::before { content: "\f8c4"; } +.bi-houses-fill::before { content: "\f8c5"; } +.bi-houses::before { content: "\f8c6"; } +.bi-nvidia::before { content: "\f8c7"; } +.bi-person-vcard-fill::before { content: "\f8c8"; } +.bi-person-vcard::before { content: "\f8c9"; } +.bi-sina-weibo::before { content: "\f8ca"; } +.bi-tencent-qq::before { content: "\f8cb"; } +.bi-wikipedia::before { content: "\f8cc"; } +.bi-alphabet-uppercase::before { content: "\f2a5"; } +.bi-alphabet::before { content: "\f68a"; } +.bi-amazon::before { content: "\f68d"; } +.bi-arrows-collapse-vertical::before { content: "\f690"; } +.bi-arrows-expand-vertical::before { content: "\f695"; } +.bi-arrows-vertical::before { content: "\f698"; } +.bi-arrows::before { content: "\f6a2"; } +.bi-ban-fill::before { content: "\f6a3"; } +.bi-ban::before { content: "\f6b6"; } +.bi-bing::before { content: "\f6c2"; } +.bi-cake::before { content: "\f6e0"; } +.bi-cake2::before { content: "\f6ed"; } +.bi-cookie::before { content: "\f6ee"; } +.bi-copy::before { content: "\f759"; } +.bi-crosshair::before { content: "\f769"; } +.bi-crosshair2::before { content: "\f794"; } +.bi-emoji-astonished-fill::before { content: "\f795"; } +.bi-emoji-astonished::before { content: "\f79a"; } +.bi-emoji-grimace-fill::before { content: "\f79b"; } +.bi-emoji-grimace::before { content: "\f7a0"; } +.bi-emoji-grin-fill::before { content: "\f7a1"; } +.bi-emoji-grin::before { content: "\f7a6"; } +.bi-emoji-surprise-fill::before { content: "\f7a7"; } +.bi-emoji-surprise::before { content: "\f7ac"; } +.bi-emoji-tear-fill::before { content: "\f7ad"; } +.bi-emoji-tear::before { content: "\f7b2"; } +.bi-envelope-arrow-down-fill::before { content: "\f7b3"; } +.bi-envelope-arrow-down::before { content: "\f7b8"; } +.bi-envelope-arrow-up-fill::before { content: "\f7b9"; } +.bi-envelope-arrow-up::before { content: "\f7be"; } +.bi-feather::before { content: "\f7bf"; } +.bi-feather2::before { content: "\f7c4"; } +.bi-floppy-fill::before { content: "\f7c5"; } +.bi-floppy::before { content: "\f7d8"; } +.bi-floppy2-fill::before { content: "\f7d9"; } +.bi-floppy2::before { content: "\f7e4"; } +.bi-gitlab::before { content: "\f7e5"; } +.bi-highlighter::before { content: "\f7f8"; } +.bi-marker-tip::before { content: "\f802"; } +.bi-nvme-fill::before { content: "\f803"; } +.bi-nvme::before { content: "\f80c"; } +.bi-opencollective::before { content: "\f80d"; } +.bi-pci-card-network::before { content: "\f8cd"; } +.bi-pci-card-sound::before { content: "\f8ce"; } +.bi-radar::before { content: "\f8cf"; } +.bi-send-arrow-down-fill::before { content: "\f8d0"; } +.bi-send-arrow-down::before { content: "\f8d1"; } +.bi-send-arrow-up-fill::before { content: "\f8d2"; } +.bi-send-arrow-up::before { content: "\f8d3"; } +.bi-sim-slash-fill::before { content: "\f8d4"; } +.bi-sim-slash::before { content: "\f8d5"; } +.bi-sourceforge::before { content: "\f8d6"; } +.bi-substack::before { content: "\f8d7"; } +.bi-threads-fill::before { content: "\f8d8"; } +.bi-threads::before { content: "\f8d9"; } +.bi-transparency::before { content: "\f8da"; } +.bi-twitter-x::before { content: "\f8db"; } +.bi-type-h4::before { content: "\f8dc"; } +.bi-type-h5::before { content: "\f8dd"; } +.bi-type-h6::before { content: "\f8de"; } +.bi-backpack-fill::before { content: "\f8df"; } +.bi-backpack::before { content: "\f8e0"; } +.bi-backpack2-fill::before { content: "\f8e1"; } +.bi-backpack2::before { content: "\f8e2"; } +.bi-backpack3-fill::before { content: "\f8e3"; } +.bi-backpack3::before { content: "\f8e4"; } +.bi-backpack4-fill::before { content: "\f8e5"; } +.bi-backpack4::before { content: "\f8e6"; } +.bi-brilliance::before { content: "\f8e7"; } +.bi-cake-fill::before { content: "\f8e8"; } +.bi-cake2-fill::before { content: "\f8e9"; } +.bi-duffle-fill::before { content: "\f8ea"; } +.bi-duffle::before { content: "\f8eb"; } +.bi-exposure::before { content: "\f8ec"; } +.bi-gender-neuter::before { content: "\f8ed"; } +.bi-highlights::before { content: "\f8ee"; } +.bi-luggage-fill::before { content: "\f8ef"; } +.bi-luggage::before { content: "\f8f0"; } +.bi-mailbox-flag::before { content: "\f8f1"; } +.bi-mailbox2-flag::before { content: "\f8f2"; } +.bi-noise-reduction::before { content: "\f8f3"; } +.bi-passport-fill::before { content: "\f8f4"; } +.bi-passport::before { content: "\f8f5"; } +.bi-person-arms-up::before { content: "\f8f6"; } +.bi-person-raised-hand::before { content: "\f8f7"; } +.bi-person-standing-dress::before { content: "\f8f8"; } +.bi-person-standing::before { content: "\f8f9"; } +.bi-person-walking::before { content: "\f8fa"; } +.bi-person-wheelchair::before { content: "\f8fb"; } +.bi-shadows::before { content: "\f8fc"; } +.bi-suitcase-fill::before { content: "\f8fd"; } +.bi-suitcase-lg-fill::before { content: "\f8fe"; } +.bi-suitcase-lg::before { content: "\f8ff"; } +.bi-suitcase::before { content: "\f900"; } +.bi-suitcase2-fill::before { content: "\f901"; } +.bi-suitcase2::before { content: "\f902"; } +.bi-vignette::before { content: "\f903"; } diff --git a/assets/static/bootstrap-icons/font/bootstrap-icons.json b/assets/static/bootstrap-icons/font/bootstrap-icons.json new file mode 100644 index 0000000..56247e5 --- /dev/null +++ b/assets/static/bootstrap-icons/font/bootstrap-icons.json @@ -0,0 +1,2052 @@ +{ + "123": 63103, + "alarm-fill": 61697, + "alarm": 61698, + "align-bottom": 61699, + "align-center": 61700, + "align-end": 61701, + "align-middle": 61702, + "align-start": 61703, + "align-top": 61704, + "alt": 61705, + "app-indicator": 61706, + "app": 61707, + "archive-fill": 61708, + "archive": 61709, + "arrow-90deg-down": 61710, + "arrow-90deg-left": 61711, + "arrow-90deg-right": 61712, + "arrow-90deg-up": 61713, + "arrow-bar-down": 61714, + "arrow-bar-left": 61715, + "arrow-bar-right": 61716, + "arrow-bar-up": 61717, + "arrow-clockwise": 61718, + "arrow-counterclockwise": 61719, + "arrow-down-circle-fill": 61720, + "arrow-down-circle": 61721, + "arrow-down-left-circle-fill": 61722, + "arrow-down-left-circle": 61723, + "arrow-down-left-square-fill": 61724, + "arrow-down-left-square": 61725, + "arrow-down-left": 61726, + "arrow-down-right-circle-fill": 61727, + "arrow-down-right-circle": 61728, + "arrow-down-right-square-fill": 61729, + "arrow-down-right-square": 61730, + "arrow-down-right": 61731, + "arrow-down-short": 61732, + "arrow-down-square-fill": 61733, + "arrow-down-square": 61734, + "arrow-down-up": 61735, + "arrow-down": 61736, + "arrow-left-circle-fill": 61737, + "arrow-left-circle": 61738, + "arrow-left-right": 61739, + "arrow-left-short": 61740, + "arrow-left-square-fill": 61741, + "arrow-left-square": 61742, + "arrow-left": 61743, + "arrow-repeat": 61744, + "arrow-return-left": 61745, + "arrow-return-right": 61746, + "arrow-right-circle-fill": 61747, + "arrow-right-circle": 61748, + "arrow-right-short": 61749, + "arrow-right-square-fill": 61750, + "arrow-right-square": 61751, + "arrow-right": 61752, + "arrow-up-circle-fill": 61753, + "arrow-up-circle": 61754, + "arrow-up-left-circle-fill": 61755, + "arrow-up-left-circle": 61756, + "arrow-up-left-square-fill": 61757, + "arrow-up-left-square": 61758, + "arrow-up-left": 61759, + "arrow-up-right-circle-fill": 61760, + "arrow-up-right-circle": 61761, + "arrow-up-right-square-fill": 61762, + "arrow-up-right-square": 61763, + "arrow-up-right": 61764, + "arrow-up-short": 61765, + "arrow-up-square-fill": 61766, + "arrow-up-square": 61767, + "arrow-up": 61768, + "arrows-angle-contract": 61769, + "arrows-angle-expand": 61770, + "arrows-collapse": 61771, + "arrows-expand": 61772, + "arrows-fullscreen": 61773, + "arrows-move": 61774, + "aspect-ratio-fill": 61775, + "aspect-ratio": 61776, + "asterisk": 61777, + "at": 61778, + "award-fill": 61779, + "award": 61780, + "back": 61781, + "backspace-fill": 61782, + "backspace-reverse-fill": 61783, + "backspace-reverse": 61784, + "backspace": 61785, + "badge-3d-fill": 61786, + "badge-3d": 61787, + "badge-4k-fill": 61788, + "badge-4k": 61789, + "badge-8k-fill": 61790, + "badge-8k": 61791, + "badge-ad-fill": 61792, + "badge-ad": 61793, + "badge-ar-fill": 61794, + "badge-ar": 61795, + "badge-cc-fill": 61796, + "badge-cc": 61797, + "badge-hd-fill": 61798, + "badge-hd": 61799, + "badge-tm-fill": 61800, + "badge-tm": 61801, + "badge-vo-fill": 61802, + "badge-vo": 61803, + "badge-vr-fill": 61804, + "badge-vr": 61805, + "badge-wc-fill": 61806, + "badge-wc": 61807, + "bag-check-fill": 61808, + "bag-check": 61809, + "bag-dash-fill": 61810, + "bag-dash": 61811, + "bag-fill": 61812, + "bag-plus-fill": 61813, + "bag-plus": 61814, + "bag-x-fill": 61815, + "bag-x": 61816, + "bag": 61817, + "bar-chart-fill": 61818, + "bar-chart-line-fill": 61819, + "bar-chart-line": 61820, + "bar-chart-steps": 61821, + "bar-chart": 61822, + "basket-fill": 61823, + "basket": 61824, + "basket2-fill": 61825, + "basket2": 61826, + "basket3-fill": 61827, + "basket3": 61828, + "battery-charging": 61829, + "battery-full": 61830, + "battery-half": 61831, + "battery": 61832, + "bell-fill": 61833, + "bell": 61834, + "bezier": 61835, + "bezier2": 61836, + "bicycle": 61837, + "binoculars-fill": 61838, + "binoculars": 61839, + "blockquote-left": 61840, + "blockquote-right": 61841, + "book-fill": 61842, + "book-half": 61843, + "book": 61844, + "bookmark-check-fill": 61845, + "bookmark-check": 61846, + "bookmark-dash-fill": 61847, + "bookmark-dash": 61848, + "bookmark-fill": 61849, + "bookmark-heart-fill": 61850, + "bookmark-heart": 61851, + "bookmark-plus-fill": 61852, + "bookmark-plus": 61853, + "bookmark-star-fill": 61854, + "bookmark-star": 61855, + "bookmark-x-fill": 61856, + "bookmark-x": 61857, + "bookmark": 61858, + "bookmarks-fill": 61859, + "bookmarks": 61860, + "bookshelf": 61861, + "bootstrap-fill": 61862, + "bootstrap-reboot": 61863, + "bootstrap": 61864, + "border-all": 61865, + "border-bottom": 61866, + "border-center": 61867, + "border-inner": 61868, + "border-left": 61869, + "border-middle": 61870, + "border-outer": 61871, + "border-right": 61872, + "border-style": 61873, + "border-top": 61874, + "border-width": 61875, + "border": 61876, + "bounding-box-circles": 61877, + "bounding-box": 61878, + "box-arrow-down-left": 61879, + "box-arrow-down-right": 61880, + "box-arrow-down": 61881, + "box-arrow-in-down-left": 61882, + "box-arrow-in-down-right": 61883, + "box-arrow-in-down": 61884, + "box-arrow-in-left": 61885, + "box-arrow-in-right": 61886, + "box-arrow-in-up-left": 61887, + "box-arrow-in-up-right": 61888, + "box-arrow-in-up": 61889, + "box-arrow-left": 61890, + "box-arrow-right": 61891, + "box-arrow-up-left": 61892, + "box-arrow-up-right": 61893, + "box-arrow-up": 61894, + "box-seam": 61895, + "box": 61896, + "braces": 61897, + "bricks": 61898, + "briefcase-fill": 61899, + "briefcase": 61900, + "brightness-alt-high-fill": 61901, + "brightness-alt-high": 61902, + "brightness-alt-low-fill": 61903, + "brightness-alt-low": 61904, + "brightness-high-fill": 61905, + "brightness-high": 61906, + "brightness-low-fill": 61907, + "brightness-low": 61908, + "broadcast-pin": 61909, + "broadcast": 61910, + "brush-fill": 61911, + "brush": 61912, + "bucket-fill": 61913, + "bucket": 61914, + "bug-fill": 61915, + "bug": 61916, + "building": 61917, + "bullseye": 61918, + "calculator-fill": 61919, + "calculator": 61920, + "calendar-check-fill": 61921, + "calendar-check": 61922, + "calendar-date-fill": 61923, + "calendar-date": 61924, + "calendar-day-fill": 61925, + "calendar-day": 61926, + "calendar-event-fill": 61927, + "calendar-event": 61928, + "calendar-fill": 61929, + "calendar-minus-fill": 61930, + "calendar-minus": 61931, + "calendar-month-fill": 61932, + "calendar-month": 61933, + "calendar-plus-fill": 61934, + "calendar-plus": 61935, + "calendar-range-fill": 61936, + "calendar-range": 61937, + "calendar-week-fill": 61938, + "calendar-week": 61939, + "calendar-x-fill": 61940, + "calendar-x": 61941, + "calendar": 61942, + "calendar2-check-fill": 61943, + "calendar2-check": 61944, + "calendar2-date-fill": 61945, + "calendar2-date": 61946, + "calendar2-day-fill": 61947, + "calendar2-day": 61948, + "calendar2-event-fill": 61949, + "calendar2-event": 61950, + "calendar2-fill": 61951, + "calendar2-minus-fill": 61952, + "calendar2-minus": 61953, + "calendar2-month-fill": 61954, + "calendar2-month": 61955, + "calendar2-plus-fill": 61956, + "calendar2-plus": 61957, + "calendar2-range-fill": 61958, + "calendar2-range": 61959, + "calendar2-week-fill": 61960, + "calendar2-week": 61961, + "calendar2-x-fill": 61962, + "calendar2-x": 61963, + "calendar2": 61964, + "calendar3-event-fill": 61965, + "calendar3-event": 61966, + "calendar3-fill": 61967, + "calendar3-range-fill": 61968, + "calendar3-range": 61969, + "calendar3-week-fill": 61970, + "calendar3-week": 61971, + "calendar3": 61972, + "calendar4-event": 61973, + "calendar4-range": 61974, + "calendar4-week": 61975, + "calendar4": 61976, + "camera-fill": 61977, + "camera-reels-fill": 61978, + "camera-reels": 61979, + "camera-video-fill": 61980, + "camera-video-off-fill": 61981, + "camera-video-off": 61982, + "camera-video": 61983, + "camera": 61984, + "camera2": 61985, + "capslock-fill": 61986, + "capslock": 61987, + "card-checklist": 61988, + "card-heading": 61989, + "card-image": 61990, + "card-list": 61991, + "card-text": 61992, + "caret-down-fill": 61993, + "caret-down-square-fill": 61994, + "caret-down-square": 61995, + "caret-down": 61996, + "caret-left-fill": 61997, + "caret-left-square-fill": 61998, + "caret-left-square": 61999, + "caret-left": 62000, + "caret-right-fill": 62001, + "caret-right-square-fill": 62002, + "caret-right-square": 62003, + "caret-right": 62004, + "caret-up-fill": 62005, + "caret-up-square-fill": 62006, + "caret-up-square": 62007, + "caret-up": 62008, + "cart-check-fill": 62009, + "cart-check": 62010, + "cart-dash-fill": 62011, + "cart-dash": 62012, + "cart-fill": 62013, + "cart-plus-fill": 62014, + "cart-plus": 62015, + "cart-x-fill": 62016, + "cart-x": 62017, + "cart": 62018, + "cart2": 62019, + "cart3": 62020, + "cart4": 62021, + "cash-stack": 62022, + "cash": 62023, + "cast": 62024, + "chat-dots-fill": 62025, + "chat-dots": 62026, + "chat-fill": 62027, + "chat-left-dots-fill": 62028, + "chat-left-dots": 62029, + "chat-left-fill": 62030, + "chat-left-quote-fill": 62031, + "chat-left-quote": 62032, + "chat-left-text-fill": 62033, + "chat-left-text": 62034, + "chat-left": 62035, + "chat-quote-fill": 62036, + "chat-quote": 62037, + "chat-right-dots-fill": 62038, + "chat-right-dots": 62039, + "chat-right-fill": 62040, + "chat-right-quote-fill": 62041, + "chat-right-quote": 62042, + "chat-right-text-fill": 62043, + "chat-right-text": 62044, + "chat-right": 62045, + "chat-square-dots-fill": 62046, + "chat-square-dots": 62047, + "chat-square-fill": 62048, + "chat-square-quote-fill": 62049, + "chat-square-quote": 62050, + "chat-square-text-fill": 62051, + "chat-square-text": 62052, + "chat-square": 62053, + "chat-text-fill": 62054, + "chat-text": 62055, + "chat": 62056, + "check-all": 62057, + "check-circle-fill": 62058, + "check-circle": 62059, + "check-square-fill": 62060, + "check-square": 62061, + "check": 62062, + "check2-all": 62063, + "check2-circle": 62064, + "check2-square": 62065, + "check2": 62066, + "chevron-bar-contract": 62067, + "chevron-bar-down": 62068, + "chevron-bar-expand": 62069, + "chevron-bar-left": 62070, + "chevron-bar-right": 62071, + "chevron-bar-up": 62072, + "chevron-compact-down": 62073, + "chevron-compact-left": 62074, + "chevron-compact-right": 62075, + "chevron-compact-up": 62076, + "chevron-contract": 62077, + "chevron-double-down": 62078, + "chevron-double-left": 62079, + "chevron-double-right": 62080, + "chevron-double-up": 62081, + "chevron-down": 62082, + "chevron-expand": 62083, + "chevron-left": 62084, + "chevron-right": 62085, + "chevron-up": 62086, + "circle-fill": 62087, + "circle-half": 62088, + "circle-square": 62089, + "circle": 62090, + "clipboard-check": 62091, + "clipboard-data": 62092, + "clipboard-minus": 62093, + "clipboard-plus": 62094, + "clipboard-x": 62095, + "clipboard": 62096, + "clock-fill": 62097, + "clock-history": 62098, + "clock": 62099, + "cloud-arrow-down-fill": 62100, + "cloud-arrow-down": 62101, + "cloud-arrow-up-fill": 62102, + "cloud-arrow-up": 62103, + "cloud-check-fill": 62104, + "cloud-check": 62105, + "cloud-download-fill": 62106, + "cloud-download": 62107, + "cloud-drizzle-fill": 62108, + "cloud-drizzle": 62109, + "cloud-fill": 62110, + "cloud-fog-fill": 62111, + "cloud-fog": 62112, + "cloud-fog2-fill": 62113, + "cloud-fog2": 62114, + "cloud-hail-fill": 62115, + "cloud-hail": 62116, + "cloud-haze-fill": 62118, + "cloud-haze": 62119, + "cloud-haze2-fill": 62120, + "cloud-lightning-fill": 62121, + "cloud-lightning-rain-fill": 62122, + "cloud-lightning-rain": 62123, + "cloud-lightning": 62124, + "cloud-minus-fill": 62125, + "cloud-minus": 62126, + "cloud-moon-fill": 62127, + "cloud-moon": 62128, + "cloud-plus-fill": 62129, + "cloud-plus": 62130, + "cloud-rain-fill": 62131, + "cloud-rain-heavy-fill": 62132, + "cloud-rain-heavy": 62133, + "cloud-rain": 62134, + "cloud-slash-fill": 62135, + "cloud-slash": 62136, + "cloud-sleet-fill": 62137, + "cloud-sleet": 62138, + "cloud-snow-fill": 62139, + "cloud-snow": 62140, + "cloud-sun-fill": 62141, + "cloud-sun": 62142, + "cloud-upload-fill": 62143, + "cloud-upload": 62144, + "cloud": 62145, + "clouds-fill": 62146, + "clouds": 62147, + "cloudy-fill": 62148, + "cloudy": 62149, + "code-slash": 62150, + "code-square": 62151, + "code": 62152, + "collection-fill": 62153, + "collection-play-fill": 62154, + "collection-play": 62155, + "collection": 62156, + "columns-gap": 62157, + "columns": 62158, + "command": 62159, + "compass-fill": 62160, + "compass": 62161, + "cone-striped": 62162, + "cone": 62163, + "controller": 62164, + "cpu-fill": 62165, + "cpu": 62166, + "credit-card-2-back-fill": 62167, + "credit-card-2-back": 62168, + "credit-card-2-front-fill": 62169, + "credit-card-2-front": 62170, + "credit-card-fill": 62171, + "credit-card": 62172, + "crop": 62173, + "cup-fill": 62174, + "cup-straw": 62175, + "cup": 62176, + "cursor-fill": 62177, + "cursor-text": 62178, + "cursor": 62179, + "dash-circle-dotted": 62180, + "dash-circle-fill": 62181, + "dash-circle": 62182, + "dash-square-dotted": 62183, + "dash-square-fill": 62184, + "dash-square": 62185, + "dash": 62186, + "diagram-2-fill": 62187, + "diagram-2": 62188, + "diagram-3-fill": 62189, + "diagram-3": 62190, + "diamond-fill": 62191, + "diamond-half": 62192, + "diamond": 62193, + "dice-1-fill": 62194, + "dice-1": 62195, + "dice-2-fill": 62196, + "dice-2": 62197, + "dice-3-fill": 62198, + "dice-3": 62199, + "dice-4-fill": 62200, + "dice-4": 62201, + "dice-5-fill": 62202, + "dice-5": 62203, + "dice-6-fill": 62204, + "dice-6": 62205, + "disc-fill": 62206, + "disc": 62207, + "discord": 62208, + "display-fill": 62209, + "display": 62210, + "distribute-horizontal": 62211, + "distribute-vertical": 62212, + "door-closed-fill": 62213, + "door-closed": 62214, + "door-open-fill": 62215, + "door-open": 62216, + "dot": 62217, + "download": 62218, + "droplet-fill": 62219, + "droplet-half": 62220, + "droplet": 62221, + "earbuds": 62222, + "easel-fill": 62223, + "easel": 62224, + "egg-fill": 62225, + "egg-fried": 62226, + "egg": 62227, + "eject-fill": 62228, + "eject": 62229, + "emoji-angry-fill": 62230, + "emoji-angry": 62231, + "emoji-dizzy-fill": 62232, + "emoji-dizzy": 62233, + "emoji-expressionless-fill": 62234, + "emoji-expressionless": 62235, + "emoji-frown-fill": 62236, + "emoji-frown": 62237, + "emoji-heart-eyes-fill": 62238, + "emoji-heart-eyes": 62239, + "emoji-laughing-fill": 62240, + "emoji-laughing": 62241, + "emoji-neutral-fill": 62242, + "emoji-neutral": 62243, + "emoji-smile-fill": 62244, + "emoji-smile-upside-down-fill": 62245, + "emoji-smile-upside-down": 62246, + "emoji-smile": 62247, + "emoji-sunglasses-fill": 62248, + "emoji-sunglasses": 62249, + "emoji-wink-fill": 62250, + "emoji-wink": 62251, + "envelope-fill": 62252, + "envelope-open-fill": 62253, + "envelope-open": 62254, + "envelope": 62255, + "eraser-fill": 62256, + "eraser": 62257, + "exclamation-circle-fill": 62258, + "exclamation-circle": 62259, + "exclamation-diamond-fill": 62260, + "exclamation-diamond": 62261, + "exclamation-octagon-fill": 62262, + "exclamation-octagon": 62263, + "exclamation-square-fill": 62264, + "exclamation-square": 62265, + "exclamation-triangle-fill": 62266, + "exclamation-triangle": 62267, + "exclamation": 62268, + "exclude": 62269, + "eye-fill": 62270, + "eye-slash-fill": 62271, + "eye-slash": 62272, + "eye": 62273, + "eyedropper": 62274, + "eyeglasses": 62275, + "facebook": 62276, + "file-arrow-down-fill": 62277, + "file-arrow-down": 62278, + "file-arrow-up-fill": 62279, + "file-arrow-up": 62280, + "file-bar-graph-fill": 62281, + "file-bar-graph": 62282, + "file-binary-fill": 62283, + "file-binary": 62284, + "file-break-fill": 62285, + "file-break": 62286, + "file-check-fill": 62287, + "file-check": 62288, + "file-code-fill": 62289, + "file-code": 62290, + "file-diff-fill": 62291, + "file-diff": 62292, + "file-earmark-arrow-down-fill": 62293, + "file-earmark-arrow-down": 62294, + "file-earmark-arrow-up-fill": 62295, + "file-earmark-arrow-up": 62296, + "file-earmark-bar-graph-fill": 62297, + "file-earmark-bar-graph": 62298, + "file-earmark-binary-fill": 62299, + "file-earmark-binary": 62300, + "file-earmark-break-fill": 62301, + "file-earmark-break": 62302, + "file-earmark-check-fill": 62303, + "file-earmark-check": 62304, + "file-earmark-code-fill": 62305, + "file-earmark-code": 62306, + "file-earmark-diff-fill": 62307, + "file-earmark-diff": 62308, + "file-earmark-easel-fill": 62309, + "file-earmark-easel": 62310, + "file-earmark-excel-fill": 62311, + "file-earmark-excel": 62312, + "file-earmark-fill": 62313, + "file-earmark-font-fill": 62314, + "file-earmark-font": 62315, + "file-earmark-image-fill": 62316, + "file-earmark-image": 62317, + "file-earmark-lock-fill": 62318, + "file-earmark-lock": 62319, + "file-earmark-lock2-fill": 62320, + "file-earmark-lock2": 62321, + "file-earmark-medical-fill": 62322, + "file-earmark-medical": 62323, + "file-earmark-minus-fill": 62324, + "file-earmark-minus": 62325, + "file-earmark-music-fill": 62326, + "file-earmark-music": 62327, + "file-earmark-person-fill": 62328, + "file-earmark-person": 62329, + "file-earmark-play-fill": 62330, + "file-earmark-play": 62331, + "file-earmark-plus-fill": 62332, + "file-earmark-plus": 62333, + "file-earmark-post-fill": 62334, + "file-earmark-post": 62335, + "file-earmark-ppt-fill": 62336, + "file-earmark-ppt": 62337, + "file-earmark-richtext-fill": 62338, + "file-earmark-richtext": 62339, + "file-earmark-ruled-fill": 62340, + "file-earmark-ruled": 62341, + "file-earmark-slides-fill": 62342, + "file-earmark-slides": 62343, + "file-earmark-spreadsheet-fill": 62344, + "file-earmark-spreadsheet": 62345, + "file-earmark-text-fill": 62346, + "file-earmark-text": 62347, + "file-earmark-word-fill": 62348, + "file-earmark-word": 62349, + "file-earmark-x-fill": 62350, + "file-earmark-x": 62351, + "file-earmark-zip-fill": 62352, + "file-earmark-zip": 62353, + "file-earmark": 62354, + "file-easel-fill": 62355, + "file-easel": 62356, + "file-excel-fill": 62357, + "file-excel": 62358, + "file-fill": 62359, + "file-font-fill": 62360, + "file-font": 62361, + "file-image-fill": 62362, + "file-image": 62363, + "file-lock-fill": 62364, + "file-lock": 62365, + "file-lock2-fill": 62366, + "file-lock2": 62367, + "file-medical-fill": 62368, + "file-medical": 62369, + "file-minus-fill": 62370, + "file-minus": 62371, + "file-music-fill": 62372, + "file-music": 62373, + "file-person-fill": 62374, + "file-person": 62375, + "file-play-fill": 62376, + "file-play": 62377, + "file-plus-fill": 62378, + "file-plus": 62379, + "file-post-fill": 62380, + "file-post": 62381, + "file-ppt-fill": 62382, + "file-ppt": 62383, + "file-richtext-fill": 62384, + "file-richtext": 62385, + "file-ruled-fill": 62386, + "file-ruled": 62387, + "file-slides-fill": 62388, + "file-slides": 62389, + "file-spreadsheet-fill": 62390, + "file-spreadsheet": 62391, + "file-text-fill": 62392, + "file-text": 62393, + "file-word-fill": 62394, + "file-word": 62395, + "file-x-fill": 62396, + "file-x": 62397, + "file-zip-fill": 62398, + "file-zip": 62399, + "file": 62400, + "files-alt": 62401, + "files": 62402, + "film": 62403, + "filter-circle-fill": 62404, + "filter-circle": 62405, + "filter-left": 62406, + "filter-right": 62407, + "filter-square-fill": 62408, + "filter-square": 62409, + "filter": 62410, + "flag-fill": 62411, + "flag": 62412, + "flower1": 62413, + "flower2": 62414, + "flower3": 62415, + "folder-check": 62416, + "folder-fill": 62417, + "folder-minus": 62418, + "folder-plus": 62419, + "folder-symlink-fill": 62420, + "folder-symlink": 62421, + "folder-x": 62422, + "folder": 62423, + "folder2-open": 62424, + "folder2": 62425, + "fonts": 62426, + "forward-fill": 62427, + "forward": 62428, + "front": 62429, + "fullscreen-exit": 62430, + "fullscreen": 62431, + "funnel-fill": 62432, + "funnel": 62433, + "gear-fill": 62434, + "gear-wide-connected": 62435, + "gear-wide": 62436, + "gear": 62437, + "gem": 62438, + "geo-alt-fill": 62439, + "geo-alt": 62440, + "geo-fill": 62441, + "geo": 62442, + "gift-fill": 62443, + "gift": 62444, + "github": 62445, + "globe": 62446, + "globe2": 62447, + "google": 62448, + "graph-down": 62449, + "graph-up": 62450, + "grid-1x2-fill": 62451, + "grid-1x2": 62452, + "grid-3x2-gap-fill": 62453, + "grid-3x2-gap": 62454, + "grid-3x2": 62455, + "grid-3x3-gap-fill": 62456, + "grid-3x3-gap": 62457, + "grid-3x3": 62458, + "grid-fill": 62459, + "grid": 62460, + "grip-horizontal": 62461, + "grip-vertical": 62462, + "hammer": 62463, + "hand-index-fill": 62464, + "hand-index-thumb-fill": 62465, + "hand-index-thumb": 62466, + "hand-index": 62467, + "hand-thumbs-down-fill": 62468, + "hand-thumbs-down": 62469, + "hand-thumbs-up-fill": 62470, + "hand-thumbs-up": 62471, + "handbag-fill": 62472, + "handbag": 62473, + "hash": 62474, + "hdd-fill": 62475, + "hdd-network-fill": 62476, + "hdd-network": 62477, + "hdd-rack-fill": 62478, + "hdd-rack": 62479, + "hdd-stack-fill": 62480, + "hdd-stack": 62481, + "hdd": 62482, + "headphones": 62483, + "headset": 62484, + "heart-fill": 62485, + "heart-half": 62486, + "heart": 62487, + "heptagon-fill": 62488, + "heptagon-half": 62489, + "heptagon": 62490, + "hexagon-fill": 62491, + "hexagon-half": 62492, + "hexagon": 62493, + "hourglass-bottom": 62494, + "hourglass-split": 62495, + "hourglass-top": 62496, + "hourglass": 62497, + "house-door-fill": 62498, + "house-door": 62499, + "house-fill": 62500, + "house": 62501, + "hr": 62502, + "hurricane": 62503, + "image-alt": 62504, + "image-fill": 62505, + "image": 62506, + "images": 62507, + "inbox-fill": 62508, + "inbox": 62509, + "inboxes-fill": 62510, + "inboxes": 62511, + "info-circle-fill": 62512, + "info-circle": 62513, + "info-square-fill": 62514, + "info-square": 62515, + "info": 62516, + "input-cursor-text": 62517, + "input-cursor": 62518, + "instagram": 62519, + "intersect": 62520, + "journal-album": 62521, + "journal-arrow-down": 62522, + "journal-arrow-up": 62523, + "journal-bookmark-fill": 62524, + "journal-bookmark": 62525, + "journal-check": 62526, + "journal-code": 62527, + "journal-medical": 62528, + "journal-minus": 62529, + "journal-plus": 62530, + "journal-richtext": 62531, + "journal-text": 62532, + "journal-x": 62533, + "journal": 62534, + "journals": 62535, + "joystick": 62536, + "justify-left": 62537, + "justify-right": 62538, + "justify": 62539, + "kanban-fill": 62540, + "kanban": 62541, + "key-fill": 62542, + "key": 62543, + "keyboard-fill": 62544, + "keyboard": 62545, + "ladder": 62546, + "lamp-fill": 62547, + "lamp": 62548, + "laptop-fill": 62549, + "laptop": 62550, + "layer-backward": 62551, + "layer-forward": 62552, + "layers-fill": 62553, + "layers-half": 62554, + "layers": 62555, + "layout-sidebar-inset-reverse": 62556, + "layout-sidebar-inset": 62557, + "layout-sidebar-reverse": 62558, + "layout-sidebar": 62559, + "layout-split": 62560, + "layout-text-sidebar-reverse": 62561, + "layout-text-sidebar": 62562, + "layout-text-window-reverse": 62563, + "layout-text-window": 62564, + "layout-three-columns": 62565, + "layout-wtf": 62566, + "life-preserver": 62567, + "lightbulb-fill": 62568, + "lightbulb-off-fill": 62569, + "lightbulb-off": 62570, + "lightbulb": 62571, + "lightning-charge-fill": 62572, + "lightning-charge": 62573, + "lightning-fill": 62574, + "lightning": 62575, + "link-45deg": 62576, + "link": 62577, + "linkedin": 62578, + "list-check": 62579, + "list-nested": 62580, + "list-ol": 62581, + "list-stars": 62582, + "list-task": 62583, + "list-ul": 62584, + "list": 62585, + "lock-fill": 62586, + "lock": 62587, + "mailbox": 62588, + "mailbox2": 62589, + "map-fill": 62590, + "map": 62591, + "markdown-fill": 62592, + "markdown": 62593, + "mask": 62594, + "megaphone-fill": 62595, + "megaphone": 62596, + "menu-app-fill": 62597, + "menu-app": 62598, + "menu-button-fill": 62599, + "menu-button-wide-fill": 62600, + "menu-button-wide": 62601, + "menu-button": 62602, + "menu-down": 62603, + "menu-up": 62604, + "mic-fill": 62605, + "mic-mute-fill": 62606, + "mic-mute": 62607, + "mic": 62608, + "minecart-loaded": 62609, + "minecart": 62610, + "moisture": 62611, + "moon-fill": 62612, + "moon-stars-fill": 62613, + "moon-stars": 62614, + "moon": 62615, + "mouse-fill": 62616, + "mouse": 62617, + "mouse2-fill": 62618, + "mouse2": 62619, + "mouse3-fill": 62620, + "mouse3": 62621, + "music-note-beamed": 62622, + "music-note-list": 62623, + "music-note": 62624, + "music-player-fill": 62625, + "music-player": 62626, + "newspaper": 62627, + "node-minus-fill": 62628, + "node-minus": 62629, + "node-plus-fill": 62630, + "node-plus": 62631, + "nut-fill": 62632, + "nut": 62633, + "octagon-fill": 62634, + "octagon-half": 62635, + "octagon": 62636, + "option": 62637, + "outlet": 62638, + "paint-bucket": 62639, + "palette-fill": 62640, + "palette": 62641, + "palette2": 62642, + "paperclip": 62643, + "paragraph": 62644, + "patch-check-fill": 62645, + "patch-check": 62646, + "patch-exclamation-fill": 62647, + "patch-exclamation": 62648, + "patch-minus-fill": 62649, + "patch-minus": 62650, + "patch-plus-fill": 62651, + "patch-plus": 62652, + "patch-question-fill": 62653, + "patch-question": 62654, + "pause-btn-fill": 62655, + "pause-btn": 62656, + "pause-circle-fill": 62657, + "pause-circle": 62658, + "pause-fill": 62659, + "pause": 62660, + "peace-fill": 62661, + "peace": 62662, + "pen-fill": 62663, + "pen": 62664, + "pencil-fill": 62665, + "pencil-square": 62666, + "pencil": 62667, + "pentagon-fill": 62668, + "pentagon-half": 62669, + "pentagon": 62670, + "people-fill": 62671, + "people": 62672, + "percent": 62673, + "person-badge-fill": 62674, + "person-badge": 62675, + "person-bounding-box": 62676, + "person-check-fill": 62677, + "person-check": 62678, + "person-circle": 62679, + "person-dash-fill": 62680, + "person-dash": 62681, + "person-fill": 62682, + "person-lines-fill": 62683, + "person-plus-fill": 62684, + "person-plus": 62685, + "person-square": 62686, + "person-x-fill": 62687, + "person-x": 62688, + "person": 62689, + "phone-fill": 62690, + "phone-landscape-fill": 62691, + "phone-landscape": 62692, + "phone-vibrate-fill": 62693, + "phone-vibrate": 62694, + "phone": 62695, + "pie-chart-fill": 62696, + "pie-chart": 62697, + "pin-angle-fill": 62698, + "pin-angle": 62699, + "pin-fill": 62700, + "pin": 62701, + "pip-fill": 62702, + "pip": 62703, + "play-btn-fill": 62704, + "play-btn": 62705, + "play-circle-fill": 62706, + "play-circle": 62707, + "play-fill": 62708, + "play": 62709, + "plug-fill": 62710, + "plug": 62711, + "plus-circle-dotted": 62712, + "plus-circle-fill": 62713, + "plus-circle": 62714, + "plus-square-dotted": 62715, + "plus-square-fill": 62716, + "plus-square": 62717, + "plus": 62718, + "power": 62719, + "printer-fill": 62720, + "printer": 62721, + "puzzle-fill": 62722, + "puzzle": 62723, + "question-circle-fill": 62724, + "question-circle": 62725, + "question-diamond-fill": 62726, + "question-diamond": 62727, + "question-octagon-fill": 62728, + "question-octagon": 62729, + "question-square-fill": 62730, + "question-square": 62731, + "question": 62732, + "rainbow": 62733, + "receipt-cutoff": 62734, + "receipt": 62735, + "reception-0": 62736, + "reception-1": 62737, + "reception-2": 62738, + "reception-3": 62739, + "reception-4": 62740, + "record-btn-fill": 62741, + "record-btn": 62742, + "record-circle-fill": 62743, + "record-circle": 62744, + "record-fill": 62745, + "record": 62746, + "record2-fill": 62747, + "record2": 62748, + "reply-all-fill": 62749, + "reply-all": 62750, + "reply-fill": 62751, + "reply": 62752, + "rss-fill": 62753, + "rss": 62754, + "rulers": 62755, + "save-fill": 62756, + "save": 62757, + "save2-fill": 62758, + "save2": 62759, + "scissors": 62760, + "screwdriver": 62761, + "search": 62762, + "segmented-nav": 62763, + "server": 62764, + "share-fill": 62765, + "share": 62766, + "shield-check": 62767, + "shield-exclamation": 62768, + "shield-fill-check": 62769, + "shield-fill-exclamation": 62770, + "shield-fill-minus": 62771, + "shield-fill-plus": 62772, + "shield-fill-x": 62773, + "shield-fill": 62774, + "shield-lock-fill": 62775, + "shield-lock": 62776, + "shield-minus": 62777, + "shield-plus": 62778, + "shield-shaded": 62779, + "shield-slash-fill": 62780, + "shield-slash": 62781, + "shield-x": 62782, + "shield": 62783, + "shift-fill": 62784, + "shift": 62785, + "shop-window": 62786, + "shop": 62787, + "shuffle": 62788, + "signpost-2-fill": 62789, + "signpost-2": 62790, + "signpost-fill": 62791, + "signpost-split-fill": 62792, + "signpost-split": 62793, + "signpost": 62794, + "sim-fill": 62795, + "sim": 62796, + "skip-backward-btn-fill": 62797, + "skip-backward-btn": 62798, + "skip-backward-circle-fill": 62799, + "skip-backward-circle": 62800, + "skip-backward-fill": 62801, + "skip-backward": 62802, + "skip-end-btn-fill": 62803, + "skip-end-btn": 62804, + "skip-end-circle-fill": 62805, + "skip-end-circle": 62806, + "skip-end-fill": 62807, + "skip-end": 62808, + "skip-forward-btn-fill": 62809, + "skip-forward-btn": 62810, + "skip-forward-circle-fill": 62811, + "skip-forward-circle": 62812, + "skip-forward-fill": 62813, + "skip-forward": 62814, + "skip-start-btn-fill": 62815, + "skip-start-btn": 62816, + "skip-start-circle-fill": 62817, + "skip-start-circle": 62818, + "skip-start-fill": 62819, + "skip-start": 62820, + "slack": 62821, + "slash-circle-fill": 62822, + "slash-circle": 62823, + "slash-square-fill": 62824, + "slash-square": 62825, + "slash": 62826, + "sliders": 62827, + "smartwatch": 62828, + "snow": 62829, + "snow2": 62830, + "snow3": 62831, + "sort-alpha-down-alt": 62832, + "sort-alpha-down": 62833, + "sort-alpha-up-alt": 62834, + "sort-alpha-up": 62835, + "sort-down-alt": 62836, + "sort-down": 62837, + "sort-numeric-down-alt": 62838, + "sort-numeric-down": 62839, + "sort-numeric-up-alt": 62840, + "sort-numeric-up": 62841, + "sort-up-alt": 62842, + "sort-up": 62843, + "soundwave": 62844, + "speaker-fill": 62845, + "speaker": 62846, + "speedometer": 62847, + "speedometer2": 62848, + "spellcheck": 62849, + "square-fill": 62850, + "square-half": 62851, + "square": 62852, + "stack": 62853, + "star-fill": 62854, + "star-half": 62855, + "star": 62856, + "stars": 62857, + "stickies-fill": 62858, + "stickies": 62859, + "sticky-fill": 62860, + "sticky": 62861, + "stop-btn-fill": 62862, + "stop-btn": 62863, + "stop-circle-fill": 62864, + "stop-circle": 62865, + "stop-fill": 62866, + "stop": 62867, + "stoplights-fill": 62868, + "stoplights": 62869, + "stopwatch-fill": 62870, + "stopwatch": 62871, + "subtract": 62872, + "suit-club-fill": 62873, + "suit-club": 62874, + "suit-diamond-fill": 62875, + "suit-diamond": 62876, + "suit-heart-fill": 62877, + "suit-heart": 62878, + "suit-spade-fill": 62879, + "suit-spade": 62880, + "sun-fill": 62881, + "sun": 62882, + "sunglasses": 62883, + "sunrise-fill": 62884, + "sunrise": 62885, + "sunset-fill": 62886, + "sunset": 62887, + "symmetry-horizontal": 62888, + "symmetry-vertical": 62889, + "table": 62890, + "tablet-fill": 62891, + "tablet-landscape-fill": 62892, + "tablet-landscape": 62893, + "tablet": 62894, + "tag-fill": 62895, + "tag": 62896, + "tags-fill": 62897, + "tags": 62898, + "telegram": 62899, + "telephone-fill": 62900, + "telephone-forward-fill": 62901, + "telephone-forward": 62902, + "telephone-inbound-fill": 62903, + "telephone-inbound": 62904, + "telephone-minus-fill": 62905, + "telephone-minus": 62906, + "telephone-outbound-fill": 62907, + "telephone-outbound": 62908, + "telephone-plus-fill": 62909, + "telephone-plus": 62910, + "telephone-x-fill": 62911, + "telephone-x": 62912, + "telephone": 62913, + "terminal-fill": 62914, + "terminal": 62915, + "text-center": 62916, + "text-indent-left": 62917, + "text-indent-right": 62918, + "text-left": 62919, + "text-paragraph": 62920, + "text-right": 62921, + "textarea-resize": 62922, + "textarea-t": 62923, + "textarea": 62924, + "thermometer-half": 62925, + "thermometer-high": 62926, + "thermometer-low": 62927, + "thermometer-snow": 62928, + "thermometer-sun": 62929, + "thermometer": 62930, + "three-dots-vertical": 62931, + "three-dots": 62932, + "toggle-off": 62933, + "toggle-on": 62934, + "toggle2-off": 62935, + "toggle2-on": 62936, + "toggles": 62937, + "toggles2": 62938, + "tools": 62939, + "tornado": 62940, + "trash-fill": 62941, + "trash": 62942, + "trash2-fill": 62943, + "trash2": 62944, + "tree-fill": 62945, + "tree": 62946, + "triangle-fill": 62947, + "triangle-half": 62948, + "triangle": 62949, + "trophy-fill": 62950, + "trophy": 62951, + "tropical-storm": 62952, + "truck-flatbed": 62953, + "truck": 62954, + "tsunami": 62955, + "tv-fill": 62956, + "tv": 62957, + "twitch": 62958, + "twitter": 62959, + "type-bold": 62960, + "type-h1": 62961, + "type-h2": 62962, + "type-h3": 62963, + "type-italic": 62964, + "type-strikethrough": 62965, + "type-underline": 62966, + "type": 62967, + "ui-checks-grid": 62968, + "ui-checks": 62969, + "ui-radios-grid": 62970, + "ui-radios": 62971, + "umbrella-fill": 62972, + "umbrella": 62973, + "union": 62974, + "unlock-fill": 62975, + "unlock": 62976, + "upc-scan": 62977, + "upc": 62978, + "upload": 62979, + "vector-pen": 62980, + "view-list": 62981, + "view-stacked": 62982, + "vinyl-fill": 62983, + "vinyl": 62984, + "voicemail": 62985, + "volume-down-fill": 62986, + "volume-down": 62987, + "volume-mute-fill": 62988, + "volume-mute": 62989, + "volume-off-fill": 62990, + "volume-off": 62991, + "volume-up-fill": 62992, + "volume-up": 62993, + "vr": 62994, + "wallet-fill": 62995, + "wallet": 62996, + "wallet2": 62997, + "watch": 62998, + "water": 62999, + "whatsapp": 63000, + "wifi-1": 63001, + "wifi-2": 63002, + "wifi-off": 63003, + "wifi": 63004, + "wind": 63005, + "window-dock": 63006, + "window-sidebar": 63007, + "window": 63008, + "wrench": 63009, + "x-circle-fill": 63010, + "x-circle": 63011, + "x-diamond-fill": 63012, + "x-diamond": 63013, + "x-octagon-fill": 63014, + "x-octagon": 63015, + "x-square-fill": 63016, + "x-square": 63017, + "x": 63018, + "youtube": 63019, + "zoom-in": 63020, + "zoom-out": 63021, + "bank": 63022, + "bank2": 63023, + "bell-slash-fill": 63024, + "bell-slash": 63025, + "cash-coin": 63026, + "check-lg": 63027, + "coin": 63028, + "currency-bitcoin": 63029, + "currency-dollar": 63030, + "currency-euro": 63031, + "currency-exchange": 63032, + "currency-pound": 63033, + "currency-yen": 63034, + "dash-lg": 63035, + "exclamation-lg": 63036, + "file-earmark-pdf-fill": 63037, + "file-earmark-pdf": 63038, + "file-pdf-fill": 63039, + "file-pdf": 63040, + "gender-ambiguous": 63041, + "gender-female": 63042, + "gender-male": 63043, + "gender-trans": 63044, + "headset-vr": 63045, + "info-lg": 63046, + "mastodon": 63047, + "messenger": 63048, + "piggy-bank-fill": 63049, + "piggy-bank": 63050, + "pin-map-fill": 63051, + "pin-map": 63052, + "plus-lg": 63053, + "question-lg": 63054, + "recycle": 63055, + "reddit": 63056, + "safe-fill": 63057, + "safe2-fill": 63058, + "safe2": 63059, + "sd-card-fill": 63060, + "sd-card": 63061, + "skype": 63062, + "slash-lg": 63063, + "translate": 63064, + "x-lg": 63065, + "safe": 63066, + "apple": 63067, + "microsoft": 63069, + "windows": 63070, + "behance": 63068, + "dribbble": 63071, + "line": 63072, + "medium": 63073, + "paypal": 63074, + "pinterest": 63075, + "signal": 63076, + "snapchat": 63077, + "spotify": 63078, + "stack-overflow": 63079, + "strava": 63080, + "wordpress": 63081, + "vimeo": 63082, + "activity": 63083, + "easel2-fill": 63084, + "easel2": 63085, + "easel3-fill": 63086, + "easel3": 63087, + "fan": 63088, + "fingerprint": 63089, + "graph-down-arrow": 63090, + "graph-up-arrow": 63091, + "hypnotize": 63092, + "magic": 63093, + "person-rolodex": 63094, + "person-video": 63095, + "person-video2": 63096, + "person-video3": 63097, + "person-workspace": 63098, + "radioactive": 63099, + "webcam-fill": 63100, + "webcam": 63101, + "yin-yang": 63102, + "bandaid-fill": 63104, + "bandaid": 63105, + "bluetooth": 63106, + "body-text": 63107, + "boombox": 63108, + "boxes": 63109, + "dpad-fill": 63110, + "dpad": 63111, + "ear-fill": 63112, + "ear": 63113, + "envelope-check-fill": 63115, + "envelope-check": 63116, + "envelope-dash-fill": 63118, + "envelope-dash": 63119, + "envelope-exclamation-fill": 63121, + "envelope-exclamation": 63122, + "envelope-plus-fill": 63123, + "envelope-plus": 63124, + "envelope-slash-fill": 63126, + "envelope-slash": 63127, + "envelope-x-fill": 63129, + "envelope-x": 63130, + "explicit-fill": 63131, + "explicit": 63132, + "git": 63133, + "infinity": 63134, + "list-columns-reverse": 63135, + "list-columns": 63136, + "meta": 63137, + "nintendo-switch": 63140, + "pc-display-horizontal": 63141, + "pc-display": 63142, + "pc-horizontal": 63143, + "pc": 63144, + "playstation": 63145, + "plus-slash-minus": 63146, + "projector-fill": 63147, + "projector": 63148, + "qr-code-scan": 63149, + "qr-code": 63150, + "quora": 63151, + "quote": 63152, + "robot": 63153, + "send-check-fill": 63154, + "send-check": 63155, + "send-dash-fill": 63156, + "send-dash": 63157, + "send-exclamation-fill": 63159, + "send-exclamation": 63160, + "send-fill": 63161, + "send-plus-fill": 63162, + "send-plus": 63163, + "send-slash-fill": 63164, + "send-slash": 63165, + "send-x-fill": 63166, + "send-x": 63167, + "send": 63168, + "steam": 63169, + "terminal-dash": 63171, + "terminal-plus": 63172, + "terminal-split": 63173, + "ticket-detailed-fill": 63174, + "ticket-detailed": 63175, + "ticket-fill": 63176, + "ticket-perforated-fill": 63177, + "ticket-perforated": 63178, + "ticket": 63179, + "tiktok": 63180, + "window-dash": 63181, + "window-desktop": 63182, + "window-fullscreen": 63183, + "window-plus": 63184, + "window-split": 63185, + "window-stack": 63186, + "window-x": 63187, + "xbox": 63188, + "ethernet": 63189, + "hdmi-fill": 63190, + "hdmi": 63191, + "usb-c-fill": 63192, + "usb-c": 63193, + "usb-fill": 63194, + "usb-plug-fill": 63195, + "usb-plug": 63196, + "usb-symbol": 63197, + "usb": 63198, + "boombox-fill": 63199, + "displayport": 63201, + "gpu-card": 63202, + "memory": 63203, + "modem-fill": 63204, + "modem": 63205, + "motherboard-fill": 63206, + "motherboard": 63207, + "optical-audio-fill": 63208, + "optical-audio": 63209, + "pci-card": 63210, + "router-fill": 63211, + "router": 63212, + "thunderbolt-fill": 63215, + "thunderbolt": 63216, + "usb-drive-fill": 63217, + "usb-drive": 63218, + "usb-micro-fill": 63219, + "usb-micro": 63220, + "usb-mini-fill": 63221, + "usb-mini": 63222, + "cloud-haze2": 63223, + "device-hdd-fill": 63224, + "device-hdd": 63225, + "device-ssd-fill": 63226, + "device-ssd": 63227, + "displayport-fill": 63228, + "mortarboard-fill": 63229, + "mortarboard": 63230, + "terminal-x": 63231, + "arrow-through-heart-fill": 63232, + "arrow-through-heart": 63233, + "badge-sd-fill": 63234, + "badge-sd": 63235, + "bag-heart-fill": 63236, + "bag-heart": 63237, + "balloon-fill": 63238, + "balloon-heart-fill": 63239, + "balloon-heart": 63240, + "balloon": 63241, + "box2-fill": 63242, + "box2-heart-fill": 63243, + "box2-heart": 63244, + "box2": 63245, + "braces-asterisk": 63246, + "calendar-heart-fill": 63247, + "calendar-heart": 63248, + "calendar2-heart-fill": 63249, + "calendar2-heart": 63250, + "chat-heart-fill": 63251, + "chat-heart": 63252, + "chat-left-heart-fill": 63253, + "chat-left-heart": 63254, + "chat-right-heart-fill": 63255, + "chat-right-heart": 63256, + "chat-square-heart-fill": 63257, + "chat-square-heart": 63258, + "clipboard-check-fill": 63259, + "clipboard-data-fill": 63260, + "clipboard-fill": 63261, + "clipboard-heart-fill": 63262, + "clipboard-heart": 63263, + "clipboard-minus-fill": 63264, + "clipboard-plus-fill": 63265, + "clipboard-pulse": 63266, + "clipboard-x-fill": 63267, + "clipboard2-check-fill": 63268, + "clipboard2-check": 63269, + "clipboard2-data-fill": 63270, + "clipboard2-data": 63271, + "clipboard2-fill": 63272, + "clipboard2-heart-fill": 63273, + "clipboard2-heart": 63274, + "clipboard2-minus-fill": 63275, + "clipboard2-minus": 63276, + "clipboard2-plus-fill": 63277, + "clipboard2-plus": 63278, + "clipboard2-pulse-fill": 63279, + "clipboard2-pulse": 63280, + "clipboard2-x-fill": 63281, + "clipboard2-x": 63282, + "clipboard2": 63283, + "emoji-kiss-fill": 63284, + "emoji-kiss": 63285, + "envelope-heart-fill": 63286, + "envelope-heart": 63287, + "envelope-open-heart-fill": 63288, + "envelope-open-heart": 63289, + "envelope-paper-fill": 63290, + "envelope-paper-heart-fill": 63291, + "envelope-paper-heart": 63292, + "envelope-paper": 63293, + "filetype-aac": 63294, + "filetype-ai": 63295, + "filetype-bmp": 63296, + "filetype-cs": 63297, + "filetype-css": 63298, + "filetype-csv": 63299, + "filetype-doc": 63300, + "filetype-docx": 63301, + "filetype-exe": 63302, + "filetype-gif": 63303, + "filetype-heic": 63304, + "filetype-html": 63305, + "filetype-java": 63306, + "filetype-jpg": 63307, + "filetype-js": 63308, + "filetype-jsx": 63309, + "filetype-key": 63310, + "filetype-m4p": 63311, + "filetype-md": 63312, + "filetype-mdx": 63313, + "filetype-mov": 63314, + "filetype-mp3": 63315, + "filetype-mp4": 63316, + "filetype-otf": 63317, + "filetype-pdf": 63318, + "filetype-php": 63319, + "filetype-png": 63320, + "filetype-ppt": 63322, + "filetype-psd": 63323, + "filetype-py": 63324, + "filetype-raw": 63325, + "filetype-rb": 63326, + "filetype-sass": 63327, + "filetype-scss": 63328, + "filetype-sh": 63329, + "filetype-svg": 63330, + "filetype-tiff": 63331, + "filetype-tsx": 63332, + "filetype-ttf": 63333, + "filetype-txt": 63334, + "filetype-wav": 63335, + "filetype-woff": 63336, + "filetype-xls": 63338, + "filetype-xml": 63339, + "filetype-yml": 63340, + "heart-arrow": 63341, + "heart-pulse-fill": 63342, + "heart-pulse": 63343, + "heartbreak-fill": 63344, + "heartbreak": 63345, + "hearts": 63346, + "hospital-fill": 63347, + "hospital": 63348, + "house-heart-fill": 63349, + "house-heart": 63350, + "incognito": 63351, + "magnet-fill": 63352, + "magnet": 63353, + "person-heart": 63354, + "person-hearts": 63355, + "phone-flip": 63356, + "plugin": 63357, + "postage-fill": 63358, + "postage-heart-fill": 63359, + "postage-heart": 63360, + "postage": 63361, + "postcard-fill": 63362, + "postcard-heart-fill": 63363, + "postcard-heart": 63364, + "postcard": 63365, + "search-heart-fill": 63366, + "search-heart": 63367, + "sliders2-vertical": 63368, + "sliders2": 63369, + "trash3-fill": 63370, + "trash3": 63371, + "valentine": 63372, + "valentine2": 63373, + "wrench-adjustable-circle-fill": 63374, + "wrench-adjustable-circle": 63375, + "wrench-adjustable": 63376, + "filetype-json": 63377, + "filetype-pptx": 63378, + "filetype-xlsx": 63379, + "1-circle-fill": 63382, + "1-circle": 63383, + "1-square-fill": 63384, + "1-square": 63385, + "2-circle-fill": 63388, + "2-circle": 63389, + "2-square-fill": 63390, + "2-square": 63391, + "3-circle-fill": 63394, + "3-circle": 63395, + "3-square-fill": 63396, + "3-square": 63397, + "4-circle-fill": 63400, + "4-circle": 63401, + "4-square-fill": 63402, + "4-square": 63403, + "5-circle-fill": 63406, + "5-circle": 63407, + "5-square-fill": 63408, + "5-square": 63409, + "6-circle-fill": 63412, + "6-circle": 63413, + "6-square-fill": 63414, + "6-square": 63415, + "7-circle-fill": 63418, + "7-circle": 63419, + "7-square-fill": 63420, + "7-square": 63421, + "8-circle-fill": 63424, + "8-circle": 63425, + "8-square-fill": 63426, + "8-square": 63427, + "9-circle-fill": 63430, + "9-circle": 63431, + "9-square-fill": 63432, + "9-square": 63433, + "airplane-engines-fill": 63434, + "airplane-engines": 63435, + "airplane-fill": 63436, + "airplane": 63437, + "alexa": 63438, + "alipay": 63439, + "android": 63440, + "android2": 63441, + "box-fill": 63442, + "box-seam-fill": 63443, + "browser-chrome": 63444, + "browser-edge": 63445, + "browser-firefox": 63446, + "browser-safari": 63447, + "c-circle-fill": 63450, + "c-circle": 63451, + "c-square-fill": 63452, + "c-square": 63453, + "capsule-pill": 63454, + "capsule": 63455, + "car-front-fill": 63456, + "car-front": 63457, + "cassette-fill": 63458, + "cassette": 63459, + "cc-circle-fill": 63462, + "cc-circle": 63463, + "cc-square-fill": 63464, + "cc-square": 63465, + "cup-hot-fill": 63466, + "cup-hot": 63467, + "currency-rupee": 63468, + "dropbox": 63469, + "escape": 63470, + "fast-forward-btn-fill": 63471, + "fast-forward-btn": 63472, + "fast-forward-circle-fill": 63473, + "fast-forward-circle": 63474, + "fast-forward-fill": 63475, + "fast-forward": 63476, + "filetype-sql": 63477, + "fire": 63478, + "google-play": 63479, + "h-circle-fill": 63482, + "h-circle": 63483, + "h-square-fill": 63484, + "h-square": 63485, + "indent": 63486, + "lungs-fill": 63487, + "lungs": 63488, + "microsoft-teams": 63489, + "p-circle-fill": 63492, + "p-circle": 63493, + "p-square-fill": 63494, + "p-square": 63495, + "pass-fill": 63496, + "pass": 63497, + "prescription": 63498, + "prescription2": 63499, + "r-circle-fill": 63502, + "r-circle": 63503, + "r-square-fill": 63504, + "r-square": 63505, + "repeat-1": 63506, + "repeat": 63507, + "rewind-btn-fill": 63508, + "rewind-btn": 63509, + "rewind-circle-fill": 63510, + "rewind-circle": 63511, + "rewind-fill": 63512, + "rewind": 63513, + "train-freight-front-fill": 63514, + "train-freight-front": 63515, + "train-front-fill": 63516, + "train-front": 63517, + "train-lightrail-front-fill": 63518, + "train-lightrail-front": 63519, + "truck-front-fill": 63520, + "truck-front": 63521, + "ubuntu": 63522, + "unindent": 63523, + "unity": 63524, + "universal-access-circle": 63525, + "universal-access": 63526, + "virus": 63527, + "virus2": 63528, + "wechat": 63529, + "yelp": 63530, + "sign-stop-fill": 63531, + "sign-stop-lights-fill": 63532, + "sign-stop-lights": 63533, + "sign-stop": 63534, + "sign-turn-left-fill": 63535, + "sign-turn-left": 63536, + "sign-turn-right-fill": 63537, + "sign-turn-right": 63538, + "sign-turn-slight-left-fill": 63539, + "sign-turn-slight-left": 63540, + "sign-turn-slight-right-fill": 63541, + "sign-turn-slight-right": 63542, + "sign-yield-fill": 63543, + "sign-yield": 63544, + "ev-station-fill": 63545, + "ev-station": 63546, + "fuel-pump-diesel-fill": 63547, + "fuel-pump-diesel": 63548, + "fuel-pump-fill": 63549, + "fuel-pump": 63550, + "0-circle-fill": 63551, + "0-circle": 63552, + "0-square-fill": 63553, + "0-square": 63554, + "rocket-fill": 63555, + "rocket-takeoff-fill": 63556, + "rocket-takeoff": 63557, + "rocket": 63558, + "stripe": 63559, + "subscript": 63560, + "superscript": 63561, + "trello": 63562, + "envelope-at-fill": 63563, + "envelope-at": 63564, + "regex": 63565, + "text-wrap": 63566, + "sign-dead-end-fill": 63567, + "sign-dead-end": 63568, + "sign-do-not-enter-fill": 63569, + "sign-do-not-enter": 63570, + "sign-intersection-fill": 63571, + "sign-intersection-side-fill": 63572, + "sign-intersection-side": 63573, + "sign-intersection-t-fill": 63574, + "sign-intersection-t": 63575, + "sign-intersection-y-fill": 63576, + "sign-intersection-y": 63577, + "sign-intersection": 63578, + "sign-merge-left-fill": 63579, + "sign-merge-left": 63580, + "sign-merge-right-fill": 63581, + "sign-merge-right": 63582, + "sign-no-left-turn-fill": 63583, + "sign-no-left-turn": 63584, + "sign-no-parking-fill": 63585, + "sign-no-parking": 63586, + "sign-no-right-turn-fill": 63587, + "sign-no-right-turn": 63588, + "sign-railroad-fill": 63589, + "sign-railroad": 63590, + "building-add": 63591, + "building-check": 63592, + "building-dash": 63593, + "building-down": 63594, + "building-exclamation": 63595, + "building-fill-add": 63596, + "building-fill-check": 63597, + "building-fill-dash": 63598, + "building-fill-down": 63599, + "building-fill-exclamation": 63600, + "building-fill-gear": 63601, + "building-fill-lock": 63602, + "building-fill-slash": 63603, + "building-fill-up": 63604, + "building-fill-x": 63605, + "building-fill": 63606, + "building-gear": 63607, + "building-lock": 63608, + "building-slash": 63609, + "building-up": 63610, + "building-x": 63611, + "buildings-fill": 63612, + "buildings": 63613, + "bus-front-fill": 63614, + "bus-front": 63615, + "ev-front-fill": 63616, + "ev-front": 63617, + "globe-americas": 63618, + "globe-asia-australia": 63619, + "globe-central-south-asia": 63620, + "globe-europe-africa": 63621, + "house-add-fill": 63622, + "house-add": 63623, + "house-check-fill": 63624, + "house-check": 63625, + "house-dash-fill": 63626, + "house-dash": 63627, + "house-down-fill": 63628, + "house-down": 63629, + "house-exclamation-fill": 63630, + "house-exclamation": 63631, + "house-gear-fill": 63632, + "house-gear": 63633, + "house-lock-fill": 63634, + "house-lock": 63635, + "house-slash-fill": 63636, + "house-slash": 63637, + "house-up-fill": 63638, + "house-up": 63639, + "house-x-fill": 63640, + "house-x": 63641, + "person-add": 63642, + "person-down": 63643, + "person-exclamation": 63644, + "person-fill-add": 63645, + "person-fill-check": 63646, + "person-fill-dash": 63647, + "person-fill-down": 63648, + "person-fill-exclamation": 63649, + "person-fill-gear": 63650, + "person-fill-lock": 63651, + "person-fill-slash": 63652, + "person-fill-up": 63653, + "person-fill-x": 63654, + "person-gear": 63655, + "person-lock": 63656, + "person-slash": 63657, + "person-up": 63658, + "scooter": 63659, + "taxi-front-fill": 63660, + "taxi-front": 63661, + "amd": 63662, + "database-add": 63663, + "database-check": 63664, + "database-dash": 63665, + "database-down": 63666, + "database-exclamation": 63667, + "database-fill-add": 63668, + "database-fill-check": 63669, + "database-fill-dash": 63670, + "database-fill-down": 63671, + "database-fill-exclamation": 63672, + "database-fill-gear": 63673, + "database-fill-lock": 63674, + "database-fill-slash": 63675, + "database-fill-up": 63676, + "database-fill-x": 63677, + "database-fill": 63678, + "database-gear": 63679, + "database-lock": 63680, + "database-slash": 63681, + "database-up": 63682, + "database-x": 63683, + "database": 63684, + "houses-fill": 63685, + "houses": 63686, + "nvidia": 63687, + "person-vcard-fill": 63688, + "person-vcard": 63689, + "sina-weibo": 63690, + "tencent-qq": 63691, + "wikipedia": 63692, + "alphabet-uppercase": 62117, + "alphabet": 63114, + "amazon": 63117, + "arrows-collapse-vertical": 63120, + "arrows-expand-vertical": 63125, + "arrows-vertical": 63128, + "arrows": 63138, + "ban-fill": 63139, + "ban": 63158, + "bing": 63170, + "cake": 63200, + "cake2": 63213, + "cookie": 63214, + "copy": 63321, + "crosshair": 63337, + "crosshair2": 63380, + "emoji-astonished-fill": 63381, + "emoji-astonished": 63386, + "emoji-grimace-fill": 63387, + "emoji-grimace": 63392, + "emoji-grin-fill": 63393, + "emoji-grin": 63398, + "emoji-surprise-fill": 63399, + "emoji-surprise": 63404, + "emoji-tear-fill": 63405, + "emoji-tear": 63410, + "envelope-arrow-down-fill": 63411, + "envelope-arrow-down": 63416, + "envelope-arrow-up-fill": 63417, + "envelope-arrow-up": 63422, + "feather": 63423, + "feather2": 63428, + "floppy-fill": 63429, + "floppy": 63448, + "floppy2-fill": 63449, + "floppy2": 63460, + "gitlab": 63461, + "highlighter": 63480, + "marker-tip": 63490, + "nvme-fill": 63491, + "nvme": 63500, + "opencollective": 63501, + "pci-card-network": 63693, + "pci-card-sound": 63694, + "radar": 63695, + "send-arrow-down-fill": 63696, + "send-arrow-down": 63697, + "send-arrow-up-fill": 63698, + "send-arrow-up": 63699, + "sim-slash-fill": 63700, + "sim-slash": 63701, + "sourceforge": 63702, + "substack": 63703, + "threads-fill": 63704, + "threads": 63705, + "transparency": 63706, + "twitter-x": 63707, + "type-h4": 63708, + "type-h5": 63709, + "type-h6": 63710, + "backpack-fill": 63711, + "backpack": 63712, + "backpack2-fill": 63713, + "backpack2": 63714, + "backpack3-fill": 63715, + "backpack3": 63716, + "backpack4-fill": 63717, + "backpack4": 63718, + "brilliance": 63719, + "cake-fill": 63720, + "cake2-fill": 63721, + "duffle-fill": 63722, + "duffle": 63723, + "exposure": 63724, + "gender-neuter": 63725, + "highlights": 63726, + "luggage-fill": 63727, + "luggage": 63728, + "mailbox-flag": 63729, + "mailbox2-flag": 63730, + "noise-reduction": 63731, + "passport-fill": 63732, + "passport": 63733, + "person-arms-up": 63734, + "person-raised-hand": 63735, + "person-standing-dress": 63736, + "person-standing": 63737, + "person-walking": 63738, + "person-wheelchair": 63739, + "shadows": 63740, + "suitcase-fill": 63741, + "suitcase-lg-fill": 63742, + "suitcase-lg": 63743, + "suitcase": 63744, + "suitcase2-fill": 63745, + "suitcase2": 63746, + "vignette": 63747 +} \ No newline at end of file diff --git a/assets/static/bootstrap-icons/font/bootstrap-icons.min.css b/assets/static/bootstrap-icons/font/bootstrap-icons.min.css new file mode 100644 index 0000000..dadd6dc --- /dev/null +++ b/assets/static/bootstrap-icons/font/bootstrap-icons.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap Icons v1.11.3 (https://icons.getbootstrap.com/) + * Copyright 2019-2024 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/icons/blob/main/LICENSE) + */@font-face{font-display:block;font-family:bootstrap-icons;src:url("fonts/bootstrap-icons.woff2?dd67030699838ea613ee6dbda90effa6") format("woff2"),url("fonts/bootstrap-icons.woff?dd67030699838ea613ee6dbda90effa6") format("woff")}.bi::before,[class*=" bi-"]::before,[class^=bi-]::before{display:inline-block;font-family:bootstrap-icons!important;font-style:normal;font-weight:400!important;font-variant:normal;text-transform:none;line-height:1;vertical-align:-.125em;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.bi-123::before{content:"\f67f"}.bi-alarm-fill::before{content:"\f101"}.bi-alarm::before{content:"\f102"}.bi-align-bottom::before{content:"\f103"}.bi-align-center::before{content:"\f104"}.bi-align-end::before{content:"\f105"}.bi-align-middle::before{content:"\f106"}.bi-align-start::before{content:"\f107"}.bi-align-top::before{content:"\f108"}.bi-alt::before{content:"\f109"}.bi-app-indicator::before{content:"\f10a"}.bi-app::before{content:"\f10b"}.bi-archive-fill::before{content:"\f10c"}.bi-archive::before{content:"\f10d"}.bi-arrow-90deg-down::before{content:"\f10e"}.bi-arrow-90deg-left::before{content:"\f10f"}.bi-arrow-90deg-right::before{content:"\f110"}.bi-arrow-90deg-up::before{content:"\f111"}.bi-arrow-bar-down::before{content:"\f112"}.bi-arrow-bar-left::before{content:"\f113"}.bi-arrow-bar-right::before{content:"\f114"}.bi-arrow-bar-up::before{content:"\f115"}.bi-arrow-clockwise::before{content:"\f116"}.bi-arrow-counterclockwise::before{content:"\f117"}.bi-arrow-down-circle-fill::before{content:"\f118"}.bi-arrow-down-circle::before{content:"\f119"}.bi-arrow-down-left-circle-fill::before{content:"\f11a"}.bi-arrow-down-left-circle::before{content:"\f11b"}.bi-arrow-down-left-square-fill::before{content:"\f11c"}.bi-arrow-down-left-square::before{content:"\f11d"}.bi-arrow-down-left::before{content:"\f11e"}.bi-arrow-down-right-circle-fill::before{content:"\f11f"}.bi-arrow-down-right-circle::before{content:"\f120"}.bi-arrow-down-right-square-fill::before{content:"\f121"}.bi-arrow-down-right-square::before{content:"\f122"}.bi-arrow-down-right::before{content:"\f123"}.bi-arrow-down-short::before{content:"\f124"}.bi-arrow-down-square-fill::before{content:"\f125"}.bi-arrow-down-square::before{content:"\f126"}.bi-arrow-down-up::before{content:"\f127"}.bi-arrow-down::before{content:"\f128"}.bi-arrow-left-circle-fill::before{content:"\f129"}.bi-arrow-left-circle::before{content:"\f12a"}.bi-arrow-left-right::before{content:"\f12b"}.bi-arrow-left-short::before{content:"\f12c"}.bi-arrow-left-square-fill::before{content:"\f12d"}.bi-arrow-left-square::before{content:"\f12e"}.bi-arrow-left::before{content:"\f12f"}.bi-arrow-repeat::before{content:"\f130"}.bi-arrow-return-left::before{content:"\f131"}.bi-arrow-return-right::before{content:"\f132"}.bi-arrow-right-circle-fill::before{content:"\f133"}.bi-arrow-right-circle::before{content:"\f134"}.bi-arrow-right-short::before{content:"\f135"}.bi-arrow-right-square-fill::before{content:"\f136"}.bi-arrow-right-square::before{content:"\f137"}.bi-arrow-right::before{content:"\f138"}.bi-arrow-up-circle-fill::before{content:"\f139"}.bi-arrow-up-circle::before{content:"\f13a"}.bi-arrow-up-left-circle-fill::before{content:"\f13b"}.bi-arrow-up-left-circle::before{content:"\f13c"}.bi-arrow-up-left-square-fill::before{content:"\f13d"}.bi-arrow-up-left-square::before{content:"\f13e"}.bi-arrow-up-left::before{content:"\f13f"}.bi-arrow-up-right-circle-fill::before{content:"\f140"}.bi-arrow-up-right-circle::before{content:"\f141"}.bi-arrow-up-right-square-fill::before{content:"\f142"}.bi-arrow-up-right-square::before{content:"\f143"}.bi-arrow-up-right::before{content:"\f144"}.bi-arrow-up-short::before{content:"\f145"}.bi-arrow-up-square-fill::before{content:"\f146"}.bi-arrow-up-square::before{content:"\f147"}.bi-arrow-up::before{content:"\f148"}.bi-arrows-angle-contract::before{content:"\f149"}.bi-arrows-angle-expand::before{content:"\f14a"}.bi-arrows-collapse::before{content:"\f14b"}.bi-arrows-expand::before{content:"\f14c"}.bi-arrows-fullscreen::before{content:"\f14d"}.bi-arrows-move::before{content:"\f14e"}.bi-aspect-ratio-fill::before{content:"\f14f"}.bi-aspect-ratio::before{content:"\f150"}.bi-asterisk::before{content:"\f151"}.bi-at::before{content:"\f152"}.bi-award-fill::before{content:"\f153"}.bi-award::before{content:"\f154"}.bi-back::before{content:"\f155"}.bi-backspace-fill::before{content:"\f156"}.bi-backspace-reverse-fill::before{content:"\f157"}.bi-backspace-reverse::before{content:"\f158"}.bi-backspace::before{content:"\f159"}.bi-badge-3d-fill::before{content:"\f15a"}.bi-badge-3d::before{content:"\f15b"}.bi-badge-4k-fill::before{content:"\f15c"}.bi-badge-4k::before{content:"\f15d"}.bi-badge-8k-fill::before{content:"\f15e"}.bi-badge-8k::before{content:"\f15f"}.bi-badge-ad-fill::before{content:"\f160"}.bi-badge-ad::before{content:"\f161"}.bi-badge-ar-fill::before{content:"\f162"}.bi-badge-ar::before{content:"\f163"}.bi-badge-cc-fill::before{content:"\f164"}.bi-badge-cc::before{content:"\f165"}.bi-badge-hd-fill::before{content:"\f166"}.bi-badge-hd::before{content:"\f167"}.bi-badge-tm-fill::before{content:"\f168"}.bi-badge-tm::before{content:"\f169"}.bi-badge-vo-fill::before{content:"\f16a"}.bi-badge-vo::before{content:"\f16b"}.bi-badge-vr-fill::before{content:"\f16c"}.bi-badge-vr::before{content:"\f16d"}.bi-badge-wc-fill::before{content:"\f16e"}.bi-badge-wc::before{content:"\f16f"}.bi-bag-check-fill::before{content:"\f170"}.bi-bag-check::before{content:"\f171"}.bi-bag-dash-fill::before{content:"\f172"}.bi-bag-dash::before{content:"\f173"}.bi-bag-fill::before{content:"\f174"}.bi-bag-plus-fill::before{content:"\f175"}.bi-bag-plus::before{content:"\f176"}.bi-bag-x-fill::before{content:"\f177"}.bi-bag-x::before{content:"\f178"}.bi-bag::before{content:"\f179"}.bi-bar-chart-fill::before{content:"\f17a"}.bi-bar-chart-line-fill::before{content:"\f17b"}.bi-bar-chart-line::before{content:"\f17c"}.bi-bar-chart-steps::before{content:"\f17d"}.bi-bar-chart::before{content:"\f17e"}.bi-basket-fill::before{content:"\f17f"}.bi-basket::before{content:"\f180"}.bi-basket2-fill::before{content:"\f181"}.bi-basket2::before{content:"\f182"}.bi-basket3-fill::before{content:"\f183"}.bi-basket3::before{content:"\f184"}.bi-battery-charging::before{content:"\f185"}.bi-battery-full::before{content:"\f186"}.bi-battery-half::before{content:"\f187"}.bi-battery::before{content:"\f188"}.bi-bell-fill::before{content:"\f189"}.bi-bell::before{content:"\f18a"}.bi-bezier::before{content:"\f18b"}.bi-bezier2::before{content:"\f18c"}.bi-bicycle::before{content:"\f18d"}.bi-binoculars-fill::before{content:"\f18e"}.bi-binoculars::before{content:"\f18f"}.bi-blockquote-left::before{content:"\f190"}.bi-blockquote-right::before{content:"\f191"}.bi-book-fill::before{content:"\f192"}.bi-book-half::before{content:"\f193"}.bi-book::before{content:"\f194"}.bi-bookmark-check-fill::before{content:"\f195"}.bi-bookmark-check::before{content:"\f196"}.bi-bookmark-dash-fill::before{content:"\f197"}.bi-bookmark-dash::before{content:"\f198"}.bi-bookmark-fill::before{content:"\f199"}.bi-bookmark-heart-fill::before{content:"\f19a"}.bi-bookmark-heart::before{content:"\f19b"}.bi-bookmark-plus-fill::before{content:"\f19c"}.bi-bookmark-plus::before{content:"\f19d"}.bi-bookmark-star-fill::before{content:"\f19e"}.bi-bookmark-star::before{content:"\f19f"}.bi-bookmark-x-fill::before{content:"\f1a0"}.bi-bookmark-x::before{content:"\f1a1"}.bi-bookmark::before{content:"\f1a2"}.bi-bookmarks-fill::before{content:"\f1a3"}.bi-bookmarks::before{content:"\f1a4"}.bi-bookshelf::before{content:"\f1a5"}.bi-bootstrap-fill::before{content:"\f1a6"}.bi-bootstrap-reboot::before{content:"\f1a7"}.bi-bootstrap::before{content:"\f1a8"}.bi-border-all::before{content:"\f1a9"}.bi-border-bottom::before{content:"\f1aa"}.bi-border-center::before{content:"\f1ab"}.bi-border-inner::before{content:"\f1ac"}.bi-border-left::before{content:"\f1ad"}.bi-border-middle::before{content:"\f1ae"}.bi-border-outer::before{content:"\f1af"}.bi-border-right::before{content:"\f1b0"}.bi-border-style::before{content:"\f1b1"}.bi-border-top::before{content:"\f1b2"}.bi-border-width::before{content:"\f1b3"}.bi-border::before{content:"\f1b4"}.bi-bounding-box-circles::before{content:"\f1b5"}.bi-bounding-box::before{content:"\f1b6"}.bi-box-arrow-down-left::before{content:"\f1b7"}.bi-box-arrow-down-right::before{content:"\f1b8"}.bi-box-arrow-down::before{content:"\f1b9"}.bi-box-arrow-in-down-left::before{content:"\f1ba"}.bi-box-arrow-in-down-right::before{content:"\f1bb"}.bi-box-arrow-in-down::before{content:"\f1bc"}.bi-box-arrow-in-left::before{content:"\f1bd"}.bi-box-arrow-in-right::before{content:"\f1be"}.bi-box-arrow-in-up-left::before{content:"\f1bf"}.bi-box-arrow-in-up-right::before{content:"\f1c0"}.bi-box-arrow-in-up::before{content:"\f1c1"}.bi-box-arrow-left::before{content:"\f1c2"}.bi-box-arrow-right::before{content:"\f1c3"}.bi-box-arrow-up-left::before{content:"\f1c4"}.bi-box-arrow-up-right::before{content:"\f1c5"}.bi-box-arrow-up::before{content:"\f1c6"}.bi-box-seam::before{content:"\f1c7"}.bi-box::before{content:"\f1c8"}.bi-braces::before{content:"\f1c9"}.bi-bricks::before{content:"\f1ca"}.bi-briefcase-fill::before{content:"\f1cb"}.bi-briefcase::before{content:"\f1cc"}.bi-brightness-alt-high-fill::before{content:"\f1cd"}.bi-brightness-alt-high::before{content:"\f1ce"}.bi-brightness-alt-low-fill::before{content:"\f1cf"}.bi-brightness-alt-low::before{content:"\f1d0"}.bi-brightness-high-fill::before{content:"\f1d1"}.bi-brightness-high::before{content:"\f1d2"}.bi-brightness-low-fill::before{content:"\f1d3"}.bi-brightness-low::before{content:"\f1d4"}.bi-broadcast-pin::before{content:"\f1d5"}.bi-broadcast::before{content:"\f1d6"}.bi-brush-fill::before{content:"\f1d7"}.bi-brush::before{content:"\f1d8"}.bi-bucket-fill::before{content:"\f1d9"}.bi-bucket::before{content:"\f1da"}.bi-bug-fill::before{content:"\f1db"}.bi-bug::before{content:"\f1dc"}.bi-building::before{content:"\f1dd"}.bi-bullseye::before{content:"\f1de"}.bi-calculator-fill::before{content:"\f1df"}.bi-calculator::before{content:"\f1e0"}.bi-calendar-check-fill::before{content:"\f1e1"}.bi-calendar-check::before{content:"\f1e2"}.bi-calendar-date-fill::before{content:"\f1e3"}.bi-calendar-date::before{content:"\f1e4"}.bi-calendar-day-fill::before{content:"\f1e5"}.bi-calendar-day::before{content:"\f1e6"}.bi-calendar-event-fill::before{content:"\f1e7"}.bi-calendar-event::before{content:"\f1e8"}.bi-calendar-fill::before{content:"\f1e9"}.bi-calendar-minus-fill::before{content:"\f1ea"}.bi-calendar-minus::before{content:"\f1eb"}.bi-calendar-month-fill::before{content:"\f1ec"}.bi-calendar-month::before{content:"\f1ed"}.bi-calendar-plus-fill::before{content:"\f1ee"}.bi-calendar-plus::before{content:"\f1ef"}.bi-calendar-range-fill::before{content:"\f1f0"}.bi-calendar-range::before{content:"\f1f1"}.bi-calendar-week-fill::before{content:"\f1f2"}.bi-calendar-week::before{content:"\f1f3"}.bi-calendar-x-fill::before{content:"\f1f4"}.bi-calendar-x::before{content:"\f1f5"}.bi-calendar::before{content:"\f1f6"}.bi-calendar2-check-fill::before{content:"\f1f7"}.bi-calendar2-check::before{content:"\f1f8"}.bi-calendar2-date-fill::before{content:"\f1f9"}.bi-calendar2-date::before{content:"\f1fa"}.bi-calendar2-day-fill::before{content:"\f1fb"}.bi-calendar2-day::before{content:"\f1fc"}.bi-calendar2-event-fill::before{content:"\f1fd"}.bi-calendar2-event::before{content:"\f1fe"}.bi-calendar2-fill::before{content:"\f1ff"}.bi-calendar2-minus-fill::before{content:"\f200"}.bi-calendar2-minus::before{content:"\f201"}.bi-calendar2-month-fill::before{content:"\f202"}.bi-calendar2-month::before{content:"\f203"}.bi-calendar2-plus-fill::before{content:"\f204"}.bi-calendar2-plus::before{content:"\f205"}.bi-calendar2-range-fill::before{content:"\f206"}.bi-calendar2-range::before{content:"\f207"}.bi-calendar2-week-fill::before{content:"\f208"}.bi-calendar2-week::before{content:"\f209"}.bi-calendar2-x-fill::before{content:"\f20a"}.bi-calendar2-x::before{content:"\f20b"}.bi-calendar2::before{content:"\f20c"}.bi-calendar3-event-fill::before{content:"\f20d"}.bi-calendar3-event::before{content:"\f20e"}.bi-calendar3-fill::before{content:"\f20f"}.bi-calendar3-range-fill::before{content:"\f210"}.bi-calendar3-range::before{content:"\f211"}.bi-calendar3-week-fill::before{content:"\f212"}.bi-calendar3-week::before{content:"\f213"}.bi-calendar3::before{content:"\f214"}.bi-calendar4-event::before{content:"\f215"}.bi-calendar4-range::before{content:"\f216"}.bi-calendar4-week::before{content:"\f217"}.bi-calendar4::before{content:"\f218"}.bi-camera-fill::before{content:"\f219"}.bi-camera-reels-fill::before{content:"\f21a"}.bi-camera-reels::before{content:"\f21b"}.bi-camera-video-fill::before{content:"\f21c"}.bi-camera-video-off-fill::before{content:"\f21d"}.bi-camera-video-off::before{content:"\f21e"}.bi-camera-video::before{content:"\f21f"}.bi-camera::before{content:"\f220"}.bi-camera2::before{content:"\f221"}.bi-capslock-fill::before{content:"\f222"}.bi-capslock::before{content:"\f223"}.bi-card-checklist::before{content:"\f224"}.bi-card-heading::before{content:"\f225"}.bi-card-image::before{content:"\f226"}.bi-card-list::before{content:"\f227"}.bi-card-text::before{content:"\f228"}.bi-caret-down-fill::before{content:"\f229"}.bi-caret-down-square-fill::before{content:"\f22a"}.bi-caret-down-square::before{content:"\f22b"}.bi-caret-down::before{content:"\f22c"}.bi-caret-left-fill::before{content:"\f22d"}.bi-caret-left-square-fill::before{content:"\f22e"}.bi-caret-left-square::before{content:"\f22f"}.bi-caret-left::before{content:"\f230"}.bi-caret-right-fill::before{content:"\f231"}.bi-caret-right-square-fill::before{content:"\f232"}.bi-caret-right-square::before{content:"\f233"}.bi-caret-right::before{content:"\f234"}.bi-caret-up-fill::before{content:"\f235"}.bi-caret-up-square-fill::before{content:"\f236"}.bi-caret-up-square::before{content:"\f237"}.bi-caret-up::before{content:"\f238"}.bi-cart-check-fill::before{content:"\f239"}.bi-cart-check::before{content:"\f23a"}.bi-cart-dash-fill::before{content:"\f23b"}.bi-cart-dash::before{content:"\f23c"}.bi-cart-fill::before{content:"\f23d"}.bi-cart-plus-fill::before{content:"\f23e"}.bi-cart-plus::before{content:"\f23f"}.bi-cart-x-fill::before{content:"\f240"}.bi-cart-x::before{content:"\f241"}.bi-cart::before{content:"\f242"}.bi-cart2::before{content:"\f243"}.bi-cart3::before{content:"\f244"}.bi-cart4::before{content:"\f245"}.bi-cash-stack::before{content:"\f246"}.bi-cash::before{content:"\f247"}.bi-cast::before{content:"\f248"}.bi-chat-dots-fill::before{content:"\f249"}.bi-chat-dots::before{content:"\f24a"}.bi-chat-fill::before{content:"\f24b"}.bi-chat-left-dots-fill::before{content:"\f24c"}.bi-chat-left-dots::before{content:"\f24d"}.bi-chat-left-fill::before{content:"\f24e"}.bi-chat-left-quote-fill::before{content:"\f24f"}.bi-chat-left-quote::before{content:"\f250"}.bi-chat-left-text-fill::before{content:"\f251"}.bi-chat-left-text::before{content:"\f252"}.bi-chat-left::before{content:"\f253"}.bi-chat-quote-fill::before{content:"\f254"}.bi-chat-quote::before{content:"\f255"}.bi-chat-right-dots-fill::before{content:"\f256"}.bi-chat-right-dots::before{content:"\f257"}.bi-chat-right-fill::before{content:"\f258"}.bi-chat-right-quote-fill::before{content:"\f259"}.bi-chat-right-quote::before{content:"\f25a"}.bi-chat-right-text-fill::before{content:"\f25b"}.bi-chat-right-text::before{content:"\f25c"}.bi-chat-right::before{content:"\f25d"}.bi-chat-square-dots-fill::before{content:"\f25e"}.bi-chat-square-dots::before{content:"\f25f"}.bi-chat-square-fill::before{content:"\f260"}.bi-chat-square-quote-fill::before{content:"\f261"}.bi-chat-square-quote::before{content:"\f262"}.bi-chat-square-text-fill::before{content:"\f263"}.bi-chat-square-text::before{content:"\f264"}.bi-chat-square::before{content:"\f265"}.bi-chat-text-fill::before{content:"\f266"}.bi-chat-text::before{content:"\f267"}.bi-chat::before{content:"\f268"}.bi-check-all::before{content:"\f269"}.bi-check-circle-fill::before{content:"\f26a"}.bi-check-circle::before{content:"\f26b"}.bi-check-square-fill::before{content:"\f26c"}.bi-check-square::before{content:"\f26d"}.bi-check::before{content:"\f26e"}.bi-check2-all::before{content:"\f26f"}.bi-check2-circle::before{content:"\f270"}.bi-check2-square::before{content:"\f271"}.bi-check2::before{content:"\f272"}.bi-chevron-bar-contract::before{content:"\f273"}.bi-chevron-bar-down::before{content:"\f274"}.bi-chevron-bar-expand::before{content:"\f275"}.bi-chevron-bar-left::before{content:"\f276"}.bi-chevron-bar-right::before{content:"\f277"}.bi-chevron-bar-up::before{content:"\f278"}.bi-chevron-compact-down::before{content:"\f279"}.bi-chevron-compact-left::before{content:"\f27a"}.bi-chevron-compact-right::before{content:"\f27b"}.bi-chevron-compact-up::before{content:"\f27c"}.bi-chevron-contract::before{content:"\f27d"}.bi-chevron-double-down::before{content:"\f27e"}.bi-chevron-double-left::before{content:"\f27f"}.bi-chevron-double-right::before{content:"\f280"}.bi-chevron-double-up::before{content:"\f281"}.bi-chevron-down::before{content:"\f282"}.bi-chevron-expand::before{content:"\f283"}.bi-chevron-left::before{content:"\f284"}.bi-chevron-right::before{content:"\f285"}.bi-chevron-up::before{content:"\f286"}.bi-circle-fill::before{content:"\f287"}.bi-circle-half::before{content:"\f288"}.bi-circle-square::before{content:"\f289"}.bi-circle::before{content:"\f28a"}.bi-clipboard-check::before{content:"\f28b"}.bi-clipboard-data::before{content:"\f28c"}.bi-clipboard-minus::before{content:"\f28d"}.bi-clipboard-plus::before{content:"\f28e"}.bi-clipboard-x::before{content:"\f28f"}.bi-clipboard::before{content:"\f290"}.bi-clock-fill::before{content:"\f291"}.bi-clock-history::before{content:"\f292"}.bi-clock::before{content:"\f293"}.bi-cloud-arrow-down-fill::before{content:"\f294"}.bi-cloud-arrow-down::before{content:"\f295"}.bi-cloud-arrow-up-fill::before{content:"\f296"}.bi-cloud-arrow-up::before{content:"\f297"}.bi-cloud-check-fill::before{content:"\f298"}.bi-cloud-check::before{content:"\f299"}.bi-cloud-download-fill::before{content:"\f29a"}.bi-cloud-download::before{content:"\f29b"}.bi-cloud-drizzle-fill::before{content:"\f29c"}.bi-cloud-drizzle::before{content:"\f29d"}.bi-cloud-fill::before{content:"\f29e"}.bi-cloud-fog-fill::before{content:"\f29f"}.bi-cloud-fog::before{content:"\f2a0"}.bi-cloud-fog2-fill::before{content:"\f2a1"}.bi-cloud-fog2::before{content:"\f2a2"}.bi-cloud-hail-fill::before{content:"\f2a3"}.bi-cloud-hail::before{content:"\f2a4"}.bi-cloud-haze-fill::before{content:"\f2a6"}.bi-cloud-haze::before{content:"\f2a7"}.bi-cloud-haze2-fill::before{content:"\f2a8"}.bi-cloud-lightning-fill::before{content:"\f2a9"}.bi-cloud-lightning-rain-fill::before{content:"\f2aa"}.bi-cloud-lightning-rain::before{content:"\f2ab"}.bi-cloud-lightning::before{content:"\f2ac"}.bi-cloud-minus-fill::before{content:"\f2ad"}.bi-cloud-minus::before{content:"\f2ae"}.bi-cloud-moon-fill::before{content:"\f2af"}.bi-cloud-moon::before{content:"\f2b0"}.bi-cloud-plus-fill::before{content:"\f2b1"}.bi-cloud-plus::before{content:"\f2b2"}.bi-cloud-rain-fill::before{content:"\f2b3"}.bi-cloud-rain-heavy-fill::before{content:"\f2b4"}.bi-cloud-rain-heavy::before{content:"\f2b5"}.bi-cloud-rain::before{content:"\f2b6"}.bi-cloud-slash-fill::before{content:"\f2b7"}.bi-cloud-slash::before{content:"\f2b8"}.bi-cloud-sleet-fill::before{content:"\f2b9"}.bi-cloud-sleet::before{content:"\f2ba"}.bi-cloud-snow-fill::before{content:"\f2bb"}.bi-cloud-snow::before{content:"\f2bc"}.bi-cloud-sun-fill::before{content:"\f2bd"}.bi-cloud-sun::before{content:"\f2be"}.bi-cloud-upload-fill::before{content:"\f2bf"}.bi-cloud-upload::before{content:"\f2c0"}.bi-cloud::before{content:"\f2c1"}.bi-clouds-fill::before{content:"\f2c2"}.bi-clouds::before{content:"\f2c3"}.bi-cloudy-fill::before{content:"\f2c4"}.bi-cloudy::before{content:"\f2c5"}.bi-code-slash::before{content:"\f2c6"}.bi-code-square::before{content:"\f2c7"}.bi-code::before{content:"\f2c8"}.bi-collection-fill::before{content:"\f2c9"}.bi-collection-play-fill::before{content:"\f2ca"}.bi-collection-play::before{content:"\f2cb"}.bi-collection::before{content:"\f2cc"}.bi-columns-gap::before{content:"\f2cd"}.bi-columns::before{content:"\f2ce"}.bi-command::before{content:"\f2cf"}.bi-compass-fill::before{content:"\f2d0"}.bi-compass::before{content:"\f2d1"}.bi-cone-striped::before{content:"\f2d2"}.bi-cone::before{content:"\f2d3"}.bi-controller::before{content:"\f2d4"}.bi-cpu-fill::before{content:"\f2d5"}.bi-cpu::before{content:"\f2d6"}.bi-credit-card-2-back-fill::before{content:"\f2d7"}.bi-credit-card-2-back::before{content:"\f2d8"}.bi-credit-card-2-front-fill::before{content:"\f2d9"}.bi-credit-card-2-front::before{content:"\f2da"}.bi-credit-card-fill::before{content:"\f2db"}.bi-credit-card::before{content:"\f2dc"}.bi-crop::before{content:"\f2dd"}.bi-cup-fill::before{content:"\f2de"}.bi-cup-straw::before{content:"\f2df"}.bi-cup::before{content:"\f2e0"}.bi-cursor-fill::before{content:"\f2e1"}.bi-cursor-text::before{content:"\f2e2"}.bi-cursor::before{content:"\f2e3"}.bi-dash-circle-dotted::before{content:"\f2e4"}.bi-dash-circle-fill::before{content:"\f2e5"}.bi-dash-circle::before{content:"\f2e6"}.bi-dash-square-dotted::before{content:"\f2e7"}.bi-dash-square-fill::before{content:"\f2e8"}.bi-dash-square::before{content:"\f2e9"}.bi-dash::before{content:"\f2ea"}.bi-diagram-2-fill::before{content:"\f2eb"}.bi-diagram-2::before{content:"\f2ec"}.bi-diagram-3-fill::before{content:"\f2ed"}.bi-diagram-3::before{content:"\f2ee"}.bi-diamond-fill::before{content:"\f2ef"}.bi-diamond-half::before{content:"\f2f0"}.bi-diamond::before{content:"\f2f1"}.bi-dice-1-fill::before{content:"\f2f2"}.bi-dice-1::before{content:"\f2f3"}.bi-dice-2-fill::before{content:"\f2f4"}.bi-dice-2::before{content:"\f2f5"}.bi-dice-3-fill::before{content:"\f2f6"}.bi-dice-3::before{content:"\f2f7"}.bi-dice-4-fill::before{content:"\f2f8"}.bi-dice-4::before{content:"\f2f9"}.bi-dice-5-fill::before{content:"\f2fa"}.bi-dice-5::before{content:"\f2fb"}.bi-dice-6-fill::before{content:"\f2fc"}.bi-dice-6::before{content:"\f2fd"}.bi-disc-fill::before{content:"\f2fe"}.bi-disc::before{content:"\f2ff"}.bi-discord::before{content:"\f300"}.bi-display-fill::before{content:"\f301"}.bi-display::before{content:"\f302"}.bi-distribute-horizontal::before{content:"\f303"}.bi-distribute-vertical::before{content:"\f304"}.bi-door-closed-fill::before{content:"\f305"}.bi-door-closed::before{content:"\f306"}.bi-door-open-fill::before{content:"\f307"}.bi-door-open::before{content:"\f308"}.bi-dot::before{content:"\f309"}.bi-download::before{content:"\f30a"}.bi-droplet-fill::before{content:"\f30b"}.bi-droplet-half::before{content:"\f30c"}.bi-droplet::before{content:"\f30d"}.bi-earbuds::before{content:"\f30e"}.bi-easel-fill::before{content:"\f30f"}.bi-easel::before{content:"\f310"}.bi-egg-fill::before{content:"\f311"}.bi-egg-fried::before{content:"\f312"}.bi-egg::before{content:"\f313"}.bi-eject-fill::before{content:"\f314"}.bi-eject::before{content:"\f315"}.bi-emoji-angry-fill::before{content:"\f316"}.bi-emoji-angry::before{content:"\f317"}.bi-emoji-dizzy-fill::before{content:"\f318"}.bi-emoji-dizzy::before{content:"\f319"}.bi-emoji-expressionless-fill::before{content:"\f31a"}.bi-emoji-expressionless::before{content:"\f31b"}.bi-emoji-frown-fill::before{content:"\f31c"}.bi-emoji-frown::before{content:"\f31d"}.bi-emoji-heart-eyes-fill::before{content:"\f31e"}.bi-emoji-heart-eyes::before{content:"\f31f"}.bi-emoji-laughing-fill::before{content:"\f320"}.bi-emoji-laughing::before{content:"\f321"}.bi-emoji-neutral-fill::before{content:"\f322"}.bi-emoji-neutral::before{content:"\f323"}.bi-emoji-smile-fill::before{content:"\f324"}.bi-emoji-smile-upside-down-fill::before{content:"\f325"}.bi-emoji-smile-upside-down::before{content:"\f326"}.bi-emoji-smile::before{content:"\f327"}.bi-emoji-sunglasses-fill::before{content:"\f328"}.bi-emoji-sunglasses::before{content:"\f329"}.bi-emoji-wink-fill::before{content:"\f32a"}.bi-emoji-wink::before{content:"\f32b"}.bi-envelope-fill::before{content:"\f32c"}.bi-envelope-open-fill::before{content:"\f32d"}.bi-envelope-open::before{content:"\f32e"}.bi-envelope::before{content:"\f32f"}.bi-eraser-fill::before{content:"\f330"}.bi-eraser::before{content:"\f331"}.bi-exclamation-circle-fill::before{content:"\f332"}.bi-exclamation-circle::before{content:"\f333"}.bi-exclamation-diamond-fill::before{content:"\f334"}.bi-exclamation-diamond::before{content:"\f335"}.bi-exclamation-octagon-fill::before{content:"\f336"}.bi-exclamation-octagon::before{content:"\f337"}.bi-exclamation-square-fill::before{content:"\f338"}.bi-exclamation-square::before{content:"\f339"}.bi-exclamation-triangle-fill::before{content:"\f33a"}.bi-exclamation-triangle::before{content:"\f33b"}.bi-exclamation::before{content:"\f33c"}.bi-exclude::before{content:"\f33d"}.bi-eye-fill::before{content:"\f33e"}.bi-eye-slash-fill::before{content:"\f33f"}.bi-eye-slash::before{content:"\f340"}.bi-eye::before{content:"\f341"}.bi-eyedropper::before{content:"\f342"}.bi-eyeglasses::before{content:"\f343"}.bi-facebook::before{content:"\f344"}.bi-file-arrow-down-fill::before{content:"\f345"}.bi-file-arrow-down::before{content:"\f346"}.bi-file-arrow-up-fill::before{content:"\f347"}.bi-file-arrow-up::before{content:"\f348"}.bi-file-bar-graph-fill::before{content:"\f349"}.bi-file-bar-graph::before{content:"\f34a"}.bi-file-binary-fill::before{content:"\f34b"}.bi-file-binary::before{content:"\f34c"}.bi-file-break-fill::before{content:"\f34d"}.bi-file-break::before{content:"\f34e"}.bi-file-check-fill::before{content:"\f34f"}.bi-file-check::before{content:"\f350"}.bi-file-code-fill::before{content:"\f351"}.bi-file-code::before{content:"\f352"}.bi-file-diff-fill::before{content:"\f353"}.bi-file-diff::before{content:"\f354"}.bi-file-earmark-arrow-down-fill::before{content:"\f355"}.bi-file-earmark-arrow-down::before{content:"\f356"}.bi-file-earmark-arrow-up-fill::before{content:"\f357"}.bi-file-earmark-arrow-up::before{content:"\f358"}.bi-file-earmark-bar-graph-fill::before{content:"\f359"}.bi-file-earmark-bar-graph::before{content:"\f35a"}.bi-file-earmark-binary-fill::before{content:"\f35b"}.bi-file-earmark-binary::before{content:"\f35c"}.bi-file-earmark-break-fill::before{content:"\f35d"}.bi-file-earmark-break::before{content:"\f35e"}.bi-file-earmark-check-fill::before{content:"\f35f"}.bi-file-earmark-check::before{content:"\f360"}.bi-file-earmark-code-fill::before{content:"\f361"}.bi-file-earmark-code::before{content:"\f362"}.bi-file-earmark-diff-fill::before{content:"\f363"}.bi-file-earmark-diff::before{content:"\f364"}.bi-file-earmark-easel-fill::before{content:"\f365"}.bi-file-earmark-easel::before{content:"\f366"}.bi-file-earmark-excel-fill::before{content:"\f367"}.bi-file-earmark-excel::before{content:"\f368"}.bi-file-earmark-fill::before{content:"\f369"}.bi-file-earmark-font-fill::before{content:"\f36a"}.bi-file-earmark-font::before{content:"\f36b"}.bi-file-earmark-image-fill::before{content:"\f36c"}.bi-file-earmark-image::before{content:"\f36d"}.bi-file-earmark-lock-fill::before{content:"\f36e"}.bi-file-earmark-lock::before{content:"\f36f"}.bi-file-earmark-lock2-fill::before{content:"\f370"}.bi-file-earmark-lock2::before{content:"\f371"}.bi-file-earmark-medical-fill::before{content:"\f372"}.bi-file-earmark-medical::before{content:"\f373"}.bi-file-earmark-minus-fill::before{content:"\f374"}.bi-file-earmark-minus::before{content:"\f375"}.bi-file-earmark-music-fill::before{content:"\f376"}.bi-file-earmark-music::before{content:"\f377"}.bi-file-earmark-person-fill::before{content:"\f378"}.bi-file-earmark-person::before{content:"\f379"}.bi-file-earmark-play-fill::before{content:"\f37a"}.bi-file-earmark-play::before{content:"\f37b"}.bi-file-earmark-plus-fill::before{content:"\f37c"}.bi-file-earmark-plus::before{content:"\f37d"}.bi-file-earmark-post-fill::before{content:"\f37e"}.bi-file-earmark-post::before{content:"\f37f"}.bi-file-earmark-ppt-fill::before{content:"\f380"}.bi-file-earmark-ppt::before{content:"\f381"}.bi-file-earmark-richtext-fill::before{content:"\f382"}.bi-file-earmark-richtext::before{content:"\f383"}.bi-file-earmark-ruled-fill::before{content:"\f384"}.bi-file-earmark-ruled::before{content:"\f385"}.bi-file-earmark-slides-fill::before{content:"\f386"}.bi-file-earmark-slides::before{content:"\f387"}.bi-file-earmark-spreadsheet-fill::before{content:"\f388"}.bi-file-earmark-spreadsheet::before{content:"\f389"}.bi-file-earmark-text-fill::before{content:"\f38a"}.bi-file-earmark-text::before{content:"\f38b"}.bi-file-earmark-word-fill::before{content:"\f38c"}.bi-file-earmark-word::before{content:"\f38d"}.bi-file-earmark-x-fill::before{content:"\f38e"}.bi-file-earmark-x::before{content:"\f38f"}.bi-file-earmark-zip-fill::before{content:"\f390"}.bi-file-earmark-zip::before{content:"\f391"}.bi-file-earmark::before{content:"\f392"}.bi-file-easel-fill::before{content:"\f393"}.bi-file-easel::before{content:"\f394"}.bi-file-excel-fill::before{content:"\f395"}.bi-file-excel::before{content:"\f396"}.bi-file-fill::before{content:"\f397"}.bi-file-font-fill::before{content:"\f398"}.bi-file-font::before{content:"\f399"}.bi-file-image-fill::before{content:"\f39a"}.bi-file-image::before{content:"\f39b"}.bi-file-lock-fill::before{content:"\f39c"}.bi-file-lock::before{content:"\f39d"}.bi-file-lock2-fill::before{content:"\f39e"}.bi-file-lock2::before{content:"\f39f"}.bi-file-medical-fill::before{content:"\f3a0"}.bi-file-medical::before{content:"\f3a1"}.bi-file-minus-fill::before{content:"\f3a2"}.bi-file-minus::before{content:"\f3a3"}.bi-file-music-fill::before{content:"\f3a4"}.bi-file-music::before{content:"\f3a5"}.bi-file-person-fill::before{content:"\f3a6"}.bi-file-person::before{content:"\f3a7"}.bi-file-play-fill::before{content:"\f3a8"}.bi-file-play::before{content:"\f3a9"}.bi-file-plus-fill::before{content:"\f3aa"}.bi-file-plus::before{content:"\f3ab"}.bi-file-post-fill::before{content:"\f3ac"}.bi-file-post::before{content:"\f3ad"}.bi-file-ppt-fill::before{content:"\f3ae"}.bi-file-ppt::before{content:"\f3af"}.bi-file-richtext-fill::before{content:"\f3b0"}.bi-file-richtext::before{content:"\f3b1"}.bi-file-ruled-fill::before{content:"\f3b2"}.bi-file-ruled::before{content:"\f3b3"}.bi-file-slides-fill::before{content:"\f3b4"}.bi-file-slides::before{content:"\f3b5"}.bi-file-spreadsheet-fill::before{content:"\f3b6"}.bi-file-spreadsheet::before{content:"\f3b7"}.bi-file-text-fill::before{content:"\f3b8"}.bi-file-text::before{content:"\f3b9"}.bi-file-word-fill::before{content:"\f3ba"}.bi-file-word::before{content:"\f3bb"}.bi-file-x-fill::before{content:"\f3bc"}.bi-file-x::before{content:"\f3bd"}.bi-file-zip-fill::before{content:"\f3be"}.bi-file-zip::before{content:"\f3bf"}.bi-file::before{content:"\f3c0"}.bi-files-alt::before{content:"\f3c1"}.bi-files::before{content:"\f3c2"}.bi-film::before{content:"\f3c3"}.bi-filter-circle-fill::before{content:"\f3c4"}.bi-filter-circle::before{content:"\f3c5"}.bi-filter-left::before{content:"\f3c6"}.bi-filter-right::before{content:"\f3c7"}.bi-filter-square-fill::before{content:"\f3c8"}.bi-filter-square::before{content:"\f3c9"}.bi-filter::before{content:"\f3ca"}.bi-flag-fill::before{content:"\f3cb"}.bi-flag::before{content:"\f3cc"}.bi-flower1::before{content:"\f3cd"}.bi-flower2::before{content:"\f3ce"}.bi-flower3::before{content:"\f3cf"}.bi-folder-check::before{content:"\f3d0"}.bi-folder-fill::before{content:"\f3d1"}.bi-folder-minus::before{content:"\f3d2"}.bi-folder-plus::before{content:"\f3d3"}.bi-folder-symlink-fill::before{content:"\f3d4"}.bi-folder-symlink::before{content:"\f3d5"}.bi-folder-x::before{content:"\f3d6"}.bi-folder::before{content:"\f3d7"}.bi-folder2-open::before{content:"\f3d8"}.bi-folder2::before{content:"\f3d9"}.bi-fonts::before{content:"\f3da"}.bi-forward-fill::before{content:"\f3db"}.bi-forward::before{content:"\f3dc"}.bi-front::before{content:"\f3dd"}.bi-fullscreen-exit::before{content:"\f3de"}.bi-fullscreen::before{content:"\f3df"}.bi-funnel-fill::before{content:"\f3e0"}.bi-funnel::before{content:"\f3e1"}.bi-gear-fill::before{content:"\f3e2"}.bi-gear-wide-connected::before{content:"\f3e3"}.bi-gear-wide::before{content:"\f3e4"}.bi-gear::before{content:"\f3e5"}.bi-gem::before{content:"\f3e6"}.bi-geo-alt-fill::before{content:"\f3e7"}.bi-geo-alt::before{content:"\f3e8"}.bi-geo-fill::before{content:"\f3e9"}.bi-geo::before{content:"\f3ea"}.bi-gift-fill::before{content:"\f3eb"}.bi-gift::before{content:"\f3ec"}.bi-github::before{content:"\f3ed"}.bi-globe::before{content:"\f3ee"}.bi-globe2::before{content:"\f3ef"}.bi-google::before{content:"\f3f0"}.bi-graph-down::before{content:"\f3f1"}.bi-graph-up::before{content:"\f3f2"}.bi-grid-1x2-fill::before{content:"\f3f3"}.bi-grid-1x2::before{content:"\f3f4"}.bi-grid-3x2-gap-fill::before{content:"\f3f5"}.bi-grid-3x2-gap::before{content:"\f3f6"}.bi-grid-3x2::before{content:"\f3f7"}.bi-grid-3x3-gap-fill::before{content:"\f3f8"}.bi-grid-3x3-gap::before{content:"\f3f9"}.bi-grid-3x3::before{content:"\f3fa"}.bi-grid-fill::before{content:"\f3fb"}.bi-grid::before{content:"\f3fc"}.bi-grip-horizontal::before{content:"\f3fd"}.bi-grip-vertical::before{content:"\f3fe"}.bi-hammer::before{content:"\f3ff"}.bi-hand-index-fill::before{content:"\f400"}.bi-hand-index-thumb-fill::before{content:"\f401"}.bi-hand-index-thumb::before{content:"\f402"}.bi-hand-index::before{content:"\f403"}.bi-hand-thumbs-down-fill::before{content:"\f404"}.bi-hand-thumbs-down::before{content:"\f405"}.bi-hand-thumbs-up-fill::before{content:"\f406"}.bi-hand-thumbs-up::before{content:"\f407"}.bi-handbag-fill::before{content:"\f408"}.bi-handbag::before{content:"\f409"}.bi-hash::before{content:"\f40a"}.bi-hdd-fill::before{content:"\f40b"}.bi-hdd-network-fill::before{content:"\f40c"}.bi-hdd-network::before{content:"\f40d"}.bi-hdd-rack-fill::before{content:"\f40e"}.bi-hdd-rack::before{content:"\f40f"}.bi-hdd-stack-fill::before{content:"\f410"}.bi-hdd-stack::before{content:"\f411"}.bi-hdd::before{content:"\f412"}.bi-headphones::before{content:"\f413"}.bi-headset::before{content:"\f414"}.bi-heart-fill::before{content:"\f415"}.bi-heart-half::before{content:"\f416"}.bi-heart::before{content:"\f417"}.bi-heptagon-fill::before{content:"\f418"}.bi-heptagon-half::before{content:"\f419"}.bi-heptagon::before{content:"\f41a"}.bi-hexagon-fill::before{content:"\f41b"}.bi-hexagon-half::before{content:"\f41c"}.bi-hexagon::before{content:"\f41d"}.bi-hourglass-bottom::before{content:"\f41e"}.bi-hourglass-split::before{content:"\f41f"}.bi-hourglass-top::before{content:"\f420"}.bi-hourglass::before{content:"\f421"}.bi-house-door-fill::before{content:"\f422"}.bi-house-door::before{content:"\f423"}.bi-house-fill::before{content:"\f424"}.bi-house::before{content:"\f425"}.bi-hr::before{content:"\f426"}.bi-hurricane::before{content:"\f427"}.bi-image-alt::before{content:"\f428"}.bi-image-fill::before{content:"\f429"}.bi-image::before{content:"\f42a"}.bi-images::before{content:"\f42b"}.bi-inbox-fill::before{content:"\f42c"}.bi-inbox::before{content:"\f42d"}.bi-inboxes-fill::before{content:"\f42e"}.bi-inboxes::before{content:"\f42f"}.bi-info-circle-fill::before{content:"\f430"}.bi-info-circle::before{content:"\f431"}.bi-info-square-fill::before{content:"\f432"}.bi-info-square::before{content:"\f433"}.bi-info::before{content:"\f434"}.bi-input-cursor-text::before{content:"\f435"}.bi-input-cursor::before{content:"\f436"}.bi-instagram::before{content:"\f437"}.bi-intersect::before{content:"\f438"}.bi-journal-album::before{content:"\f439"}.bi-journal-arrow-down::before{content:"\f43a"}.bi-journal-arrow-up::before{content:"\f43b"}.bi-journal-bookmark-fill::before{content:"\f43c"}.bi-journal-bookmark::before{content:"\f43d"}.bi-journal-check::before{content:"\f43e"}.bi-journal-code::before{content:"\f43f"}.bi-journal-medical::before{content:"\f440"}.bi-journal-minus::before{content:"\f441"}.bi-journal-plus::before{content:"\f442"}.bi-journal-richtext::before{content:"\f443"}.bi-journal-text::before{content:"\f444"}.bi-journal-x::before{content:"\f445"}.bi-journal::before{content:"\f446"}.bi-journals::before{content:"\f447"}.bi-joystick::before{content:"\f448"}.bi-justify-left::before{content:"\f449"}.bi-justify-right::before{content:"\f44a"}.bi-justify::before{content:"\f44b"}.bi-kanban-fill::before{content:"\f44c"}.bi-kanban::before{content:"\f44d"}.bi-key-fill::before{content:"\f44e"}.bi-key::before{content:"\f44f"}.bi-keyboard-fill::before{content:"\f450"}.bi-keyboard::before{content:"\f451"}.bi-ladder::before{content:"\f452"}.bi-lamp-fill::before{content:"\f453"}.bi-lamp::before{content:"\f454"}.bi-laptop-fill::before{content:"\f455"}.bi-laptop::before{content:"\f456"}.bi-layer-backward::before{content:"\f457"}.bi-layer-forward::before{content:"\f458"}.bi-layers-fill::before{content:"\f459"}.bi-layers-half::before{content:"\f45a"}.bi-layers::before{content:"\f45b"}.bi-layout-sidebar-inset-reverse::before{content:"\f45c"}.bi-layout-sidebar-inset::before{content:"\f45d"}.bi-layout-sidebar-reverse::before{content:"\f45e"}.bi-layout-sidebar::before{content:"\f45f"}.bi-layout-split::before{content:"\f460"}.bi-layout-text-sidebar-reverse::before{content:"\f461"}.bi-layout-text-sidebar::before{content:"\f462"}.bi-layout-text-window-reverse::before{content:"\f463"}.bi-layout-text-window::before{content:"\f464"}.bi-layout-three-columns::before{content:"\f465"}.bi-layout-wtf::before{content:"\f466"}.bi-life-preserver::before{content:"\f467"}.bi-lightbulb-fill::before{content:"\f468"}.bi-lightbulb-off-fill::before{content:"\f469"}.bi-lightbulb-off::before{content:"\f46a"}.bi-lightbulb::before{content:"\f46b"}.bi-lightning-charge-fill::before{content:"\f46c"}.bi-lightning-charge::before{content:"\f46d"}.bi-lightning-fill::before{content:"\f46e"}.bi-lightning::before{content:"\f46f"}.bi-link-45deg::before{content:"\f470"}.bi-link::before{content:"\f471"}.bi-linkedin::before{content:"\f472"}.bi-list-check::before{content:"\f473"}.bi-list-nested::before{content:"\f474"}.bi-list-ol::before{content:"\f475"}.bi-list-stars::before{content:"\f476"}.bi-list-task::before{content:"\f477"}.bi-list-ul::before{content:"\f478"}.bi-list::before{content:"\f479"}.bi-lock-fill::before{content:"\f47a"}.bi-lock::before{content:"\f47b"}.bi-mailbox::before{content:"\f47c"}.bi-mailbox2::before{content:"\f47d"}.bi-map-fill::before{content:"\f47e"}.bi-map::before{content:"\f47f"}.bi-markdown-fill::before{content:"\f480"}.bi-markdown::before{content:"\f481"}.bi-mask::before{content:"\f482"}.bi-megaphone-fill::before{content:"\f483"}.bi-megaphone::before{content:"\f484"}.bi-menu-app-fill::before{content:"\f485"}.bi-menu-app::before{content:"\f486"}.bi-menu-button-fill::before{content:"\f487"}.bi-menu-button-wide-fill::before{content:"\f488"}.bi-menu-button-wide::before{content:"\f489"}.bi-menu-button::before{content:"\f48a"}.bi-menu-down::before{content:"\f48b"}.bi-menu-up::before{content:"\f48c"}.bi-mic-fill::before{content:"\f48d"}.bi-mic-mute-fill::before{content:"\f48e"}.bi-mic-mute::before{content:"\f48f"}.bi-mic::before{content:"\f490"}.bi-minecart-loaded::before{content:"\f491"}.bi-minecart::before{content:"\f492"}.bi-moisture::before{content:"\f493"}.bi-moon-fill::before{content:"\f494"}.bi-moon-stars-fill::before{content:"\f495"}.bi-moon-stars::before{content:"\f496"}.bi-moon::before{content:"\f497"}.bi-mouse-fill::before{content:"\f498"}.bi-mouse::before{content:"\f499"}.bi-mouse2-fill::before{content:"\f49a"}.bi-mouse2::before{content:"\f49b"}.bi-mouse3-fill::before{content:"\f49c"}.bi-mouse3::before{content:"\f49d"}.bi-music-note-beamed::before{content:"\f49e"}.bi-music-note-list::before{content:"\f49f"}.bi-music-note::before{content:"\f4a0"}.bi-music-player-fill::before{content:"\f4a1"}.bi-music-player::before{content:"\f4a2"}.bi-newspaper::before{content:"\f4a3"}.bi-node-minus-fill::before{content:"\f4a4"}.bi-node-minus::before{content:"\f4a5"}.bi-node-plus-fill::before{content:"\f4a6"}.bi-node-plus::before{content:"\f4a7"}.bi-nut-fill::before{content:"\f4a8"}.bi-nut::before{content:"\f4a9"}.bi-octagon-fill::before{content:"\f4aa"}.bi-octagon-half::before{content:"\f4ab"}.bi-octagon::before{content:"\f4ac"}.bi-option::before{content:"\f4ad"}.bi-outlet::before{content:"\f4ae"}.bi-paint-bucket::before{content:"\f4af"}.bi-palette-fill::before{content:"\f4b0"}.bi-palette::before{content:"\f4b1"}.bi-palette2::before{content:"\f4b2"}.bi-paperclip::before{content:"\f4b3"}.bi-paragraph::before{content:"\f4b4"}.bi-patch-check-fill::before{content:"\f4b5"}.bi-patch-check::before{content:"\f4b6"}.bi-patch-exclamation-fill::before{content:"\f4b7"}.bi-patch-exclamation::before{content:"\f4b8"}.bi-patch-minus-fill::before{content:"\f4b9"}.bi-patch-minus::before{content:"\f4ba"}.bi-patch-plus-fill::before{content:"\f4bb"}.bi-patch-plus::before{content:"\f4bc"}.bi-patch-question-fill::before{content:"\f4bd"}.bi-patch-question::before{content:"\f4be"}.bi-pause-btn-fill::before{content:"\f4bf"}.bi-pause-btn::before{content:"\f4c0"}.bi-pause-circle-fill::before{content:"\f4c1"}.bi-pause-circle::before{content:"\f4c2"}.bi-pause-fill::before{content:"\f4c3"}.bi-pause::before{content:"\f4c4"}.bi-peace-fill::before{content:"\f4c5"}.bi-peace::before{content:"\f4c6"}.bi-pen-fill::before{content:"\f4c7"}.bi-pen::before{content:"\f4c8"}.bi-pencil-fill::before{content:"\f4c9"}.bi-pencil-square::before{content:"\f4ca"}.bi-pencil::before{content:"\f4cb"}.bi-pentagon-fill::before{content:"\f4cc"}.bi-pentagon-half::before{content:"\f4cd"}.bi-pentagon::before{content:"\f4ce"}.bi-people-fill::before{content:"\f4cf"}.bi-people::before{content:"\f4d0"}.bi-percent::before{content:"\f4d1"}.bi-person-badge-fill::before{content:"\f4d2"}.bi-person-badge::before{content:"\f4d3"}.bi-person-bounding-box::before{content:"\f4d4"}.bi-person-check-fill::before{content:"\f4d5"}.bi-person-check::before{content:"\f4d6"}.bi-person-circle::before{content:"\f4d7"}.bi-person-dash-fill::before{content:"\f4d8"}.bi-person-dash::before{content:"\f4d9"}.bi-person-fill::before{content:"\f4da"}.bi-person-lines-fill::before{content:"\f4db"}.bi-person-plus-fill::before{content:"\f4dc"}.bi-person-plus::before{content:"\f4dd"}.bi-person-square::before{content:"\f4de"}.bi-person-x-fill::before{content:"\f4df"}.bi-person-x::before{content:"\f4e0"}.bi-person::before{content:"\f4e1"}.bi-phone-fill::before{content:"\f4e2"}.bi-phone-landscape-fill::before{content:"\f4e3"}.bi-phone-landscape::before{content:"\f4e4"}.bi-phone-vibrate-fill::before{content:"\f4e5"}.bi-phone-vibrate::before{content:"\f4e6"}.bi-phone::before{content:"\f4e7"}.bi-pie-chart-fill::before{content:"\f4e8"}.bi-pie-chart::before{content:"\f4e9"}.bi-pin-angle-fill::before{content:"\f4ea"}.bi-pin-angle::before{content:"\f4eb"}.bi-pin-fill::before{content:"\f4ec"}.bi-pin::before{content:"\f4ed"}.bi-pip-fill::before{content:"\f4ee"}.bi-pip::before{content:"\f4ef"}.bi-play-btn-fill::before{content:"\f4f0"}.bi-play-btn::before{content:"\f4f1"}.bi-play-circle-fill::before{content:"\f4f2"}.bi-play-circle::before{content:"\f4f3"}.bi-play-fill::before{content:"\f4f4"}.bi-play::before{content:"\f4f5"}.bi-plug-fill::before{content:"\f4f6"}.bi-plug::before{content:"\f4f7"}.bi-plus-circle-dotted::before{content:"\f4f8"}.bi-plus-circle-fill::before{content:"\f4f9"}.bi-plus-circle::before{content:"\f4fa"}.bi-plus-square-dotted::before{content:"\f4fb"}.bi-plus-square-fill::before{content:"\f4fc"}.bi-plus-square::before{content:"\f4fd"}.bi-plus::before{content:"\f4fe"}.bi-power::before{content:"\f4ff"}.bi-printer-fill::before{content:"\f500"}.bi-printer::before{content:"\f501"}.bi-puzzle-fill::before{content:"\f502"}.bi-puzzle::before{content:"\f503"}.bi-question-circle-fill::before{content:"\f504"}.bi-question-circle::before{content:"\f505"}.bi-question-diamond-fill::before{content:"\f506"}.bi-question-diamond::before{content:"\f507"}.bi-question-octagon-fill::before{content:"\f508"}.bi-question-octagon::before{content:"\f509"}.bi-question-square-fill::before{content:"\f50a"}.bi-question-square::before{content:"\f50b"}.bi-question::before{content:"\f50c"}.bi-rainbow::before{content:"\f50d"}.bi-receipt-cutoff::before{content:"\f50e"}.bi-receipt::before{content:"\f50f"}.bi-reception-0::before{content:"\f510"}.bi-reception-1::before{content:"\f511"}.bi-reception-2::before{content:"\f512"}.bi-reception-3::before{content:"\f513"}.bi-reception-4::before{content:"\f514"}.bi-record-btn-fill::before{content:"\f515"}.bi-record-btn::before{content:"\f516"}.bi-record-circle-fill::before{content:"\f517"}.bi-record-circle::before{content:"\f518"}.bi-record-fill::before{content:"\f519"}.bi-record::before{content:"\f51a"}.bi-record2-fill::before{content:"\f51b"}.bi-record2::before{content:"\f51c"}.bi-reply-all-fill::before{content:"\f51d"}.bi-reply-all::before{content:"\f51e"}.bi-reply-fill::before{content:"\f51f"}.bi-reply::before{content:"\f520"}.bi-rss-fill::before{content:"\f521"}.bi-rss::before{content:"\f522"}.bi-rulers::before{content:"\f523"}.bi-save-fill::before{content:"\f524"}.bi-save::before{content:"\f525"}.bi-save2-fill::before{content:"\f526"}.bi-save2::before{content:"\f527"}.bi-scissors::before{content:"\f528"}.bi-screwdriver::before{content:"\f529"}.bi-search::before{content:"\f52a"}.bi-segmented-nav::before{content:"\f52b"}.bi-server::before{content:"\f52c"}.bi-share-fill::before{content:"\f52d"}.bi-share::before{content:"\f52e"}.bi-shield-check::before{content:"\f52f"}.bi-shield-exclamation::before{content:"\f530"}.bi-shield-fill-check::before{content:"\f531"}.bi-shield-fill-exclamation::before{content:"\f532"}.bi-shield-fill-minus::before{content:"\f533"}.bi-shield-fill-plus::before{content:"\f534"}.bi-shield-fill-x::before{content:"\f535"}.bi-shield-fill::before{content:"\f536"}.bi-shield-lock-fill::before{content:"\f537"}.bi-shield-lock::before{content:"\f538"}.bi-shield-minus::before{content:"\f539"}.bi-shield-plus::before{content:"\f53a"}.bi-shield-shaded::before{content:"\f53b"}.bi-shield-slash-fill::before{content:"\f53c"}.bi-shield-slash::before{content:"\f53d"}.bi-shield-x::before{content:"\f53e"}.bi-shield::before{content:"\f53f"}.bi-shift-fill::before{content:"\f540"}.bi-shift::before{content:"\f541"}.bi-shop-window::before{content:"\f542"}.bi-shop::before{content:"\f543"}.bi-shuffle::before{content:"\f544"}.bi-signpost-2-fill::before{content:"\f545"}.bi-signpost-2::before{content:"\f546"}.bi-signpost-fill::before{content:"\f547"}.bi-signpost-split-fill::before{content:"\f548"}.bi-signpost-split::before{content:"\f549"}.bi-signpost::before{content:"\f54a"}.bi-sim-fill::before{content:"\f54b"}.bi-sim::before{content:"\f54c"}.bi-skip-backward-btn-fill::before{content:"\f54d"}.bi-skip-backward-btn::before{content:"\f54e"}.bi-skip-backward-circle-fill::before{content:"\f54f"}.bi-skip-backward-circle::before{content:"\f550"}.bi-skip-backward-fill::before{content:"\f551"}.bi-skip-backward::before{content:"\f552"}.bi-skip-end-btn-fill::before{content:"\f553"}.bi-skip-end-btn::before{content:"\f554"}.bi-skip-end-circle-fill::before{content:"\f555"}.bi-skip-end-circle::before{content:"\f556"}.bi-skip-end-fill::before{content:"\f557"}.bi-skip-end::before{content:"\f558"}.bi-skip-forward-btn-fill::before{content:"\f559"}.bi-skip-forward-btn::before{content:"\f55a"}.bi-skip-forward-circle-fill::before{content:"\f55b"}.bi-skip-forward-circle::before{content:"\f55c"}.bi-skip-forward-fill::before{content:"\f55d"}.bi-skip-forward::before{content:"\f55e"}.bi-skip-start-btn-fill::before{content:"\f55f"}.bi-skip-start-btn::before{content:"\f560"}.bi-skip-start-circle-fill::before{content:"\f561"}.bi-skip-start-circle::before{content:"\f562"}.bi-skip-start-fill::before{content:"\f563"}.bi-skip-start::before{content:"\f564"}.bi-slack::before{content:"\f565"}.bi-slash-circle-fill::before{content:"\f566"}.bi-slash-circle::before{content:"\f567"}.bi-slash-square-fill::before{content:"\f568"}.bi-slash-square::before{content:"\f569"}.bi-slash::before{content:"\f56a"}.bi-sliders::before{content:"\f56b"}.bi-smartwatch::before{content:"\f56c"}.bi-snow::before{content:"\f56d"}.bi-snow2::before{content:"\f56e"}.bi-snow3::before{content:"\f56f"}.bi-sort-alpha-down-alt::before{content:"\f570"}.bi-sort-alpha-down::before{content:"\f571"}.bi-sort-alpha-up-alt::before{content:"\f572"}.bi-sort-alpha-up::before{content:"\f573"}.bi-sort-down-alt::before{content:"\f574"}.bi-sort-down::before{content:"\f575"}.bi-sort-numeric-down-alt::before{content:"\f576"}.bi-sort-numeric-down::before{content:"\f577"}.bi-sort-numeric-up-alt::before{content:"\f578"}.bi-sort-numeric-up::before{content:"\f579"}.bi-sort-up-alt::before{content:"\f57a"}.bi-sort-up::before{content:"\f57b"}.bi-soundwave::before{content:"\f57c"}.bi-speaker-fill::before{content:"\f57d"}.bi-speaker::before{content:"\f57e"}.bi-speedometer::before{content:"\f57f"}.bi-speedometer2::before{content:"\f580"}.bi-spellcheck::before{content:"\f581"}.bi-square-fill::before{content:"\f582"}.bi-square-half::before{content:"\f583"}.bi-square::before{content:"\f584"}.bi-stack::before{content:"\f585"}.bi-star-fill::before{content:"\f586"}.bi-star-half::before{content:"\f587"}.bi-star::before{content:"\f588"}.bi-stars::before{content:"\f589"}.bi-stickies-fill::before{content:"\f58a"}.bi-stickies::before{content:"\f58b"}.bi-sticky-fill::before{content:"\f58c"}.bi-sticky::before{content:"\f58d"}.bi-stop-btn-fill::before{content:"\f58e"}.bi-stop-btn::before{content:"\f58f"}.bi-stop-circle-fill::before{content:"\f590"}.bi-stop-circle::before{content:"\f591"}.bi-stop-fill::before{content:"\f592"}.bi-stop::before{content:"\f593"}.bi-stoplights-fill::before{content:"\f594"}.bi-stoplights::before{content:"\f595"}.bi-stopwatch-fill::before{content:"\f596"}.bi-stopwatch::before{content:"\f597"}.bi-subtract::before{content:"\f598"}.bi-suit-club-fill::before{content:"\f599"}.bi-suit-club::before{content:"\f59a"}.bi-suit-diamond-fill::before{content:"\f59b"}.bi-suit-diamond::before{content:"\f59c"}.bi-suit-heart-fill::before{content:"\f59d"}.bi-suit-heart::before{content:"\f59e"}.bi-suit-spade-fill::before{content:"\f59f"}.bi-suit-spade::before{content:"\f5a0"}.bi-sun-fill::before{content:"\f5a1"}.bi-sun::before{content:"\f5a2"}.bi-sunglasses::before{content:"\f5a3"}.bi-sunrise-fill::before{content:"\f5a4"}.bi-sunrise::before{content:"\f5a5"}.bi-sunset-fill::before{content:"\f5a6"}.bi-sunset::before{content:"\f5a7"}.bi-symmetry-horizontal::before{content:"\f5a8"}.bi-symmetry-vertical::before{content:"\f5a9"}.bi-table::before{content:"\f5aa"}.bi-tablet-fill::before{content:"\f5ab"}.bi-tablet-landscape-fill::before{content:"\f5ac"}.bi-tablet-landscape::before{content:"\f5ad"}.bi-tablet::before{content:"\f5ae"}.bi-tag-fill::before{content:"\f5af"}.bi-tag::before{content:"\f5b0"}.bi-tags-fill::before{content:"\f5b1"}.bi-tags::before{content:"\f5b2"}.bi-telegram::before{content:"\f5b3"}.bi-telephone-fill::before{content:"\f5b4"}.bi-telephone-forward-fill::before{content:"\f5b5"}.bi-telephone-forward::before{content:"\f5b6"}.bi-telephone-inbound-fill::before{content:"\f5b7"}.bi-telephone-inbound::before{content:"\f5b8"}.bi-telephone-minus-fill::before{content:"\f5b9"}.bi-telephone-minus::before{content:"\f5ba"}.bi-telephone-outbound-fill::before{content:"\f5bb"}.bi-telephone-outbound::before{content:"\f5bc"}.bi-telephone-plus-fill::before{content:"\f5bd"}.bi-telephone-plus::before{content:"\f5be"}.bi-telephone-x-fill::before{content:"\f5bf"}.bi-telephone-x::before{content:"\f5c0"}.bi-telephone::before{content:"\f5c1"}.bi-terminal-fill::before{content:"\f5c2"}.bi-terminal::before{content:"\f5c3"}.bi-text-center::before{content:"\f5c4"}.bi-text-indent-left::before{content:"\f5c5"}.bi-text-indent-right::before{content:"\f5c6"}.bi-text-left::before{content:"\f5c7"}.bi-text-paragraph::before{content:"\f5c8"}.bi-text-right::before{content:"\f5c9"}.bi-textarea-resize::before{content:"\f5ca"}.bi-textarea-t::before{content:"\f5cb"}.bi-textarea::before{content:"\f5cc"}.bi-thermometer-half::before{content:"\f5cd"}.bi-thermometer-high::before{content:"\f5ce"}.bi-thermometer-low::before{content:"\f5cf"}.bi-thermometer-snow::before{content:"\f5d0"}.bi-thermometer-sun::before{content:"\f5d1"}.bi-thermometer::before{content:"\f5d2"}.bi-three-dots-vertical::before{content:"\f5d3"}.bi-three-dots::before{content:"\f5d4"}.bi-toggle-off::before{content:"\f5d5"}.bi-toggle-on::before{content:"\f5d6"}.bi-toggle2-off::before{content:"\f5d7"}.bi-toggle2-on::before{content:"\f5d8"}.bi-toggles::before{content:"\f5d9"}.bi-toggles2::before{content:"\f5da"}.bi-tools::before{content:"\f5db"}.bi-tornado::before{content:"\f5dc"}.bi-trash-fill::before{content:"\f5dd"}.bi-trash::before{content:"\f5de"}.bi-trash2-fill::before{content:"\f5df"}.bi-trash2::before{content:"\f5e0"}.bi-tree-fill::before{content:"\f5e1"}.bi-tree::before{content:"\f5e2"}.bi-triangle-fill::before{content:"\f5e3"}.bi-triangle-half::before{content:"\f5e4"}.bi-triangle::before{content:"\f5e5"}.bi-trophy-fill::before{content:"\f5e6"}.bi-trophy::before{content:"\f5e7"}.bi-tropical-storm::before{content:"\f5e8"}.bi-truck-flatbed::before{content:"\f5e9"}.bi-truck::before{content:"\f5ea"}.bi-tsunami::before{content:"\f5eb"}.bi-tv-fill::before{content:"\f5ec"}.bi-tv::before{content:"\f5ed"}.bi-twitch::before{content:"\f5ee"}.bi-twitter::before{content:"\f5ef"}.bi-type-bold::before{content:"\f5f0"}.bi-type-h1::before{content:"\f5f1"}.bi-type-h2::before{content:"\f5f2"}.bi-type-h3::before{content:"\f5f3"}.bi-type-italic::before{content:"\f5f4"}.bi-type-strikethrough::before{content:"\f5f5"}.bi-type-underline::before{content:"\f5f6"}.bi-type::before{content:"\f5f7"}.bi-ui-checks-grid::before{content:"\f5f8"}.bi-ui-checks::before{content:"\f5f9"}.bi-ui-radios-grid::before{content:"\f5fa"}.bi-ui-radios::before{content:"\f5fb"}.bi-umbrella-fill::before{content:"\f5fc"}.bi-umbrella::before{content:"\f5fd"}.bi-union::before{content:"\f5fe"}.bi-unlock-fill::before{content:"\f5ff"}.bi-unlock::before{content:"\f600"}.bi-upc-scan::before{content:"\f601"}.bi-upc::before{content:"\f602"}.bi-upload::before{content:"\f603"}.bi-vector-pen::before{content:"\f604"}.bi-view-list::before{content:"\f605"}.bi-view-stacked::before{content:"\f606"}.bi-vinyl-fill::before{content:"\f607"}.bi-vinyl::before{content:"\f608"}.bi-voicemail::before{content:"\f609"}.bi-volume-down-fill::before{content:"\f60a"}.bi-volume-down::before{content:"\f60b"}.bi-volume-mute-fill::before{content:"\f60c"}.bi-volume-mute::before{content:"\f60d"}.bi-volume-off-fill::before{content:"\f60e"}.bi-volume-off::before{content:"\f60f"}.bi-volume-up-fill::before{content:"\f610"}.bi-volume-up::before{content:"\f611"}.bi-vr::before{content:"\f612"}.bi-wallet-fill::before{content:"\f613"}.bi-wallet::before{content:"\f614"}.bi-wallet2::before{content:"\f615"}.bi-watch::before{content:"\f616"}.bi-water::before{content:"\f617"}.bi-whatsapp::before{content:"\f618"}.bi-wifi-1::before{content:"\f619"}.bi-wifi-2::before{content:"\f61a"}.bi-wifi-off::before{content:"\f61b"}.bi-wifi::before{content:"\f61c"}.bi-wind::before{content:"\f61d"}.bi-window-dock::before{content:"\f61e"}.bi-window-sidebar::before{content:"\f61f"}.bi-window::before{content:"\f620"}.bi-wrench::before{content:"\f621"}.bi-x-circle-fill::before{content:"\f622"}.bi-x-circle::before{content:"\f623"}.bi-x-diamond-fill::before{content:"\f624"}.bi-x-diamond::before{content:"\f625"}.bi-x-octagon-fill::before{content:"\f626"}.bi-x-octagon::before{content:"\f627"}.bi-x-square-fill::before{content:"\f628"}.bi-x-square::before{content:"\f629"}.bi-x::before{content:"\f62a"}.bi-youtube::before{content:"\f62b"}.bi-zoom-in::before{content:"\f62c"}.bi-zoom-out::before{content:"\f62d"}.bi-bank::before{content:"\f62e"}.bi-bank2::before{content:"\f62f"}.bi-bell-slash-fill::before{content:"\f630"}.bi-bell-slash::before{content:"\f631"}.bi-cash-coin::before{content:"\f632"}.bi-check-lg::before{content:"\f633"}.bi-coin::before{content:"\f634"}.bi-currency-bitcoin::before{content:"\f635"}.bi-currency-dollar::before{content:"\f636"}.bi-currency-euro::before{content:"\f637"}.bi-currency-exchange::before{content:"\f638"}.bi-currency-pound::before{content:"\f639"}.bi-currency-yen::before{content:"\f63a"}.bi-dash-lg::before{content:"\f63b"}.bi-exclamation-lg::before{content:"\f63c"}.bi-file-earmark-pdf-fill::before{content:"\f63d"}.bi-file-earmark-pdf::before{content:"\f63e"}.bi-file-pdf-fill::before{content:"\f63f"}.bi-file-pdf::before{content:"\f640"}.bi-gender-ambiguous::before{content:"\f641"}.bi-gender-female::before{content:"\f642"}.bi-gender-male::before{content:"\f643"}.bi-gender-trans::before{content:"\f644"}.bi-headset-vr::before{content:"\f645"}.bi-info-lg::before{content:"\f646"}.bi-mastodon::before{content:"\f647"}.bi-messenger::before{content:"\f648"}.bi-piggy-bank-fill::before{content:"\f649"}.bi-piggy-bank::before{content:"\f64a"}.bi-pin-map-fill::before{content:"\f64b"}.bi-pin-map::before{content:"\f64c"}.bi-plus-lg::before{content:"\f64d"}.bi-question-lg::before{content:"\f64e"}.bi-recycle::before{content:"\f64f"}.bi-reddit::before{content:"\f650"}.bi-safe-fill::before{content:"\f651"}.bi-safe2-fill::before{content:"\f652"}.bi-safe2::before{content:"\f653"}.bi-sd-card-fill::before{content:"\f654"}.bi-sd-card::before{content:"\f655"}.bi-skype::before{content:"\f656"}.bi-slash-lg::before{content:"\f657"}.bi-translate::before{content:"\f658"}.bi-x-lg::before{content:"\f659"}.bi-safe::before{content:"\f65a"}.bi-apple::before{content:"\f65b"}.bi-microsoft::before{content:"\f65d"}.bi-windows::before{content:"\f65e"}.bi-behance::before{content:"\f65c"}.bi-dribbble::before{content:"\f65f"}.bi-line::before{content:"\f660"}.bi-medium::before{content:"\f661"}.bi-paypal::before{content:"\f662"}.bi-pinterest::before{content:"\f663"}.bi-signal::before{content:"\f664"}.bi-snapchat::before{content:"\f665"}.bi-spotify::before{content:"\f666"}.bi-stack-overflow::before{content:"\f667"}.bi-strava::before{content:"\f668"}.bi-wordpress::before{content:"\f669"}.bi-vimeo::before{content:"\f66a"}.bi-activity::before{content:"\f66b"}.bi-easel2-fill::before{content:"\f66c"}.bi-easel2::before{content:"\f66d"}.bi-easel3-fill::before{content:"\f66e"}.bi-easel3::before{content:"\f66f"}.bi-fan::before{content:"\f670"}.bi-fingerprint::before{content:"\f671"}.bi-graph-down-arrow::before{content:"\f672"}.bi-graph-up-arrow::before{content:"\f673"}.bi-hypnotize::before{content:"\f674"}.bi-magic::before{content:"\f675"}.bi-person-rolodex::before{content:"\f676"}.bi-person-video::before{content:"\f677"}.bi-person-video2::before{content:"\f678"}.bi-person-video3::before{content:"\f679"}.bi-person-workspace::before{content:"\f67a"}.bi-radioactive::before{content:"\f67b"}.bi-webcam-fill::before{content:"\f67c"}.bi-webcam::before{content:"\f67d"}.bi-yin-yang::before{content:"\f67e"}.bi-bandaid-fill::before{content:"\f680"}.bi-bandaid::before{content:"\f681"}.bi-bluetooth::before{content:"\f682"}.bi-body-text::before{content:"\f683"}.bi-boombox::before{content:"\f684"}.bi-boxes::before{content:"\f685"}.bi-dpad-fill::before{content:"\f686"}.bi-dpad::before{content:"\f687"}.bi-ear-fill::before{content:"\f688"}.bi-ear::before{content:"\f689"}.bi-envelope-check-fill::before{content:"\f68b"}.bi-envelope-check::before{content:"\f68c"}.bi-envelope-dash-fill::before{content:"\f68e"}.bi-envelope-dash::before{content:"\f68f"}.bi-envelope-exclamation-fill::before{content:"\f691"}.bi-envelope-exclamation::before{content:"\f692"}.bi-envelope-plus-fill::before{content:"\f693"}.bi-envelope-plus::before{content:"\f694"}.bi-envelope-slash-fill::before{content:"\f696"}.bi-envelope-slash::before{content:"\f697"}.bi-envelope-x-fill::before{content:"\f699"}.bi-envelope-x::before{content:"\f69a"}.bi-explicit-fill::before{content:"\f69b"}.bi-explicit::before{content:"\f69c"}.bi-git::before{content:"\f69d"}.bi-infinity::before{content:"\f69e"}.bi-list-columns-reverse::before{content:"\f69f"}.bi-list-columns::before{content:"\f6a0"}.bi-meta::before{content:"\f6a1"}.bi-nintendo-switch::before{content:"\f6a4"}.bi-pc-display-horizontal::before{content:"\f6a5"}.bi-pc-display::before{content:"\f6a6"}.bi-pc-horizontal::before{content:"\f6a7"}.bi-pc::before{content:"\f6a8"}.bi-playstation::before{content:"\f6a9"}.bi-plus-slash-minus::before{content:"\f6aa"}.bi-projector-fill::before{content:"\f6ab"}.bi-projector::before{content:"\f6ac"}.bi-qr-code-scan::before{content:"\f6ad"}.bi-qr-code::before{content:"\f6ae"}.bi-quora::before{content:"\f6af"}.bi-quote::before{content:"\f6b0"}.bi-robot::before{content:"\f6b1"}.bi-send-check-fill::before{content:"\f6b2"}.bi-send-check::before{content:"\f6b3"}.bi-send-dash-fill::before{content:"\f6b4"}.bi-send-dash::before{content:"\f6b5"}.bi-send-exclamation-fill::before{content:"\f6b7"}.bi-send-exclamation::before{content:"\f6b8"}.bi-send-fill::before{content:"\f6b9"}.bi-send-plus-fill::before{content:"\f6ba"}.bi-send-plus::before{content:"\f6bb"}.bi-send-slash-fill::before{content:"\f6bc"}.bi-send-slash::before{content:"\f6bd"}.bi-send-x-fill::before{content:"\f6be"}.bi-send-x::before{content:"\f6bf"}.bi-send::before{content:"\f6c0"}.bi-steam::before{content:"\f6c1"}.bi-terminal-dash::before{content:"\f6c3"}.bi-terminal-plus::before{content:"\f6c4"}.bi-terminal-split::before{content:"\f6c5"}.bi-ticket-detailed-fill::before{content:"\f6c6"}.bi-ticket-detailed::before{content:"\f6c7"}.bi-ticket-fill::before{content:"\f6c8"}.bi-ticket-perforated-fill::before{content:"\f6c9"}.bi-ticket-perforated::before{content:"\f6ca"}.bi-ticket::before{content:"\f6cb"}.bi-tiktok::before{content:"\f6cc"}.bi-window-dash::before{content:"\f6cd"}.bi-window-desktop::before{content:"\f6ce"}.bi-window-fullscreen::before{content:"\f6cf"}.bi-window-plus::before{content:"\f6d0"}.bi-window-split::before{content:"\f6d1"}.bi-window-stack::before{content:"\f6d2"}.bi-window-x::before{content:"\f6d3"}.bi-xbox::before{content:"\f6d4"}.bi-ethernet::before{content:"\f6d5"}.bi-hdmi-fill::before{content:"\f6d6"}.bi-hdmi::before{content:"\f6d7"}.bi-usb-c-fill::before{content:"\f6d8"}.bi-usb-c::before{content:"\f6d9"}.bi-usb-fill::before{content:"\f6da"}.bi-usb-plug-fill::before{content:"\f6db"}.bi-usb-plug::before{content:"\f6dc"}.bi-usb-symbol::before{content:"\f6dd"}.bi-usb::before{content:"\f6de"}.bi-boombox-fill::before{content:"\f6df"}.bi-displayport::before{content:"\f6e1"}.bi-gpu-card::before{content:"\f6e2"}.bi-memory::before{content:"\f6e3"}.bi-modem-fill::before{content:"\f6e4"}.bi-modem::before{content:"\f6e5"}.bi-motherboard-fill::before{content:"\f6e6"}.bi-motherboard::before{content:"\f6e7"}.bi-optical-audio-fill::before{content:"\f6e8"}.bi-optical-audio::before{content:"\f6e9"}.bi-pci-card::before{content:"\f6ea"}.bi-router-fill::before{content:"\f6eb"}.bi-router::before{content:"\f6ec"}.bi-thunderbolt-fill::before{content:"\f6ef"}.bi-thunderbolt::before{content:"\f6f0"}.bi-usb-drive-fill::before{content:"\f6f1"}.bi-usb-drive::before{content:"\f6f2"}.bi-usb-micro-fill::before{content:"\f6f3"}.bi-usb-micro::before{content:"\f6f4"}.bi-usb-mini-fill::before{content:"\f6f5"}.bi-usb-mini::before{content:"\f6f6"}.bi-cloud-haze2::before{content:"\f6f7"}.bi-device-hdd-fill::before{content:"\f6f8"}.bi-device-hdd::before{content:"\f6f9"}.bi-device-ssd-fill::before{content:"\f6fa"}.bi-device-ssd::before{content:"\f6fb"}.bi-displayport-fill::before{content:"\f6fc"}.bi-mortarboard-fill::before{content:"\f6fd"}.bi-mortarboard::before{content:"\f6fe"}.bi-terminal-x::before{content:"\f6ff"}.bi-arrow-through-heart-fill::before{content:"\f700"}.bi-arrow-through-heart::before{content:"\f701"}.bi-badge-sd-fill::before{content:"\f702"}.bi-badge-sd::before{content:"\f703"}.bi-bag-heart-fill::before{content:"\f704"}.bi-bag-heart::before{content:"\f705"}.bi-balloon-fill::before{content:"\f706"}.bi-balloon-heart-fill::before{content:"\f707"}.bi-balloon-heart::before{content:"\f708"}.bi-balloon::before{content:"\f709"}.bi-box2-fill::before{content:"\f70a"}.bi-box2-heart-fill::before{content:"\f70b"}.bi-box2-heart::before{content:"\f70c"}.bi-box2::before{content:"\f70d"}.bi-braces-asterisk::before{content:"\f70e"}.bi-calendar-heart-fill::before{content:"\f70f"}.bi-calendar-heart::before{content:"\f710"}.bi-calendar2-heart-fill::before{content:"\f711"}.bi-calendar2-heart::before{content:"\f712"}.bi-chat-heart-fill::before{content:"\f713"}.bi-chat-heart::before{content:"\f714"}.bi-chat-left-heart-fill::before{content:"\f715"}.bi-chat-left-heart::before{content:"\f716"}.bi-chat-right-heart-fill::before{content:"\f717"}.bi-chat-right-heart::before{content:"\f718"}.bi-chat-square-heart-fill::before{content:"\f719"}.bi-chat-square-heart::before{content:"\f71a"}.bi-clipboard-check-fill::before{content:"\f71b"}.bi-clipboard-data-fill::before{content:"\f71c"}.bi-clipboard-fill::before{content:"\f71d"}.bi-clipboard-heart-fill::before{content:"\f71e"}.bi-clipboard-heart::before{content:"\f71f"}.bi-clipboard-minus-fill::before{content:"\f720"}.bi-clipboard-plus-fill::before{content:"\f721"}.bi-clipboard-pulse::before{content:"\f722"}.bi-clipboard-x-fill::before{content:"\f723"}.bi-clipboard2-check-fill::before{content:"\f724"}.bi-clipboard2-check::before{content:"\f725"}.bi-clipboard2-data-fill::before{content:"\f726"}.bi-clipboard2-data::before{content:"\f727"}.bi-clipboard2-fill::before{content:"\f728"}.bi-clipboard2-heart-fill::before{content:"\f729"}.bi-clipboard2-heart::before{content:"\f72a"}.bi-clipboard2-minus-fill::before{content:"\f72b"}.bi-clipboard2-minus::before{content:"\f72c"}.bi-clipboard2-plus-fill::before{content:"\f72d"}.bi-clipboard2-plus::before{content:"\f72e"}.bi-clipboard2-pulse-fill::before{content:"\f72f"}.bi-clipboard2-pulse::before{content:"\f730"}.bi-clipboard2-x-fill::before{content:"\f731"}.bi-clipboard2-x::before{content:"\f732"}.bi-clipboard2::before{content:"\f733"}.bi-emoji-kiss-fill::before{content:"\f734"}.bi-emoji-kiss::before{content:"\f735"}.bi-envelope-heart-fill::before{content:"\f736"}.bi-envelope-heart::before{content:"\f737"}.bi-envelope-open-heart-fill::before{content:"\f738"}.bi-envelope-open-heart::before{content:"\f739"}.bi-envelope-paper-fill::before{content:"\f73a"}.bi-envelope-paper-heart-fill::before{content:"\f73b"}.bi-envelope-paper-heart::before{content:"\f73c"}.bi-envelope-paper::before{content:"\f73d"}.bi-filetype-aac::before{content:"\f73e"}.bi-filetype-ai::before{content:"\f73f"}.bi-filetype-bmp::before{content:"\f740"}.bi-filetype-cs::before{content:"\f741"}.bi-filetype-css::before{content:"\f742"}.bi-filetype-csv::before{content:"\f743"}.bi-filetype-doc::before{content:"\f744"}.bi-filetype-docx::before{content:"\f745"}.bi-filetype-exe::before{content:"\f746"}.bi-filetype-gif::before{content:"\f747"}.bi-filetype-heic::before{content:"\f748"}.bi-filetype-html::before{content:"\f749"}.bi-filetype-java::before{content:"\f74a"}.bi-filetype-jpg::before{content:"\f74b"}.bi-filetype-js::before{content:"\f74c"}.bi-filetype-jsx::before{content:"\f74d"}.bi-filetype-key::before{content:"\f74e"}.bi-filetype-m4p::before{content:"\f74f"}.bi-filetype-md::before{content:"\f750"}.bi-filetype-mdx::before{content:"\f751"}.bi-filetype-mov::before{content:"\f752"}.bi-filetype-mp3::before{content:"\f753"}.bi-filetype-mp4::before{content:"\f754"}.bi-filetype-otf::before{content:"\f755"}.bi-filetype-pdf::before{content:"\f756"}.bi-filetype-php::before{content:"\f757"}.bi-filetype-png::before{content:"\f758"}.bi-filetype-ppt::before{content:"\f75a"}.bi-filetype-psd::before{content:"\f75b"}.bi-filetype-py::before{content:"\f75c"}.bi-filetype-raw::before{content:"\f75d"}.bi-filetype-rb::before{content:"\f75e"}.bi-filetype-sass::before{content:"\f75f"}.bi-filetype-scss::before{content:"\f760"}.bi-filetype-sh::before{content:"\f761"}.bi-filetype-svg::before{content:"\f762"}.bi-filetype-tiff::before{content:"\f763"}.bi-filetype-tsx::before{content:"\f764"}.bi-filetype-ttf::before{content:"\f765"}.bi-filetype-txt::before{content:"\f766"}.bi-filetype-wav::before{content:"\f767"}.bi-filetype-woff::before{content:"\f768"}.bi-filetype-xls::before{content:"\f76a"}.bi-filetype-xml::before{content:"\f76b"}.bi-filetype-yml::before{content:"\f76c"}.bi-heart-arrow::before{content:"\f76d"}.bi-heart-pulse-fill::before{content:"\f76e"}.bi-heart-pulse::before{content:"\f76f"}.bi-heartbreak-fill::before{content:"\f770"}.bi-heartbreak::before{content:"\f771"}.bi-hearts::before{content:"\f772"}.bi-hospital-fill::before{content:"\f773"}.bi-hospital::before{content:"\f774"}.bi-house-heart-fill::before{content:"\f775"}.bi-house-heart::before{content:"\f776"}.bi-incognito::before{content:"\f777"}.bi-magnet-fill::before{content:"\f778"}.bi-magnet::before{content:"\f779"}.bi-person-heart::before{content:"\f77a"}.bi-person-hearts::before{content:"\f77b"}.bi-phone-flip::before{content:"\f77c"}.bi-plugin::before{content:"\f77d"}.bi-postage-fill::before{content:"\f77e"}.bi-postage-heart-fill::before{content:"\f77f"}.bi-postage-heart::before{content:"\f780"}.bi-postage::before{content:"\f781"}.bi-postcard-fill::before{content:"\f782"}.bi-postcard-heart-fill::before{content:"\f783"}.bi-postcard-heart::before{content:"\f784"}.bi-postcard::before{content:"\f785"}.bi-search-heart-fill::before{content:"\f786"}.bi-search-heart::before{content:"\f787"}.bi-sliders2-vertical::before{content:"\f788"}.bi-sliders2::before{content:"\f789"}.bi-trash3-fill::before{content:"\f78a"}.bi-trash3::before{content:"\f78b"}.bi-valentine::before{content:"\f78c"}.bi-valentine2::before{content:"\f78d"}.bi-wrench-adjustable-circle-fill::before{content:"\f78e"}.bi-wrench-adjustable-circle::before{content:"\f78f"}.bi-wrench-adjustable::before{content:"\f790"}.bi-filetype-json::before{content:"\f791"}.bi-filetype-pptx::before{content:"\f792"}.bi-filetype-xlsx::before{content:"\f793"}.bi-1-circle-fill::before{content:"\f796"}.bi-1-circle::before{content:"\f797"}.bi-1-square-fill::before{content:"\f798"}.bi-1-square::before{content:"\f799"}.bi-2-circle-fill::before{content:"\f79c"}.bi-2-circle::before{content:"\f79d"}.bi-2-square-fill::before{content:"\f79e"}.bi-2-square::before{content:"\f79f"}.bi-3-circle-fill::before{content:"\f7a2"}.bi-3-circle::before{content:"\f7a3"}.bi-3-square-fill::before{content:"\f7a4"}.bi-3-square::before{content:"\f7a5"}.bi-4-circle-fill::before{content:"\f7a8"}.bi-4-circle::before{content:"\f7a9"}.bi-4-square-fill::before{content:"\f7aa"}.bi-4-square::before{content:"\f7ab"}.bi-5-circle-fill::before{content:"\f7ae"}.bi-5-circle::before{content:"\f7af"}.bi-5-square-fill::before{content:"\f7b0"}.bi-5-square::before{content:"\f7b1"}.bi-6-circle-fill::before{content:"\f7b4"}.bi-6-circle::before{content:"\f7b5"}.bi-6-square-fill::before{content:"\f7b6"}.bi-6-square::before{content:"\f7b7"}.bi-7-circle-fill::before{content:"\f7ba"}.bi-7-circle::before{content:"\f7bb"}.bi-7-square-fill::before{content:"\f7bc"}.bi-7-square::before{content:"\f7bd"}.bi-8-circle-fill::before{content:"\f7c0"}.bi-8-circle::before{content:"\f7c1"}.bi-8-square-fill::before{content:"\f7c2"}.bi-8-square::before{content:"\f7c3"}.bi-9-circle-fill::before{content:"\f7c6"}.bi-9-circle::before{content:"\f7c7"}.bi-9-square-fill::before{content:"\f7c8"}.bi-9-square::before{content:"\f7c9"}.bi-airplane-engines-fill::before{content:"\f7ca"}.bi-airplane-engines::before{content:"\f7cb"}.bi-airplane-fill::before{content:"\f7cc"}.bi-airplane::before{content:"\f7cd"}.bi-alexa::before{content:"\f7ce"}.bi-alipay::before{content:"\f7cf"}.bi-android::before{content:"\f7d0"}.bi-android2::before{content:"\f7d1"}.bi-box-fill::before{content:"\f7d2"}.bi-box-seam-fill::before{content:"\f7d3"}.bi-browser-chrome::before{content:"\f7d4"}.bi-browser-edge::before{content:"\f7d5"}.bi-browser-firefox::before{content:"\f7d6"}.bi-browser-safari::before{content:"\f7d7"}.bi-c-circle-fill::before{content:"\f7da"}.bi-c-circle::before{content:"\f7db"}.bi-c-square-fill::before{content:"\f7dc"}.bi-c-square::before{content:"\f7dd"}.bi-capsule-pill::before{content:"\f7de"}.bi-capsule::before{content:"\f7df"}.bi-car-front-fill::before{content:"\f7e0"}.bi-car-front::before{content:"\f7e1"}.bi-cassette-fill::before{content:"\f7e2"}.bi-cassette::before{content:"\f7e3"}.bi-cc-circle-fill::before{content:"\f7e6"}.bi-cc-circle::before{content:"\f7e7"}.bi-cc-square-fill::before{content:"\f7e8"}.bi-cc-square::before{content:"\f7e9"}.bi-cup-hot-fill::before{content:"\f7ea"}.bi-cup-hot::before{content:"\f7eb"}.bi-currency-rupee::before{content:"\f7ec"}.bi-dropbox::before{content:"\f7ed"}.bi-escape::before{content:"\f7ee"}.bi-fast-forward-btn-fill::before{content:"\f7ef"}.bi-fast-forward-btn::before{content:"\f7f0"}.bi-fast-forward-circle-fill::before{content:"\f7f1"}.bi-fast-forward-circle::before{content:"\f7f2"}.bi-fast-forward-fill::before{content:"\f7f3"}.bi-fast-forward::before{content:"\f7f4"}.bi-filetype-sql::before{content:"\f7f5"}.bi-fire::before{content:"\f7f6"}.bi-google-play::before{content:"\f7f7"}.bi-h-circle-fill::before{content:"\f7fa"}.bi-h-circle::before{content:"\f7fb"}.bi-h-square-fill::before{content:"\f7fc"}.bi-h-square::before{content:"\f7fd"}.bi-indent::before{content:"\f7fe"}.bi-lungs-fill::before{content:"\f7ff"}.bi-lungs::before{content:"\f800"}.bi-microsoft-teams::before{content:"\f801"}.bi-p-circle-fill::before{content:"\f804"}.bi-p-circle::before{content:"\f805"}.bi-p-square-fill::before{content:"\f806"}.bi-p-square::before{content:"\f807"}.bi-pass-fill::before{content:"\f808"}.bi-pass::before{content:"\f809"}.bi-prescription::before{content:"\f80a"}.bi-prescription2::before{content:"\f80b"}.bi-r-circle-fill::before{content:"\f80e"}.bi-r-circle::before{content:"\f80f"}.bi-r-square-fill::before{content:"\f810"}.bi-r-square::before{content:"\f811"}.bi-repeat-1::before{content:"\f812"}.bi-repeat::before{content:"\f813"}.bi-rewind-btn-fill::before{content:"\f814"}.bi-rewind-btn::before{content:"\f815"}.bi-rewind-circle-fill::before{content:"\f816"}.bi-rewind-circle::before{content:"\f817"}.bi-rewind-fill::before{content:"\f818"}.bi-rewind::before{content:"\f819"}.bi-train-freight-front-fill::before{content:"\f81a"}.bi-train-freight-front::before{content:"\f81b"}.bi-train-front-fill::before{content:"\f81c"}.bi-train-front::before{content:"\f81d"}.bi-train-lightrail-front-fill::before{content:"\f81e"}.bi-train-lightrail-front::before{content:"\f81f"}.bi-truck-front-fill::before{content:"\f820"}.bi-truck-front::before{content:"\f821"}.bi-ubuntu::before{content:"\f822"}.bi-unindent::before{content:"\f823"}.bi-unity::before{content:"\f824"}.bi-universal-access-circle::before{content:"\f825"}.bi-universal-access::before{content:"\f826"}.bi-virus::before{content:"\f827"}.bi-virus2::before{content:"\f828"}.bi-wechat::before{content:"\f829"}.bi-yelp::before{content:"\f82a"}.bi-sign-stop-fill::before{content:"\f82b"}.bi-sign-stop-lights-fill::before{content:"\f82c"}.bi-sign-stop-lights::before{content:"\f82d"}.bi-sign-stop::before{content:"\f82e"}.bi-sign-turn-left-fill::before{content:"\f82f"}.bi-sign-turn-left::before{content:"\f830"}.bi-sign-turn-right-fill::before{content:"\f831"}.bi-sign-turn-right::before{content:"\f832"}.bi-sign-turn-slight-left-fill::before{content:"\f833"}.bi-sign-turn-slight-left::before{content:"\f834"}.bi-sign-turn-slight-right-fill::before{content:"\f835"}.bi-sign-turn-slight-right::before{content:"\f836"}.bi-sign-yield-fill::before{content:"\f837"}.bi-sign-yield::before{content:"\f838"}.bi-ev-station-fill::before{content:"\f839"}.bi-ev-station::before{content:"\f83a"}.bi-fuel-pump-diesel-fill::before{content:"\f83b"}.bi-fuel-pump-diesel::before{content:"\f83c"}.bi-fuel-pump-fill::before{content:"\f83d"}.bi-fuel-pump::before{content:"\f83e"}.bi-0-circle-fill::before{content:"\f83f"}.bi-0-circle::before{content:"\f840"}.bi-0-square-fill::before{content:"\f841"}.bi-0-square::before{content:"\f842"}.bi-rocket-fill::before{content:"\f843"}.bi-rocket-takeoff-fill::before{content:"\f844"}.bi-rocket-takeoff::before{content:"\f845"}.bi-rocket::before{content:"\f846"}.bi-stripe::before{content:"\f847"}.bi-subscript::before{content:"\f848"}.bi-superscript::before{content:"\f849"}.bi-trello::before{content:"\f84a"}.bi-envelope-at-fill::before{content:"\f84b"}.bi-envelope-at::before{content:"\f84c"}.bi-regex::before{content:"\f84d"}.bi-text-wrap::before{content:"\f84e"}.bi-sign-dead-end-fill::before{content:"\f84f"}.bi-sign-dead-end::before{content:"\f850"}.bi-sign-do-not-enter-fill::before{content:"\f851"}.bi-sign-do-not-enter::before{content:"\f852"}.bi-sign-intersection-fill::before{content:"\f853"}.bi-sign-intersection-side-fill::before{content:"\f854"}.bi-sign-intersection-side::before{content:"\f855"}.bi-sign-intersection-t-fill::before{content:"\f856"}.bi-sign-intersection-t::before{content:"\f857"}.bi-sign-intersection-y-fill::before{content:"\f858"}.bi-sign-intersection-y::before{content:"\f859"}.bi-sign-intersection::before{content:"\f85a"}.bi-sign-merge-left-fill::before{content:"\f85b"}.bi-sign-merge-left::before{content:"\f85c"}.bi-sign-merge-right-fill::before{content:"\f85d"}.bi-sign-merge-right::before{content:"\f85e"}.bi-sign-no-left-turn-fill::before{content:"\f85f"}.bi-sign-no-left-turn::before{content:"\f860"}.bi-sign-no-parking-fill::before{content:"\f861"}.bi-sign-no-parking::before{content:"\f862"}.bi-sign-no-right-turn-fill::before{content:"\f863"}.bi-sign-no-right-turn::before{content:"\f864"}.bi-sign-railroad-fill::before{content:"\f865"}.bi-sign-railroad::before{content:"\f866"}.bi-building-add::before{content:"\f867"}.bi-building-check::before{content:"\f868"}.bi-building-dash::before{content:"\f869"}.bi-building-down::before{content:"\f86a"}.bi-building-exclamation::before{content:"\f86b"}.bi-building-fill-add::before{content:"\f86c"}.bi-building-fill-check::before{content:"\f86d"}.bi-building-fill-dash::before{content:"\f86e"}.bi-building-fill-down::before{content:"\f86f"}.bi-building-fill-exclamation::before{content:"\f870"}.bi-building-fill-gear::before{content:"\f871"}.bi-building-fill-lock::before{content:"\f872"}.bi-building-fill-slash::before{content:"\f873"}.bi-building-fill-up::before{content:"\f874"}.bi-building-fill-x::before{content:"\f875"}.bi-building-fill::before{content:"\f876"}.bi-building-gear::before{content:"\f877"}.bi-building-lock::before{content:"\f878"}.bi-building-slash::before{content:"\f879"}.bi-building-up::before{content:"\f87a"}.bi-building-x::before{content:"\f87b"}.bi-buildings-fill::before{content:"\f87c"}.bi-buildings::before{content:"\f87d"}.bi-bus-front-fill::before{content:"\f87e"}.bi-bus-front::before{content:"\f87f"}.bi-ev-front-fill::before{content:"\f880"}.bi-ev-front::before{content:"\f881"}.bi-globe-americas::before{content:"\f882"}.bi-globe-asia-australia::before{content:"\f883"}.bi-globe-central-south-asia::before{content:"\f884"}.bi-globe-europe-africa::before{content:"\f885"}.bi-house-add-fill::before{content:"\f886"}.bi-house-add::before{content:"\f887"}.bi-house-check-fill::before{content:"\f888"}.bi-house-check::before{content:"\f889"}.bi-house-dash-fill::before{content:"\f88a"}.bi-house-dash::before{content:"\f88b"}.bi-house-down-fill::before{content:"\f88c"}.bi-house-down::before{content:"\f88d"}.bi-house-exclamation-fill::before{content:"\f88e"}.bi-house-exclamation::before{content:"\f88f"}.bi-house-gear-fill::before{content:"\f890"}.bi-house-gear::before{content:"\f891"}.bi-house-lock-fill::before{content:"\f892"}.bi-house-lock::before{content:"\f893"}.bi-house-slash-fill::before{content:"\f894"}.bi-house-slash::before{content:"\f895"}.bi-house-up-fill::before{content:"\f896"}.bi-house-up::before{content:"\f897"}.bi-house-x-fill::before{content:"\f898"}.bi-house-x::before{content:"\f899"}.bi-person-add::before{content:"\f89a"}.bi-person-down::before{content:"\f89b"}.bi-person-exclamation::before{content:"\f89c"}.bi-person-fill-add::before{content:"\f89d"}.bi-person-fill-check::before{content:"\f89e"}.bi-person-fill-dash::before{content:"\f89f"}.bi-person-fill-down::before{content:"\f8a0"}.bi-person-fill-exclamation::before{content:"\f8a1"}.bi-person-fill-gear::before{content:"\f8a2"}.bi-person-fill-lock::before{content:"\f8a3"}.bi-person-fill-slash::before{content:"\f8a4"}.bi-person-fill-up::before{content:"\f8a5"}.bi-person-fill-x::before{content:"\f8a6"}.bi-person-gear::before{content:"\f8a7"}.bi-person-lock::before{content:"\f8a8"}.bi-person-slash::before{content:"\f8a9"}.bi-person-up::before{content:"\f8aa"}.bi-scooter::before{content:"\f8ab"}.bi-taxi-front-fill::before{content:"\f8ac"}.bi-taxi-front::before{content:"\f8ad"}.bi-amd::before{content:"\f8ae"}.bi-database-add::before{content:"\f8af"}.bi-database-check::before{content:"\f8b0"}.bi-database-dash::before{content:"\f8b1"}.bi-database-down::before{content:"\f8b2"}.bi-database-exclamation::before{content:"\f8b3"}.bi-database-fill-add::before{content:"\f8b4"}.bi-database-fill-check::before{content:"\f8b5"}.bi-database-fill-dash::before{content:"\f8b6"}.bi-database-fill-down::before{content:"\f8b7"}.bi-database-fill-exclamation::before{content:"\f8b8"}.bi-database-fill-gear::before{content:"\f8b9"}.bi-database-fill-lock::before{content:"\f8ba"}.bi-database-fill-slash::before{content:"\f8bb"}.bi-database-fill-up::before{content:"\f8bc"}.bi-database-fill-x::before{content:"\f8bd"}.bi-database-fill::before{content:"\f8be"}.bi-database-gear::before{content:"\f8bf"}.bi-database-lock::before{content:"\f8c0"}.bi-database-slash::before{content:"\f8c1"}.bi-database-up::before{content:"\f8c2"}.bi-database-x::before{content:"\f8c3"}.bi-database::before{content:"\f8c4"}.bi-houses-fill::before{content:"\f8c5"}.bi-houses::before{content:"\f8c6"}.bi-nvidia::before{content:"\f8c7"}.bi-person-vcard-fill::before{content:"\f8c8"}.bi-person-vcard::before{content:"\f8c9"}.bi-sina-weibo::before{content:"\f8ca"}.bi-tencent-qq::before{content:"\f8cb"}.bi-wikipedia::before{content:"\f8cc"}.bi-alphabet-uppercase::before{content:"\f2a5"}.bi-alphabet::before{content:"\f68a"}.bi-amazon::before{content:"\f68d"}.bi-arrows-collapse-vertical::before{content:"\f690"}.bi-arrows-expand-vertical::before{content:"\f695"}.bi-arrows-vertical::before{content:"\f698"}.bi-arrows::before{content:"\f6a2"}.bi-ban-fill::before{content:"\f6a3"}.bi-ban::before{content:"\f6b6"}.bi-bing::before{content:"\f6c2"}.bi-cake::before{content:"\f6e0"}.bi-cake2::before{content:"\f6ed"}.bi-cookie::before{content:"\f6ee"}.bi-copy::before{content:"\f759"}.bi-crosshair::before{content:"\f769"}.bi-crosshair2::before{content:"\f794"}.bi-emoji-astonished-fill::before{content:"\f795"}.bi-emoji-astonished::before{content:"\f79a"}.bi-emoji-grimace-fill::before{content:"\f79b"}.bi-emoji-grimace::before{content:"\f7a0"}.bi-emoji-grin-fill::before{content:"\f7a1"}.bi-emoji-grin::before{content:"\f7a6"}.bi-emoji-surprise-fill::before{content:"\f7a7"}.bi-emoji-surprise::before{content:"\f7ac"}.bi-emoji-tear-fill::before{content:"\f7ad"}.bi-emoji-tear::before{content:"\f7b2"}.bi-envelope-arrow-down-fill::before{content:"\f7b3"}.bi-envelope-arrow-down::before{content:"\f7b8"}.bi-envelope-arrow-up-fill::before{content:"\f7b9"}.bi-envelope-arrow-up::before{content:"\f7be"}.bi-feather::before{content:"\f7bf"}.bi-feather2::before{content:"\f7c4"}.bi-floppy-fill::before{content:"\f7c5"}.bi-floppy::before{content:"\f7d8"}.bi-floppy2-fill::before{content:"\f7d9"}.bi-floppy2::before{content:"\f7e4"}.bi-gitlab::before{content:"\f7e5"}.bi-highlighter::before{content:"\f7f8"}.bi-marker-tip::before{content:"\f802"}.bi-nvme-fill::before{content:"\f803"}.bi-nvme::before{content:"\f80c"}.bi-opencollective::before{content:"\f80d"}.bi-pci-card-network::before{content:"\f8cd"}.bi-pci-card-sound::before{content:"\f8ce"}.bi-radar::before{content:"\f8cf"}.bi-send-arrow-down-fill::before{content:"\f8d0"}.bi-send-arrow-down::before{content:"\f8d1"}.bi-send-arrow-up-fill::before{content:"\f8d2"}.bi-send-arrow-up::before{content:"\f8d3"}.bi-sim-slash-fill::before{content:"\f8d4"}.bi-sim-slash::before{content:"\f8d5"}.bi-sourceforge::before{content:"\f8d6"}.bi-substack::before{content:"\f8d7"}.bi-threads-fill::before{content:"\f8d8"}.bi-threads::before{content:"\f8d9"}.bi-transparency::before{content:"\f8da"}.bi-twitter-x::before{content:"\f8db"}.bi-type-h4::before{content:"\f8dc"}.bi-type-h5::before{content:"\f8dd"}.bi-type-h6::before{content:"\f8de"}.bi-backpack-fill::before{content:"\f8df"}.bi-backpack::before{content:"\f8e0"}.bi-backpack2-fill::before{content:"\f8e1"}.bi-backpack2::before{content:"\f8e2"}.bi-backpack3-fill::before{content:"\f8e3"}.bi-backpack3::before{content:"\f8e4"}.bi-backpack4-fill::before{content:"\f8e5"}.bi-backpack4::before{content:"\f8e6"}.bi-brilliance::before{content:"\f8e7"}.bi-cake-fill::before{content:"\f8e8"}.bi-cake2-fill::before{content:"\f8e9"}.bi-duffle-fill::before{content:"\f8ea"}.bi-duffle::before{content:"\f8eb"}.bi-exposure::before{content:"\f8ec"}.bi-gender-neuter::before{content:"\f8ed"}.bi-highlights::before{content:"\f8ee"}.bi-luggage-fill::before{content:"\f8ef"}.bi-luggage::before{content:"\f8f0"}.bi-mailbox-flag::before{content:"\f8f1"}.bi-mailbox2-flag::before{content:"\f8f2"}.bi-noise-reduction::before{content:"\f8f3"}.bi-passport-fill::before{content:"\f8f4"}.bi-passport::before{content:"\f8f5"}.bi-person-arms-up::before{content:"\f8f6"}.bi-person-raised-hand::before{content:"\f8f7"}.bi-person-standing-dress::before{content:"\f8f8"}.bi-person-standing::before{content:"\f8f9"}.bi-person-walking::before{content:"\f8fa"}.bi-person-wheelchair::before{content:"\f8fb"}.bi-shadows::before{content:"\f8fc"}.bi-suitcase-fill::before{content:"\f8fd"}.bi-suitcase-lg-fill::before{content:"\f8fe"}.bi-suitcase-lg::before{content:"\f8ff"}.bi-suitcase::before{content:"\f900"}.bi-suitcase2-fill::before{content:"\f901"}.bi-suitcase2::before{content:"\f902"}.bi-vignette::before{content:"\f903"} \ No newline at end of file diff --git a/assets/static/bootstrap-icons/font/bootstrap-icons.scss b/assets/static/bootstrap-icons/font/bootstrap-icons.scss new file mode 100644 index 0000000..ea5c018 --- /dev/null +++ b/assets/static/bootstrap-icons/font/bootstrap-icons.scss @@ -0,0 +1,2090 @@ +/*! + * Bootstrap Icons v1.11.3 (https://icons.getbootstrap.com/) + * Copyright 2019-2024 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/icons/blob/main/LICENSE) + */ + +$bootstrap-icons-font: "bootstrap-icons" !default; +$bootstrap-icons-font-dir: "./fonts" !default; +$bootstrap-icons-font-file: "#{$bootstrap-icons-font-dir}/#{$bootstrap-icons-font}" !default; +$bootstrap-icons-font-hash: "24e3eb84d0bcaf83d77f904c78ac1f47" !default; +$bootstrap-icons-font-src: url("#{$bootstrap-icons-font-file}.woff2?#{$bootstrap-icons-font-hash}") format("woff2"), + url("#{$bootstrap-icons-font-file}.woff?#{$bootstrap-icons-font-hash}") format("woff") !default; + +@font-face { + font-display: block; + font-family: $bootstrap-icons-font; + src: $bootstrap-icons-font-src; +} + +.bi::before, +[class^="bi-"]::before, +[class*=" bi-"]::before { + display: inline-block; + font-family: $bootstrap-icons-font !important; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: -.125em; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +$bootstrap-icons-map: ( + "123": "\f67f", + "alarm-fill": "\f101", + "alarm": "\f102", + "align-bottom": "\f103", + "align-center": "\f104", + "align-end": "\f105", + "align-middle": "\f106", + "align-start": "\f107", + "align-top": "\f108", + "alt": "\f109", + "app-indicator": "\f10a", + "app": "\f10b", + "archive-fill": "\f10c", + "archive": "\f10d", + "arrow-90deg-down": "\f10e", + "arrow-90deg-left": "\f10f", + "arrow-90deg-right": "\f110", + "arrow-90deg-up": "\f111", + "arrow-bar-down": "\f112", + "arrow-bar-left": "\f113", + "arrow-bar-right": "\f114", + "arrow-bar-up": "\f115", + "arrow-clockwise": "\f116", + "arrow-counterclockwise": "\f117", + "arrow-down-circle-fill": "\f118", + "arrow-down-circle": "\f119", + "arrow-down-left-circle-fill": "\f11a", + "arrow-down-left-circle": "\f11b", + "arrow-down-left-square-fill": "\f11c", + "arrow-down-left-square": "\f11d", + "arrow-down-left": "\f11e", + "arrow-down-right-circle-fill": "\f11f", + "arrow-down-right-circle": "\f120", + "arrow-down-right-square-fill": "\f121", + "arrow-down-right-square": "\f122", + "arrow-down-right": "\f123", + "arrow-down-short": "\f124", + "arrow-down-square-fill": "\f125", + "arrow-down-square": "\f126", + "arrow-down-up": "\f127", + "arrow-down": "\f128", + "arrow-left-circle-fill": "\f129", + "arrow-left-circle": "\f12a", + "arrow-left-right": "\f12b", + "arrow-left-short": "\f12c", + "arrow-left-square-fill": "\f12d", + "arrow-left-square": "\f12e", + "arrow-left": "\f12f", + "arrow-repeat": "\f130", + "arrow-return-left": "\f131", + "arrow-return-right": "\f132", + "arrow-right-circle-fill": "\f133", + "arrow-right-circle": "\f134", + "arrow-right-short": "\f135", + "arrow-right-square-fill": "\f136", + "arrow-right-square": "\f137", + "arrow-right": "\f138", + "arrow-up-circle-fill": "\f139", + "arrow-up-circle": "\f13a", + "arrow-up-left-circle-fill": "\f13b", + "arrow-up-left-circle": "\f13c", + "arrow-up-left-square-fill": "\f13d", + "arrow-up-left-square": "\f13e", + "arrow-up-left": "\f13f", + "arrow-up-right-circle-fill": "\f140", + "arrow-up-right-circle": "\f141", + "arrow-up-right-square-fill": "\f142", + "arrow-up-right-square": "\f143", + "arrow-up-right": "\f144", + "arrow-up-short": "\f145", + "arrow-up-square-fill": "\f146", + "arrow-up-square": "\f147", + "arrow-up": "\f148", + "arrows-angle-contract": "\f149", + "arrows-angle-expand": "\f14a", + "arrows-collapse": "\f14b", + "arrows-expand": "\f14c", + "arrows-fullscreen": "\f14d", + "arrows-move": "\f14e", + "aspect-ratio-fill": "\f14f", + "aspect-ratio": "\f150", + "asterisk": "\f151", + "at": "\f152", + "award-fill": "\f153", + "award": "\f154", + "back": "\f155", + "backspace-fill": "\f156", + "backspace-reverse-fill": "\f157", + "backspace-reverse": "\f158", + "backspace": "\f159", + "badge-3d-fill": "\f15a", + "badge-3d": "\f15b", + "badge-4k-fill": "\f15c", + "badge-4k": "\f15d", + "badge-8k-fill": "\f15e", + "badge-8k": "\f15f", + "badge-ad-fill": "\f160", + "badge-ad": "\f161", + "badge-ar-fill": "\f162", + "badge-ar": "\f163", + "badge-cc-fill": "\f164", + "badge-cc": "\f165", + "badge-hd-fill": "\f166", + "badge-hd": "\f167", + "badge-tm-fill": "\f168", + "badge-tm": "\f169", + "badge-vo-fill": "\f16a", + "badge-vo": "\f16b", + "badge-vr-fill": "\f16c", + "badge-vr": "\f16d", + "badge-wc-fill": "\f16e", + "badge-wc": "\f16f", + "bag-check-fill": "\f170", + "bag-check": "\f171", + "bag-dash-fill": "\f172", + "bag-dash": "\f173", + "bag-fill": "\f174", + "bag-plus-fill": "\f175", + "bag-plus": "\f176", + "bag-x-fill": "\f177", + "bag-x": "\f178", + "bag": "\f179", + "bar-chart-fill": "\f17a", + "bar-chart-line-fill": "\f17b", + "bar-chart-line": "\f17c", + "bar-chart-steps": "\f17d", + "bar-chart": "\f17e", + "basket-fill": "\f17f", + "basket": "\f180", + "basket2-fill": "\f181", + "basket2": "\f182", + "basket3-fill": "\f183", + "basket3": "\f184", + "battery-charging": "\f185", + "battery-full": "\f186", + "battery-half": "\f187", + "battery": "\f188", + "bell-fill": "\f189", + "bell": "\f18a", + "bezier": "\f18b", + "bezier2": "\f18c", + "bicycle": "\f18d", + "binoculars-fill": "\f18e", + "binoculars": "\f18f", + "blockquote-left": "\f190", + "blockquote-right": "\f191", + "book-fill": "\f192", + "book-half": "\f193", + "book": "\f194", + "bookmark-check-fill": "\f195", + "bookmark-check": "\f196", + "bookmark-dash-fill": "\f197", + "bookmark-dash": "\f198", + "bookmark-fill": "\f199", + "bookmark-heart-fill": "\f19a", + "bookmark-heart": "\f19b", + "bookmark-plus-fill": "\f19c", + "bookmark-plus": "\f19d", + "bookmark-star-fill": "\f19e", + "bookmark-star": "\f19f", + "bookmark-x-fill": "\f1a0", + "bookmark-x": "\f1a1", + "bookmark": "\f1a2", + "bookmarks-fill": "\f1a3", + "bookmarks": "\f1a4", + "bookshelf": "\f1a5", + "bootstrap-fill": "\f1a6", + "bootstrap-reboot": "\f1a7", + "bootstrap": "\f1a8", + "border-all": "\f1a9", + "border-bottom": "\f1aa", + "border-center": "\f1ab", + "border-inner": "\f1ac", + "border-left": "\f1ad", + "border-middle": "\f1ae", + "border-outer": "\f1af", + "border-right": "\f1b0", + "border-style": "\f1b1", + "border-top": "\f1b2", + "border-width": "\f1b3", + "border": "\f1b4", + "bounding-box-circles": "\f1b5", + "bounding-box": "\f1b6", + "box-arrow-down-left": "\f1b7", + "box-arrow-down-right": "\f1b8", + "box-arrow-down": "\f1b9", + "box-arrow-in-down-left": "\f1ba", + "box-arrow-in-down-right": "\f1bb", + "box-arrow-in-down": "\f1bc", + "box-arrow-in-left": "\f1bd", + "box-arrow-in-right": "\f1be", + "box-arrow-in-up-left": "\f1bf", + "box-arrow-in-up-right": "\f1c0", + "box-arrow-in-up": "\f1c1", + "box-arrow-left": "\f1c2", + "box-arrow-right": "\f1c3", + "box-arrow-up-left": "\f1c4", + "box-arrow-up-right": "\f1c5", + "box-arrow-up": "\f1c6", + "box-seam": "\f1c7", + "box": "\f1c8", + "braces": "\f1c9", + "bricks": "\f1ca", + "briefcase-fill": "\f1cb", + "briefcase": "\f1cc", + "brightness-alt-high-fill": "\f1cd", + "brightness-alt-high": "\f1ce", + "brightness-alt-low-fill": "\f1cf", + "brightness-alt-low": "\f1d0", + "brightness-high-fill": "\f1d1", + "brightness-high": "\f1d2", + "brightness-low-fill": "\f1d3", + "brightness-low": "\f1d4", + "broadcast-pin": "\f1d5", + "broadcast": "\f1d6", + "brush-fill": "\f1d7", + "brush": "\f1d8", + "bucket-fill": "\f1d9", + "bucket": "\f1da", + "bug-fill": "\f1db", + "bug": "\f1dc", + "building": "\f1dd", + "bullseye": "\f1de", + "calculator-fill": "\f1df", + "calculator": "\f1e0", + "calendar-check-fill": "\f1e1", + "calendar-check": "\f1e2", + "calendar-date-fill": "\f1e3", + "calendar-date": "\f1e4", + "calendar-day-fill": "\f1e5", + "calendar-day": "\f1e6", + "calendar-event-fill": "\f1e7", + "calendar-event": "\f1e8", + "calendar-fill": "\f1e9", + "calendar-minus-fill": "\f1ea", + "calendar-minus": "\f1eb", + "calendar-month-fill": "\f1ec", + "calendar-month": "\f1ed", + "calendar-plus-fill": "\f1ee", + "calendar-plus": "\f1ef", + "calendar-range-fill": "\f1f0", + "calendar-range": "\f1f1", + "calendar-week-fill": "\f1f2", + "calendar-week": "\f1f3", + "calendar-x-fill": "\f1f4", + "calendar-x": "\f1f5", + "calendar": "\f1f6", + "calendar2-check-fill": "\f1f7", + "calendar2-check": "\f1f8", + "calendar2-date-fill": "\f1f9", + "calendar2-date": "\f1fa", + "calendar2-day-fill": "\f1fb", + "calendar2-day": "\f1fc", + "calendar2-event-fill": "\f1fd", + "calendar2-event": "\f1fe", + "calendar2-fill": "\f1ff", + "calendar2-minus-fill": "\f200", + "calendar2-minus": "\f201", + "calendar2-month-fill": "\f202", + "calendar2-month": "\f203", + "calendar2-plus-fill": "\f204", + "calendar2-plus": "\f205", + "calendar2-range-fill": "\f206", + "calendar2-range": "\f207", + "calendar2-week-fill": "\f208", + "calendar2-week": "\f209", + "calendar2-x-fill": "\f20a", + "calendar2-x": "\f20b", + "calendar2": "\f20c", + "calendar3-event-fill": "\f20d", + "calendar3-event": "\f20e", + "calendar3-fill": "\f20f", + "calendar3-range-fill": "\f210", + "calendar3-range": "\f211", + "calendar3-week-fill": "\f212", + "calendar3-week": "\f213", + "calendar3": "\f214", + "calendar4-event": "\f215", + "calendar4-range": "\f216", + "calendar4-week": "\f217", + "calendar4": "\f218", + "camera-fill": "\f219", + "camera-reels-fill": "\f21a", + "camera-reels": "\f21b", + "camera-video-fill": "\f21c", + "camera-video-off-fill": "\f21d", + "camera-video-off": "\f21e", + "camera-video": "\f21f", + "camera": "\f220", + "camera2": "\f221", + "capslock-fill": "\f222", + "capslock": "\f223", + "card-checklist": "\f224", + "card-heading": "\f225", + "card-image": "\f226", + "card-list": "\f227", + "card-text": "\f228", + "caret-down-fill": "\f229", + "caret-down-square-fill": "\f22a", + "caret-down-square": "\f22b", + "caret-down": "\f22c", + "caret-left-fill": "\f22d", + "caret-left-square-fill": "\f22e", + "caret-left-square": "\f22f", + "caret-left": "\f230", + "caret-right-fill": "\f231", + "caret-right-square-fill": "\f232", + "caret-right-square": "\f233", + "caret-right": "\f234", + "caret-up-fill": "\f235", + "caret-up-square-fill": "\f236", + "caret-up-square": "\f237", + "caret-up": "\f238", + "cart-check-fill": "\f239", + "cart-check": "\f23a", + "cart-dash-fill": "\f23b", + "cart-dash": "\f23c", + "cart-fill": "\f23d", + "cart-plus-fill": "\f23e", + "cart-plus": "\f23f", + "cart-x-fill": "\f240", + "cart-x": "\f241", + "cart": "\f242", + "cart2": "\f243", + "cart3": "\f244", + "cart4": "\f245", + "cash-stack": "\f246", + "cash": "\f247", + "cast": "\f248", + "chat-dots-fill": "\f249", + "chat-dots": "\f24a", + "chat-fill": "\f24b", + "chat-left-dots-fill": "\f24c", + "chat-left-dots": "\f24d", + "chat-left-fill": "\f24e", + "chat-left-quote-fill": "\f24f", + "chat-left-quote": "\f250", + "chat-left-text-fill": "\f251", + "chat-left-text": "\f252", + "chat-left": "\f253", + "chat-quote-fill": "\f254", + "chat-quote": "\f255", + "chat-right-dots-fill": "\f256", + "chat-right-dots": "\f257", + "chat-right-fill": "\f258", + "chat-right-quote-fill": "\f259", + "chat-right-quote": "\f25a", + "chat-right-text-fill": "\f25b", + "chat-right-text": "\f25c", + "chat-right": "\f25d", + "chat-square-dots-fill": "\f25e", + "chat-square-dots": "\f25f", + "chat-square-fill": "\f260", + "chat-square-quote-fill": "\f261", + "chat-square-quote": "\f262", + "chat-square-text-fill": "\f263", + "chat-square-text": "\f264", + "chat-square": "\f265", + "chat-text-fill": "\f266", + "chat-text": "\f267", + "chat": "\f268", + "check-all": "\f269", + "check-circle-fill": "\f26a", + "check-circle": "\f26b", + "check-square-fill": "\f26c", + "check-square": "\f26d", + "check": "\f26e", + "check2-all": "\f26f", + "check2-circle": "\f270", + "check2-square": "\f271", + "check2": "\f272", + "chevron-bar-contract": "\f273", + "chevron-bar-down": "\f274", + "chevron-bar-expand": "\f275", + "chevron-bar-left": "\f276", + "chevron-bar-right": "\f277", + "chevron-bar-up": "\f278", + "chevron-compact-down": "\f279", + "chevron-compact-left": "\f27a", + "chevron-compact-right": "\f27b", + "chevron-compact-up": "\f27c", + "chevron-contract": "\f27d", + "chevron-double-down": "\f27e", + "chevron-double-left": "\f27f", + "chevron-double-right": "\f280", + "chevron-double-up": "\f281", + "chevron-down": "\f282", + "chevron-expand": "\f283", + "chevron-left": "\f284", + "chevron-right": "\f285", + "chevron-up": "\f286", + "circle-fill": "\f287", + "circle-half": "\f288", + "circle-square": "\f289", + "circle": "\f28a", + "clipboard-check": "\f28b", + "clipboard-data": "\f28c", + "clipboard-minus": "\f28d", + "clipboard-plus": "\f28e", + "clipboard-x": "\f28f", + "clipboard": "\f290", + "clock-fill": "\f291", + "clock-history": "\f292", + "clock": "\f293", + "cloud-arrow-down-fill": "\f294", + "cloud-arrow-down": "\f295", + "cloud-arrow-up-fill": "\f296", + "cloud-arrow-up": "\f297", + "cloud-check-fill": "\f298", + "cloud-check": "\f299", + "cloud-download-fill": "\f29a", + "cloud-download": "\f29b", + "cloud-drizzle-fill": "\f29c", + "cloud-drizzle": "\f29d", + "cloud-fill": "\f29e", + "cloud-fog-fill": "\f29f", + "cloud-fog": "\f2a0", + "cloud-fog2-fill": "\f2a1", + "cloud-fog2": "\f2a2", + "cloud-hail-fill": "\f2a3", + "cloud-hail": "\f2a4", + "cloud-haze-fill": "\f2a6", + "cloud-haze": "\f2a7", + "cloud-haze2-fill": "\f2a8", + "cloud-lightning-fill": "\f2a9", + "cloud-lightning-rain-fill": "\f2aa", + "cloud-lightning-rain": "\f2ab", + "cloud-lightning": "\f2ac", + "cloud-minus-fill": "\f2ad", + "cloud-minus": "\f2ae", + "cloud-moon-fill": "\f2af", + "cloud-moon": "\f2b0", + "cloud-plus-fill": "\f2b1", + "cloud-plus": "\f2b2", + "cloud-rain-fill": "\f2b3", + "cloud-rain-heavy-fill": "\f2b4", + "cloud-rain-heavy": "\f2b5", + "cloud-rain": "\f2b6", + "cloud-slash-fill": "\f2b7", + "cloud-slash": "\f2b8", + "cloud-sleet-fill": "\f2b9", + "cloud-sleet": "\f2ba", + "cloud-snow-fill": "\f2bb", + "cloud-snow": "\f2bc", + "cloud-sun-fill": "\f2bd", + "cloud-sun": "\f2be", + "cloud-upload-fill": "\f2bf", + "cloud-upload": "\f2c0", + "cloud": "\f2c1", + "clouds-fill": "\f2c2", + "clouds": "\f2c3", + "cloudy-fill": "\f2c4", + "cloudy": "\f2c5", + "code-slash": "\f2c6", + "code-square": "\f2c7", + "code": "\f2c8", + "collection-fill": "\f2c9", + "collection-play-fill": "\f2ca", + "collection-play": "\f2cb", + "collection": "\f2cc", + "columns-gap": "\f2cd", + "columns": "\f2ce", + "command": "\f2cf", + "compass-fill": "\f2d0", + "compass": "\f2d1", + "cone-striped": "\f2d2", + "cone": "\f2d3", + "controller": "\f2d4", + "cpu-fill": "\f2d5", + "cpu": "\f2d6", + "credit-card-2-back-fill": "\f2d7", + "credit-card-2-back": "\f2d8", + "credit-card-2-front-fill": "\f2d9", + "credit-card-2-front": "\f2da", + "credit-card-fill": "\f2db", + "credit-card": "\f2dc", + "crop": "\f2dd", + "cup-fill": "\f2de", + "cup-straw": "\f2df", + "cup": "\f2e0", + "cursor-fill": "\f2e1", + "cursor-text": "\f2e2", + "cursor": "\f2e3", + "dash-circle-dotted": "\f2e4", + "dash-circle-fill": "\f2e5", + "dash-circle": "\f2e6", + "dash-square-dotted": "\f2e7", + "dash-square-fill": "\f2e8", + "dash-square": "\f2e9", + "dash": "\f2ea", + "diagram-2-fill": "\f2eb", + "diagram-2": "\f2ec", + "diagram-3-fill": "\f2ed", + "diagram-3": "\f2ee", + "diamond-fill": "\f2ef", + "diamond-half": "\f2f0", + "diamond": "\f2f1", + "dice-1-fill": "\f2f2", + "dice-1": "\f2f3", + "dice-2-fill": "\f2f4", + "dice-2": "\f2f5", + "dice-3-fill": "\f2f6", + "dice-3": "\f2f7", + "dice-4-fill": "\f2f8", + "dice-4": "\f2f9", + "dice-5-fill": "\f2fa", + "dice-5": "\f2fb", + "dice-6-fill": "\f2fc", + "dice-6": "\f2fd", + "disc-fill": "\f2fe", + "disc": "\f2ff", + "discord": "\f300", + "display-fill": "\f301", + "display": "\f302", + "distribute-horizontal": "\f303", + "distribute-vertical": "\f304", + "door-closed-fill": "\f305", + "door-closed": "\f306", + "door-open-fill": "\f307", + "door-open": "\f308", + "dot": "\f309", + "download": "\f30a", + "droplet-fill": "\f30b", + "droplet-half": "\f30c", + "droplet": "\f30d", + "earbuds": "\f30e", + "easel-fill": "\f30f", + "easel": "\f310", + "egg-fill": "\f311", + "egg-fried": "\f312", + "egg": "\f313", + "eject-fill": "\f314", + "eject": "\f315", + "emoji-angry-fill": "\f316", + "emoji-angry": "\f317", + "emoji-dizzy-fill": "\f318", + "emoji-dizzy": "\f319", + "emoji-expressionless-fill": "\f31a", + "emoji-expressionless": "\f31b", + "emoji-frown-fill": "\f31c", + "emoji-frown": "\f31d", + "emoji-heart-eyes-fill": "\f31e", + "emoji-heart-eyes": "\f31f", + "emoji-laughing-fill": "\f320", + "emoji-laughing": "\f321", + "emoji-neutral-fill": "\f322", + "emoji-neutral": "\f323", + "emoji-smile-fill": "\f324", + "emoji-smile-upside-down-fill": "\f325", + "emoji-smile-upside-down": "\f326", + "emoji-smile": "\f327", + "emoji-sunglasses-fill": "\f328", + "emoji-sunglasses": "\f329", + "emoji-wink-fill": "\f32a", + "emoji-wink": "\f32b", + "envelope-fill": "\f32c", + "envelope-open-fill": "\f32d", + "envelope-open": "\f32e", + "envelope": "\f32f", + "eraser-fill": "\f330", + "eraser": "\f331", + "exclamation-circle-fill": "\f332", + "exclamation-circle": "\f333", + "exclamation-diamond-fill": "\f334", + "exclamation-diamond": "\f335", + "exclamation-octagon-fill": "\f336", + "exclamation-octagon": "\f337", + "exclamation-square-fill": "\f338", + "exclamation-square": "\f339", + "exclamation-triangle-fill": "\f33a", + "exclamation-triangle": "\f33b", + "exclamation": "\f33c", + "exclude": "\f33d", + "eye-fill": "\f33e", + "eye-slash-fill": "\f33f", + "eye-slash": "\f340", + "eye": "\f341", + "eyedropper": "\f342", + "eyeglasses": "\f343", + "facebook": "\f344", + "file-arrow-down-fill": "\f345", + "file-arrow-down": "\f346", + "file-arrow-up-fill": "\f347", + "file-arrow-up": "\f348", + "file-bar-graph-fill": "\f349", + "file-bar-graph": "\f34a", + "file-binary-fill": "\f34b", + "file-binary": "\f34c", + "file-break-fill": "\f34d", + "file-break": "\f34e", + "file-check-fill": "\f34f", + "file-check": "\f350", + "file-code-fill": "\f351", + "file-code": "\f352", + "file-diff-fill": "\f353", + "file-diff": "\f354", + "file-earmark-arrow-down-fill": "\f355", + "file-earmark-arrow-down": "\f356", + "file-earmark-arrow-up-fill": "\f357", + "file-earmark-arrow-up": "\f358", + "file-earmark-bar-graph-fill": "\f359", + "file-earmark-bar-graph": "\f35a", + "file-earmark-binary-fill": "\f35b", + "file-earmark-binary": "\f35c", + "file-earmark-break-fill": "\f35d", + "file-earmark-break": "\f35e", + "file-earmark-check-fill": "\f35f", + "file-earmark-check": "\f360", + "file-earmark-code-fill": "\f361", + "file-earmark-code": "\f362", + "file-earmark-diff-fill": "\f363", + "file-earmark-diff": "\f364", + "file-earmark-easel-fill": "\f365", + "file-earmark-easel": "\f366", + "file-earmark-excel-fill": "\f367", + "file-earmark-excel": "\f368", + "file-earmark-fill": "\f369", + "file-earmark-font-fill": "\f36a", + "file-earmark-font": "\f36b", + "file-earmark-image-fill": "\f36c", + "file-earmark-image": "\f36d", + "file-earmark-lock-fill": "\f36e", + "file-earmark-lock": "\f36f", + "file-earmark-lock2-fill": "\f370", + "file-earmark-lock2": "\f371", + "file-earmark-medical-fill": "\f372", + "file-earmark-medical": "\f373", + "file-earmark-minus-fill": "\f374", + "file-earmark-minus": "\f375", + "file-earmark-music-fill": "\f376", + "file-earmark-music": "\f377", + "file-earmark-person-fill": "\f378", + "file-earmark-person": "\f379", + "file-earmark-play-fill": "\f37a", + "file-earmark-play": "\f37b", + "file-earmark-plus-fill": "\f37c", + "file-earmark-plus": "\f37d", + "file-earmark-post-fill": "\f37e", + "file-earmark-post": "\f37f", + "file-earmark-ppt-fill": "\f380", + "file-earmark-ppt": "\f381", + "file-earmark-richtext-fill": "\f382", + "file-earmark-richtext": "\f383", + "file-earmark-ruled-fill": "\f384", + "file-earmark-ruled": "\f385", + "file-earmark-slides-fill": "\f386", + "file-earmark-slides": "\f387", + "file-earmark-spreadsheet-fill": "\f388", + "file-earmark-spreadsheet": "\f389", + "file-earmark-text-fill": "\f38a", + "file-earmark-text": "\f38b", + "file-earmark-word-fill": "\f38c", + "file-earmark-word": "\f38d", + "file-earmark-x-fill": "\f38e", + "file-earmark-x": "\f38f", + "file-earmark-zip-fill": "\f390", + "file-earmark-zip": "\f391", + "file-earmark": "\f392", + "file-easel-fill": "\f393", + "file-easel": "\f394", + "file-excel-fill": "\f395", + "file-excel": "\f396", + "file-fill": "\f397", + "file-font-fill": "\f398", + "file-font": "\f399", + "file-image-fill": "\f39a", + "file-image": "\f39b", + "file-lock-fill": "\f39c", + "file-lock": "\f39d", + "file-lock2-fill": "\f39e", + "file-lock2": "\f39f", + "file-medical-fill": "\f3a0", + "file-medical": "\f3a1", + "file-minus-fill": "\f3a2", + "file-minus": "\f3a3", + "file-music-fill": "\f3a4", + "file-music": "\f3a5", + "file-person-fill": "\f3a6", + "file-person": "\f3a7", + "file-play-fill": "\f3a8", + "file-play": "\f3a9", + "file-plus-fill": "\f3aa", + "file-plus": "\f3ab", + "file-post-fill": "\f3ac", + "file-post": "\f3ad", + "file-ppt-fill": "\f3ae", + "file-ppt": "\f3af", + "file-richtext-fill": "\f3b0", + "file-richtext": "\f3b1", + "file-ruled-fill": "\f3b2", + "file-ruled": "\f3b3", + "file-slides-fill": "\f3b4", + "file-slides": "\f3b5", + "file-spreadsheet-fill": "\f3b6", + "file-spreadsheet": "\f3b7", + "file-text-fill": "\f3b8", + "file-text": "\f3b9", + "file-word-fill": "\f3ba", + "file-word": "\f3bb", + "file-x-fill": "\f3bc", + "file-x": "\f3bd", + "file-zip-fill": "\f3be", + "file-zip": "\f3bf", + "file": "\f3c0", + "files-alt": "\f3c1", + "files": "\f3c2", + "film": "\f3c3", + "filter-circle-fill": "\f3c4", + "filter-circle": "\f3c5", + "filter-left": "\f3c6", + "filter-right": "\f3c7", + "filter-square-fill": "\f3c8", + "filter-square": "\f3c9", + "filter": "\f3ca", + "flag-fill": "\f3cb", + "flag": "\f3cc", + "flower1": "\f3cd", + "flower2": "\f3ce", + "flower3": "\f3cf", + "folder-check": "\f3d0", + "folder-fill": "\f3d1", + "folder-minus": "\f3d2", + "folder-plus": "\f3d3", + "folder-symlink-fill": "\f3d4", + "folder-symlink": "\f3d5", + "folder-x": "\f3d6", + "folder": "\f3d7", + "folder2-open": "\f3d8", + "folder2": "\f3d9", + "fonts": "\f3da", + "forward-fill": "\f3db", + "forward": "\f3dc", + "front": "\f3dd", + "fullscreen-exit": "\f3de", + "fullscreen": "\f3df", + "funnel-fill": "\f3e0", + "funnel": "\f3e1", + "gear-fill": "\f3e2", + "gear-wide-connected": "\f3e3", + "gear-wide": "\f3e4", + "gear": "\f3e5", + "gem": "\f3e6", + "geo-alt-fill": "\f3e7", + "geo-alt": "\f3e8", + "geo-fill": "\f3e9", + "geo": "\f3ea", + "gift-fill": "\f3eb", + "gift": "\f3ec", + "github": "\f3ed", + "globe": "\f3ee", + "globe2": "\f3ef", + "google": "\f3f0", + "graph-down": "\f3f1", + "graph-up": "\f3f2", + "grid-1x2-fill": "\f3f3", + "grid-1x2": "\f3f4", + "grid-3x2-gap-fill": "\f3f5", + "grid-3x2-gap": "\f3f6", + "grid-3x2": "\f3f7", + "grid-3x3-gap-fill": "\f3f8", + "grid-3x3-gap": "\f3f9", + "grid-3x3": "\f3fa", + "grid-fill": "\f3fb", + "grid": "\f3fc", + "grip-horizontal": "\f3fd", + "grip-vertical": "\f3fe", + "hammer": "\f3ff", + "hand-index-fill": "\f400", + "hand-index-thumb-fill": "\f401", + "hand-index-thumb": "\f402", + "hand-index": "\f403", + "hand-thumbs-down-fill": "\f404", + "hand-thumbs-down": "\f405", + "hand-thumbs-up-fill": "\f406", + "hand-thumbs-up": "\f407", + "handbag-fill": "\f408", + "handbag": "\f409", + "hash": "\f40a", + "hdd-fill": "\f40b", + "hdd-network-fill": "\f40c", + "hdd-network": "\f40d", + "hdd-rack-fill": "\f40e", + "hdd-rack": "\f40f", + "hdd-stack-fill": "\f410", + "hdd-stack": "\f411", + "hdd": "\f412", + "headphones": "\f413", + "headset": "\f414", + "heart-fill": "\f415", + "heart-half": "\f416", + "heart": "\f417", + "heptagon-fill": "\f418", + "heptagon-half": "\f419", + "heptagon": "\f41a", + "hexagon-fill": "\f41b", + "hexagon-half": "\f41c", + "hexagon": "\f41d", + "hourglass-bottom": "\f41e", + "hourglass-split": "\f41f", + "hourglass-top": "\f420", + "hourglass": "\f421", + "house-door-fill": "\f422", + "house-door": "\f423", + "house-fill": "\f424", + "house": "\f425", + "hr": "\f426", + "hurricane": "\f427", + "image-alt": "\f428", + "image-fill": "\f429", + "image": "\f42a", + "images": "\f42b", + "inbox-fill": "\f42c", + "inbox": "\f42d", + "inboxes-fill": "\f42e", + "inboxes": "\f42f", + "info-circle-fill": "\f430", + "info-circle": "\f431", + "info-square-fill": "\f432", + "info-square": "\f433", + "info": "\f434", + "input-cursor-text": "\f435", + "input-cursor": "\f436", + "instagram": "\f437", + "intersect": "\f438", + "journal-album": "\f439", + "journal-arrow-down": "\f43a", + "journal-arrow-up": "\f43b", + "journal-bookmark-fill": "\f43c", + "journal-bookmark": "\f43d", + "journal-check": "\f43e", + "journal-code": "\f43f", + "journal-medical": "\f440", + "journal-minus": "\f441", + "journal-plus": "\f442", + "journal-richtext": "\f443", + "journal-text": "\f444", + "journal-x": "\f445", + "journal": "\f446", + "journals": "\f447", + "joystick": "\f448", + "justify-left": "\f449", + "justify-right": "\f44a", + "justify": "\f44b", + "kanban-fill": "\f44c", + "kanban": "\f44d", + "key-fill": "\f44e", + "key": "\f44f", + "keyboard-fill": "\f450", + "keyboard": "\f451", + "ladder": "\f452", + "lamp-fill": "\f453", + "lamp": "\f454", + "laptop-fill": "\f455", + "laptop": "\f456", + "layer-backward": "\f457", + "layer-forward": "\f458", + "layers-fill": "\f459", + "layers-half": "\f45a", + "layers": "\f45b", + "layout-sidebar-inset-reverse": "\f45c", + "layout-sidebar-inset": "\f45d", + "layout-sidebar-reverse": "\f45e", + "layout-sidebar": "\f45f", + "layout-split": "\f460", + "layout-text-sidebar-reverse": "\f461", + "layout-text-sidebar": "\f462", + "layout-text-window-reverse": "\f463", + "layout-text-window": "\f464", + "layout-three-columns": "\f465", + "layout-wtf": "\f466", + "life-preserver": "\f467", + "lightbulb-fill": "\f468", + "lightbulb-off-fill": "\f469", + "lightbulb-off": "\f46a", + "lightbulb": "\f46b", + "lightning-charge-fill": "\f46c", + "lightning-charge": "\f46d", + "lightning-fill": "\f46e", + "lightning": "\f46f", + "link-45deg": "\f470", + "link": "\f471", + "linkedin": "\f472", + "list-check": "\f473", + "list-nested": "\f474", + "list-ol": "\f475", + "list-stars": "\f476", + "list-task": "\f477", + "list-ul": "\f478", + "list": "\f479", + "lock-fill": "\f47a", + "lock": "\f47b", + "mailbox": "\f47c", + "mailbox2": "\f47d", + "map-fill": "\f47e", + "map": "\f47f", + "markdown-fill": "\f480", + "markdown": "\f481", + "mask": "\f482", + "megaphone-fill": "\f483", + "megaphone": "\f484", + "menu-app-fill": "\f485", + "menu-app": "\f486", + "menu-button-fill": "\f487", + "menu-button-wide-fill": "\f488", + "menu-button-wide": "\f489", + "menu-button": "\f48a", + "menu-down": "\f48b", + "menu-up": "\f48c", + "mic-fill": "\f48d", + "mic-mute-fill": "\f48e", + "mic-mute": "\f48f", + "mic": "\f490", + "minecart-loaded": "\f491", + "minecart": "\f492", + "moisture": "\f493", + "moon-fill": "\f494", + "moon-stars-fill": "\f495", + "moon-stars": "\f496", + "moon": "\f497", + "mouse-fill": "\f498", + "mouse": "\f499", + "mouse2-fill": "\f49a", + "mouse2": "\f49b", + "mouse3-fill": "\f49c", + "mouse3": "\f49d", + "music-note-beamed": "\f49e", + "music-note-list": "\f49f", + "music-note": "\f4a0", + "music-player-fill": "\f4a1", + "music-player": "\f4a2", + "newspaper": "\f4a3", + "node-minus-fill": "\f4a4", + "node-minus": "\f4a5", + "node-plus-fill": "\f4a6", + "node-plus": "\f4a7", + "nut-fill": "\f4a8", + "nut": "\f4a9", + "octagon-fill": "\f4aa", + "octagon-half": "\f4ab", + "octagon": "\f4ac", + "option": "\f4ad", + "outlet": "\f4ae", + "paint-bucket": "\f4af", + "palette-fill": "\f4b0", + "palette": "\f4b1", + "palette2": "\f4b2", + "paperclip": "\f4b3", + "paragraph": "\f4b4", + "patch-check-fill": "\f4b5", + "patch-check": "\f4b6", + "patch-exclamation-fill": "\f4b7", + "patch-exclamation": "\f4b8", + "patch-minus-fill": "\f4b9", + "patch-minus": "\f4ba", + "patch-plus-fill": "\f4bb", + "patch-plus": "\f4bc", + "patch-question-fill": "\f4bd", + "patch-question": "\f4be", + "pause-btn-fill": "\f4bf", + "pause-btn": "\f4c0", + "pause-circle-fill": "\f4c1", + "pause-circle": "\f4c2", + "pause-fill": "\f4c3", + "pause": "\f4c4", + "peace-fill": "\f4c5", + "peace": "\f4c6", + "pen-fill": "\f4c7", + "pen": "\f4c8", + "pencil-fill": "\f4c9", + "pencil-square": "\f4ca", + "pencil": "\f4cb", + "pentagon-fill": "\f4cc", + "pentagon-half": "\f4cd", + "pentagon": "\f4ce", + "people-fill": "\f4cf", + "people": "\f4d0", + "percent": "\f4d1", + "person-badge-fill": "\f4d2", + "person-badge": "\f4d3", + "person-bounding-box": "\f4d4", + "person-check-fill": "\f4d5", + "person-check": "\f4d6", + "person-circle": "\f4d7", + "person-dash-fill": "\f4d8", + "person-dash": "\f4d9", + "person-fill": "\f4da", + "person-lines-fill": "\f4db", + "person-plus-fill": "\f4dc", + "person-plus": "\f4dd", + "person-square": "\f4de", + "person-x-fill": "\f4df", + "person-x": "\f4e0", + "person": "\f4e1", + "phone-fill": "\f4e2", + "phone-landscape-fill": "\f4e3", + "phone-landscape": "\f4e4", + "phone-vibrate-fill": "\f4e5", + "phone-vibrate": "\f4e6", + "phone": "\f4e7", + "pie-chart-fill": "\f4e8", + "pie-chart": "\f4e9", + "pin-angle-fill": "\f4ea", + "pin-angle": "\f4eb", + "pin-fill": "\f4ec", + "pin": "\f4ed", + "pip-fill": "\f4ee", + "pip": "\f4ef", + "play-btn-fill": "\f4f0", + "play-btn": "\f4f1", + "play-circle-fill": "\f4f2", + "play-circle": "\f4f3", + "play-fill": "\f4f4", + "play": "\f4f5", + "plug-fill": "\f4f6", + "plug": "\f4f7", + "plus-circle-dotted": "\f4f8", + "plus-circle-fill": "\f4f9", + "plus-circle": "\f4fa", + "plus-square-dotted": "\f4fb", + "plus-square-fill": "\f4fc", + "plus-square": "\f4fd", + "plus": "\f4fe", + "power": "\f4ff", + "printer-fill": "\f500", + "printer": "\f501", + "puzzle-fill": "\f502", + "puzzle": "\f503", + "question-circle-fill": "\f504", + "question-circle": "\f505", + "question-diamond-fill": "\f506", + "question-diamond": "\f507", + "question-octagon-fill": "\f508", + "question-octagon": "\f509", + "question-square-fill": "\f50a", + "question-square": "\f50b", + "question": "\f50c", + "rainbow": "\f50d", + "receipt-cutoff": "\f50e", + "receipt": "\f50f", + "reception-0": "\f510", + "reception-1": "\f511", + "reception-2": "\f512", + "reception-3": "\f513", + "reception-4": "\f514", + "record-btn-fill": "\f515", + "record-btn": "\f516", + "record-circle-fill": "\f517", + "record-circle": "\f518", + "record-fill": "\f519", + "record": "\f51a", + "record2-fill": "\f51b", + "record2": "\f51c", + "reply-all-fill": "\f51d", + "reply-all": "\f51e", + "reply-fill": "\f51f", + "reply": "\f520", + "rss-fill": "\f521", + "rss": "\f522", + "rulers": "\f523", + "save-fill": "\f524", + "save": "\f525", + "save2-fill": "\f526", + "save2": "\f527", + "scissors": "\f528", + "screwdriver": "\f529", + "search": "\f52a", + "segmented-nav": "\f52b", + "server": "\f52c", + "share-fill": "\f52d", + "share": "\f52e", + "shield-check": "\f52f", + "shield-exclamation": "\f530", + "shield-fill-check": "\f531", + "shield-fill-exclamation": "\f532", + "shield-fill-minus": "\f533", + "shield-fill-plus": "\f534", + "shield-fill-x": "\f535", + "shield-fill": "\f536", + "shield-lock-fill": "\f537", + "shield-lock": "\f538", + "shield-minus": "\f539", + "shield-plus": "\f53a", + "shield-shaded": "\f53b", + "shield-slash-fill": "\f53c", + "shield-slash": "\f53d", + "shield-x": "\f53e", + "shield": "\f53f", + "shift-fill": "\f540", + "shift": "\f541", + "shop-window": "\f542", + "shop": "\f543", + "shuffle": "\f544", + "signpost-2-fill": "\f545", + "signpost-2": "\f546", + "signpost-fill": "\f547", + "signpost-split-fill": "\f548", + "signpost-split": "\f549", + "signpost": "\f54a", + "sim-fill": "\f54b", + "sim": "\f54c", + "skip-backward-btn-fill": "\f54d", + "skip-backward-btn": "\f54e", + "skip-backward-circle-fill": "\f54f", + "skip-backward-circle": "\f550", + "skip-backward-fill": "\f551", + "skip-backward": "\f552", + "skip-end-btn-fill": "\f553", + "skip-end-btn": "\f554", + "skip-end-circle-fill": "\f555", + "skip-end-circle": "\f556", + "skip-end-fill": "\f557", + "skip-end": "\f558", + "skip-forward-btn-fill": "\f559", + "skip-forward-btn": "\f55a", + "skip-forward-circle-fill": "\f55b", + "skip-forward-circle": "\f55c", + "skip-forward-fill": "\f55d", + "skip-forward": "\f55e", + "skip-start-btn-fill": "\f55f", + "skip-start-btn": "\f560", + "skip-start-circle-fill": "\f561", + "skip-start-circle": "\f562", + "skip-start-fill": "\f563", + "skip-start": "\f564", + "slack": "\f565", + "slash-circle-fill": "\f566", + "slash-circle": "\f567", + "slash-square-fill": "\f568", + "slash-square": "\f569", + "slash": "\f56a", + "sliders": "\f56b", + "smartwatch": "\f56c", + "snow": "\f56d", + "snow2": "\f56e", + "snow3": "\f56f", + "sort-alpha-down-alt": "\f570", + "sort-alpha-down": "\f571", + "sort-alpha-up-alt": "\f572", + "sort-alpha-up": "\f573", + "sort-down-alt": "\f574", + "sort-down": "\f575", + "sort-numeric-down-alt": "\f576", + "sort-numeric-down": "\f577", + "sort-numeric-up-alt": "\f578", + "sort-numeric-up": "\f579", + "sort-up-alt": "\f57a", + "sort-up": "\f57b", + "soundwave": "\f57c", + "speaker-fill": "\f57d", + "speaker": "\f57e", + "speedometer": "\f57f", + "speedometer2": "\f580", + "spellcheck": "\f581", + "square-fill": "\f582", + "square-half": "\f583", + "square": "\f584", + "stack": "\f585", + "star-fill": "\f586", + "star-half": "\f587", + "star": "\f588", + "stars": "\f589", + "stickies-fill": "\f58a", + "stickies": "\f58b", + "sticky-fill": "\f58c", + "sticky": "\f58d", + "stop-btn-fill": "\f58e", + "stop-btn": "\f58f", + "stop-circle-fill": "\f590", + "stop-circle": "\f591", + "stop-fill": "\f592", + "stop": "\f593", + "stoplights-fill": "\f594", + "stoplights": "\f595", + "stopwatch-fill": "\f596", + "stopwatch": "\f597", + "subtract": "\f598", + "suit-club-fill": "\f599", + "suit-club": "\f59a", + "suit-diamond-fill": "\f59b", + "suit-diamond": "\f59c", + "suit-heart-fill": "\f59d", + "suit-heart": "\f59e", + "suit-spade-fill": "\f59f", + "suit-spade": "\f5a0", + "sun-fill": "\f5a1", + "sun": "\f5a2", + "sunglasses": "\f5a3", + "sunrise-fill": "\f5a4", + "sunrise": "\f5a5", + "sunset-fill": "\f5a6", + "sunset": "\f5a7", + "symmetry-horizontal": "\f5a8", + "symmetry-vertical": "\f5a9", + "table": "\f5aa", + "tablet-fill": "\f5ab", + "tablet-landscape-fill": "\f5ac", + "tablet-landscape": "\f5ad", + "tablet": "\f5ae", + "tag-fill": "\f5af", + "tag": "\f5b0", + "tags-fill": "\f5b1", + "tags": "\f5b2", + "telegram": "\f5b3", + "telephone-fill": "\f5b4", + "telephone-forward-fill": "\f5b5", + "telephone-forward": "\f5b6", + "telephone-inbound-fill": "\f5b7", + "telephone-inbound": "\f5b8", + "telephone-minus-fill": "\f5b9", + "telephone-minus": "\f5ba", + "telephone-outbound-fill": "\f5bb", + "telephone-outbound": "\f5bc", + "telephone-plus-fill": "\f5bd", + "telephone-plus": "\f5be", + "telephone-x-fill": "\f5bf", + "telephone-x": "\f5c0", + "telephone": "\f5c1", + "terminal-fill": "\f5c2", + "terminal": "\f5c3", + "text-center": "\f5c4", + "text-indent-left": "\f5c5", + "text-indent-right": "\f5c6", + "text-left": "\f5c7", + "text-paragraph": "\f5c8", + "text-right": "\f5c9", + "textarea-resize": "\f5ca", + "textarea-t": "\f5cb", + "textarea": "\f5cc", + "thermometer-half": "\f5cd", + "thermometer-high": "\f5ce", + "thermometer-low": "\f5cf", + "thermometer-snow": "\f5d0", + "thermometer-sun": "\f5d1", + "thermometer": "\f5d2", + "three-dots-vertical": "\f5d3", + "three-dots": "\f5d4", + "toggle-off": "\f5d5", + "toggle-on": "\f5d6", + "toggle2-off": "\f5d7", + "toggle2-on": "\f5d8", + "toggles": "\f5d9", + "toggles2": "\f5da", + "tools": "\f5db", + "tornado": "\f5dc", + "trash-fill": "\f5dd", + "trash": "\f5de", + "trash2-fill": "\f5df", + "trash2": "\f5e0", + "tree-fill": "\f5e1", + "tree": "\f5e2", + "triangle-fill": "\f5e3", + "triangle-half": "\f5e4", + "triangle": "\f5e5", + "trophy-fill": "\f5e6", + "trophy": "\f5e7", + "tropical-storm": "\f5e8", + "truck-flatbed": "\f5e9", + "truck": "\f5ea", + "tsunami": "\f5eb", + "tv-fill": "\f5ec", + "tv": "\f5ed", + "twitch": "\f5ee", + "twitter": "\f5ef", + "type-bold": "\f5f0", + "type-h1": "\f5f1", + "type-h2": "\f5f2", + "type-h3": "\f5f3", + "type-italic": "\f5f4", + "type-strikethrough": "\f5f5", + "type-underline": "\f5f6", + "type": "\f5f7", + "ui-checks-grid": "\f5f8", + "ui-checks": "\f5f9", + "ui-radios-grid": "\f5fa", + "ui-radios": "\f5fb", + "umbrella-fill": "\f5fc", + "umbrella": "\f5fd", + "union": "\f5fe", + "unlock-fill": "\f5ff", + "unlock": "\f600", + "upc-scan": "\f601", + "upc": "\f602", + "upload": "\f603", + "vector-pen": "\f604", + "view-list": "\f605", + "view-stacked": "\f606", + "vinyl-fill": "\f607", + "vinyl": "\f608", + "voicemail": "\f609", + "volume-down-fill": "\f60a", + "volume-down": "\f60b", + "volume-mute-fill": "\f60c", + "volume-mute": "\f60d", + "volume-off-fill": "\f60e", + "volume-off": "\f60f", + "volume-up-fill": "\f610", + "volume-up": "\f611", + "vr": "\f612", + "wallet-fill": "\f613", + "wallet": "\f614", + "wallet2": "\f615", + "watch": "\f616", + "water": "\f617", + "whatsapp": "\f618", + "wifi-1": "\f619", + "wifi-2": "\f61a", + "wifi-off": "\f61b", + "wifi": "\f61c", + "wind": "\f61d", + "window-dock": "\f61e", + "window-sidebar": "\f61f", + "window": "\f620", + "wrench": "\f621", + "x-circle-fill": "\f622", + "x-circle": "\f623", + "x-diamond-fill": "\f624", + "x-diamond": "\f625", + "x-octagon-fill": "\f626", + "x-octagon": "\f627", + "x-square-fill": "\f628", + "x-square": "\f629", + "x": "\f62a", + "youtube": "\f62b", + "zoom-in": "\f62c", + "zoom-out": "\f62d", + "bank": "\f62e", + "bank2": "\f62f", + "bell-slash-fill": "\f630", + "bell-slash": "\f631", + "cash-coin": "\f632", + "check-lg": "\f633", + "coin": "\f634", + "currency-bitcoin": "\f635", + "currency-dollar": "\f636", + "currency-euro": "\f637", + "currency-exchange": "\f638", + "currency-pound": "\f639", + "currency-yen": "\f63a", + "dash-lg": "\f63b", + "exclamation-lg": "\f63c", + "file-earmark-pdf-fill": "\f63d", + "file-earmark-pdf": "\f63e", + "file-pdf-fill": "\f63f", + "file-pdf": "\f640", + "gender-ambiguous": "\f641", + "gender-female": "\f642", + "gender-male": "\f643", + "gender-trans": "\f644", + "headset-vr": "\f645", + "info-lg": "\f646", + "mastodon": "\f647", + "messenger": "\f648", + "piggy-bank-fill": "\f649", + "piggy-bank": "\f64a", + "pin-map-fill": "\f64b", + "pin-map": "\f64c", + "plus-lg": "\f64d", + "question-lg": "\f64e", + "recycle": "\f64f", + "reddit": "\f650", + "safe-fill": "\f651", + "safe2-fill": "\f652", + "safe2": "\f653", + "sd-card-fill": "\f654", + "sd-card": "\f655", + "skype": "\f656", + "slash-lg": "\f657", + "translate": "\f658", + "x-lg": "\f659", + "safe": "\f65a", + "apple": "\f65b", + "microsoft": "\f65d", + "windows": "\f65e", + "behance": "\f65c", + "dribbble": "\f65f", + "line": "\f660", + "medium": "\f661", + "paypal": "\f662", + "pinterest": "\f663", + "signal": "\f664", + "snapchat": "\f665", + "spotify": "\f666", + "stack-overflow": "\f667", + "strava": "\f668", + "wordpress": "\f669", + "vimeo": "\f66a", + "activity": "\f66b", + "easel2-fill": "\f66c", + "easel2": "\f66d", + "easel3-fill": "\f66e", + "easel3": "\f66f", + "fan": "\f670", + "fingerprint": "\f671", + "graph-down-arrow": "\f672", + "graph-up-arrow": "\f673", + "hypnotize": "\f674", + "magic": "\f675", + "person-rolodex": "\f676", + "person-video": "\f677", + "person-video2": "\f678", + "person-video3": "\f679", + "person-workspace": "\f67a", + "radioactive": "\f67b", + "webcam-fill": "\f67c", + "webcam": "\f67d", + "yin-yang": "\f67e", + "bandaid-fill": "\f680", + "bandaid": "\f681", + "bluetooth": "\f682", + "body-text": "\f683", + "boombox": "\f684", + "boxes": "\f685", + "dpad-fill": "\f686", + "dpad": "\f687", + "ear-fill": "\f688", + "ear": "\f689", + "envelope-check-fill": "\f68b", + "envelope-check": "\f68c", + "envelope-dash-fill": "\f68e", + "envelope-dash": "\f68f", + "envelope-exclamation-fill": "\f691", + "envelope-exclamation": "\f692", + "envelope-plus-fill": "\f693", + "envelope-plus": "\f694", + "envelope-slash-fill": "\f696", + "envelope-slash": "\f697", + "envelope-x-fill": "\f699", + "envelope-x": "\f69a", + "explicit-fill": "\f69b", + "explicit": "\f69c", + "git": "\f69d", + "infinity": "\f69e", + "list-columns-reverse": "\f69f", + "list-columns": "\f6a0", + "meta": "\f6a1", + "nintendo-switch": "\f6a4", + "pc-display-horizontal": "\f6a5", + "pc-display": "\f6a6", + "pc-horizontal": "\f6a7", + "pc": "\f6a8", + "playstation": "\f6a9", + "plus-slash-minus": "\f6aa", + "projector-fill": "\f6ab", + "projector": "\f6ac", + "qr-code-scan": "\f6ad", + "qr-code": "\f6ae", + "quora": "\f6af", + "quote": "\f6b0", + "robot": "\f6b1", + "send-check-fill": "\f6b2", + "send-check": "\f6b3", + "send-dash-fill": "\f6b4", + "send-dash": "\f6b5", + "send-exclamation-fill": "\f6b7", + "send-exclamation": "\f6b8", + "send-fill": "\f6b9", + "send-plus-fill": "\f6ba", + "send-plus": "\f6bb", + "send-slash-fill": "\f6bc", + "send-slash": "\f6bd", + "send-x-fill": "\f6be", + "send-x": "\f6bf", + "send": "\f6c0", + "steam": "\f6c1", + "terminal-dash": "\f6c3", + "terminal-plus": "\f6c4", + "terminal-split": "\f6c5", + "ticket-detailed-fill": "\f6c6", + "ticket-detailed": "\f6c7", + "ticket-fill": "\f6c8", + "ticket-perforated-fill": "\f6c9", + "ticket-perforated": "\f6ca", + "ticket": "\f6cb", + "tiktok": "\f6cc", + "window-dash": "\f6cd", + "window-desktop": "\f6ce", + "window-fullscreen": "\f6cf", + "window-plus": "\f6d0", + "window-split": "\f6d1", + "window-stack": "\f6d2", + "window-x": "\f6d3", + "xbox": "\f6d4", + "ethernet": "\f6d5", + "hdmi-fill": "\f6d6", + "hdmi": "\f6d7", + "usb-c-fill": "\f6d8", + "usb-c": "\f6d9", + "usb-fill": "\f6da", + "usb-plug-fill": "\f6db", + "usb-plug": "\f6dc", + "usb-symbol": "\f6dd", + "usb": "\f6de", + "boombox-fill": "\f6df", + "displayport": "\f6e1", + "gpu-card": "\f6e2", + "memory": "\f6e3", + "modem-fill": "\f6e4", + "modem": "\f6e5", + "motherboard-fill": "\f6e6", + "motherboard": "\f6e7", + "optical-audio-fill": "\f6e8", + "optical-audio": "\f6e9", + "pci-card": "\f6ea", + "router-fill": "\f6eb", + "router": "\f6ec", + "thunderbolt-fill": "\f6ef", + "thunderbolt": "\f6f0", + "usb-drive-fill": "\f6f1", + "usb-drive": "\f6f2", + "usb-micro-fill": "\f6f3", + "usb-micro": "\f6f4", + "usb-mini-fill": "\f6f5", + "usb-mini": "\f6f6", + "cloud-haze2": "\f6f7", + "device-hdd-fill": "\f6f8", + "device-hdd": "\f6f9", + "device-ssd-fill": "\f6fa", + "device-ssd": "\f6fb", + "displayport-fill": "\f6fc", + "mortarboard-fill": "\f6fd", + "mortarboard": "\f6fe", + "terminal-x": "\f6ff", + "arrow-through-heart-fill": "\f700", + "arrow-through-heart": "\f701", + "badge-sd-fill": "\f702", + "badge-sd": "\f703", + "bag-heart-fill": "\f704", + "bag-heart": "\f705", + "balloon-fill": "\f706", + "balloon-heart-fill": "\f707", + "balloon-heart": "\f708", + "balloon": "\f709", + "box2-fill": "\f70a", + "box2-heart-fill": "\f70b", + "box2-heart": "\f70c", + "box2": "\f70d", + "braces-asterisk": "\f70e", + "calendar-heart-fill": "\f70f", + "calendar-heart": "\f710", + "calendar2-heart-fill": "\f711", + "calendar2-heart": "\f712", + "chat-heart-fill": "\f713", + "chat-heart": "\f714", + "chat-left-heart-fill": "\f715", + "chat-left-heart": "\f716", + "chat-right-heart-fill": "\f717", + "chat-right-heart": "\f718", + "chat-square-heart-fill": "\f719", + "chat-square-heart": "\f71a", + "clipboard-check-fill": "\f71b", + "clipboard-data-fill": "\f71c", + "clipboard-fill": "\f71d", + "clipboard-heart-fill": "\f71e", + "clipboard-heart": "\f71f", + "clipboard-minus-fill": "\f720", + "clipboard-plus-fill": "\f721", + "clipboard-pulse": "\f722", + "clipboard-x-fill": "\f723", + "clipboard2-check-fill": "\f724", + "clipboard2-check": "\f725", + "clipboard2-data-fill": "\f726", + "clipboard2-data": "\f727", + "clipboard2-fill": "\f728", + "clipboard2-heart-fill": "\f729", + "clipboard2-heart": "\f72a", + "clipboard2-minus-fill": "\f72b", + "clipboard2-minus": "\f72c", + "clipboard2-plus-fill": "\f72d", + "clipboard2-plus": "\f72e", + "clipboard2-pulse-fill": "\f72f", + "clipboard2-pulse": "\f730", + "clipboard2-x-fill": "\f731", + "clipboard2-x": "\f732", + "clipboard2": "\f733", + "emoji-kiss-fill": "\f734", + "emoji-kiss": "\f735", + "envelope-heart-fill": "\f736", + "envelope-heart": "\f737", + "envelope-open-heart-fill": "\f738", + "envelope-open-heart": "\f739", + "envelope-paper-fill": "\f73a", + "envelope-paper-heart-fill": "\f73b", + "envelope-paper-heart": "\f73c", + "envelope-paper": "\f73d", + "filetype-aac": "\f73e", + "filetype-ai": "\f73f", + "filetype-bmp": "\f740", + "filetype-cs": "\f741", + "filetype-css": "\f742", + "filetype-csv": "\f743", + "filetype-doc": "\f744", + "filetype-docx": "\f745", + "filetype-exe": "\f746", + "filetype-gif": "\f747", + "filetype-heic": "\f748", + "filetype-html": "\f749", + "filetype-java": "\f74a", + "filetype-jpg": "\f74b", + "filetype-js": "\f74c", + "filetype-jsx": "\f74d", + "filetype-key": "\f74e", + "filetype-m4p": "\f74f", + "filetype-md": "\f750", + "filetype-mdx": "\f751", + "filetype-mov": "\f752", + "filetype-mp3": "\f753", + "filetype-mp4": "\f754", + "filetype-otf": "\f755", + "filetype-pdf": "\f756", + "filetype-php": "\f757", + "filetype-png": "\f758", + "filetype-ppt": "\f75a", + "filetype-psd": "\f75b", + "filetype-py": "\f75c", + "filetype-raw": "\f75d", + "filetype-rb": "\f75e", + "filetype-sass": "\f75f", + "filetype-scss": "\f760", + "filetype-sh": "\f761", + "filetype-svg": "\f762", + "filetype-tiff": "\f763", + "filetype-tsx": "\f764", + "filetype-ttf": "\f765", + "filetype-txt": "\f766", + "filetype-wav": "\f767", + "filetype-woff": "\f768", + "filetype-xls": "\f76a", + "filetype-xml": "\f76b", + "filetype-yml": "\f76c", + "heart-arrow": "\f76d", + "heart-pulse-fill": "\f76e", + "heart-pulse": "\f76f", + "heartbreak-fill": "\f770", + "heartbreak": "\f771", + "hearts": "\f772", + "hospital-fill": "\f773", + "hospital": "\f774", + "house-heart-fill": "\f775", + "house-heart": "\f776", + "incognito": "\f777", + "magnet-fill": "\f778", + "magnet": "\f779", + "person-heart": "\f77a", + "person-hearts": "\f77b", + "phone-flip": "\f77c", + "plugin": "\f77d", + "postage-fill": "\f77e", + "postage-heart-fill": "\f77f", + "postage-heart": "\f780", + "postage": "\f781", + "postcard-fill": "\f782", + "postcard-heart-fill": "\f783", + "postcard-heart": "\f784", + "postcard": "\f785", + "search-heart-fill": "\f786", + "search-heart": "\f787", + "sliders2-vertical": "\f788", + "sliders2": "\f789", + "trash3-fill": "\f78a", + "trash3": "\f78b", + "valentine": "\f78c", + "valentine2": "\f78d", + "wrench-adjustable-circle-fill": "\f78e", + "wrench-adjustable-circle": "\f78f", + "wrench-adjustable": "\f790", + "filetype-json": "\f791", + "filetype-pptx": "\f792", + "filetype-xlsx": "\f793", + "1-circle-fill": "\f796", + "1-circle": "\f797", + "1-square-fill": "\f798", + "1-square": "\f799", + "2-circle-fill": "\f79c", + "2-circle": "\f79d", + "2-square-fill": "\f79e", + "2-square": "\f79f", + "3-circle-fill": "\f7a2", + "3-circle": "\f7a3", + "3-square-fill": "\f7a4", + "3-square": "\f7a5", + "4-circle-fill": "\f7a8", + "4-circle": "\f7a9", + "4-square-fill": "\f7aa", + "4-square": "\f7ab", + "5-circle-fill": "\f7ae", + "5-circle": "\f7af", + "5-square-fill": "\f7b0", + "5-square": "\f7b1", + "6-circle-fill": "\f7b4", + "6-circle": "\f7b5", + "6-square-fill": "\f7b6", + "6-square": "\f7b7", + "7-circle-fill": "\f7ba", + "7-circle": "\f7bb", + "7-square-fill": "\f7bc", + "7-square": "\f7bd", + "8-circle-fill": "\f7c0", + "8-circle": "\f7c1", + "8-square-fill": "\f7c2", + "8-square": "\f7c3", + "9-circle-fill": "\f7c6", + "9-circle": "\f7c7", + "9-square-fill": "\f7c8", + "9-square": "\f7c9", + "airplane-engines-fill": "\f7ca", + "airplane-engines": "\f7cb", + "airplane-fill": "\f7cc", + "airplane": "\f7cd", + "alexa": "\f7ce", + "alipay": "\f7cf", + "android": "\f7d0", + "android2": "\f7d1", + "box-fill": "\f7d2", + "box-seam-fill": "\f7d3", + "browser-chrome": "\f7d4", + "browser-edge": "\f7d5", + "browser-firefox": "\f7d6", + "browser-safari": "\f7d7", + "c-circle-fill": "\f7da", + "c-circle": "\f7db", + "c-square-fill": "\f7dc", + "c-square": "\f7dd", + "capsule-pill": "\f7de", + "capsule": "\f7df", + "car-front-fill": "\f7e0", + "car-front": "\f7e1", + "cassette-fill": "\f7e2", + "cassette": "\f7e3", + "cc-circle-fill": "\f7e6", + "cc-circle": "\f7e7", + "cc-square-fill": "\f7e8", + "cc-square": "\f7e9", + "cup-hot-fill": "\f7ea", + "cup-hot": "\f7eb", + "currency-rupee": "\f7ec", + "dropbox": "\f7ed", + "escape": "\f7ee", + "fast-forward-btn-fill": "\f7ef", + "fast-forward-btn": "\f7f0", + "fast-forward-circle-fill": "\f7f1", + "fast-forward-circle": "\f7f2", + "fast-forward-fill": "\f7f3", + "fast-forward": "\f7f4", + "filetype-sql": "\f7f5", + "fire": "\f7f6", + "google-play": "\f7f7", + "h-circle-fill": "\f7fa", + "h-circle": "\f7fb", + "h-square-fill": "\f7fc", + "h-square": "\f7fd", + "indent": "\f7fe", + "lungs-fill": "\f7ff", + "lungs": "\f800", + "microsoft-teams": "\f801", + "p-circle-fill": "\f804", + "p-circle": "\f805", + "p-square-fill": "\f806", + "p-square": "\f807", + "pass-fill": "\f808", + "pass": "\f809", + "prescription": "\f80a", + "prescription2": "\f80b", + "r-circle-fill": "\f80e", + "r-circle": "\f80f", + "r-square-fill": "\f810", + "r-square": "\f811", + "repeat-1": "\f812", + "repeat": "\f813", + "rewind-btn-fill": "\f814", + "rewind-btn": "\f815", + "rewind-circle-fill": "\f816", + "rewind-circle": "\f817", + "rewind-fill": "\f818", + "rewind": "\f819", + "train-freight-front-fill": "\f81a", + "train-freight-front": "\f81b", + "train-front-fill": "\f81c", + "train-front": "\f81d", + "train-lightrail-front-fill": "\f81e", + "train-lightrail-front": "\f81f", + "truck-front-fill": "\f820", + "truck-front": "\f821", + "ubuntu": "\f822", + "unindent": "\f823", + "unity": "\f824", + "universal-access-circle": "\f825", + "universal-access": "\f826", + "virus": "\f827", + "virus2": "\f828", + "wechat": "\f829", + "yelp": "\f82a", + "sign-stop-fill": "\f82b", + "sign-stop-lights-fill": "\f82c", + "sign-stop-lights": "\f82d", + "sign-stop": "\f82e", + "sign-turn-left-fill": "\f82f", + "sign-turn-left": "\f830", + "sign-turn-right-fill": "\f831", + "sign-turn-right": "\f832", + "sign-turn-slight-left-fill": "\f833", + "sign-turn-slight-left": "\f834", + "sign-turn-slight-right-fill": "\f835", + "sign-turn-slight-right": "\f836", + "sign-yield-fill": "\f837", + "sign-yield": "\f838", + "ev-station-fill": "\f839", + "ev-station": "\f83a", + "fuel-pump-diesel-fill": "\f83b", + "fuel-pump-diesel": "\f83c", + "fuel-pump-fill": "\f83d", + "fuel-pump": "\f83e", + "0-circle-fill": "\f83f", + "0-circle": "\f840", + "0-square-fill": "\f841", + "0-square": "\f842", + "rocket-fill": "\f843", + "rocket-takeoff-fill": "\f844", + "rocket-takeoff": "\f845", + "rocket": "\f846", + "stripe": "\f847", + "subscript": "\f848", + "superscript": "\f849", + "trello": "\f84a", + "envelope-at-fill": "\f84b", + "envelope-at": "\f84c", + "regex": "\f84d", + "text-wrap": "\f84e", + "sign-dead-end-fill": "\f84f", + "sign-dead-end": "\f850", + "sign-do-not-enter-fill": "\f851", + "sign-do-not-enter": "\f852", + "sign-intersection-fill": "\f853", + "sign-intersection-side-fill": "\f854", + "sign-intersection-side": "\f855", + "sign-intersection-t-fill": "\f856", + "sign-intersection-t": "\f857", + "sign-intersection-y-fill": "\f858", + "sign-intersection-y": "\f859", + "sign-intersection": "\f85a", + "sign-merge-left-fill": "\f85b", + "sign-merge-left": "\f85c", + "sign-merge-right-fill": "\f85d", + "sign-merge-right": "\f85e", + "sign-no-left-turn-fill": "\f85f", + "sign-no-left-turn": "\f860", + "sign-no-parking-fill": "\f861", + "sign-no-parking": "\f862", + "sign-no-right-turn-fill": "\f863", + "sign-no-right-turn": "\f864", + "sign-railroad-fill": "\f865", + "sign-railroad": "\f866", + "building-add": "\f867", + "building-check": "\f868", + "building-dash": "\f869", + "building-down": "\f86a", + "building-exclamation": "\f86b", + "building-fill-add": "\f86c", + "building-fill-check": "\f86d", + "building-fill-dash": "\f86e", + "building-fill-down": "\f86f", + "building-fill-exclamation": "\f870", + "building-fill-gear": "\f871", + "building-fill-lock": "\f872", + "building-fill-slash": "\f873", + "building-fill-up": "\f874", + "building-fill-x": "\f875", + "building-fill": "\f876", + "building-gear": "\f877", + "building-lock": "\f878", + "building-slash": "\f879", + "building-up": "\f87a", + "building-x": "\f87b", + "buildings-fill": "\f87c", + "buildings": "\f87d", + "bus-front-fill": "\f87e", + "bus-front": "\f87f", + "ev-front-fill": "\f880", + "ev-front": "\f881", + "globe-americas": "\f882", + "globe-asia-australia": "\f883", + "globe-central-south-asia": "\f884", + "globe-europe-africa": "\f885", + "house-add-fill": "\f886", + "house-add": "\f887", + "house-check-fill": "\f888", + "house-check": "\f889", + "house-dash-fill": "\f88a", + "house-dash": "\f88b", + "house-down-fill": "\f88c", + "house-down": "\f88d", + "house-exclamation-fill": "\f88e", + "house-exclamation": "\f88f", + "house-gear-fill": "\f890", + "house-gear": "\f891", + "house-lock-fill": "\f892", + "house-lock": "\f893", + "house-slash-fill": "\f894", + "house-slash": "\f895", + "house-up-fill": "\f896", + "house-up": "\f897", + "house-x-fill": "\f898", + "house-x": "\f899", + "person-add": "\f89a", + "person-down": "\f89b", + "person-exclamation": "\f89c", + "person-fill-add": "\f89d", + "person-fill-check": "\f89e", + "person-fill-dash": "\f89f", + "person-fill-down": "\f8a0", + "person-fill-exclamation": "\f8a1", + "person-fill-gear": "\f8a2", + "person-fill-lock": "\f8a3", + "person-fill-slash": "\f8a4", + "person-fill-up": "\f8a5", + "person-fill-x": "\f8a6", + "person-gear": "\f8a7", + "person-lock": "\f8a8", + "person-slash": "\f8a9", + "person-up": "\f8aa", + "scooter": "\f8ab", + "taxi-front-fill": "\f8ac", + "taxi-front": "\f8ad", + "amd": "\f8ae", + "database-add": "\f8af", + "database-check": "\f8b0", + "database-dash": "\f8b1", + "database-down": "\f8b2", + "database-exclamation": "\f8b3", + "database-fill-add": "\f8b4", + "database-fill-check": "\f8b5", + "database-fill-dash": "\f8b6", + "database-fill-down": "\f8b7", + "database-fill-exclamation": "\f8b8", + "database-fill-gear": "\f8b9", + "database-fill-lock": "\f8ba", + "database-fill-slash": "\f8bb", + "database-fill-up": "\f8bc", + "database-fill-x": "\f8bd", + "database-fill": "\f8be", + "database-gear": "\f8bf", + "database-lock": "\f8c0", + "database-slash": "\f8c1", + "database-up": "\f8c2", + "database-x": "\f8c3", + "database": "\f8c4", + "houses-fill": "\f8c5", + "houses": "\f8c6", + "nvidia": "\f8c7", + "person-vcard-fill": "\f8c8", + "person-vcard": "\f8c9", + "sina-weibo": "\f8ca", + "tencent-qq": "\f8cb", + "wikipedia": "\f8cc", + "alphabet-uppercase": "\f2a5", + "alphabet": "\f68a", + "amazon": "\f68d", + "arrows-collapse-vertical": "\f690", + "arrows-expand-vertical": "\f695", + "arrows-vertical": "\f698", + "arrows": "\f6a2", + "ban-fill": "\f6a3", + "ban": "\f6b6", + "bing": "\f6c2", + "cake": "\f6e0", + "cake2": "\f6ed", + "cookie": "\f6ee", + "copy": "\f759", + "crosshair": "\f769", + "crosshair2": "\f794", + "emoji-astonished-fill": "\f795", + "emoji-astonished": "\f79a", + "emoji-grimace-fill": "\f79b", + "emoji-grimace": "\f7a0", + "emoji-grin-fill": "\f7a1", + "emoji-grin": "\f7a6", + "emoji-surprise-fill": "\f7a7", + "emoji-surprise": "\f7ac", + "emoji-tear-fill": "\f7ad", + "emoji-tear": "\f7b2", + "envelope-arrow-down-fill": "\f7b3", + "envelope-arrow-down": "\f7b8", + "envelope-arrow-up-fill": "\f7b9", + "envelope-arrow-up": "\f7be", + "feather": "\f7bf", + "feather2": "\f7c4", + "floppy-fill": "\f7c5", + "floppy": "\f7d8", + "floppy2-fill": "\f7d9", + "floppy2": "\f7e4", + "gitlab": "\f7e5", + "highlighter": "\f7f8", + "marker-tip": "\f802", + "nvme-fill": "\f803", + "nvme": "\f80c", + "opencollective": "\f80d", + "pci-card-network": "\f8cd", + "pci-card-sound": "\f8ce", + "radar": "\f8cf", + "send-arrow-down-fill": "\f8d0", + "send-arrow-down": "\f8d1", + "send-arrow-up-fill": "\f8d2", + "send-arrow-up": "\f8d3", + "sim-slash-fill": "\f8d4", + "sim-slash": "\f8d5", + "sourceforge": "\f8d6", + "substack": "\f8d7", + "threads-fill": "\f8d8", + "threads": "\f8d9", + "transparency": "\f8da", + "twitter-x": "\f8db", + "type-h4": "\f8dc", + "type-h5": "\f8dd", + "type-h6": "\f8de", + "backpack-fill": "\f8df", + "backpack": "\f8e0", + "backpack2-fill": "\f8e1", + "backpack2": "\f8e2", + "backpack3-fill": "\f8e3", + "backpack3": "\f8e4", + "backpack4-fill": "\f8e5", + "backpack4": "\f8e6", + "brilliance": "\f8e7", + "cake-fill": "\f8e8", + "cake2-fill": "\f8e9", + "duffle-fill": "\f8ea", + "duffle": "\f8eb", + "exposure": "\f8ec", + "gender-neuter": "\f8ed", + "highlights": "\f8ee", + "luggage-fill": "\f8ef", + "luggage": "\f8f0", + "mailbox-flag": "\f8f1", + "mailbox2-flag": "\f8f2", + "noise-reduction": "\f8f3", + "passport-fill": "\f8f4", + "passport": "\f8f5", + "person-arms-up": "\f8f6", + "person-raised-hand": "\f8f7", + "person-standing-dress": "\f8f8", + "person-standing": "\f8f9", + "person-walking": "\f8fa", + "person-wheelchair": "\f8fb", + "shadows": "\f8fc", + "suitcase-fill": "\f8fd", + "suitcase-lg-fill": "\f8fe", + "suitcase-lg": "\f8ff", + "suitcase": "\f900", + "suitcase2-fill": "\f901", + "suitcase2": "\f902", + "vignette": "\f903", +); + +@each $icon, $codepoint in $bootstrap-icons-map { + .bi-#{$icon}::before { content: $codepoint; } +} diff --git a/assets/static/bootstrap-icons/font/fonts/bootstrap-icons.woff b/assets/static/bootstrap-icons/font/fonts/bootstrap-icons.woff new file mode 100644 index 0000000..51204d2 Binary files /dev/null and b/assets/static/bootstrap-icons/font/fonts/bootstrap-icons.woff differ diff --git a/assets/static/bootstrap-icons/font/fonts/bootstrap-icons.woff2 b/assets/static/bootstrap-icons/font/fonts/bootstrap-icons.woff2 new file mode 100644 index 0000000..92c4830 Binary files /dev/null and b/assets/static/bootstrap-icons/font/fonts/bootstrap-icons.woff2 differ diff --git a/assets/static/bootstrap-icons/fonts.svg b/assets/static/bootstrap-icons/fonts.svg new file mode 100644 index 0000000..5e1f3c3 --- /dev/null +++ b/assets/static/bootstrap-icons/fonts.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/forward-fill.svg b/assets/static/bootstrap-icons/forward-fill.svg new file mode 100644 index 0000000..27462e2 --- /dev/null +++ b/assets/static/bootstrap-icons/forward-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/forward.svg b/assets/static/bootstrap-icons/forward.svg new file mode 100644 index 0000000..ffe887c --- /dev/null +++ b/assets/static/bootstrap-icons/forward.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/front.svg b/assets/static/bootstrap-icons/front.svg new file mode 100644 index 0000000..59d854e --- /dev/null +++ b/assets/static/bootstrap-icons/front.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/fuel-pump-diesel-fill.svg b/assets/static/bootstrap-icons/fuel-pump-diesel-fill.svg new file mode 100644 index 0000000..997d6f8 --- /dev/null +++ b/assets/static/bootstrap-icons/fuel-pump-diesel-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/fuel-pump-diesel.svg b/assets/static/bootstrap-icons/fuel-pump-diesel.svg new file mode 100644 index 0000000..e170eeb --- /dev/null +++ b/assets/static/bootstrap-icons/fuel-pump-diesel.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/fuel-pump-fill.svg b/assets/static/bootstrap-icons/fuel-pump-fill.svg new file mode 100644 index 0000000..46f92c3 --- /dev/null +++ b/assets/static/bootstrap-icons/fuel-pump-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/fuel-pump.svg b/assets/static/bootstrap-icons/fuel-pump.svg new file mode 100644 index 0000000..1704a6f --- /dev/null +++ b/assets/static/bootstrap-icons/fuel-pump.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/fullscreen-exit.svg b/assets/static/bootstrap-icons/fullscreen-exit.svg new file mode 100644 index 0000000..cfde3a3 --- /dev/null +++ b/assets/static/bootstrap-icons/fullscreen-exit.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/fullscreen.svg b/assets/static/bootstrap-icons/fullscreen.svg new file mode 100644 index 0000000..d4f8a83 --- /dev/null +++ b/assets/static/bootstrap-icons/fullscreen.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/funnel-fill.svg b/assets/static/bootstrap-icons/funnel-fill.svg new file mode 100644 index 0000000..04d31a6 --- /dev/null +++ b/assets/static/bootstrap-icons/funnel-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/funnel.svg b/assets/static/bootstrap-icons/funnel.svg new file mode 100644 index 0000000..28bfcf2 --- /dev/null +++ b/assets/static/bootstrap-icons/funnel.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/gear-fill.svg b/assets/static/bootstrap-icons/gear-fill.svg new file mode 100644 index 0000000..ba8e2c5 --- /dev/null +++ b/assets/static/bootstrap-icons/gear-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/gear-wide-connected.svg b/assets/static/bootstrap-icons/gear-wide-connected.svg new file mode 100644 index 0000000..19ddda9 --- /dev/null +++ b/assets/static/bootstrap-icons/gear-wide-connected.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/gear-wide.svg b/assets/static/bootstrap-icons/gear-wide.svg new file mode 100644 index 0000000..c5de567 --- /dev/null +++ b/assets/static/bootstrap-icons/gear-wide.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/gear.svg b/assets/static/bootstrap-icons/gear.svg new file mode 100644 index 0000000..30cfaa3 --- /dev/null +++ b/assets/static/bootstrap-icons/gear.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/gem.svg b/assets/static/bootstrap-icons/gem.svg new file mode 100644 index 0000000..f56d871 --- /dev/null +++ b/assets/static/bootstrap-icons/gem.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/gender-ambiguous.svg b/assets/static/bootstrap-icons/gender-ambiguous.svg new file mode 100644 index 0000000..674c526 --- /dev/null +++ b/assets/static/bootstrap-icons/gender-ambiguous.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/gender-female.svg b/assets/static/bootstrap-icons/gender-female.svg new file mode 100644 index 0000000..ae6dc27 --- /dev/null +++ b/assets/static/bootstrap-icons/gender-female.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/gender-male.svg b/assets/static/bootstrap-icons/gender-male.svg new file mode 100644 index 0000000..3931921 --- /dev/null +++ b/assets/static/bootstrap-icons/gender-male.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/gender-neuter.svg b/assets/static/bootstrap-icons/gender-neuter.svg new file mode 100644 index 0000000..133db1a --- /dev/null +++ b/assets/static/bootstrap-icons/gender-neuter.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/gender-trans.svg b/assets/static/bootstrap-icons/gender-trans.svg new file mode 100644 index 0000000..005e6f8 --- /dev/null +++ b/assets/static/bootstrap-icons/gender-trans.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/geo-alt-fill.svg b/assets/static/bootstrap-icons/geo-alt-fill.svg new file mode 100644 index 0000000..77f0478 --- /dev/null +++ b/assets/static/bootstrap-icons/geo-alt-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/geo-alt.svg b/assets/static/bootstrap-icons/geo-alt.svg new file mode 100644 index 0000000..20e18ba --- /dev/null +++ b/assets/static/bootstrap-icons/geo-alt.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/geo-fill.svg b/assets/static/bootstrap-icons/geo-fill.svg new file mode 100644 index 0000000..9678fa0 --- /dev/null +++ b/assets/static/bootstrap-icons/geo-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/geo.svg b/assets/static/bootstrap-icons/geo.svg new file mode 100644 index 0000000..2382b91 --- /dev/null +++ b/assets/static/bootstrap-icons/geo.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/gift-fill.svg b/assets/static/bootstrap-icons/gift-fill.svg new file mode 100644 index 0000000..bd78a8c --- /dev/null +++ b/assets/static/bootstrap-icons/gift-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/gift.svg b/assets/static/bootstrap-icons/gift.svg new file mode 100644 index 0000000..5921507 --- /dev/null +++ b/assets/static/bootstrap-icons/gift.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/git.svg b/assets/static/bootstrap-icons/git.svg new file mode 100644 index 0000000..0979cdb --- /dev/null +++ b/assets/static/bootstrap-icons/git.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/github.svg b/assets/static/bootstrap-icons/github.svg new file mode 100644 index 0000000..013e025 --- /dev/null +++ b/assets/static/bootstrap-icons/github.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/gitlab.svg b/assets/static/bootstrap-icons/gitlab.svg new file mode 100644 index 0000000..f8875f8 --- /dev/null +++ b/assets/static/bootstrap-icons/gitlab.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/globe-americas.svg b/assets/static/bootstrap-icons/globe-americas.svg new file mode 100644 index 0000000..5dcc7b2 --- /dev/null +++ b/assets/static/bootstrap-icons/globe-americas.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/globe-asia-australia.svg b/assets/static/bootstrap-icons/globe-asia-australia.svg new file mode 100644 index 0000000..8c27539 --- /dev/null +++ b/assets/static/bootstrap-icons/globe-asia-australia.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/globe-central-south-asia.svg b/assets/static/bootstrap-icons/globe-central-south-asia.svg new file mode 100644 index 0000000..80a13c1 --- /dev/null +++ b/assets/static/bootstrap-icons/globe-central-south-asia.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/globe-europe-africa.svg b/assets/static/bootstrap-icons/globe-europe-africa.svg new file mode 100644 index 0000000..c1c5dcb --- /dev/null +++ b/assets/static/bootstrap-icons/globe-europe-africa.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/globe.svg b/assets/static/bootstrap-icons/globe.svg new file mode 100644 index 0000000..835ff66 --- /dev/null +++ b/assets/static/bootstrap-icons/globe.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/globe2.svg b/assets/static/bootstrap-icons/globe2.svg new file mode 100644 index 0000000..b302063 --- /dev/null +++ b/assets/static/bootstrap-icons/globe2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/google-play.svg b/assets/static/bootstrap-icons/google-play.svg new file mode 100644 index 0000000..0751c90 --- /dev/null +++ b/assets/static/bootstrap-icons/google-play.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/google.svg b/assets/static/bootstrap-icons/google.svg new file mode 100644 index 0000000..9f603de --- /dev/null +++ b/assets/static/bootstrap-icons/google.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/gpu-card.svg b/assets/static/bootstrap-icons/gpu-card.svg new file mode 100644 index 0000000..6ec3152 --- /dev/null +++ b/assets/static/bootstrap-icons/gpu-card.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/graph-down-arrow.svg b/assets/static/bootstrap-icons/graph-down-arrow.svg new file mode 100644 index 0000000..d811884 --- /dev/null +++ b/assets/static/bootstrap-icons/graph-down-arrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/graph-down.svg b/assets/static/bootstrap-icons/graph-down.svg new file mode 100644 index 0000000..47dd647 --- /dev/null +++ b/assets/static/bootstrap-icons/graph-down.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/graph-up-arrow.svg b/assets/static/bootstrap-icons/graph-up-arrow.svg new file mode 100644 index 0000000..7eda5f4 --- /dev/null +++ b/assets/static/bootstrap-icons/graph-up-arrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/graph-up.svg b/assets/static/bootstrap-icons/graph-up.svg new file mode 100644 index 0000000..15e0bbf --- /dev/null +++ b/assets/static/bootstrap-icons/graph-up.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/grid-1x2-fill.svg b/assets/static/bootstrap-icons/grid-1x2-fill.svg new file mode 100644 index 0000000..cc568cb --- /dev/null +++ b/assets/static/bootstrap-icons/grid-1x2-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/grid-1x2.svg b/assets/static/bootstrap-icons/grid-1x2.svg new file mode 100644 index 0000000..69ec79f --- /dev/null +++ b/assets/static/bootstrap-icons/grid-1x2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/grid-3x2-gap-fill.svg b/assets/static/bootstrap-icons/grid-3x2-gap-fill.svg new file mode 100644 index 0000000..9c0e855 --- /dev/null +++ b/assets/static/bootstrap-icons/grid-3x2-gap-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/grid-3x2-gap.svg b/assets/static/bootstrap-icons/grid-3x2-gap.svg new file mode 100644 index 0000000..730ae65 --- /dev/null +++ b/assets/static/bootstrap-icons/grid-3x2-gap.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/grid-3x2.svg b/assets/static/bootstrap-icons/grid-3x2.svg new file mode 100644 index 0000000..55ff9bb --- /dev/null +++ b/assets/static/bootstrap-icons/grid-3x2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/grid-3x3-gap-fill.svg b/assets/static/bootstrap-icons/grid-3x3-gap-fill.svg new file mode 100644 index 0000000..982cb70 --- /dev/null +++ b/assets/static/bootstrap-icons/grid-3x3-gap-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/grid-3x3-gap.svg b/assets/static/bootstrap-icons/grid-3x3-gap.svg new file mode 100644 index 0000000..bbf8ce4 --- /dev/null +++ b/assets/static/bootstrap-icons/grid-3x3-gap.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/grid-3x3.svg b/assets/static/bootstrap-icons/grid-3x3.svg new file mode 100644 index 0000000..d56aed7 --- /dev/null +++ b/assets/static/bootstrap-icons/grid-3x3.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/grid-fill.svg b/assets/static/bootstrap-icons/grid-fill.svg new file mode 100644 index 0000000..356cc8f --- /dev/null +++ b/assets/static/bootstrap-icons/grid-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/grid.svg b/assets/static/bootstrap-icons/grid.svg new file mode 100644 index 0000000..eebab73 --- /dev/null +++ b/assets/static/bootstrap-icons/grid.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/grip-horizontal.svg b/assets/static/bootstrap-icons/grip-horizontal.svg new file mode 100644 index 0000000..85f7e27 --- /dev/null +++ b/assets/static/bootstrap-icons/grip-horizontal.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/grip-vertical.svg b/assets/static/bootstrap-icons/grip-vertical.svg new file mode 100644 index 0000000..a8718ab --- /dev/null +++ b/assets/static/bootstrap-icons/grip-vertical.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/h-circle-fill.svg b/assets/static/bootstrap-icons/h-circle-fill.svg new file mode 100644 index 0000000..9106472 --- /dev/null +++ b/assets/static/bootstrap-icons/h-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/h-circle.svg b/assets/static/bootstrap-icons/h-circle.svg new file mode 100644 index 0000000..53c34b6 --- /dev/null +++ b/assets/static/bootstrap-icons/h-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/h-square-fill.svg b/assets/static/bootstrap-icons/h-square-fill.svg new file mode 100644 index 0000000..06269e0 --- /dev/null +++ b/assets/static/bootstrap-icons/h-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/h-square.svg b/assets/static/bootstrap-icons/h-square.svg new file mode 100644 index 0000000..2c5ad2c --- /dev/null +++ b/assets/static/bootstrap-icons/h-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hammer.svg b/assets/static/bootstrap-icons/hammer.svg new file mode 100644 index 0000000..8e07b5b --- /dev/null +++ b/assets/static/bootstrap-icons/hammer.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hand-index-fill.svg b/assets/static/bootstrap-icons/hand-index-fill.svg new file mode 100644 index 0000000..b2a7d64 --- /dev/null +++ b/assets/static/bootstrap-icons/hand-index-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hand-index-thumb-fill.svg b/assets/static/bootstrap-icons/hand-index-thumb-fill.svg new file mode 100644 index 0000000..774b18e --- /dev/null +++ b/assets/static/bootstrap-icons/hand-index-thumb-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hand-index-thumb.svg b/assets/static/bootstrap-icons/hand-index-thumb.svg new file mode 100644 index 0000000..13b5475 --- /dev/null +++ b/assets/static/bootstrap-icons/hand-index-thumb.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hand-index.svg b/assets/static/bootstrap-icons/hand-index.svg new file mode 100644 index 0000000..725757b --- /dev/null +++ b/assets/static/bootstrap-icons/hand-index.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hand-thumbs-down-fill.svg b/assets/static/bootstrap-icons/hand-thumbs-down-fill.svg new file mode 100644 index 0000000..53584f3 --- /dev/null +++ b/assets/static/bootstrap-icons/hand-thumbs-down-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hand-thumbs-down.svg b/assets/static/bootstrap-icons/hand-thumbs-down.svg new file mode 100644 index 0000000..f87f523 --- /dev/null +++ b/assets/static/bootstrap-icons/hand-thumbs-down.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hand-thumbs-up-fill.svg b/assets/static/bootstrap-icons/hand-thumbs-up-fill.svg new file mode 100644 index 0000000..c68bc07 --- /dev/null +++ b/assets/static/bootstrap-icons/hand-thumbs-up-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hand-thumbs-up.svg b/assets/static/bootstrap-icons/hand-thumbs-up.svg new file mode 100644 index 0000000..dc46d4d --- /dev/null +++ b/assets/static/bootstrap-icons/hand-thumbs-up.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/handbag-fill.svg b/assets/static/bootstrap-icons/handbag-fill.svg new file mode 100644 index 0000000..5f8f23f --- /dev/null +++ b/assets/static/bootstrap-icons/handbag-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/handbag.svg b/assets/static/bootstrap-icons/handbag.svg new file mode 100644 index 0000000..c9ef874 --- /dev/null +++ b/assets/static/bootstrap-icons/handbag.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hash.svg b/assets/static/bootstrap-icons/hash.svg new file mode 100644 index 0000000..f67d000 --- /dev/null +++ b/assets/static/bootstrap-icons/hash.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hdd-fill.svg b/assets/static/bootstrap-icons/hdd-fill.svg new file mode 100644 index 0000000..dbeda24 --- /dev/null +++ b/assets/static/bootstrap-icons/hdd-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hdd-network-fill.svg b/assets/static/bootstrap-icons/hdd-network-fill.svg new file mode 100644 index 0000000..a74874d --- /dev/null +++ b/assets/static/bootstrap-icons/hdd-network-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hdd-network.svg b/assets/static/bootstrap-icons/hdd-network.svg new file mode 100644 index 0000000..7223542 --- /dev/null +++ b/assets/static/bootstrap-icons/hdd-network.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hdd-rack-fill.svg b/assets/static/bootstrap-icons/hdd-rack-fill.svg new file mode 100644 index 0000000..7c33aec --- /dev/null +++ b/assets/static/bootstrap-icons/hdd-rack-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hdd-rack.svg b/assets/static/bootstrap-icons/hdd-rack.svg new file mode 100644 index 0000000..d19a514 --- /dev/null +++ b/assets/static/bootstrap-icons/hdd-rack.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hdd-stack-fill.svg b/assets/static/bootstrap-icons/hdd-stack-fill.svg new file mode 100644 index 0000000..27e8719 --- /dev/null +++ b/assets/static/bootstrap-icons/hdd-stack-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hdd-stack.svg b/assets/static/bootstrap-icons/hdd-stack.svg new file mode 100644 index 0000000..f9095e5 --- /dev/null +++ b/assets/static/bootstrap-icons/hdd-stack.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hdd.svg b/assets/static/bootstrap-icons/hdd.svg new file mode 100644 index 0000000..92358f7 --- /dev/null +++ b/assets/static/bootstrap-icons/hdd.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hdmi-fill.svg b/assets/static/bootstrap-icons/hdmi-fill.svg new file mode 100644 index 0000000..435b39d --- /dev/null +++ b/assets/static/bootstrap-icons/hdmi-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hdmi.svg b/assets/static/bootstrap-icons/hdmi.svg new file mode 100644 index 0000000..09d0849 --- /dev/null +++ b/assets/static/bootstrap-icons/hdmi.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/headphones.svg b/assets/static/bootstrap-icons/headphones.svg new file mode 100644 index 0000000..d50b3ee --- /dev/null +++ b/assets/static/bootstrap-icons/headphones.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/headset-vr.svg b/assets/static/bootstrap-icons/headset-vr.svg new file mode 100644 index 0000000..0498bd6 --- /dev/null +++ b/assets/static/bootstrap-icons/headset-vr.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/headset.svg b/assets/static/bootstrap-icons/headset.svg new file mode 100644 index 0000000..a921156 --- /dev/null +++ b/assets/static/bootstrap-icons/headset.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/heart-arrow.svg b/assets/static/bootstrap-icons/heart-arrow.svg new file mode 100644 index 0000000..45eb6a5 --- /dev/null +++ b/assets/static/bootstrap-icons/heart-arrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/heart-fill.svg b/assets/static/bootstrap-icons/heart-fill.svg new file mode 100644 index 0000000..5e6b8ee --- /dev/null +++ b/assets/static/bootstrap-icons/heart-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/heart-half.svg b/assets/static/bootstrap-icons/heart-half.svg new file mode 100644 index 0000000..2e0dd31 --- /dev/null +++ b/assets/static/bootstrap-icons/heart-half.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/heart-pulse-fill.svg b/assets/static/bootstrap-icons/heart-pulse-fill.svg new file mode 100644 index 0000000..fc5e219 --- /dev/null +++ b/assets/static/bootstrap-icons/heart-pulse-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/heart-pulse.svg b/assets/static/bootstrap-icons/heart-pulse.svg new file mode 100644 index 0000000..dd957b3 --- /dev/null +++ b/assets/static/bootstrap-icons/heart-pulse.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/heart.svg b/assets/static/bootstrap-icons/heart.svg new file mode 100644 index 0000000..cd8eeb1 --- /dev/null +++ b/assets/static/bootstrap-icons/heart.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/heartbreak-fill.svg b/assets/static/bootstrap-icons/heartbreak-fill.svg new file mode 100644 index 0000000..335cb6a --- /dev/null +++ b/assets/static/bootstrap-icons/heartbreak-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/heartbreak.svg b/assets/static/bootstrap-icons/heartbreak.svg new file mode 100644 index 0000000..dcffc89 --- /dev/null +++ b/assets/static/bootstrap-icons/heartbreak.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hearts.svg b/assets/static/bootstrap-icons/hearts.svg new file mode 100644 index 0000000..ebd2dbb --- /dev/null +++ b/assets/static/bootstrap-icons/hearts.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/heptagon-fill.svg b/assets/static/bootstrap-icons/heptagon-fill.svg new file mode 100644 index 0000000..a339328 --- /dev/null +++ b/assets/static/bootstrap-icons/heptagon-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/heptagon-half.svg b/assets/static/bootstrap-icons/heptagon-half.svg new file mode 100644 index 0000000..b4fadcf --- /dev/null +++ b/assets/static/bootstrap-icons/heptagon-half.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/heptagon.svg b/assets/static/bootstrap-icons/heptagon.svg new file mode 100644 index 0000000..3140b8b --- /dev/null +++ b/assets/static/bootstrap-icons/heptagon.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hexagon-fill.svg b/assets/static/bootstrap-icons/hexagon-fill.svg new file mode 100644 index 0000000..50fdbfb --- /dev/null +++ b/assets/static/bootstrap-icons/hexagon-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hexagon-half.svg b/assets/static/bootstrap-icons/hexagon-half.svg new file mode 100644 index 0000000..452cb6e --- /dev/null +++ b/assets/static/bootstrap-icons/hexagon-half.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hexagon.svg b/assets/static/bootstrap-icons/hexagon.svg new file mode 100644 index 0000000..6e83939 --- /dev/null +++ b/assets/static/bootstrap-icons/hexagon.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/highlighter.svg b/assets/static/bootstrap-icons/highlighter.svg new file mode 100644 index 0000000..e26f1f7 --- /dev/null +++ b/assets/static/bootstrap-icons/highlighter.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/highlights.svg b/assets/static/bootstrap-icons/highlights.svg new file mode 100644 index 0000000..b43fca0 --- /dev/null +++ b/assets/static/bootstrap-icons/highlights.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hospital-fill.svg b/assets/static/bootstrap-icons/hospital-fill.svg new file mode 100644 index 0000000..55bde0f --- /dev/null +++ b/assets/static/bootstrap-icons/hospital-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hospital.svg b/assets/static/bootstrap-icons/hospital.svg new file mode 100644 index 0000000..f6bd0da --- /dev/null +++ b/assets/static/bootstrap-icons/hospital.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hourglass-bottom.svg b/assets/static/bootstrap-icons/hourglass-bottom.svg new file mode 100644 index 0000000..946f882 --- /dev/null +++ b/assets/static/bootstrap-icons/hourglass-bottom.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hourglass-split.svg b/assets/static/bootstrap-icons/hourglass-split.svg new file mode 100644 index 0000000..a9d1c51 --- /dev/null +++ b/assets/static/bootstrap-icons/hourglass-split.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hourglass-top.svg b/assets/static/bootstrap-icons/hourglass-top.svg new file mode 100644 index 0000000..6a8a4a3 --- /dev/null +++ b/assets/static/bootstrap-icons/hourglass-top.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hourglass.svg b/assets/static/bootstrap-icons/hourglass.svg new file mode 100644 index 0000000..44ede0a --- /dev/null +++ b/assets/static/bootstrap-icons/hourglass.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-add-fill.svg b/assets/static/bootstrap-icons/house-add-fill.svg new file mode 100644 index 0000000..1e814ee --- /dev/null +++ b/assets/static/bootstrap-icons/house-add-fill.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-add.svg b/assets/static/bootstrap-icons/house-add.svg new file mode 100644 index 0000000..2a89bbe --- /dev/null +++ b/assets/static/bootstrap-icons/house-add.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-check-fill.svg b/assets/static/bootstrap-icons/house-check-fill.svg new file mode 100644 index 0000000..f2ddeb9 --- /dev/null +++ b/assets/static/bootstrap-icons/house-check-fill.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-check.svg b/assets/static/bootstrap-icons/house-check.svg new file mode 100644 index 0000000..5bd7900 --- /dev/null +++ b/assets/static/bootstrap-icons/house-check.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-dash-fill.svg b/assets/static/bootstrap-icons/house-dash-fill.svg new file mode 100644 index 0000000..2fa8c57 --- /dev/null +++ b/assets/static/bootstrap-icons/house-dash-fill.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-dash.svg b/assets/static/bootstrap-icons/house-dash.svg new file mode 100644 index 0000000..b1cb832 --- /dev/null +++ b/assets/static/bootstrap-icons/house-dash.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-door-fill.svg b/assets/static/bootstrap-icons/house-door-fill.svg new file mode 100644 index 0000000..cf6d439 --- /dev/null +++ b/assets/static/bootstrap-icons/house-door-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-door.svg b/assets/static/bootstrap-icons/house-door.svg new file mode 100644 index 0000000..daa093b --- /dev/null +++ b/assets/static/bootstrap-icons/house-door.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-down-fill.svg b/assets/static/bootstrap-icons/house-down-fill.svg new file mode 100644 index 0000000..351904f --- /dev/null +++ b/assets/static/bootstrap-icons/house-down-fill.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-down.svg b/assets/static/bootstrap-icons/house-down.svg new file mode 100644 index 0000000..4d1d905 --- /dev/null +++ b/assets/static/bootstrap-icons/house-down.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-exclamation-fill.svg b/assets/static/bootstrap-icons/house-exclamation-fill.svg new file mode 100644 index 0000000..52fc0ae --- /dev/null +++ b/assets/static/bootstrap-icons/house-exclamation-fill.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-exclamation.svg b/assets/static/bootstrap-icons/house-exclamation.svg new file mode 100644 index 0000000..6d414f3 --- /dev/null +++ b/assets/static/bootstrap-icons/house-exclamation.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-fill.svg b/assets/static/bootstrap-icons/house-fill.svg new file mode 100644 index 0000000..89db164 --- /dev/null +++ b/assets/static/bootstrap-icons/house-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-gear-fill.svg b/assets/static/bootstrap-icons/house-gear-fill.svg new file mode 100644 index 0000000..9003152 --- /dev/null +++ b/assets/static/bootstrap-icons/house-gear-fill.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-gear.svg b/assets/static/bootstrap-icons/house-gear.svg new file mode 100644 index 0000000..65b5abb --- /dev/null +++ b/assets/static/bootstrap-icons/house-gear.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-heart-fill.svg b/assets/static/bootstrap-icons/house-heart-fill.svg new file mode 100644 index 0000000..be2e5f4 --- /dev/null +++ b/assets/static/bootstrap-icons/house-heart-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-heart.svg b/assets/static/bootstrap-icons/house-heart.svg new file mode 100644 index 0000000..ece6c06 --- /dev/null +++ b/assets/static/bootstrap-icons/house-heart.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-lock-fill.svg b/assets/static/bootstrap-icons/house-lock-fill.svg new file mode 100644 index 0000000..90cc8c7 --- /dev/null +++ b/assets/static/bootstrap-icons/house-lock-fill.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-lock.svg b/assets/static/bootstrap-icons/house-lock.svg new file mode 100644 index 0000000..8dc5894 --- /dev/null +++ b/assets/static/bootstrap-icons/house-lock.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-slash-fill.svg b/assets/static/bootstrap-icons/house-slash-fill.svg new file mode 100644 index 0000000..df8d7c6 --- /dev/null +++ b/assets/static/bootstrap-icons/house-slash-fill.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-slash.svg b/assets/static/bootstrap-icons/house-slash.svg new file mode 100644 index 0000000..a81b0ed --- /dev/null +++ b/assets/static/bootstrap-icons/house-slash.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-up-fill.svg b/assets/static/bootstrap-icons/house-up-fill.svg new file mode 100644 index 0000000..5e6a801 --- /dev/null +++ b/assets/static/bootstrap-icons/house-up-fill.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-up.svg b/assets/static/bootstrap-icons/house-up.svg new file mode 100644 index 0000000..da183d2 --- /dev/null +++ b/assets/static/bootstrap-icons/house-up.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-x-fill.svg b/assets/static/bootstrap-icons/house-x-fill.svg new file mode 100644 index 0000000..729cdb5 --- /dev/null +++ b/assets/static/bootstrap-icons/house-x-fill.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house-x.svg b/assets/static/bootstrap-icons/house-x.svg new file mode 100644 index 0000000..68137c0 --- /dev/null +++ b/assets/static/bootstrap-icons/house-x.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/house.svg b/assets/static/bootstrap-icons/house.svg new file mode 100644 index 0000000..cb57f68 --- /dev/null +++ b/assets/static/bootstrap-icons/house.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/houses-fill.svg b/assets/static/bootstrap-icons/houses-fill.svg new file mode 100644 index 0000000..63047bb --- /dev/null +++ b/assets/static/bootstrap-icons/houses-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/houses.svg b/assets/static/bootstrap-icons/houses.svg new file mode 100644 index 0000000..3a906be --- /dev/null +++ b/assets/static/bootstrap-icons/houses.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hr.svg b/assets/static/bootstrap-icons/hr.svg new file mode 100644 index 0000000..6e9fbd8 --- /dev/null +++ b/assets/static/bootstrap-icons/hr.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hurricane.svg b/assets/static/bootstrap-icons/hurricane.svg new file mode 100644 index 0000000..5bd9ae1 --- /dev/null +++ b/assets/static/bootstrap-icons/hurricane.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/hypnotize.svg b/assets/static/bootstrap-icons/hypnotize.svg new file mode 100644 index 0000000..6a28997 --- /dev/null +++ b/assets/static/bootstrap-icons/hypnotize.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/image-alt.svg b/assets/static/bootstrap-icons/image-alt.svg new file mode 100644 index 0000000..e56ee20 --- /dev/null +++ b/assets/static/bootstrap-icons/image-alt.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/image-fill.svg b/assets/static/bootstrap-icons/image-fill.svg new file mode 100644 index 0000000..db26ae8 --- /dev/null +++ b/assets/static/bootstrap-icons/image-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/image.svg b/assets/static/bootstrap-icons/image.svg new file mode 100644 index 0000000..152c333 --- /dev/null +++ b/assets/static/bootstrap-icons/image.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/images.svg b/assets/static/bootstrap-icons/images.svg new file mode 100644 index 0000000..adc7abf --- /dev/null +++ b/assets/static/bootstrap-icons/images.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/inbox-fill.svg b/assets/static/bootstrap-icons/inbox-fill.svg new file mode 100644 index 0000000..7e4816d --- /dev/null +++ b/assets/static/bootstrap-icons/inbox-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/inbox.svg b/assets/static/bootstrap-icons/inbox.svg new file mode 100644 index 0000000..b60e949 --- /dev/null +++ b/assets/static/bootstrap-icons/inbox.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/inboxes-fill.svg b/assets/static/bootstrap-icons/inboxes-fill.svg new file mode 100644 index 0000000..4d8c5f7 --- /dev/null +++ b/assets/static/bootstrap-icons/inboxes-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/inboxes.svg b/assets/static/bootstrap-icons/inboxes.svg new file mode 100644 index 0000000..1a074ac --- /dev/null +++ b/assets/static/bootstrap-icons/inboxes.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/incognito.svg b/assets/static/bootstrap-icons/incognito.svg new file mode 100644 index 0000000..f2c8f9d --- /dev/null +++ b/assets/static/bootstrap-icons/incognito.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/indent.svg b/assets/static/bootstrap-icons/indent.svg new file mode 100644 index 0000000..0065aba --- /dev/null +++ b/assets/static/bootstrap-icons/indent.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/infinity.svg b/assets/static/bootstrap-icons/infinity.svg new file mode 100644 index 0000000..3dca19b --- /dev/null +++ b/assets/static/bootstrap-icons/infinity.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/info-circle-fill.svg b/assets/static/bootstrap-icons/info-circle-fill.svg new file mode 100644 index 0000000..d2e382b --- /dev/null +++ b/assets/static/bootstrap-icons/info-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/info-circle.svg b/assets/static/bootstrap-icons/info-circle.svg new file mode 100644 index 0000000..e2b50eb --- /dev/null +++ b/assets/static/bootstrap-icons/info-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/info-lg.svg b/assets/static/bootstrap-icons/info-lg.svg new file mode 100644 index 0000000..ac064b9 --- /dev/null +++ b/assets/static/bootstrap-icons/info-lg.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/info-square-fill.svg b/assets/static/bootstrap-icons/info-square-fill.svg new file mode 100644 index 0000000..49196b4 --- /dev/null +++ b/assets/static/bootstrap-icons/info-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/info-square.svg b/assets/static/bootstrap-icons/info-square.svg new file mode 100644 index 0000000..b64cfa8 --- /dev/null +++ b/assets/static/bootstrap-icons/info-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/info.svg b/assets/static/bootstrap-icons/info.svg new file mode 100644 index 0000000..43dc242 --- /dev/null +++ b/assets/static/bootstrap-icons/info.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/input-cursor-text.svg b/assets/static/bootstrap-icons/input-cursor-text.svg new file mode 100644 index 0000000..fc910f3 --- /dev/null +++ b/assets/static/bootstrap-icons/input-cursor-text.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/input-cursor.svg b/assets/static/bootstrap-icons/input-cursor.svg new file mode 100644 index 0000000..de6a35f --- /dev/null +++ b/assets/static/bootstrap-icons/input-cursor.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/instagram.svg b/assets/static/bootstrap-icons/instagram.svg new file mode 100644 index 0000000..855e653 --- /dev/null +++ b/assets/static/bootstrap-icons/instagram.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/intersect.svg b/assets/static/bootstrap-icons/intersect.svg new file mode 100644 index 0000000..220141d --- /dev/null +++ b/assets/static/bootstrap-icons/intersect.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/journal-album.svg b/assets/static/bootstrap-icons/journal-album.svg new file mode 100644 index 0000000..de49ccc --- /dev/null +++ b/assets/static/bootstrap-icons/journal-album.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/journal-arrow-down.svg b/assets/static/bootstrap-icons/journal-arrow-down.svg new file mode 100644 index 0000000..d922f3c --- /dev/null +++ b/assets/static/bootstrap-icons/journal-arrow-down.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/journal-arrow-up.svg b/assets/static/bootstrap-icons/journal-arrow-up.svg new file mode 100644 index 0000000..7edc400 --- /dev/null +++ b/assets/static/bootstrap-icons/journal-arrow-up.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/journal-bookmark-fill.svg b/assets/static/bootstrap-icons/journal-bookmark-fill.svg new file mode 100644 index 0000000..8e2f17a --- /dev/null +++ b/assets/static/bootstrap-icons/journal-bookmark-fill.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/journal-bookmark.svg b/assets/static/bootstrap-icons/journal-bookmark.svg new file mode 100644 index 0000000..4a8f4bb --- /dev/null +++ b/assets/static/bootstrap-icons/journal-bookmark.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/journal-check.svg b/assets/static/bootstrap-icons/journal-check.svg new file mode 100644 index 0000000..eb398b9 --- /dev/null +++ b/assets/static/bootstrap-icons/journal-check.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/journal-code.svg b/assets/static/bootstrap-icons/journal-code.svg new file mode 100644 index 0000000..41430d2 --- /dev/null +++ b/assets/static/bootstrap-icons/journal-code.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/journal-medical.svg b/assets/static/bootstrap-icons/journal-medical.svg new file mode 100644 index 0000000..fb6d942 --- /dev/null +++ b/assets/static/bootstrap-icons/journal-medical.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/journal-minus.svg b/assets/static/bootstrap-icons/journal-minus.svg new file mode 100644 index 0000000..cbdfdd7 --- /dev/null +++ b/assets/static/bootstrap-icons/journal-minus.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/journal-plus.svg b/assets/static/bootstrap-icons/journal-plus.svg new file mode 100644 index 0000000..5cb82c3 --- /dev/null +++ b/assets/static/bootstrap-icons/journal-plus.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/journal-richtext.svg b/assets/static/bootstrap-icons/journal-richtext.svg new file mode 100644 index 0000000..db92c70 --- /dev/null +++ b/assets/static/bootstrap-icons/journal-richtext.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/journal-text.svg b/assets/static/bootstrap-icons/journal-text.svg new file mode 100644 index 0000000..13c58bc --- /dev/null +++ b/assets/static/bootstrap-icons/journal-text.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/journal-x.svg b/assets/static/bootstrap-icons/journal-x.svg new file mode 100644 index 0000000..fb3ea9f --- /dev/null +++ b/assets/static/bootstrap-icons/journal-x.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/journal.svg b/assets/static/bootstrap-icons/journal.svg new file mode 100644 index 0000000..4c166e2 --- /dev/null +++ b/assets/static/bootstrap-icons/journal.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/journals.svg b/assets/static/bootstrap-icons/journals.svg new file mode 100644 index 0000000..6e5386a --- /dev/null +++ b/assets/static/bootstrap-icons/journals.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/joystick.svg b/assets/static/bootstrap-icons/joystick.svg new file mode 100644 index 0000000..909369e --- /dev/null +++ b/assets/static/bootstrap-icons/joystick.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/justify-left.svg b/assets/static/bootstrap-icons/justify-left.svg new file mode 100644 index 0000000..17b45e4 --- /dev/null +++ b/assets/static/bootstrap-icons/justify-left.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/justify-right.svg b/assets/static/bootstrap-icons/justify-right.svg new file mode 100644 index 0000000..4d96c43 --- /dev/null +++ b/assets/static/bootstrap-icons/justify-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/justify.svg b/assets/static/bootstrap-icons/justify.svg new file mode 100644 index 0000000..3eedc74 --- /dev/null +++ b/assets/static/bootstrap-icons/justify.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/kanban-fill.svg b/assets/static/bootstrap-icons/kanban-fill.svg new file mode 100644 index 0000000..a8ed5bb --- /dev/null +++ b/assets/static/bootstrap-icons/kanban-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/kanban.svg b/assets/static/bootstrap-icons/kanban.svg new file mode 100644 index 0000000..cd13b32 --- /dev/null +++ b/assets/static/bootstrap-icons/kanban.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/key-fill.svg b/assets/static/bootstrap-icons/key-fill.svg new file mode 100644 index 0000000..fdab8d6 --- /dev/null +++ b/assets/static/bootstrap-icons/key-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/key.svg b/assets/static/bootstrap-icons/key.svg new file mode 100644 index 0000000..b0d1e16 --- /dev/null +++ b/assets/static/bootstrap-icons/key.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/keyboard-fill.svg b/assets/static/bootstrap-icons/keyboard-fill.svg new file mode 100644 index 0000000..b46ad2d --- /dev/null +++ b/assets/static/bootstrap-icons/keyboard-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/keyboard.svg b/assets/static/bootstrap-icons/keyboard.svg new file mode 100644 index 0000000..8ba49b6 --- /dev/null +++ b/assets/static/bootstrap-icons/keyboard.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/ladder.svg b/assets/static/bootstrap-icons/ladder.svg new file mode 100644 index 0000000..7c6864f --- /dev/null +++ b/assets/static/bootstrap-icons/ladder.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/lamp-fill.svg b/assets/static/bootstrap-icons/lamp-fill.svg new file mode 100644 index 0000000..836b0db --- /dev/null +++ b/assets/static/bootstrap-icons/lamp-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/lamp.svg b/assets/static/bootstrap-icons/lamp.svg new file mode 100644 index 0000000..b3fa1d6 --- /dev/null +++ b/assets/static/bootstrap-icons/lamp.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/laptop-fill.svg b/assets/static/bootstrap-icons/laptop-fill.svg new file mode 100644 index 0000000..31e5880 --- /dev/null +++ b/assets/static/bootstrap-icons/laptop-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/laptop.svg b/assets/static/bootstrap-icons/laptop.svg new file mode 100644 index 0000000..8e71020 --- /dev/null +++ b/assets/static/bootstrap-icons/laptop.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/layer-backward.svg b/assets/static/bootstrap-icons/layer-backward.svg new file mode 100644 index 0000000..ed43c70 --- /dev/null +++ b/assets/static/bootstrap-icons/layer-backward.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/layer-forward.svg b/assets/static/bootstrap-icons/layer-forward.svg new file mode 100644 index 0000000..d0a4abf --- /dev/null +++ b/assets/static/bootstrap-icons/layer-forward.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/layers-fill.svg b/assets/static/bootstrap-icons/layers-fill.svg new file mode 100644 index 0000000..3b6cdf6 --- /dev/null +++ b/assets/static/bootstrap-icons/layers-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/layers-half.svg b/assets/static/bootstrap-icons/layers-half.svg new file mode 100644 index 0000000..8ceaaad --- /dev/null +++ b/assets/static/bootstrap-icons/layers-half.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/layers.svg b/assets/static/bootstrap-icons/layers.svg new file mode 100644 index 0000000..52dbe79 --- /dev/null +++ b/assets/static/bootstrap-icons/layers.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/layout-sidebar-inset-reverse.svg b/assets/static/bootstrap-icons/layout-sidebar-inset-reverse.svg new file mode 100644 index 0000000..0d8dc7f --- /dev/null +++ b/assets/static/bootstrap-icons/layout-sidebar-inset-reverse.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/layout-sidebar-inset.svg b/assets/static/bootstrap-icons/layout-sidebar-inset.svg new file mode 100644 index 0000000..cc19c86 --- /dev/null +++ b/assets/static/bootstrap-icons/layout-sidebar-inset.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/layout-sidebar-reverse.svg b/assets/static/bootstrap-icons/layout-sidebar-reverse.svg new file mode 100644 index 0000000..7c03f73 --- /dev/null +++ b/assets/static/bootstrap-icons/layout-sidebar-reverse.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/layout-sidebar.svg b/assets/static/bootstrap-icons/layout-sidebar.svg new file mode 100644 index 0000000..ff40858 --- /dev/null +++ b/assets/static/bootstrap-icons/layout-sidebar.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/layout-split.svg b/assets/static/bootstrap-icons/layout-split.svg new file mode 100644 index 0000000..4805b25 --- /dev/null +++ b/assets/static/bootstrap-icons/layout-split.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/layout-text-sidebar-reverse.svg b/assets/static/bootstrap-icons/layout-text-sidebar-reverse.svg new file mode 100644 index 0000000..9179285 --- /dev/null +++ b/assets/static/bootstrap-icons/layout-text-sidebar-reverse.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/layout-text-sidebar.svg b/assets/static/bootstrap-icons/layout-text-sidebar.svg new file mode 100644 index 0000000..6d89f67 --- /dev/null +++ b/assets/static/bootstrap-icons/layout-text-sidebar.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/layout-text-window-reverse.svg b/assets/static/bootstrap-icons/layout-text-window-reverse.svg new file mode 100644 index 0000000..8258ad3 --- /dev/null +++ b/assets/static/bootstrap-icons/layout-text-window-reverse.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/layout-text-window.svg b/assets/static/bootstrap-icons/layout-text-window.svg new file mode 100644 index 0000000..4d27cf9 --- /dev/null +++ b/assets/static/bootstrap-icons/layout-text-window.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/layout-three-columns.svg b/assets/static/bootstrap-icons/layout-three-columns.svg new file mode 100644 index 0000000..7117f07 --- /dev/null +++ b/assets/static/bootstrap-icons/layout-three-columns.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/layout-wtf.svg b/assets/static/bootstrap-icons/layout-wtf.svg new file mode 100644 index 0000000..fd8f5a1 --- /dev/null +++ b/assets/static/bootstrap-icons/layout-wtf.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/life-preserver.svg b/assets/static/bootstrap-icons/life-preserver.svg new file mode 100644 index 0000000..7282baa --- /dev/null +++ b/assets/static/bootstrap-icons/life-preserver.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/lightbulb-fill.svg b/assets/static/bootstrap-icons/lightbulb-fill.svg new file mode 100644 index 0000000..0ef90ea --- /dev/null +++ b/assets/static/bootstrap-icons/lightbulb-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/lightbulb-off-fill.svg b/assets/static/bootstrap-icons/lightbulb-off-fill.svg new file mode 100644 index 0000000..e533739 --- /dev/null +++ b/assets/static/bootstrap-icons/lightbulb-off-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/lightbulb-off.svg b/assets/static/bootstrap-icons/lightbulb-off.svg new file mode 100644 index 0000000..15e8200 --- /dev/null +++ b/assets/static/bootstrap-icons/lightbulb-off.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/lightbulb.svg b/assets/static/bootstrap-icons/lightbulb.svg new file mode 100644 index 0000000..67bf5bd --- /dev/null +++ b/assets/static/bootstrap-icons/lightbulb.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/lightning-charge-fill.svg b/assets/static/bootstrap-icons/lightning-charge-fill.svg new file mode 100644 index 0000000..5e197fb --- /dev/null +++ b/assets/static/bootstrap-icons/lightning-charge-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/lightning-charge.svg b/assets/static/bootstrap-icons/lightning-charge.svg new file mode 100644 index 0000000..5352e72 --- /dev/null +++ b/assets/static/bootstrap-icons/lightning-charge.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/lightning-fill.svg b/assets/static/bootstrap-icons/lightning-fill.svg new file mode 100644 index 0000000..b98af68 --- /dev/null +++ b/assets/static/bootstrap-icons/lightning-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/lightning.svg b/assets/static/bootstrap-icons/lightning.svg new file mode 100644 index 0000000..d2faa0f --- /dev/null +++ b/assets/static/bootstrap-icons/lightning.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/line.svg b/assets/static/bootstrap-icons/line.svg new file mode 100644 index 0000000..3e4bfd3 --- /dev/null +++ b/assets/static/bootstrap-icons/line.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/link-45deg.svg b/assets/static/bootstrap-icons/link-45deg.svg new file mode 100644 index 0000000..abdc8cb --- /dev/null +++ b/assets/static/bootstrap-icons/link-45deg.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/link.svg b/assets/static/bootstrap-icons/link.svg new file mode 100644 index 0000000..823e4cd --- /dev/null +++ b/assets/static/bootstrap-icons/link.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/linkedin.svg b/assets/static/bootstrap-icons/linkedin.svg new file mode 100644 index 0000000..30fc0e3 --- /dev/null +++ b/assets/static/bootstrap-icons/linkedin.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/list-check.svg b/assets/static/bootstrap-icons/list-check.svg new file mode 100644 index 0000000..e1db377 --- /dev/null +++ b/assets/static/bootstrap-icons/list-check.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/list-columns-reverse.svg b/assets/static/bootstrap-icons/list-columns-reverse.svg new file mode 100644 index 0000000..f5e2876 --- /dev/null +++ b/assets/static/bootstrap-icons/list-columns-reverse.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/list-columns.svg b/assets/static/bootstrap-icons/list-columns.svg new file mode 100644 index 0000000..07d0b1a --- /dev/null +++ b/assets/static/bootstrap-icons/list-columns.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/list-nested.svg b/assets/static/bootstrap-icons/list-nested.svg new file mode 100644 index 0000000..26607c9 --- /dev/null +++ b/assets/static/bootstrap-icons/list-nested.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/list-ol.svg b/assets/static/bootstrap-icons/list-ol.svg new file mode 100644 index 0000000..d111f73 --- /dev/null +++ b/assets/static/bootstrap-icons/list-ol.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/list-stars.svg b/assets/static/bootstrap-icons/list-stars.svg new file mode 100644 index 0000000..c520bdf --- /dev/null +++ b/assets/static/bootstrap-icons/list-stars.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/list-task.svg b/assets/static/bootstrap-icons/list-task.svg new file mode 100644 index 0000000..3905d7a --- /dev/null +++ b/assets/static/bootstrap-icons/list-task.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/list-ul.svg b/assets/static/bootstrap-icons/list-ul.svg new file mode 100644 index 0000000..f1cc202 --- /dev/null +++ b/assets/static/bootstrap-icons/list-ul.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/list.svg b/assets/static/bootstrap-icons/list.svg new file mode 100644 index 0000000..de58858 --- /dev/null +++ b/assets/static/bootstrap-icons/list.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/lock-fill.svg b/assets/static/bootstrap-icons/lock-fill.svg new file mode 100644 index 0000000..69646f6 --- /dev/null +++ b/assets/static/bootstrap-icons/lock-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/lock.svg b/assets/static/bootstrap-icons/lock.svg new file mode 100644 index 0000000..9c730b7 --- /dev/null +++ b/assets/static/bootstrap-icons/lock.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/luggage-fill.svg b/assets/static/bootstrap-icons/luggage-fill.svg new file mode 100644 index 0000000..eb7378f --- /dev/null +++ b/assets/static/bootstrap-icons/luggage-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/luggage.svg b/assets/static/bootstrap-icons/luggage.svg new file mode 100644 index 0000000..ad037ba --- /dev/null +++ b/assets/static/bootstrap-icons/luggage.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/lungs-fill.svg b/assets/static/bootstrap-icons/lungs-fill.svg new file mode 100644 index 0000000..2880fa6 --- /dev/null +++ b/assets/static/bootstrap-icons/lungs-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/lungs.svg b/assets/static/bootstrap-icons/lungs.svg new file mode 100644 index 0000000..082e7de --- /dev/null +++ b/assets/static/bootstrap-icons/lungs.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/magic.svg b/assets/static/bootstrap-icons/magic.svg new file mode 100644 index 0000000..0b2f1fd --- /dev/null +++ b/assets/static/bootstrap-icons/magic.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/magnet-fill.svg b/assets/static/bootstrap-icons/magnet-fill.svg new file mode 100644 index 0000000..026d0de --- /dev/null +++ b/assets/static/bootstrap-icons/magnet-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/magnet.svg b/assets/static/bootstrap-icons/magnet.svg new file mode 100644 index 0000000..36b238b --- /dev/null +++ b/assets/static/bootstrap-icons/magnet.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/mailbox-flag.svg b/assets/static/bootstrap-icons/mailbox-flag.svg new file mode 100644 index 0000000..8e24db0 --- /dev/null +++ b/assets/static/bootstrap-icons/mailbox-flag.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/mailbox.svg b/assets/static/bootstrap-icons/mailbox.svg new file mode 100644 index 0000000..1048e2a --- /dev/null +++ b/assets/static/bootstrap-icons/mailbox.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/mailbox2-flag.svg b/assets/static/bootstrap-icons/mailbox2-flag.svg new file mode 100644 index 0000000..a253700 --- /dev/null +++ b/assets/static/bootstrap-icons/mailbox2-flag.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/mailbox2.svg b/assets/static/bootstrap-icons/mailbox2.svg new file mode 100644 index 0000000..33e22a6 --- /dev/null +++ b/assets/static/bootstrap-icons/mailbox2.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/map-fill.svg b/assets/static/bootstrap-icons/map-fill.svg new file mode 100644 index 0000000..7134540 --- /dev/null +++ b/assets/static/bootstrap-icons/map-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/map.svg b/assets/static/bootstrap-icons/map.svg new file mode 100644 index 0000000..2b579ce --- /dev/null +++ b/assets/static/bootstrap-icons/map.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/markdown-fill.svg b/assets/static/bootstrap-icons/markdown-fill.svg new file mode 100644 index 0000000..a932fbb --- /dev/null +++ b/assets/static/bootstrap-icons/markdown-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/markdown.svg b/assets/static/bootstrap-icons/markdown.svg new file mode 100644 index 0000000..33962c6 --- /dev/null +++ b/assets/static/bootstrap-icons/markdown.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/marker-tip.svg b/assets/static/bootstrap-icons/marker-tip.svg new file mode 100644 index 0000000..e00f931 --- /dev/null +++ b/assets/static/bootstrap-icons/marker-tip.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/mask.svg b/assets/static/bootstrap-icons/mask.svg new file mode 100644 index 0000000..b51158c --- /dev/null +++ b/assets/static/bootstrap-icons/mask.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/mastodon.svg b/assets/static/bootstrap-icons/mastodon.svg new file mode 100644 index 0000000..a8c2a26 --- /dev/null +++ b/assets/static/bootstrap-icons/mastodon.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/medium.svg b/assets/static/bootstrap-icons/medium.svg new file mode 100644 index 0000000..065ace1 --- /dev/null +++ b/assets/static/bootstrap-icons/medium.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/megaphone-fill.svg b/assets/static/bootstrap-icons/megaphone-fill.svg new file mode 100644 index 0000000..9f44f2e --- /dev/null +++ b/assets/static/bootstrap-icons/megaphone-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/megaphone.svg b/assets/static/bootstrap-icons/megaphone.svg new file mode 100644 index 0000000..1cedb30 --- /dev/null +++ b/assets/static/bootstrap-icons/megaphone.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/memory.svg b/assets/static/bootstrap-icons/memory.svg new file mode 100644 index 0000000..48764d2 --- /dev/null +++ b/assets/static/bootstrap-icons/memory.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/menu-app-fill.svg b/assets/static/bootstrap-icons/menu-app-fill.svg new file mode 100644 index 0000000..65cfdcf --- /dev/null +++ b/assets/static/bootstrap-icons/menu-app-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/menu-app.svg b/assets/static/bootstrap-icons/menu-app.svg new file mode 100644 index 0000000..ecda144 --- /dev/null +++ b/assets/static/bootstrap-icons/menu-app.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/menu-button-fill.svg b/assets/static/bootstrap-icons/menu-button-fill.svg new file mode 100644 index 0000000..09b2805 --- /dev/null +++ b/assets/static/bootstrap-icons/menu-button-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/menu-button-wide-fill.svg b/assets/static/bootstrap-icons/menu-button-wide-fill.svg new file mode 100644 index 0000000..d97ce7f --- /dev/null +++ b/assets/static/bootstrap-icons/menu-button-wide-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/menu-button-wide.svg b/assets/static/bootstrap-icons/menu-button-wide.svg new file mode 100644 index 0000000..5636c10 --- /dev/null +++ b/assets/static/bootstrap-icons/menu-button-wide.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/menu-button.svg b/assets/static/bootstrap-icons/menu-button.svg new file mode 100644 index 0000000..ec4c70a --- /dev/null +++ b/assets/static/bootstrap-icons/menu-button.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/menu-down.svg b/assets/static/bootstrap-icons/menu-down.svg new file mode 100644 index 0000000..e53a5e9 --- /dev/null +++ b/assets/static/bootstrap-icons/menu-down.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/menu-up.svg b/assets/static/bootstrap-icons/menu-up.svg new file mode 100644 index 0000000..96ff58b --- /dev/null +++ b/assets/static/bootstrap-icons/menu-up.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/messenger.svg b/assets/static/bootstrap-icons/messenger.svg new file mode 100644 index 0000000..e896a79 --- /dev/null +++ b/assets/static/bootstrap-icons/messenger.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/meta.svg b/assets/static/bootstrap-icons/meta.svg new file mode 100644 index 0000000..03155a1 --- /dev/null +++ b/assets/static/bootstrap-icons/meta.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/mic-fill.svg b/assets/static/bootstrap-icons/mic-fill.svg new file mode 100644 index 0000000..c92ade7 --- /dev/null +++ b/assets/static/bootstrap-icons/mic-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/mic-mute-fill.svg b/assets/static/bootstrap-icons/mic-mute-fill.svg new file mode 100644 index 0000000..a10a1bc --- /dev/null +++ b/assets/static/bootstrap-icons/mic-mute-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/mic-mute.svg b/assets/static/bootstrap-icons/mic-mute.svg new file mode 100644 index 0000000..59b04be --- /dev/null +++ b/assets/static/bootstrap-icons/mic-mute.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/mic.svg b/assets/static/bootstrap-icons/mic.svg new file mode 100644 index 0000000..f07bf14 --- /dev/null +++ b/assets/static/bootstrap-icons/mic.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/microsoft-teams.svg b/assets/static/bootstrap-icons/microsoft-teams.svg new file mode 100644 index 0000000..6bf3a0c --- /dev/null +++ b/assets/static/bootstrap-icons/microsoft-teams.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/microsoft.svg b/assets/static/bootstrap-icons/microsoft.svg new file mode 100644 index 0000000..8d2a03c --- /dev/null +++ b/assets/static/bootstrap-icons/microsoft.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/minecart-loaded.svg b/assets/static/bootstrap-icons/minecart-loaded.svg new file mode 100644 index 0000000..48e523f --- /dev/null +++ b/assets/static/bootstrap-icons/minecart-loaded.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/minecart.svg b/assets/static/bootstrap-icons/minecart.svg new file mode 100644 index 0000000..c4869c2 --- /dev/null +++ b/assets/static/bootstrap-icons/minecart.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/modem-fill.svg b/assets/static/bootstrap-icons/modem-fill.svg new file mode 100644 index 0000000..a5dd5e2 --- /dev/null +++ b/assets/static/bootstrap-icons/modem-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/modem.svg b/assets/static/bootstrap-icons/modem.svg new file mode 100644 index 0000000..f90ad6b --- /dev/null +++ b/assets/static/bootstrap-icons/modem.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/moisture.svg b/assets/static/bootstrap-icons/moisture.svg new file mode 100644 index 0000000..490fb49 --- /dev/null +++ b/assets/static/bootstrap-icons/moisture.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/moon-fill.svg b/assets/static/bootstrap-icons/moon-fill.svg new file mode 100644 index 0000000..67f6739 --- /dev/null +++ b/assets/static/bootstrap-icons/moon-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/moon-stars-fill.svg b/assets/static/bootstrap-icons/moon-stars-fill.svg new file mode 100644 index 0000000..c50e070 --- /dev/null +++ b/assets/static/bootstrap-icons/moon-stars-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/moon-stars.svg b/assets/static/bootstrap-icons/moon-stars.svg new file mode 100644 index 0000000..ae138c2 --- /dev/null +++ b/assets/static/bootstrap-icons/moon-stars.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/moon.svg b/assets/static/bootstrap-icons/moon.svg new file mode 100644 index 0000000..46458ec --- /dev/null +++ b/assets/static/bootstrap-icons/moon.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/mortarboard-fill.svg b/assets/static/bootstrap-icons/mortarboard-fill.svg new file mode 100644 index 0000000..02f6c8c --- /dev/null +++ b/assets/static/bootstrap-icons/mortarboard-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/mortarboard.svg b/assets/static/bootstrap-icons/mortarboard.svg new file mode 100644 index 0000000..94f9e97 --- /dev/null +++ b/assets/static/bootstrap-icons/mortarboard.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/motherboard-fill.svg b/assets/static/bootstrap-icons/motherboard-fill.svg new file mode 100644 index 0000000..fabff97 --- /dev/null +++ b/assets/static/bootstrap-icons/motherboard-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/motherboard.svg b/assets/static/bootstrap-icons/motherboard.svg new file mode 100644 index 0000000..d29e255 --- /dev/null +++ b/assets/static/bootstrap-icons/motherboard.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/mouse-fill.svg b/assets/static/bootstrap-icons/mouse-fill.svg new file mode 100644 index 0000000..24d275e --- /dev/null +++ b/assets/static/bootstrap-icons/mouse-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/mouse.svg b/assets/static/bootstrap-icons/mouse.svg new file mode 100644 index 0000000..e018811 --- /dev/null +++ b/assets/static/bootstrap-icons/mouse.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/mouse2-fill.svg b/assets/static/bootstrap-icons/mouse2-fill.svg new file mode 100644 index 0000000..6277b44 --- /dev/null +++ b/assets/static/bootstrap-icons/mouse2-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/mouse2.svg b/assets/static/bootstrap-icons/mouse2.svg new file mode 100644 index 0000000..fd15e7c --- /dev/null +++ b/assets/static/bootstrap-icons/mouse2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/mouse3-fill.svg b/assets/static/bootstrap-icons/mouse3-fill.svg new file mode 100644 index 0000000..16c1705 --- /dev/null +++ b/assets/static/bootstrap-icons/mouse3-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/mouse3.svg b/assets/static/bootstrap-icons/mouse3.svg new file mode 100644 index 0000000..548b244 --- /dev/null +++ b/assets/static/bootstrap-icons/mouse3.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/music-note-beamed.svg b/assets/static/bootstrap-icons/music-note-beamed.svg new file mode 100644 index 0000000..9eb1506 --- /dev/null +++ b/assets/static/bootstrap-icons/music-note-beamed.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/music-note-list.svg b/assets/static/bootstrap-icons/music-note-list.svg new file mode 100644 index 0000000..d33767d --- /dev/null +++ b/assets/static/bootstrap-icons/music-note-list.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/music-note.svg b/assets/static/bootstrap-icons/music-note.svg new file mode 100644 index 0000000..d6fe21e --- /dev/null +++ b/assets/static/bootstrap-icons/music-note.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/music-player-fill.svg b/assets/static/bootstrap-icons/music-player-fill.svg new file mode 100644 index 0000000..68a65b5 --- /dev/null +++ b/assets/static/bootstrap-icons/music-player-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/music-player.svg b/assets/static/bootstrap-icons/music-player.svg new file mode 100644 index 0000000..7eb9c92 --- /dev/null +++ b/assets/static/bootstrap-icons/music-player.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/newspaper.svg b/assets/static/bootstrap-icons/newspaper.svg new file mode 100644 index 0000000..9a1cf6d --- /dev/null +++ b/assets/static/bootstrap-icons/newspaper.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/nintendo-switch.svg b/assets/static/bootstrap-icons/nintendo-switch.svg new file mode 100644 index 0000000..5849493 --- /dev/null +++ b/assets/static/bootstrap-icons/nintendo-switch.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/node-minus-fill.svg b/assets/static/bootstrap-icons/node-minus-fill.svg new file mode 100644 index 0000000..802d678 --- /dev/null +++ b/assets/static/bootstrap-icons/node-minus-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/node-minus.svg b/assets/static/bootstrap-icons/node-minus.svg new file mode 100644 index 0000000..8ffaa38 --- /dev/null +++ b/assets/static/bootstrap-icons/node-minus.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/node-plus-fill.svg b/assets/static/bootstrap-icons/node-plus-fill.svg new file mode 100644 index 0000000..9559b26 --- /dev/null +++ b/assets/static/bootstrap-icons/node-plus-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/node-plus.svg b/assets/static/bootstrap-icons/node-plus.svg new file mode 100644 index 0000000..028ef28 --- /dev/null +++ b/assets/static/bootstrap-icons/node-plus.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/noise-reduction.svg b/assets/static/bootstrap-icons/noise-reduction.svg new file mode 100644 index 0000000..cd5e288 --- /dev/null +++ b/assets/static/bootstrap-icons/noise-reduction.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/nut-fill.svg b/assets/static/bootstrap-icons/nut-fill.svg new file mode 100644 index 0000000..18dfeb1 --- /dev/null +++ b/assets/static/bootstrap-icons/nut-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/nut.svg b/assets/static/bootstrap-icons/nut.svg new file mode 100644 index 0000000..75a401d --- /dev/null +++ b/assets/static/bootstrap-icons/nut.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/nvidia.svg b/assets/static/bootstrap-icons/nvidia.svg new file mode 100644 index 0000000..438a6fc --- /dev/null +++ b/assets/static/bootstrap-icons/nvidia.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/nvme-fill.svg b/assets/static/bootstrap-icons/nvme-fill.svg new file mode 100644 index 0000000..962c3c6 --- /dev/null +++ b/assets/static/bootstrap-icons/nvme-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/nvme.svg b/assets/static/bootstrap-icons/nvme.svg new file mode 100644 index 0000000..31a2fb6 --- /dev/null +++ b/assets/static/bootstrap-icons/nvme.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/octagon-fill.svg b/assets/static/bootstrap-icons/octagon-fill.svg new file mode 100644 index 0000000..73c80f0 --- /dev/null +++ b/assets/static/bootstrap-icons/octagon-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/octagon-half.svg b/assets/static/bootstrap-icons/octagon-half.svg new file mode 100644 index 0000000..fe6eb41 --- /dev/null +++ b/assets/static/bootstrap-icons/octagon-half.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/octagon.svg b/assets/static/bootstrap-icons/octagon.svg new file mode 100644 index 0000000..d2d9c5c --- /dev/null +++ b/assets/static/bootstrap-icons/octagon.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/opencollective.svg b/assets/static/bootstrap-icons/opencollective.svg new file mode 100644 index 0000000..b9a0c9f --- /dev/null +++ b/assets/static/bootstrap-icons/opencollective.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/optical-audio-fill.svg b/assets/static/bootstrap-icons/optical-audio-fill.svg new file mode 100644 index 0000000..9b74060 --- /dev/null +++ b/assets/static/bootstrap-icons/optical-audio-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/optical-audio.svg b/assets/static/bootstrap-icons/optical-audio.svg new file mode 100644 index 0000000..253d1d7 --- /dev/null +++ b/assets/static/bootstrap-icons/optical-audio.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/option.svg b/assets/static/bootstrap-icons/option.svg new file mode 100644 index 0000000..32cce4c --- /dev/null +++ b/assets/static/bootstrap-icons/option.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/outlet.svg b/assets/static/bootstrap-icons/outlet.svg new file mode 100644 index 0000000..7787f35 --- /dev/null +++ b/assets/static/bootstrap-icons/outlet.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/p-circle-fill.svg b/assets/static/bootstrap-icons/p-circle-fill.svg new file mode 100644 index 0000000..e57d158 --- /dev/null +++ b/assets/static/bootstrap-icons/p-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/p-circle.svg b/assets/static/bootstrap-icons/p-circle.svg new file mode 100644 index 0000000..bfe68d9 --- /dev/null +++ b/assets/static/bootstrap-icons/p-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/p-square-fill.svg b/assets/static/bootstrap-icons/p-square-fill.svg new file mode 100644 index 0000000..164f5eb --- /dev/null +++ b/assets/static/bootstrap-icons/p-square-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/p-square.svg b/assets/static/bootstrap-icons/p-square.svg new file mode 100644 index 0000000..1f6335d --- /dev/null +++ b/assets/static/bootstrap-icons/p-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/paint-bucket.svg b/assets/static/bootstrap-icons/paint-bucket.svg new file mode 100644 index 0000000..9ac2df4 --- /dev/null +++ b/assets/static/bootstrap-icons/paint-bucket.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/palette-fill.svg b/assets/static/bootstrap-icons/palette-fill.svg new file mode 100644 index 0000000..d7a6a3b --- /dev/null +++ b/assets/static/bootstrap-icons/palette-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/palette.svg b/assets/static/bootstrap-icons/palette.svg new file mode 100644 index 0000000..1cd490f --- /dev/null +++ b/assets/static/bootstrap-icons/palette.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/palette2.svg b/assets/static/bootstrap-icons/palette2.svg new file mode 100644 index 0000000..ae65e88 --- /dev/null +++ b/assets/static/bootstrap-icons/palette2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/paperclip.svg b/assets/static/bootstrap-icons/paperclip.svg new file mode 100644 index 0000000..c02950b --- /dev/null +++ b/assets/static/bootstrap-icons/paperclip.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/paragraph.svg b/assets/static/bootstrap-icons/paragraph.svg new file mode 100644 index 0000000..38c65d4 --- /dev/null +++ b/assets/static/bootstrap-icons/paragraph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pass-fill.svg b/assets/static/bootstrap-icons/pass-fill.svg new file mode 100644 index 0000000..1e15dd9 --- /dev/null +++ b/assets/static/bootstrap-icons/pass-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pass.svg b/assets/static/bootstrap-icons/pass.svg new file mode 100644 index 0000000..20a06bc --- /dev/null +++ b/assets/static/bootstrap-icons/pass.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/passport-fill.svg b/assets/static/bootstrap-icons/passport-fill.svg new file mode 100644 index 0000000..d42c1b9 --- /dev/null +++ b/assets/static/bootstrap-icons/passport-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/passport.svg b/assets/static/bootstrap-icons/passport.svg new file mode 100644 index 0000000..2ecee5a --- /dev/null +++ b/assets/static/bootstrap-icons/passport.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/patch-check-fill.svg b/assets/static/bootstrap-icons/patch-check-fill.svg new file mode 100644 index 0000000..91283e2 --- /dev/null +++ b/assets/static/bootstrap-icons/patch-check-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/patch-check.svg b/assets/static/bootstrap-icons/patch-check.svg new file mode 100644 index 0000000..1fd0a2e --- /dev/null +++ b/assets/static/bootstrap-icons/patch-check.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/patch-exclamation-fill.svg b/assets/static/bootstrap-icons/patch-exclamation-fill.svg new file mode 100644 index 0000000..e745268 --- /dev/null +++ b/assets/static/bootstrap-icons/patch-exclamation-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/patch-exclamation.svg b/assets/static/bootstrap-icons/patch-exclamation.svg new file mode 100644 index 0000000..2372cc6 --- /dev/null +++ b/assets/static/bootstrap-icons/patch-exclamation.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/patch-minus-fill.svg b/assets/static/bootstrap-icons/patch-minus-fill.svg new file mode 100644 index 0000000..bfeb96e --- /dev/null +++ b/assets/static/bootstrap-icons/patch-minus-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/patch-minus.svg b/assets/static/bootstrap-icons/patch-minus.svg new file mode 100644 index 0000000..35a380c --- /dev/null +++ b/assets/static/bootstrap-icons/patch-minus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/patch-plus-fill.svg b/assets/static/bootstrap-icons/patch-plus-fill.svg new file mode 100644 index 0000000..b475098 --- /dev/null +++ b/assets/static/bootstrap-icons/patch-plus-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/patch-plus.svg b/assets/static/bootstrap-icons/patch-plus.svg new file mode 100644 index 0000000..4f332da --- /dev/null +++ b/assets/static/bootstrap-icons/patch-plus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/patch-question-fill.svg b/assets/static/bootstrap-icons/patch-question-fill.svg new file mode 100644 index 0000000..101c255 --- /dev/null +++ b/assets/static/bootstrap-icons/patch-question-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/patch-question.svg b/assets/static/bootstrap-icons/patch-question.svg new file mode 100644 index 0000000..a777cef --- /dev/null +++ b/assets/static/bootstrap-icons/patch-question.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pause-btn-fill.svg b/assets/static/bootstrap-icons/pause-btn-fill.svg new file mode 100644 index 0000000..81c0720 --- /dev/null +++ b/assets/static/bootstrap-icons/pause-btn-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pause-btn.svg b/assets/static/bootstrap-icons/pause-btn.svg new file mode 100644 index 0000000..e2d68f9 --- /dev/null +++ b/assets/static/bootstrap-icons/pause-btn.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pause-circle-fill.svg b/assets/static/bootstrap-icons/pause-circle-fill.svg new file mode 100644 index 0000000..90c4ca5 --- /dev/null +++ b/assets/static/bootstrap-icons/pause-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pause-circle.svg b/assets/static/bootstrap-icons/pause-circle.svg new file mode 100644 index 0000000..6d3aeff --- /dev/null +++ b/assets/static/bootstrap-icons/pause-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pause-fill.svg b/assets/static/bootstrap-icons/pause-fill.svg new file mode 100644 index 0000000..92e1588 --- /dev/null +++ b/assets/static/bootstrap-icons/pause-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pause.svg b/assets/static/bootstrap-icons/pause.svg new file mode 100644 index 0000000..7bfde2c --- /dev/null +++ b/assets/static/bootstrap-icons/pause.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/paypal.svg b/assets/static/bootstrap-icons/paypal.svg new file mode 100644 index 0000000..b2cec88 --- /dev/null +++ b/assets/static/bootstrap-icons/paypal.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pc-display-horizontal.svg b/assets/static/bootstrap-icons/pc-display-horizontal.svg new file mode 100644 index 0000000..724ba86 --- /dev/null +++ b/assets/static/bootstrap-icons/pc-display-horizontal.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pc-display.svg b/assets/static/bootstrap-icons/pc-display.svg new file mode 100644 index 0000000..c3cf9dd --- /dev/null +++ b/assets/static/bootstrap-icons/pc-display.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pc-horizontal.svg b/assets/static/bootstrap-icons/pc-horizontal.svg new file mode 100644 index 0000000..a8ae72f --- /dev/null +++ b/assets/static/bootstrap-icons/pc-horizontal.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pc.svg b/assets/static/bootstrap-icons/pc.svg new file mode 100644 index 0000000..a8c023a --- /dev/null +++ b/assets/static/bootstrap-icons/pc.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pci-card-network.svg b/assets/static/bootstrap-icons/pci-card-network.svg new file mode 100644 index 0000000..a2b4359 --- /dev/null +++ b/assets/static/bootstrap-icons/pci-card-network.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pci-card-sound.svg b/assets/static/bootstrap-icons/pci-card-sound.svg new file mode 100644 index 0000000..2bb98f2 --- /dev/null +++ b/assets/static/bootstrap-icons/pci-card-sound.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pci-card.svg b/assets/static/bootstrap-icons/pci-card.svg new file mode 100644 index 0000000..66ff052 --- /dev/null +++ b/assets/static/bootstrap-icons/pci-card.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/peace-fill.svg b/assets/static/bootstrap-icons/peace-fill.svg new file mode 100644 index 0000000..a93e64d --- /dev/null +++ b/assets/static/bootstrap-icons/peace-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/peace.svg b/assets/static/bootstrap-icons/peace.svg new file mode 100644 index 0000000..22367e0 --- /dev/null +++ b/assets/static/bootstrap-icons/peace.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pen-fill.svg b/assets/static/bootstrap-icons/pen-fill.svg new file mode 100644 index 0000000..59bbb2e --- /dev/null +++ b/assets/static/bootstrap-icons/pen-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pen.svg b/assets/static/bootstrap-icons/pen.svg new file mode 100644 index 0000000..a63b250 --- /dev/null +++ b/assets/static/bootstrap-icons/pen.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pencil-fill.svg b/assets/static/bootstrap-icons/pencil-fill.svg new file mode 100644 index 0000000..4b3bdd7 --- /dev/null +++ b/assets/static/bootstrap-icons/pencil-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pencil-square.svg b/assets/static/bootstrap-icons/pencil-square.svg new file mode 100644 index 0000000..95c0529 --- /dev/null +++ b/assets/static/bootstrap-icons/pencil-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pencil.svg b/assets/static/bootstrap-icons/pencil.svg new file mode 100644 index 0000000..0b84e36 --- /dev/null +++ b/assets/static/bootstrap-icons/pencil.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pentagon-fill.svg b/assets/static/bootstrap-icons/pentagon-fill.svg new file mode 100644 index 0000000..9c80789 --- /dev/null +++ b/assets/static/bootstrap-icons/pentagon-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pentagon-half.svg b/assets/static/bootstrap-icons/pentagon-half.svg new file mode 100644 index 0000000..6811a93 --- /dev/null +++ b/assets/static/bootstrap-icons/pentagon-half.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pentagon.svg b/assets/static/bootstrap-icons/pentagon.svg new file mode 100644 index 0000000..b6f5fe3 --- /dev/null +++ b/assets/static/bootstrap-icons/pentagon.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/people-fill.svg b/assets/static/bootstrap-icons/people-fill.svg new file mode 100644 index 0000000..2b9f768 --- /dev/null +++ b/assets/static/bootstrap-icons/people-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/people.svg b/assets/static/bootstrap-icons/people.svg new file mode 100644 index 0000000..341861a --- /dev/null +++ b/assets/static/bootstrap-icons/people.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/percent.svg b/assets/static/bootstrap-icons/percent.svg new file mode 100644 index 0000000..c0fd22d --- /dev/null +++ b/assets/static/bootstrap-icons/percent.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-add.svg b/assets/static/bootstrap-icons/person-add.svg new file mode 100644 index 0000000..66e2508 --- /dev/null +++ b/assets/static/bootstrap-icons/person-add.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-arms-up.svg b/assets/static/bootstrap-icons/person-arms-up.svg new file mode 100644 index 0000000..deb50e8 --- /dev/null +++ b/assets/static/bootstrap-icons/person-arms-up.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-badge-fill.svg b/assets/static/bootstrap-icons/person-badge-fill.svg new file mode 100644 index 0000000..7110ed3 --- /dev/null +++ b/assets/static/bootstrap-icons/person-badge-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-badge.svg b/assets/static/bootstrap-icons/person-badge.svg new file mode 100644 index 0000000..680aee1 --- /dev/null +++ b/assets/static/bootstrap-icons/person-badge.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-bounding-box.svg b/assets/static/bootstrap-icons/person-bounding-box.svg new file mode 100644 index 0000000..d9be675 --- /dev/null +++ b/assets/static/bootstrap-icons/person-bounding-box.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-check-fill.svg b/assets/static/bootstrap-icons/person-check-fill.svg new file mode 100644 index 0000000..04b95d3 --- /dev/null +++ b/assets/static/bootstrap-icons/person-check-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-check.svg b/assets/static/bootstrap-icons/person-check.svg new file mode 100644 index 0000000..39b4219 --- /dev/null +++ b/assets/static/bootstrap-icons/person-check.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-circle.svg b/assets/static/bootstrap-icons/person-circle.svg new file mode 100644 index 0000000..a75f25f --- /dev/null +++ b/assets/static/bootstrap-icons/person-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-dash-fill.svg b/assets/static/bootstrap-icons/person-dash-fill.svg new file mode 100644 index 0000000..9879e6e --- /dev/null +++ b/assets/static/bootstrap-icons/person-dash-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-dash.svg b/assets/static/bootstrap-icons/person-dash.svg new file mode 100644 index 0000000..b61190b --- /dev/null +++ b/assets/static/bootstrap-icons/person-dash.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-down.svg b/assets/static/bootstrap-icons/person-down.svg new file mode 100644 index 0000000..79cf29a --- /dev/null +++ b/assets/static/bootstrap-icons/person-down.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-exclamation.svg b/assets/static/bootstrap-icons/person-exclamation.svg new file mode 100644 index 0000000..46fb506 --- /dev/null +++ b/assets/static/bootstrap-icons/person-exclamation.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-fill-add.svg b/assets/static/bootstrap-icons/person-fill-add.svg new file mode 100644 index 0000000..d6d15f9 --- /dev/null +++ b/assets/static/bootstrap-icons/person-fill-add.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-fill-check.svg b/assets/static/bootstrap-icons/person-fill-check.svg new file mode 100644 index 0000000..19b88a4 --- /dev/null +++ b/assets/static/bootstrap-icons/person-fill-check.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-fill-dash.svg b/assets/static/bootstrap-icons/person-fill-dash.svg new file mode 100644 index 0000000..24c2944 --- /dev/null +++ b/assets/static/bootstrap-icons/person-fill-dash.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-fill-down.svg b/assets/static/bootstrap-icons/person-fill-down.svg new file mode 100644 index 0000000..714ae50 --- /dev/null +++ b/assets/static/bootstrap-icons/person-fill-down.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-fill-exclamation.svg b/assets/static/bootstrap-icons/person-fill-exclamation.svg new file mode 100644 index 0000000..5c3b7f5 --- /dev/null +++ b/assets/static/bootstrap-icons/person-fill-exclamation.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-fill-gear.svg b/assets/static/bootstrap-icons/person-fill-gear.svg new file mode 100644 index 0000000..33b120a --- /dev/null +++ b/assets/static/bootstrap-icons/person-fill-gear.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-fill-lock.svg b/assets/static/bootstrap-icons/person-fill-lock.svg new file mode 100644 index 0000000..adbccff --- /dev/null +++ b/assets/static/bootstrap-icons/person-fill-lock.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-fill-slash.svg b/assets/static/bootstrap-icons/person-fill-slash.svg new file mode 100644 index 0000000..398d563 --- /dev/null +++ b/assets/static/bootstrap-icons/person-fill-slash.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-fill-up.svg b/assets/static/bootstrap-icons/person-fill-up.svg new file mode 100644 index 0000000..1edd97b --- /dev/null +++ b/assets/static/bootstrap-icons/person-fill-up.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-fill-x.svg b/assets/static/bootstrap-icons/person-fill-x.svg new file mode 100644 index 0000000..e3a66ed --- /dev/null +++ b/assets/static/bootstrap-icons/person-fill-x.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-fill.svg b/assets/static/bootstrap-icons/person-fill.svg new file mode 100644 index 0000000..46d1a75 --- /dev/null +++ b/assets/static/bootstrap-icons/person-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-gear.svg b/assets/static/bootstrap-icons/person-gear.svg new file mode 100644 index 0000000..93ec4da --- /dev/null +++ b/assets/static/bootstrap-icons/person-gear.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-heart.svg b/assets/static/bootstrap-icons/person-heart.svg new file mode 100644 index 0000000..51b236e --- /dev/null +++ b/assets/static/bootstrap-icons/person-heart.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-hearts.svg b/assets/static/bootstrap-icons/person-hearts.svg new file mode 100644 index 0000000..70bb2e0 --- /dev/null +++ b/assets/static/bootstrap-icons/person-hearts.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-lines-fill.svg b/assets/static/bootstrap-icons/person-lines-fill.svg new file mode 100644 index 0000000..cbe6c68 --- /dev/null +++ b/assets/static/bootstrap-icons/person-lines-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-lock.svg b/assets/static/bootstrap-icons/person-lock.svg new file mode 100644 index 0000000..d3672cd --- /dev/null +++ b/assets/static/bootstrap-icons/person-lock.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-plus-fill.svg b/assets/static/bootstrap-icons/person-plus-fill.svg new file mode 100644 index 0000000..6c92aea --- /dev/null +++ b/assets/static/bootstrap-icons/person-plus-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-plus.svg b/assets/static/bootstrap-icons/person-plus.svg new file mode 100644 index 0000000..4b88424 --- /dev/null +++ b/assets/static/bootstrap-icons/person-plus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-raised-hand.svg b/assets/static/bootstrap-icons/person-raised-hand.svg new file mode 100644 index 0000000..00ac301 --- /dev/null +++ b/assets/static/bootstrap-icons/person-raised-hand.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-rolodex.svg b/assets/static/bootstrap-icons/person-rolodex.svg new file mode 100644 index 0000000..2039494 --- /dev/null +++ b/assets/static/bootstrap-icons/person-rolodex.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-slash.svg b/assets/static/bootstrap-icons/person-slash.svg new file mode 100644 index 0000000..ab53647 --- /dev/null +++ b/assets/static/bootstrap-icons/person-slash.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-square.svg b/assets/static/bootstrap-icons/person-square.svg new file mode 100644 index 0000000..12a33c5 --- /dev/null +++ b/assets/static/bootstrap-icons/person-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-standing-dress.svg b/assets/static/bootstrap-icons/person-standing-dress.svg new file mode 100644 index 0000000..4448606 --- /dev/null +++ b/assets/static/bootstrap-icons/person-standing-dress.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-standing.svg b/assets/static/bootstrap-icons/person-standing.svg new file mode 100644 index 0000000..ccd7b35 --- /dev/null +++ b/assets/static/bootstrap-icons/person-standing.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-up.svg b/assets/static/bootstrap-icons/person-up.svg new file mode 100644 index 0000000..93a430a --- /dev/null +++ b/assets/static/bootstrap-icons/person-up.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-vcard-fill.svg b/assets/static/bootstrap-icons/person-vcard-fill.svg new file mode 100644 index 0000000..9efb1b8 --- /dev/null +++ b/assets/static/bootstrap-icons/person-vcard-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-vcard.svg b/assets/static/bootstrap-icons/person-vcard.svg new file mode 100644 index 0000000..40ec41e --- /dev/null +++ b/assets/static/bootstrap-icons/person-vcard.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-video.svg b/assets/static/bootstrap-icons/person-video.svg new file mode 100644 index 0000000..a991759 --- /dev/null +++ b/assets/static/bootstrap-icons/person-video.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-video2.svg b/assets/static/bootstrap-icons/person-video2.svg new file mode 100644 index 0000000..80b3b8a --- /dev/null +++ b/assets/static/bootstrap-icons/person-video2.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-video3.svg b/assets/static/bootstrap-icons/person-video3.svg new file mode 100644 index 0000000..472d998 --- /dev/null +++ b/assets/static/bootstrap-icons/person-video3.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-walking.svg b/assets/static/bootstrap-icons/person-walking.svg new file mode 100644 index 0000000..16cc0b4 --- /dev/null +++ b/assets/static/bootstrap-icons/person-walking.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-wheelchair.svg b/assets/static/bootstrap-icons/person-wheelchair.svg new file mode 100644 index 0000000..416cad2 --- /dev/null +++ b/assets/static/bootstrap-icons/person-wheelchair.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-workspace.svg b/assets/static/bootstrap-icons/person-workspace.svg new file mode 100644 index 0000000..0b3cdce --- /dev/null +++ b/assets/static/bootstrap-icons/person-workspace.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-x-fill.svg b/assets/static/bootstrap-icons/person-x-fill.svg new file mode 100644 index 0000000..9e31903 --- /dev/null +++ b/assets/static/bootstrap-icons/person-x-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person-x.svg b/assets/static/bootstrap-icons/person-x.svg new file mode 100644 index 0000000..7514c59 --- /dev/null +++ b/assets/static/bootstrap-icons/person-x.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/person.svg b/assets/static/bootstrap-icons/person.svg new file mode 100644 index 0000000..98ea060 --- /dev/null +++ b/assets/static/bootstrap-icons/person.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/phone-fill.svg b/assets/static/bootstrap-icons/phone-fill.svg new file mode 100644 index 0000000..f25bd51 --- /dev/null +++ b/assets/static/bootstrap-icons/phone-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/phone-flip.svg b/assets/static/bootstrap-icons/phone-flip.svg new file mode 100644 index 0000000..3ae28d3 --- /dev/null +++ b/assets/static/bootstrap-icons/phone-flip.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/phone-landscape-fill.svg b/assets/static/bootstrap-icons/phone-landscape-fill.svg new file mode 100644 index 0000000..669bf6e --- /dev/null +++ b/assets/static/bootstrap-icons/phone-landscape-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/phone-landscape.svg b/assets/static/bootstrap-icons/phone-landscape.svg new file mode 100644 index 0000000..4c30ef2 --- /dev/null +++ b/assets/static/bootstrap-icons/phone-landscape.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/phone-vibrate-fill.svg b/assets/static/bootstrap-icons/phone-vibrate-fill.svg new file mode 100644 index 0000000..dc35ca0 --- /dev/null +++ b/assets/static/bootstrap-icons/phone-vibrate-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/phone-vibrate.svg b/assets/static/bootstrap-icons/phone-vibrate.svg new file mode 100644 index 0000000..58acbf6 --- /dev/null +++ b/assets/static/bootstrap-icons/phone-vibrate.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/phone.svg b/assets/static/bootstrap-icons/phone.svg new file mode 100644 index 0000000..4839331 --- /dev/null +++ b/assets/static/bootstrap-icons/phone.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pie-chart-fill.svg b/assets/static/bootstrap-icons/pie-chart-fill.svg new file mode 100644 index 0000000..f667aea --- /dev/null +++ b/assets/static/bootstrap-icons/pie-chart-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pie-chart.svg b/assets/static/bootstrap-icons/pie-chart.svg new file mode 100644 index 0000000..b49251b --- /dev/null +++ b/assets/static/bootstrap-icons/pie-chart.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/piggy-bank-fill.svg b/assets/static/bootstrap-icons/piggy-bank-fill.svg new file mode 100644 index 0000000..592b31d --- /dev/null +++ b/assets/static/bootstrap-icons/piggy-bank-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/piggy-bank.svg b/assets/static/bootstrap-icons/piggy-bank.svg new file mode 100644 index 0000000..86e33eb --- /dev/null +++ b/assets/static/bootstrap-icons/piggy-bank.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pin-angle-fill.svg b/assets/static/bootstrap-icons/pin-angle-fill.svg new file mode 100644 index 0000000..bc3078c --- /dev/null +++ b/assets/static/bootstrap-icons/pin-angle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pin-angle.svg b/assets/static/bootstrap-icons/pin-angle.svg new file mode 100644 index 0000000..ecc4d16 --- /dev/null +++ b/assets/static/bootstrap-icons/pin-angle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pin-fill.svg b/assets/static/bootstrap-icons/pin-fill.svg new file mode 100644 index 0000000..f345059 --- /dev/null +++ b/assets/static/bootstrap-icons/pin-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pin-map-fill.svg b/assets/static/bootstrap-icons/pin-map-fill.svg new file mode 100644 index 0000000..9db0d29 --- /dev/null +++ b/assets/static/bootstrap-icons/pin-map-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pin-map.svg b/assets/static/bootstrap-icons/pin-map.svg new file mode 100644 index 0000000..0462a5a --- /dev/null +++ b/assets/static/bootstrap-icons/pin-map.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pin.svg b/assets/static/bootstrap-icons/pin.svg new file mode 100644 index 0000000..4655620 --- /dev/null +++ b/assets/static/bootstrap-icons/pin.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pinterest.svg b/assets/static/bootstrap-icons/pinterest.svg new file mode 100644 index 0000000..5c850b6 --- /dev/null +++ b/assets/static/bootstrap-icons/pinterest.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pip-fill.svg b/assets/static/bootstrap-icons/pip-fill.svg new file mode 100644 index 0000000..4865244 --- /dev/null +++ b/assets/static/bootstrap-icons/pip-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/pip.svg b/assets/static/bootstrap-icons/pip.svg new file mode 100644 index 0000000..458c9c9 --- /dev/null +++ b/assets/static/bootstrap-icons/pip.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/play-btn-fill.svg b/assets/static/bootstrap-icons/play-btn-fill.svg new file mode 100644 index 0000000..3d0d1c3 --- /dev/null +++ b/assets/static/bootstrap-icons/play-btn-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/play-btn.svg b/assets/static/bootstrap-icons/play-btn.svg new file mode 100644 index 0000000..2fcbc5e --- /dev/null +++ b/assets/static/bootstrap-icons/play-btn.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/play-circle-fill.svg b/assets/static/bootstrap-icons/play-circle-fill.svg new file mode 100644 index 0000000..93eeb93 --- /dev/null +++ b/assets/static/bootstrap-icons/play-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/play-circle.svg b/assets/static/bootstrap-icons/play-circle.svg new file mode 100644 index 0000000..a1d742e --- /dev/null +++ b/assets/static/bootstrap-icons/play-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/play-fill.svg b/assets/static/bootstrap-icons/play-fill.svg new file mode 100644 index 0000000..e538083 --- /dev/null +++ b/assets/static/bootstrap-icons/play-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/play.svg b/assets/static/bootstrap-icons/play.svg new file mode 100644 index 0000000..98954e7 --- /dev/null +++ b/assets/static/bootstrap-icons/play.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/playstation.svg b/assets/static/bootstrap-icons/playstation.svg new file mode 100644 index 0000000..3275d59 --- /dev/null +++ b/assets/static/bootstrap-icons/playstation.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/plug-fill.svg b/assets/static/bootstrap-icons/plug-fill.svg new file mode 100644 index 0000000..99858eb --- /dev/null +++ b/assets/static/bootstrap-icons/plug-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/plug.svg b/assets/static/bootstrap-icons/plug.svg new file mode 100644 index 0000000..9d6a85b --- /dev/null +++ b/assets/static/bootstrap-icons/plug.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/plugin.svg b/assets/static/bootstrap-icons/plugin.svg new file mode 100644 index 0000000..92e99d4 --- /dev/null +++ b/assets/static/bootstrap-icons/plugin.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/plus-circle-dotted.svg b/assets/static/bootstrap-icons/plus-circle-dotted.svg new file mode 100644 index 0000000..2a20e2d --- /dev/null +++ b/assets/static/bootstrap-icons/plus-circle-dotted.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/plus-circle-fill.svg b/assets/static/bootstrap-icons/plus-circle-fill.svg new file mode 100644 index 0000000..d1ec2d0 --- /dev/null +++ b/assets/static/bootstrap-icons/plus-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/plus-circle.svg b/assets/static/bootstrap-icons/plus-circle.svg new file mode 100644 index 0000000..2832373 --- /dev/null +++ b/assets/static/bootstrap-icons/plus-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/plus-lg.svg b/assets/static/bootstrap-icons/plus-lg.svg new file mode 100644 index 0000000..531e86c --- /dev/null +++ b/assets/static/bootstrap-icons/plus-lg.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/plus-slash-minus.svg b/assets/static/bootstrap-icons/plus-slash-minus.svg new file mode 100644 index 0000000..e0fee7d --- /dev/null +++ b/assets/static/bootstrap-icons/plus-slash-minus.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/plus-square-dotted.svg b/assets/static/bootstrap-icons/plus-square-dotted.svg new file mode 100644 index 0000000..e230a08 --- /dev/null +++ b/assets/static/bootstrap-icons/plus-square-dotted.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/plus-square-fill.svg b/assets/static/bootstrap-icons/plus-square-fill.svg new file mode 100644 index 0000000..1dddd13 --- /dev/null +++ b/assets/static/bootstrap-icons/plus-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/plus-square.svg b/assets/static/bootstrap-icons/plus-square.svg new file mode 100644 index 0000000..ef11b48 --- /dev/null +++ b/assets/static/bootstrap-icons/plus-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/plus.svg b/assets/static/bootstrap-icons/plus.svg new file mode 100644 index 0000000..9012271 --- /dev/null +++ b/assets/static/bootstrap-icons/plus.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/postage-fill.svg b/assets/static/bootstrap-icons/postage-fill.svg new file mode 100644 index 0000000..861a3a1 --- /dev/null +++ b/assets/static/bootstrap-icons/postage-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/postage-heart-fill.svg b/assets/static/bootstrap-icons/postage-heart-fill.svg new file mode 100644 index 0000000..4737a4d --- /dev/null +++ b/assets/static/bootstrap-icons/postage-heart-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/postage-heart.svg b/assets/static/bootstrap-icons/postage-heart.svg new file mode 100644 index 0000000..aa35a6c --- /dev/null +++ b/assets/static/bootstrap-icons/postage-heart.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/postage.svg b/assets/static/bootstrap-icons/postage.svg new file mode 100644 index 0000000..54dcfa6 --- /dev/null +++ b/assets/static/bootstrap-icons/postage.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/postcard-fill.svg b/assets/static/bootstrap-icons/postcard-fill.svg new file mode 100644 index 0000000..aeba518 --- /dev/null +++ b/assets/static/bootstrap-icons/postcard-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/postcard-heart-fill.svg b/assets/static/bootstrap-icons/postcard-heart-fill.svg new file mode 100644 index 0000000..1e371b8 --- /dev/null +++ b/assets/static/bootstrap-icons/postcard-heart-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/postcard-heart.svg b/assets/static/bootstrap-icons/postcard-heart.svg new file mode 100644 index 0000000..52c0053 --- /dev/null +++ b/assets/static/bootstrap-icons/postcard-heart.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/postcard.svg b/assets/static/bootstrap-icons/postcard.svg new file mode 100644 index 0000000..43ba40b --- /dev/null +++ b/assets/static/bootstrap-icons/postcard.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/power.svg b/assets/static/bootstrap-icons/power.svg new file mode 100644 index 0000000..937b842 --- /dev/null +++ b/assets/static/bootstrap-icons/power.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/prescription.svg b/assets/static/bootstrap-icons/prescription.svg new file mode 100644 index 0000000..b895b2b --- /dev/null +++ b/assets/static/bootstrap-icons/prescription.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/prescription2.svg b/assets/static/bootstrap-icons/prescription2.svg new file mode 100644 index 0000000..cb278b0 --- /dev/null +++ b/assets/static/bootstrap-icons/prescription2.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/printer-fill.svg b/assets/static/bootstrap-icons/printer-fill.svg new file mode 100644 index 0000000..43cee36 --- /dev/null +++ b/assets/static/bootstrap-icons/printer-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/printer.svg b/assets/static/bootstrap-icons/printer.svg new file mode 100644 index 0000000..0886a57 --- /dev/null +++ b/assets/static/bootstrap-icons/printer.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/projector-fill.svg b/assets/static/bootstrap-icons/projector-fill.svg new file mode 100644 index 0000000..046166c --- /dev/null +++ b/assets/static/bootstrap-icons/projector-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/projector.svg b/assets/static/bootstrap-icons/projector.svg new file mode 100644 index 0000000..77e68b0 --- /dev/null +++ b/assets/static/bootstrap-icons/projector.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/puzzle-fill.svg b/assets/static/bootstrap-icons/puzzle-fill.svg new file mode 100644 index 0000000..92c4ea0 --- /dev/null +++ b/assets/static/bootstrap-icons/puzzle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/puzzle.svg b/assets/static/bootstrap-icons/puzzle.svg new file mode 100644 index 0000000..44903f7 --- /dev/null +++ b/assets/static/bootstrap-icons/puzzle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/qr-code-scan.svg b/assets/static/bootstrap-icons/qr-code-scan.svg new file mode 100644 index 0000000..3c53387 --- /dev/null +++ b/assets/static/bootstrap-icons/qr-code-scan.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/qr-code.svg b/assets/static/bootstrap-icons/qr-code.svg new file mode 100644 index 0000000..e09157a --- /dev/null +++ b/assets/static/bootstrap-icons/qr-code.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/question-circle-fill.svg b/assets/static/bootstrap-icons/question-circle-fill.svg new file mode 100644 index 0000000..8b2a2c0 --- /dev/null +++ b/assets/static/bootstrap-icons/question-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/question-circle.svg b/assets/static/bootstrap-icons/question-circle.svg new file mode 100644 index 0000000..283e653 --- /dev/null +++ b/assets/static/bootstrap-icons/question-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/question-diamond-fill.svg b/assets/static/bootstrap-icons/question-diamond-fill.svg new file mode 100644 index 0000000..6bf3512 --- /dev/null +++ b/assets/static/bootstrap-icons/question-diamond-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/question-diamond.svg b/assets/static/bootstrap-icons/question-diamond.svg new file mode 100644 index 0000000..a777b47 --- /dev/null +++ b/assets/static/bootstrap-icons/question-diamond.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/question-lg.svg b/assets/static/bootstrap-icons/question-lg.svg new file mode 100644 index 0000000..756ea0f --- /dev/null +++ b/assets/static/bootstrap-icons/question-lg.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/question-octagon-fill.svg b/assets/static/bootstrap-icons/question-octagon-fill.svg new file mode 100644 index 0000000..c0c43ef --- /dev/null +++ b/assets/static/bootstrap-icons/question-octagon-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/question-octagon.svg b/assets/static/bootstrap-icons/question-octagon.svg new file mode 100644 index 0000000..5116862 --- /dev/null +++ b/assets/static/bootstrap-icons/question-octagon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/question-square-fill.svg b/assets/static/bootstrap-icons/question-square-fill.svg new file mode 100644 index 0000000..a266f9f --- /dev/null +++ b/assets/static/bootstrap-icons/question-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/question-square.svg b/assets/static/bootstrap-icons/question-square.svg new file mode 100644 index 0000000..ad44a20 --- /dev/null +++ b/assets/static/bootstrap-icons/question-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/question.svg b/assets/static/bootstrap-icons/question.svg new file mode 100644 index 0000000..ba185ad --- /dev/null +++ b/assets/static/bootstrap-icons/question.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/quora.svg b/assets/static/bootstrap-icons/quora.svg new file mode 100644 index 0000000..85ca1bd --- /dev/null +++ b/assets/static/bootstrap-icons/quora.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/quote.svg b/assets/static/bootstrap-icons/quote.svg new file mode 100644 index 0000000..0aa0e17 --- /dev/null +++ b/assets/static/bootstrap-icons/quote.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/r-circle-fill.svg b/assets/static/bootstrap-icons/r-circle-fill.svg new file mode 100644 index 0000000..810423e --- /dev/null +++ b/assets/static/bootstrap-icons/r-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/r-circle.svg b/assets/static/bootstrap-icons/r-circle.svg new file mode 100644 index 0000000..bf2d8d6 --- /dev/null +++ b/assets/static/bootstrap-icons/r-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/r-square-fill.svg b/assets/static/bootstrap-icons/r-square-fill.svg new file mode 100644 index 0000000..b1151f3 --- /dev/null +++ b/assets/static/bootstrap-icons/r-square-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/r-square.svg b/assets/static/bootstrap-icons/r-square.svg new file mode 100644 index 0000000..e19e688 --- /dev/null +++ b/assets/static/bootstrap-icons/r-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/radar.svg b/assets/static/bootstrap-icons/radar.svg new file mode 100644 index 0000000..024f3fd --- /dev/null +++ b/assets/static/bootstrap-icons/radar.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/radioactive.svg b/assets/static/bootstrap-icons/radioactive.svg new file mode 100644 index 0000000..3eaaa56 --- /dev/null +++ b/assets/static/bootstrap-icons/radioactive.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/rainbow.svg b/assets/static/bootstrap-icons/rainbow.svg new file mode 100644 index 0000000..e864abf --- /dev/null +++ b/assets/static/bootstrap-icons/rainbow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/receipt-cutoff.svg b/assets/static/bootstrap-icons/receipt-cutoff.svg new file mode 100644 index 0000000..21c3bc8 --- /dev/null +++ b/assets/static/bootstrap-icons/receipt-cutoff.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/receipt.svg b/assets/static/bootstrap-icons/receipt.svg new file mode 100644 index 0000000..ab29fe6 --- /dev/null +++ b/assets/static/bootstrap-icons/receipt.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/reception-0.svg b/assets/static/bootstrap-icons/reception-0.svg new file mode 100644 index 0000000..a7c7872 --- /dev/null +++ b/assets/static/bootstrap-icons/reception-0.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/reception-1.svg b/assets/static/bootstrap-icons/reception-1.svg new file mode 100644 index 0000000..4081ceb --- /dev/null +++ b/assets/static/bootstrap-icons/reception-1.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/reception-2.svg b/assets/static/bootstrap-icons/reception-2.svg new file mode 100644 index 0000000..7e1acc5 --- /dev/null +++ b/assets/static/bootstrap-icons/reception-2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/reception-3.svg b/assets/static/bootstrap-icons/reception-3.svg new file mode 100644 index 0000000..e9ea476 --- /dev/null +++ b/assets/static/bootstrap-icons/reception-3.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/reception-4.svg b/assets/static/bootstrap-icons/reception-4.svg new file mode 100644 index 0000000..7791e4b --- /dev/null +++ b/assets/static/bootstrap-icons/reception-4.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/record-btn-fill.svg b/assets/static/bootstrap-icons/record-btn-fill.svg new file mode 100644 index 0000000..83ee303 --- /dev/null +++ b/assets/static/bootstrap-icons/record-btn-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/record-btn.svg b/assets/static/bootstrap-icons/record-btn.svg new file mode 100644 index 0000000..7ba84ce --- /dev/null +++ b/assets/static/bootstrap-icons/record-btn.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/record-circle-fill.svg b/assets/static/bootstrap-icons/record-circle-fill.svg new file mode 100644 index 0000000..0db59d1 --- /dev/null +++ b/assets/static/bootstrap-icons/record-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/record-circle.svg b/assets/static/bootstrap-icons/record-circle.svg new file mode 100644 index 0000000..5dad17b --- /dev/null +++ b/assets/static/bootstrap-icons/record-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/record-fill.svg b/assets/static/bootstrap-icons/record-fill.svg new file mode 100644 index 0000000..ef31df0 --- /dev/null +++ b/assets/static/bootstrap-icons/record-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/record.svg b/assets/static/bootstrap-icons/record.svg new file mode 100644 index 0000000..5ec840c --- /dev/null +++ b/assets/static/bootstrap-icons/record.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/record2-fill.svg b/assets/static/bootstrap-icons/record2-fill.svg new file mode 100644 index 0000000..8ad4fe3 --- /dev/null +++ b/assets/static/bootstrap-icons/record2-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/record2.svg b/assets/static/bootstrap-icons/record2.svg new file mode 100644 index 0000000..3b5c5ca --- /dev/null +++ b/assets/static/bootstrap-icons/record2.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/recycle.svg b/assets/static/bootstrap-icons/recycle.svg new file mode 100644 index 0000000..21d1bd9 --- /dev/null +++ b/assets/static/bootstrap-icons/recycle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/reddit.svg b/assets/static/bootstrap-icons/reddit.svg new file mode 100644 index 0000000..777aead --- /dev/null +++ b/assets/static/bootstrap-icons/reddit.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/regex.svg b/assets/static/bootstrap-icons/regex.svg new file mode 100644 index 0000000..ec8bf00 --- /dev/null +++ b/assets/static/bootstrap-icons/regex.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/repeat-1.svg b/assets/static/bootstrap-icons/repeat-1.svg new file mode 100644 index 0000000..9357fcf --- /dev/null +++ b/assets/static/bootstrap-icons/repeat-1.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/repeat.svg b/assets/static/bootstrap-icons/repeat.svg new file mode 100644 index 0000000..51765c9 --- /dev/null +++ b/assets/static/bootstrap-icons/repeat.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/reply-all-fill.svg b/assets/static/bootstrap-icons/reply-all-fill.svg new file mode 100644 index 0000000..95e18a2 --- /dev/null +++ b/assets/static/bootstrap-icons/reply-all-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/reply-all.svg b/assets/static/bootstrap-icons/reply-all.svg new file mode 100644 index 0000000..decad51 --- /dev/null +++ b/assets/static/bootstrap-icons/reply-all.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/reply-fill.svg b/assets/static/bootstrap-icons/reply-fill.svg new file mode 100644 index 0000000..82358b1 --- /dev/null +++ b/assets/static/bootstrap-icons/reply-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/reply.svg b/assets/static/bootstrap-icons/reply.svg new file mode 100644 index 0000000..5bb432e --- /dev/null +++ b/assets/static/bootstrap-icons/reply.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/rewind-btn-fill.svg b/assets/static/bootstrap-icons/rewind-btn-fill.svg new file mode 100644 index 0000000..8ea4155 --- /dev/null +++ b/assets/static/bootstrap-icons/rewind-btn-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/rewind-btn.svg b/assets/static/bootstrap-icons/rewind-btn.svg new file mode 100644 index 0000000..47bd717 --- /dev/null +++ b/assets/static/bootstrap-icons/rewind-btn.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/rewind-circle-fill.svg b/assets/static/bootstrap-icons/rewind-circle-fill.svg new file mode 100644 index 0000000..b972044 --- /dev/null +++ b/assets/static/bootstrap-icons/rewind-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/rewind-circle.svg b/assets/static/bootstrap-icons/rewind-circle.svg new file mode 100644 index 0000000..4952147 --- /dev/null +++ b/assets/static/bootstrap-icons/rewind-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/rewind-fill.svg b/assets/static/bootstrap-icons/rewind-fill.svg new file mode 100644 index 0000000..5919f7e --- /dev/null +++ b/assets/static/bootstrap-icons/rewind-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/rewind.svg b/assets/static/bootstrap-icons/rewind.svg new file mode 100644 index 0000000..bc731e7 --- /dev/null +++ b/assets/static/bootstrap-icons/rewind.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/robot.svg b/assets/static/bootstrap-icons/robot.svg new file mode 100644 index 0000000..a224202 --- /dev/null +++ b/assets/static/bootstrap-icons/robot.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/rocket-fill.svg b/assets/static/bootstrap-icons/rocket-fill.svg new file mode 100644 index 0000000..f319029 --- /dev/null +++ b/assets/static/bootstrap-icons/rocket-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/rocket-takeoff-fill.svg b/assets/static/bootstrap-icons/rocket-takeoff-fill.svg new file mode 100644 index 0000000..707d205 --- /dev/null +++ b/assets/static/bootstrap-icons/rocket-takeoff-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/rocket-takeoff.svg b/assets/static/bootstrap-icons/rocket-takeoff.svg new file mode 100644 index 0000000..2abc6d4 --- /dev/null +++ b/assets/static/bootstrap-icons/rocket-takeoff.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/rocket.svg b/assets/static/bootstrap-icons/rocket.svg new file mode 100644 index 0000000..b760e1f --- /dev/null +++ b/assets/static/bootstrap-icons/rocket.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/router-fill.svg b/assets/static/bootstrap-icons/router-fill.svg new file mode 100644 index 0000000..74d1469 --- /dev/null +++ b/assets/static/bootstrap-icons/router-fill.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/router.svg b/assets/static/bootstrap-icons/router.svg new file mode 100644 index 0000000..62fac78 --- /dev/null +++ b/assets/static/bootstrap-icons/router.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/rss-fill.svg b/assets/static/bootstrap-icons/rss-fill.svg new file mode 100644 index 0000000..50d7cfd --- /dev/null +++ b/assets/static/bootstrap-icons/rss-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/rss.svg b/assets/static/bootstrap-icons/rss.svg new file mode 100644 index 0000000..18dc9f1 --- /dev/null +++ b/assets/static/bootstrap-icons/rss.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/rulers.svg b/assets/static/bootstrap-icons/rulers.svg new file mode 100644 index 0000000..90fb01c --- /dev/null +++ b/assets/static/bootstrap-icons/rulers.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/safe-fill.svg b/assets/static/bootstrap-icons/safe-fill.svg new file mode 100644 index 0000000..6da7a7d --- /dev/null +++ b/assets/static/bootstrap-icons/safe-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/safe.svg b/assets/static/bootstrap-icons/safe.svg new file mode 100644 index 0000000..d6d24c2 --- /dev/null +++ b/assets/static/bootstrap-icons/safe.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/safe2-fill.svg b/assets/static/bootstrap-icons/safe2-fill.svg new file mode 100644 index 0000000..064e073 --- /dev/null +++ b/assets/static/bootstrap-icons/safe2-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/safe2.svg b/assets/static/bootstrap-icons/safe2.svg new file mode 100644 index 0000000..9c80f55 --- /dev/null +++ b/assets/static/bootstrap-icons/safe2.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/save-fill.svg b/assets/static/bootstrap-icons/save-fill.svg new file mode 100644 index 0000000..1c42812 --- /dev/null +++ b/assets/static/bootstrap-icons/save-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/save.svg b/assets/static/bootstrap-icons/save.svg new file mode 100644 index 0000000..9dd7b2f --- /dev/null +++ b/assets/static/bootstrap-icons/save.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/save2-fill.svg b/assets/static/bootstrap-icons/save2-fill.svg new file mode 100644 index 0000000..207f91b --- /dev/null +++ b/assets/static/bootstrap-icons/save2-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/save2.svg b/assets/static/bootstrap-icons/save2.svg new file mode 100644 index 0000000..988c4f1 --- /dev/null +++ b/assets/static/bootstrap-icons/save2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/scissors.svg b/assets/static/bootstrap-icons/scissors.svg new file mode 100644 index 0000000..2f566e4 --- /dev/null +++ b/assets/static/bootstrap-icons/scissors.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/scooter.svg b/assets/static/bootstrap-icons/scooter.svg new file mode 100644 index 0000000..8828452 --- /dev/null +++ b/assets/static/bootstrap-icons/scooter.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/screwdriver.svg b/assets/static/bootstrap-icons/screwdriver.svg new file mode 100644 index 0000000..54d5a2c --- /dev/null +++ b/assets/static/bootstrap-icons/screwdriver.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sd-card-fill.svg b/assets/static/bootstrap-icons/sd-card-fill.svg new file mode 100644 index 0000000..655a96d --- /dev/null +++ b/assets/static/bootstrap-icons/sd-card-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sd-card.svg b/assets/static/bootstrap-icons/sd-card.svg new file mode 100644 index 0000000..564661a --- /dev/null +++ b/assets/static/bootstrap-icons/sd-card.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/search-heart-fill.svg b/assets/static/bootstrap-icons/search-heart-fill.svg new file mode 100644 index 0000000..c57bb48 --- /dev/null +++ b/assets/static/bootstrap-icons/search-heart-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/search-heart.svg b/assets/static/bootstrap-icons/search-heart.svg new file mode 100644 index 0000000..d76bfe5 --- /dev/null +++ b/assets/static/bootstrap-icons/search-heart.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/search.svg b/assets/static/bootstrap-icons/search.svg new file mode 100644 index 0000000..3318054 --- /dev/null +++ b/assets/static/bootstrap-icons/search.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/segmented-nav.svg b/assets/static/bootstrap-icons/segmented-nav.svg new file mode 100644 index 0000000..b274b68 --- /dev/null +++ b/assets/static/bootstrap-icons/segmented-nav.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/send-arrow-down-fill.svg b/assets/static/bootstrap-icons/send-arrow-down-fill.svg new file mode 100644 index 0000000..6d43965 --- /dev/null +++ b/assets/static/bootstrap-icons/send-arrow-down-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/send-arrow-down.svg b/assets/static/bootstrap-icons/send-arrow-down.svg new file mode 100644 index 0000000..dcbae56 --- /dev/null +++ b/assets/static/bootstrap-icons/send-arrow-down.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/send-arrow-up-fill.svg b/assets/static/bootstrap-icons/send-arrow-up-fill.svg new file mode 100644 index 0000000..19abab7 --- /dev/null +++ b/assets/static/bootstrap-icons/send-arrow-up-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/send-arrow-up.svg b/assets/static/bootstrap-icons/send-arrow-up.svg new file mode 100644 index 0000000..a642dac --- /dev/null +++ b/assets/static/bootstrap-icons/send-arrow-up.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/send-check-fill.svg b/assets/static/bootstrap-icons/send-check-fill.svg new file mode 100644 index 0000000..c4259c8 --- /dev/null +++ b/assets/static/bootstrap-icons/send-check-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/send-check.svg b/assets/static/bootstrap-icons/send-check.svg new file mode 100644 index 0000000..5221868 --- /dev/null +++ b/assets/static/bootstrap-icons/send-check.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/send-dash-fill.svg b/assets/static/bootstrap-icons/send-dash-fill.svg new file mode 100644 index 0000000..12a82df --- /dev/null +++ b/assets/static/bootstrap-icons/send-dash-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/send-dash.svg b/assets/static/bootstrap-icons/send-dash.svg new file mode 100644 index 0000000..63fc38c --- /dev/null +++ b/assets/static/bootstrap-icons/send-dash.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/send-exclamation-fill.svg b/assets/static/bootstrap-icons/send-exclamation-fill.svg new file mode 100644 index 0000000..fce810f --- /dev/null +++ b/assets/static/bootstrap-icons/send-exclamation-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/send-exclamation.svg b/assets/static/bootstrap-icons/send-exclamation.svg new file mode 100644 index 0000000..8a72f31 --- /dev/null +++ b/assets/static/bootstrap-icons/send-exclamation.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/send-fill.svg b/assets/static/bootstrap-icons/send-fill.svg new file mode 100644 index 0000000..6e95d27 --- /dev/null +++ b/assets/static/bootstrap-icons/send-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/send-plus-fill.svg b/assets/static/bootstrap-icons/send-plus-fill.svg new file mode 100644 index 0000000..63b0482 --- /dev/null +++ b/assets/static/bootstrap-icons/send-plus-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/send-plus.svg b/assets/static/bootstrap-icons/send-plus.svg new file mode 100644 index 0000000..350b388 --- /dev/null +++ b/assets/static/bootstrap-icons/send-plus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/send-slash-fill.svg b/assets/static/bootstrap-icons/send-slash-fill.svg new file mode 100644 index 0000000..e98aa92 --- /dev/null +++ b/assets/static/bootstrap-icons/send-slash-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/send-slash.svg b/assets/static/bootstrap-icons/send-slash.svg new file mode 100644 index 0000000..e434afe --- /dev/null +++ b/assets/static/bootstrap-icons/send-slash.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/send-x-fill.svg b/assets/static/bootstrap-icons/send-x-fill.svg new file mode 100644 index 0000000..45a98a4 --- /dev/null +++ b/assets/static/bootstrap-icons/send-x-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/send-x.svg b/assets/static/bootstrap-icons/send-x.svg new file mode 100644 index 0000000..5b854c2 --- /dev/null +++ b/assets/static/bootstrap-icons/send-x.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/send.svg b/assets/static/bootstrap-icons/send.svg new file mode 100644 index 0000000..8db355e --- /dev/null +++ b/assets/static/bootstrap-icons/send.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/server.svg b/assets/static/bootstrap-icons/server.svg new file mode 100644 index 0000000..bb8ca8f --- /dev/null +++ b/assets/static/bootstrap-icons/server.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/shadows.svg b/assets/static/bootstrap-icons/shadows.svg new file mode 100644 index 0000000..6b09f0f --- /dev/null +++ b/assets/static/bootstrap-icons/shadows.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/share-fill.svg b/assets/static/bootstrap-icons/share-fill.svg new file mode 100644 index 0000000..bdc07ca --- /dev/null +++ b/assets/static/bootstrap-icons/share-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/share.svg b/assets/static/bootstrap-icons/share.svg new file mode 100644 index 0000000..bc62b93 --- /dev/null +++ b/assets/static/bootstrap-icons/share.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/shield-check.svg b/assets/static/bootstrap-icons/shield-check.svg new file mode 100644 index 0000000..3908fca --- /dev/null +++ b/assets/static/bootstrap-icons/shield-check.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/shield-exclamation.svg b/assets/static/bootstrap-icons/shield-exclamation.svg new file mode 100644 index 0000000..9826504 --- /dev/null +++ b/assets/static/bootstrap-icons/shield-exclamation.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/shield-fill-check.svg b/assets/static/bootstrap-icons/shield-fill-check.svg new file mode 100644 index 0000000..f914f1f --- /dev/null +++ b/assets/static/bootstrap-icons/shield-fill-check.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/shield-fill-exclamation.svg b/assets/static/bootstrap-icons/shield-fill-exclamation.svg new file mode 100644 index 0000000..99a6bf9 --- /dev/null +++ b/assets/static/bootstrap-icons/shield-fill-exclamation.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/shield-fill-minus.svg b/assets/static/bootstrap-icons/shield-fill-minus.svg new file mode 100644 index 0000000..584f5ae --- /dev/null +++ b/assets/static/bootstrap-icons/shield-fill-minus.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/shield-fill-plus.svg b/assets/static/bootstrap-icons/shield-fill-plus.svg new file mode 100644 index 0000000..43a3169 --- /dev/null +++ b/assets/static/bootstrap-icons/shield-fill-plus.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/shield-fill-x.svg b/assets/static/bootstrap-icons/shield-fill-x.svg new file mode 100644 index 0000000..42267cf --- /dev/null +++ b/assets/static/bootstrap-icons/shield-fill-x.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/shield-fill.svg b/assets/static/bootstrap-icons/shield-fill.svg new file mode 100644 index 0000000..12a61bc --- /dev/null +++ b/assets/static/bootstrap-icons/shield-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/shield-lock-fill.svg b/assets/static/bootstrap-icons/shield-lock-fill.svg new file mode 100644 index 0000000..0fccf6f --- /dev/null +++ b/assets/static/bootstrap-icons/shield-lock-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/shield-lock.svg b/assets/static/bootstrap-icons/shield-lock.svg new file mode 100644 index 0000000..316fb3c --- /dev/null +++ b/assets/static/bootstrap-icons/shield-lock.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/shield-minus.svg b/assets/static/bootstrap-icons/shield-minus.svg new file mode 100644 index 0000000..9fb8712 --- /dev/null +++ b/assets/static/bootstrap-icons/shield-minus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/shield-plus.svg b/assets/static/bootstrap-icons/shield-plus.svg new file mode 100644 index 0000000..3b19b28 --- /dev/null +++ b/assets/static/bootstrap-icons/shield-plus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/shield-shaded.svg b/assets/static/bootstrap-icons/shield-shaded.svg new file mode 100644 index 0000000..4908f5d --- /dev/null +++ b/assets/static/bootstrap-icons/shield-shaded.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/shield-slash-fill.svg b/assets/static/bootstrap-icons/shield-slash-fill.svg new file mode 100644 index 0000000..d270d6d --- /dev/null +++ b/assets/static/bootstrap-icons/shield-slash-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/shield-slash.svg b/assets/static/bootstrap-icons/shield-slash.svg new file mode 100644 index 0000000..abc01b1 --- /dev/null +++ b/assets/static/bootstrap-icons/shield-slash.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/shield-x.svg b/assets/static/bootstrap-icons/shield-x.svg new file mode 100644 index 0000000..cc9c59d --- /dev/null +++ b/assets/static/bootstrap-icons/shield-x.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/shield.svg b/assets/static/bootstrap-icons/shield.svg new file mode 100644 index 0000000..7e18d1b --- /dev/null +++ b/assets/static/bootstrap-icons/shield.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/shift-fill.svg b/assets/static/bootstrap-icons/shift-fill.svg new file mode 100644 index 0000000..37583e1 --- /dev/null +++ b/assets/static/bootstrap-icons/shift-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/shift.svg b/assets/static/bootstrap-icons/shift.svg new file mode 100644 index 0000000..5d8a6e3 --- /dev/null +++ b/assets/static/bootstrap-icons/shift.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/shop-window.svg b/assets/static/bootstrap-icons/shop-window.svg new file mode 100644 index 0000000..14e0d42 --- /dev/null +++ b/assets/static/bootstrap-icons/shop-window.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/shop.svg b/assets/static/bootstrap-icons/shop.svg new file mode 100644 index 0000000..e6bb8c0 --- /dev/null +++ b/assets/static/bootstrap-icons/shop.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/shuffle.svg b/assets/static/bootstrap-icons/shuffle.svg new file mode 100644 index 0000000..2787bf2 --- /dev/null +++ b/assets/static/bootstrap-icons/shuffle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-dead-end-fill.svg b/assets/static/bootstrap-icons/sign-dead-end-fill.svg new file mode 100644 index 0000000..b362833 --- /dev/null +++ b/assets/static/bootstrap-icons/sign-dead-end-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-dead-end.svg b/assets/static/bootstrap-icons/sign-dead-end.svg new file mode 100644 index 0000000..b87d368 --- /dev/null +++ b/assets/static/bootstrap-icons/sign-dead-end.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-do-not-enter-fill.svg b/assets/static/bootstrap-icons/sign-do-not-enter-fill.svg new file mode 100644 index 0000000..f86ebfa --- /dev/null +++ b/assets/static/bootstrap-icons/sign-do-not-enter-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-do-not-enter.svg b/assets/static/bootstrap-icons/sign-do-not-enter.svg new file mode 100644 index 0000000..2e2c877 --- /dev/null +++ b/assets/static/bootstrap-icons/sign-do-not-enter.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-intersection-fill.svg b/assets/static/bootstrap-icons/sign-intersection-fill.svg new file mode 100644 index 0000000..7fd8f3f --- /dev/null +++ b/assets/static/bootstrap-icons/sign-intersection-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-intersection-side-fill.svg b/assets/static/bootstrap-icons/sign-intersection-side-fill.svg new file mode 100644 index 0000000..38870b5 --- /dev/null +++ b/assets/static/bootstrap-icons/sign-intersection-side-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-intersection-side.svg b/assets/static/bootstrap-icons/sign-intersection-side.svg new file mode 100644 index 0000000..df9015a --- /dev/null +++ b/assets/static/bootstrap-icons/sign-intersection-side.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-intersection-t-fill.svg b/assets/static/bootstrap-icons/sign-intersection-t-fill.svg new file mode 100644 index 0000000..15a007e --- /dev/null +++ b/assets/static/bootstrap-icons/sign-intersection-t-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-intersection-t.svg b/assets/static/bootstrap-icons/sign-intersection-t.svg new file mode 100644 index 0000000..4ba9f6f --- /dev/null +++ b/assets/static/bootstrap-icons/sign-intersection-t.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-intersection-y-fill.svg b/assets/static/bootstrap-icons/sign-intersection-y-fill.svg new file mode 100644 index 0000000..01a03d0 --- /dev/null +++ b/assets/static/bootstrap-icons/sign-intersection-y-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-intersection-y.svg b/assets/static/bootstrap-icons/sign-intersection-y.svg new file mode 100644 index 0000000..e0e387f --- /dev/null +++ b/assets/static/bootstrap-icons/sign-intersection-y.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-intersection.svg b/assets/static/bootstrap-icons/sign-intersection.svg new file mode 100644 index 0000000..be2ffdc --- /dev/null +++ b/assets/static/bootstrap-icons/sign-intersection.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-merge-left-fill.svg b/assets/static/bootstrap-icons/sign-merge-left-fill.svg new file mode 100644 index 0000000..1408133 --- /dev/null +++ b/assets/static/bootstrap-icons/sign-merge-left-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-merge-left.svg b/assets/static/bootstrap-icons/sign-merge-left.svg new file mode 100644 index 0000000..3447bcf --- /dev/null +++ b/assets/static/bootstrap-icons/sign-merge-left.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-merge-right-fill.svg b/assets/static/bootstrap-icons/sign-merge-right-fill.svg new file mode 100644 index 0000000..a952bb5 --- /dev/null +++ b/assets/static/bootstrap-icons/sign-merge-right-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-merge-right.svg b/assets/static/bootstrap-icons/sign-merge-right.svg new file mode 100644 index 0000000..ab3e08a --- /dev/null +++ b/assets/static/bootstrap-icons/sign-merge-right.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-no-left-turn-fill.svg b/assets/static/bootstrap-icons/sign-no-left-turn-fill.svg new file mode 100644 index 0000000..85f421a --- /dev/null +++ b/assets/static/bootstrap-icons/sign-no-left-turn-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-no-left-turn.svg b/assets/static/bootstrap-icons/sign-no-left-turn.svg new file mode 100644 index 0000000..d45f090 --- /dev/null +++ b/assets/static/bootstrap-icons/sign-no-left-turn.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-no-parking-fill.svg b/assets/static/bootstrap-icons/sign-no-parking-fill.svg new file mode 100644 index 0000000..c4100d9 --- /dev/null +++ b/assets/static/bootstrap-icons/sign-no-parking-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-no-parking.svg b/assets/static/bootstrap-icons/sign-no-parking.svg new file mode 100644 index 0000000..1679603 --- /dev/null +++ b/assets/static/bootstrap-icons/sign-no-parking.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-no-right-turn-fill.svg b/assets/static/bootstrap-icons/sign-no-right-turn-fill.svg new file mode 100644 index 0000000..c3883da --- /dev/null +++ b/assets/static/bootstrap-icons/sign-no-right-turn-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-no-right-turn.svg b/assets/static/bootstrap-icons/sign-no-right-turn.svg new file mode 100644 index 0000000..209b918 --- /dev/null +++ b/assets/static/bootstrap-icons/sign-no-right-turn.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-railroad-fill.svg b/assets/static/bootstrap-icons/sign-railroad-fill.svg new file mode 100644 index 0000000..61d88a9 --- /dev/null +++ b/assets/static/bootstrap-icons/sign-railroad-fill.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-railroad.svg b/assets/static/bootstrap-icons/sign-railroad.svg new file mode 100644 index 0000000..b5d7339 --- /dev/null +++ b/assets/static/bootstrap-icons/sign-railroad.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-stop-fill.svg b/assets/static/bootstrap-icons/sign-stop-fill.svg new file mode 100644 index 0000000..08efb9a --- /dev/null +++ b/assets/static/bootstrap-icons/sign-stop-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-stop-lights-fill.svg b/assets/static/bootstrap-icons/sign-stop-lights-fill.svg new file mode 100644 index 0000000..9be8e0c --- /dev/null +++ b/assets/static/bootstrap-icons/sign-stop-lights-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-stop-lights.svg b/assets/static/bootstrap-icons/sign-stop-lights.svg new file mode 100644 index 0000000..85918cf --- /dev/null +++ b/assets/static/bootstrap-icons/sign-stop-lights.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-stop.svg b/assets/static/bootstrap-icons/sign-stop.svg new file mode 100644 index 0000000..49128dc --- /dev/null +++ b/assets/static/bootstrap-icons/sign-stop.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-turn-left-fill.svg b/assets/static/bootstrap-icons/sign-turn-left-fill.svg new file mode 100644 index 0000000..4b8358e --- /dev/null +++ b/assets/static/bootstrap-icons/sign-turn-left-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-turn-left.svg b/assets/static/bootstrap-icons/sign-turn-left.svg new file mode 100644 index 0000000..c1b34ed --- /dev/null +++ b/assets/static/bootstrap-icons/sign-turn-left.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-turn-right-fill.svg b/assets/static/bootstrap-icons/sign-turn-right-fill.svg new file mode 100644 index 0000000..29d8d2c --- /dev/null +++ b/assets/static/bootstrap-icons/sign-turn-right-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-turn-right.svg b/assets/static/bootstrap-icons/sign-turn-right.svg new file mode 100644 index 0000000..956614a --- /dev/null +++ b/assets/static/bootstrap-icons/sign-turn-right.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-turn-slight-left-fill.svg b/assets/static/bootstrap-icons/sign-turn-slight-left-fill.svg new file mode 100644 index 0000000..80b2977 --- /dev/null +++ b/assets/static/bootstrap-icons/sign-turn-slight-left-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-turn-slight-left.svg b/assets/static/bootstrap-icons/sign-turn-slight-left.svg new file mode 100644 index 0000000..98f0a0a --- /dev/null +++ b/assets/static/bootstrap-icons/sign-turn-slight-left.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-turn-slight-right-fill.svg b/assets/static/bootstrap-icons/sign-turn-slight-right-fill.svg new file mode 100644 index 0000000..2734952 --- /dev/null +++ b/assets/static/bootstrap-icons/sign-turn-slight-right-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-turn-slight-right.svg b/assets/static/bootstrap-icons/sign-turn-slight-right.svg new file mode 100644 index 0000000..c462f19 --- /dev/null +++ b/assets/static/bootstrap-icons/sign-turn-slight-right.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-yield-fill.svg b/assets/static/bootstrap-icons/sign-yield-fill.svg new file mode 100644 index 0000000..79fa190 --- /dev/null +++ b/assets/static/bootstrap-icons/sign-yield-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sign-yield.svg b/assets/static/bootstrap-icons/sign-yield.svg new file mode 100644 index 0000000..23bd623 --- /dev/null +++ b/assets/static/bootstrap-icons/sign-yield.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/signal.svg b/assets/static/bootstrap-icons/signal.svg new file mode 100644 index 0000000..1583f97 --- /dev/null +++ b/assets/static/bootstrap-icons/signal.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/signpost-2-fill.svg b/assets/static/bootstrap-icons/signpost-2-fill.svg new file mode 100644 index 0000000..58c05a6 --- /dev/null +++ b/assets/static/bootstrap-icons/signpost-2-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/signpost-2.svg b/assets/static/bootstrap-icons/signpost-2.svg new file mode 100644 index 0000000..e3454bd --- /dev/null +++ b/assets/static/bootstrap-icons/signpost-2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/signpost-fill.svg b/assets/static/bootstrap-icons/signpost-fill.svg new file mode 100644 index 0000000..00989a6 --- /dev/null +++ b/assets/static/bootstrap-icons/signpost-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/signpost-split-fill.svg b/assets/static/bootstrap-icons/signpost-split-fill.svg new file mode 100644 index 0000000..9b720f0 --- /dev/null +++ b/assets/static/bootstrap-icons/signpost-split-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/signpost-split.svg b/assets/static/bootstrap-icons/signpost-split.svg new file mode 100644 index 0000000..7fb69b7 --- /dev/null +++ b/assets/static/bootstrap-icons/signpost-split.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/signpost.svg b/assets/static/bootstrap-icons/signpost.svg new file mode 100644 index 0000000..940e664 --- /dev/null +++ b/assets/static/bootstrap-icons/signpost.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sim-fill.svg b/assets/static/bootstrap-icons/sim-fill.svg new file mode 100644 index 0000000..c7922b6 --- /dev/null +++ b/assets/static/bootstrap-icons/sim-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sim-slash-fill.svg b/assets/static/bootstrap-icons/sim-slash-fill.svg new file mode 100644 index 0000000..b608de7 --- /dev/null +++ b/assets/static/bootstrap-icons/sim-slash-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sim-slash.svg b/assets/static/bootstrap-icons/sim-slash.svg new file mode 100644 index 0000000..c8e0dc4 --- /dev/null +++ b/assets/static/bootstrap-icons/sim-slash.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sim.svg b/assets/static/bootstrap-icons/sim.svg new file mode 100644 index 0000000..0d71a11 --- /dev/null +++ b/assets/static/bootstrap-icons/sim.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sina-weibo.svg b/assets/static/bootstrap-icons/sina-weibo.svg new file mode 100644 index 0000000..6d484d2 --- /dev/null +++ b/assets/static/bootstrap-icons/sina-weibo.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-backward-btn-fill.svg b/assets/static/bootstrap-icons/skip-backward-btn-fill.svg new file mode 100644 index 0000000..2029489 --- /dev/null +++ b/assets/static/bootstrap-icons/skip-backward-btn-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-backward-btn.svg b/assets/static/bootstrap-icons/skip-backward-btn.svg new file mode 100644 index 0000000..7cae681 --- /dev/null +++ b/assets/static/bootstrap-icons/skip-backward-btn.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-backward-circle-fill.svg b/assets/static/bootstrap-icons/skip-backward-circle-fill.svg new file mode 100644 index 0000000..7526356 --- /dev/null +++ b/assets/static/bootstrap-icons/skip-backward-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-backward-circle.svg b/assets/static/bootstrap-icons/skip-backward-circle.svg new file mode 100644 index 0000000..8739f31 --- /dev/null +++ b/assets/static/bootstrap-icons/skip-backward-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-backward-fill.svg b/assets/static/bootstrap-icons/skip-backward-fill.svg new file mode 100644 index 0000000..bf8f63e --- /dev/null +++ b/assets/static/bootstrap-icons/skip-backward-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-backward.svg b/assets/static/bootstrap-icons/skip-backward.svg new file mode 100644 index 0000000..ff5b821 --- /dev/null +++ b/assets/static/bootstrap-icons/skip-backward.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-end-btn-fill.svg b/assets/static/bootstrap-icons/skip-end-btn-fill.svg new file mode 100644 index 0000000..e721821 --- /dev/null +++ b/assets/static/bootstrap-icons/skip-end-btn-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-end-btn.svg b/assets/static/bootstrap-icons/skip-end-btn.svg new file mode 100644 index 0000000..6815577 --- /dev/null +++ b/assets/static/bootstrap-icons/skip-end-btn.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-end-circle-fill.svg b/assets/static/bootstrap-icons/skip-end-circle-fill.svg new file mode 100644 index 0000000..63c0f68 --- /dev/null +++ b/assets/static/bootstrap-icons/skip-end-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-end-circle.svg b/assets/static/bootstrap-icons/skip-end-circle.svg new file mode 100644 index 0000000..50f41d9 --- /dev/null +++ b/assets/static/bootstrap-icons/skip-end-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-end-fill.svg b/assets/static/bootstrap-icons/skip-end-fill.svg new file mode 100644 index 0000000..afa88e3 --- /dev/null +++ b/assets/static/bootstrap-icons/skip-end-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-end.svg b/assets/static/bootstrap-icons/skip-end.svg new file mode 100644 index 0000000..b2dfde6 --- /dev/null +++ b/assets/static/bootstrap-icons/skip-end.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-forward-btn-fill.svg b/assets/static/bootstrap-icons/skip-forward-btn-fill.svg new file mode 100644 index 0000000..9547957 --- /dev/null +++ b/assets/static/bootstrap-icons/skip-forward-btn-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-forward-btn.svg b/assets/static/bootstrap-icons/skip-forward-btn.svg new file mode 100644 index 0000000..46a61b0 --- /dev/null +++ b/assets/static/bootstrap-icons/skip-forward-btn.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-forward-circle-fill.svg b/assets/static/bootstrap-icons/skip-forward-circle-fill.svg new file mode 100644 index 0000000..aefb633 --- /dev/null +++ b/assets/static/bootstrap-icons/skip-forward-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-forward-circle.svg b/assets/static/bootstrap-icons/skip-forward-circle.svg new file mode 100644 index 0000000..7ebc928 --- /dev/null +++ b/assets/static/bootstrap-icons/skip-forward-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-forward-fill.svg b/assets/static/bootstrap-icons/skip-forward-fill.svg new file mode 100644 index 0000000..6c54d79 --- /dev/null +++ b/assets/static/bootstrap-icons/skip-forward-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-forward.svg b/assets/static/bootstrap-icons/skip-forward.svg new file mode 100644 index 0000000..c69cfc5 --- /dev/null +++ b/assets/static/bootstrap-icons/skip-forward.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-start-btn-fill.svg b/assets/static/bootstrap-icons/skip-start-btn-fill.svg new file mode 100644 index 0000000..a0af702 --- /dev/null +++ b/assets/static/bootstrap-icons/skip-start-btn-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-start-btn.svg b/assets/static/bootstrap-icons/skip-start-btn.svg new file mode 100644 index 0000000..b829fdd --- /dev/null +++ b/assets/static/bootstrap-icons/skip-start-btn.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-start-circle-fill.svg b/assets/static/bootstrap-icons/skip-start-circle-fill.svg new file mode 100644 index 0000000..bb33ab0 --- /dev/null +++ b/assets/static/bootstrap-icons/skip-start-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-start-circle.svg b/assets/static/bootstrap-icons/skip-start-circle.svg new file mode 100644 index 0000000..d0e3323 --- /dev/null +++ b/assets/static/bootstrap-icons/skip-start-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-start-fill.svg b/assets/static/bootstrap-icons/skip-start-fill.svg new file mode 100644 index 0000000..56cccc3 --- /dev/null +++ b/assets/static/bootstrap-icons/skip-start-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skip-start.svg b/assets/static/bootstrap-icons/skip-start.svg new file mode 100644 index 0000000..76811a9 --- /dev/null +++ b/assets/static/bootstrap-icons/skip-start.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/skype.svg b/assets/static/bootstrap-icons/skype.svg new file mode 100644 index 0000000..ad4be4d --- /dev/null +++ b/assets/static/bootstrap-icons/skype.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/slack.svg b/assets/static/bootstrap-icons/slack.svg new file mode 100644 index 0000000..d914abe --- /dev/null +++ b/assets/static/bootstrap-icons/slack.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/slash-circle-fill.svg b/assets/static/bootstrap-icons/slash-circle-fill.svg new file mode 100644 index 0000000..5f71707 --- /dev/null +++ b/assets/static/bootstrap-icons/slash-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/slash-circle.svg b/assets/static/bootstrap-icons/slash-circle.svg new file mode 100644 index 0000000..eb26f19 --- /dev/null +++ b/assets/static/bootstrap-icons/slash-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/slash-lg.svg b/assets/static/bootstrap-icons/slash-lg.svg new file mode 100644 index 0000000..8b8b132 --- /dev/null +++ b/assets/static/bootstrap-icons/slash-lg.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/slash-square-fill.svg b/assets/static/bootstrap-icons/slash-square-fill.svg new file mode 100644 index 0000000..6fc9153 --- /dev/null +++ b/assets/static/bootstrap-icons/slash-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/slash-square.svg b/assets/static/bootstrap-icons/slash-square.svg new file mode 100644 index 0000000..0757006 --- /dev/null +++ b/assets/static/bootstrap-icons/slash-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/slash.svg b/assets/static/bootstrap-icons/slash.svg new file mode 100644 index 0000000..6d18af4 --- /dev/null +++ b/assets/static/bootstrap-icons/slash.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sliders.svg b/assets/static/bootstrap-icons/sliders.svg new file mode 100644 index 0000000..c64a06c --- /dev/null +++ b/assets/static/bootstrap-icons/sliders.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sliders2-vertical.svg b/assets/static/bootstrap-icons/sliders2-vertical.svg new file mode 100644 index 0000000..4fcb8ba --- /dev/null +++ b/assets/static/bootstrap-icons/sliders2-vertical.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sliders2.svg b/assets/static/bootstrap-icons/sliders2.svg new file mode 100644 index 0000000..975861e --- /dev/null +++ b/assets/static/bootstrap-icons/sliders2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/smartwatch.svg b/assets/static/bootstrap-icons/smartwatch.svg new file mode 100644 index 0000000..0a11991 --- /dev/null +++ b/assets/static/bootstrap-icons/smartwatch.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/snapchat.svg b/assets/static/bootstrap-icons/snapchat.svg new file mode 100644 index 0000000..01d3684 --- /dev/null +++ b/assets/static/bootstrap-icons/snapchat.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/snow.svg b/assets/static/bootstrap-icons/snow.svg new file mode 100644 index 0000000..9b648a5 --- /dev/null +++ b/assets/static/bootstrap-icons/snow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/snow2.svg b/assets/static/bootstrap-icons/snow2.svg new file mode 100644 index 0000000..6533d63 --- /dev/null +++ b/assets/static/bootstrap-icons/snow2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/snow3.svg b/assets/static/bootstrap-icons/snow3.svg new file mode 100644 index 0000000..01c0d73 --- /dev/null +++ b/assets/static/bootstrap-icons/snow3.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sort-alpha-down-alt.svg b/assets/static/bootstrap-icons/sort-alpha-down-alt.svg new file mode 100644 index 0000000..d03f1aa --- /dev/null +++ b/assets/static/bootstrap-icons/sort-alpha-down-alt.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sort-alpha-down.svg b/assets/static/bootstrap-icons/sort-alpha-down.svg new file mode 100644 index 0000000..6ac3e84 --- /dev/null +++ b/assets/static/bootstrap-icons/sort-alpha-down.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sort-alpha-up-alt.svg b/assets/static/bootstrap-icons/sort-alpha-up-alt.svg new file mode 100644 index 0000000..a7b332e --- /dev/null +++ b/assets/static/bootstrap-icons/sort-alpha-up-alt.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sort-alpha-up.svg b/assets/static/bootstrap-icons/sort-alpha-up.svg new file mode 100644 index 0000000..c5f0e3a --- /dev/null +++ b/assets/static/bootstrap-icons/sort-alpha-up.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sort-down-alt.svg b/assets/static/bootstrap-icons/sort-down-alt.svg new file mode 100644 index 0000000..86a1bf6 --- /dev/null +++ b/assets/static/bootstrap-icons/sort-down-alt.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sort-down.svg b/assets/static/bootstrap-icons/sort-down.svg new file mode 100644 index 0000000..8cfdf23 --- /dev/null +++ b/assets/static/bootstrap-icons/sort-down.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sort-numeric-down-alt.svg b/assets/static/bootstrap-icons/sort-numeric-down-alt.svg new file mode 100644 index 0000000..ce4e3c5 --- /dev/null +++ b/assets/static/bootstrap-icons/sort-numeric-down-alt.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sort-numeric-down.svg b/assets/static/bootstrap-icons/sort-numeric-down.svg new file mode 100644 index 0000000..afa87be --- /dev/null +++ b/assets/static/bootstrap-icons/sort-numeric-down.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sort-numeric-up-alt.svg b/assets/static/bootstrap-icons/sort-numeric-up-alt.svg new file mode 100644 index 0000000..d83cbf9 --- /dev/null +++ b/assets/static/bootstrap-icons/sort-numeric-up-alt.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sort-numeric-up.svg b/assets/static/bootstrap-icons/sort-numeric-up.svg new file mode 100644 index 0000000..25a1e54 --- /dev/null +++ b/assets/static/bootstrap-icons/sort-numeric-up.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sort-up-alt.svg b/assets/static/bootstrap-icons/sort-up-alt.svg new file mode 100644 index 0000000..9f78a20 --- /dev/null +++ b/assets/static/bootstrap-icons/sort-up-alt.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sort-up.svg b/assets/static/bootstrap-icons/sort-up.svg new file mode 100644 index 0000000..cda9ac7 --- /dev/null +++ b/assets/static/bootstrap-icons/sort-up.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/soundwave.svg b/assets/static/bootstrap-icons/soundwave.svg new file mode 100644 index 0000000..1444777 --- /dev/null +++ b/assets/static/bootstrap-icons/soundwave.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sourceforge.svg b/assets/static/bootstrap-icons/sourceforge.svg new file mode 100644 index 0000000..13d0c5f --- /dev/null +++ b/assets/static/bootstrap-icons/sourceforge.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/speaker-fill.svg b/assets/static/bootstrap-icons/speaker-fill.svg new file mode 100644 index 0000000..f6d9e33 --- /dev/null +++ b/assets/static/bootstrap-icons/speaker-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/speaker.svg b/assets/static/bootstrap-icons/speaker.svg new file mode 100644 index 0000000..1415b5d --- /dev/null +++ b/assets/static/bootstrap-icons/speaker.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/speedometer.svg b/assets/static/bootstrap-icons/speedometer.svg new file mode 100644 index 0000000..f6e3e61 --- /dev/null +++ b/assets/static/bootstrap-icons/speedometer.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/speedometer2.svg b/assets/static/bootstrap-icons/speedometer2.svg new file mode 100644 index 0000000..75e79c8 --- /dev/null +++ b/assets/static/bootstrap-icons/speedometer2.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/spellcheck.svg b/assets/static/bootstrap-icons/spellcheck.svg new file mode 100644 index 0000000..69fec76 --- /dev/null +++ b/assets/static/bootstrap-icons/spellcheck.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/spotify.svg b/assets/static/bootstrap-icons/spotify.svg new file mode 100644 index 0000000..09d0e9f --- /dev/null +++ b/assets/static/bootstrap-icons/spotify.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/square-fill.svg b/assets/static/bootstrap-icons/square-fill.svg new file mode 100644 index 0000000..1e72d5e --- /dev/null +++ b/assets/static/bootstrap-icons/square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/square-half.svg b/assets/static/bootstrap-icons/square-half.svg new file mode 100644 index 0000000..aa3e349 --- /dev/null +++ b/assets/static/bootstrap-icons/square-half.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/square.svg b/assets/static/bootstrap-icons/square.svg new file mode 100644 index 0000000..0f086de --- /dev/null +++ b/assets/static/bootstrap-icons/square.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/stack-overflow.svg b/assets/static/bootstrap-icons/stack-overflow.svg new file mode 100644 index 0000000..c5e5be6 --- /dev/null +++ b/assets/static/bootstrap-icons/stack-overflow.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/stack.svg b/assets/static/bootstrap-icons/stack.svg new file mode 100644 index 0000000..3cf0eca --- /dev/null +++ b/assets/static/bootstrap-icons/stack.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/star-fill.svg b/assets/static/bootstrap-icons/star-fill.svg new file mode 100644 index 0000000..de09c4a --- /dev/null +++ b/assets/static/bootstrap-icons/star-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/star-half.svg b/assets/static/bootstrap-icons/star-half.svg new file mode 100644 index 0000000..8a70f53 --- /dev/null +++ b/assets/static/bootstrap-icons/star-half.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/star.svg b/assets/static/bootstrap-icons/star.svg new file mode 100644 index 0000000..fcdcb1c --- /dev/null +++ b/assets/static/bootstrap-icons/star.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/stars.svg b/assets/static/bootstrap-icons/stars.svg new file mode 100644 index 0000000..b6fb4f2 --- /dev/null +++ b/assets/static/bootstrap-icons/stars.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/steam.svg b/assets/static/bootstrap-icons/steam.svg new file mode 100644 index 0000000..9daa3d3 --- /dev/null +++ b/assets/static/bootstrap-icons/steam.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/stickies-fill.svg b/assets/static/bootstrap-icons/stickies-fill.svg new file mode 100644 index 0000000..039c3b8 --- /dev/null +++ b/assets/static/bootstrap-icons/stickies-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/stickies.svg b/assets/static/bootstrap-icons/stickies.svg new file mode 100644 index 0000000..24e6492 --- /dev/null +++ b/assets/static/bootstrap-icons/stickies.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sticky-fill.svg b/assets/static/bootstrap-icons/sticky-fill.svg new file mode 100644 index 0000000..b36dcb1 --- /dev/null +++ b/assets/static/bootstrap-icons/sticky-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sticky.svg b/assets/static/bootstrap-icons/sticky.svg new file mode 100644 index 0000000..0d50e88 --- /dev/null +++ b/assets/static/bootstrap-icons/sticky.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/stop-btn-fill.svg b/assets/static/bootstrap-icons/stop-btn-fill.svg new file mode 100644 index 0000000..70e562e --- /dev/null +++ b/assets/static/bootstrap-icons/stop-btn-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/stop-btn.svg b/assets/static/bootstrap-icons/stop-btn.svg new file mode 100644 index 0000000..26348d5 --- /dev/null +++ b/assets/static/bootstrap-icons/stop-btn.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/stop-circle-fill.svg b/assets/static/bootstrap-icons/stop-circle-fill.svg new file mode 100644 index 0000000..141668e --- /dev/null +++ b/assets/static/bootstrap-icons/stop-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/stop-circle.svg b/assets/static/bootstrap-icons/stop-circle.svg new file mode 100644 index 0000000..3e1933a --- /dev/null +++ b/assets/static/bootstrap-icons/stop-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/stop-fill.svg b/assets/static/bootstrap-icons/stop-fill.svg new file mode 100644 index 0000000..ca1b957 --- /dev/null +++ b/assets/static/bootstrap-icons/stop-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/stop.svg b/assets/static/bootstrap-icons/stop.svg new file mode 100644 index 0000000..27f1fb6 --- /dev/null +++ b/assets/static/bootstrap-icons/stop.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/stoplights-fill.svg b/assets/static/bootstrap-icons/stoplights-fill.svg new file mode 100644 index 0000000..f0b2d76 --- /dev/null +++ b/assets/static/bootstrap-icons/stoplights-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/stoplights.svg b/assets/static/bootstrap-icons/stoplights.svg new file mode 100644 index 0000000..6db3e12 --- /dev/null +++ b/assets/static/bootstrap-icons/stoplights.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/stopwatch-fill.svg b/assets/static/bootstrap-icons/stopwatch-fill.svg new file mode 100644 index 0000000..1228cf2 --- /dev/null +++ b/assets/static/bootstrap-icons/stopwatch-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/stopwatch.svg b/assets/static/bootstrap-icons/stopwatch.svg new file mode 100644 index 0000000..aff8c33 --- /dev/null +++ b/assets/static/bootstrap-icons/stopwatch.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/strava.svg b/assets/static/bootstrap-icons/strava.svg new file mode 100644 index 0000000..0ed6bab --- /dev/null +++ b/assets/static/bootstrap-icons/strava.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/stripe.svg b/assets/static/bootstrap-icons/stripe.svg new file mode 100644 index 0000000..ba961a0 --- /dev/null +++ b/assets/static/bootstrap-icons/stripe.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/subscript.svg b/assets/static/bootstrap-icons/subscript.svg new file mode 100644 index 0000000..51f5eea --- /dev/null +++ b/assets/static/bootstrap-icons/subscript.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/substack.svg b/assets/static/bootstrap-icons/substack.svg new file mode 100644 index 0000000..e54179a --- /dev/null +++ b/assets/static/bootstrap-icons/substack.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/subtract.svg b/assets/static/bootstrap-icons/subtract.svg new file mode 100644 index 0000000..129c3d5 --- /dev/null +++ b/assets/static/bootstrap-icons/subtract.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/suit-club-fill.svg b/assets/static/bootstrap-icons/suit-club-fill.svg new file mode 100644 index 0000000..a787160 --- /dev/null +++ b/assets/static/bootstrap-icons/suit-club-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/suit-club.svg b/assets/static/bootstrap-icons/suit-club.svg new file mode 100644 index 0000000..3fbf98b --- /dev/null +++ b/assets/static/bootstrap-icons/suit-club.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/suit-diamond-fill.svg b/assets/static/bootstrap-icons/suit-diamond-fill.svg new file mode 100644 index 0000000..67617d6 --- /dev/null +++ b/assets/static/bootstrap-icons/suit-diamond-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/suit-diamond.svg b/assets/static/bootstrap-icons/suit-diamond.svg new file mode 100644 index 0000000..79b54c1 --- /dev/null +++ b/assets/static/bootstrap-icons/suit-diamond.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/suit-heart-fill.svg b/assets/static/bootstrap-icons/suit-heart-fill.svg new file mode 100644 index 0000000..d09850c --- /dev/null +++ b/assets/static/bootstrap-icons/suit-heart-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/suit-heart.svg b/assets/static/bootstrap-icons/suit-heart.svg new file mode 100644 index 0000000..173b32f --- /dev/null +++ b/assets/static/bootstrap-icons/suit-heart.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/suit-spade-fill.svg b/assets/static/bootstrap-icons/suit-spade-fill.svg new file mode 100644 index 0000000..cc465e5 --- /dev/null +++ b/assets/static/bootstrap-icons/suit-spade-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/suit-spade.svg b/assets/static/bootstrap-icons/suit-spade.svg new file mode 100644 index 0000000..7123c10 --- /dev/null +++ b/assets/static/bootstrap-icons/suit-spade.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/suitcase-fill.svg b/assets/static/bootstrap-icons/suitcase-fill.svg new file mode 100644 index 0000000..df62651 --- /dev/null +++ b/assets/static/bootstrap-icons/suitcase-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/suitcase-lg-fill.svg b/assets/static/bootstrap-icons/suitcase-lg-fill.svg new file mode 100644 index 0000000..cef1da9 --- /dev/null +++ b/assets/static/bootstrap-icons/suitcase-lg-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/suitcase-lg.svg b/assets/static/bootstrap-icons/suitcase-lg.svg new file mode 100644 index 0000000..ea447d2 --- /dev/null +++ b/assets/static/bootstrap-icons/suitcase-lg.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/suitcase.svg b/assets/static/bootstrap-icons/suitcase.svg new file mode 100644 index 0000000..65e619d --- /dev/null +++ b/assets/static/bootstrap-icons/suitcase.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/suitcase2-fill.svg b/assets/static/bootstrap-icons/suitcase2-fill.svg new file mode 100644 index 0000000..a2cb410 --- /dev/null +++ b/assets/static/bootstrap-icons/suitcase2-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/suitcase2.svg b/assets/static/bootstrap-icons/suitcase2.svg new file mode 100644 index 0000000..e6ea533 --- /dev/null +++ b/assets/static/bootstrap-icons/suitcase2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sun-fill.svg b/assets/static/bootstrap-icons/sun-fill.svg new file mode 100644 index 0000000..c83f69a --- /dev/null +++ b/assets/static/bootstrap-icons/sun-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sun.svg b/assets/static/bootstrap-icons/sun.svg new file mode 100644 index 0000000..3777f07 --- /dev/null +++ b/assets/static/bootstrap-icons/sun.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sunglasses.svg b/assets/static/bootstrap-icons/sunglasses.svg new file mode 100644 index 0000000..1ff81f7 --- /dev/null +++ b/assets/static/bootstrap-icons/sunglasses.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sunrise-fill.svg b/assets/static/bootstrap-icons/sunrise-fill.svg new file mode 100644 index 0000000..c922d7c --- /dev/null +++ b/assets/static/bootstrap-icons/sunrise-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sunrise.svg b/assets/static/bootstrap-icons/sunrise.svg new file mode 100644 index 0000000..98adcfb --- /dev/null +++ b/assets/static/bootstrap-icons/sunrise.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sunset-fill.svg b/assets/static/bootstrap-icons/sunset-fill.svg new file mode 100644 index 0000000..91a8d0e --- /dev/null +++ b/assets/static/bootstrap-icons/sunset-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/sunset.svg b/assets/static/bootstrap-icons/sunset.svg new file mode 100644 index 0000000..e72d634 --- /dev/null +++ b/assets/static/bootstrap-icons/sunset.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/superscript.svg b/assets/static/bootstrap-icons/superscript.svg new file mode 100644 index 0000000..81543ae --- /dev/null +++ b/assets/static/bootstrap-icons/superscript.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/symmetry-horizontal.svg b/assets/static/bootstrap-icons/symmetry-horizontal.svg new file mode 100644 index 0000000..594735b --- /dev/null +++ b/assets/static/bootstrap-icons/symmetry-horizontal.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/symmetry-vertical.svg b/assets/static/bootstrap-icons/symmetry-vertical.svg new file mode 100644 index 0000000..6907280 --- /dev/null +++ b/assets/static/bootstrap-icons/symmetry-vertical.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/table.svg b/assets/static/bootstrap-icons/table.svg new file mode 100644 index 0000000..8f70585 --- /dev/null +++ b/assets/static/bootstrap-icons/table.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/tablet-fill.svg b/assets/static/bootstrap-icons/tablet-fill.svg new file mode 100644 index 0000000..0746ead --- /dev/null +++ b/assets/static/bootstrap-icons/tablet-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/tablet-landscape-fill.svg b/assets/static/bootstrap-icons/tablet-landscape-fill.svg new file mode 100644 index 0000000..6290024 --- /dev/null +++ b/assets/static/bootstrap-icons/tablet-landscape-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/tablet-landscape.svg b/assets/static/bootstrap-icons/tablet-landscape.svg new file mode 100644 index 0000000..438d4d1 --- /dev/null +++ b/assets/static/bootstrap-icons/tablet-landscape.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/tablet.svg b/assets/static/bootstrap-icons/tablet.svg new file mode 100644 index 0000000..eebeee3 --- /dev/null +++ b/assets/static/bootstrap-icons/tablet.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/tag-fill.svg b/assets/static/bootstrap-icons/tag-fill.svg new file mode 100644 index 0000000..6a95e2d --- /dev/null +++ b/assets/static/bootstrap-icons/tag-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/tag.svg b/assets/static/bootstrap-icons/tag.svg new file mode 100644 index 0000000..01d19b5 --- /dev/null +++ b/assets/static/bootstrap-icons/tag.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/tags-fill.svg b/assets/static/bootstrap-icons/tags-fill.svg new file mode 100644 index 0000000..1673abb --- /dev/null +++ b/assets/static/bootstrap-icons/tags-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/tags.svg b/assets/static/bootstrap-icons/tags.svg new file mode 100644 index 0000000..ade5519 --- /dev/null +++ b/assets/static/bootstrap-icons/tags.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/taxi-front-fill.svg b/assets/static/bootstrap-icons/taxi-front-fill.svg new file mode 100644 index 0000000..ef7f45b --- /dev/null +++ b/assets/static/bootstrap-icons/taxi-front-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/taxi-front.svg b/assets/static/bootstrap-icons/taxi-front.svg new file mode 100644 index 0000000..1b4337a --- /dev/null +++ b/assets/static/bootstrap-icons/taxi-front.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/telegram.svg b/assets/static/bootstrap-icons/telegram.svg new file mode 100644 index 0000000..d260266 --- /dev/null +++ b/assets/static/bootstrap-icons/telegram.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/telephone-fill.svg b/assets/static/bootstrap-icons/telephone-fill.svg new file mode 100644 index 0000000..2e9de2e --- /dev/null +++ b/assets/static/bootstrap-icons/telephone-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/telephone-forward-fill.svg b/assets/static/bootstrap-icons/telephone-forward-fill.svg new file mode 100644 index 0000000..26fc35f --- /dev/null +++ b/assets/static/bootstrap-icons/telephone-forward-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/telephone-forward.svg b/assets/static/bootstrap-icons/telephone-forward.svg new file mode 100644 index 0000000..08c07bd --- /dev/null +++ b/assets/static/bootstrap-icons/telephone-forward.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/telephone-inbound-fill.svg b/assets/static/bootstrap-icons/telephone-inbound-fill.svg new file mode 100644 index 0000000..85434d0 --- /dev/null +++ b/assets/static/bootstrap-icons/telephone-inbound-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/telephone-inbound.svg b/assets/static/bootstrap-icons/telephone-inbound.svg new file mode 100644 index 0000000..8ec20a6 --- /dev/null +++ b/assets/static/bootstrap-icons/telephone-inbound.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/telephone-minus-fill.svg b/assets/static/bootstrap-icons/telephone-minus-fill.svg new file mode 100644 index 0000000..7b2fe9d --- /dev/null +++ b/assets/static/bootstrap-icons/telephone-minus-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/telephone-minus.svg b/assets/static/bootstrap-icons/telephone-minus.svg new file mode 100644 index 0000000..6ebc50e --- /dev/null +++ b/assets/static/bootstrap-icons/telephone-minus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/telephone-outbound-fill.svg b/assets/static/bootstrap-icons/telephone-outbound-fill.svg new file mode 100644 index 0000000..0a18bda --- /dev/null +++ b/assets/static/bootstrap-icons/telephone-outbound-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/telephone-outbound.svg b/assets/static/bootstrap-icons/telephone-outbound.svg new file mode 100644 index 0000000..566eb46 --- /dev/null +++ b/assets/static/bootstrap-icons/telephone-outbound.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/telephone-plus-fill.svg b/assets/static/bootstrap-icons/telephone-plus-fill.svg new file mode 100644 index 0000000..b02874f --- /dev/null +++ b/assets/static/bootstrap-icons/telephone-plus-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/telephone-plus.svg b/assets/static/bootstrap-icons/telephone-plus.svg new file mode 100644 index 0000000..787e0c6 --- /dev/null +++ b/assets/static/bootstrap-icons/telephone-plus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/telephone-x-fill.svg b/assets/static/bootstrap-icons/telephone-x-fill.svg new file mode 100644 index 0000000..5410e16 --- /dev/null +++ b/assets/static/bootstrap-icons/telephone-x-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/telephone-x.svg b/assets/static/bootstrap-icons/telephone-x.svg new file mode 100644 index 0000000..3f483a1 --- /dev/null +++ b/assets/static/bootstrap-icons/telephone-x.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/telephone.svg b/assets/static/bootstrap-icons/telephone.svg new file mode 100644 index 0000000..679e8a9 --- /dev/null +++ b/assets/static/bootstrap-icons/telephone.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/tencent-qq.svg b/assets/static/bootstrap-icons/tencent-qq.svg new file mode 100644 index 0000000..0d5cd23 --- /dev/null +++ b/assets/static/bootstrap-icons/tencent-qq.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/terminal-dash.svg b/assets/static/bootstrap-icons/terminal-dash.svg new file mode 100644 index 0000000..9f46e8e --- /dev/null +++ b/assets/static/bootstrap-icons/terminal-dash.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/terminal-fill.svg b/assets/static/bootstrap-icons/terminal-fill.svg new file mode 100644 index 0000000..fabd075 --- /dev/null +++ b/assets/static/bootstrap-icons/terminal-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/terminal-plus.svg b/assets/static/bootstrap-icons/terminal-plus.svg new file mode 100644 index 0000000..32c6432 --- /dev/null +++ b/assets/static/bootstrap-icons/terminal-plus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/terminal-split.svg b/assets/static/bootstrap-icons/terminal-split.svg new file mode 100644 index 0000000..a378c37 --- /dev/null +++ b/assets/static/bootstrap-icons/terminal-split.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/terminal-x.svg b/assets/static/bootstrap-icons/terminal-x.svg new file mode 100644 index 0000000..aa59e7f --- /dev/null +++ b/assets/static/bootstrap-icons/terminal-x.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/terminal.svg b/assets/static/bootstrap-icons/terminal.svg new file mode 100644 index 0000000..44aef95 --- /dev/null +++ b/assets/static/bootstrap-icons/terminal.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/text-center.svg b/assets/static/bootstrap-icons/text-center.svg new file mode 100644 index 0000000..12d9e29 --- /dev/null +++ b/assets/static/bootstrap-icons/text-center.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/text-indent-left.svg b/assets/static/bootstrap-icons/text-indent-left.svg new file mode 100644 index 0000000..5a607af --- /dev/null +++ b/assets/static/bootstrap-icons/text-indent-left.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/text-indent-right.svg b/assets/static/bootstrap-icons/text-indent-right.svg new file mode 100644 index 0000000..de91d9e --- /dev/null +++ b/assets/static/bootstrap-icons/text-indent-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/text-left.svg b/assets/static/bootstrap-icons/text-left.svg new file mode 100644 index 0000000..36ae0d3 --- /dev/null +++ b/assets/static/bootstrap-icons/text-left.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/text-paragraph.svg b/assets/static/bootstrap-icons/text-paragraph.svg new file mode 100644 index 0000000..035a1c8 --- /dev/null +++ b/assets/static/bootstrap-icons/text-paragraph.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/text-right.svg b/assets/static/bootstrap-icons/text-right.svg new file mode 100644 index 0000000..98178e7 --- /dev/null +++ b/assets/static/bootstrap-icons/text-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/text-wrap.svg b/assets/static/bootstrap-icons/text-wrap.svg new file mode 100644 index 0000000..4c732d6 --- /dev/null +++ b/assets/static/bootstrap-icons/text-wrap.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/textarea-resize.svg b/assets/static/bootstrap-icons/textarea-resize.svg new file mode 100644 index 0000000..6401320 --- /dev/null +++ b/assets/static/bootstrap-icons/textarea-resize.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/textarea-t.svg b/assets/static/bootstrap-icons/textarea-t.svg new file mode 100644 index 0000000..145cbb7 --- /dev/null +++ b/assets/static/bootstrap-icons/textarea-t.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/textarea.svg b/assets/static/bootstrap-icons/textarea.svg new file mode 100644 index 0000000..176ca25 --- /dev/null +++ b/assets/static/bootstrap-icons/textarea.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/thermometer-half.svg b/assets/static/bootstrap-icons/thermometer-half.svg new file mode 100644 index 0000000..018eab1 --- /dev/null +++ b/assets/static/bootstrap-icons/thermometer-half.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/thermometer-high.svg b/assets/static/bootstrap-icons/thermometer-high.svg new file mode 100644 index 0000000..22e77d1 --- /dev/null +++ b/assets/static/bootstrap-icons/thermometer-high.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/thermometer-low.svg b/assets/static/bootstrap-icons/thermometer-low.svg new file mode 100644 index 0000000..1f0f5e1 --- /dev/null +++ b/assets/static/bootstrap-icons/thermometer-low.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/thermometer-snow.svg b/assets/static/bootstrap-icons/thermometer-snow.svg new file mode 100644 index 0000000..df7c1d1 --- /dev/null +++ b/assets/static/bootstrap-icons/thermometer-snow.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/thermometer-sun.svg b/assets/static/bootstrap-icons/thermometer-sun.svg new file mode 100644 index 0000000..c453dee --- /dev/null +++ b/assets/static/bootstrap-icons/thermometer-sun.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/thermometer.svg b/assets/static/bootstrap-icons/thermometer.svg new file mode 100644 index 0000000..8a5529b --- /dev/null +++ b/assets/static/bootstrap-icons/thermometer.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/threads-fill.svg b/assets/static/bootstrap-icons/threads-fill.svg new file mode 100644 index 0000000..b19666d --- /dev/null +++ b/assets/static/bootstrap-icons/threads-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/threads.svg b/assets/static/bootstrap-icons/threads.svg new file mode 100644 index 0000000..13c9e7a --- /dev/null +++ b/assets/static/bootstrap-icons/threads.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/three-dots-vertical.svg b/assets/static/bootstrap-icons/three-dots-vertical.svg new file mode 100644 index 0000000..f5ef7d4 --- /dev/null +++ b/assets/static/bootstrap-icons/three-dots-vertical.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/three-dots.svg b/assets/static/bootstrap-icons/three-dots.svg new file mode 100644 index 0000000..4706f52 --- /dev/null +++ b/assets/static/bootstrap-icons/three-dots.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/thunderbolt-fill.svg b/assets/static/bootstrap-icons/thunderbolt-fill.svg new file mode 100644 index 0000000..1faea43 --- /dev/null +++ b/assets/static/bootstrap-icons/thunderbolt-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/thunderbolt.svg b/assets/static/bootstrap-icons/thunderbolt.svg new file mode 100644 index 0000000..3655659 --- /dev/null +++ b/assets/static/bootstrap-icons/thunderbolt.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/ticket-detailed-fill.svg b/assets/static/bootstrap-icons/ticket-detailed-fill.svg new file mode 100644 index 0000000..cd7a3a7 --- /dev/null +++ b/assets/static/bootstrap-icons/ticket-detailed-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/ticket-detailed.svg b/assets/static/bootstrap-icons/ticket-detailed.svg new file mode 100644 index 0000000..cf32e88 --- /dev/null +++ b/assets/static/bootstrap-icons/ticket-detailed.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/ticket-fill.svg b/assets/static/bootstrap-icons/ticket-fill.svg new file mode 100644 index 0000000..01e9108 --- /dev/null +++ b/assets/static/bootstrap-icons/ticket-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/ticket-perforated-fill.svg b/assets/static/bootstrap-icons/ticket-perforated-fill.svg new file mode 100644 index 0000000..38c18dc --- /dev/null +++ b/assets/static/bootstrap-icons/ticket-perforated-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/ticket-perforated.svg b/assets/static/bootstrap-icons/ticket-perforated.svg new file mode 100644 index 0000000..da44537 --- /dev/null +++ b/assets/static/bootstrap-icons/ticket-perforated.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/ticket.svg b/assets/static/bootstrap-icons/ticket.svg new file mode 100644 index 0000000..eb813a1 --- /dev/null +++ b/assets/static/bootstrap-icons/ticket.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/tiktok.svg b/assets/static/bootstrap-icons/tiktok.svg new file mode 100644 index 0000000..04c6679 --- /dev/null +++ b/assets/static/bootstrap-icons/tiktok.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/toggle-off.svg b/assets/static/bootstrap-icons/toggle-off.svg new file mode 100644 index 0000000..e1e89ad --- /dev/null +++ b/assets/static/bootstrap-icons/toggle-off.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/toggle-on.svg b/assets/static/bootstrap-icons/toggle-on.svg new file mode 100644 index 0000000..7cd6eb3 --- /dev/null +++ b/assets/static/bootstrap-icons/toggle-on.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/toggle2-off.svg b/assets/static/bootstrap-icons/toggle2-off.svg new file mode 100644 index 0000000..61739ce --- /dev/null +++ b/assets/static/bootstrap-icons/toggle2-off.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/toggle2-on.svg b/assets/static/bootstrap-icons/toggle2-on.svg new file mode 100644 index 0000000..d752ce8 --- /dev/null +++ b/assets/static/bootstrap-icons/toggle2-on.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/toggles.svg b/assets/static/bootstrap-icons/toggles.svg new file mode 100644 index 0000000..659c185 --- /dev/null +++ b/assets/static/bootstrap-icons/toggles.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/toggles2.svg b/assets/static/bootstrap-icons/toggles2.svg new file mode 100644 index 0000000..2f90344 --- /dev/null +++ b/assets/static/bootstrap-icons/toggles2.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/tools.svg b/assets/static/bootstrap-icons/tools.svg new file mode 100644 index 0000000..f6efdcc --- /dev/null +++ b/assets/static/bootstrap-icons/tools.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/tornado.svg b/assets/static/bootstrap-icons/tornado.svg new file mode 100644 index 0000000..2a6397c --- /dev/null +++ b/assets/static/bootstrap-icons/tornado.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/train-freight-front-fill.svg b/assets/static/bootstrap-icons/train-freight-front-fill.svg new file mode 100644 index 0000000..e272051 --- /dev/null +++ b/assets/static/bootstrap-icons/train-freight-front-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/train-freight-front.svg b/assets/static/bootstrap-icons/train-freight-front.svg new file mode 100644 index 0000000..097c960 --- /dev/null +++ b/assets/static/bootstrap-icons/train-freight-front.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/train-front-fill.svg b/assets/static/bootstrap-icons/train-front-fill.svg new file mode 100644 index 0000000..4acad08 --- /dev/null +++ b/assets/static/bootstrap-icons/train-front-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/train-front.svg b/assets/static/bootstrap-icons/train-front.svg new file mode 100644 index 0000000..81ce139 --- /dev/null +++ b/assets/static/bootstrap-icons/train-front.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/train-lightrail-front-fill.svg b/assets/static/bootstrap-icons/train-lightrail-front-fill.svg new file mode 100644 index 0000000..7bd87fb --- /dev/null +++ b/assets/static/bootstrap-icons/train-lightrail-front-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/train-lightrail-front.svg b/assets/static/bootstrap-icons/train-lightrail-front.svg new file mode 100644 index 0000000..d7aa87f --- /dev/null +++ b/assets/static/bootstrap-icons/train-lightrail-front.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/translate.svg b/assets/static/bootstrap-icons/translate.svg new file mode 100644 index 0000000..2e0754e --- /dev/null +++ b/assets/static/bootstrap-icons/translate.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/transparency.svg b/assets/static/bootstrap-icons/transparency.svg new file mode 100644 index 0000000..289a4b9 --- /dev/null +++ b/assets/static/bootstrap-icons/transparency.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/trash-fill.svg b/assets/static/bootstrap-icons/trash-fill.svg new file mode 100644 index 0000000..b67453a --- /dev/null +++ b/assets/static/bootstrap-icons/trash-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/trash.svg b/assets/static/bootstrap-icons/trash.svg new file mode 100644 index 0000000..3020264 --- /dev/null +++ b/assets/static/bootstrap-icons/trash.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/trash2-fill.svg b/assets/static/bootstrap-icons/trash2-fill.svg new file mode 100644 index 0000000..fb1d90d --- /dev/null +++ b/assets/static/bootstrap-icons/trash2-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/trash2.svg b/assets/static/bootstrap-icons/trash2.svg new file mode 100644 index 0000000..0cabe8d --- /dev/null +++ b/assets/static/bootstrap-icons/trash2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/trash3-fill.svg b/assets/static/bootstrap-icons/trash3-fill.svg new file mode 100644 index 0000000..42fbfc5 --- /dev/null +++ b/assets/static/bootstrap-icons/trash3-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/trash3.svg b/assets/static/bootstrap-icons/trash3.svg new file mode 100644 index 0000000..5194bf0 --- /dev/null +++ b/assets/static/bootstrap-icons/trash3.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/tree-fill.svg b/assets/static/bootstrap-icons/tree-fill.svg new file mode 100644 index 0000000..d00e733 --- /dev/null +++ b/assets/static/bootstrap-icons/tree-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/tree.svg b/assets/static/bootstrap-icons/tree.svg new file mode 100644 index 0000000..17a5efe --- /dev/null +++ b/assets/static/bootstrap-icons/tree.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/trello.svg b/assets/static/bootstrap-icons/trello.svg new file mode 100644 index 0000000..bd88732 --- /dev/null +++ b/assets/static/bootstrap-icons/trello.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/triangle-fill.svg b/assets/static/bootstrap-icons/triangle-fill.svg new file mode 100644 index 0000000..474c8bb --- /dev/null +++ b/assets/static/bootstrap-icons/triangle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/triangle-half.svg b/assets/static/bootstrap-icons/triangle-half.svg new file mode 100644 index 0000000..a495ca0 --- /dev/null +++ b/assets/static/bootstrap-icons/triangle-half.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/triangle.svg b/assets/static/bootstrap-icons/triangle.svg new file mode 100644 index 0000000..95a6a9b --- /dev/null +++ b/assets/static/bootstrap-icons/triangle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/trophy-fill.svg b/assets/static/bootstrap-icons/trophy-fill.svg new file mode 100644 index 0000000..f469737 --- /dev/null +++ b/assets/static/bootstrap-icons/trophy-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/trophy.svg b/assets/static/bootstrap-icons/trophy.svg new file mode 100644 index 0000000..ae13957 --- /dev/null +++ b/assets/static/bootstrap-icons/trophy.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/tropical-storm.svg b/assets/static/bootstrap-icons/tropical-storm.svg new file mode 100644 index 0000000..9eb3354 --- /dev/null +++ b/assets/static/bootstrap-icons/tropical-storm.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/truck-flatbed.svg b/assets/static/bootstrap-icons/truck-flatbed.svg new file mode 100644 index 0000000..4b38155 --- /dev/null +++ b/assets/static/bootstrap-icons/truck-flatbed.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/truck-front-fill.svg b/assets/static/bootstrap-icons/truck-front-fill.svg new file mode 100644 index 0000000..39f72d0 --- /dev/null +++ b/assets/static/bootstrap-icons/truck-front-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/truck-front.svg b/assets/static/bootstrap-icons/truck-front.svg new file mode 100644 index 0000000..d805db5 --- /dev/null +++ b/assets/static/bootstrap-icons/truck-front.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/truck.svg b/assets/static/bootstrap-icons/truck.svg new file mode 100644 index 0000000..72c5439 --- /dev/null +++ b/assets/static/bootstrap-icons/truck.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/tsunami.svg b/assets/static/bootstrap-icons/tsunami.svg new file mode 100644 index 0000000..be5f9be --- /dev/null +++ b/assets/static/bootstrap-icons/tsunami.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/tv-fill.svg b/assets/static/bootstrap-icons/tv-fill.svg new file mode 100644 index 0000000..483c9fd --- /dev/null +++ b/assets/static/bootstrap-icons/tv-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/tv.svg b/assets/static/bootstrap-icons/tv.svg new file mode 100644 index 0000000..fa8b3c1 --- /dev/null +++ b/assets/static/bootstrap-icons/tv.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/twitch.svg b/assets/static/bootstrap-icons/twitch.svg new file mode 100644 index 0000000..b2c8ff5 --- /dev/null +++ b/assets/static/bootstrap-icons/twitch.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/twitter-x.svg b/assets/static/bootstrap-icons/twitter-x.svg new file mode 100644 index 0000000..2fafcc2 --- /dev/null +++ b/assets/static/bootstrap-icons/twitter-x.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/twitter.svg b/assets/static/bootstrap-icons/twitter.svg new file mode 100644 index 0000000..3001352 --- /dev/null +++ b/assets/static/bootstrap-icons/twitter.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/type-bold.svg b/assets/static/bootstrap-icons/type-bold.svg new file mode 100644 index 0000000..0814a2e --- /dev/null +++ b/assets/static/bootstrap-icons/type-bold.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/type-h1.svg b/assets/static/bootstrap-icons/type-h1.svg new file mode 100644 index 0000000..0df41f6 --- /dev/null +++ b/assets/static/bootstrap-icons/type-h1.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/type-h2.svg b/assets/static/bootstrap-icons/type-h2.svg new file mode 100644 index 0000000..03379ed --- /dev/null +++ b/assets/static/bootstrap-icons/type-h2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/type-h3.svg b/assets/static/bootstrap-icons/type-h3.svg new file mode 100644 index 0000000..97de531 --- /dev/null +++ b/assets/static/bootstrap-icons/type-h3.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/type-h4.svg b/assets/static/bootstrap-icons/type-h4.svg new file mode 100644 index 0000000..a7ddc81 --- /dev/null +++ b/assets/static/bootstrap-icons/type-h4.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/type-h5.svg b/assets/static/bootstrap-icons/type-h5.svg new file mode 100644 index 0000000..776bfa3 --- /dev/null +++ b/assets/static/bootstrap-icons/type-h5.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/type-h6.svg b/assets/static/bootstrap-icons/type-h6.svg new file mode 100644 index 0000000..9267192 --- /dev/null +++ b/assets/static/bootstrap-icons/type-h6.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/type-italic.svg b/assets/static/bootstrap-icons/type-italic.svg new file mode 100644 index 0000000..3ac6b09 --- /dev/null +++ b/assets/static/bootstrap-icons/type-italic.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/type-strikethrough.svg b/assets/static/bootstrap-icons/type-strikethrough.svg new file mode 100644 index 0000000..c64eba3 --- /dev/null +++ b/assets/static/bootstrap-icons/type-strikethrough.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/type-underline.svg b/assets/static/bootstrap-icons/type-underline.svg new file mode 100644 index 0000000..1c0b6c4 --- /dev/null +++ b/assets/static/bootstrap-icons/type-underline.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/type.svg b/assets/static/bootstrap-icons/type.svg new file mode 100644 index 0000000..8c1fde1 --- /dev/null +++ b/assets/static/bootstrap-icons/type.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/ubuntu.svg b/assets/static/bootstrap-icons/ubuntu.svg new file mode 100644 index 0000000..89c8830 --- /dev/null +++ b/assets/static/bootstrap-icons/ubuntu.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/ui-checks-grid.svg b/assets/static/bootstrap-icons/ui-checks-grid.svg new file mode 100644 index 0000000..e5d1ed9 --- /dev/null +++ b/assets/static/bootstrap-icons/ui-checks-grid.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/ui-checks.svg b/assets/static/bootstrap-icons/ui-checks.svg new file mode 100644 index 0000000..5d02869 --- /dev/null +++ b/assets/static/bootstrap-icons/ui-checks.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/ui-radios-grid.svg b/assets/static/bootstrap-icons/ui-radios-grid.svg new file mode 100644 index 0000000..9f9aae0 --- /dev/null +++ b/assets/static/bootstrap-icons/ui-radios-grid.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/ui-radios.svg b/assets/static/bootstrap-icons/ui-radios.svg new file mode 100644 index 0000000..9165340 --- /dev/null +++ b/assets/static/bootstrap-icons/ui-radios.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/umbrella-fill.svg b/assets/static/bootstrap-icons/umbrella-fill.svg new file mode 100644 index 0000000..3efaf13 --- /dev/null +++ b/assets/static/bootstrap-icons/umbrella-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/umbrella.svg b/assets/static/bootstrap-icons/umbrella.svg new file mode 100644 index 0000000..f7b698c --- /dev/null +++ b/assets/static/bootstrap-icons/umbrella.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/unindent.svg b/assets/static/bootstrap-icons/unindent.svg new file mode 100644 index 0000000..9e68255 --- /dev/null +++ b/assets/static/bootstrap-icons/unindent.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/union.svg b/assets/static/bootstrap-icons/union.svg new file mode 100644 index 0000000..ba23f54 --- /dev/null +++ b/assets/static/bootstrap-icons/union.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/unity.svg b/assets/static/bootstrap-icons/unity.svg new file mode 100644 index 0000000..8b84508 --- /dev/null +++ b/assets/static/bootstrap-icons/unity.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/universal-access-circle.svg b/assets/static/bootstrap-icons/universal-access-circle.svg new file mode 100644 index 0000000..e5ea936 --- /dev/null +++ b/assets/static/bootstrap-icons/universal-access-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/universal-access.svg b/assets/static/bootstrap-icons/universal-access.svg new file mode 100644 index 0000000..0d0d6ef --- /dev/null +++ b/assets/static/bootstrap-icons/universal-access.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/unlock-fill.svg b/assets/static/bootstrap-icons/unlock-fill.svg new file mode 100644 index 0000000..07156e7 --- /dev/null +++ b/assets/static/bootstrap-icons/unlock-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/unlock.svg b/assets/static/bootstrap-icons/unlock.svg new file mode 100644 index 0000000..4dda5e9 --- /dev/null +++ b/assets/static/bootstrap-icons/unlock.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/upc-scan.svg b/assets/static/bootstrap-icons/upc-scan.svg new file mode 100644 index 0000000..1a89554 --- /dev/null +++ b/assets/static/bootstrap-icons/upc-scan.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/upc.svg b/assets/static/bootstrap-icons/upc.svg new file mode 100644 index 0000000..785297d --- /dev/null +++ b/assets/static/bootstrap-icons/upc.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/upload.svg b/assets/static/bootstrap-icons/upload.svg new file mode 100644 index 0000000..9a4a363 --- /dev/null +++ b/assets/static/bootstrap-icons/upload.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/usb-c-fill.svg b/assets/static/bootstrap-icons/usb-c-fill.svg new file mode 100644 index 0000000..759eee2 --- /dev/null +++ b/assets/static/bootstrap-icons/usb-c-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/usb-c.svg b/assets/static/bootstrap-icons/usb-c.svg new file mode 100644 index 0000000..1198332 --- /dev/null +++ b/assets/static/bootstrap-icons/usb-c.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/usb-drive-fill.svg b/assets/static/bootstrap-icons/usb-drive-fill.svg new file mode 100644 index 0000000..2f656ee --- /dev/null +++ b/assets/static/bootstrap-icons/usb-drive-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/usb-drive.svg b/assets/static/bootstrap-icons/usb-drive.svg new file mode 100644 index 0000000..739051d --- /dev/null +++ b/assets/static/bootstrap-icons/usb-drive.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/usb-fill.svg b/assets/static/bootstrap-icons/usb-fill.svg new file mode 100644 index 0000000..a3b17fa --- /dev/null +++ b/assets/static/bootstrap-icons/usb-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/usb-micro-fill.svg b/assets/static/bootstrap-icons/usb-micro-fill.svg new file mode 100644 index 0000000..1469a9b --- /dev/null +++ b/assets/static/bootstrap-icons/usb-micro-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/usb-micro.svg b/assets/static/bootstrap-icons/usb-micro.svg new file mode 100644 index 0000000..ece7da7 --- /dev/null +++ b/assets/static/bootstrap-icons/usb-micro.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/usb-mini-fill.svg b/assets/static/bootstrap-icons/usb-mini-fill.svg new file mode 100644 index 0000000..3ab0747 --- /dev/null +++ b/assets/static/bootstrap-icons/usb-mini-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/usb-mini.svg b/assets/static/bootstrap-icons/usb-mini.svg new file mode 100644 index 0000000..f095b67 --- /dev/null +++ b/assets/static/bootstrap-icons/usb-mini.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/usb-plug-fill.svg b/assets/static/bootstrap-icons/usb-plug-fill.svg new file mode 100644 index 0000000..d1dc518 --- /dev/null +++ b/assets/static/bootstrap-icons/usb-plug-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/usb-plug.svg b/assets/static/bootstrap-icons/usb-plug.svg new file mode 100644 index 0000000..f3d7220 --- /dev/null +++ b/assets/static/bootstrap-icons/usb-plug.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/usb-symbol.svg b/assets/static/bootstrap-icons/usb-symbol.svg new file mode 100644 index 0000000..457f93f --- /dev/null +++ b/assets/static/bootstrap-icons/usb-symbol.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/usb.svg b/assets/static/bootstrap-icons/usb.svg new file mode 100644 index 0000000..737bef5 --- /dev/null +++ b/assets/static/bootstrap-icons/usb.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/valentine.svg b/assets/static/bootstrap-icons/valentine.svg new file mode 100644 index 0000000..7b8f0a3 --- /dev/null +++ b/assets/static/bootstrap-icons/valentine.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/valentine2.svg b/assets/static/bootstrap-icons/valentine2.svg new file mode 100644 index 0000000..6d95a2d --- /dev/null +++ b/assets/static/bootstrap-icons/valentine2.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/vector-pen.svg b/assets/static/bootstrap-icons/vector-pen.svg new file mode 100644 index 0000000..60115b7 --- /dev/null +++ b/assets/static/bootstrap-icons/vector-pen.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/view-list.svg b/assets/static/bootstrap-icons/view-list.svg new file mode 100644 index 0000000..9211543 --- /dev/null +++ b/assets/static/bootstrap-icons/view-list.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/view-stacked.svg b/assets/static/bootstrap-icons/view-stacked.svg new file mode 100644 index 0000000..84b5ccf --- /dev/null +++ b/assets/static/bootstrap-icons/view-stacked.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/vignette.svg b/assets/static/bootstrap-icons/vignette.svg new file mode 100644 index 0000000..d179290 --- /dev/null +++ b/assets/static/bootstrap-icons/vignette.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/vimeo.svg b/assets/static/bootstrap-icons/vimeo.svg new file mode 100644 index 0000000..6b8e4b5 --- /dev/null +++ b/assets/static/bootstrap-icons/vimeo.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/vinyl-fill.svg b/assets/static/bootstrap-icons/vinyl-fill.svg new file mode 100644 index 0000000..546d7bb --- /dev/null +++ b/assets/static/bootstrap-icons/vinyl-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/vinyl.svg b/assets/static/bootstrap-icons/vinyl.svg new file mode 100644 index 0000000..63647e5 --- /dev/null +++ b/assets/static/bootstrap-icons/vinyl.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/virus.svg b/assets/static/bootstrap-icons/virus.svg new file mode 100644 index 0000000..fd291a5 --- /dev/null +++ b/assets/static/bootstrap-icons/virus.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/virus2.svg b/assets/static/bootstrap-icons/virus2.svg new file mode 100644 index 0000000..53f44e9 --- /dev/null +++ b/assets/static/bootstrap-icons/virus2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/voicemail.svg b/assets/static/bootstrap-icons/voicemail.svg new file mode 100644 index 0000000..ba22eb1 --- /dev/null +++ b/assets/static/bootstrap-icons/voicemail.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/volume-down-fill.svg b/assets/static/bootstrap-icons/volume-down-fill.svg new file mode 100644 index 0000000..681d349 --- /dev/null +++ b/assets/static/bootstrap-icons/volume-down-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/volume-down.svg b/assets/static/bootstrap-icons/volume-down.svg new file mode 100644 index 0000000..3ca7e6a --- /dev/null +++ b/assets/static/bootstrap-icons/volume-down.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/volume-mute-fill.svg b/assets/static/bootstrap-icons/volume-mute-fill.svg new file mode 100644 index 0000000..148628c --- /dev/null +++ b/assets/static/bootstrap-icons/volume-mute-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/volume-mute.svg b/assets/static/bootstrap-icons/volume-mute.svg new file mode 100644 index 0000000..d06d3dc --- /dev/null +++ b/assets/static/bootstrap-icons/volume-mute.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/volume-off-fill.svg b/assets/static/bootstrap-icons/volume-off-fill.svg new file mode 100644 index 0000000..315110a --- /dev/null +++ b/assets/static/bootstrap-icons/volume-off-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/volume-off.svg b/assets/static/bootstrap-icons/volume-off.svg new file mode 100644 index 0000000..e5f82cc --- /dev/null +++ b/assets/static/bootstrap-icons/volume-off.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/volume-up-fill.svg b/assets/static/bootstrap-icons/volume-up-fill.svg new file mode 100644 index 0000000..0f94073 --- /dev/null +++ b/assets/static/bootstrap-icons/volume-up-fill.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/volume-up.svg b/assets/static/bootstrap-icons/volume-up.svg new file mode 100644 index 0000000..6347f42 --- /dev/null +++ b/assets/static/bootstrap-icons/volume-up.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/vr.svg b/assets/static/bootstrap-icons/vr.svg new file mode 100644 index 0000000..5ad5438 --- /dev/null +++ b/assets/static/bootstrap-icons/vr.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/wallet-fill.svg b/assets/static/bootstrap-icons/wallet-fill.svg new file mode 100644 index 0000000..ee1c27d --- /dev/null +++ b/assets/static/bootstrap-icons/wallet-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/wallet.svg b/assets/static/bootstrap-icons/wallet.svg new file mode 100644 index 0000000..6c9d247 --- /dev/null +++ b/assets/static/bootstrap-icons/wallet.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/wallet2.svg b/assets/static/bootstrap-icons/wallet2.svg new file mode 100644 index 0000000..b127b0e --- /dev/null +++ b/assets/static/bootstrap-icons/wallet2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/watch.svg b/assets/static/bootstrap-icons/watch.svg new file mode 100644 index 0000000..542d4d8 --- /dev/null +++ b/assets/static/bootstrap-icons/watch.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/water.svg b/assets/static/bootstrap-icons/water.svg new file mode 100644 index 0000000..666653b --- /dev/null +++ b/assets/static/bootstrap-icons/water.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/webcam-fill.svg b/assets/static/bootstrap-icons/webcam-fill.svg new file mode 100644 index 0000000..e8db7ba --- /dev/null +++ b/assets/static/bootstrap-icons/webcam-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/webcam.svg b/assets/static/bootstrap-icons/webcam.svg new file mode 100644 index 0000000..0d23803 --- /dev/null +++ b/assets/static/bootstrap-icons/webcam.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/wechat.svg b/assets/static/bootstrap-icons/wechat.svg new file mode 100644 index 0000000..3bc67dd --- /dev/null +++ b/assets/static/bootstrap-icons/wechat.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/whatsapp.svg b/assets/static/bootstrap-icons/whatsapp.svg new file mode 100644 index 0000000..5cde6f7 --- /dev/null +++ b/assets/static/bootstrap-icons/whatsapp.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/wifi-1.svg b/assets/static/bootstrap-icons/wifi-1.svg new file mode 100644 index 0000000..5f3d340 --- /dev/null +++ b/assets/static/bootstrap-icons/wifi-1.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/wifi-2.svg b/assets/static/bootstrap-icons/wifi-2.svg new file mode 100644 index 0000000..09d26c2 --- /dev/null +++ b/assets/static/bootstrap-icons/wifi-2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/wifi-off.svg b/assets/static/bootstrap-icons/wifi-off.svg new file mode 100644 index 0000000..2f5e61f --- /dev/null +++ b/assets/static/bootstrap-icons/wifi-off.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/wifi.svg b/assets/static/bootstrap-icons/wifi.svg new file mode 100644 index 0000000..773e027 --- /dev/null +++ b/assets/static/bootstrap-icons/wifi.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/wikipedia.svg b/assets/static/bootstrap-icons/wikipedia.svg new file mode 100644 index 0000000..11f2fc6 --- /dev/null +++ b/assets/static/bootstrap-icons/wikipedia.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/wind.svg b/assets/static/bootstrap-icons/wind.svg new file mode 100644 index 0000000..2ac05cd --- /dev/null +++ b/assets/static/bootstrap-icons/wind.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/window-dash.svg b/assets/static/bootstrap-icons/window-dash.svg new file mode 100644 index 0000000..5e157af --- /dev/null +++ b/assets/static/bootstrap-icons/window-dash.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/window-desktop.svg b/assets/static/bootstrap-icons/window-desktop.svg new file mode 100644 index 0000000..fa17523 --- /dev/null +++ b/assets/static/bootstrap-icons/window-desktop.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/window-dock.svg b/assets/static/bootstrap-icons/window-dock.svg new file mode 100644 index 0000000..41cdf69 --- /dev/null +++ b/assets/static/bootstrap-icons/window-dock.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/window-fullscreen.svg b/assets/static/bootstrap-icons/window-fullscreen.svg new file mode 100644 index 0000000..421c4c5 --- /dev/null +++ b/assets/static/bootstrap-icons/window-fullscreen.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/window-plus.svg b/assets/static/bootstrap-icons/window-plus.svg new file mode 100644 index 0000000..e24ce0c --- /dev/null +++ b/assets/static/bootstrap-icons/window-plus.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/window-sidebar.svg b/assets/static/bootstrap-icons/window-sidebar.svg new file mode 100644 index 0000000..d020d13 --- /dev/null +++ b/assets/static/bootstrap-icons/window-sidebar.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/window-split.svg b/assets/static/bootstrap-icons/window-split.svg new file mode 100644 index 0000000..96bdd24 --- /dev/null +++ b/assets/static/bootstrap-icons/window-split.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/window-stack.svg b/assets/static/bootstrap-icons/window-stack.svg new file mode 100644 index 0000000..8862976 --- /dev/null +++ b/assets/static/bootstrap-icons/window-stack.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/window-x.svg b/assets/static/bootstrap-icons/window-x.svg new file mode 100644 index 0000000..c45e078 --- /dev/null +++ b/assets/static/bootstrap-icons/window-x.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/window.svg b/assets/static/bootstrap-icons/window.svg new file mode 100644 index 0000000..9bd2a2a --- /dev/null +++ b/assets/static/bootstrap-icons/window.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/windows.svg b/assets/static/bootstrap-icons/windows.svg new file mode 100644 index 0000000..af3b18c --- /dev/null +++ b/assets/static/bootstrap-icons/windows.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/wordpress.svg b/assets/static/bootstrap-icons/wordpress.svg new file mode 100644 index 0000000..7d5808c --- /dev/null +++ b/assets/static/bootstrap-icons/wordpress.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/wrench-adjustable-circle-fill.svg b/assets/static/bootstrap-icons/wrench-adjustable-circle-fill.svg new file mode 100644 index 0000000..33156c7 --- /dev/null +++ b/assets/static/bootstrap-icons/wrench-adjustable-circle-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/wrench-adjustable-circle.svg b/assets/static/bootstrap-icons/wrench-adjustable-circle.svg new file mode 100644 index 0000000..381fb30 --- /dev/null +++ b/assets/static/bootstrap-icons/wrench-adjustable-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/wrench-adjustable.svg b/assets/static/bootstrap-icons/wrench-adjustable.svg new file mode 100644 index 0000000..e7456d7 --- /dev/null +++ b/assets/static/bootstrap-icons/wrench-adjustable.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/wrench.svg b/assets/static/bootstrap-icons/wrench.svg new file mode 100644 index 0000000..806cca0 --- /dev/null +++ b/assets/static/bootstrap-icons/wrench.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/x-circle-fill.svg b/assets/static/bootstrap-icons/x-circle-fill.svg new file mode 100644 index 0000000..4070fb3 --- /dev/null +++ b/assets/static/bootstrap-icons/x-circle-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/x-circle.svg b/assets/static/bootstrap-icons/x-circle.svg new file mode 100644 index 0000000..0e8c641 --- /dev/null +++ b/assets/static/bootstrap-icons/x-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/x-diamond-fill.svg b/assets/static/bootstrap-icons/x-diamond-fill.svg new file mode 100644 index 0000000..6ec461a --- /dev/null +++ b/assets/static/bootstrap-icons/x-diamond-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/x-diamond.svg b/assets/static/bootstrap-icons/x-diamond.svg new file mode 100644 index 0000000..b93295e --- /dev/null +++ b/assets/static/bootstrap-icons/x-diamond.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/x-lg.svg b/assets/static/bootstrap-icons/x-lg.svg new file mode 100644 index 0000000..b689cbb --- /dev/null +++ b/assets/static/bootstrap-icons/x-lg.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/x-octagon-fill.svg b/assets/static/bootstrap-icons/x-octagon-fill.svg new file mode 100644 index 0000000..dd9fc6a --- /dev/null +++ b/assets/static/bootstrap-icons/x-octagon-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/x-octagon.svg b/assets/static/bootstrap-icons/x-octagon.svg new file mode 100644 index 0000000..181a39f --- /dev/null +++ b/assets/static/bootstrap-icons/x-octagon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/x-square-fill.svg b/assets/static/bootstrap-icons/x-square-fill.svg new file mode 100644 index 0000000..5499578 --- /dev/null +++ b/assets/static/bootstrap-icons/x-square-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/x-square.svg b/assets/static/bootstrap-icons/x-square.svg new file mode 100644 index 0000000..eb62b61 --- /dev/null +++ b/assets/static/bootstrap-icons/x-square.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/x.svg b/assets/static/bootstrap-icons/x.svg new file mode 100644 index 0000000..fdcc4e8 --- /dev/null +++ b/assets/static/bootstrap-icons/x.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/xbox.svg b/assets/static/bootstrap-icons/xbox.svg new file mode 100644 index 0000000..c0672b2 --- /dev/null +++ b/assets/static/bootstrap-icons/xbox.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/yelp.svg b/assets/static/bootstrap-icons/yelp.svg new file mode 100644 index 0000000..76e8884 --- /dev/null +++ b/assets/static/bootstrap-icons/yelp.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/yin-yang.svg b/assets/static/bootstrap-icons/yin-yang.svg new file mode 100644 index 0000000..1f50275 --- /dev/null +++ b/assets/static/bootstrap-icons/yin-yang.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/youtube.svg b/assets/static/bootstrap-icons/youtube.svg new file mode 100644 index 0000000..3c9c0be --- /dev/null +++ b/assets/static/bootstrap-icons/youtube.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/zoom-in.svg b/assets/static/bootstrap-icons/zoom-in.svg new file mode 100644 index 0000000..438e9bc --- /dev/null +++ b/assets/static/bootstrap-icons/zoom-in.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/bootstrap-icons/zoom-out.svg b/assets/static/bootstrap-icons/zoom-out.svg new file mode 100644 index 0000000..8be9f29 --- /dev/null +++ b/assets/static/bootstrap-icons/zoom-out.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/static/css/main.css b/assets/static/css/main.css new file mode 100644 index 0000000..60d19ea --- /dev/null +++ b/assets/static/css/main.css @@ -0,0 +1,2654 @@ +/* W3.CSS 4.15 December 2020 by Jan Egil and Borge Refsnes */ + +:root { + --quickbox-topbar-height: 50px; + --quickbox-footer-height: 64px; + --quickbox-send-width: 66px; +} + +html { + box-sizing: border-box; +} + +*, +*:before, +*:after { + box-sizing: inherit +} + +/* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */ +html { + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100% +} + +body { + margin: 0; + min-height: 100vh; +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +main, +menu, +nav, +section { + display: block +} + +summary { + display: list-item +} + +audio, +canvas, +progress, +video { + display: inline-block +} + +progress { + vertical-align: baseline +} + +audio:not([controls]) { + display: none; + height: 0 +} + +[hidden], +template { + display: none +} + +a { + background-color: transparent +} + +a:active, +a:hover { + outline-width: 0 +} + +abbr[title] { + border-bottom: none; + text-decoration: underline; + text-decoration: underline dotted +} + +b, +strong { + font-weight: bolder +} + +dfn { + font-style: italic +} + +mark { + background: #ff0; + color: #000 +} + +small { + font-size: 80% +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline +} + +sub { + bottom: -0.25em +} + +sup { + top: -0.5em +} + +figure { + margin: 1em 40px +} + +img { + border-style: none +} + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible +} + +button, +input, +select, +textarea, +optgroup { + font: inherit; + margin: 0 +} + +optgroup { + font-weight: bold +} + +button, +input { + overflow: visible +} + +button, +select { + text-transform: none +} + +button, +[type=button], +[type=reset], +[type=submit] { + -webkit-appearance: button +} + +button::-moz-focus-inner, +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner { + border-style: none; + padding: 0 +} + +button:-moz-focusring, +[type=button]:-moz-focusring, +[type=reset]:-moz-focusring, +[type=submit]:-moz-focusring { + outline: 1px dotted ButtonText +} + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: .35em .625em .75em +} + +legend { + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal +} + +textarea { + overflow: auto +} + +[type=checkbox], +[type=radio] { + padding: 0 +} + +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto +} + +[type=search] { + -webkit-appearance: textfield; + outline-offset: -2px +} + +[type=search]::-webkit-search-decoration { + -webkit-appearance: none +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit +} + +/* End extract */ +html, +body { + font-family: Verdana, sans-serif; + font-size: 16px; + line-height: 1.5 +} + +html { + overflow-x: hidden +} + +h1 { + font-size: 36px +} + +h2 { + font-size: 30px +} + +h3 { + font-size: 24px +} + +h4 { + font-size: 20px +} + +h5 { + font-size: 18px +} + +h6 { + font-size: 16px +} + +.w3-serif { + font-family: serif +} + +.w3-sans-serif { + font-family: sans-serif +} + +.w3-cursive { + font-family: cursive +} + +.w3-monospace { + font-family: monospace +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: "Segoe UI", Arial, sans-serif; + font-weight: 400; + margin: 10px 0 +} + +.w3-wide { + letter-spacing: 4px +} + +hr { + border: 0; + border-top: 1px solid #eee; + margin: 20px 0 +} + +.w3-image { + max-width: 100%; + height: auto +} + +img { + vertical-align: middle +} + +a { + color: inherit +} + +.w3-table, +.w3-table-all { + border-collapse: collapse; + border-spacing: 0; + width: 100%; + display: table +} + +.w3-table-all { + border: 1px solid #ccc +} + +.w3-bordered tr, +.w3-table-all tr { + border-bottom: 1px solid #ddd +} + +.w3-striped tbody tr:nth-child(even) { + background-color: #f1f1f1 +} + +.w3-table-all tr:nth-child(odd) { + background-color: #fff +} + +.w3-table-all tr:nth-child(even) { + background-color: #f1f1f1 +} + +.w3-hoverable tbody tr:hover, +.w3-ul.w3-hoverable li:hover { + background-color: #ccc +} + +.w3-centered tr th, +.w3-centered tr td { + text-align: center +} + +.w3-table td, +.w3-table th, +.w3-table-all td, +.w3-table-all th { + padding: 8px 8px; + display: table-cell; + text-align: left; + vertical-align: top +} + +.w3-table th:first-child, +.w3-table td:first-child, +.w3-table-all th:first-child, +.w3-table-all td:first-child { + padding-left: 16px +} + +.w3-btn, +.w3-button { + border: none; + display: inline-block; + padding: 8px 16px; + vertical-align: middle; + overflow: hidden; + text-decoration: none; + color: inherit; + background-color: inherit; + text-align: center; + cursor: pointer; + white-space: nowrap +} + +.w3-btn:hover { + box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19) +} + +.w3-btn, +.w3-button { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none +} + +.w3-disabled, +.w3-btn:disabled, +.w3-button:disabled { + cursor: not-allowed; + opacity: 0.3 +} + +.w3-disabled *, +:disabled * { + pointer-events: none +} + +.w3-btn.w3-disabled:hover, +.w3-btn:disabled:hover { + box-shadow: none +} + +.w3-badge, +.w3-tag { + background-color: #000; + color: #fff; + display: inline-block; + padding-left: 8px; + padding-right: 8px; + text-align: center +} + +.w3-badge { + border-radius: 50% +} + +.w3-ul { + list-style-type: none; + padding: 0; + margin: 0 +} + +.w3-ul li { + padding: 8px 16px; + border-bottom: 1px solid #ddd +} + +.w3-ul li:last-child { + border-bottom: none +} + +.w3-tooltip, +.w3-display-container { + position: relative +} + +.w3-tooltip .w3-text { + display: none +} + +.w3-tooltip:hover .w3-text { + display: inline-block +} + +.w3-ripple:active { + opacity: 0.5 +} + +.w3-ripple { + transition: opacity 0s +} + +.w3-input { + padding: 8px; + display: block; + border: none; + border-bottom: 1px solid #ccc; + width: 100% +} + +.w3-select { + padding: 9px 0; + width: 100%; + border: none; + border-bottom: 1px solid #ccc +} + +.w3-dropdown-click, +.w3-dropdown-hover { + position: relative; + display: inline-block; + cursor: pointer +} + +.w3-dropdown-hover:hover .w3-dropdown-content { + display: block +} + +.w3-dropdown-hover:first-child, +.w3-dropdown-click:hover { + background-color: #ccc; + color: #000 +} + +.w3-dropdown-hover:hover>.w3-button:first-child, +.w3-dropdown-click:hover>.w3-button:first-child { + background-color: #ccc; + color: #000 +} + +.w3-dropdown-content { + cursor: auto; + color: #000; + background-color: #fff; + display: none; + position: absolute; + min-width: 160px; + margin: 0; + padding: 0; + z-index: 1 +} + +.w3-check, +.w3-radio { + width: 18px; + height: 18px; + position: relative; + top: 6px +} + +.w3-sidebar { + height: 100%; + width: 200px; + background-color: #fff; + position: fixed !important; + z-index: 1; + overflow: auto +} + +.w3-bar-block .w3-dropdown-hover, +.w3-bar-block .w3-dropdown-click { + width: 100% +} + +.w3-bar-block .w3-dropdown-hover .w3-dropdown-content, +.w3-bar-block .w3-dropdown-click .w3-dropdown-content { + min-width: 100% +} + +.w3-bar-block .w3-dropdown-hover .w3-button, +.w3-bar-block .w3-dropdown-click .w3-button { + width: 100%; + text-align: left; + padding: 8px 16px +} + +.w3-main, +#main { + transition: margin-left .4s +} + +.w3-modal { + z-index: 100; + padding-top: 100px; + position: fixed; + left: 0; + top: 0; + width: 100%; + height: 100%; + overflow: auto; + background-color: rgb(0, 0, 0); + background-color: rgba(0, 0, 0, 0.4); + display: block; +} + +.w3-modal-content { + margin: auto; + background-color: #fff; + position: relative; + padding: 0; + outline: 0; + width: 600px; + color: rgb(84, 84, 84); +} + +.w3-modal-content h5 { + font-weight: 600 !important; +} + +.w3-bar { + width: 100%; + overflow: hidden +} + +.w3-center .w3-bar { + display: inline-block; + width: auto +} + +.w3-bar .w3-bar-item { + padding: 6px 16px; + float: left; + width: auto; + border: none; + display: block; + outline: 0 +} + +.w3-bar .w3-dropdown-hover, +.w3-bar .w3-dropdown-click { + position: static; + float: left +} + +.w3-bar .w3-button { + white-space: normal +} + +.w3-bar-block .w3-bar-item { + width: 100%; + display: block; + padding: 8px 16px; + text-align: left; + border: none; + white-space: normal; + float: none; + outline: 0 +} + +.w3-bar-block.w3-center .w3-bar-item { + text-align: center +} + +.w3-block { + display: block; + width: 100% +} + +.w3-responsive { + display: block; + overflow-x: auto +} + +.w3-container:after, +.w3-container:before, +.w3-panel:after, +.w3-panel:before, +.w3-row:after, +.w3-row:before, +.w3-row-padding:after, +.w3-row-padding:before, +.w3-cell-row:before, +.w3-cell-row:after, +.w3-clear:after, +.w3-clear:before, +.w3-bar:before, +.w3-bar:after { + content: ""; + display: table; + clear: both +} + +.w3-col, +.w3-half, +.w3-third, +.w3-twothird, +.w3-threequarter, +.w3-quarter { + float: left; + width: 100% +} + +.w3-col.s1 { + width: 8.33333% +} + +.w3-col.s2 { + width: 16.66666% +} + +.w3-col.s3 { + width: 24.99999% +} + +.w3-col.s4 { + width: 33.33333% +} + +.w3-col.s5 { + width: 41.66666% +} + +.w3-col.s6 { + width: 49.99999% +} + +.w3-col.s7 { + width: 58.33333% +} + +.w3-col.s8 { + width: 66.66666% +} + +.w3-col.s9 { + width: 74.99999% +} + +.w3-col.s10 { + width: 83.33333% +} + +.w3-col.s11 { + width: 91.66666% +} + +.w3-col.s12 { + width: 99.99999% +} + +@media (min-width:601px) { + .w3-col.m1 { + width: 8.33333% + } + + .w3-col.m2 { + width: 16.66666% + } + + .w3-col.m3, + .w3-quarter { + width: 24.99999% + } + + .w3-col.m4, + .w3-third { + width: 33.33333% + } + + .w3-col.m5 { + width: 41.66666% + } + + .w3-col.m6, + .w3-half { + width: 49.99999% + } + + .w3-col.m7 { + width: 58.33333% + } + + .w3-col.m8, + .w3-twothird { + width: 66.66666% + } + + .w3-col.m9, + .w3-threequarter { + width: 74.99999% + } + + .w3-col.m10 { + width: 83.33333% + } + + .w3-col.m11 { + width: 91.66666% + } + + .w3-col.m12 { + width: 99.99999% + } +} + +@media (min-width:993px) { + .w3-col.l1 { + width: 8.33333% + } + + .w3-col.l2 { + width: 16.66666% + } + + .w3-col.l3 { + width: 24.99999% + } + + .w3-col.l4 { + width: 33.33333% + } + + .w3-col.l5 { + width: 41.66666% + } + + .w3-col.l6 { + width: 49.99999% + } + + .w3-col.l7 { + width: 58.33333% + } + + .w3-col.l8 { + width: 66.66666% + } + + .w3-col.l9 { + width: 74.99999% + } + + .w3-col.l10 { + width: 83.33333% + } + + .w3-col.l11 { + width: 91.66666% + } + + .w3-col.l12 { + width: 99.99999% + } +} + +.w3-rest { + overflow: hidden +} + +.w3-stretch { + margin-left: -16px; + margin-right: -16px +} + +.w3-content, +.w3-auto { + margin-left: auto; + margin-right: auto +} + +.w3-content { + max-width: 980px +} + +.w3-auto { + max-width: 1140px +} + +.w3-cell-row { + display: table; + width: 100% +} + +.w3-cell { + display: table-cell +} + +.w3-cell-top { + vertical-align: top +} + +.w3-cell-middle { + vertical-align: middle +} + +.w3-cell-bottom { + vertical-align: bottom +} + +.w3-hide { + display: none !important +} + +.w3-show-block, +.w3-show { + display: block !important +} + +.w3-show-inline-block { + display: inline-block !important +} + +@media (max-width:1205px) { + .w3-auto { + max-width: 95% + } +} + +@media (max-width:600px) { + .w3-modal-content { + margin: 0 10px; + width: auto !important + } + + .w3-modal { + padding-top: 30px + } + + .w3-dropdown-hover.w3-mobile .w3-dropdown-content, + .w3-dropdown-click.w3-mobile .w3-dropdown-content { + position: relative + } + + .w3-hide-small { + display: none !important + } + + .w3-mobile { + display: block; + width: 100% !important + } + + .w3-bar-item.w3-mobile, + .w3-dropdown-hover.w3-mobile, + .w3-dropdown-click.w3-mobile { + text-align: center + } + + .w3-dropdown-hover.w3-mobile, + .w3-dropdown-hover.w3-mobile .w3-btn, + .w3-dropdown-hover.w3-mobile .w3-button, + .w3-dropdown-click.w3-mobile, + .w3-dropdown-click.w3-mobile .w3-btn, + .w3-dropdown-click.w3-mobile .w3-button { + width: 100% + } +} + +@media (max-width:768px) { + #modal-confirm-dialog-content { + width: 400px; + } + + .w3-modal-content { + width: 500px + } + + .w3-modal { + padding-top: 50px + } +} + +@media (min-width:993px) { + + #modal-confirm-dialog-content { + width: 600px; + } + + .w3-modal-content { + width: 900px + } + + .w3-hide-large { + display: none !important + } + + .w3-sidebar.w3-collapse { + display: block !important + } +} + +@media (max-width:992px) and (min-width:601px) { + .w3-hide-medium { + display: none !important + } +} + +@media (max-width:992px) { + .w3-sidebar.w3-collapse { + display: none + } + + .w3-main { + margin-left: 0 !important; + margin-right: 0 !important + } + + .w3-auto { + max-width: 100% + } +} + +.w3-top, +.w3-bottom { + position: fixed; + width: 100%; + z-index: 1 +} + +.w3-top { + top: 0 +} + +.w3-bottom { + bottom: 0 +} + +.w3-overlay { + position: fixed; + display: none; + width: 100%; + height: 100%; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + z-index: 4; +} + +.w3-display-topleft { + position: absolute; + left: 0; + top: 0 +} + +.w3-display-topright { + position: absolute; + right: 0; + top: 0 +} + +.w3-display-bottomleft { + position: absolute; + left: 0; + bottom: 0 +} + +.w3-display-bottomright { + position: absolute; + right: 0; + bottom: 0 +} + +.w3-display-middle { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%) +} + +.w3-display-left { + position: absolute; + top: 50%; + left: 0%; + transform: translate(0%, -50%); + -ms-transform: translate(-0%, -50%) +} + +.w3-display-right { + position: absolute; + top: 50%; + right: 0%; + transform: translate(0%, -50%); + -ms-transform: translate(0%, -50%) +} + +.w3-display-topmiddle { + position: absolute; + left: 50%; + top: 0; + transform: translate(-50%, 0%); + -ms-transform: translate(-50%, 0%) +} + +.w3-display-bottommiddle { + position: absolute; + left: 50%; + bottom: 0; + transform: translate(-50%, 0%); + -ms-transform: translate(-50%, 0%) +} + +.w3-display-container:hover .w3-display-hover { + display: block +} + +.w3-display-container:hover span.w3-display-hover { + display: inline-block +} + +.w3-display-hover { + display: none +} + +.w3-display-position { + position: absolute +} + +.w3-circle { + border-radius: 50% +} + +.w3-round-small { + border-radius: 2px +} + +.w3-round, +.w3-round-medium { + border-radius: 4px +} + +.w3-round-large { + border-radius: 8px +} + +.w3-round-xlarge { + border-radius: 16px +} + +.w3-round-xxlarge { + border-radius: 32px +} + +.w3-row-padding, +.w3-row-padding>.w3-half, +.w3-row-padding>.w3-third, +.w3-row-padding>.w3-twothird, +.w3-row-padding>.w3-threequarter, +.w3-row-padding>.w3-quarter, +.w3-row-padding>.w3-col { + padding: 0 8px +} + +.w3-container, +.w3-panel { + padding: 0.01em 4px +} + +.w3-panel { + margin-top: 4px; + margin-bottom: 4px +} + +.w3-code, +.w3-codespan { + font-family: Consolas, "courier new"; + font-size: 16px +} + +.w3-code { + width: auto; + background-color: #fff; + padding: 8px 12px; + border-left: 4px solid #4CAF50; + word-wrap: break-word +} + +.w3-codespan { + color: crimson; + background-color: #f1f1f1; + padding-left: 4px; + padding-right: 4px; + font-size: 110% +} + +.w3-card, +.w3-card-2 { + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12) +} + +.w3-card-4, +.w3-hover-shadow:hover { + box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.2), 0 4px 20px 0 rgba(0, 0, 0, 0.19) +} + +.w3-spin { + animation: w3-spin 2s infinite linear +} + +@keyframes w3-spin { + 0% { + transform: rotate(0deg) + } + + 100% { + transform: rotate(359deg) + } +} + +.w3-animate-fading { + animation: fading 10s infinite +} + +@keyframes fading { + 0% { + opacity: 0 + } + + 50% { + opacity: 1 + } + + 100% { + opacity: 0 + } +} + +.w3-animate-opacity { + animation: opac 0.8s +} + +@keyframes opac { + from { + opacity: 0 + } + + to { + opacity: 1 + } +} + +.w3-animate-top { + position: relative; + animation: animatetop 0.4s +} + +@keyframes animatetop { + from { + top: -300px; + opacity: 0 + } + + to { + top: 0; + opacity: 1 + } +} + +.w3-animate-left { + position: relative; + animation: animateleft 0.4s +} + +@keyframes animateleft { + from { + left: -300px; + opacity: 0 + } + + to { + left: 0; + opacity: 1 + } +} + +.w3-animate-right { + position: relative; + animation: animateright 0.4s +} + +@keyframes animateright { + from { + right: -300px; + opacity: 0 + } + + to { + right: 0; + opacity: 1 + } +} + +.w3-animate-bottom { + position: relative; + animation: animatebottom 0.4s +} + +@keyframes animatebottom { + from { + bottom: -300px; + opacity: 0 + } + + to { + bottom: 0; + opacity: 1 + } +} + +.w3-animate-zoom { + animation: animatezoom 0.6s +} + +@keyframes animatezoom { + from { + transform: scale(0) + } + + to { + transform: scale(1) + } +} + +.w3-animate-input { + transition: width 0.4s ease-in-out +} + +.w3-animate-input:focus { + width: 100% !important +} + +.w3-opacity, +.w3-hover-opacity:hover { + opacity: 0.60 +} + +.w3-opacity-off, +.w3-hover-opacity-off:hover { + opacity: 1 +} + +.w3-opacity-max { + opacity: 0.25 +} + +.w3-opacity-min { + opacity: 0.75 +} + +.w3-greyscale-max, +.w3-grayscale-max, +.w3-hover-greyscale:hover, +.w3-hover-grayscale:hover { + filter: grayscale(100%) +} + +.w3-greyscale, +.w3-grayscale { + filter: grayscale(75%) +} + +.w3-greyscale-min, +.w3-grayscale-min { + filter: grayscale(50%) +} + +.w3-sepia { + filter: sepia(75%) +} + +.w3-sepia-max, +.w3-hover-sepia:hover { + filter: sepia(100%) +} + +.w3-sepia-min { + filter: sepia(50%) +} + +.w3-tiny { + font-size: 10px !important +} + +.w3-small { + font-size: 12px !important +} + +.w3-medium { + font-size: 15px !important +} + +.w3-large { + font-size: 18px !important +} + +.w3-xlarge { + font-size: 24px !important +} + +.w3-xxlarge { + font-size: 36px !important +} + +.w3-xxxlarge { + font-size: 48px !important +} + +.w3-jumbo { + font-size: 64px !important +} + +.w3-left-align { + text-align: left !important +} + +.w3-right-align { + text-align: right !important +} + +.w3-justify { + text-align: justify !important +} + +.w3-center { + text-align: center !important +} + +.w3-border-0 { + border: 0 !important +} + +.w3-border { + border: 1px solid #ccc !important +} + +.w3-border-top { + border-top: 1px solid #ccc !important +} + +.w3-border-bottom { + border-bottom: 1px solid #ccc !important +} + +.w3-border-left { + border-left: 1px solid #ccc !important +} + +.w3-border-right { + border-right: 1px solid #ccc !important +} + +.w3-topbar { + border-top: 6px solid #ccc !important +} + +.w3-bottombar { + border-bottom: 6px solid #ccc !important +} + +.w3-leftbar { + border-left: 6px solid #ccc !important +} + +.w3-rightbar { + border-right: 6px solid #ccc !important +} + +.w3-section, +.w3-code { + margin-top: 16px !important; + margin-bottom: 16px !important +} + +.w3-margin { + margin: 16px !important +} + +.w3-margin-top { + margin-top: 16px !important +} + +.w3-margin-bottom { + margin-bottom: 16px !important +} + +.w3-margin-left { + margin-left: 16px !important +} + +.w3-margin-right { + margin-right: 16px !important +} + +.w3-padding-small { + padding: 4px 8px !important +} + +.w3-padding { + padding: 8px 16px !important +} + +.w3-padding-large { + padding: 12px 24px !important +} + +.w3-padding-16 { + padding-top: 16px !important; + padding-bottom: 16px !important +} + +.w3-padding-24 { + padding-top: 24px !important; + padding-bottom: 24px !important +} + +.w3-padding-32 { + padding-top: 32px !important; + padding-bottom: 32px !important +} + +.w3-padding-48 { + padding-top: 48px !important; + padding-bottom: 48px !important +} + +.w3-padding-64 { + padding-top: 64px !important; + padding-bottom: 64px !important +} + +.w3-padding-top-64 { + padding-top: 64px !important +} + +.w3-padding-top-48 { + padding-top: 48px !important +} + +.w3-padding-top-32 { + padding-top: 32px !important +} + +.w3-padding-top-24 { + padding-top: 24px !important +} + +.w3-left { + float: left !important +} + +.w3-right { + float: right !important +} + +.w3-button:hover { + color: #000 !important; + background-color: #ccc !important +} + +.w3-transparent, +.w3-hover-none:hover { + background-color: transparent !important +} + +.w3-hover-none:hover { + box-shadow: none !important +} + +/* Colors */ +.w3-amber, +.w3-hover-amber:hover { + color: #000 !important; + background-color: #ffc107 !important +} + +.w3-aqua, +.w3-hover-aqua:hover { + color: #000 !important; + background-color: #00ffff !important +} + +.w3-blue, +.w3-hover-blue:hover { + color: #fff !important; + background-color: #2196F3 !important +} + +.w3-light-blue, +.w3-hover-light-blue:hover { + color: #000 !important; + background-color: #87CEEB !important +} + +.w3-brown, +.w3-hover-brown:hover { + color: #fff !important; + background-color: #795548 !important +} + +.w3-cyan, +.w3-hover-cyan:hover { + color: #000 !important; + background-color: #00bcd4 !important +} + +.w3-blue-grey, +.w3-hover-blue-grey:hover, +.w3-blue-gray, +.w3-hover-blue-gray:hover { + color: #fff !important; + background-color: #607d8b !important +} + +.w3-green, +.w3-hover-green:hover { + color: #fff !important; + background-color: #4CAF50 !important +} + +.w3-light-green, +.w3-hover-light-green:hover { + color: #000 !important; + background-color: #8bc34a !important +} + +.w3-indigo, +.w3-hover-indigo:hover { + color: #fff !important; + background-color: #3f51b5 !important +} + +.w3-khaki, +.w3-hover-khaki:hover { + color: #000 !important; + background-color: #f0e68c !important +} + +.w3-lime, +.w3-hover-lime:hover { + color: #000 !important; + background-color: #cddc39 !important +} + +.w3-orange, +.w3-hover-orange:hover { + color: #000 !important; + background-color: #ff9800 !important +} + +.w3-deep-orange, +.w3-hover-deep-orange:hover { + color: #fff !important; + background-color: #ff5722 !important +} + +.w3-pink, +.w3-hover-pink:hover { + color: #fff !important; + background-color: #e91e63 !important +} + +.w3-purple, +.w3-hover-purple:hover { + color: #fff !important; + background-color: #9c27b0 !important +} + +.w3-deep-purple, +.w3-hover-deep-purple:hover { + color: #fff !important; + background-color: #673ab7 !important +} + +.w3-red, +.w3-hover-red:hover { + color: #fff !important; + background-color: #f44336 !important +} + +.w3-sand, +.w3-hover-sand:hover { + color: #000 !important; + background-color: #fdf5e6 !important +} + +.w3-teal, +.w3-hover-teal:hover { + color: #fff !important; + background-color: #009688 !important +} + +.w3-yellow, +.w3-hover-yellow:hover { + color: #000 !important; + background-color: #ffeb3b !important +} + +.w3-white, +.w3-hover-white:hover { + color: #000 !important; + background-color: #fff !important +} + +.w3-black, +.w3-hover-black:hover { + color: #fff !important; + background-color: #000 !important +} + +.w3-grey, +.w3-hover-grey:hover, +.w3-gray, +.w3-hover-gray:hover { + color: #000 !important; + background-color: #9e9e9e !important +} + +.w3-light-grey, +.w3-hover-light-grey:hover, +.w3-light-gray, +.w3-hover-light-gray:hover { + color: #000 !important; + background-color: #f1f1f1 !important +} + +.w3-dark-grey, +.w3-hover-dark-grey:hover, +.w3-dark-gray, +.w3-hover-dark-gray:hover { + color: #fff !important; + background-color: #616161 !important +} + +.w3-pale-red, +.w3-hover-pale-red:hover { + color: #000 !important; + background-color: #ffdddd !important +} + +.w3-pale-green, +.w3-hover-pale-green:hover { + color: #000 !important; + background-color: #ddffdd !important +} + +.w3-pale-yellow, +.w3-hover-pale-yellow:hover { + color: #000 !important; + background-color: #ffffcc !important +} + +.w3-pale-blue, +.w3-hover-pale-blue:hover { + color: #000 !important; + background-color: #ddffff !important +} + +.w3-text-amber, +.w3-hover-text-amber:hover { + color: #ffc107 !important +} + +.w3-text-aqua, +.w3-hover-text-aqua:hover { + color: #00ffff !important +} + +.w3-text-blue, +.w3-hover-text-blue:hover { + color: #2196F3 !important +} + +.w3-text-light-blue, +.w3-hover-text-light-blue:hover { + color: #87CEEB !important +} + +.w3-text-brown, +.w3-hover-text-brown:hover { + color: #795548 !important +} + +.w3-text-cyan, +.w3-hover-text-cyan:hover { + color: #00bcd4 !important +} + +.w3-text-blue-grey, +.w3-hover-text-blue-grey:hover, +.w3-text-blue-gray, +.w3-hover-text-blue-gray:hover { + color: #607d8b !important +} + +.w3-text-green, +.w3-hover-text-green:hover { + color: #4CAF50 !important +} + +.w3-text-light-green, +.w3-hover-text-light-green:hover { + color: #8bc34a !important +} + +.w3-text-indigo, +.w3-hover-text-indigo:hover { + color: #3f51b5 !important +} + +.w3-text-khaki, +.w3-hover-text-khaki:hover { + color: #b4aa50 !important +} + +.w3-text-lime, +.w3-hover-text-lime:hover { + color: #cddc39 !important +} + +.w3-text-orange, +.w3-hover-text-orange:hover { + color: #ff9800 !important +} + +.w3-text-deep-orange, +.w3-hover-text-deep-orange:hover { + color: #ff5722 !important +} + +.w3-text-pink, +.w3-hover-text-pink:hover { + color: #e91e63 !important +} + +.w3-text-purple, +.w3-hover-text-purple:hover { + color: #9c27b0 !important +} + +.w3-text-deep-purple, +.w3-hover-text-deep-purple:hover { + color: #673ab7 !important +} + +.w3-text-red, +.w3-hover-text-red:hover { + color: #f44336 !important +} + +.w3-text-sand, +.w3-hover-text-sand:hover { + color: #fdf5e6 !important +} + +.w3-text-teal, +.w3-hover-text-teal:hover { + color: #009688 !important +} + +.w3-text-yellow, +.w3-hover-text-yellow:hover { + color: #d2be0e !important +} + +.w3-text-white, +.w3-hover-text-white:hover { + color: #fff !important +} + +.w3-text-black, +.w3-hover-text-black:hover { + color: #000 !important +} + +.w3-text-grey, +.w3-hover-text-grey:hover, +.w3-text-gray, +.w3-hover-text-gray:hover { + color: #757575 !important +} + +.w3-text-light-grey, +.w3-hover-text-light-grey:hover, +.w3-text-light-gray, +.w3-hover-text-light-gray:hover { + color: #f1f1f1 !important +} + +.w3-text-dark-grey, +.w3-hover-text-dark-grey:hover, +.w3-text-dark-gray, +.w3-hover-text-dark-gray:hover { + color: #3a3a3a !important +} + +.w3-border-amber, +.w3-hover-border-amber:hover { + border-color: #ffc107 !important +} + +.w3-border-aqua, +.w3-hover-border-aqua:hover { + border-color: #00ffff !important +} + +.w3-border-blue, +.w3-hover-border-blue:hover { + border-color: #2196F3 !important +} + +.w3-border-light-blue, +.w3-hover-border-light-blue:hover { + border-color: #87CEEB !important +} + +.w3-border-brown, +.w3-hover-border-brown:hover { + border-color: #795548 !important +} + +.w3-border-cyan, +.w3-hover-border-cyan:hover { + border-color: #00bcd4 !important +} + +.w3-border-blue-grey, +.w3-hover-border-blue-grey:hover, +.w3-border-blue-gray, +.w3-hover-border-blue-gray:hover { + border-color: #607d8b !important +} + +.w3-border-green, +.w3-hover-border-green:hover { + border-color: #4CAF50 !important +} + +.w3-border-light-green, +.w3-hover-border-light-green:hover { + border-color: #8bc34a !important +} + +.w3-border-indigo, +.w3-hover-border-indigo:hover { + border-color: #3f51b5 !important +} + +.w3-border-khaki, +.w3-hover-border-khaki:hover { + border-color: #f0e68c !important +} + +.w3-border-lime, +.w3-hover-border-lime:hover { + border-color: #cddc39 !important +} + +.w3-border-orange, +.w3-hover-border-orange:hover { + border-color: #ff9800 !important +} + +.w3-border-deep-orange, +.w3-hover-border-deep-orange:hover { + border-color: #ff5722 !important +} + +.w3-border-pink, +.w3-hover-border-pink:hover { + border-color: #e91e63 !important +} + +.w3-border-purple, +.w3-hover-border-purple:hover { + border-color: #9c27b0 !important +} + +.w3-border-deep-purple, +.w3-hover-border-deep-purple:hover { + border-color: #673ab7 !important +} + +.w3-border-red, +.w3-hover-border-red:hover { + border-color: #f44336 !important +} + +.w3-border-sand, +.w3-hover-border-sand:hover { + border-color: #fdf5e6 !important +} + +.w3-border-teal, +.w3-hover-border-teal:hover { + border-color: #009688 !important +} + +.w3-border-yellow, +.w3-hover-border-yellow:hover { + border-color: #ffeb3b !important +} + +.w3-border-white, +.w3-hover-border-white:hover { + border-color: #fff !important +} + +.w3-border-black, +.w3-hover-border-black:hover { + border-color: #000 !important +} + +.w3-border-grey, +.w3-hover-border-grey:hover, +.w3-border-gray, +.w3-hover-border-gray:hover { + border-color: #9e9e9e !important +} + +.w3-border-light-grey, +.w3-hover-border-light-grey:hover, +.w3-border-light-gray, +.w3-hover-border-light-gray:hover { + border-color: #f1f1f1 !important +} + +.w3-border-dark-grey, +.w3-hover-border-dark-grey:hover, +.w3-border-dark-gray, +.w3-hover-border-dark-gray:hover { + border-color: #616161 !important +} + +.w3-border-pale-red, +.w3-hover-border-pale-red:hover { + border-color: #ffe7e7 !important +} + +.w3-border-pale-green, +.w3-hover-border-pale-green:hover { + border-color: #e7ffe7 !important +} + +.w3-border-pale-yellow, +.w3-hover-border-pale-yellow:hover { + border-color: #ffffcc !important +} + +.w3-border-pale-blue, +.w3-hover-border-pale-blue:hover { + border-color: #e7ffff !important +} + +.w3-metro-darken { + color: #fff !important; + background-color: #1d1d1d !important +} + +.w3-metro-light-blue { + color: #000 !important; + background-color: #eff4ff !important +} + +.w3-metro-blue { + color: #fff !important; + background-color: #2d89ef !important +} + +.w3-metro-dark-blue { + color: #fff !important; + background-color: #2b5797 !important +} + +.w3-text-metro-dark-blue { + color: #2b5797; +} + +.w3-hover-metro-dark-blue:hover { + color: #fff !important; + background-color: #2b5797 !important; +} + +.w3-hover-round-large { + border-radius: 8px; +} + +blockquote { + background: #f9f9f9; + margin: 0.6em 0px; + padding: 0.1em 10px 0.1em; + quotes: "\201C" "\201D" "\2018" "\2019"; +} + +pre { + overflow: auto; +} + +a { + text-decoration: none; +} + +.alert-success { + color: #000; + background-color: #ccc; +} + +.alert-failure { + color: #fff; + background-color: #b91d47; +} + +.tab-bar>a { + margin-right: 6px; +} + +.tab-button { + border-top-left-radius: 8px; + border-top-right-radius: 8px; + background-color: #ccc; +} + +.tab-button.active, +.tab-button:hover { + background-color: #f1f1f1 !important; +} + +.links-list a:not(:last-of-type)::after { + content: " | " +} + +.label-check { + margin-left: 5px; +} + +#appTitle { + height: 50px; + background-color: #2b5797; + color: #ffffff; + font-size: 18px; + padding-left: 8px; + padding-top: 8px; + position: fixed; + width: 300px; + margin-bottom: 10px; +} + +#searchBar { + padding-top: 3px; +} + +#page-content { + padding-top: 48px; + padding-left: 4px; + padding-right: 4px; +} + +.page-container { + padding-top: 10px; +} + +#searchText { + margin-top: 5px; + padding: 4px 4px; + font-size: 12pt; +} + +h5.title { + color: #2b5797; + font-weight: 400; + font-size: 18px; +} + +.w3-row .threequarter { + width: 75%; + float: left; +} + +.w3-row .quarter { + width: 25%; + float: left; +} + +#form-login { + width: 600px; +} + +.w3-button.w3-edit { + background-color: #f1f1f1; +} + +.w3-button.w3-edit:hover { + background-color: #2b5797 !important; +} + +.w3-button.w3-delete { + background-color: #f1f1f1; +} + +.w3-button.w3-delete:hover { + background-color: #b91d47 !important; +} + +.fields { + margin-top: 20px; + margin-bottom: 20px; +} + +.fields li { + padding-left: 0; +} + +.hidden { + display: none; +} + +.accordion { + cursor: pointer; +} + +.footerNavbar-container { + position: fixed; + bottom: 5px; + width: 100%; + padding-right: 8px; +} + +.footerNavbar { + overflow: hidden; + width: 100%; + background-color: #2b5797; +} + +.footerNavbar .w3-bar-item { + padding: 3px; +} + +.footerNavbar .w3-bar-item p { + margin-top: 0; + margin-bottom: 0; + font-size: 10pt; +} + +.footerNavbar .w3-btn { + padding: 6px 4px; +} + +#searchSidebar { + display: none; +} + +#overlay { + position: fixed; + display: none; + width: 100%; + height: 100%; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + z-index: 4; + cursor: pointer; +} + +#message { + visibility: hidden; + min-width: 250px; + margin-left: -125px; + text-align: center; + border-radius: 2px; + padding: 16px; + position: fixed; + z-index: 1; + left: 50%; + bottom: 36px; +} + +#message.show { + visibility: visible; +} + +.tag { + display: inline-block; +} + +.field-label { + font-weight: bold; +} + +.summary { + background-color: #fff; + padding: 4px +} + +.summary p { + padding: 0; + margin: 0; +} + +#page-top-bar { + z-index: 1; + height: 50px; +} + +#page-title-container { + margin-left: 8px; + padding: 0; + width: 100%; +} + +#page-title-container h5 { + white-space: nowrap; + overflow: hidden; +} + +#main-sidebar { + width: 300px; + z-index: 5; +} + +#types_menu, #settings_menu { + margin-left: 2px !important; +} + +#main-sidebar-content { + margin-top: 50px; +} + +tr.htmx-swapping td { + opacity: 0; + transition: opacity 1s ease-out; +} + +.label-checkbox { + top: 2px; + position: relative; + margin-left: 4px; +} + +#quickbox { + position: fixed; + display: none; + width: 100vw; + height: 100vh; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #ddd; + z-index: 5; +} + +#quickbox-top-bar { + height: var(--quickbox-topbar-height); +} + +#quickbox-footer { + height: var(--quickbox-footer-height); + position:fixed; bottom:0; +} + +#quickbox-content { + height: calc(100vh - var(--quickbox-footer-height)); + overflow: auto; + display: flex; + flex-direction: column-reverse; +} + +#quickbox-content .w3-button { + padding: 6px 10px; +} + +#quickbox-content .buttons { + width: 32px; +} + +#quickbox-content .buttons :first-child { + margin-bottom: 4px; +} + +#quickbox-title-container { + width: 100%; + padding: 0; + margin-left: 8px; +} + +#quickbox-footer { + padding: 2px; +} + +#quickbox-footer .button { + width: 50px; + margin-left: 4px; +} + +#quickbox-send { + cursor: pointer; + padding: 14px 16px; +} + +#quickbox-footer .textarea { + padding-right: 4px; +} + +.quickbox-row { + margin-top: 4px; + margin-bottom: 4px; +} + +#quickbox-content .w3-row { + background-color: #fff; +} + +#quickbox-content div:nth-child(2n+1) { + background-color: #fafafa; +} + +#items_search, #all_items_search { + position: sticky; + top: 50px; + z-index: 2; + background-color: #ddd; + padding-top: 4px; + padding-bottom: 4px; +} + +.panel-search { + background-color: #fff; + padding: 4px; +} + +table.stickyheader thead { + position: sticky; + top: 50px; + z-index: 2; +} + +table.stickyheader.searchopened thead { + top: 180px; +} + +.input-container { + display: flex; + max-width: 100%; + overflow: hidden; +} + +.input-container .prefix { + margin-right: 8px; +} + +.input-container input { + flex-grow: 1; + border: none; + outline: none; + padding: 8px; +} + +.input-container:focus-within { + border-color: #777; +} + +/* Small */ +@media (max-width:600px) { + i { + font-size: 20px; + } + + fieldset { + margin-bottom: 10px; + } + + #quickbox-content { + padding-top: var(--quickbox-topbar-height); + } + + #message { + min-width: 100%; + margin-left: 0; + margin-right: 0; + left: 0; + } + + .page-container { + padding-bottom: 100px; + } + + #page-title i { + font-size: 20px; + } + + #searchBar #searchText { + width: 250px; + } + + #form-login { + width: 96%; + } + + #searchBar { + display: none; + } + + #searchSidebar { + display: block; + } + + .w3-table-all.responsive table, + .w3-table-all.responsive thead, + .w3-table-all.responsive tbody, + .w3-table-all.responsive th, + .w3-table-all.responsive td, + .w3-table-all.responsive tr { + display: block; + } + + .w3-table-all thead tr { + position: absolute; + top: -9999px; + left: -9999px; + } + + .w3-table-all.responsive tr { + margin-bottom: 10px; + border: 1px solid #ddd; + } + + .w3-table-all.responsive td { + border: none; + position: relative; + padding-left: 30%; + } + + .w3-table-all.responsive td.no-label { + padding-left: 6px; + } + + .w3-table-all.responsive td.title { + color: #2b5797; + font-weight: 400; + font-size: 18px; + } + + .w3-table-all.responsive td:before { + position: absolute; + left: 6px; + content: attr(data-label); + font-weight: bold; + } + + .w3-table-all.responsive td.no-label:before { + position: absolute; + left: 6px; + content: ""; + font-weight: bold; + } + + .w3-modal-full { + width: 100vw !important; + height: 100vh !important; + padding-top:0 !important; + background-color: #fff; + } + + .w3-modal-full .w3-modal-content { + margin:0 !important; + } +} + +@media (max-width:992px) { + + /* The switch - the box around the slider */ + .switch { + position: relative; + display: inline-block; + width: 46px; + height: 24px; + } + + /* Hide default HTML checkbox */ + .switch input { + opacity: 0; + width: 0; + height: 0; + } + + /* The slider */ + .slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #ccc; + -webkit-transition: .4s; + transition: .4s; + } + + .slider:before { + position: absolute; + content: ""; + height: 16px; + width: 16px; + left: 4px; + bottom: 4px; + background-color: white; + -webkit-transition: .4s; + transition: .4s; + } + + input:checked+.slider { + background-color: #2b5797; + } + + input:focus+.slider { + box-shadow: 0 0 1px #2b5797; + } + + input:checked+.slider:before { + -webkit-transform: translateX(22px); + -ms-transform: translateX(22px); + transform: translateX(22px); + } + + /* Rounded sliders */ + .slider.round { + border-radius: 24px; + } + + .slider.round:before { + border-radius: 50%; + } +} + +/* Medium */ +@media (max-width:992px) and (min-width:601px) { + #page-title-container h5 { + padding-left: 0px; + } +} + +/* Min medium */ +@media (min-width:601px) { + .home-card-summary { + height: 250px; + overflow: auto; + } + + #quickbox { + width: 400px; + position: fixed; + top: 50px; + left: calc(100vw - 420px); + height: calc(100vh - 50px); + background-color: #fff !important; + border-left: 2px solid #fff; + border-top: 2px solid #fff; + } + #quickbox-top-bar { + position: relative; + } + #quickbox-footer { + position: relative; + } + + #quickbox-content { + height: calc(100vh - var(--quickbox-footer-height) - var(--quickbox-footer-height) - 42px); + } + +} + +/* Large */ +@media (min-width:993px) { + .w3-row > .w3-half:first { + padding-right: 4px; + } + + .w3-row > .w3-half:nth-child(2) { + padding-left: 4px; + } + + #page-main { + padding-left: 300px; + } + + #page-top-bar { + padding-right: 300px; + } +} diff --git a/assets/static/easymde/easymde.min.css b/assets/static/easymde/easymde.min.css new file mode 100644 index 0000000..3b88351 --- /dev/null +++ b/assets/static/easymde/easymde.min.css @@ -0,0 +1,7 @@ +/** + * easymde v2.18.0 + * Copyright Jeroen Akkerman + * @link https://github.com/ionaru/easy-markdown-editor + * @license MIT + */ +.CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor .CodeMirror-line::selection,.cm-fat-cursor .CodeMirror-line>span::selection,.cm-fat-cursor .CodeMirror-line>span>span::selection{background:0 0}.cm-fat-cursor .CodeMirror-line::-moz-selection,.cm-fat-cursor .CodeMirror-line>span::-moz-selection,.cm-fat-cursor .CodeMirror-line>span>span::-moz-selection{background:0 0}.cm-fat-cursor{caret-color:transparent}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:0;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-50px;margin-right:-50px;padding-bottom:50px;height:100%;outline:0;position:relative;z-index:0}.CodeMirror-sizer{position:relative;border-right:50px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none;outline:0}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-50px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre.CodeMirror-line,.CodeMirror-wrap pre.CodeMirror-line-like{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.EasyMDEContainer{display:block}.CodeMirror-rtl pre{direction:rtl}.EasyMDEContainer.sided--no-fullscreen{display:flex;flex-direction:row;flex-wrap:wrap}.EasyMDEContainer .CodeMirror{box-sizing:border-box;height:auto;border:1px solid #ced4da;border-bottom-left-radius:4px;border-bottom-right-radius:4px;padding:10px;font:inherit;z-index:0;word-wrap:break-word}.EasyMDEContainer .CodeMirror-scroll{cursor:text}.EasyMDEContainer .CodeMirror-fullscreen{background:#fff;position:fixed!important;top:50px;left:0;right:0;bottom:0;height:auto;z-index:8;border-right:none!important;border-bottom-right-radius:0!important}.EasyMDEContainer .CodeMirror-sided{width:50%!important}.EasyMDEContainer.sided--no-fullscreen .CodeMirror-sided{border-right:none!important;border-bottom-right-radius:0;position:relative;flex:1 1 auto}.EasyMDEContainer .CodeMirror-placeholder{opacity:.5}.EasyMDEContainer .CodeMirror-focused .CodeMirror-selected{background:#d9d9d9}.editor-toolbar{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;padding:9px 10px;border-top:1px solid #ced4da;border-left:1px solid #ced4da;border-right:1px solid #ced4da;border-top-left-radius:4px;border-top-right-radius:4px}.editor-toolbar.fullscreen{width:100%;height:50px;padding-top:10px;padding-bottom:10px;box-sizing:border-box;background:#fff;border:0;position:fixed;top:0;left:0;opacity:1;z-index:9}.editor-toolbar.fullscreen::before{width:20px;height:50px;background:-moz-linear-gradient(left,#fff 0,rgba(255,255,255,0) 100%);background:-webkit-gradient(linear,left top,right top,color-stop(0,#fff),color-stop(100%,rgba(255,255,255,0)));background:-webkit-linear-gradient(left,#fff 0,rgba(255,255,255,0) 100%);background:-o-linear-gradient(left,#fff 0,rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left,#fff 0,rgba(255,255,255,0) 100%);background:linear-gradient(to right,#fff 0,rgba(255,255,255,0) 100%);position:fixed;top:0;left:0;margin:0;padding:0}.editor-toolbar.fullscreen::after{width:20px;height:50px;background:-moz-linear-gradient(left,rgba(255,255,255,0) 0,#fff 100%);background:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,0)),color-stop(100%,#fff));background:-webkit-linear-gradient(left,rgba(255,255,255,0) 0,#fff 100%);background:-o-linear-gradient(left,rgba(255,255,255,0) 0,#fff 100%);background:-ms-linear-gradient(left,rgba(255,255,255,0) 0,#fff 100%);background:linear-gradient(to right,rgba(255,255,255,0) 0,#fff 100%);position:fixed;top:0;right:0;margin:0;padding:0}.EasyMDEContainer.sided--no-fullscreen .editor-toolbar{width:100%}.editor-toolbar .easymde-dropdown,.editor-toolbar button{background:0 0;display:inline-block;text-align:center;text-decoration:none!important;height:30px;margin:0;padding:0;border:1px solid transparent;border-radius:3px;cursor:pointer}.editor-toolbar button{font-weight:700;min-width:30px;padding:0 6px;white-space:nowrap}.editor-toolbar button.active,.editor-toolbar button:hover{background:#fcfcfc;border-color:#95a5a6}.editor-toolbar i.separator{display:inline-block;width:0;border-left:1px solid #d9d9d9;border-right:1px solid #fff;color:transparent;text-indent:-10px;margin:0 6px}.editor-toolbar button:after{font-family:Arial,"Helvetica Neue",Helvetica,sans-serif;font-size:65%;vertical-align:text-bottom;position:relative;top:2px}.editor-toolbar button.heading-1:after{content:"1"}.editor-toolbar button.heading-2:after{content:"2"}.editor-toolbar button.heading-3:after{content:"3"}.editor-toolbar button.heading-bigger:after{content:"▲"}.editor-toolbar button.heading-smaller:after{content:"▼"}.editor-toolbar.disabled-for-preview button:not(.no-disable){opacity:.6;pointer-events:none}@media only screen and (max-width:700px){.editor-toolbar i.no-mobile{display:none}}.editor-statusbar{padding:8px 10px;font-size:12px;color:#959694;text-align:right}.EasyMDEContainer.sided--no-fullscreen .editor-statusbar{width:100%}.editor-statusbar span{display:inline-block;min-width:4em;margin-left:1em}.editor-statusbar .lines:before{content:'lines: '}.editor-statusbar .words:before{content:'words: '}.editor-statusbar .characters:before{content:'characters: '}.editor-preview-full{position:absolute;width:100%;height:100%;top:0;left:0;z-index:7;overflow:auto;display:none;box-sizing:border-box}.editor-preview-side{position:fixed;bottom:0;width:50%;top:50px;right:0;z-index:9;overflow:auto;display:none;box-sizing:border-box;border:1px solid #ddd;word-wrap:break-word}.editor-preview-active-side{display:block}.EasyMDEContainer.sided--no-fullscreen .editor-preview-active-side{flex:1 1 auto;height:auto;position:static}.editor-preview-active{display:block}.editor-preview{padding:10px;background:#fafafa}.editor-preview>p{margin-top:0}.editor-preview pre{background:#eee;margin-bottom:10px}.editor-preview table td,.editor-preview table th{border:1px solid #ddd;padding:5px}.cm-s-easymde .cm-tag{color:#63a35c}.cm-s-easymde .cm-attribute{color:#795da3}.cm-s-easymde .cm-string{color:#183691}.cm-s-easymde .cm-header-1{font-size:calc(1.375rem + 1.5vw)}.cm-s-easymde .cm-header-2{font-size:calc(1.325rem + .9vw)}.cm-s-easymde .cm-header-3{font-size:calc(1.3rem + .6vw)}.cm-s-easymde .cm-header-4{font-size:calc(1.275rem + .3vw)}.cm-s-easymde .cm-header-5{font-size:1.25rem}.cm-s-easymde .cm-header-6{font-size:1rem}.cm-s-easymde .cm-header-1,.cm-s-easymde .cm-header-2,.cm-s-easymde .cm-header-3,.cm-s-easymde .cm-header-4,.cm-s-easymde .cm-header-5,.cm-s-easymde .cm-header-6{margin-bottom:.5rem;line-height:1.2}.cm-s-easymde .cm-comment{background:rgba(0,0,0,.05);border-radius:2px}.cm-s-easymde .cm-link{color:#7f8c8d}.cm-s-easymde .cm-url{color:#aab2b3}.cm-s-easymde .cm-quote{color:#7f8c8d;font-style:italic}.editor-toolbar .easymde-dropdown{position:relative;background:linear-gradient(to bottom right,#fff 0,#fff 84%,#333 50%,#333 100%);border-radius:0;border:1px solid #fff}.editor-toolbar .easymde-dropdown:hover{background:linear-gradient(to bottom right,#fff 0,#fff 84%,#333 50%,#333 100%)}.easymde-dropdown-content{display:block;visibility:hidden;position:absolute;background-color:#f9f9f9;box-shadow:0 8px 16px 0 rgba(0,0,0,.2);padding:8px;z-index:2;top:30px}.easymde-dropdown:active .easymde-dropdown-content,.easymde-dropdown:focus .easymde-dropdown-content,.easymde-dropdown:focus-within .easymde-dropdown-content{visibility:visible}.easymde-dropdown-content button{display:block}span[data-img-src]::after{content:'';background-image:var(--bg-image);display:block;max-height:100%;max-width:100%;background-size:contain;height:0;padding-top:var(--height);width:var(--width);background-repeat:no-repeat}.CodeMirror .cm-spell-error:not(.cm-url):not(.cm-comment):not(.cm-tag):not(.cm-word){background:rgba(255,0,0,.15)} \ No newline at end of file diff --git a/assets/static/easymde/easymde.min.js b/assets/static/easymde/easymde.min.js new file mode 100644 index 0000000..17f6da9 --- /dev/null +++ b/assets/static/easymde/easymde.min.js @@ -0,0 +1,7 @@ +/** + * easymde v2.18.0 + * Copyright Jeroen Akkerman + * @link https://github.com/ionaru/easy-markdown-editor + * @license MIT + */ +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).EasyMDE=e()}}((function(){return function e(t,n,i){function r(a,l){if(!n[a]){if(!t[a]){var s="function"==typeof require&&require;if(!l&&s)return s(a,!0);if(o)return o(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var c=n[a]={exports:{}};t[a][0].call(c.exports,(function(e){return r(t[a][1][e]||e)}),c,c.exports,e,t,n,i)}return n[a].exports}for(var o="function"==typeof require&&require,a=0;a[> ]*|[*+-] \[[x ]\]\s|[*+-]\s|(\d+)([.)]))(\s*)/,n=/^(\s*)(>[> ]*|[*+-] \[[x ]\]|[*+-]|(\d+)[.)])(\s*)$/,i=/[*+-]\s/;function r(e,n){var i=n.line,r=0,o=0,a=t.exec(e.getLine(i)),l=a[1];do{var s=i+(r+=1),u=e.getLine(s),c=t.exec(u);if(c){var d=c[1],h=parseInt(a[3],10)+r-o,f=parseInt(c[3],10),p=f;if(l!==d||isNaN(f)){if(l.length>d.length)return;if(l.lengthf&&(p=h+1),e.replaceRange(u.replace(t,d+p+c[4]+c[5]),{line:s,ch:0},{line:s,ch:u.length})}}while(c)}e.commands.newlineAndIndentContinueMarkdownList=function(o){if(o.getOption("disableInput"))return e.Pass;for(var a=o.listSelections(),l=[],s=0;s\s*$/.test(p),x=!/>\s*$/.test(p);(v||x)&&o.replaceRange("",{line:u.line,ch:0},{line:u.line,ch:u.ch+1}),l[s]="\n"}else{var y=m[1],b=m[5],D=!(i.test(m[2])||m[2].indexOf(">")>=0),C=D?parseInt(m[3],10)+1+m[4]:m[2].replace("x"," ");l[s]="\n"+y+C+b,D&&r(o,u)}}o.replaceSelections(l)}})("object"==typeof n&&"object"==typeof t?e("../../lib/codemirror"):CodeMirror)},{"../../lib/codemirror":10}],7:[function(e,t,n){(function(e){"use strict";e.overlayMode=function(t,n,i){return{startState:function(){return{base:e.startState(t),overlay:e.startState(n),basePos:0,baseCur:null,overlayPos:0,overlayCur:null,streamSeen:null}},copyState:function(i){return{base:e.copyState(t,i.base),overlay:e.copyState(n,i.overlay),basePos:i.basePos,baseCur:null,overlayPos:i.overlayPos,overlayCur:null}},token:function(e,r){return(e!=r.streamSeen||Math.min(r.basePos,r.overlayPos)c);d++){var h=e.getLine(u++);l=null==l?h:l+"\n"+h}s*=2,t.lastIndex=n.ch;var f=t.exec(l);if(f){var p=l.slice(0,f.index).split("\n"),m=f[0].split("\n"),g=n.line+p.length-1,v=p[p.length-1].length;return{from:i(g,v),to:i(g+m.length-1,1==m.length?v+m[0].length:m[m.length-1].length),match:f}}}}function s(e,t,n){for(var i,r=0;r<=e.length;){t.lastIndex=r;var o=t.exec(e);if(!o)break;var a=o.index+o[0].length;if(a>e.length-n)break;(!i||a>i.index+i[0].length)&&(i=o),r=o.index+1}return i}function u(e,t,n){t=r(t,"g");for(var o=n.line,a=n.ch,l=e.firstLine();o>=l;o--,a=-1){var u=e.getLine(o),c=s(u,t,a<0?0:u.length-a);if(c)return{from:i(o,c.index),to:i(o,c.index+c[0].length),match:c}}}function c(e,t,n){if(!o(t))return u(e,t,n);t=r(t,"gm");for(var a,l=1,c=e.getLine(n.line).length-n.ch,d=n.line,h=e.firstLine();d>=h;){for(var f=0;f=h;f++){var p=e.getLine(d--);a=null==a?p:p+"\n"+a}l*=2;var m=s(a,t,c);if(m){var g=a.slice(0,m.index).split("\n"),v=m[0].split("\n"),x=d+g.length,y=g[g.length-1].length;return{from:i(x,y),to:i(x+v.length-1,1==v.length?y+v[0].length:v[v.length-1].length),match:m}}}}function d(e,t,n,i){if(e.length==t.length)return n;for(var r=0,o=n+Math.max(0,e.length-t.length);;){if(r==o)return r;var a=r+o>>1,l=i(e.slice(0,a)).length;if(l==n)return a;l>n?o=a:r=a+1}}function h(e,r,o,a){if(!r.length)return null;var l=a?t:n,s=l(r).split(/\r|\n\r?/);e:for(var u=o.line,c=o.ch,h=e.lastLine()+1-s.length;u<=h;u++,c=0){var f=e.getLine(u).slice(c),p=l(f);if(1==s.length){var m=p.indexOf(s[0]);if(-1==m)continue e;return o=d(f,p,m,l)+c,{from:i(u,d(f,p,m,l)+c),to:i(u,d(f,p,m+s[0].length,l)+c)}}var g=p.length-s[0].length;if(p.slice(g)==s[0]){for(var v=1;v=h;u--,c=-1){var f=e.getLine(u);c>-1&&(f=f.slice(0,c));var p=l(f);if(1==s.length){var m=p.lastIndexOf(s[0]);if(-1==m)continue e;return{from:i(u,d(f,p,m,l)),to:i(u,d(f,p,m+s[0].length,l))}}var g=s[s.length-1];if(p.slice(0,g.length)==g){var v=1;for(o=u-s.length+1;v(this.doc.getLine(n.line)||"").length&&(n.ch=0,n.line++)),0!=e.cmpPos(n,this.doc.clipPos(n))))return this.atOccurrence=!1;var r=this.matches(t,n);if(this.afterEmptyMatch=r&&0==e.cmpPos(r.from,r.to),r)return this.pos=r,this.atOccurrence=!0,this.pos.match||!0;var o=i(t?this.doc.firstLine():this.doc.lastLine()+1,0);return this.pos={from:o,to:o},this.atOccurrence=!1},from:function(){if(this.atOccurrence)return this.pos.from},to:function(){if(this.atOccurrence)return this.pos.to},replace:function(t,n){if(this.atOccurrence){var r=e.splitLines(t);this.doc.replaceRange(r,this.pos.from,this.pos.to,n),this.pos.to=i(this.pos.from.line+r.length-1,r[r.length-1].length+(1==r.length?this.pos.from.ch:0))}}},e.defineExtension("getSearchCursor",(function(e,t,n){return new p(this.doc,e,t,n)})),e.defineDocExtension("getSearchCursor",(function(e,t,n){return new p(this,e,t,n)})),e.defineExtension("selectMatches",(function(t,n){for(var i=[],r=this.getSearchCursor(t,this.getCursor("from"),n);r.findNext()&&!(e.cmpPos(r.to(),this.getCursor("to"))>0);)i.push({anchor:r.from(),head:r.to()});i.length&&this.setSelections(i,0)}))})("object"==typeof n&&"object"==typeof t?e("../../lib/codemirror"):CodeMirror)},{"../../lib/codemirror":10}],9:[function(e,t,n){(function(e){"use strict";function t(e){e.state.markedSelection&&e.operation((function(){!function(e){if(!e.somethingSelected())return a(e);if(e.listSelections().length>1)return l(e);var t=e.getCursor("start"),n=e.getCursor("end"),i=e.state.markedSelection;if(!i.length)return o(e,t,n);var s=i[0].find(),u=i[i.length-1].find();if(!s||!u||n.line-t.line<=8||r(t,u.to)>=0||r(n,s.from)<=0)return l(e);for(;r(t,s.from)>0;)i.shift().clear(),s=i[0].find();for(r(t,s.from)<0&&(s.to.line-t.line<8?(i.shift().clear(),o(e,t,s.to,0)):o(e,t,s.from,0));r(n,u.to)<0;)i.pop().clear(),u=i[i.length-1].find();r(n,u.to)>0&&(n.line-u.from.line<8?(i.pop().clear(),o(e,u.from,n)):o(e,u.to,n))}(e)}))}function n(e){e.state.markedSelection&&e.state.markedSelection.length&&e.operation((function(){a(e)}))}e.defineOption("styleSelectedText",!1,(function(i,r,o){var s=o&&o!=e.Init;r&&!s?(i.state.markedSelection=[],i.state.markedSelectionStyle="string"==typeof r?r:"CodeMirror-selectedtext",l(i),i.on("cursorActivity",t),i.on("change",n)):!r&&s&&(i.off("cursorActivity",t),i.off("change",n),a(i),i.state.markedSelection=i.state.markedSelectionStyle=null)}));var i=e.Pos,r=e.cmpPos;function o(e,t,n,o){if(0!=r(t,n))for(var a=e.state.markedSelection,l=e.state.markedSelectionStyle,s=t.line;;){var u=s==t.line?t:i(s,0),c=s+8,d=c>=n.line,h=d?n:i(c,0),f=e.markText(u,h,{className:l});if(null==o?a.push(f):a.splice(o++,0,f),d)break;s=c}}function a(e){for(var t=e.state.markedSelection,n=0;n2),v=/Android/.test(e),x=g||v||/webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(e),y=g||/Mac/.test(t),b=/\bCrOS\b/.test(e),D=/win/i.test(t),C=h&&e.match(/Version\/(\d*\.\d*)/);C&&(C=Number(C[1])),C&&C>=15&&(h=!1,s=!0);var w=y&&(u||h&&(null==C||C<12.11)),k=n||a&&l>=9;function S(e){return new RegExp("(^|\\s)"+e+"(?:$|\\s)\\s*")}var F,A=function(e,t){var n=e.className,i=S(t).exec(n);if(i){var r=n.slice(i.index+i[0].length);e.className=n.slice(0,i.index)+(r?i[1]+r:"")}};function E(e){for(var t=e.childNodes.length;t>0;--t)e.removeChild(e.firstChild);return e}function L(e,t){return E(e).appendChild(t)}function T(e,t,n,i){var r=document.createElement(e);if(n&&(r.className=n),i&&(r.style.cssText=i),"string"==typeof t)r.appendChild(document.createTextNode(t));else if(t)for(var o=0;o=t)return a+(t-o);a+=l-o,a+=n-a%n,o=l+1}}g?z=function(e){e.selectionStart=0,e.selectionEnd=e.value.length}:a&&(z=function(e){try{e.select()}catch(e){}});var j=function(){this.id=null,this.f=null,this.time=0,this.handler=P(this.onTimeout,this)};function q(e,t){for(var n=0;n=t)return i+Math.min(a,t-r);if(r+=o-i,i=o+1,(r+=n-r%n)>=t)return i}}var K=[""];function Z(e){for(;K.length<=e;)K.push(Y(K)+" ");return K[e]}function Y(e){return e[e.length-1]}function Q(e,t){for(var n=[],i=0;i"€"&&(e.toUpperCase()!=e.toLowerCase()||te.test(e))}function ie(e,t){return t?!!(t.source.indexOf("\\w")>-1&&ne(e))||t.test(e):ne(e)}function re(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!1;return!0}var oe=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;function ae(e){return e.charCodeAt(0)>=768&&oe.test(e)}function le(e,t,n){for(;(n<0?t>0:tn?-1:1;;){if(t==n)return t;var r=(t+n)/2,o=i<0?Math.ceil(r):Math.floor(r);if(o==t)return e(o)?t:n;e(o)?n=o:t=o+i}}var ue=null;function ce(e,t,n){var i;ue=null;for(var r=0;rt)return r;o.to==t&&(o.from!=o.to&&"before"==n?i=r:ue=r),o.from==t&&(o.from!=o.to&&"before"!=n?i=r:ue=r)}return null!=i?i:ue}var de=function(){var e=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,t=/[stwN]/,n=/[LRr]/,i=/[Lb1n]/,r=/[1n]/;function o(e,t,n){this.level=e,this.from=t,this.to=n}return function(a,l){var s="ltr"==l?"L":"R";if(0==a.length||"ltr"==l&&!e.test(a))return!1;for(var u,c=a.length,d=[],h=0;h-1&&(i[t]=r.slice(0,o).concat(r.slice(o+1)))}}}function ve(e,t){var n=me(e,t);if(n.length)for(var i=Array.prototype.slice.call(arguments,2),r=0;r0}function De(e){e.prototype.on=function(e,t){pe(this,e,t)},e.prototype.off=function(e,t){ge(this,e,t)}}function Ce(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function we(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}function ke(e){return null!=e.defaultPrevented?e.defaultPrevented:0==e.returnValue}function Se(e){Ce(e),we(e)}function Fe(e){return e.target||e.srcElement}function Ae(e){var t=e.which;return null==t&&(1&e.button?t=1:2&e.button?t=3:4&e.button&&(t=2)),y&&e.ctrlKey&&1==t&&(t=3),t}var Ee,Le,Te=function(){if(a&&l<9)return!1;var e=T("div");return"draggable"in e||"dragDrop"in e}();function Me(e){if(null==Ee){var t=T("span","​");L(e,T("span",[t,document.createTextNode("x")])),0!=e.firstChild.offsetHeight&&(Ee=t.offsetWidth<=1&&t.offsetHeight>2&&!(a&&l<8))}var n=Ee?T("span","​"):T("span"," ",null,"display: inline-block; width: 1px; margin-right: -1px");return n.setAttribute("cm-text",""),n}function Be(e){if(null!=Le)return Le;var t=L(e,document.createTextNode("AخA")),n=F(t,0,1).getBoundingClientRect(),i=F(t,1,2).getBoundingClientRect();return E(e),!(!n||n.left==n.right)&&(Le=i.right-n.right<3)}var Ne,Oe=3!="\n\nb".split(/\n/).length?function(e){for(var t=0,n=[],i=e.length;t<=i;){var r=e.indexOf("\n",t);-1==r&&(r=e.length);var o=e.slice(t,"\r"==e.charAt(r-1)?r-1:r),a=o.indexOf("\r");-1!=a?(n.push(o.slice(0,a)),t+=a+1):(n.push(o),t=r+1)}return n}:function(e){return e.split(/\r\n?|\n/)},Ie=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch(e){return!1}}:function(e){var t;try{t=e.ownerDocument.selection.createRange()}catch(e){}return!(!t||t.parentElement()!=e)&&0!=t.compareEndPoints("StartToEnd",t)},ze="oncopy"in(Ne=T("div"))||(Ne.setAttribute("oncopy","return;"),"function"==typeof Ne.oncopy),He=null;var Re={},Pe={};function _e(e,t){arguments.length>2&&(t.dependencies=Array.prototype.slice.call(arguments,2)),Re[e]=t}function We(e){if("string"==typeof e&&Pe.hasOwnProperty(e))e=Pe[e];else if(e&&"string"==typeof e.name&&Pe.hasOwnProperty(e.name)){var t=Pe[e.name];"string"==typeof t&&(t={name:t}),(e=ee(t,e)).name=t.name}else{if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+xml$/.test(e))return We("application/xml");if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+json$/.test(e))return We("application/json")}return"string"==typeof e?{name:e}:e||{name:"null"}}function je(e,t){t=We(t);var n=Re[t.name];if(!n)return je(e,"text/plain");var i=n(e,t);if(qe.hasOwnProperty(t.name)){var r=qe[t.name];for(var o in r)r.hasOwnProperty(o)&&(i.hasOwnProperty(o)&&(i["_"+o]=i[o]),i[o]=r[o])}if(i.name=t.name,t.helperType&&(i.helperType=t.helperType),t.modeProps)for(var a in t.modeProps)i[a]=t.modeProps[a];return i}var qe={};function Ue(e,t){_(t,qe.hasOwnProperty(e)?qe[e]:qe[e]={})}function $e(e,t){if(!0===t)return t;if(e.copyState)return e.copyState(t);var n={};for(var i in t){var r=t[i];r instanceof Array&&(r=r.concat([])),n[i]=r}return n}function Ge(e,t){for(var n;e.innerMode&&(n=e.innerMode(t))&&n.mode!=e;)t=n.state,e=n.mode;return n||{mode:e,state:t}}function Ve(e,t,n){return!e.startState||e.startState(t,n)}var Xe=function(e,t,n){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0,this.lineOracle=n};function Ke(e,t){if((t-=e.first)<0||t>=e.size)throw new Error("There is no line "+(t+e.first)+" in the document.");for(var n=e;!n.lines;)for(var i=0;;++i){var r=n.children[i],o=r.chunkSize();if(t=e.first&&tn?it(n,Ke(e,n).text.length):function(e,t){var n=e.ch;return null==n||n>t?it(e.line,t):n<0?it(e.line,0):e}(t,Ke(e,t.line).text.length)}function dt(e,t){for(var n=[],i=0;i=this.string.length},Xe.prototype.sol=function(){return this.pos==this.lineStart},Xe.prototype.peek=function(){return this.string.charAt(this.pos)||void 0},Xe.prototype.next=function(){if(this.post},Xe.prototype.eatSpace=function(){for(var e=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e},Xe.prototype.skipToEnd=function(){this.pos=this.string.length},Xe.prototype.skipTo=function(e){var t=this.string.indexOf(e,this.pos);if(t>-1)return this.pos=t,!0},Xe.prototype.backUp=function(e){this.pos-=e},Xe.prototype.column=function(){return this.lastColumnPos0?null:(i&&!1!==t&&(this.pos+=i[0].length),i)}var r=function(e){return n?e.toLowerCase():e};if(r(this.string.substr(this.pos,e.length))==r(e))return!1!==t&&(this.pos+=e.length),!0},Xe.prototype.current=function(){return this.string.slice(this.start,this.pos)},Xe.prototype.hideFirstChars=function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}},Xe.prototype.lookAhead=function(e){var t=this.lineOracle;return t&&t.lookAhead(e)},Xe.prototype.baseToken=function(){var e=this.lineOracle;return e&&e.baseToken(this.pos)};var ht=function(e,t){this.state=e,this.lookAhead=t},ft=function(e,t,n,i){this.state=t,this.doc=e,this.line=n,this.maxLookAhead=i||0,this.baseTokens=null,this.baseTokenPos=1};function pt(e,t,n,i){var r=[e.state.modeGen],o={};wt(e,t.text,e.doc.mode,n,(function(e,t){return r.push(e,t)}),o,i);for(var a=n.state,l=function(i){n.baseTokens=r;var l=e.state.overlays[i],s=1,u=0;n.state=!0,wt(e,t.text,l.mode,n,(function(e,t){for(var n=s;ue&&r.splice(s,1,e,r[s+1],i),s+=2,u=Math.min(e,i)}if(t)if(l.opaque)r.splice(n,s-n,e,"overlay "+t),s=n+2;else for(;ne.options.maxHighlightLength&&$e(e.doc.mode,i.state),o=pt(e,t,i);r&&(i.state=r),t.stateAfter=i.save(!r),t.styles=o.styles,o.classes?t.styleClasses=o.classes:t.styleClasses&&(t.styleClasses=null),n===e.doc.highlightFrontier&&(e.doc.modeFrontier=Math.max(e.doc.modeFrontier,++e.doc.highlightFrontier))}return t.styles}function gt(e,t,n){var i=e.doc,r=e.display;if(!i.mode.startState)return new ft(i,!0,t);var o=function(e,t,n){for(var i,r,o=e.doc,a=n?-1:t-(e.doc.mode.innerMode?1e3:100),l=t;l>a;--l){if(l<=o.first)return o.first;var s=Ke(o,l-1),u=s.stateAfter;if(u&&(!n||l+(u instanceof ht?u.lookAhead:0)<=o.modeFrontier))return l;var c=W(s.text,null,e.options.tabSize);(null==r||i>c)&&(r=l-1,i=c)}return r}(e,t,n),a=o>i.first&&Ke(i,o-1).stateAfter,l=a?ft.fromSaved(i,a,o):new ft(i,Ve(i.mode),o);return i.iter(o,t,(function(n){vt(e,n.text,l);var i=l.line;n.stateAfter=i==t-1||i%5==0||i>=r.viewFrom&&it.start)return o}throw new Error("Mode "+e.name+" failed to advance stream.")}ft.prototype.lookAhead=function(e){var t=this.doc.getLine(this.line+e);return null!=t&&e>this.maxLookAhead&&(this.maxLookAhead=e),t},ft.prototype.baseToken=function(e){if(!this.baseTokens)return null;for(;this.baseTokens[this.baseTokenPos]<=e;)this.baseTokenPos+=2;var t=this.baseTokens[this.baseTokenPos+1];return{type:t&&t.replace(/( |^)overlay .*/,""),size:this.baseTokens[this.baseTokenPos]-e}},ft.prototype.nextLine=function(){this.line++,this.maxLookAhead>0&&this.maxLookAhead--},ft.fromSaved=function(e,t,n){return t instanceof ht?new ft(e,$e(e.mode,t.state),n,t.lookAhead):new ft(e,$e(e.mode,t),n)},ft.prototype.save=function(e){var t=!1!==e?$e(this.doc.mode,this.state):this.state;return this.maxLookAhead>0?new ht(t,this.maxLookAhead):t};var bt=function(e,t,n){this.start=e.start,this.end=e.pos,this.string=e.current(),this.type=t||null,this.state=n};function Dt(e,t,n,i){var r,o,a=e.doc,l=a.mode,s=Ke(a,(t=ct(a,t)).line),u=gt(e,t.line,n),c=new Xe(s.text,e.options.tabSize,u);for(i&&(o=[]);(i||c.pose.options.maxHighlightLength?(l=!1,a&&vt(e,t,i,d.pos),d.pos=t.length,s=null):s=Ct(yt(n,d,i.state,h),o),h){var f=h[0].name;f&&(s="m-"+(s?f+" "+s:f))}if(!l||c!=s){for(;u=t:o.to>t);(i||(i=[])).push(new Ft(a,o.from,l?null:o.to))}}return i}(n,r,a),s=function(e,t,n){var i;if(e)for(var r=0;r=t:o.to>t)||o.from==t&&"bookmark"==a.type&&(!n||o.marker.insertLeft)){var l=null==o.from||(a.inclusiveLeft?o.from<=t:o.from0&&l)for(var y=0;yt)&&(!n||It(n,o.marker)<0)&&(n=o.marker)}return n}function _t(e,t,n,i,r){var o=Ke(e,t),a=St&&o.markedSpans;if(a)for(var l=0;l=0&&d<=0||c<=0&&d>=0)&&(c<=0&&(s.marker.inclusiveRight&&r.inclusiveLeft?rt(u.to,n)>=0:rt(u.to,n)>0)||c>=0&&(s.marker.inclusiveRight&&r.inclusiveLeft?rt(u.from,i)<=0:rt(u.from,i)<0)))return!0}}}function Wt(e){for(var t;t=Ht(e);)e=t.find(-1,!0).line;return e}function jt(e,t){var n=Ke(e,t),i=Wt(n);return n==i?t:Je(i)}function qt(e,t){if(t>e.lastLine())return t;var n,i=Ke(e,t);if(!Ut(e,i))return t;for(;n=Rt(i);)i=n.find(1,!0).line;return Je(i)+1}function Ut(e,t){var n=St&&t.markedSpans;if(n)for(var i=void 0,r=0;rt.maxLineLength&&(t.maxLineLength=n,t.maxLine=e)}))}var Kt=function(e,t,n){this.text=e,Bt(this,t),this.height=n?n(this):1};function Zt(e){e.parent=null,Mt(e)}Kt.prototype.lineNo=function(){return Je(this)},De(Kt);var Yt={},Qt={};function Jt(e,t){if(!e||/^\s*$/.test(e))return null;var n=t.addModeClass?Qt:Yt;return n[e]||(n[e]=e.replace(/\S+/g,"cm-$&"))}function en(e,t){var n=M("span",null,null,s?"padding-right: .1px":null),i={pre:M("pre",[n],"CodeMirror-line"),content:n,col:0,pos:0,cm:e,trailingSpace:!1,splitSpaces:e.getOption("lineWrapping")};t.measure={};for(var r=0;r<=(t.rest?t.rest.length:0);r++){var o=r?t.rest[r-1]:t.line,a=void 0;i.pos=0,i.addToken=nn,Be(e.display.measure)&&(a=he(o,e.doc.direction))&&(i.addToken=rn(i.addToken,a)),i.map=[],an(o,i,mt(e,o,t!=e.display.externalMeasured&&Je(o))),o.styleClasses&&(o.styleClasses.bgClass&&(i.bgClass=I(o.styleClasses.bgClass,i.bgClass||"")),o.styleClasses.textClass&&(i.textClass=I(o.styleClasses.textClass,i.textClass||""))),0==i.map.length&&i.map.push(0,0,i.content.appendChild(Me(e.display.measure))),0==r?(t.measure.map=i.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(i.map),(t.measure.caches||(t.measure.caches=[])).push({}))}if(s){var l=i.content.lastChild;(/\bcm-tab\b/.test(l.className)||l.querySelector&&l.querySelector(".cm-tab"))&&(i.content.className="cm-tab-wrap-hack")}return ve(e,"renderLine",e,t.line,i.pre),i.pre.className&&(i.textClass=I(i.pre.className,i.textClass||"")),i}function tn(e){var t=T("span","•","cm-invalidchar");return t.title="\\u"+e.charCodeAt(0).toString(16),t.setAttribute("aria-label",t.title),t}function nn(e,t,n,i,r,o,s){if(t){var u,c=e.splitSpaces?function(e,t){if(e.length>1&&!/ /.test(e))return e;for(var n=t,i="",r=0;ru&&d.from<=u);h++);if(d.to>=c)return e(n,i,r,o,a,l,s);e(n,i.slice(0,d.to-u),r,o,null,l,s),o=null,i=i.slice(d.to-u),u=d.to}}}function on(e,t,n,i){var r=!i&&n.widgetNode;r&&e.map.push(e.pos,e.pos+t,r),!i&&e.cm.display.input.needsContentAttribute&&(r||(r=e.content.appendChild(document.createElement("span"))),r.setAttribute("cm-marker",n.id)),r&&(e.cm.display.input.setUneditable(r),e.content.appendChild(r)),e.pos+=t,e.trailingSpace=!1}function an(e,t,n){var i=e.markedSpans,r=e.text,o=0;if(i)for(var a,l,s,u,c,d,h,f=r.length,p=0,m=1,g="",v=0;;){if(v==p){s=u=c=l="",h=null,d=null,v=1/0;for(var x=[],y=void 0,b=0;bp||C.collapsed&&D.to==p&&D.from==p)){if(null!=D.to&&D.to!=p&&v>D.to&&(v=D.to,u=""),C.className&&(s+=" "+C.className),C.css&&(l=(l?l+";":"")+C.css),C.startStyle&&D.from==p&&(c+=" "+C.startStyle),C.endStyle&&D.to==v&&(y||(y=[])).push(C.endStyle,D.to),C.title&&((h||(h={})).title=C.title),C.attributes)for(var w in C.attributes)(h||(h={}))[w]=C.attributes[w];C.collapsed&&(!d||It(d.marker,C)<0)&&(d=D)}else D.from>p&&v>D.from&&(v=D.from)}if(y)for(var k=0;k=f)break;for(var F=Math.min(f,v);;){if(g){var A=p+g.length;if(!d){var E=A>F?g.slice(0,F-p):g;t.addToken(t,E,a?a+s:s,c,p+E.length==v?u:"",l,h)}if(A>=F){g=g.slice(F-p),p=F;break}p=A,c=""}g=r.slice(o,o=n[m++]),a=Jt(n[m++],t.cm.options)}}else for(var L=1;Ln)return{map:e.measure.maps[r],cache:e.measure.caches[r],before:!0}}}function Nn(e,t,n,i){return zn(e,In(e,t),n,i)}function On(e,t){if(t>=e.display.viewFrom&&t=n.lineN&&t2&&o.push((s.bottom+u.top)/2-n.top)}}o.push(n.bottom-n.top)}}(e,t.view,t.rect),t.hasHeights=!0),o=function(e,t,n,i){var r,o=Pn(t.map,n,i),s=o.node,u=o.start,c=o.end,d=o.collapse;if(3==s.nodeType){for(var h=0;h<4;h++){for(;u&&ae(t.line.text.charAt(o.coverStart+u));)--u;for(;o.coverStart+c1}(e))return t;var n=screen.logicalXDPI/screen.deviceXDPI,i=screen.logicalYDPI/screen.deviceYDPI;return{left:t.left*n,right:t.right*n,top:t.top*i,bottom:t.bottom*i}}(e.display.measure,r))}else{var f;u>0&&(d=i="right"),r=e.options.lineWrapping&&(f=s.getClientRects()).length>1?f["right"==i?f.length-1:0]:s.getBoundingClientRect()}if(a&&l<9&&!u&&(!r||!r.left&&!r.right)){var p=s.parentNode.getClientRects()[0];r=p?{left:p.left,right:p.left+li(e.display),top:p.top,bottom:p.bottom}:Rn}for(var m=r.top-t.rect.top,g=r.bottom-t.rect.top,v=(m+g)/2,x=t.view.measure.heights,y=0;yt)&&(r=(o=s-l)-1,t>=s&&(a="right")),null!=r){if(i=e[u+2],l==s&&n==(i.insertLeft?"left":"right")&&(a=n),"left"==n&&0==r)for(;u&&e[u-2]==e[u-3]&&e[u-1].insertLeft;)i=e[2+(u-=3)],a="left";if("right"==n&&r==s-l)for(;u=0&&(n=e[r]).left==n.right;r--);return n}function Wn(e){if(e.measure&&(e.measure.cache={},e.measure.heights=null,e.rest))for(var t=0;t=i.text.length?(s=i.text.length,u="before"):s<=0&&(s=0,u="after"),!l)return a("before"==u?s-1:s,"before"==u);function c(e,t,n){return a(n?e-1:e,1==l[t].level!=n)}var d=ce(l,s,u),h=ue,f=c(s,d,"before"==u);return null!=h&&(f.other=c(s,h,"before"!=u)),f}function Yn(e,t){var n=0;t=ct(e.doc,t),e.options.lineWrapping||(n=li(e.display)*t.ch);var i=Ke(e.doc,t.line),r=Gt(i)+Fn(e.display);return{left:n,right:n,top:r,bottom:r+i.height}}function Qn(e,t,n,i,r){var o=it(e,t,n);return o.xRel=r,i&&(o.outside=i),o}function Jn(e,t,n){var i=e.doc;if((n+=e.display.viewOffset)<0)return Qn(i.first,0,null,-1,-1);var r=et(i,n),o=i.first+i.size-1;if(r>o)return Qn(i.first+i.size-1,Ke(i,o).text.length,null,1,1);t<0&&(t=0);for(var a=Ke(i,r);;){var l=ii(e,a,r,t,n),s=Pt(a,l.ch+(l.xRel>0||l.outside>0?1:0));if(!s)return l;var u=s.find(1);if(u.line==r)return u;a=Ke(i,r=u.line)}}function ei(e,t,n,i){i-=Gn(t);var r=t.text.length,o=se((function(t){return zn(e,n,t-1).bottom<=i}),r,0);return{begin:o,end:r=se((function(t){return zn(e,n,t).top>i}),o,r)}}function ti(e,t,n,i){return n||(n=In(e,t)),ei(e,t,n,Vn(e,t,zn(e,n,i),"line").top)}function ni(e,t,n,i){return!(e.bottom<=n)&&(e.top>n||(i?e.left:e.right)>t)}function ii(e,t,n,i,r){r-=Gt(t);var o=In(e,t),a=Gn(t),l=0,s=t.text.length,u=!0,c=he(t,e.doc.direction);if(c){var d=(e.options.lineWrapping?oi:ri)(e,t,n,o,c,i,r);l=(u=1!=d.level)?d.from:d.to-1,s=u?d.to:d.from-1}var h,f,p=null,m=null,g=se((function(t){var n=zn(e,o,t);return n.top+=a,n.bottom+=a,!!ni(n,i,r,!1)&&(n.top<=r&&n.left<=i&&(p=t,m=n),!0)}),l,s),v=!1;if(m){var x=i-m.left=b.bottom?1:0}return Qn(n,g=le(t.text,g,1),f,v,i-h)}function ri(e,t,n,i,r,o,a){var l=se((function(l){var s=r[l],u=1!=s.level;return ni(Zn(e,it(n,u?s.to:s.from,u?"before":"after"),"line",t,i),o,a,!0)}),0,r.length-1),s=r[l];if(l>0){var u=1!=s.level,c=Zn(e,it(n,u?s.from:s.to,u?"after":"before"),"line",t,i);ni(c,o,a,!0)&&c.top>a&&(s=r[l-1])}return s}function oi(e,t,n,i,r,o,a){var l=ei(e,t,i,a),s=l.begin,u=l.end;/\s/.test(t.text.charAt(u-1))&&u--;for(var c=null,d=null,h=0;h=u||f.to<=s)){var p=zn(e,i,1!=f.level?Math.min(u,f.to)-1:Math.max(s,f.from)).right,m=pm)&&(c=f,d=m)}}return c||(c=r[r.length-1]),c.fromu&&(c={from:c.from,to:u,level:c.level}),c}function ai(e){if(null!=e.cachedTextHeight)return e.cachedTextHeight;if(null==Hn){Hn=T("pre",null,"CodeMirror-line-like");for(var t=0;t<49;++t)Hn.appendChild(document.createTextNode("x")),Hn.appendChild(T("br"));Hn.appendChild(document.createTextNode("x"))}L(e.measure,Hn);var n=Hn.offsetHeight/50;return n>3&&(e.cachedTextHeight=n),E(e.measure),n||1}function li(e){if(null!=e.cachedCharWidth)return e.cachedCharWidth;var t=T("span","xxxxxxxxxx"),n=T("pre",[t],"CodeMirror-line-like");L(e.measure,n);var i=t.getBoundingClientRect(),r=(i.right-i.left)/10;return r>2&&(e.cachedCharWidth=r),r||10}function si(e){for(var t=e.display,n={},i={},r=t.gutters.clientLeft,o=t.gutters.firstChild,a=0;o;o=o.nextSibling,++a){var l=e.display.gutterSpecs[a].className;n[l]=o.offsetLeft+o.clientLeft+r,i[l]=o.clientWidth}return{fixedPos:ui(t),gutterTotalWidth:t.gutters.offsetWidth,gutterLeft:n,gutterWidth:i,wrapperWidth:t.wrapper.clientWidth}}function ui(e){return e.scroller.getBoundingClientRect().left-e.sizer.getBoundingClientRect().left}function ci(e){var t=ai(e.display),n=e.options.lineWrapping,i=n&&Math.max(5,e.display.scroller.clientWidth/li(e.display)-3);return function(r){if(Ut(e.doc,r))return 0;var o=0;if(r.widgets)for(var a=0;a0&&(s=Ke(e.doc,u.line).text).length==u.ch){var c=W(s,s.length,e.options.tabSize)-s.length;u=it(u.line,Math.max(0,Math.round((o-En(e.display).left)/li(e.display))-c))}return u}function fi(e,t){if(t>=e.display.viewTo)return null;if((t-=e.display.viewFrom)<0)return null;for(var n=e.display.view,i=0;it)&&(r.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=r.viewTo)St&&jt(e.doc,t)r.viewFrom?gi(e):(r.viewFrom+=i,r.viewTo+=i);else if(t<=r.viewFrom&&n>=r.viewTo)gi(e);else if(t<=r.viewFrom){var o=vi(e,n,n+i,1);o?(r.view=r.view.slice(o.index),r.viewFrom=o.lineN,r.viewTo+=i):gi(e)}else if(n>=r.viewTo){var a=vi(e,t,t,-1);a?(r.view=r.view.slice(0,a.index),r.viewTo=a.lineN):gi(e)}else{var l=vi(e,t,t,-1),s=vi(e,n,n+i,1);l&&s?(r.view=r.view.slice(0,l.index).concat(sn(e,l.lineN,s.lineN)).concat(r.view.slice(s.index)),r.viewTo+=i):gi(e)}var u=r.externalMeasured;u&&(n=r.lineN&&t=i.viewTo)){var o=i.view[fi(e,t)];if(null!=o.node){var a=o.changes||(o.changes=[]);-1==q(a,n)&&a.push(n)}}}function gi(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function vi(e,t,n,i){var r,o=fi(e,t),a=e.display.view;if(!St||n==e.doc.first+e.doc.size)return{index:o,lineN:n};for(var l=e.display.viewFrom,s=0;s0){if(o==a.length-1)return null;r=l+a[o].size-t,o++}else r=l-t;t+=r,n+=r}for(;jt(e.doc,n)!=n;){if(o==(i<0?0:a.length-1))return null;n+=i*a[o-(i<0?1:0)].size,o+=i}return{index:o,lineN:n}}function xi(e){for(var t=e.display.view,n=0,i=0;i=e.display.viewTo||s.to().line0?a:e.defaultCharWidth())+"px"}if(i.other){var l=n.appendChild(T("div"," ","CodeMirror-cursor CodeMirror-secondarycursor"));l.style.display="",l.style.left=i.other.left+"px",l.style.top=i.other.top+"px",l.style.height=.85*(i.other.bottom-i.other.top)+"px"}}function Ci(e,t){return e.top-t.top||e.left-t.left}function wi(e,t,n){var i=e.display,r=e.doc,o=document.createDocumentFragment(),a=En(e.display),l=a.left,s=Math.max(i.sizerWidth,Tn(e)-i.sizer.offsetLeft)-a.right,u="ltr"==r.direction;function c(e,t,n,i){t<0&&(t=0),t=Math.round(t),i=Math.round(i),o.appendChild(T("div",null,"CodeMirror-selected","position: absolute; left: "+e+"px;\n top: "+t+"px; width: "+(null==n?s-e:n)+"px;\n height: "+(i-t)+"px"))}function d(t,n,i){var o,a,d=Ke(r,t),h=d.text.length;function f(n,i){return Kn(e,it(t,n),"div",d,i)}function p(t,n,i){var r=ti(e,d,null,t),o="ltr"==n==("after"==i)?"left":"right";return f("after"==i?r.begin:r.end-(/\s/.test(d.text.charAt(r.end-1))?2:1),o)[o]}var m=he(d,r.direction);return function(e,t,n,i){if(!e)return i(t,n,"ltr",0);for(var r=!1,o=0;ot||t==n&&a.to==t)&&(i(Math.max(a.from,t),Math.min(a.to,n),1==a.level?"rtl":"ltr",o),r=!0)}r||i(t,n,"ltr")}(m,n||0,null==i?h:i,(function(e,t,r,d){var g="ltr"==r,v=f(e,g?"left":"right"),x=f(t-1,g?"right":"left"),y=null==n&&0==e,b=null==i&&t==h,D=0==d,C=!m||d==m.length-1;if(x.top-v.top<=3){var w=(u?b:y)&&C,k=(u?y:b)&&D?l:(g?v:x).left,S=w?s:(g?x:v).right;c(k,v.top,S-k,v.bottom)}else{var F,A,E,L;g?(F=u&&y&&D?l:v.left,A=u?s:p(e,r,"before"),E=u?l:p(t,r,"after"),L=u&&b&&C?s:x.right):(F=u?p(e,r,"before"):l,A=!u&&y&&D?s:v.right,E=!u&&b&&C?l:x.left,L=u?p(t,r,"after"):s),c(F,v.top,A-F,v.bottom),v.bottom0?t.blinker=setInterval((function(){e.hasFocus()||Ei(e),t.cursorDiv.style.visibility=(n=!n)?"":"hidden"}),e.options.cursorBlinkRate):e.options.cursorBlinkRate<0&&(t.cursorDiv.style.visibility="hidden")}}function Si(e){e.hasFocus()||(e.display.input.focus(),e.state.focused||Ai(e))}function Fi(e){e.state.delayingBlurEvent=!0,setTimeout((function(){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1,e.state.focused&&Ei(e))}),100)}function Ai(e,t){e.state.delayingBlurEvent&&!e.state.draggingText&&(e.state.delayingBlurEvent=!1),"nocursor"!=e.options.readOnly&&(e.state.focused||(ve(e,"focus",e,t),e.state.focused=!0,O(e.display.wrapper,"CodeMirror-focused"),e.curOp||e.display.selForContextMenu==e.doc.sel||(e.display.input.reset(),s&&setTimeout((function(){return e.display.input.reset(!0)}),20)),e.display.input.receivedFocus()),ki(e))}function Ei(e,t){e.state.delayingBlurEvent||(e.state.focused&&(ve(e,"blur",e,t),e.state.focused=!1,A(e.display.wrapper,"CodeMirror-focused")),clearInterval(e.display.blinker),setTimeout((function(){e.state.focused||(e.display.shift=!1)}),150))}function Li(e){for(var t=e.display,n=t.lineDiv.offsetTop,i=Math.max(0,t.scroller.getBoundingClientRect().top),r=t.lineDiv.getBoundingClientRect().top,o=0,s=0;s.005||m<-.005)&&(re.display.sizerWidth){var v=Math.ceil(h/li(e.display));v>e.display.maxLineLength&&(e.display.maxLineLength=v,e.display.maxLine=u.line,e.display.maxLineChanged=!0)}}}Math.abs(o)>2&&(t.scroller.scrollTop+=o)}function Ti(e){if(e.widgets)for(var t=0;t=a&&(o=et(t,Gt(Ke(t,s))-e.wrapper.clientHeight),a=s)}return{from:o,to:Math.max(a,o+1)}}function Bi(e,t){var n=e.display,i=ai(e.display);t.top<0&&(t.top=0);var r=e.curOp&&null!=e.curOp.scrollTop?e.curOp.scrollTop:n.scroller.scrollTop,o=Mn(e),a={};t.bottom-t.top>o&&(t.bottom=t.top+o);var l=e.doc.height+An(n),s=t.topl-i;if(t.topr+o){var c=Math.min(t.top,(u?l:t.bottom)-o);c!=r&&(a.scrollTop=c)}var d=e.options.fixedGutter?0:n.gutters.offsetWidth,h=e.curOp&&null!=e.curOp.scrollLeft?e.curOp.scrollLeft:n.scroller.scrollLeft-d,f=Tn(e)-n.gutters.offsetWidth,p=t.right-t.left>f;return p&&(t.right=t.left+f),t.left<10?a.scrollLeft=0:t.leftf+h-3&&(a.scrollLeft=t.right+(p?0:10)-f),a}function Ni(e,t){null!=t&&(zi(e),e.curOp.scrollTop=(null==e.curOp.scrollTop?e.doc.scrollTop:e.curOp.scrollTop)+t)}function Oi(e){zi(e);var t=e.getCursor();e.curOp.scrollToPos={from:t,to:t,margin:e.options.cursorScrollMargin}}function Ii(e,t,n){null==t&&null==n||zi(e),null!=t&&(e.curOp.scrollLeft=t),null!=n&&(e.curOp.scrollTop=n)}function zi(e){var t=e.curOp.scrollToPos;t&&(e.curOp.scrollToPos=null,Hi(e,Yn(e,t.from),Yn(e,t.to),t.margin))}function Hi(e,t,n,i){var r=Bi(e,{left:Math.min(t.left,n.left),top:Math.min(t.top,n.top)-i,right:Math.max(t.right,n.right),bottom:Math.max(t.bottom,n.bottom)+i});Ii(e,r.scrollLeft,r.scrollTop)}function Ri(e,t){Math.abs(e.doc.scrollTop-t)<2||(n||hr(e,{top:t}),Pi(e,t,!0),n&&hr(e),ar(e,100))}function Pi(e,t,n){t=Math.max(0,Math.min(e.display.scroller.scrollHeight-e.display.scroller.clientHeight,t)),(e.display.scroller.scrollTop!=t||n)&&(e.doc.scrollTop=t,e.display.scrollbars.setScrollTop(t),e.display.scroller.scrollTop!=t&&(e.display.scroller.scrollTop=t))}function _i(e,t,n,i){t=Math.max(0,Math.min(t,e.display.scroller.scrollWidth-e.display.scroller.clientWidth)),(n?t==e.doc.scrollLeft:Math.abs(e.doc.scrollLeft-t)<2)&&!i||(e.doc.scrollLeft=t,mr(e),e.display.scroller.scrollLeft!=t&&(e.display.scroller.scrollLeft=t),e.display.scrollbars.setScrollLeft(t))}function Wi(e){var t=e.display,n=t.gutters.offsetWidth,i=Math.round(e.doc.height+An(e.display));return{clientHeight:t.scroller.clientHeight,viewHeight:t.wrapper.clientHeight,scrollWidth:t.scroller.scrollWidth,clientWidth:t.scroller.clientWidth,viewWidth:t.wrapper.clientWidth,barLeft:e.options.fixedGutter?n:0,docHeight:i,scrollHeight:i+Ln(e)+t.barHeight,nativeBarWidth:t.nativeBarWidth,gutterWidth:n}}var ji=function(e,t,n){this.cm=n;var i=this.vert=T("div",[T("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),r=this.horiz=T("div",[T("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");i.tabIndex=r.tabIndex=-1,e(i),e(r),pe(i,"scroll",(function(){i.clientHeight&&t(i.scrollTop,"vertical")})),pe(r,"scroll",(function(){r.clientWidth&&t(r.scrollLeft,"horizontal")})),this.checkedZeroWidth=!1,a&&l<8&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")};ji.prototype.update=function(e){var t=e.scrollWidth>e.clientWidth+1,n=e.scrollHeight>e.clientHeight+1,i=e.nativeBarWidth;if(n){this.vert.style.display="block",this.vert.style.bottom=t?i+"px":"0";var r=e.viewHeight-(t?i:0);this.vert.firstChild.style.height=Math.max(0,e.scrollHeight-e.clientHeight+r)+"px"}else this.vert.scrollTop=0,this.vert.style.display="",this.vert.firstChild.style.height="0";if(t){this.horiz.style.display="block",this.horiz.style.right=n?i+"px":"0",this.horiz.style.left=e.barLeft+"px";var o=e.viewWidth-e.barLeft-(n?i:0);this.horiz.firstChild.style.width=Math.max(0,e.scrollWidth-e.clientWidth+o)+"px"}else this.horiz.style.display="",this.horiz.firstChild.style.width="0";return!this.checkedZeroWidth&&e.clientHeight>0&&(0==i&&this.zeroWidthHack(),this.checkedZeroWidth=!0),{right:n?i:0,bottom:t?i:0}},ji.prototype.setScrollLeft=function(e){this.horiz.scrollLeft!=e&&(this.horiz.scrollLeft=e),this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz,"horiz")},ji.prototype.setScrollTop=function(e){this.vert.scrollTop!=e&&(this.vert.scrollTop=e),this.disableVert&&this.enableZeroWidthBar(this.vert,this.disableVert,"vert")},ji.prototype.zeroWidthHack=function(){var e=y&&!p?"12px":"18px";this.horiz.style.height=this.vert.style.width=e,this.horiz.style.visibility=this.vert.style.visibility="hidden",this.disableHoriz=new j,this.disableVert=new j},ji.prototype.enableZeroWidthBar=function(e,t,n){e.style.visibility="",t.set(1e3,(function i(){var r=e.getBoundingClientRect();("vert"==n?document.elementFromPoint(r.right-1,(r.top+r.bottom)/2):document.elementFromPoint((r.right+r.left)/2,r.bottom-1))!=e?e.style.visibility="hidden":t.set(1e3,i)}))},ji.prototype.clear=function(){var e=this.horiz.parentNode;e.removeChild(this.horiz),e.removeChild(this.vert)};var qi=function(){};function Ui(e,t){t||(t=Wi(e));var n=e.display.barWidth,i=e.display.barHeight;$i(e,t);for(var r=0;r<4&&n!=e.display.barWidth||i!=e.display.barHeight;r++)n!=e.display.barWidth&&e.options.lineWrapping&&Li(e),$i(e,Wi(e)),n=e.display.barWidth,i=e.display.barHeight}function $i(e,t){var n=e.display,i=n.scrollbars.update(t);n.sizer.style.paddingRight=(n.barWidth=i.right)+"px",n.sizer.style.paddingBottom=(n.barHeight=i.bottom)+"px",n.heightForcer.style.borderBottom=i.bottom+"px solid transparent",i.right&&i.bottom?(n.scrollbarFiller.style.display="block",n.scrollbarFiller.style.height=i.bottom+"px",n.scrollbarFiller.style.width=i.right+"px"):n.scrollbarFiller.style.display="",i.bottom&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(n.gutterFiller.style.display="block",n.gutterFiller.style.height=i.bottom+"px",n.gutterFiller.style.width=t.gutterWidth+"px"):n.gutterFiller.style.display=""}qi.prototype.update=function(){return{bottom:0,right:0}},qi.prototype.setScrollLeft=function(){},qi.prototype.setScrollTop=function(){},qi.prototype.clear=function(){};var Gi={native:ji,null:qi};function Vi(e){e.display.scrollbars&&(e.display.scrollbars.clear(),e.display.scrollbars.addClass&&A(e.display.wrapper,e.display.scrollbars.addClass)),e.display.scrollbars=new Gi[e.options.scrollbarStyle]((function(t){e.display.wrapper.insertBefore(t,e.display.scrollbarFiller),pe(t,"mousedown",(function(){e.state.focused&&setTimeout((function(){return e.display.input.focus()}),0)})),t.setAttribute("cm-not-content","true")}),(function(t,n){"horizontal"==n?_i(e,t):Ri(e,t)}),e),e.display.scrollbars.addClass&&O(e.display.wrapper,e.display.scrollbars.addClass)}var Xi=0;function Ki(e){var t;e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:0,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++Xi,markArrays:null},t=e.curOp,un?un.ops.push(t):t.ownsGroup=un={ops:[t],delayedCallbacks:[]}}function Zi(e){var t=e.curOp;t&&function(e,t){var n=e.ownsGroup;if(n)try{!function(e){var t=e.delayedCallbacks,n=0;do{for(;n=n.viewTo)||n.maxLineChanged&&t.options.lineWrapping,e.update=e.mustUpdate&&new sr(t,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}function Qi(e){e.updatedDisplay=e.mustUpdate&&cr(e.cm,e.update)}function Ji(e){var t=e.cm,n=t.display;e.updatedDisplay&&Li(t),e.barMeasure=Wi(t),n.maxLineChanged&&!t.options.lineWrapping&&(e.adjustWidthTo=Nn(t,n.maxLine,n.maxLine.text.length).left+3,t.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(n.scroller.clientWidth,n.sizer.offsetLeft+e.adjustWidthTo+Ln(t)+t.display.barWidth),e.maxScrollLeft=Math.max(0,n.sizer.offsetLeft+e.adjustWidthTo-Tn(t))),(e.updatedDisplay||e.selectionChanged)&&(e.preparedSelection=n.input.prepareSelection())}function er(e){var t=e.cm;null!=e.adjustWidthTo&&(t.display.sizer.style.minWidth=e.adjustWidthTo+"px",e.maxScrollLeft1&&(a=!0)),null!=u.scrollLeft&&(_i(e,u.scrollLeft),Math.abs(e.doc.scrollLeft-d)>1&&(a=!0)),!a)break}return r}(t,ct(i,e.scrollToPos.from),ct(i,e.scrollToPos.to),e.scrollToPos.margin);!function(e,t){if(!xe(e,"scrollCursorIntoView")){var n=e.display,i=n.sizer.getBoundingClientRect(),r=null,o=n.wrapper.ownerDocument;if(t.top+i.top<0?r=!0:t.bottom+i.top>(o.defaultView.innerHeight||o.documentElement.clientHeight)&&(r=!1),null!=r&&!m){var a=T("div","​",null,"position: absolute;\n top: "+(t.top-n.viewOffset-Fn(e.display))+"px;\n height: "+(t.bottom-t.top+Ln(e)+n.barHeight)+"px;\n left: "+t.left+"px; width: "+Math.max(2,t.right-t.left)+"px;");e.display.lineSpace.appendChild(a),a.scrollIntoView(r),e.display.lineSpace.removeChild(a)}}}(t,r)}var o=e.maybeHiddenMarkers,a=e.maybeUnhiddenMarkers;if(o)for(var l=0;l=e.display.viewTo)){var n=+new Date+e.options.workTime,i=gt(e,t.highlightFrontier),r=[];t.iter(i.line,Math.min(t.first+t.size,e.display.viewTo+500),(function(o){if(i.line>=e.display.viewFrom){var a=o.styles,l=o.text.length>e.options.maxHighlightLength?$e(t.mode,i.state):null,s=pt(e,o,i,!0);l&&(i.state=l),o.styles=s.styles;var u=o.styleClasses,c=s.classes;c?o.styleClasses=c:u&&(o.styleClasses=null);for(var d=!a||a.length!=o.styles.length||u!=c&&(!u||!c||u.bgClass!=c.bgClass||u.textClass!=c.textClass),h=0;!d&&hn)return ar(e,e.options.workDelay),!0})),t.highlightFrontier=i.line,t.modeFrontier=Math.max(t.modeFrontier,i.line),r.length&&nr(e,(function(){for(var t=0;t=n.viewFrom&&t.visible.to<=n.viewTo&&(null==n.updateLineNumbers||n.updateLineNumbers>=n.viewTo)&&n.renderedView==n.view&&0==xi(e))return!1;gr(e)&&(gi(e),t.dims=si(e));var r=i.first+i.size,o=Math.max(t.visible.from-e.options.viewportMargin,i.first),a=Math.min(r,t.visible.to+e.options.viewportMargin);n.viewFroma&&n.viewTo-a<20&&(a=Math.min(r,n.viewTo)),St&&(o=jt(e.doc,o),a=qt(e.doc,a));var l=o!=n.viewFrom||a!=n.viewTo||n.lastWrapHeight!=t.wrapperHeight||n.lastWrapWidth!=t.wrapperWidth;!function(e,t,n){var i=e.display;0==i.view.length||t>=i.viewTo||n<=i.viewFrom?(i.view=sn(e,t,n),i.viewFrom=t):(i.viewFrom>t?i.view=sn(e,t,i.viewFrom).concat(i.view):i.viewFromn&&(i.view=i.view.slice(0,fi(e,n)))),i.viewTo=n}(e,o,a),n.viewOffset=Gt(Ke(e.doc,n.viewFrom)),e.display.mover.style.top=n.viewOffset+"px";var u=xi(e);if(!l&&0==u&&!t.force&&n.renderedView==n.view&&(null==n.updateLineNumbers||n.updateLineNumbers>=n.viewTo))return!1;var c=ur(e);return u>4&&(n.lineDiv.style.display="none"),function(e,t,n){var i=e.display,r=e.options.lineNumbers,o=i.lineDiv,a=o.firstChild;function l(t){var n=t.nextSibling;return s&&y&&e.display.currentWheelTarget==t?t.style.display="none":t.parentNode.removeChild(t),n}for(var u=i.view,c=i.viewFrom,d=0;d-1&&(f=!1),fn(e,h,c,n)),f&&(E(h.lineNumber),h.lineNumber.appendChild(document.createTextNode(nt(e.options,c)))),a=h.node.nextSibling}else{var p=bn(e,h,c,n);o.insertBefore(p,a)}c+=h.size}for(;a;)a=l(a)}(e,n.updateLineNumbers,t.dims),u>4&&(n.lineDiv.style.display=""),n.renderedView=n.view,function(e){if(e&&e.activeElt&&e.activeElt!=N(e.activeElt.ownerDocument)&&(e.activeElt.focus(),!/^(INPUT|TEXTAREA)$/.test(e.activeElt.nodeName)&&e.anchorNode&&B(document.body,e.anchorNode)&&B(document.body,e.focusNode))){var t=e.activeElt.ownerDocument,n=t.defaultView.getSelection(),i=t.createRange();i.setEnd(e.anchorNode,e.anchorOffset),i.collapse(!1),n.removeAllRanges(),n.addRange(i),n.extend(e.focusNode,e.focusOffset)}}(c),E(n.cursorDiv),E(n.selectionDiv),n.gutters.style.height=n.sizer.style.minHeight=0,l&&(n.lastWrapHeight=t.wrapperHeight,n.lastWrapWidth=t.wrapperWidth,ar(e,400)),n.updateLineNumbers=null,!0}function dr(e,t){for(var n=t.viewport,i=!0;;i=!1){if(i&&e.options.lineWrapping&&t.oldDisplayWidth!=Tn(e))i&&(t.visible=Mi(e.display,e.doc,n));else if(n&&null!=n.top&&(n={top:Math.min(e.doc.height+An(e.display)-Mn(e),n.top)}),t.visible=Mi(e.display,e.doc,n),t.visible.from>=e.display.viewFrom&&t.visible.to<=e.display.viewTo)break;if(!cr(e,t))break;Li(e);var r=Wi(e);yi(e),Ui(e,r),pr(e,r),t.force=!1}t.signal(e,"update",e),e.display.viewFrom==e.display.reportedViewFrom&&e.display.viewTo==e.display.reportedViewTo||(t.signal(e,"viewportChange",e,e.display.viewFrom,e.display.viewTo),e.display.reportedViewFrom=e.display.viewFrom,e.display.reportedViewTo=e.display.viewTo)}function hr(e,t){var n=new sr(e,t);if(cr(e,n)){Li(e),dr(e,n);var i=Wi(e);yi(e),Ui(e,i),pr(e,i),n.finish()}}function fr(e){var t=e.gutters.offsetWidth;e.sizer.style.marginLeft=t+"px",dn(e,"gutterChanged",e)}function pr(e,t){e.display.sizer.style.minHeight=t.docHeight+"px",e.display.heightForcer.style.top=t.docHeight+"px",e.display.gutters.style.height=t.docHeight+e.display.barHeight+Ln(e)+"px"}function mr(e){var t=e.display,n=t.view;if(t.alignWidgets||t.gutters.firstChild&&e.options.fixedGutter){for(var i=ui(t)-t.scroller.scrollLeft+e.doc.scrollLeft,r=t.gutters.offsetWidth,o=i+"px",a=0;a=105&&(o.wrapper.style.clipPath="inset(0px)"),o.wrapper.setAttribute("translate","no"),a&&l<8&&(o.gutters.style.zIndex=-1,o.scroller.style.paddingRight=0),s||n&&x||(o.scroller.draggable=!0),e&&(e.appendChild?e.appendChild(o.wrapper):e(o.wrapper)),o.viewFrom=o.viewTo=t.first,o.reportedViewFrom=o.reportedViewTo=t.first,o.view=[],o.renderedView=null,o.externalMeasured=null,o.viewOffset=0,o.lastWrapHeight=o.lastWrapWidth=0,o.updateLineNumbers=null,o.nativeBarWidth=o.barHeight=o.barWidth=0,o.scrollbarsClipped=!1,o.lineNumWidth=o.lineNumInnerWidth=o.lineNumChars=null,o.alignWidgets=!1,o.cachedCharWidth=o.cachedTextHeight=o.cachedPaddingH=null,o.maxLine=null,o.maxLineLength=0,o.maxLineChanged=!1,o.wheelDX=o.wheelDY=o.wheelStartX=o.wheelStartY=null,o.shift=!1,o.selForContextMenu=null,o.activeTouch=null,o.gutterSpecs=vr(r.gutters,r.lineNumbers),xr(o),i.init(o)}sr.prototype.signal=function(e,t){be(e,t)&&this.events.push(arguments)},sr.prototype.finish=function(){for(var e=0;eu.clientWidth,p=u.scrollHeight>u.clientHeight;if(r&&f||o&&p){if(o&&y&&s)e:for(var m=t.target,g=l.view;m!=u;m=m.parentNode)for(var v=0;v=0&&rt(e,i.to())<=0)return n}return-1};var Ar=function(e,t){this.anchor=e,this.head=t};function Er(e,t,n){var i=e&&e.options.selectionsMayTouch,r=t[n];t.sort((function(e,t){return rt(e.from(),t.from())})),n=q(t,r);for(var o=1;o0:s>=0){var u=st(l.from(),a.from()),c=lt(l.to(),a.to()),d=l.empty()?a.from()==a.head:l.from()==l.head;o<=n&&--n,t.splice(--o,2,new Ar(d?c:u,d?u:c))}}return new Fr(t,n)}function Lr(e,t){return new Fr([new Ar(e,t||e)],0)}function Tr(e){return e.text?it(e.from.line+e.text.length-1,Y(e.text).length+(1==e.text.length?e.from.ch:0)):e.to}function Mr(e,t){if(rt(e,t.from)<0)return e;if(rt(e,t.to)<=0)return Tr(t);var n=e.line+t.text.length-(t.to.line-t.from.line)-1,i=e.ch;return e.line==t.to.line&&(i+=Tr(t).ch-t.to.ch),it(n,i)}function Br(e,t){for(var n=[],i=0;i1&&e.remove(l.line+1,p-1),e.insert(l.line+1,v)}dn(e,"change",e,t)}function Rr(e,t,n){!function e(i,r,o){if(i.linked)for(var a=0;al-(e.cm?e.cm.options.historyEventDelay:500)||"*"==t.origin.charAt(0)))&&(o=function(e,t){return t?(qr(e.done),Y(e.done)):e.done.length&&!Y(e.done).ranges?Y(e.done):e.done.length>1&&!e.done[e.done.length-2].ranges?(e.done.pop(),Y(e.done)):void 0}(r,r.lastOp==i)))a=Y(o.changes),0==rt(t.from,t.to)&&0==rt(t.from,a.to)?a.to=Tr(t):o.changes.push(jr(e,t));else{var s=Y(r.done);for(s&&s.ranges||Gr(e.sel,r.done),o={changes:[jr(e,t)],generation:r.generation},r.done.push(o);r.done.length>r.undoDepth;)r.done.shift(),r.done[0].ranges||r.done.shift()}r.done.push(n),r.generation=++r.maxGeneration,r.lastModTime=r.lastSelTime=l,r.lastOp=r.lastSelOp=i,r.lastOrigin=r.lastSelOrigin=t.origin,a||ve(e,"historyAdded")}function $r(e,t,n,i){var r=e.history,o=i&&i.origin;n==r.lastSelOp||o&&r.lastSelOrigin==o&&(r.lastModTime==r.lastSelTime&&r.lastOrigin==o||function(e,t,n,i){var r=t.charAt(0);return"*"==r||"+"==r&&n.ranges.length==i.ranges.length&&n.somethingSelected()==i.somethingSelected()&&new Date-e.history.lastSelTime<=(e.cm?e.cm.options.historyEventDelay:500)}(e,o,Y(r.done),t))?r.done[r.done.length-1]=t:Gr(t,r.done),r.lastSelTime=+new Date,r.lastSelOrigin=o,r.lastSelOp=n,i&&!1!==i.clearRedo&&qr(r.undone)}function Gr(e,t){var n=Y(t);n&&n.ranges&&n.equals(e)||t.push(e)}function Vr(e,t,n,i){var r=t["spans_"+e.id],o=0;e.iter(Math.max(e.first,n),Math.min(e.first+e.size,i),(function(n){n.markedSpans&&((r||(r=t["spans_"+e.id]={}))[o]=n.markedSpans),++o}))}function Xr(e){if(!e)return null;for(var t,n=0;n-1&&(Y(l)[d]=u[d],delete u[d])}}}return i}function Yr(e,t,n,i){if(i){var r=e.anchor;if(n){var o=rt(t,r)<0;o!=rt(n,r)<0?(r=t,t=n):o!=rt(t,n)<0&&(t=n)}return new Ar(r,t)}return new Ar(n||t,t)}function Qr(e,t,n,i,r){null==r&&(r=e.cm&&(e.cm.display.shift||e.extend)),io(e,new Fr([Yr(e.sel.primary(),t,n,r)],0),i)}function Jr(e,t,n){for(var i=[],r=e.cm&&(e.cm.display.shift||e.extend),o=0;o=t.ch:l.to>t.ch))){if(r&&(ve(s,"beforeCursorEnter"),s.explicitlyCleared)){if(o.markedSpans){--a;continue}break}if(!s.atomic)continue;if(n){var d=s.find(i<0?1:-1),h=void 0;if((i<0?c:u)&&(d=co(e,d,-i,d&&d.line==t.line?o:null)),d&&d.line==t.line&&(h=rt(d,n))&&(i<0?h<0:h>0))return so(e,d,t,i,r)}var f=s.find(i<0?-1:1);return(i<0?u:c)&&(f=co(e,f,i,f.line==t.line?o:null)),f?so(e,f,t,i,r):null}}return t}function uo(e,t,n,i,r){var o=i||1,a=so(e,t,n,o,r)||!r&&so(e,t,n,o,!0)||so(e,t,n,-o,r)||!r&&so(e,t,n,-o,!0);return a||(e.cantEdit=!0,it(e.first,0))}function co(e,t,n,i){return n<0&&0==t.ch?t.line>e.first?ct(e,it(t.line-1)):null:n>0&&t.ch==(i||Ke(e,t.line)).text.length?t.line0)){var c=[s,1],d=rt(u.from,l.from),h=rt(u.to,l.to);(d<0||!a.inclusiveLeft&&!d)&&c.push({from:u.from,to:l.from}),(h>0||!a.inclusiveRight&&!h)&&c.push({from:l.to,to:u.to}),r.splice.apply(r,c),s+=c.length-3}}return r}(e,t.from,t.to);if(i)for(var r=i.length-1;r>=0;--r)mo(e,{from:i[r].from,to:i[r].to,text:r?[""]:t.text,origin:t.origin});else mo(e,t)}}function mo(e,t){if(1!=t.text.length||""!=t.text[0]||0!=rt(t.from,t.to)){var n=Br(e,t);Ur(e,t,n,e.cm?e.cm.curOp.id:NaN),xo(e,t,n,Lt(e,t));var i=[];Rr(e,(function(e,n){n||-1!=q(i,e.history)||(Co(e.history,t),i.push(e.history)),xo(e,t,null,Lt(e,t))}))}}function go(e,t,n){var i=e.cm&&e.cm.state.suppressEdits;if(!i||n){for(var r,o=e.history,a=e.sel,l="undo"==t?o.done:o.undone,s="undo"==t?o.undone:o.done,u=0;u=0;--f){var p=h(f);if(p)return p.v}}}}function vo(e,t){if(0!=t&&(e.first+=t,e.sel=new Fr(Q(e.sel.ranges,(function(e){return new Ar(it(e.anchor.line+t,e.anchor.ch),it(e.head.line+t,e.head.ch))})),e.sel.primIndex),e.cm)){pi(e.cm,e.first,e.first-t,t);for(var n=e.cm.display,i=n.viewFrom;ie.lastLine())){if(t.from.lineo&&(t={from:t.from,to:it(o,Ke(e,o).text.length),text:[t.text[0]],origin:t.origin}),t.removed=Ze(e,t.from,t.to),n||(n=Br(e,t)),e.cm?function(e,t,n){var i=e.doc,r=e.display,o=t.from,a=t.to,l=!1,s=o.line;e.options.lineWrapping||(s=Je(Wt(Ke(i,o.line))),i.iter(s,a.line+1,(function(e){if(e==r.maxLine)return l=!0,!0})));i.sel.contains(t.from,t.to)>-1&&ye(e);Hr(i,t,n,ci(e)),e.options.lineWrapping||(i.iter(s,o.line+t.text.length,(function(e){var t=Vt(e);t>r.maxLineLength&&(r.maxLine=e,r.maxLineLength=t,r.maxLineChanged=!0,l=!1)})),l&&(e.curOp.updateMaxLine=!0));(function(e,t){if(e.modeFrontier=Math.min(e.modeFrontier,t),!(e.highlightFrontiern;i--){var r=Ke(e,i).stateAfter;if(r&&(!(r instanceof ht)||i+r.lookAhead1||!(this.children[0]instanceof ko))){var l=[];this.collapse(l),this.children=[new ko(l)],this.children[0].parent=this}},collapse:function(e){for(var t=0;t50){for(var a=r.lines.length%25+25,l=a;l10);e.parent.maybeSpill()}},iterN:function(e,t,n){for(var i=0;i0||0==a&&!1!==o.clearWhenEmpty)return o;if(o.replacedWith&&(o.collapsed=!0,o.widgetNode=M("span",[o.replacedWith],"CodeMirror-widget"),i.handleMouseEvents||o.widgetNode.setAttribute("cm-ignore-events","true"),i.insertLeft&&(o.widgetNode.insertLeft=!0)),o.collapsed){if(_t(e,t.line,t,n,o)||t.line!=n.line&&_t(e,n.line,t,n,o))throw new Error("Inserting collapsed marker partially overlapping an existing one");St=!0}o.addToHistory&&Ur(e,{from:t,to:n,origin:"markText"},e.sel,NaN);var l,s=t.line,u=e.cm;if(e.iter(s,n.line+1,(function(i){u&&o.collapsed&&!u.options.lineWrapping&&Wt(i)==u.display.maxLine&&(l=!0),o.collapsed&&s!=t.line&&Qe(i,0),function(e,t,n){var i=n&&window.WeakSet&&(n.markedSpans||(n.markedSpans=new WeakSet));i&&e.markedSpans&&i.has(e.markedSpans)?e.markedSpans.push(t):(e.markedSpans=e.markedSpans?e.markedSpans.concat([t]):[t],i&&i.add(e.markedSpans)),t.marker.attachLine(e)}(i,new Ft(o,s==t.line?t.ch:null,s==n.line?n.ch:null),e.cm&&e.cm.curOp),++s})),o.collapsed&&e.iter(t.line,n.line+1,(function(t){Ut(e,t)&&Qe(t,0)})),o.clearOnEnter&&pe(o,"beforeCursorEnter",(function(){return o.clear()})),o.readOnly&&(kt=!0,(e.history.done.length||e.history.undone.length)&&e.clearHistory()),o.collapsed&&(o.id=++Eo,o.atomic=!0),u){if(l&&(u.curOp.updateMaxLine=!0),o.collapsed)pi(u,t.line,n.line+1);else if(o.className||o.startStyle||o.endStyle||o.css||o.attributes||o.title)for(var c=t.line;c<=n.line;c++)mi(u,c,"text");o.atomic&&ao(u.doc),dn(u,"markerAdded",u,o)}return o}Lo.prototype.clear=function(){if(!this.explicitlyCleared){var e=this.doc.cm,t=e&&!e.curOp;if(t&&Ki(e),be(this,"clear")){var n=this.find();n&&dn(this,"clear",n.from,n.to)}for(var i=null,r=null,o=0;oe.display.maxLineLength&&(e.display.maxLine=u,e.display.maxLineLength=c,e.display.maxLineChanged=!0)}null!=i&&e&&this.collapsed&&pi(e,i,r+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,e&&ao(e.doc)),e&&dn(e,"markerCleared",e,this,i,r),t&&Zi(e),this.parent&&this.parent.clear()}},Lo.prototype.find=function(e,t){var n,i;null==e&&"bookmark"==this.type&&(e=1);for(var r=0;r=0;s--)po(this,i[s]);l?no(this,l):this.cm&&Oi(this.cm)})),undo:or((function(){go(this,"undo")})),redo:or((function(){go(this,"redo")})),undoSelection:or((function(){go(this,"undo",!0)})),redoSelection:or((function(){go(this,"redo",!0)})),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){for(var e=this.history,t=0,n=0,i=0;i=e.ch)&&t.push(r.marker.parent||r.marker)}return t},findMarks:function(e,t,n){e=ct(this,e),t=ct(this,t);var i=[],r=e.line;return this.iter(e.line,t.line+1,(function(o){var a=o.markedSpans;if(a)for(var l=0;l=s.to||null==s.from&&r!=e.line||null!=s.from&&r==t.line&&s.from>=t.ch||n&&!n(s.marker)||i.push(s.marker.parent||s.marker)}++r})),i},getAllMarks:function(){var e=[];return this.iter((function(t){var n=t.markedSpans;if(n)for(var i=0;ie)return t=e,!0;e-=o,++n})),ct(this,it(n,t))},indexFromPos:function(e){var t=(e=ct(this,e)).ch;if(e.linet&&(t=e.from),null!=e.to&&e.to-1)return t.state.draggingText(e),void setTimeout((function(){return t.display.input.focus()}),20);try{var d=e.dataTransfer.getData("Text");if(d){var h;if(t.state.draggingText&&!t.state.draggingText.copy&&(h=t.listSelections()),ro(t.doc,Lr(n,n)),h)for(var f=0;f=0;t--)yo(e.doc,"",i[t].from,i[t].to,"+delete");Oi(e)}))}function na(e,t,n){var i=le(e.text,t+n,n);return i<0||i>e.text.length?null:i}function ia(e,t,n){var i=na(e,t.ch,n);return null==i?null:new it(t.line,i,n<0?"after":"before")}function ra(e,t,n,i,r){if(e){"rtl"==t.doc.direction&&(r=-r);var o=he(n,t.doc.direction);if(o){var a,l=r<0?Y(o):o[0],s=r<0==(1==l.level)?"after":"before";if(l.level>0||"rtl"==t.doc.direction){var u=In(t,n);a=r<0?n.text.length-1:0;var c=zn(t,u,a).top;a=se((function(e){return zn(t,u,e).top==c}),r<0==(1==l.level)?l.from:l.to-1,a),"before"==s&&(a=na(n,a,1))}else a=r<0?l.to:l.from;return new it(i,a,s)}}return new it(i,r<0?n.text.length:0,r<0?"before":"after")}Vo.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},Vo.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},Vo.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars","Ctrl-O":"openLine"},Vo.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]},Vo.default=y?Vo.macDefault:Vo.pcDefault;var oa={selectAll:ho,singleSelection:function(e){return e.setSelection(e.getCursor("anchor"),e.getCursor("head"),$)},killLine:function(e){return ta(e,(function(t){if(t.empty()){var n=Ke(e.doc,t.head.line).text.length;return t.head.ch==n&&t.head.line0)r=new it(r.line,r.ch+1),e.replaceRange(o.charAt(r.ch-1)+o.charAt(r.ch-2),it(r.line,r.ch-2),r,"+transpose");else if(r.line>e.doc.first){var a=Ke(e.doc,r.line-1).text;a&&(r=new it(r.line,1),e.replaceRange(o.charAt(0)+e.doc.lineSeparator()+a.charAt(a.length-1),it(r.line-1,a.length-1),r,"+transpose"))}n.push(new Ar(r,r))}e.setSelections(n)}))},newlineAndIndent:function(e){return nr(e,(function(){for(var t=e.listSelections(),n=t.length-1;n>=0;n--)e.replaceRange(e.doc.lineSeparator(),t[n].anchor,t[n].head,"+input");t=e.listSelections();for(var i=0;i-1&&(rt((r=u.ranges[r]).from(),t)<0||t.xRel>0)&&(rt(r.to(),t)>0||t.xRel<0)?function(e,t,n,i){var r=e.display,o=!1,u=ir(e,(function(t){s&&(r.scroller.draggable=!1),e.state.draggingText=!1,e.state.delayingBlurEvent&&(e.hasFocus()?e.state.delayingBlurEvent=!1:Fi(e)),ge(r.wrapper.ownerDocument,"mouseup",u),ge(r.wrapper.ownerDocument,"mousemove",c),ge(r.scroller,"dragstart",d),ge(r.scroller,"drop",u),o||(Ce(t),i.addNew||Qr(e.doc,n,null,null,i.extend),s&&!f||a&&9==l?setTimeout((function(){r.wrapper.ownerDocument.body.focus({preventScroll:!0}),r.input.focus()}),20):r.input.focus())})),c=function(e){o=o||Math.abs(t.clientX-e.clientX)+Math.abs(t.clientY-e.clientY)>=10},d=function(){return o=!0};s&&(r.scroller.draggable=!0);e.state.draggingText=u,u.copy=!i.moveOnDrag,pe(r.wrapper.ownerDocument,"mouseup",u),pe(r.wrapper.ownerDocument,"mousemove",c),pe(r.scroller,"dragstart",d),pe(r.scroller,"drop",u),e.state.delayingBlurEvent=!0,setTimeout((function(){return r.input.focus()}),20),r.scroller.dragDrop&&r.scroller.dragDrop()}(e,i,t,o):function(e,t,n,i){a&&Fi(e);var r=e.display,o=e.doc;Ce(t);var l,s,u=o.sel,c=u.ranges;i.addNew&&!i.extend?(s=o.sel.contains(n),l=s>-1?c[s]:new Ar(n,n)):(l=o.sel.primary(),s=o.sel.primIndex);if("rectangle"==i.unit)i.addNew||(l=new Ar(n,n)),n=hi(e,t,!0,!0),s=-1;else{var d=Da(e,n,i.unit);l=i.extend?Yr(l,d.anchor,d.head,i.extend):d}i.addNew?-1==s?(s=c.length,io(o,Er(e,c.concat([l]),s),{scroll:!1,origin:"*mouse"})):c.length>1&&c[s].empty()&&"char"==i.unit&&!i.extend?(io(o,Er(e,c.slice(0,s).concat(c.slice(s+1)),0),{scroll:!1,origin:"*mouse"}),u=o.sel):eo(o,s,l,G):(s=0,io(o,new Fr([l],0),G),u=o.sel);var h=n;function f(t){if(0!=rt(h,t))if(h=t,"rectangle"==i.unit){for(var r=[],a=e.options.tabSize,c=W(Ke(o,n.line).text,n.ch,a),d=W(Ke(o,t.line).text,t.ch,a),f=Math.min(c,d),p=Math.max(c,d),m=Math.min(n.line,t.line),g=Math.min(e.lastLine(),Math.max(n.line,t.line));m<=g;m++){var v=Ke(o,m).text,x=X(v,f,a);f==p?r.push(new Ar(it(m,x),it(m,x))):v.length>x&&r.push(new Ar(it(m,x),it(m,X(v,p,a))))}r.length||r.push(new Ar(n,n)),io(o,Er(e,u.ranges.slice(0,s).concat(r),s),{origin:"*mouse",scroll:!1}),e.scrollIntoView(t)}else{var y,b=l,D=Da(e,t,i.unit),C=b.anchor;rt(D.anchor,C)>0?(y=D.head,C=st(b.from(),D.anchor)):(y=D.anchor,C=lt(b.to(),D.head));var w=u.ranges.slice(0);w[s]=function(e,t){var n=t.anchor,i=t.head,r=Ke(e.doc,n.line);if(0==rt(n,i)&&n.sticky==i.sticky)return t;var o=he(r);if(!o)return t;var a=ce(o,n.ch,n.sticky),l=o[a];if(l.from!=n.ch&&l.to!=n.ch)return t;var s,u=a+(l.from==n.ch==(1!=l.level)?0:1);if(0==u||u==o.length)return t;if(i.line!=n.line)s=(i.line-n.line)*("ltr"==e.doc.direction?1:-1)>0;else{var c=ce(o,i.ch,i.sticky),d=c-a||(i.ch-n.ch)*(1==l.level?-1:1);s=c==u-1||c==u?d<0:d>0}var h=o[u+(s?-1:0)],f=s==(1==h.level),p=f?h.from:h.to,m=f?"after":"before";return n.ch==p&&n.sticky==m?t:new Ar(new it(n.line,p,m),i)}(e,new Ar(ct(o,C),y)),io(o,Er(e,w,s),G)}}var p=r.wrapper.getBoundingClientRect(),m=0;function g(t){var n=++m,a=hi(e,t,!0,"rectangle"==i.unit);if(a)if(0!=rt(a,h)){e.curOp.focus=N(H(e)),f(a);var l=Mi(r,o);(a.line>=l.to||a.linep.bottom?20:0;s&&setTimeout(ir(e,(function(){m==n&&(r.scroller.scrollTop+=s,g(t))})),50)}}function v(t){e.state.selectingText=!1,m=1/0,t&&(Ce(t),r.input.focus()),ge(r.wrapper.ownerDocument,"mousemove",x),ge(r.wrapper.ownerDocument,"mouseup",y),o.history.lastSelOrigin=null}var x=ir(e,(function(e){0!==e.buttons&&Ae(e)?g(e):v(e)})),y=ir(e,v);e.state.selectingText=y,pe(r.wrapper.ownerDocument,"mousemove",x),pe(r.wrapper.ownerDocument,"mouseup",y)}(e,i,t,o)}(t,i,o,e):Fe(e)==n.scroller&&Ce(e):2==r?(i&&Qr(t.doc,i),setTimeout((function(){return n.input.focus()}),20)):3==r&&(k?t.display.input.onContextMenu(e):Fi(t)))}}function Da(e,t,n){if("char"==n)return new Ar(t,t);if("word"==n)return e.findWordAt(t);if("line"==n)return new Ar(it(t.line,0),ct(e.doc,it(t.line+1,0)));var i=n(e,t);return new Ar(i.from,i.to)}function Ca(e,t,n,i){var r,o;if(t.touches)r=t.touches[0].clientX,o=t.touches[0].clientY;else try{r=t.clientX,o=t.clientY}catch(e){return!1}if(r>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;i&&Ce(t);var a=e.display,l=a.lineDiv.getBoundingClientRect();if(o>l.bottom||!be(e,n))return ke(t);o-=l.top-a.viewOffset;for(var s=0;s=r)return ve(e,n,e,et(e.doc,o),e.display.gutterSpecs[s].className,t),ke(t)}}function wa(e,t){return Ca(e,t,"gutterClick",!0)}function ka(e,t){Sn(e.display,t)||function(e,t){if(!be(e,"gutterContextMenu"))return!1;return Ca(e,t,"gutterContextMenu",!1)}(e,t)||xe(e,t,"contextmenu")||k||e.display.input.onContextMenu(t)}function Sa(e){e.display.wrapper.className=e.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+e.options.theme.replace(/(^|\s)\s*/g," cm-s-"),qn(e)}ya.prototype.compare=function(e,t,n){return this.time+400>e&&0==rt(t,this.pos)&&n==this.button};var Fa={toString:function(){return"CodeMirror.Init"}},Aa={},Ea={};function La(e,t,n){if(!t!=!(n&&n!=Fa)){var i=e.display.dragFunctions,r=t?pe:ge;r(e.display.scroller,"dragstart",i.start),r(e.display.scroller,"dragenter",i.enter),r(e.display.scroller,"dragover",i.over),r(e.display.scroller,"dragleave",i.leave),r(e.display.scroller,"drop",i.drop)}}function Ta(e){e.options.lineWrapping?(O(e.display.wrapper,"CodeMirror-wrap"),e.display.sizer.style.minWidth="",e.display.sizerWidth=null):(A(e.display.wrapper,"CodeMirror-wrap"),Xt(e)),di(e),pi(e),qn(e),setTimeout((function(){return Ui(e)}),100)}function Ma(e,t){var n=this;if(!(this instanceof Ma))return new Ma(e,t);this.options=t=t?_(t):{},_(Aa,t,!1);var i=t.value;"string"==typeof i?i=new Io(i,t.mode,null,t.lineSeparator,t.direction):t.mode&&(i.modeOption=t.mode),this.doc=i;var r=new Ma.inputStyles[t.inputStyle](this),o=this.display=new br(e,i,r,t);for(var u in o.wrapper.CodeMirror=this,Sa(this),t.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),Vi(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:-1,cutIncoming:-1,selectingText:!1,draggingText:!1,highlight:new j,keySeq:null,specialChars:null},t.autofocus&&!x&&o.input.focus(),a&&l<11&&setTimeout((function(){return n.display.input.reset(!0)}),20),function(e){var t=e.display;pe(t.scroller,"mousedown",ir(e,ba)),pe(t.scroller,"dblclick",a&&l<11?ir(e,(function(t){if(!xe(e,t)){var n=hi(e,t);if(n&&!wa(e,t)&&!Sn(e.display,t)){Ce(t);var i=e.findWordAt(n);Qr(e.doc,i.anchor,i.head)}}})):function(t){return xe(e,t)||Ce(t)});pe(t.scroller,"contextmenu",(function(t){return ka(e,t)})),pe(t.input.getField(),"contextmenu",(function(n){t.scroller.contains(n.target)||ka(e,n)}));var n,i={end:0};function r(){t.activeTouch&&(n=setTimeout((function(){return t.activeTouch=null}),1e3),(i=t.activeTouch).end=+new Date)}function o(e){if(1!=e.touches.length)return!1;var t=e.touches[0];return t.radiusX<=1&&t.radiusY<=1}function s(e,t){if(null==t.left)return!0;var n=t.left-e.left,i=t.top-e.top;return n*n+i*i>400}pe(t.scroller,"touchstart",(function(r){if(!xe(e,r)&&!o(r)&&!wa(e,r)){t.input.ensurePolled(),clearTimeout(n);var a=+new Date;t.activeTouch={start:a,moved:!1,prev:a-i.end<=300?i:null},1==r.touches.length&&(t.activeTouch.left=r.touches[0].pageX,t.activeTouch.top=r.touches[0].pageY)}})),pe(t.scroller,"touchmove",(function(){t.activeTouch&&(t.activeTouch.moved=!0)})),pe(t.scroller,"touchend",(function(n){var i=t.activeTouch;if(i&&!Sn(t,n)&&null!=i.left&&!i.moved&&new Date-i.start<300){var o,a=e.coordsChar(t.activeTouch,"page");o=!i.prev||s(i,i.prev)?new Ar(a,a):!i.prev.prev||s(i,i.prev.prev)?e.findWordAt(a):new Ar(it(a.line,0),ct(e.doc,it(a.line+1,0))),e.setSelection(o.anchor,o.head),e.focus(),Ce(n)}r()})),pe(t.scroller,"touchcancel",r),pe(t.scroller,"scroll",(function(){t.scroller.clientHeight&&(Ri(e,t.scroller.scrollTop),_i(e,t.scroller.scrollLeft,!0),ve(e,"scroll",e))})),pe(t.scroller,"mousewheel",(function(t){return Sr(e,t)})),pe(t.scroller,"DOMMouseScroll",(function(t){return Sr(e,t)})),pe(t.wrapper,"scroll",(function(){return t.wrapper.scrollTop=t.wrapper.scrollLeft=0})),t.dragFunctions={enter:function(t){xe(e,t)||Se(t)},over:function(t){xe(e,t)||(!function(e,t){var n=hi(e,t);if(n){var i=document.createDocumentFragment();Di(e,n,i),e.display.dragCursor||(e.display.dragCursor=T("div",null,"CodeMirror-cursors CodeMirror-dragcursors"),e.display.lineSpace.insertBefore(e.display.dragCursor,e.display.cursorDiv)),L(e.display.dragCursor,i)}}(e,t),Se(t))},start:function(t){return function(e,t){if(a&&(!e.state.draggingText||+new Date-zo<100))Se(t);else if(!xe(e,t)&&!Sn(e.display,t)&&(t.dataTransfer.setData("Text",e.getSelection()),t.dataTransfer.effectAllowed="copyMove",t.dataTransfer.setDragImage&&!f)){var n=T("img",null,null,"position: fixed; left: 0; top: 0;");n.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",h&&(n.width=n.height=1,e.display.wrapper.appendChild(n),n._top=n.offsetTop),t.dataTransfer.setDragImage(n,0,0),h&&n.parentNode.removeChild(n)}}(e,t)},drop:ir(e,Ho),leave:function(t){xe(e,t)||Ro(e)}};var u=t.input.getField();pe(u,"keyup",(function(t){return ma.call(e,t)})),pe(u,"keydown",ir(e,pa)),pe(u,"keypress",ir(e,ga)),pe(u,"focus",(function(t){return Ai(e,t)})),pe(u,"blur",(function(t){return Ei(e,t)}))}(this),Wo(),Ki(this),this.curOp.forceUpdate=!0,Pr(this,i),t.autofocus&&!x||this.hasFocus()?setTimeout((function(){n.hasFocus()&&!n.state.focused&&Ai(n)}),20):Ei(this),Ea)Ea.hasOwnProperty(u)&&Ea[u](this,t[u],Fa);gr(this),t.finishInit&&t.finishInit(this);for(var c=0;c150)){if(!i)return;n="prev"}}else u=0,n="not";"prev"==n?u=t>o.first?W(Ke(o,t-1).text,null,a):0:"add"==n?u=s+e.options.indentUnit:"subtract"==n?u=s-e.options.indentUnit:"number"==typeof n&&(u=s+n),u=Math.max(0,u);var d="",h=0;if(e.options.indentWithTabs)for(var f=Math.floor(u/a);f;--f)h+=a,d+="\t";if(ha,s=Oe(t),u=null;if(l&&i.ranges.length>1)if(Oa&&Oa.text.join("\n")==t){if(i.ranges.length%Oa.text.length==0){u=[];for(var c=0;c=0;h--){var f=i.ranges[h],p=f.from(),m=f.to();f.empty()&&(n&&n>0?p=it(p.line,p.ch-n):e.state.overwrite&&!l?m=it(m.line,Math.min(Ke(o,m.line).text.length,m.ch+Y(s).length)):l&&Oa&&Oa.lineWise&&Oa.text.join("\n")==s.join("\n")&&(p=m=it(p.line,0)));var g={from:p,to:m,text:u?u[h%u.length]:s,origin:r||(l?"paste":e.state.cutIncoming>a?"cut":"+input")};po(e.doc,g),dn(e,"inputRead",e,g)}t&&!l&&Ra(e,t),Oi(e),e.curOp.updateInput<2&&(e.curOp.updateInput=d),e.curOp.typing=!0,e.state.pasteIncoming=e.state.cutIncoming=-1}function Ha(e,t){var n=e.clipboardData&&e.clipboardData.getData("Text");if(n)return e.preventDefault(),t.isReadOnly()||t.options.disableInput||!t.hasFocus()||nr(t,(function(){return za(t,n,0,null,"paste")})),!0}function Ra(e,t){if(e.options.electricChars&&e.options.smartIndent)for(var n=e.doc.sel,i=n.ranges.length-1;i>=0;i--){var r=n.ranges[i];if(!(r.head.ch>100||i&&n.ranges[i-1].head.line==r.head.line)){var o=e.getModeAt(r.head),a=!1;if(o.electricChars){for(var l=0;l-1){a=Na(e,r.head.line,"smart");break}}else o.electricInput&&o.electricInput.test(Ke(e.doc,r.head.line).text.slice(0,r.head.ch))&&(a=Na(e,r.head.line,"smart"));a&&dn(e,"electricInput",e,r.head.line)}}}function Pa(e){for(var t=[],n=[],i=0;i0?0:-1));if(isNaN(c))a=null;else{var d=n>0?c>=55296&&c<56320:c>=56320&&c<57343;a=new it(t.line,Math.max(0,Math.min(l.text.length,t.ch+n*(d?2:1))),-n)}}else a=r?function(e,t,n,i){var r=he(t,e.doc.direction);if(!r)return ia(t,n,i);n.ch>=t.text.length?(n.ch=t.text.length,n.sticky="before"):n.ch<=0&&(n.ch=0,n.sticky="after");var o=ce(r,n.ch,n.sticky),a=r[o];if("ltr"==e.doc.direction&&a.level%2==0&&(i>0?a.to>n.ch:a.from=a.from&&h>=c.begin)){var f=d?"before":"after";return new it(n.line,h,f)}}var p=function(e,t,i){for(var o=function(e,t){return t?new it(n.line,s(e,1),"before"):new it(n.line,e,"after")};e>=0&&e0==(1!=a.level),u=l?i.begin:s(i.end,-1);if(a.from<=u&&u0?c.end:s(c.begin,-1);return null==g||i>0&&g==t.text.length||!(m=p(i>0?0:r.length-1,i,u(g)))?null:m}(e.cm,l,t,n):ia(l,t,n);if(null==a){if(o||(u=t.line+s)=e.first+e.size||(t=new it(u,t.ch,t.sticky),!(l=Ke(e,u))))return!1;t=ra(r,e.cm,l,t.line,s)}else t=a;return!0}if("char"==i||"codepoint"==i)u();else if("column"==i)u(!0);else if("word"==i||"group"==i)for(var c=null,d="group"==i,h=e.cm&&e.cm.getHelper(t,"wordChars"),f=!0;!(n<0)||u(!f);f=!1){var p=l.text.charAt(t.ch)||"\n",m=ie(p,h)?"w":d&&"\n"==p?"n":!d||/\s/.test(p)?null:"p";if(!d||f||m||(m="s"),c&&c!=m){n<0&&(n=1,u(),t.sticky="after");break}if(m&&(c=m),n>0&&!u(!f))break}var g=uo(e,t,o,a,!0);return ot(o,g)&&(g.hitSide=!0),g}function qa(e,t,n,i){var r,o,a=e.doc,l=t.left;if("page"==i){var s=Math.min(e.display.wrapper.clientHeight,R(e).innerHeight||a(e).documentElement.clientHeight),u=Math.max(s-.5*ai(e.display),3);r=(n>0?t.bottom:t.top)+n*u}else"line"==i&&(r=n>0?t.bottom+3:t.top-3);for(;(o=Jn(e,l,r)).outside;){if(n<0?r<=0:r>=a.height){o.hitSide=!0;break}r+=5*n}return o}var Ua=function(e){this.cm=e,this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null,this.polling=new j,this.composing=null,this.gracePeriod=!1,this.readDOMTimeout=null};function $a(e,t){var n=On(e,t.line);if(!n||n.hidden)return null;var i=Ke(e.doc,t.line),r=Bn(n,i,t.line),o=he(i,e.doc.direction),a="left";o&&(a=ce(o,t.ch)%2?"right":"left");var l=Pn(r.map,t.ch,a);return l.offset="right"==l.collapse?l.end:l.start,l}function Ga(e,t){return t&&(e.bad=!0),e}function Va(e,t,n){var i;if(t==e.display.lineDiv){if(!(i=e.display.lineDiv.childNodes[n]))return Ga(e.clipPos(it(e.display.viewTo-1)),!0);t=null,n=0}else for(i=t;;i=i.parentNode){if(!i||i==e.display.lineDiv)return null;if(i.parentNode&&i.parentNode==e.display.lineDiv)break}for(var r=0;r=t.display.viewTo||o.line=t.display.viewFrom&&$a(t,r)||{node:s[0].measure.map[2],offset:0},c=o.linei.firstLine()&&(a=it(a.line-1,Ke(i.doc,a.line-1).length)),l.ch==Ke(i.doc,l.line).text.length&&l.liner.viewTo-1)return!1;a.line==r.viewFrom||0==(e=fi(i,a.line))?(t=Je(r.view[0].line),n=r.view[0].node):(t=Je(r.view[e].line),n=r.view[e-1].node.nextSibling);var s,u,c=fi(i,l.line);if(c==r.view.length-1?(s=r.viewTo-1,u=r.lineDiv.lastChild):(s=Je(r.view[c+1].line)-1,u=r.view[c+1].node.previousSibling),!n)return!1;for(var d=i.doc.splitLines(function(e,t,n,i,r){var o="",a=!1,l=e.doc.lineSeparator(),s=!1;function u(e){return function(t){return t.id==e}}function c(){a&&(o+=l,s&&(o+=l),a=s=!1)}function d(e){e&&(c(),o+=e)}function h(t){if(1==t.nodeType){var n=t.getAttribute("cm-text");if(n)return void d(n);var o,f=t.getAttribute("cm-marker");if(f){var p=e.findMarks(it(i,0),it(r+1,0),u(+f));return void(p.length&&(o=p[0].find(0))&&d(Ze(e.doc,o.from,o.to).join(l)))}if("false"==t.getAttribute("contenteditable"))return;var m=/^(pre|div|p|li|table|br)$/i.test(t.nodeName);if(!/^br$/i.test(t.nodeName)&&0==t.textContent.length)return;m&&c();for(var g=0;g1&&h.length>1;)if(Y(d)==Y(h))d.pop(),h.pop(),s--;else{if(d[0]!=h[0])break;d.shift(),h.shift(),t++}for(var f=0,p=0,m=d[0],g=h[0],v=Math.min(m.length,g.length);fa.ch&&x.charCodeAt(x.length-p-1)==y.charCodeAt(y.length-p-1);)f--,p++;d[d.length-1]=x.slice(0,x.length-p).replace(/^\u200b+/,""),d[0]=d[0].slice(f).replace(/\u200b+$/,"");var D=it(t,f),C=it(s,h.length?Y(h).length-p:0);return d.length>1||d[0]||rt(D,C)?(yo(i.doc,d,D,C,"+input"),!0):void 0},Ua.prototype.ensurePolled=function(){this.forceCompositionEnd()},Ua.prototype.reset=function(){this.forceCompositionEnd()},Ua.prototype.forceCompositionEnd=function(){this.composing&&(clearTimeout(this.readDOMTimeout),this.composing=null,this.updateFromDOM(),this.div.blur(),this.div.focus())},Ua.prototype.readFromDOMSoon=function(){var e=this;null==this.readDOMTimeout&&(this.readDOMTimeout=setTimeout((function(){if(e.readDOMTimeout=null,e.composing){if(!e.composing.done)return;e.composing=null}e.updateFromDOM()}),80))},Ua.prototype.updateFromDOM=function(){var e=this;!this.cm.isReadOnly()&&this.pollContent()||nr(this.cm,(function(){return pi(e.cm)}))},Ua.prototype.setUneditable=function(e){e.contentEditable="false"},Ua.prototype.onKeyPress=function(e){0==e.charCode||this.composing||(e.preventDefault(),this.cm.isReadOnly()||ir(this.cm,za)(this.cm,String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),0))},Ua.prototype.readOnlyChanged=function(e){this.div.contentEditable=String("nocursor"!=e)},Ua.prototype.onContextMenu=function(){},Ua.prototype.resetPosition=function(){},Ua.prototype.needsContentAttribute=!0;var Ka=function(e){this.cm=e,this.prevInput="",this.pollingFast=!1,this.polling=new j,this.hasSelection=!1,this.composing=null,this.resetting=!1};Ka.prototype.init=function(e){var t=this,n=this,i=this.cm;this.createField(e);var r=this.textarea;function o(e){if(!xe(i,e)){if(i.somethingSelected())Ia({lineWise:!1,text:i.getSelections()});else{if(!i.options.lineWiseCopyCut)return;var t=Pa(i);Ia({lineWise:!0,text:t.text}),"cut"==e.type?i.setSelections(t.ranges,null,$):(n.prevInput="",r.value=t.text.join("\n"),z(r))}"cut"==e.type&&(i.state.cutIncoming=+new Date)}}e.wrapper.insertBefore(this.wrapper,e.wrapper.firstChild),g&&(r.style.width="0px"),pe(r,"input",(function(){a&&l>=9&&t.hasSelection&&(t.hasSelection=null),n.poll()})),pe(r,"paste",(function(e){xe(i,e)||Ha(e,i)||(i.state.pasteIncoming=+new Date,n.fastPoll())})),pe(r,"cut",o),pe(r,"copy",o),pe(e.scroller,"paste",(function(t){if(!Sn(e,t)&&!xe(i,t)){if(!r.dispatchEvent)return i.state.pasteIncoming=+new Date,void n.focus();var o=new Event("paste");o.clipboardData=t.clipboardData,r.dispatchEvent(o)}})),pe(e.lineSpace,"selectstart",(function(t){Sn(e,t)||Ce(t)})),pe(r,"compositionstart",(function(){var e=i.getCursor("from");n.composing&&n.composing.range.clear(),n.composing={start:e,range:i.markText(e,i.getCursor("to"),{className:"CodeMirror-composing"})}})),pe(r,"compositionend",(function(){n.composing&&(n.poll(),n.composing.range.clear(),n.composing=null)}))},Ka.prototype.createField=function(e){this.wrapper=Wa(),this.textarea=this.wrapper.firstChild},Ka.prototype.screenReaderLabelChanged=function(e){e?this.textarea.setAttribute("aria-label",e):this.textarea.removeAttribute("aria-label")},Ka.prototype.prepareSelection=function(){var e=this.cm,t=e.display,n=e.doc,i=bi(e);if(e.options.moveInputWithCursor){var r=Zn(e,n.sel.primary().head,"div"),o=t.wrapper.getBoundingClientRect(),a=t.lineDiv.getBoundingClientRect();i.teTop=Math.max(0,Math.min(t.wrapper.clientHeight-10,r.top+a.top-o.top)),i.teLeft=Math.max(0,Math.min(t.wrapper.clientWidth-10,r.left+a.left-o.left))}return i},Ka.prototype.showSelection=function(e){var t=this.cm.display;L(t.cursorDiv,e.cursors),L(t.selectionDiv,e.selection),null!=e.teTop&&(this.wrapper.style.top=e.teTop+"px",this.wrapper.style.left=e.teLeft+"px")},Ka.prototype.reset=function(e){if(!(this.contextMenuPending||this.composing&&e)){var t=this.cm;if(this.resetting=!0,t.somethingSelected()){this.prevInput="";var n=t.getSelection();this.textarea.value=n,t.state.focused&&z(this.textarea),a&&l>=9&&(this.hasSelection=n)}else e||(this.prevInput=this.textarea.value="",a&&l>=9&&(this.hasSelection=null));this.resetting=!1}},Ka.prototype.getField=function(){return this.textarea},Ka.prototype.supportsTouch=function(){return!1},Ka.prototype.focus=function(){if("nocursor"!=this.cm.options.readOnly&&(!x||N(this.textarea.ownerDocument)!=this.textarea))try{this.textarea.focus()}catch(e){}},Ka.prototype.blur=function(){this.textarea.blur()},Ka.prototype.resetPosition=function(){this.wrapper.style.top=this.wrapper.style.left=0},Ka.prototype.receivedFocus=function(){this.slowPoll()},Ka.prototype.slowPoll=function(){var e=this;this.pollingFast||this.polling.set(this.cm.options.pollInterval,(function(){e.poll(),e.cm.state.focused&&e.slowPoll()}))},Ka.prototype.fastPoll=function(){var e=!1,t=this;t.pollingFast=!0,t.polling.set(20,(function n(){t.poll()||e?(t.pollingFast=!1,t.slowPoll()):(e=!0,t.polling.set(60,n))}))},Ka.prototype.poll=function(){var e=this,t=this.cm,n=this.textarea,i=this.prevInput;if(this.contextMenuPending||this.resetting||!t.state.focused||Ie(n)&&!i&&!this.composing||t.isReadOnly()||t.options.disableInput||t.state.keySeq)return!1;var r=n.value;if(r==i&&!t.somethingSelected())return!1;if(a&&l>=9&&this.hasSelection===r||y&&/[\uf700-\uf7ff]/.test(r))return t.display.input.reset(),!1;if(t.doc.sel==t.display.selForContextMenu){var o=r.charCodeAt(0);if(8203!=o||i||(i="​"),8666==o)return this.reset(),this.cm.execCommand("undo")}for(var s=0,u=Math.min(i.length,r.length);s1e3||r.indexOf("\n")>-1?n.value=e.prevInput="":e.prevInput=r,e.composing&&(e.composing.range.clear(),e.composing.range=t.markText(e.composing.start,t.getCursor("to"),{className:"CodeMirror-composing"}))})),!0},Ka.prototype.ensurePolled=function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},Ka.prototype.onKeyPress=function(){a&&l>=9&&(this.hasSelection=null),this.fastPoll()},Ka.prototype.onContextMenu=function(e){var t=this,n=t.cm,i=n.display,r=t.textarea;t.contextMenuPending&&t.contextMenuPending();var o=hi(n,e),u=i.scroller.scrollTop;if(o&&!h){n.options.resetSelectionOnContextMenu&&-1==n.doc.sel.contains(o)&&ir(n,io)(n.doc,Lr(o),$);var c,d=r.style.cssText,f=t.wrapper.style.cssText,p=t.wrapper.offsetParent.getBoundingClientRect();if(t.wrapper.style.cssText="position: static",r.style.cssText="position: absolute; width: 30px; height: 30px;\n top: "+(e.clientY-p.top-5)+"px; left: "+(e.clientX-p.left-5)+"px;\n z-index: 1000; background: "+(a?"rgba(255, 255, 255, .05)":"transparent")+";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);",s&&(c=r.ownerDocument.defaultView.scrollY),i.input.focus(),s&&r.ownerDocument.defaultView.scrollTo(null,c),i.input.reset(),n.somethingSelected()||(r.value=t.prevInput=" "),t.contextMenuPending=v,i.selForContextMenu=n.doc.sel,clearTimeout(i.detectingSelectAll),a&&l>=9&&g(),k){Se(e);var m=function(){ge(window,"mouseup",m),setTimeout(v,20)};pe(window,"mouseup",m)}else setTimeout(v,50)}function g(){if(null!=r.selectionStart){var e=n.somethingSelected(),o="​"+(e?r.value:"");r.value="⇚",r.value=o,t.prevInput=e?"":"​",r.selectionStart=1,r.selectionEnd=o.length,i.selForContextMenu=n.doc.sel}}function v(){if(t.contextMenuPending==v&&(t.contextMenuPending=!1,t.wrapper.style.cssText=f,r.style.cssText=d,a&&l<9&&i.scrollbars.setScrollTop(i.scroller.scrollTop=u),null!=r.selectionStart)){(!a||a&&l<9)&&g();var e=0,o=function(){i.selForContextMenu==n.doc.sel&&0==r.selectionStart&&r.selectionEnd>0&&"​"==t.prevInput?ir(n,ho)(n):e++<10?i.detectingSelectAll=setTimeout(o,500):(i.selForContextMenu=null,i.input.reset())};i.detectingSelectAll=setTimeout(o,200)}}},Ka.prototype.readOnlyChanged=function(e){e||this.reset(),this.textarea.disabled="nocursor"==e,this.textarea.readOnly=!!e},Ka.prototype.setUneditable=function(){},Ka.prototype.needsContentAttribute=!1,function(e){var t=e.optionHandlers;function n(n,i,r,o){e.defaults[n]=i,r&&(t[n]=o?function(e,t,n){n!=Fa&&r(e,t,n)}:r)}e.defineOption=n,e.Init=Fa,n("value","",(function(e,t){return e.setValue(t)}),!0),n("mode",null,(function(e,t){e.doc.modeOption=t,Or(e)}),!0),n("indentUnit",2,Or,!0),n("indentWithTabs",!1),n("smartIndent",!0),n("tabSize",4,(function(e){Ir(e),qn(e),pi(e)}),!0),n("lineSeparator",null,(function(e,t){if(e.doc.lineSep=t,t){var n=[],i=e.doc.first;e.doc.iter((function(e){for(var r=0;;){var o=e.text.indexOf(t,r);if(-1==o)break;r=o+t.length,n.push(it(i,o))}i++}));for(var r=n.length-1;r>=0;r--)yo(e.doc,t,n[r],it(n[r].line,n[r].ch+t.length))}})),n("specialChars",/[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b\u200e\u200f\u2028\u2029\u202d\u202e\u2066\u2067\u2069\ufeff\ufff9-\ufffc]/g,(function(e,t,n){e.state.specialChars=new RegExp(t.source+(t.test("\t")?"":"|\t"),"g"),n!=Fa&&e.refresh()})),n("specialCharPlaceholder",tn,(function(e){return e.refresh()}),!0),n("electricChars",!0),n("inputStyle",x?"contenteditable":"textarea",(function(){throw new Error("inputStyle can not (yet) be changed in a running editor")}),!0),n("spellcheck",!1,(function(e,t){return e.getInputField().spellcheck=t}),!0),n("autocorrect",!1,(function(e,t){return e.getInputField().autocorrect=t}),!0),n("autocapitalize",!1,(function(e,t){return e.getInputField().autocapitalize=t}),!0),n("rtlMoveVisually",!D),n("wholeLineUpdateBefore",!0),n("theme","default",(function(e){Sa(e),yr(e)}),!0),n("keyMap","default",(function(e,t,n){var i=ea(t),r=n!=Fa&&ea(n);r&&r.detach&&r.detach(e,i),i.attach&&i.attach(e,r||null)})),n("extraKeys",null),n("configureMouse",null),n("lineWrapping",!1,Ta,!0),n("gutters",[],(function(e,t){e.display.gutterSpecs=vr(t,e.options.lineNumbers),yr(e)}),!0),n("fixedGutter",!0,(function(e,t){e.display.gutters.style.left=t?ui(e.display)+"px":"0",e.refresh()}),!0),n("coverGutterNextToScrollbar",!1,(function(e){return Ui(e)}),!0),n("scrollbarStyle","native",(function(e){Vi(e),Ui(e),e.display.scrollbars.setScrollTop(e.doc.scrollTop),e.display.scrollbars.setScrollLeft(e.doc.scrollLeft)}),!0),n("lineNumbers",!1,(function(e,t){e.display.gutterSpecs=vr(e.options.gutters,t),yr(e)}),!0),n("firstLineNumber",1,yr,!0),n("lineNumberFormatter",(function(e){return e}),yr,!0),n("showCursorWhenSelecting",!1,yi,!0),n("resetSelectionOnContextMenu",!0),n("lineWiseCopyCut",!0),n("pasteLinesPerSelection",!0),n("selectionsMayTouch",!1),n("readOnly",!1,(function(e,t){"nocursor"==t&&(Ei(e),e.display.input.blur()),e.display.input.readOnlyChanged(t)})),n("screenReaderLabel",null,(function(e,t){t=""===t?null:t,e.display.input.screenReaderLabelChanged(t)})),n("disableInput",!1,(function(e,t){t||e.display.input.reset()}),!0),n("dragDrop",!0,La),n("allowDropFileTypes",null),n("cursorBlinkRate",530),n("cursorScrollMargin",0),n("cursorHeight",1,yi,!0),n("singleCursorHeightPerLine",!0,yi,!0),n("workTime",100),n("workDelay",100),n("flattenSpans",!0,Ir,!0),n("addModeClass",!1,Ir,!0),n("pollInterval",100),n("undoDepth",200,(function(e,t){return e.doc.history.undoDepth=t})),n("historyEventDelay",1250),n("viewportMargin",10,(function(e){return e.refresh()}),!0),n("maxHighlightLength",1e4,Ir,!0),n("moveInputWithCursor",!0,(function(e,t){t||e.display.input.resetPosition()})),n("tabindex",null,(function(e,t){return e.display.input.getField().tabIndex=t||""})),n("autofocus",null),n("direction","ltr",(function(e,t){return e.doc.setDirection(t)}),!0),n("phrases",null)}(Ma),function(e){var t=e.optionHandlers,n=e.helpers={};e.prototype={constructor:e,focus:function(){R(this).focus(),this.display.input.focus()},setOption:function(e,n){var i=this.options,r=i[e];i[e]==n&&"mode"!=e||(i[e]=n,t.hasOwnProperty(e)&&ir(this,t[e])(this,n,r),ve(this,"optionChange",this,e))},getOption:function(e){return this.options[e]},getDoc:function(){return this.doc},addKeyMap:function(e,t){this.state.keyMaps[t?"push":"unshift"](ea(e))},removeKeyMap:function(e){for(var t=this.state.keyMaps,n=0;nn&&(Na(this,r.head.line,e,!0),n=r.head.line,i==this.doc.sel.primIndex&&Oi(this));else{var o=r.from(),a=r.to(),l=Math.max(n,o.line);n=Math.min(this.lastLine(),a.line-(a.ch?0:1))+1;for(var s=l;s0&&eo(this.doc,i,new Ar(o,u[i].to()),$)}}})),getTokenAt:function(e,t){return Dt(this,e,t)},getLineTokens:function(e,t){return Dt(this,it(e),t,!0)},getTokenTypeAt:function(e){e=ct(this.doc,e);var t,n=mt(this,Ke(this.doc,e.line)),i=0,r=(n.length-1)/2,o=e.ch;if(0==o)t=n[2];else for(;;){var a=i+r>>1;if((a?n[2*a-1]:0)>=o)r=a;else{if(!(n[2*a+1]o&&(e=o,r=!0),i=Ke(this.doc,e)}else i=e;return Vn(this,i,{top:0,left:0},t||"page",n||r).top+(r?this.doc.height-Gt(i):0)},defaultTextHeight:function(){return ai(this.display)},defaultCharWidth:function(){return li(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(e,t,n,i,r){var o,a,l,s=this.display,u=(e=Zn(this,ct(this.doc,e))).bottom,c=e.left;if(t.style.position="absolute",t.setAttribute("cm-ignore-events","true"),this.display.input.setUneditable(t),s.sizer.appendChild(t),"over"==i)u=e.top;else if("above"==i||"near"==i){var d=Math.max(s.wrapper.clientHeight,this.doc.height),h=Math.max(s.sizer.clientWidth,s.lineSpace.clientWidth);("above"==i||e.bottom+t.offsetHeight>d)&&e.top>t.offsetHeight?u=e.top-t.offsetHeight:e.bottom+t.offsetHeight<=d&&(u=e.bottom),c+t.offsetWidth>h&&(c=h-t.offsetWidth)}t.style.top=u+"px",t.style.left=t.style.right="","right"==r?(c=s.sizer.clientWidth-t.offsetWidth,t.style.right="0px"):("left"==r?c=0:"middle"==r&&(c=(s.sizer.clientWidth-t.offsetWidth)/2),t.style.left=c+"px"),n&&(o=this,a={left:c,top:u,right:c+t.offsetWidth,bottom:u+t.offsetHeight},null!=(l=Bi(o,a)).scrollTop&&Ri(o,l.scrollTop),null!=l.scrollLeft&&_i(o,l.scrollLeft))},triggerOnKeyDown:rr(pa),triggerOnKeyPress:rr(ga),triggerOnKeyUp:ma,triggerOnMouseDown:rr(ba),execCommand:function(e){if(oa.hasOwnProperty(e))return oa[e].call(null,this)},triggerElectric:rr((function(e){Ra(this,e)})),findPosH:function(e,t,n,i){var r=1;t<0&&(r=-1,t=-t);for(var o=ct(this.doc,e),a=0;a0&&a(t.charAt(n-1));)--n;for(;i.5||this.options.lineWrapping)&&di(this),ve(this,"refresh",this)})),swapDoc:rr((function(e){var t=this.doc;return t.cm=null,this.state.selectingText&&this.state.selectingText(),Pr(this,e),qn(this),this.display.input.reset(),Ii(this,e.scrollLeft,e.scrollTop),this.curOp.forceScroll=!0,dn(this,"swapDoc",this,t),t})),phrase:function(e){var t=this.options.phrases;return t&&Object.prototype.hasOwnProperty.call(t,e)?t[e]:e},getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},De(e),e.registerHelper=function(t,i,r){n.hasOwnProperty(t)||(n[t]=e[t]={_global:[]}),n[t][i]=r},e.registerGlobalHelper=function(t,i,r,o){e.registerHelper(t,i,o),n[t]._global.push({pred:r,val:o})}}(Ma);var Za="iter insert remove copy getEditor constructor".split(" ");for(var Ya in Io.prototype)Io.prototype.hasOwnProperty(Ya)&&q(Za,Ya)<0&&(Ma.prototype[Ya]=function(e){return function(){return e.apply(this.doc,arguments)}}(Io.prototype[Ya]));return De(Io),Ma.inputStyles={textarea:Ka,contenteditable:Ua},Ma.defineMode=function(e){Ma.defaults.mode||"null"==e||(Ma.defaults.mode=e),_e.apply(this,arguments)},Ma.defineMIME=function(e,t){Pe[e]=t},Ma.defineMode("null",(function(){return{token:function(e){return e.skipToEnd()}}})),Ma.defineMIME("text/plain","null"),Ma.defineExtension=function(e,t){Ma.prototype[e]=t},Ma.defineDocExtension=function(e,t){Io.prototype[e]=t},Ma.fromTextArea=function(e,t){if((t=t?_(t):{}).value=e.value,!t.tabindex&&e.tabIndex&&(t.tabindex=e.tabIndex),!t.placeholder&&e.placeholder&&(t.placeholder=e.placeholder),null==t.autofocus){var n=N(e.ownerDocument);t.autofocus=n==e||null!=e.getAttribute("autofocus")&&n==document.body}function i(){e.value=l.getValue()}var r;if(e.form&&(pe(e.form,"submit",i),!t.leaveSubmitMethodAlone)){var o=e.form;r=o.submit;try{var a=o.submit=function(){i(),o.submit=r,o.submit(),o.submit=a}}catch(e){}}t.finishInit=function(n){n.save=i,n.getTextArea=function(){return e},n.toTextArea=function(){n.toTextArea=isNaN,i(),e.parentNode.removeChild(n.getWrapperElement()),e.style.display="",e.form&&(ge(e.form,"submit",i),t.leaveSubmitMethodAlone||"function"!=typeof e.form.submit||(e.form.submit=r))}},e.style.display="none";var l=Ma((function(t){return e.parentNode.insertBefore(t,e.nextSibling)}),t);return l},function(e){e.off=ge,e.on=pe,e.wheelEventPixels=kr,e.Doc=Io,e.splitLines=Oe,e.countColumn=W,e.findColumn=X,e.isWordChar=ne,e.Pass=U,e.signal=ve,e.Line=Kt,e.changeEnd=Tr,e.scrollbarModel=Gi,e.Pos=it,e.cmpPos=rt,e.modes=Re,e.mimeModes=Pe,e.resolveMode=We,e.getMode=je,e.modeExtensions=qe,e.extendMode=Ue,e.copyState=$e,e.startState=Ve,e.innerMode=Ge,e.commands=oa,e.keyMap=Vo,e.keyName=Jo,e.isModifierKey=Yo,e.lookupKey=Zo,e.normalizeKeyMap=Ko,e.StringStream=Xe,e.SharedTextMarker=Mo,e.TextMarker=Lo,e.LineWidget=Fo,e.e_preventDefault=Ce,e.e_stopPropagation=we,e.e_stop=Se,e.addClass=O,e.contains=B,e.rmClass=A,e.keyNames=qo}(Ma),Ma.version="5.65.9",Ma}))},{}],11:[function(e,t,n){var i;i=function(e){"use strict";var t=/^((?:(?:aaas?|about|acap|adiumxtra|af[ps]|aim|apt|attachment|aw|beshare|bitcoin|bolo|callto|cap|chrome(?:-extension)?|cid|coap|com-eventbrite-attendee|content|crid|cvs|data|dav|dict|dlna-(?:playcontainer|playsingle)|dns|doi|dtn|dvb|ed2k|facetime|feed|file|finger|fish|ftp|geo|gg|git|gizmoproject|go|gopher|gtalk|h323|hcp|https?|iax|icap|icon|im|imap|info|ipn|ipp|irc[6s]?|iris(?:\.beep|\.lwz|\.xpc|\.xpcs)?|itms|jar|javascript|jms|keyparc|lastfm|ldaps?|magnet|mailto|maps|market|message|mid|mms|ms-help|msnim|msrps?|mtqp|mumble|mupdate|mvn|news|nfs|nih?|nntp|notes|oid|opaquelocktoken|palm|paparazzi|platform|pop|pres|proxy|psyc|query|res(?:ource)?|rmi|rsync|rtmp|rtsp|secondlife|service|session|sftp|sgn|shttp|sieve|sips?|skype|sm[bs]|snmp|soap\.beeps?|soldat|spotify|ssh|steam|svn|tag|teamspeak|tel(?:net)?|tftp|things|thismessage|tip|tn3270|tv|udp|unreal|urn|ut2004|vemmi|ventrilo|view-source|webcal|wss?|wtai|wyciwyg|xcon(?:-userid)?|xfire|xmlrpc\.beeps?|xmpp|xri|ymsgr|z39\.50[rs]?):(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]|\([^\s()<>]*\))+(?:\([^\s()<>]*\)|[^\s`*!()\[\]{};:'".,<>?«»“”‘’]))/i;e.defineMode("gfm",(function(n,i){var r=0,o={startState:function(){return{code:!1,codeBlock:!1,ateSpace:!1}},copyState:function(e){return{code:e.code,codeBlock:e.codeBlock,ateSpace:e.ateSpace}},token:function(e,n){if(n.combineTokens=null,n.codeBlock)return e.match(/^```+/)?(n.codeBlock=!1,null):(e.skipToEnd(),null);if(e.sol()&&(n.code=!1),e.sol()&&e.match(/^```+/))return e.skipToEnd(),n.codeBlock=!0,null;if("`"===e.peek()){e.next();var o=e.pos;e.eatWhile("`");var a=1+e.pos-o;return n.code?a===r&&(n.code=!1):(r=a,n.code=!0),null}if(n.code)return e.next(),null;if(e.eatSpace())return n.ateSpace=!0,null;if((e.sol()||n.ateSpace)&&(n.ateSpace=!1,!1!==i.gitHubSpice)){if(e.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+@)?(?=.{0,6}\d)(?:[a-f0-9]{7,40}\b)/))return n.combineTokens=!0,"link";if(e.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+)?#[0-9]+\b/))return n.combineTokens=!0,"link"}return e.match(t)&&"]("!=e.string.slice(e.start-2,e.start)&&(0==e.start||/\W/.test(e.string.charAt(e.start-1)))?(n.combineTokens=!0,"link"):(e.next(),null)},blankLine:function(e){return e.code=!1,null}},a={taskLists:!0,strikethrough:!0,emoji:!0};for(var l in i)a[l]=i[l];return a.name="markdown",e.overlayMode(e.getMode(n,a),o)}),"markdown"),e.defineMIME("text/x-gfm","gfm")},"object"==typeof n&&"object"==typeof t?i(e("../../lib/codemirror"),e("../markdown/markdown"),e("../../addon/mode/overlay")):i(CodeMirror)},{"../../addon/mode/overlay":7,"../../lib/codemirror":10,"../markdown/markdown":12}],12:[function(e,t,n){var i;i=function(e){"use strict";e.defineMode("markdown",(function(t,n){var i=e.getMode(t,"text/html"),r="null"==i.name;void 0===n.highlightFormatting&&(n.highlightFormatting=!1),void 0===n.maxBlockquoteDepth&&(n.maxBlockquoteDepth=0),void 0===n.taskLists&&(n.taskLists=!1),void 0===n.strikethrough&&(n.strikethrough=!1),void 0===n.emoji&&(n.emoji=!1),void 0===n.fencedCodeBlockHighlighting&&(n.fencedCodeBlockHighlighting=!0),void 0===n.fencedCodeBlockDefaultMode&&(n.fencedCodeBlockDefaultMode="text/plain"),void 0===n.xml&&(n.xml=!0),void 0===n.tokenTypeOverrides&&(n.tokenTypeOverrides={});var o={header:"header",code:"comment",quote:"quote",list1:"variable-2",list2:"variable-3",list3:"keyword",hr:"hr",image:"image",imageAltText:"image-alt-text",imageMarker:"image-marker",formatting:"formatting",linkInline:"link",linkEmail:"link",linkText:"link",linkHref:"string",em:"em",strong:"strong",strikethrough:"strikethrough",emoji:"builtin"};for(var a in o)o.hasOwnProperty(a)&&n.tokenTypeOverrides[a]&&(o[a]=n.tokenTypeOverrides[a]);var l=/^([*\-_])(?:\s*\1){2,}\s*$/,s=/^(?:[*\-+]|^[0-9]+([.)]))\s+/,u=/^\[(x| )\](?=\s)/i,c=n.allowAtxHeaderWithoutSpace?/^(#+)/:/^(#+)(?: |$)/,d=/^ {0,3}(?:\={1,}|-{2,})\s*$/,h=/^[^#!\[\]*_\\<>` "'(~:]+/,f=/^(~~~+|```+)[ \t]*([\w\/+#-]*)[^\n`]*$/,p=/^\s*\[[^\]]+?\]:.*$/,m=/[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDF3C-\uDF3E]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]/;function g(e,t,n){return t.f=t.inline=n,n(e,t)}function v(e,t,n){return t.f=t.block=n,n(e,t)}function x(t){if(t.linkTitle=!1,t.linkHref=!1,t.linkText=!1,t.em=!1,t.strong=!1,t.strikethrough=!1,t.quote=0,t.indentedCode=!1,t.f==b){var n=r;if(!n){var o=e.innerMode(i,t.htmlState);n="xml"==o.mode.name&&null===o.state.tagStart&&!o.state.context&&o.state.tokenize.isInText}n&&(t.f=k,t.block=y,t.htmlState=null)}return t.trailingSpace=0,t.trailingSpaceNewLine=!1,t.prevLine=t.thisLine,t.thisLine={stream:null},null}function y(i,r){var a,h=i.column()===r.indentation,m=!(a=r.prevLine.stream)||!/\S/.test(a.string),v=r.indentedCode,x=r.prevLine.hr,y=!1!==r.list,b=(r.listStack[r.listStack.length-1]||0)+3;r.indentedCode=!1;var w=r.indentation;if(null===r.indentationDiff&&(r.indentationDiff=r.indentation,y)){for(r.list=null;w=4&&(v||r.prevLine.fencedCodeEnd||r.prevLine.header||m))return i.skipToEnd(),r.indentedCode=!0,o.code;if(i.eatSpace())return null;if(h&&r.indentation<=b&&(F=i.match(c))&&F[1].length<=6)return r.quote=0,r.header=F[1].length,r.thisLine.header=!0,n.highlightFormatting&&(r.formatting="header"),r.f=r.inline,C(r);if(r.indentation<=b&&i.eat(">"))return r.quote=h?1:r.quote+1,n.highlightFormatting&&(r.formatting="quote"),i.eatSpace(),C(r);if(!S&&!r.setext&&h&&r.indentation<=b&&(F=i.match(s))){var A=F[1]?"ol":"ul";return r.indentation=w+i.current().length,r.list=!0,r.quote=0,r.listStack.push(r.indentation),r.em=!1,r.strong=!1,r.code=!1,r.strikethrough=!1,n.taskLists&&i.match(u,!1)&&(r.taskList=!0),r.f=r.inline,n.highlightFormatting&&(r.formatting=["list","list-"+A]),C(r)}return h&&r.indentation<=b&&(F=i.match(f,!0))?(r.quote=0,r.fencedEndRE=new RegExp(F[1]+"+ *$"),r.localMode=n.fencedCodeBlockHighlighting&&function(n){if(e.findModeByName){var i=e.findModeByName(n);i&&(n=i.mime||i.mimes[0])}var r=e.getMode(t,n);return"null"==r.name?null:r}(F[2]||n.fencedCodeBlockDefaultMode),r.localMode&&(r.localState=e.startState(r.localMode)),r.f=r.block=D,n.highlightFormatting&&(r.formatting="code-block"),r.code=-1,C(r)):r.setext||!(k&&y||r.quote||!1!==r.list||r.code||S||p.test(i.string))&&(F=i.lookAhead(1))&&(F=F.match(d))?(r.setext?(r.header=r.setext,r.setext=0,i.skipToEnd(),n.highlightFormatting&&(r.formatting="header")):(r.header="="==F[0].charAt(0)?1:2,r.setext=r.header),r.thisLine.header=!0,r.f=r.inline,C(r)):S?(i.skipToEnd(),r.hr=!0,r.thisLine.hr=!0,o.hr):"["===i.peek()?g(i,r,E):g(i,r,r.inline)}function b(t,n){var o=i.token(t,n.htmlState);if(!r){var a=e.innerMode(i,n.htmlState);("xml"==a.mode.name&&null===a.state.tagStart&&!a.state.context&&a.state.tokenize.isInText||n.md_inside&&t.current().indexOf(">")>-1)&&(n.f=k,n.block=y,n.htmlState=null)}return o}function D(e,t){var i,r=t.listStack[t.listStack.length-1]||0,a=t.indentation=e.quote?t.push(o.formatting+"-"+e.formatting[i]+"-"+e.quote):t.push("error"))}if(e.taskOpen)return t.push("meta"),t.length?t.join(" "):null;if(e.taskClosed)return t.push("property"),t.length?t.join(" "):null;if(e.linkHref?t.push(o.linkHref,"url"):(e.strong&&t.push(o.strong),e.em&&t.push(o.em),e.strikethrough&&t.push(o.strikethrough),e.emoji&&t.push(o.emoji),e.linkText&&t.push(o.linkText),e.code&&t.push(o.code),e.image&&t.push(o.image),e.imageAltText&&t.push(o.imageAltText,"link"),e.imageMarker&&t.push(o.imageMarker)),e.header&&t.push(o.header,o.header+"-"+e.header),e.quote&&(t.push(o.quote),!n.maxBlockquoteDepth||n.maxBlockquoteDepth>=e.quote?t.push(o.quote+"-"+e.quote):t.push(o.quote+"-"+n.maxBlockquoteDepth)),!1!==e.list){var r=(e.listStack.length-1)%3;r?1===r?t.push(o.list2):t.push(o.list3):t.push(o.list1)}return e.trailingSpaceNewLine?t.push("trailing-space-new-line"):e.trailingSpace&&t.push("trailing-space-"+(e.trailingSpace%2?"a":"b")),t.length?t.join(" "):null}function w(e,t){if(e.match(h,!0))return C(t)}function k(t,r){var a=r.text(t,r);if(void 0!==a)return a;if(r.list)return r.list=null,C(r);if(r.taskList)return" "===t.match(u,!0)[1]?r.taskOpen=!0:r.taskClosed=!0,n.highlightFormatting&&(r.formatting="task"),r.taskList=!1,C(r);if(r.taskOpen=!1,r.taskClosed=!1,r.header&&t.match(/^#+$/,!0))return n.highlightFormatting&&(r.formatting="header"),C(r);var l=t.next();if(r.linkTitle){r.linkTitle=!1;var s=l;"("===l&&(s=")");var c="^\\s*(?:[^"+(s=(s+"").replace(/([.?*+^\[\]\\(){}|-])/g,"\\$1"))+"\\\\]+|\\\\\\\\|\\\\.)"+s;if(t.match(new RegExp(c),!0))return o.linkHref}if("`"===l){var d=r.formatting;n.highlightFormatting&&(r.formatting="code"),t.eatWhile("`");var h=t.current().length;if(0!=r.code||r.quote&&1!=h){if(h==r.code){var f=C(r);return r.code=0,f}return r.formatting=d,C(r)}return r.code=h,C(r)}if(r.code)return C(r);if("\\"===l&&(t.next(),n.highlightFormatting)){var p=C(r),g=o.formatting+"-escape";return p?p+" "+g:g}if("!"===l&&t.match(/\[[^\]]*\] ?(?:\(|\[)/,!1))return r.imageMarker=!0,r.image=!0,n.highlightFormatting&&(r.formatting="image"),C(r);if("["===l&&r.imageMarker&&t.match(/[^\]]*\](\(.*?\)| ?\[.*?\])/,!1))return r.imageMarker=!1,r.imageAltText=!0,n.highlightFormatting&&(r.formatting="image"),C(r);if("]"===l&&r.imageAltText){n.highlightFormatting&&(r.formatting="image");var p=C(r);return r.imageAltText=!1,r.image=!1,r.inline=r.f=F,p}if("["===l&&!r.image)return r.linkText&&t.match(/^.*?\]/)||(r.linkText=!0,n.highlightFormatting&&(r.formatting="link")),C(r);if("]"===l&&r.linkText){n.highlightFormatting&&(r.formatting="link");var p=C(r);return r.linkText=!1,r.inline=r.f=t.match(/\(.*?\)| ?\[.*?\]/,!1)?F:k,p}if("<"===l&&t.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/,!1))return r.f=r.inline=S,n.highlightFormatting&&(r.formatting="link"),(p=C(r))?p+=" ":p="",p+o.linkInline;if("<"===l&&t.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/,!1))return r.f=r.inline=S,n.highlightFormatting&&(r.formatting="link"),(p=C(r))?p+=" ":p="",p+o.linkEmail;if(n.xml&&"<"===l&&t.match(/^(!--|\?|!\[CDATA\[|[a-z][a-z0-9-]*(?:\s+[a-z_:.\-]+(?:\s*=\s*[^>]+)?)*\s*(?:>|$))/i,!1)){var x=t.string.indexOf(">",t.pos);if(-1!=x){var y=t.string.substring(t.start,x);/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(y)&&(r.md_inside=!0)}return t.backUp(1),r.htmlState=e.startState(i),v(t,r,b)}if(n.xml&&"<"===l&&t.match(/^\/\w*?>/))return r.md_inside=!1,"tag";if("*"===l||"_"===l){for(var D=1,w=1==t.pos?" ":t.string.charAt(t.pos-2);D<3&&t.eat(l);)D++;var A=t.peek()||" ",E=!/\s/.test(A)&&(!m.test(A)||/\s/.test(w)||m.test(w)),L=!/\s/.test(w)&&(!m.test(w)||/\s/.test(A)||m.test(A)),T=null,M=null;if(D%2&&(r.em||!E||"*"!==l&&L&&!m.test(w)?r.em!=l||!L||"*"!==l&&E&&!m.test(A)||(T=!1):T=!0),D>1&&(r.strong||!E||"*"!==l&&L&&!m.test(w)?r.strong!=l||!L||"*"!==l&&E&&!m.test(A)||(M=!1):M=!0),null!=M||null!=T)return n.highlightFormatting&&(r.formatting=null==T?"strong":null==M?"em":"strong em"),!0===T&&(r.em=l),!0===M&&(r.strong=l),f=C(r),!1===T&&(r.em=!1),!1===M&&(r.strong=!1),f}else if(" "===l&&(t.eat("*")||t.eat("_"))){if(" "===t.peek())return C(r);t.backUp(1)}if(n.strikethrough)if("~"===l&&t.eatWhile(l)){if(r.strikethrough)return n.highlightFormatting&&(r.formatting="strikethrough"),f=C(r),r.strikethrough=!1,f;if(t.match(/^[^\s]/,!1))return r.strikethrough=!0,n.highlightFormatting&&(r.formatting="strikethrough"),C(r)}else if(" "===l&&t.match("~~",!0)){if(" "===t.peek())return C(r);t.backUp(2)}if(n.emoji&&":"===l&&t.match(/^(?:[a-z_\d+][a-z_\d+-]*|\-[a-z_\d+][a-z_\d+-]*):/)){r.emoji=!0,n.highlightFormatting&&(r.formatting="emoji");var B=C(r);return r.emoji=!1,B}return" "===l&&(t.match(/^ +$/,!1)?r.trailingSpace++:r.trailingSpace&&(r.trailingSpaceNewLine=!0)),C(r)}function S(e,t){if(">"===e.next()){t.f=t.inline=k,n.highlightFormatting&&(t.formatting="link");var i=C(t);return i?i+=" ":i="",i+o.linkInline}return e.match(/^[^>]+/,!0),o.linkInline}function F(e,t){if(e.eatSpace())return null;var i,r=e.next();return"("===r||"["===r?(t.f=t.inline=(i="("===r?")":"]",function(e,t){if(e.next()===i){t.f=t.inline=k,n.highlightFormatting&&(t.formatting="link-string");var r=C(t);return t.linkHref=!1,r}return e.match(A[i]),t.linkHref=!0,C(t)}),n.highlightFormatting&&(t.formatting="link-string"),t.linkHref=!0,C(t)):"error"}var A={")":/^(?:[^\\\(\)]|\\.|\((?:[^\\\(\)]|\\.)*\))*?(?=\))/,"]":/^(?:[^\\\[\]]|\\.|\[(?:[^\\\[\]]|\\.)*\])*?(?=\])/};function E(e,t){return e.match(/^([^\]\\]|\\.)*\]:/,!1)?(t.f=L,e.next(),n.highlightFormatting&&(t.formatting="link"),t.linkText=!0,C(t)):g(e,t,k)}function L(e,t){if(e.match("]:",!0)){t.f=t.inline=T,n.highlightFormatting&&(t.formatting="link");var i=C(t);return t.linkText=!1,i}return e.match(/^([^\]\\]|\\.)+/,!0),o.linkText}function T(e,t){return e.eatSpace()?null:(e.match(/^[^\s]+/,!0),void 0===e.peek()?t.linkTitle=!0:e.match(/^(?:\s+(?:"(?:[^"\\]|\\.)+"|'(?:[^'\\]|\\.)+'|\((?:[^)\\]|\\.)+\)))?/,!0),t.f=t.inline=k,o.linkHref+" url")}var M={startState:function(){return{f:y,prevLine:{stream:null},thisLine:{stream:null},block:y,htmlState:null,indentation:0,inline:k,text:w,formatting:!1,linkText:!1,linkHref:!1,linkTitle:!1,code:0,em:!1,strong:!1,header:0,setext:0,hr:!1,taskList:!1,list:!1,listStack:[],quote:0,trailingSpace:0,trailingSpaceNewLine:!1,strikethrough:!1,emoji:!1,fencedEndRE:null}},copyState:function(t){return{f:t.f,prevLine:t.prevLine,thisLine:t.thisLine,block:t.block,htmlState:t.htmlState&&e.copyState(i,t.htmlState),indentation:t.indentation,localMode:t.localMode,localState:t.localMode?e.copyState(t.localMode,t.localState):null,inline:t.inline,text:t.text,formatting:!1,linkText:t.linkText,linkTitle:t.linkTitle,linkHref:t.linkHref,code:t.code,em:t.em,strong:t.strong,strikethrough:t.strikethrough,emoji:t.emoji,header:t.header,setext:t.setext,hr:t.hr,taskList:t.taskList,list:t.list,listStack:t.listStack.slice(0),quote:t.quote,indentedCode:t.indentedCode,trailingSpace:t.trailingSpace,trailingSpaceNewLine:t.trailingSpaceNewLine,md_inside:t.md_inside,fencedEndRE:t.fencedEndRE}},token:function(e,t){if(t.formatting=!1,e!=t.thisLine.stream){if(t.header=0,t.hr=!1,e.match(/^\s*$/,!0))return x(t),null;if(t.prevLine=t.thisLine,t.thisLine={stream:e},t.taskList=!1,t.trailingSpace=0,t.trailingSpaceNewLine=!1,!t.localState&&(t.f=t.block,t.f!=b)){var n=e.match(/^\s*/,!0)[0].replace(/\t/g," ").length;if(t.indentation=n,t.indentationDiff=null,n>0)return null}}return t.f(e,t)},innerMode:function(e){return e.block==b?{state:e.htmlState,mode:i}:e.localState?{state:e.localState,mode:e.localMode}:{state:e,mode:M}},indent:function(t,n,r){return t.block==b&&i.indent?i.indent(t.htmlState,n,r):t.localState&&t.localMode.indent?t.localMode.indent(t.localState,n,r):e.Pass},blankLine:x,getType:C,blockCommentStart:"\x3c!--",blockCommentEnd:"--\x3e",closeBrackets:"()[]{}''\"\"``",fold:"markdown"};return M}),"xml"),e.defineMIME("text/markdown","markdown"),e.defineMIME("text/x-markdown","markdown")},"object"==typeof n&&"object"==typeof t?i(e("../../lib/codemirror"),e("../xml/xml"),e("../meta")):i(CodeMirror)},{"../../lib/codemirror":10,"../meta":13,"../xml/xml":14}],13:[function(e,t,n){(function(e){"use strict";e.modeInfo=[{name:"APL",mime:"text/apl",mode:"apl",ext:["dyalog","apl"]},{name:"PGP",mimes:["application/pgp","application/pgp-encrypted","application/pgp-keys","application/pgp-signature"],mode:"asciiarmor",ext:["asc","pgp","sig"]},{name:"ASN.1",mime:"text/x-ttcn-asn",mode:"asn.1",ext:["asn","asn1"]},{name:"Asterisk",mime:"text/x-asterisk",mode:"asterisk",file:/^extensions\.conf$/i},{name:"Brainfuck",mime:"text/x-brainfuck",mode:"brainfuck",ext:["b","bf"]},{name:"C",mime:"text/x-csrc",mode:"clike",ext:["c","h","ino"]},{name:"C++",mime:"text/x-c++src",mode:"clike",ext:["cpp","c++","cc","cxx","hpp","h++","hh","hxx"],alias:["cpp"]},{name:"Cobol",mime:"text/x-cobol",mode:"cobol",ext:["cob","cpy","cbl"]},{name:"C#",mime:"text/x-csharp",mode:"clike",ext:["cs"],alias:["csharp","cs"]},{name:"Clojure",mime:"text/x-clojure",mode:"clojure",ext:["clj","cljc","cljx"]},{name:"ClojureScript",mime:"text/x-clojurescript",mode:"clojure",ext:["cljs"]},{name:"Closure Stylesheets (GSS)",mime:"text/x-gss",mode:"css",ext:["gss"]},{name:"CMake",mime:"text/x-cmake",mode:"cmake",ext:["cmake","cmake.in"],file:/^CMakeLists\.txt$/},{name:"CoffeeScript",mimes:["application/vnd.coffeescript","text/coffeescript","text/x-coffeescript"],mode:"coffeescript",ext:["coffee"],alias:["coffee","coffee-script"]},{name:"Common Lisp",mime:"text/x-common-lisp",mode:"commonlisp",ext:["cl","lisp","el"],alias:["lisp"]},{name:"Cypher",mime:"application/x-cypher-query",mode:"cypher",ext:["cyp","cypher"]},{name:"Cython",mime:"text/x-cython",mode:"python",ext:["pyx","pxd","pxi"]},{name:"Crystal",mime:"text/x-crystal",mode:"crystal",ext:["cr"]},{name:"CSS",mime:"text/css",mode:"css",ext:["css"]},{name:"CQL",mime:"text/x-cassandra",mode:"sql",ext:["cql"]},{name:"D",mime:"text/x-d",mode:"d",ext:["d"]},{name:"Dart",mimes:["application/dart","text/x-dart"],mode:"dart",ext:["dart"]},{name:"diff",mime:"text/x-diff",mode:"diff",ext:["diff","patch"]},{name:"Django",mime:"text/x-django",mode:"django"},{name:"Dockerfile",mime:"text/x-dockerfile",mode:"dockerfile",file:/^Dockerfile$/},{name:"DTD",mime:"application/xml-dtd",mode:"dtd",ext:["dtd"]},{name:"Dylan",mime:"text/x-dylan",mode:"dylan",ext:["dylan","dyl","intr"]},{name:"EBNF",mime:"text/x-ebnf",mode:"ebnf"},{name:"ECL",mime:"text/x-ecl",mode:"ecl",ext:["ecl"]},{name:"edn",mime:"application/edn",mode:"clojure",ext:["edn"]},{name:"Eiffel",mime:"text/x-eiffel",mode:"eiffel",ext:["e"]},{name:"Elm",mime:"text/x-elm",mode:"elm",ext:["elm"]},{name:"Embedded JavaScript",mime:"application/x-ejs",mode:"htmlembedded",ext:["ejs"]},{name:"Embedded Ruby",mime:"application/x-erb",mode:"htmlembedded",ext:["erb"]},{name:"Erlang",mime:"text/x-erlang",mode:"erlang",ext:["erl"]},{name:"Esper",mime:"text/x-esper",mode:"sql"},{name:"Factor",mime:"text/x-factor",mode:"factor",ext:["factor"]},{name:"FCL",mime:"text/x-fcl",mode:"fcl"},{name:"Forth",mime:"text/x-forth",mode:"forth",ext:["forth","fth","4th"]},{name:"Fortran",mime:"text/x-fortran",mode:"fortran",ext:["f","for","f77","f90","f95"]},{name:"F#",mime:"text/x-fsharp",mode:"mllike",ext:["fs"],alias:["fsharp"]},{name:"Gas",mime:"text/x-gas",mode:"gas",ext:["s"]},{name:"Gherkin",mime:"text/x-feature",mode:"gherkin",ext:["feature"]},{name:"GitHub Flavored Markdown",mime:"text/x-gfm",mode:"gfm",file:/^(readme|contributing|history)\.md$/i},{name:"Go",mime:"text/x-go",mode:"go",ext:["go"]},{name:"Groovy",mime:"text/x-groovy",mode:"groovy",ext:["groovy","gradle"],file:/^Jenkinsfile$/},{name:"HAML",mime:"text/x-haml",mode:"haml",ext:["haml"]},{name:"Haskell",mime:"text/x-haskell",mode:"haskell",ext:["hs"]},{name:"Haskell (Literate)",mime:"text/x-literate-haskell",mode:"haskell-literate",ext:["lhs"]},{name:"Haxe",mime:"text/x-haxe",mode:"haxe",ext:["hx"]},{name:"HXML",mime:"text/x-hxml",mode:"haxe",ext:["hxml"]},{name:"ASP.NET",mime:"application/x-aspx",mode:"htmlembedded",ext:["aspx"],alias:["asp","aspx"]},{name:"HTML",mime:"text/html",mode:"htmlmixed",ext:["html","htm","handlebars","hbs"],alias:["xhtml"]},{name:"HTTP",mime:"message/http",mode:"http"},{name:"IDL",mime:"text/x-idl",mode:"idl",ext:["pro"]},{name:"Pug",mime:"text/x-pug",mode:"pug",ext:["jade","pug"],alias:["jade"]},{name:"Java",mime:"text/x-java",mode:"clike",ext:["java"]},{name:"Java Server Pages",mime:"application/x-jsp",mode:"htmlembedded",ext:["jsp"],alias:["jsp"]},{name:"JavaScript",mimes:["text/javascript","text/ecmascript","application/javascript","application/x-javascript","application/ecmascript"],mode:"javascript",ext:["js"],alias:["ecmascript","js","node"]},{name:"JSON",mimes:["application/json","application/x-json"],mode:"javascript",ext:["json","map"],alias:["json5"]},{name:"JSON-LD",mime:"application/ld+json",mode:"javascript",ext:["jsonld"],alias:["jsonld"]},{name:"JSX",mime:"text/jsx",mode:"jsx",ext:["jsx"]},{name:"Jinja2",mime:"text/jinja2",mode:"jinja2",ext:["j2","jinja","jinja2"]},{name:"Julia",mime:"text/x-julia",mode:"julia",ext:["jl"],alias:["jl"]},{name:"Kotlin",mime:"text/x-kotlin",mode:"clike",ext:["kt"]},{name:"LESS",mime:"text/x-less",mode:"css",ext:["less"]},{name:"LiveScript",mime:"text/x-livescript",mode:"livescript",ext:["ls"],alias:["ls"]},{name:"Lua",mime:"text/x-lua",mode:"lua",ext:["lua"]},{name:"Markdown",mime:"text/x-markdown",mode:"markdown",ext:["markdown","md","mkd"]},{name:"mIRC",mime:"text/mirc",mode:"mirc"},{name:"MariaDB SQL",mime:"text/x-mariadb",mode:"sql"},{name:"Mathematica",mime:"text/x-mathematica",mode:"mathematica",ext:["m","nb","wl","wls"]},{name:"Modelica",mime:"text/x-modelica",mode:"modelica",ext:["mo"]},{name:"MUMPS",mime:"text/x-mumps",mode:"mumps",ext:["mps"]},{name:"MS SQL",mime:"text/x-mssql",mode:"sql"},{name:"mbox",mime:"application/mbox",mode:"mbox",ext:["mbox"]},{name:"MySQL",mime:"text/x-mysql",mode:"sql"},{name:"Nginx",mime:"text/x-nginx-conf",mode:"nginx",file:/nginx.*\.conf$/i},{name:"NSIS",mime:"text/x-nsis",mode:"nsis",ext:["nsh","nsi"]},{name:"NTriples",mimes:["application/n-triples","application/n-quads","text/n-triples"],mode:"ntriples",ext:["nt","nq"]},{name:"Objective-C",mime:"text/x-objectivec",mode:"clike",ext:["m"],alias:["objective-c","objc"]},{name:"Objective-C++",mime:"text/x-objectivec++",mode:"clike",ext:["mm"],alias:["objective-c++","objc++"]},{name:"OCaml",mime:"text/x-ocaml",mode:"mllike",ext:["ml","mli","mll","mly"]},{name:"Octave",mime:"text/x-octave",mode:"octave",ext:["m"]},{name:"Oz",mime:"text/x-oz",mode:"oz",ext:["oz"]},{name:"Pascal",mime:"text/x-pascal",mode:"pascal",ext:["p","pas"]},{name:"PEG.js",mime:"null",mode:"pegjs",ext:["jsonld"]},{name:"Perl",mime:"text/x-perl",mode:"perl",ext:["pl","pm"]},{name:"PHP",mimes:["text/x-php","application/x-httpd-php","application/x-httpd-php-open"],mode:"php",ext:["php","php3","php4","php5","php7","phtml"]},{name:"Pig",mime:"text/x-pig",mode:"pig",ext:["pig"]},{name:"Plain Text",mime:"text/plain",mode:"null",ext:["txt","text","conf","def","list","log"]},{name:"PLSQL",mime:"text/x-plsql",mode:"sql",ext:["pls"]},{name:"PostgreSQL",mime:"text/x-pgsql",mode:"sql"},{name:"PowerShell",mime:"application/x-powershell",mode:"powershell",ext:["ps1","psd1","psm1"]},{name:"Properties files",mime:"text/x-properties",mode:"properties",ext:["properties","ini","in"],alias:["ini","properties"]},{name:"ProtoBuf",mime:"text/x-protobuf",mode:"protobuf",ext:["proto"]},{name:"Python",mime:"text/x-python",mode:"python",ext:["BUILD","bzl","py","pyw"],file:/^(BUCK|BUILD)$/},{name:"Puppet",mime:"text/x-puppet",mode:"puppet",ext:["pp"]},{name:"Q",mime:"text/x-q",mode:"q",ext:["q"]},{name:"R",mime:"text/x-rsrc",mode:"r",ext:["r","R"],alias:["rscript"]},{name:"reStructuredText",mime:"text/x-rst",mode:"rst",ext:["rst"],alias:["rst"]},{name:"RPM Changes",mime:"text/x-rpm-changes",mode:"rpm"},{name:"RPM Spec",mime:"text/x-rpm-spec",mode:"rpm",ext:["spec"]},{name:"Ruby",mime:"text/x-ruby",mode:"ruby",ext:["rb"],alias:["jruby","macruby","rake","rb","rbx"]},{name:"Rust",mime:"text/x-rustsrc",mode:"rust",ext:["rs"]},{name:"SAS",mime:"text/x-sas",mode:"sas",ext:["sas"]},{name:"Sass",mime:"text/x-sass",mode:"sass",ext:["sass"]},{name:"Scala",mime:"text/x-scala",mode:"clike",ext:["scala"]},{name:"Scheme",mime:"text/x-scheme",mode:"scheme",ext:["scm","ss"]},{name:"SCSS",mime:"text/x-scss",mode:"css",ext:["scss"]},{name:"Shell",mimes:["text/x-sh","application/x-sh"],mode:"shell",ext:["sh","ksh","bash"],alias:["bash","sh","zsh"],file:/^PKGBUILD$/},{name:"Sieve",mime:"application/sieve",mode:"sieve",ext:["siv","sieve"]},{name:"Slim",mimes:["text/x-slim","application/x-slim"],mode:"slim",ext:["slim"]},{name:"Smalltalk",mime:"text/x-stsrc",mode:"smalltalk",ext:["st"]},{name:"Smarty",mime:"text/x-smarty",mode:"smarty",ext:["tpl"]},{name:"Solr",mime:"text/x-solr",mode:"solr"},{name:"SML",mime:"text/x-sml",mode:"mllike",ext:["sml","sig","fun","smackspec"]},{name:"Soy",mime:"text/x-soy",mode:"soy",ext:["soy"],alias:["closure template"]},{name:"SPARQL",mime:"application/sparql-query",mode:"sparql",ext:["rq","sparql"],alias:["sparul"]},{name:"Spreadsheet",mime:"text/x-spreadsheet",mode:"spreadsheet",alias:["excel","formula"]},{name:"SQL",mime:"text/x-sql",mode:"sql",ext:["sql"]},{name:"SQLite",mime:"text/x-sqlite",mode:"sql"},{name:"Squirrel",mime:"text/x-squirrel",mode:"clike",ext:["nut"]},{name:"Stylus",mime:"text/x-styl",mode:"stylus",ext:["styl"]},{name:"Swift",mime:"text/x-swift",mode:"swift",ext:["swift"]},{name:"sTeX",mime:"text/x-stex",mode:"stex"},{name:"LaTeX",mime:"text/x-latex",mode:"stex",ext:["text","ltx","tex"],alias:["tex"]},{name:"SystemVerilog",mime:"text/x-systemverilog",mode:"verilog",ext:["v","sv","svh"]},{name:"Tcl",mime:"text/x-tcl",mode:"tcl",ext:["tcl"]},{name:"Textile",mime:"text/x-textile",mode:"textile",ext:["textile"]},{name:"TiddlyWiki",mime:"text/x-tiddlywiki",mode:"tiddlywiki"},{name:"Tiki wiki",mime:"text/tiki",mode:"tiki"},{name:"TOML",mime:"text/x-toml",mode:"toml",ext:["toml"]},{name:"Tornado",mime:"text/x-tornado",mode:"tornado"},{name:"troff",mime:"text/troff",mode:"troff",ext:["1","2","3","4","5","6","7","8","9"]},{name:"TTCN",mime:"text/x-ttcn",mode:"ttcn",ext:["ttcn","ttcn3","ttcnpp"]},{name:"TTCN_CFG",mime:"text/x-ttcn-cfg",mode:"ttcn-cfg",ext:["cfg"]},{name:"Turtle",mime:"text/turtle",mode:"turtle",ext:["ttl"]},{name:"TypeScript",mime:"application/typescript",mode:"javascript",ext:["ts"],alias:["ts"]},{name:"TypeScript-JSX",mime:"text/typescript-jsx",mode:"jsx",ext:["tsx"],alias:["tsx"]},{name:"Twig",mime:"text/x-twig",mode:"twig"},{name:"Web IDL",mime:"text/x-webidl",mode:"webidl",ext:["webidl"]},{name:"VB.NET",mime:"text/x-vb",mode:"vb",ext:["vb"]},{name:"VBScript",mime:"text/vbscript",mode:"vbscript",ext:["vbs"]},{name:"Velocity",mime:"text/velocity",mode:"velocity",ext:["vtl"]},{name:"Verilog",mime:"text/x-verilog",mode:"verilog",ext:["v"]},{name:"VHDL",mime:"text/x-vhdl",mode:"vhdl",ext:["vhd","vhdl"]},{name:"Vue.js Component",mimes:["script/x-vue","text/x-vue"],mode:"vue",ext:["vue"]},{name:"XML",mimes:["application/xml","text/xml"],mode:"xml",ext:["xml","xsl","xsd","svg"],alias:["rss","wsdl","xsd"]},{name:"XQuery",mime:"application/xquery",mode:"xquery",ext:["xy","xquery"]},{name:"Yacas",mime:"text/x-yacas",mode:"yacas",ext:["ys"]},{name:"YAML",mimes:["text/x-yaml","text/yaml"],mode:"yaml",ext:["yaml","yml"],alias:["yml"]},{name:"Z80",mime:"text/x-z80",mode:"z80",ext:["z80"]},{name:"mscgen",mime:"text/x-mscgen",mode:"mscgen",ext:["mscgen","mscin","msc"]},{name:"xu",mime:"text/x-xu",mode:"mscgen",ext:["xu"]},{name:"msgenny",mime:"text/x-msgenny",mode:"mscgen",ext:["msgenny"]},{name:"WebAssembly",mime:"text/webassembly",mode:"wast",ext:["wat","wast"]}];for(var t=0;t-1&&t.substring(r+1,t.length);if(o)return e.findModeByExtension(o)},e.findModeByName=function(t){t=t.toLowerCase();for(var n=0;n")):null:e.match("--")?n(f("comment","--\x3e")):e.match("DOCTYPE",!0,!0)?(e.eatWhile(/[\w\._\-]/),n(p(1))):null:e.eat("?")?(e.eatWhile(/[\w\._\-]/),t.tokenize=f("meta","?>"),"meta"):(o=e.eat("/")?"closeTag":"openTag",t.tokenize=h,"tag bracket"):"&"==i?(e.eat("#")?e.eat("x")?e.eatWhile(/[a-fA-F\d]/)&&e.eat(";"):e.eatWhile(/[\d]/)&&e.eat(";"):e.eatWhile(/[\w\.\-:]/)&&e.eat(";"))?"atom":"error":(e.eatWhile(/[^&<]/),null)}function h(e,t){var n,i,r=e.next();if(">"==r||"/"==r&&e.eat(">"))return t.tokenize=d,o=">"==r?"endTag":"selfcloseTag","tag bracket";if("="==r)return o="equals",null;if("<"==r){t.tokenize=d,t.state=y,t.tagName=t.tagStart=null;var a=t.tokenize(e,t);return a?a+" tag error":"tag error"}return/[\'\"]/.test(r)?(t.tokenize=(n=r,i=function(e,t){for(;!e.eol();)if(e.next()==n){t.tokenize=h;break}return"string"},i.isInAttribute=!0,i),t.stringStartCol=e.column(),t.tokenize(e,t)):(e.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/),"word")}function f(e,t){return function(n,i){for(;!n.eol();){if(n.match(t)){i.tokenize=d;break}n.next()}return e}}function p(e){return function(t,n){for(var i;null!=(i=t.next());){if("<"==i)return n.tokenize=p(e+1),n.tokenize(t,n);if(">"==i){if(1==e){n.tokenize=d;break}return n.tokenize=p(e-1),n.tokenize(t,n)}}return"meta"}}function m(e){return e&&e.toLowerCase()}function g(e,t,n){this.prev=e.context,this.tagName=t||"",this.indent=e.indented,this.startOfLine=n,(s.doNotIndent.hasOwnProperty(t)||e.context&&e.context.noIndent)&&(this.noIndent=!0)}function v(e){e.context&&(e.context=e.context.prev)}function x(e,t){for(var n;;){if(!e.context)return;if(n=e.context.tagName,!s.contextGrabbers.hasOwnProperty(m(n))||!s.contextGrabbers[m(n)].hasOwnProperty(m(t)))return;v(e)}}function y(e,t,n){return"openTag"==e?(n.tagStart=t.column(),b):"closeTag"==e?D:y}function b(e,t,n){return"word"==e?(n.tagName=t.current(),a="tag",k):s.allowMissingTagName&&"endTag"==e?(a="tag bracket",k(e,0,n)):(a="error",b)}function D(e,t,n){if("word"==e){var i=t.current();return n.context&&n.context.tagName!=i&&s.implicitlyClosed.hasOwnProperty(m(n.context.tagName))&&v(n),n.context&&n.context.tagName==i||!1===s.matchClosing?(a="tag",C):(a="tag error",w)}return s.allowMissingTagName&&"endTag"==e?(a="tag bracket",C(e,0,n)):(a="error",w)}function C(e,t,n){return"endTag"!=e?(a="error",C):(v(n),y)}function w(e,t,n){return a="error",C(e,0,n)}function k(e,t,n){if("word"==e)return a="attribute",S;if("endTag"==e||"selfcloseTag"==e){var i=n.tagName,r=n.tagStart;return n.tagName=n.tagStart=null,"selfcloseTag"==e||s.autoSelfClosers.hasOwnProperty(m(i))?x(n,i):(x(n,i),n.context=new g(n,i,r==n.indented)),y}return a="error",k}function S(e,t,n){return"equals"==e?F:(s.allowMissing||(a="error"),k(e,0,n))}function F(e,t,n){return"string"==e?A:"word"==e&&s.allowUnquoted?(a="string",k):(a="error",k(e,0,n))}function A(e,t,n){return"string"==e?A:k(e,0,n)}return d.isInText=!0,{startState:function(e){var t={tokenize:d,state:y,indented:e||0,tagName:null,tagStart:null,context:null};return null!=e&&(t.baseIndent=e),t},token:function(e,t){if(!t.tagName&&e.sol()&&(t.indented=e.indentation()),e.eatSpace())return null;o=null;var n=t.tokenize(e,t);return(n||o)&&"comment"!=n&&(a=null,t.state=t.state(o||n,e,t),a&&(n="error"==a?n+" error":a)),n},indent:function(t,n,i){var r=t.context;if(t.tokenize.isInAttribute)return t.tagStart==t.indented?t.stringStartCol+1:t.indented+l;if(r&&r.noIndent)return e.Pass;if(t.tokenize!=h&&t.tokenize!=d)return i?i.match(/^(\s*)/)[0].length:0;if(t.tagName)return!1!==s.multilineTagIndentPastTag?t.tagStart+t.tagName.length+2:t.tagStart+l*(s.multilineTagIndentFactor||1);if(s.alignCDATA&&/$/,blockCommentStart:"\x3c!--",blockCommentEnd:"--\x3e",configuration:s.htmlMode?"html":"xml",helperType:s.htmlMode?"html":"xml",skipAttribute:function(e){e.state==F&&(e.state=k)},xmlCurrentTag:function(e){return e.tagName?{name:e.tagName,close:"closeTag"==e.type}:null},xmlCurrentContext:function(e){for(var t=[],n=e.context;n;n=n.prev)t.push(n.tagName);return t.reverse()}}})),e.defineMIME("text/xml","xml"),e.defineMIME("application/xml","xml"),e.mimeModes.hasOwnProperty("text/html")||e.defineMIME("text/html",{name:"xml",htmlMode:!0})})("object"==typeof n&&"object"==typeof t?e("../../lib/codemirror"):CodeMirror)},{"../../lib/codemirror":10}],15:[function(e,t,n){!function(e,i){"object"==typeof n&&void 0!==t?i(n):i((e="undefined"!=typeof globalThis?globalThis:e||self).marked={})}(this,(function(e){"use strict";function t(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,i=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function r(){return{async:!1,baseUrl:null,breaks:!1,extensions:null,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}}e.defaults={async:!1,baseUrl:null,breaks:!1,extensions:null,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1};var o=/[&<>"']/,a=/[&<>"']/g,l=/[<>"']|&(?!#?\w+;)/,s=/[<>"']|&(?!#?\w+;)/g,u={"&":"&","<":"<",">":">",'"':""","'":"'"},c=function(e){return u[e]};function d(e,t){if(t){if(o.test(e))return e.replace(a,c)}else if(l.test(e))return e.replace(s,c);return e}var h=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function f(e){return e.replace(h,(function(e,t){return"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""}))}var p=/(^|[^\[])\^/g;function m(e,t){e="string"==typeof e?e:e.source,t=t||"";var n={replace:function(t,i){return i=(i=i.source||i).replace(p,"$1"),e=e.replace(t,i),n},getRegex:function(){return new RegExp(e,t)}};return n}var g=/[^\w:]/g,v=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;function x(e,t,n){if(e){var i;try{i=decodeURIComponent(f(n)).replace(g,"").toLowerCase()}catch(e){return null}if(0===i.indexOf("javascript:")||0===i.indexOf("vbscript:")||0===i.indexOf("data:"))return null}t&&!v.test(n)&&(n=function(e,t){y[" "+e]||(b.test(e)?y[" "+e]=e+"/":y[" "+e]=F(e,"/",!0));var n=-1===(e=y[" "+e]).indexOf(":");return"//"===t.substring(0,2)?n?t:e.replace(D,"$1")+t:"/"===t.charAt(0)?n?t:e.replace(C,"$1")+t:e+t}(t,n));try{n=encodeURI(n).replace(/%25/g,"%")}catch(e){return null}return n}var y={},b=/^[^:]+:\/*[^/]*$/,D=/^([^:]+:)[\s\S]*$/,C=/^([^:]+:\/*[^/]*)[\s\S]*$/;var w={exec:function(){}};function k(e){for(var t,n,i=1;i=0&&"\\"===n[r];)i=!i;return i?"|":" |"})).split(/ \|/),i=0;if(n[0].trim()||n.shift(),n.length>0&&!n[n.length-1].trim()&&n.pop(),n.length>t)n.splice(t);else for(;n.length1;)1&t&&(n+=e),t>>=1,e+=e;return n+e}function L(e,t,n,i){var r=t.href,o=t.title?d(t.title):null,a=e[1].replace(/\\([\[\]])/g,"$1");if("!"!==e[0].charAt(0)){i.state.inLink=!0;var l={type:"link",raw:n,href:r,title:o,text:a,tokens:i.inlineTokens(a)};return i.state.inLink=!1,l}return{type:"image",raw:n,href:r,title:o,text:d(a)}}var T=function(){function t(t){this.options=t||e.defaults}var n=t.prototype;return n.space=function(e){var t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:"space",raw:t[0]}},n.code=function(e){var t=this.rules.block.code.exec(e);if(t){var n=t[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?n:F(n,"\n")}}},n.fences=function(e){var t=this.rules.block.fences.exec(e);if(t){var n=t[0],i=function(e,t){var n=e.match(/^(\s+)(?:```)/);if(null===n)return t;var i=n[1];return t.split("\n").map((function(e){var t=e.match(/^\s+/);return null===t?e:t[0].length>=i.length?e.slice(i.length):e})).join("\n")}(n,t[3]||"");return{type:"code",raw:n,lang:t[2]?t[2].trim():t[2],text:i}}},n.heading=function(e){var t=this.rules.block.heading.exec(e);if(t){var n=t[2].trim();if(/#$/.test(n)){var i=F(n,"#");this.options.pedantic?n=i.trim():i&&!/ $/.test(i)||(n=i.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}},n.hr=function(e){var t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:t[0]}},n.blockquote=function(e){var t=this.rules.block.blockquote.exec(e);if(t){var n=t[0].replace(/^ *>[ \t]?/gm,"");return{type:"blockquote",raw:t[0],tokens:this.lexer.blockTokens(n,[]),text:n}}},n.list=function(e){var t=this.rules.block.list.exec(e);if(t){var n,r,o,a,l,s,u,c,d,h,f,p,m=t[1].trim(),g=m.length>1,v={type:"list",raw:"",ordered:g,start:g?+m.slice(0,-1):"",loose:!1,items:[]};m=g?"\\d{1,9}\\"+m.slice(-1):"\\"+m,this.options.pedantic&&(m=g?m:"[*+-]");for(var x=new RegExp("^( {0,3}"+m+")((?:[\t ][^\\n]*)?(?:\\n|$))");e&&(p=!1,t=x.exec(e))&&!this.rules.block.hr.test(e);){if(n=t[0],e=e.substring(n.length),c=t[2].split("\n",1)[0],d=e.split("\n",1)[0],this.options.pedantic?(a=2,f=c.trimLeft()):(a=(a=t[2].search(/[^ ]/))>4?1:a,f=c.slice(a),a+=t[1].length),s=!1,!c&&/^ *$/.test(d)&&(n+=d+"\n",e=e.substring(d.length+1),p=!0),!p)for(var y=new RegExp("^ {0,"+Math.min(3,a-1)+"}(?:[*+-]|\\d{1,9}[.)])((?: [^\\n]*)?(?:\\n|$))"),b=new RegExp("^ {0,"+Math.min(3,a-1)+"}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)"),D=new RegExp("^ {0,"+Math.min(3,a-1)+"}(?:```|~~~)"),C=new RegExp("^ {0,"+Math.min(3,a-1)+"}#");e&&(c=h=e.split("\n",1)[0],this.options.pedantic&&(c=c.replace(/^ {1,4}(?=( {4})*[^ ])/g," ")),!D.test(c))&&!C.test(c)&&!y.test(c)&&!b.test(e);){if(c.search(/[^ ]/)>=a||!c.trim())f+="\n"+c.slice(a);else{if(s)break;f+="\n"+c}s||c.trim()||(s=!0),n+=h+"\n",e=e.substring(h.length+1)}v.loose||(u?v.loose=!0:/\n *\n *$/.test(n)&&(u=!0)),this.options.gfm&&(r=/^\[[ xX]\] /.exec(f))&&(o="[ ] "!==r[0],f=f.replace(/^\[[ xX]\] +/,"")),v.items.push({type:"list_item",raw:n,task:!!r,checked:o,loose:!1,text:f}),v.raw+=n}v.items[v.items.length-1].raw=n.trimRight(),v.items[v.items.length-1].text=f.trimRight(),v.raw=v.raw.trimRight();var w=v.items.length;for(l=0;l1)return!0}return!1}));!v.loose&&k.length&&S&&(v.loose=!0,v.items[l].loose=!0)}return v}},n.html=function(e){var t=this.rules.block.html.exec(e);if(t){var n={type:"html",raw:t[0],pre:!this.options.sanitizer&&("pre"===t[1]||"script"===t[1]||"style"===t[1]),text:t[0]};if(this.options.sanitize){var i=this.options.sanitizer?this.options.sanitizer(t[0]):d(t[0]);n.type="paragraph",n.text=i,n.tokens=this.lexer.inline(i)}return n}},n.def=function(e){var t=this.rules.block.def.exec(e);if(t)return t[3]&&(t[3]=t[3].substring(1,t[3].length-1)),{type:"def",tag:t[1].toLowerCase().replace(/\s+/g," "),raw:t[0],href:t[2],title:t[3]}},n.table=function(e){var t=this.rules.block.table.exec(e);if(t){var n={type:"table",header:S(t[1]).map((function(e){return{text:e}})),align:t[2].replace(/^ *|\| *$/g,"").split(/ *\| */),rows:t[3]&&t[3].trim()?t[3].replace(/\n[ \t]*$/,"").split("\n"):[]};if(n.header.length===n.align.length){n.raw=t[0];var i,r,o,a,l=n.align.length;for(i=0;i/i.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:this.options.sanitize?"text":"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(t[0]):d(t[0]):t[0]}},n.link=function(e){var t=this.rules.inline.link.exec(e);if(t){var n=t[2].trim();if(!this.options.pedantic&&/^$/.test(n))return;var i=F(n.slice(0,-1),"\\");if((n.length-i.length)%2==0)return}else{var r=function(e,t){if(-1===e.indexOf(t[1]))return-1;for(var n=e.length,i=0,r=0;r-1){var o=(0===t[0].indexOf("!")?5:4)+t[1].length+r;t[2]=t[2].substring(0,r),t[0]=t[0].substring(0,o).trim(),t[3]=""}}var a=t[2],l="";if(this.options.pedantic){var s=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(a);s&&(a=s[1],l=s[3])}else l=t[3]?t[3].slice(1,-1):"";return a=a.trim(),/^$/.test(n)?a.slice(1):a.slice(1,-1)),L(t,{href:a?a.replace(this.rules.inline._escapes,"$1"):a,title:l?l.replace(this.rules.inline._escapes,"$1"):l},t[0],this.lexer)}},n.reflink=function(e,t){var n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){var i=(n[2]||n[1]).replace(/\s+/g," ");if(!(i=t[i.toLowerCase()])||!i.href){var r=n[0].charAt(0);return{type:"text",raw:r,text:r}}return L(n,i,n[0],this.lexer)}},n.emStrong=function(e,t,n){void 0===n&&(n="");var i=this.rules.inline.emStrong.lDelim.exec(e);if(i&&(!i[3]||!n.match(/(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDF70-\uDF81\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDE70-\uDEBE\uDEC0-\uDEC9\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD837[\uDF00-\uDF1E]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])/))){var r=i[1]||i[2]||"";if(!r||r&&(""===n||this.rules.inline.punctuation.exec(n))){var o,a,l=i[0].length-1,s=l,u=0,c="*"===i[0][0]?this.rules.inline.emStrong.rDelimAst:this.rules.inline.emStrong.rDelimUnd;for(c.lastIndex=0,t=t.slice(-1*e.length+l);null!=(i=c.exec(t));)if(o=i[1]||i[2]||i[3]||i[4]||i[5]||i[6])if(a=o.length,i[3]||i[4])s+=a;else if(!((i[5]||i[6])&&l%3)||(l+a)%3){if(!((s-=a)>0)){if(a=Math.min(a,a+s+u),Math.min(l,a)%2){var d=e.slice(1,l+i.index+a);return{type:"em",raw:e.slice(0,l+i.index+a+1),text:d,tokens:this.lexer.inlineTokens(d)}}var h=e.slice(2,l+i.index+a-1);return{type:"strong",raw:e.slice(0,l+i.index+a+1),text:h,tokens:this.lexer.inlineTokens(h)}}}else u+=a}}},n.codespan=function(e){var t=this.rules.inline.code.exec(e);if(t){var n=t[2].replace(/\n/g," "),i=/[^ ]/.test(n),r=/^ /.test(n)&&/ $/.test(n);return i&&r&&(n=n.substring(1,n.length-1)),n=d(n,!0),{type:"codespan",raw:t[0],text:n}}},n.br=function(e){var t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}},n.del=function(e){var t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}},n.autolink=function(e,t){var n,i,r=this.rules.inline.autolink.exec(e);if(r)return i="@"===r[2]?"mailto:"+(n=d(this.options.mangle?t(r[1]):r[1])):n=d(r[1]),{type:"link",raw:r[0],text:n,href:i,tokens:[{type:"text",raw:n,text:n}]}},n.url=function(e,t){var n;if(n=this.rules.inline.url.exec(e)){var i,r;if("@"===n[2])r="mailto:"+(i=d(this.options.mangle?t(n[0]):n[0]));else{var o;do{o=n[0],n[0]=this.rules.inline._backpedal.exec(n[0])[0]}while(o!==n[0]);i=d(n[0]),r="www."===n[1]?"http://"+i:i}return{type:"link",raw:n[0],text:i,href:r,tokens:[{type:"text",raw:i,text:i}]}}},n.inlineText=function(e,t){var n,i=this.rules.inline.text.exec(e);if(i)return n=this.lexer.state.inRawBlock?this.options.sanitize?this.options.sanitizer?this.options.sanitizer(i[0]):d(i[0]):i[0]:d(this.options.smartypants?t(i[0]):i[0]),{type:"text",raw:i[0],text:n}},t}(),M={newline:/^(?: *(?:\n|$))+/,code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?=\n|$)|$)/,hr:/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/,html:"^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))",def:/^ {0,3}\[(label)\]: *(?:\n *)?]+)>?(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/,table:w,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\.|[^\[\]\\])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};M.def=m(M.def).replace("label",M._label).replace("title",M._title).getRegex(),M.bullet=/(?:[*+-]|\d{1,9}[.)])/,M.listItemStart=m(/^( *)(bull) */).replace("bull",M.bullet).getRegex(),M.list=m(M.list).replace(/bull/g,M.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+M.def.source+")").getRegex(),M._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",M._comment=/|$)/,M.html=m(M.html,"i").replace("comment",M._comment).replace("tag",M._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),M.paragraph=m(M._paragraph).replace("hr",M.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",M._tag).getRegex(),M.blockquote=m(M.blockquote).replace("paragraph",M.paragraph).getRegex(),M.normal=k({},M),M.gfm=k({},M.normal,{table:"^ *([^\\n ].*\\|.*)\\n {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),M.gfm.table=m(M.gfm.table).replace("hr",M.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",M._tag).getRegex(),M.gfm.paragraph=m(M._paragraph).replace("hr",M.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("table",M.gfm.table).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",M._tag).getRegex(),M.pedantic=k({},M.normal,{html:m("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",M._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:w,paragraph:m(M.normal._paragraph).replace("hr",M.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",M.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});var B={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:w,tag:"^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(ref)\]/,nolink:/^!?\[(ref)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",emStrong:{lDelim:/^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,rDelimAst:/^[^_*]*?\_\_[^_*]*?\*[^_*]*?(?=\_\_)|[^*]+(?=[^*])|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/,rDelimUnd:/^[^_*]*?\*\*[^_*]*?\_[^_*]*?(?=\*\*)|[^_]+(?=[^_])|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:w,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\.5&&(n="x"+n.toString(16)),i+="&#"+n+";";return i}B._punctuation="!\"#$%&'()+\\-.,/:;<=>?@\\[\\]`^{|}~",B.punctuation=m(B.punctuation).replace(/punctuation/g,B._punctuation).getRegex(),B.blockSkip=/\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g,B.escapedEmSt=/\\\*|\\_/g,B._comment=m(M._comment).replace("(?:--\x3e|$)","--\x3e").getRegex(),B.emStrong.lDelim=m(B.emStrong.lDelim).replace(/punct/g,B._punctuation).getRegex(),B.emStrong.rDelimAst=m(B.emStrong.rDelimAst,"g").replace(/punct/g,B._punctuation).getRegex(),B.emStrong.rDelimUnd=m(B.emStrong.rDelimUnd,"g").replace(/punct/g,B._punctuation).getRegex(),B._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,B._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,B._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,B.autolink=m(B.autolink).replace("scheme",B._scheme).replace("email",B._email).getRegex(),B._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,B.tag=m(B.tag).replace("comment",B._comment).replace("attribute",B._attribute).getRegex(),B._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,B._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/,B._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,B.link=m(B.link).replace("label",B._label).replace("href",B._href).replace("title",B._title).getRegex(),B.reflink=m(B.reflink).replace("label",B._label).replace("ref",M._label).getRegex(),B.nolink=m(B.nolink).replace("ref",M._label).getRegex(),B.reflinkSearch=m(B.reflinkSearch,"g").replace("reflink",B.reflink).replace("nolink",B.nolink).getRegex(),B.normal=k({},B),B.pedantic=k({},B.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:m(/^!?\[(label)\]\((.*?)\)/).replace("label",B._label).getRegex(),reflink:m(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",B._label).getRegex()}),B.gfm=k({},B.normal,{escape:m(B.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\0?t[t.length-1].raw+="\n":t.push(n);else if(n=this.tokenizer.code(e))e=e.substring(n.raw.length),!(i=t[t.length-1])||"paragraph"!==i.type&&"text"!==i.type?t.push(n):(i.raw+="\n"+n.raw,i.text+="\n"+n.text,this.inlineQueue[this.inlineQueue.length-1].src=i.text);else if(n=this.tokenizer.fences(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.heading(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.hr(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.blockquote(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.list(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.html(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.def(e))e=e.substring(n.raw.length),!(i=t[t.length-1])||"paragraph"!==i.type&&"text"!==i.type?this.tokens.links[n.tag]||(this.tokens.links[n.tag]={href:n.href,title:n.title}):(i.raw+="\n"+n.raw,i.text+="\n"+n.raw,this.inlineQueue[this.inlineQueue.length-1].src=i.text);else if(n=this.tokenizer.table(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.lheading(e))e=e.substring(n.raw.length),t.push(n);else if(r=e,this.options.extensions&&this.options.extensions.startBlock&&function(){var t=1/0,n=e.slice(1),i=void 0;a.options.extensions.startBlock.forEach((function(e){"number"==typeof(i=e.call({lexer:this},n))&&i>=0&&(t=Math.min(t,i))})),t<1/0&&t>=0&&(r=e.substring(0,t+1))}(),this.state.top&&(n=this.tokenizer.paragraph(r)))i=t[t.length-1],o&&"paragraph"===i.type?(i.raw+="\n"+n.raw,i.text+="\n"+n.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=i.text):t.push(n),o=r.length!==e.length,e=e.substring(n.raw.length);else if(n=this.tokenizer.text(e))e=e.substring(n.raw.length),(i=t[t.length-1])&&"text"===i.type?(i.raw+="\n"+n.raw,i.text+="\n"+n.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=i.text):t.push(n);else if(e){var l="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(l);break}throw new Error(l)}return this.state.top=!0,t},a.inline=function(e,t){return void 0===t&&(t=[]),this.inlineQueue.push({src:e,tokens:t}),t},a.inlineTokens=function(e,t){var n,i,r,o=this;void 0===t&&(t=[]);var a,l,s,u=e;if(this.tokens.links){var c=Object.keys(this.tokens.links);if(c.length>0)for(;null!=(a=this.tokenizer.rules.inline.reflinkSearch.exec(u));)c.includes(a[0].slice(a[0].lastIndexOf("[")+1,-1))&&(u=u.slice(0,a.index)+"["+E("a",a[0].length-2)+"]"+u.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;null!=(a=this.tokenizer.rules.inline.blockSkip.exec(u));)u=u.slice(0,a.index)+"["+E("a",a[0].length-2)+"]"+u.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;null!=(a=this.tokenizer.rules.inline.escapedEmSt.exec(u));)u=u.slice(0,a.index)+"++"+u.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex);for(;e;)if(l||(s=""),l=!1,!(this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some((function(i){return!!(n=i.call({lexer:o},e,t))&&(e=e.substring(n.raw.length),t.push(n),!0)}))))if(n=this.tokenizer.escape(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.tag(e))e=e.substring(n.raw.length),(i=t[t.length-1])&&"text"===n.type&&"text"===i.type?(i.raw+=n.raw,i.text+=n.text):t.push(n);else if(n=this.tokenizer.link(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.reflink(e,this.tokens.links))e=e.substring(n.raw.length),(i=t[t.length-1])&&"text"===n.type&&"text"===i.type?(i.raw+=n.raw,i.text+=n.text):t.push(n);else if(n=this.tokenizer.emStrong(e,u,s))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.codespan(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.br(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.del(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.autolink(e,O))e=e.substring(n.raw.length),t.push(n);else if(this.state.inLink||!(n=this.tokenizer.url(e,O))){if(r=e,this.options.extensions&&this.options.extensions.startInline&&function(){var t=1/0,n=e.slice(1),i=void 0;o.options.extensions.startInline.forEach((function(e){"number"==typeof(i=e.call({lexer:this},n))&&i>=0&&(t=Math.min(t,i))})),t<1/0&&t>=0&&(r=e.substring(0,t+1))}(),n=this.tokenizer.inlineText(r,N))e=e.substring(n.raw.length),"_"!==n.raw.slice(-1)&&(s=n.raw.slice(-1)),l=!0,(i=t[t.length-1])&&"text"===i.type?(i.raw+=n.raw,i.text+=n.text):t.push(n);else if(e){var d="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(d);break}throw new Error(d)}}else e=e.substring(n.raw.length),t.push(n);return t},i=n,o=[{key:"rules",get:function(){return{block:M,inline:B}}}],(r=null)&&t(i.prototype,r),o&&t(i,o),Object.defineProperty(i,"prototype",{writable:!1}),n}(),z=function(){function t(t){this.options=t||e.defaults}var n=t.prototype;return n.code=function(e,t,n){var i=(t||"").match(/\S*/)[0];if(this.options.highlight){var r=this.options.highlight(e,i);null!=r&&r!==e&&(n=!0,e=r)}return e=e.replace(/\n$/,"")+"\n",i?'
'+(n?e:d(e,!0))+"
\n":"
"+(n?e:d(e,!0))+"
\n"},n.blockquote=function(e){return"
\n"+e+"
\n"},n.html=function(e){return e},n.heading=function(e,t,n,i){return this.options.headerIds?"'+e+"\n":""+e+"\n"},n.hr=function(){return this.options.xhtml?"
\n":"
\n"},n.list=function(e,t,n){var i=t?"ol":"ul";return"<"+i+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+"\n"},n.listitem=function(e){return"
  • "+e+"
  • \n"},n.checkbox=function(e){return" "},n.paragraph=function(e){return"

    "+e+"

    \n"},n.table=function(e,t){return t&&(t=""+t+""),"\n\n"+e+"\n"+t+"
    \n"},n.tablerow=function(e){return"\n"+e+"\n"},n.tablecell=function(e,t){var n=t.header?"th":"td";return(t.align?"<"+n+' align="'+t.align+'">':"<"+n+">")+e+"\n"},n.strong=function(e){return""+e+""},n.em=function(e){return""+e+""},n.codespan=function(e){return""+e+""},n.br=function(){return this.options.xhtml?"
    ":"
    "},n.del=function(e){return""+e+""},n.link=function(e,t,n){if(null===(e=x(this.options.sanitize,this.options.baseUrl,e)))return n;var i='"},n.image=function(e,t,n){if(null===(e=x(this.options.sanitize,this.options.baseUrl,e)))return n;var i=''+n+'":">"},n.text=function(e){return e},t}(),H=function(){function e(){}var t=e.prototype;return t.strong=function(e){return e},t.em=function(e){return e},t.codespan=function(e){return e},t.del=function(e){return e},t.html=function(e){return e},t.text=function(e){return e},t.link=function(e,t,n){return""+n},t.image=function(e,t,n){return""+n},t.br=function(){return""},e}(),R=function(){function e(){this.seen={}}var t=e.prototype;return t.serialize=function(e){return e.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")},t.getNextSafeSlug=function(e,t){var n=e,i=0;if(this.seen.hasOwnProperty(n)){i=this.seen[e];do{n=e+"-"+ ++i}while(this.seen.hasOwnProperty(n))}return t||(this.seen[e]=i,this.seen[n]=0),n},t.slug=function(e,t){void 0===t&&(t={});var n=this.serialize(e);return this.getNextSafeSlug(n,t.dryrun)},e}(),P=function(){function t(t){this.options=t||e.defaults,this.options.renderer=this.options.renderer||new z,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new H,this.slugger=new R}t.parse=function(e,n){return new t(n).parse(e)},t.parseInline=function(e,n){return new t(n).parseInline(e)};var n=t.prototype;return n.parse=function(e,t){void 0===t&&(t=!0);var n,i,r,o,a,l,s,u,c,d,h,p,m,g,v,x,y,b,D,C="",w=e.length;for(n=0;n0&&"paragraph"===v.tokens[0].type?(v.tokens[0].text=b+" "+v.tokens[0].text,v.tokens[0].tokens&&v.tokens[0].tokens.length>0&&"text"===v.tokens[0].tokens[0].type&&(v.tokens[0].tokens[0].text=b+" "+v.tokens[0].tokens[0].text)):v.tokens.unshift({type:"text",text:b}):g+=b),g+=this.parse(v.tokens,m),c+=this.renderer.listitem(g,y,x);C+=this.renderer.list(c,h,p);continue;case"html":C+=this.renderer.html(d.text);continue;case"paragraph":C+=this.renderer.paragraph(this.parseInline(d.tokens));continue;case"text":for(c=d.tokens?this.parseInline(d.tokens):d.text;n+1An error occurred:

    "+d(e.message+"",!0)+"
    ";throw e}try{var s=I.lex(e,t);if(t.walkTokens){if(t.async)return Promise.all(_.walkTokens(s,t.walkTokens)).then((function(){return P.parse(s,t)})).catch(l);_.walkTokens(s,t.walkTokens)}return P.parse(s,t)}catch(e){l(e)}}_.options=_.setOptions=function(t){var n;return k(_.defaults,t),n=_.defaults,e.defaults=n,_},_.getDefaults=r,_.defaults=e.defaults,_.use=function(){for(var e=arguments.length,t=new Array(e),n=0;nAn error occurred:

    "+d(e.message+"",!0)+"
    ";throw e}},_.Parser=P,_.parser=P.parse,_.Renderer=z,_.TextRenderer=H,_.Lexer=I,_.lexer=I.lex,_.Tokenizer=T,_.Slugger=R,_.parse=_;var W=_.options,j=_.setOptions,q=_.use,U=_.walkTokens,$=_.parseInline,G=_,V=P.parse,X=I.lex;e.Lexer=I,e.Parser=P,e.Renderer=z,e.Slugger=R,e.TextRenderer=H,e.Tokenizer=T,e.getDefaults=r,e.lexer=X,e.marked=_,e.options=W,e.parse=G,e.parseInline=$,e.parser=V,e.setOptions=j,e.use=q,e.walkTokens=U,Object.defineProperty(e,"__esModule",{value:!0})}))},{}],16:[function(e,t,n){(function(n){(function(){var i;!function(){"use strict";(i=function(e,t,i,r){r=r||{},this.dictionary=null,this.rules={},this.dictionaryTable={},this.compoundRules=[],this.compoundRuleCodes={},this.replacementTable=[],this.flags=r.flags||{},this.memoized={},this.loaded=!1;var o,a,l,s,u,c=this;function d(e,t){var n=c._readFile(e,null,r.asyncLoad);r.asyncLoad?n.then((function(e){t(e)})):t(n)}function h(e){t=e,i&&p()}function f(e){i=e,t&&p()}function p(){for(c.rules=c._parseAFF(t),c.compoundRuleCodes={},a=0,s=c.compoundRules.length;a0&&(b.continuationClasses=x),"."!==y&&(b.match="SFX"===d?new RegExp(y+"$"):new RegExp("^"+y)),"0"!=m&&(b.remove="SFX"===d?new RegExp(m+"$"):m),p.push(b)}s[h]={type:d,combineable:"Y"==f,entries:p},r+=n}else if("COMPOUNDRULE"===d){for(o=r+1,l=r+1+(n=parseInt(c[1],10));o0&&(null===n[e]&&(n[e]=[]),n[e].push(t))}for(var r=1,o=t.length;r1){var u=this.parseRuleCodes(l[1]);"NEEDAFFIX"in this.flags&&-1!=u.indexOf(this.flags.NEEDAFFIX)||i(s,u);for(var c=0,d=u.length;c=this.flags.COMPOUNDMIN)for(t=0,n=this.compoundRules.length;t1&&c[1][1]!==c[1][0]&&(o=c[0]+c[1][1]+c[1][0]+c[1].substring(2),t&&!l.check(o)||(o in a?a[o]+=1:a[o]=1)),c[1]){var d=c[1].substring(0,1).toUpperCase()===c[1].substring(0,1)?"uppercase":"lowercase";for(i=0;ii?1:t[0].localeCompare(e[0])})).reverse();var u=[],c="lowercase";e.toUpperCase()===e?c="uppercase":e.substr(0,1).toUpperCase()+e.substr(1).toLowerCase()===e&&(c="capitalized");var d=t;for(n=0;n)+?/g),s={toggleBold:x,toggleItalic:y,drawLink:O,toggleHeadingSmaller:w,toggleHeadingBigger:k,drawImage:I,toggleBlockquote:C,toggleOrderedList:B,toggleUnorderedList:M,toggleCodeBlock:D,togglePreview:U,toggleStrikethrough:b,toggleHeading1:S,toggleHeading2:F,toggleHeading3:A,toggleHeading4:E,toggleHeading5:L,toggleHeading6:T,cleanBlock:N,drawTable:P,drawHorizontalRule:_,undo:W,redo:j,toggleSideBySide:q,toggleFullScreen:v},u={toggleBold:"Cmd-B",toggleItalic:"Cmd-I",drawLink:"Cmd-K",toggleHeadingSmaller:"Cmd-H",toggleHeadingBigger:"Shift-Cmd-H",toggleHeading1:"Ctrl+Alt+1",toggleHeading2:"Ctrl+Alt+2",toggleHeading3:"Ctrl+Alt+3",toggleHeading4:"Ctrl+Alt+4",toggleHeading5:"Ctrl+Alt+5",toggleHeading6:"Ctrl+Alt+6",cleanBlock:"Cmd-E",drawImage:"Cmd-Alt-I",toggleBlockquote:"Cmd-'",toggleOrderedList:"Cmd-Alt-L",toggleUnorderedList:"Cmd-L",toggleCodeBlock:"Cmd-Alt-C",togglePreview:"Cmd-P",toggleSideBySide:"F9",toggleFullScreen:"F11"},c=function(){var e,t=!1;return e=navigator.userAgent||navigator.vendor||window.opera,(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(e)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(e.substr(0,4)))&&(t=!0),t};function d(e){return e=a?e.replace("Ctrl","Cmd"):e.replace("Cmd","Ctrl")}function h(e,t,n,i){var r=f(e,!1,t,n,"button",i);r.classList.add("easymde-dropdown"),r.onclick=function(){r.focus()};var o=document.createElement("div");o.className="easymde-dropdown-content";for(var a=0;a0){for(var g=document.createElement("i"),v=0;v=0&&!n(h=s.getLineHandle(o));o--);var g,v,x,y,b=i(s.getTokenAt({line:o,ch:1})).fencedChars;n(s.getLineHandle(u.line))?(g="",v=u.line):n(s.getLineHandle(u.line-1))?(g="",v=u.line-1):(g=b+"\n",v=u.line),n(s.getLineHandle(c.line))?(x="",y=c.line,0===c.ch&&(y+=1)):0!==c.ch&&n(s.getLineHandle(c.line+1))?(x="",y=c.line+1):(x=b+"\n",y=c.line+1),0===c.ch&&(y-=1),s.operation((function(){s.replaceRange(x,{line:y,ch:0},{line:y+(x?0:1),ch:0}),s.replaceRange(g,{line:v,ch:0},{line:v+(g?0:1),ch:0})})),s.setSelection({line:v+(g?1:0),ch:0},{line:y+(g?1:-1),ch:0}),s.focus()}else{var D=u.line;if(n(s.getLineHandle(u.line))&&("fenced"===r(s,u.line+1)?(o=u.line,D=u.line+1):(a=u.line,D=u.line-1)),void 0===o)for(o=D;o>=0&&!n(h=s.getLineHandle(o));o--);if(void 0===a)for(l=s.lineCount(),a=D;a=0;o--)if(!(h=s.getLineHandle(o)).text.match(/^\s*$/)&&"indented"!==r(s,o,h)){o+=1;break}for(l=s.lineCount(),a=u.line;a ]+|[0-9]+(.|\)))[ ]*/,""),e.replaceRange(t,{line:r,ch:0},{line:r,ch:99999999999999})}(e.codemirror)}function O(e){var t=e.options,n="https://";if(t.promptURLs){var i=prompt(t.promptTexts.link,n);if(!i)return!1;n=z(i)}X(e,"link",t.insertTexts.link,n)}function I(e){var t=e.options,n="https://";if(t.promptURLs){var i=prompt(t.promptTexts.image,n);if(!i)return!1;n=z(i)}X(e,"image",t.insertTexts.image,n)}function z(e){return encodeURI(e).replace(/([\\()])/g,"\\$1")}function H(e){e.openBrowseFileWindow()}function R(e,t){var n=e.codemirror,i=m(n),r=e.options,o=t.substr(t.lastIndexOf("/")+1),a=o.substring(o.lastIndexOf(".")+1).replace(/\?.*$/,"").toLowerCase();if(["png","jpg","jpeg","gif","svg","apng","avif","webp"].includes(a))$(n,i.image,r.insertTexts.uploadedImage,t);else{var l=r.insertTexts.link;l[0]="["+o,$(n,i.link,l,t)}e.updateStatusBar("upload-image",e.options.imageTexts.sbOnUploaded.replace("#image_name#",o)),setTimeout((function(){e.updateStatusBar("upload-image",e.options.imageTexts.sbInit)}),1e3)}function P(e){var t=e.codemirror,n=m(t),i=e.options;$(t,n.table,i.insertTexts.table)}function _(e){var t=e.codemirror,n=m(t),i=e.options;$(t,n.image,i.insertTexts.horizontalRule)}function W(e){var t=e.codemirror;t.undo(),t.focus()}function j(e){var t=e.codemirror;t.redo(),t.focus()}function q(e){var t=e.codemirror,n=t.getWrapperElement(),i=n.nextSibling,r=e.toolbarElements&&e.toolbarElements["side-by-side"],o=!1,a=n.parentNode;i.classList.contains("editor-preview-active-side")?(!1===e.options.sideBySideFullscreen&&a.classList.remove("sided--no-fullscreen"),i.classList.remove("editor-preview-active-side"),r&&r.classList.remove("active"),n.classList.remove("CodeMirror-sided")):(setTimeout((function(){t.getOption("fullScreen")||(!1===e.options.sideBySideFullscreen?a.classList.add("sided--no-fullscreen"):v(e)),i.classList.add("editor-preview-active-side")}),1),r&&r.classList.add("active"),n.classList.add("CodeMirror-sided"),o=!0);var l=n.lastChild;if(l.classList.contains("editor-preview-active")){l.classList.remove("editor-preview-active");var s=e.toolbarElements.preview,u=e.toolbar_div;s.classList.remove("active"),u.classList.remove("disabled-for-preview")}if(t.sideBySideRenderingFunction||(t.sideBySideRenderingFunction=function(){var t=e.options.previewRender(e.value(),i);null!=t&&(i.innerHTML=t)}),o){var c=e.options.previewRender(e.value(),i);null!=c&&(i.innerHTML=c),t.on("update",t.sideBySideRenderingFunction)}else t.off("update",t.sideBySideRenderingFunction);t.refresh()}function U(e){var t=e.codemirror,n=t.getWrapperElement(),i=e.toolbar_div,r=!!e.options.toolbar&&e.toolbarElements.preview,o=n.lastChild;if(t.getWrapperElement().nextSibling.classList.contains("editor-preview-active-side")&&q(e),!o||!o.classList.contains("editor-preview-full")){if((o=document.createElement("div")).className="editor-preview-full",e.options.previewClass)if(Array.isArray(e.options.previewClass))for(var a=0;a\s+/,"unordered-list":i,"ordered-list":i},u=function(e,t,o){var a=i.exec(t),l=function(e,t){return{quote:">","unordered-list":n,"ordered-list":"%%i."}[e].replace("%%i",t)}(e,c);return null!==a?(function(e,t){var i=new RegExp({quote:">","unordered-list":"\\"+n,"ordered-list":"\\d+."}[e]);return t&&i.test(t)}(e,a[2])&&(l=""),t=a[1]+l+a[3]+t.replace(r,"").replace(s[e],"$1")):0==o&&(t=l+" "+t),t},c=1,d=a.line;d<=l.line;d++)!function(n){var i=e.getLine(n);o[t]?i=i.replace(s[t],"$1"):("unordered-list"==t&&(i=u("ordered-list",i,!0)),i=u(t,i,!1),c+=1),e.replaceRange(i,{line:n,ch:0},{line:n,ch:99999999999999})}(d);e.focus()}}function X(e,t,n,i){if(e.codemirror&&!e.isPreviewActive()){var r=e.codemirror,o=m(r)[t];if(o){var a=r.getCursor("start"),l=r.getCursor("end"),s=r.getLine(a.line),u=s.slice(0,a.ch),c=s.slice(a.ch);"link"==t?u=u.replace(/(.*)[^!]\[/,"$1"):"image"==t&&(u=u.replace(/(.*)!\[$/,"$1")),c=c.replace(/]\(.*?\)/,""),r.replaceRange(u+c,{line:a.line,ch:0},{line:a.line,ch:99999999999999}),a.ch-=n[0].length,a!==l&&(l.ch-=n[0].length),r.setSelection(a,l),r.focus()}else $(r,o,n,i)}}function K(e,t,n,i){if(e.codemirror&&!e.isPreviewActive()){i=void 0===i?n:i;var r,o=e.codemirror,a=m(o),l=n,s=i,u=o.getCursor("start"),c=o.getCursor("end");a[t]?(l=(r=o.getLine(u.line)).slice(0,u.ch),s=r.slice(u.ch),"bold"==t?(l=l.replace(/(\*\*|__)(?![\s\S]*(\*\*|__))/,""),s=s.replace(/(\*\*|__)/,"")):"italic"==t?(l=l.replace(/(\*|_)(?![\s\S]*(\*|_))/,""),s=s.replace(/(\*|_)/,"")):"strikethrough"==t&&(l=l.replace(/(\*\*|~~)(?![\s\S]*(\*\*|~~))/,""),s=s.replace(/(\*\*|~~)/,"")),o.replaceRange(l+s,{line:u.line,ch:0},{line:u.line,ch:99999999999999}),"bold"==t||"strikethrough"==t?(u.ch-=2,u!==c&&(c.ch-=2)):"italic"==t&&(u.ch-=1,u!==c&&(c.ch-=1))):(r=o.getSelection(),"bold"==t?r=(r=r.split("**").join("")).split("__").join(""):"italic"==t?r=(r=r.split("*").join("")).split("_").join(""):"strikethrough"==t&&(r=r.split("~~").join("")),o.replaceSelection(l+r+s),u.ch+=n.length,c.ch=u.ch+r.length),o.setSelection(u,c),o.focus()}}function Z(e,t){if(Math.abs(e)<1024)return""+e+t[0];var n=0;do{e/=1024,++n}while(Math.abs(e)>=1024&&n=19968?n+=t[i].length:n+=1;return n}var ee={bold:"fa fa-bold",italic:"fa fa-italic",strikethrough:"fa fa-strikethrough",heading:"fa fa-header fa-heading","heading-smaller":"fa fa-header fa-heading header-smaller","heading-bigger":"fa fa-header fa-heading header-bigger","heading-1":"fa fa-header fa-heading header-1","heading-2":"fa fa-header fa-heading header-2","heading-3":"fa fa-header fa-heading header-3",code:"fa fa-code",quote:"fa fa-quote-left","ordered-list":"fa fa-list-ol","unordered-list":"fa fa-list-ul","clean-block":"fa fa-eraser",link:"fa fa-link",image:"fa fa-image","upload-image":"fa fa-image",table:"fa fa-table","horizontal-rule":"fa fa-minus",preview:"fa fa-eye","side-by-side":"fa fa-columns",fullscreen:"fa fa-arrows-alt",guide:"fa fa-question-circle",undo:"fa fa-undo",redo:"fa fa-repeat fa-redo"},te={bold:{name:"bold",action:x,className:ee.bold,title:"Bold",default:!0},italic:{name:"italic",action:y,className:ee.italic,title:"Italic",default:!0},strikethrough:{name:"strikethrough",action:b,className:ee.strikethrough,title:"Strikethrough"},heading:{name:"heading",action:w,className:ee.heading,title:"Heading",default:!0},"heading-smaller":{name:"heading-smaller",action:w,className:ee["heading-smaller"],title:"Smaller Heading"},"heading-bigger":{name:"heading-bigger",action:k,className:ee["heading-bigger"],title:"Bigger Heading"},"heading-1":{name:"heading-1",action:S,className:ee["heading-1"],title:"Big Heading"},"heading-2":{name:"heading-2",action:F,className:ee["heading-2"],title:"Medium Heading"},"heading-3":{name:"heading-3",action:A,className:ee["heading-3"],title:"Small Heading"},"separator-1":{name:"separator-1"},code:{name:"code",action:D,className:ee.code,title:"Code"},quote:{name:"quote",action:C,className:ee.quote,title:"Quote",default:!0},"unordered-list":{name:"unordered-list",action:M,className:ee["unordered-list"],title:"Generic List",default:!0},"ordered-list":{name:"ordered-list",action:B,className:ee["ordered-list"],title:"Numbered List",default:!0},"clean-block":{name:"clean-block",action:N,className:ee["clean-block"],title:"Clean block"},"separator-2":{name:"separator-2"},link:{name:"link",action:O,className:ee.link,title:"Create Link",default:!0},image:{name:"image",action:I,className:ee.image,title:"Insert Image",default:!0},"upload-image":{name:"upload-image",action:H,className:ee["upload-image"],title:"Import an image"},table:{name:"table",action:P,className:ee.table,title:"Insert Table"},"horizontal-rule":{name:"horizontal-rule",action:_,className:ee["horizontal-rule"],title:"Insert Horizontal Line"},"separator-3":{name:"separator-3"},preview:{name:"preview",action:U,className:ee.preview,noDisable:!0,title:"Toggle Preview",default:!0},"side-by-side":{name:"side-by-side",action:q,className:ee["side-by-side"],noDisable:!0,noMobile:!0,title:"Toggle Side by Side",default:!0},fullscreen:{name:"fullscreen",action:v,className:ee.fullscreen,noDisable:!0,noMobile:!0,title:"Toggle Fullscreen",default:!0},"separator-4":{name:"separator-4"},guide:{name:"guide",action:"https://www.markdownguide.org/basic-syntax/",className:ee.guide,noDisable:!0,title:"Markdown Guide",default:!0},"separator-5":{name:"separator-5"},undo:{name:"undo",action:W,className:ee.undo,noDisable:!0,title:"Undo"},redo:{name:"redo",action:j,className:ee.redo,noDisable:!0,title:"Redo"}},ne={link:["[","](#url#)"],image:["![","](#url#)"],uploadedImage:["![](#url#)",""],table:["","\n\n| Column 1 | Column 2 | Column 3 |\n| -------- | -------- | -------- |\n| Text | Text | Text |\n\n"],horizontalRule:["","\n\n-----\n\n"]},ie={link:"URL for the link:",image:"URL of the image:"},re={locale:"en-US",format:{hour:"2-digit",minute:"2-digit"}},oe={bold:"**",code:"```",italic:"*"},ae={sbInit:"Attach files by drag and dropping or pasting from clipboard.",sbOnDragEnter:"Drop image to upload it.",sbOnDrop:"Uploading image #images_names#...",sbProgress:"Uploading #file_name#: #progress#%",sbOnUploaded:"Uploaded #image_name#",sizeUnits:" B, KB, MB"},le={noFileGiven:"You must select a file.",typeNotAllowed:"This image type is not allowed.",fileTooLarge:"Image #image_name# is too big (#image_size#).\nMaximum file size is #image_max_size#.",importError:"Something went wrong when uploading the image #image_name#."};function se(e){(e=e||{}).parent=this;var t=!0;if(!1===e.autoDownloadFontAwesome&&(t=!1),!0!==e.autoDownloadFontAwesome)for(var n=document.styleSheets,i=0;i-1&&(t=!1);if(t){var r=document.createElement("link");r.rel="stylesheet",r.href="https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css",document.getElementsByTagName("head")[0].appendChild(r)}if(e.element)this.element=e.element;else if(null===e.element)return void console.log("EasyMDE: Error. No element was found.");if(void 0===e.toolbar)for(var o in e.toolbar=[],te)Object.prototype.hasOwnProperty.call(te,o)&&(-1!=o.indexOf("separator-")&&e.toolbar.push("|"),(!0===te[o].default||e.showIcons&&e.showIcons.constructor===Array&&-1!=e.showIcons.indexOf(o))&&e.toolbar.push(o));if(Object.prototype.hasOwnProperty.call(e,"previewClass")||(e.previewClass="editor-preview"),Object.prototype.hasOwnProperty.call(e,"status")||(e.status=["autosave","lines","words","cursor"],e.uploadImage&&e.status.unshift("upload-image")),e.previewRender||(e.previewRender=function(e){return this.parent.markdown(e)}),e.parsingConfig=Q({highlightFormatting:!0},e.parsingConfig||{}),e.insertTexts=Q({},ne,e.insertTexts||{}),e.promptTexts=Q({},ie,e.promptTexts||{}),e.blockStyles=Q({},oe,e.blockStyles||{}),null!=e.autosave&&(e.autosave.timeFormat=Q({},re,e.autosave.timeFormat||{})),e.iconClassMap=Q({},ee,e.iconClassMap||{}),e.shortcuts=Q({},u,e.shortcuts||{}),e.maxHeight=e.maxHeight||void 0,e.direction=e.direction||"ltr",void 0!==e.maxHeight?e.minHeight=e.maxHeight:e.minHeight=e.minHeight||"300px",e.errorCallback=e.errorCallback||function(e){alert(e)},e.uploadImage=e.uploadImage||!1,e.imageMaxSize=e.imageMaxSize||2097152,e.imageAccept=e.imageAccept||"image/png, image/jpeg, image/gif, image/avif",e.imageTexts=Q({},ae,e.imageTexts||{}),e.errorMessages=Q({},le,e.errorMessages||{}),e.imagePathAbsolute=e.imagePathAbsolute||!1,e.imageCSRFName=e.imageCSRFName||"csrfmiddlewaretoken",e.imageCSRFHeader=e.imageCSRFHeader||!1,null!=e.autosave&&null!=e.autosave.unique_id&&""!=e.autosave.unique_id&&(e.autosave.uniqueId=e.autosave.unique_id),e.overlayMode&&void 0===e.overlayMode.combine&&(e.overlayMode.combine=!0),this.options=e,this.render(),!e.initialValue||this.options.autosave&&!0===this.options.autosave.foundSavedValue||this.value(e.initialValue),e.uploadImage){var a=this;this.codemirror.on("dragenter",(function(e,t){a.updateStatusBar("upload-image",a.options.imageTexts.sbOnDragEnter),t.stopPropagation(),t.preventDefault()})),this.codemirror.on("dragend",(function(e,t){a.updateStatusBar("upload-image",a.options.imageTexts.sbInit),t.stopPropagation(),t.preventDefault()})),this.codemirror.on("dragleave",(function(e,t){a.updateStatusBar("upload-image",a.options.imageTexts.sbInit),t.stopPropagation(),t.preventDefault()})),this.codemirror.on("dragover",(function(e,t){a.updateStatusBar("upload-image",a.options.imageTexts.sbOnDragEnter),t.stopPropagation(),t.preventDefault()})),this.codemirror.on("drop",(function(t,n){n.stopPropagation(),n.preventDefault(),e.imageUploadFunction?a.uploadImagesUsingCustomFunction(e.imageUploadFunction,n.dataTransfer.files):a.uploadImages(n.dataTransfer.files)})),this.codemirror.on("paste",(function(t,n){e.imageUploadFunction?a.uploadImagesUsingCustomFunction(e.imageUploadFunction,n.clipboardData.files):a.uploadImages(n.clipboardData.files)}))}}function ue(){if("object"!=typeof localStorage)return!1;try{localStorage.setItem("smde_localStorage",1),localStorage.removeItem("smde_localStorage")}catch(e){return!1}return!0}se.prototype.uploadImages=function(e,t,n){if(0!==e.length){for(var i=[],r=0;r$/,' target="_blank">');e=e.replace(n,i)}}return e}(i))}},se.prototype.render=function(e){if(e||(e=this.element||document.getElementsByTagName("textarea")[0]),!this._rendered||this._rendered!==e){this.element=e;var t,n,o=this.options,a=this,l={};for(var u in o.shortcuts)null!==o.shortcuts[u]&&null!==s[u]&&function(e){l[d(o.shortcuts[e])]=function(){var t=s[e];"function"==typeof t?t(a):"string"==typeof t&&window.open(t,"_blank")}}(u);if(l.Enter="newlineAndIndentContinueMarkdownList",l.Tab="tabAndIndentMarkdownList",l["Shift-Tab"]="shiftTabAndUnindentMarkdownList",l.Esc=function(e){e.getOption("fullScreen")&&v(a)},this.documentOnKeyDown=function(e){27==(e=e||window.event).keyCode&&a.codemirror.getOption("fullScreen")&&v(a)},document.addEventListener("keydown",this.documentOnKeyDown,!1),o.overlayMode?(i.defineMode("overlay-mode",(function(e){return i.overlayMode(i.getMode(e,!1!==o.spellChecker?"spell-checker":"gfm"),o.overlayMode.mode,o.overlayMode.combine)})),t="overlay-mode",(n=o.parsingConfig).gitHubSpice=!1):((t=o.parsingConfig).name="gfm",t.gitHubSpice=!1),!1!==o.spellChecker&&(t="spell-checker",(n=o.parsingConfig).name="gfm",n.gitHubSpice=!1,"function"==typeof o.spellChecker?o.spellChecker({codeMirrorInstance:i}):r({codeMirrorInstance:i})),this.codemirror=i.fromTextArea(e,{mode:t,backdrop:n,theme:null!=o.theme?o.theme:"easymde",tabSize:null!=o.tabSize?o.tabSize:2,indentUnit:null!=o.tabSize?o.tabSize:2,indentWithTabs:!1!==o.indentWithTabs,lineNumbers:!0===o.lineNumbers,autofocus:!0===o.autofocus,extraKeys:l,direction:o.direction,lineWrapping:!1!==o.lineWrapping,allowDropFileTypes:["text/plain"],placeholder:o.placeholder||e.getAttribute("placeholder")||"",styleSelectedText:null!=o.styleSelectedText?o.styleSelectedText:!c(),scrollbarStyle:null!=o.scrollbarStyle?o.scrollbarStyle:"native",configureMouse:function(e,t,n){return{addNew:!1}},inputStyle:null!=o.inputStyle?o.inputStyle:c()?"contenteditable":"textarea",spellcheck:null==o.nativeSpellcheck||o.nativeSpellcheck,autoRefresh:null!=o.autoRefresh&&o.autoRefresh}),this.codemirror.getScrollerElement().style.minHeight=o.minHeight,void 0!==o.maxHeight&&(this.codemirror.getScrollerElement().style.height=o.maxHeight),!0===o.forceSync){var h=this.codemirror;h.on("change",(function(){h.save()}))}this.gui={};var f=document.createElement("div");f.classList.add("EasyMDEContainer"),f.setAttribute("role","application");var p=this.codemirror.getWrapperElement();p.parentNode.insertBefore(f,p),f.appendChild(p),!1!==o.toolbar&&(this.gui.toolbar=this.createToolbar()),!1!==o.status&&(this.gui.statusbar=this.createStatusbar()),null!=o.autosave&&!0===o.autosave.enabled&&(this.autosave(),this.codemirror.on("change",(function(){clearTimeout(a._autosave_timeout),a._autosave_timeout=setTimeout((function(){a.autosave()}),a.options.autosave.submit_delay||a.options.autosave.delay||1e3)})));var m=this;this.codemirror.on("update",(function(){o.previewImagesInEditor&&f.querySelectorAll(".cm-image-marker").forEach((function(e){var t=e.parentElement;if(t.innerText.match(/^!\[.*?\]\(.*\)/g)&&!t.hasAttribute("data-img-src")){var n=t.innerText.match("\\((.*)\\)");if(window.EMDEimagesCache||(window.EMDEimagesCache={}),n&&n.length>=2){var i=n[1];if(o.imagesPreviewHandler){var r=o.imagesPreviewHandler(n[1]);"string"==typeof r&&(i=r)}if(window.EMDEimagesCache[i])x(t,window.EMDEimagesCache[i]);else{var a=document.createElement("img");a.onload=function(){window.EMDEimagesCache[i]={naturalWidth:a.naturalWidth,naturalHeight:a.naturalHeight,url:i},x(t,window.EMDEimagesCache[i])},a.src=i}}}}))})),this.gui.sideBySide=this.createSideBySide(),this._rendered=this.element,(!0===o.autofocus||e.autofocus)&&this.codemirror.focus();var g=this.codemirror;setTimeout(function(){g.refresh()}.bind(g),0)}function x(e,t){var n,i;e.setAttribute("data-img-src",t.url),e.setAttribute("style","--bg-image:url("+t.url+");--width:"+t.naturalWidth+"px;--height:"+(n=t.naturalWidth,i=t.naturalHeight,nthis.options.imageMaxSize)r(o(this.options.errorMessages.fileTooLarge));else{var a=new FormData;a.append("image",e),i.options.imageCSRFToken&&!i.options.imageCSRFHeader&&a.append(i.options.imageCSRFName,i.options.imageCSRFToken);var l=new XMLHttpRequest;l.upload.onprogress=function(t){if(t.lengthComputable){var n=""+Math.round(100*t.loaded/t.total);i.updateStatusBar("upload-image",i.options.imageTexts.sbProgress.replace("#file_name#",e.name).replace("#progress#",n))}},l.open("POST",this.options.imageUploadEndpoint),i.options.imageCSRFToken&&i.options.imageCSRFHeader&&l.setRequestHeader(i.options.imageCSRFName,i.options.imageCSRFToken),l.onload=function(){try{var e=JSON.parse(this.responseText)}catch(e){return console.error("EasyMDE: The server did not return a valid json."),void r(o(i.options.errorMessages.importError))}200===this.status&&e&&!e.error&&e.data&&e.data.filePath?t((i.options.imagePathAbsolute?"":window.location.origin+"/")+e.data.filePath):e.error&&e.error in i.options.errorMessages?r(o(i.options.errorMessages[e.error])):e.error?r(o(e.error)):(console.error("EasyMDE: Received an unexpected response after uploading the image."+this.status+" ("+this.statusText+")"),r(o(i.options.errorMessages.importError)))},l.onerror=function(e){console.error("EasyMDE: An unexpected error occurred when trying to upload the image."+e.target.status+" ("+e.target.statusText+")"),r(i.options.errorMessages.importError)},l.send(a)}},se.prototype.uploadImageUsingCustomFunction=function(e,t){var n=this;e.apply(this,[t,function(e){R(n,e)},function(e){var i=function(e){var i=n.options.imageTexts.sizeUnits.split(",");return e.replace("#image_name#",t.name).replace("#image_size#",Z(t.size,i)).replace("#image_max_size#",Z(n.options.imageMaxSize,i))}(e);n.updateStatusBar("upload-image",i),setTimeout((function(){n.updateStatusBar("upload-image",n.options.imageTexts.sbInit)}),1e4),n.options.errorCallback(i)}])},se.prototype.setPreviewMaxHeight=function(){var e=this.codemirror.getWrapperElement(),t=e.nextSibling,n=parseInt(window.getComputedStyle(e).paddingTop),i=parseInt(window.getComputedStyle(e).borderTopWidth),r=(parseInt(this.options.maxHeight)+2*n+2*i).toString()+"px";t.style.height=r},se.prototype.createSideBySide=function(){var e=this.codemirror,t=e.getWrapperElement(),n=t.nextSibling;if(!n||!n.classList.contains("editor-preview-side")){if((n=document.createElement("div")).className="editor-preview-side",this.options.previewClass)if(Array.isArray(this.options.previewClass))for(var i=0;i + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/static/img/brainminder.svg b/assets/static/img/brainminder.svg new file mode 100644 index 0000000..bf3464c --- /dev/null +++ b/assets/static/img/brainminder.svg @@ -0,0 +1,3976 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/static/img/icons/128x128.png b/assets/static/img/icons/128x128.png new file mode 100644 index 0000000..d12c657 Binary files /dev/null and b/assets/static/img/icons/128x128.png differ diff --git a/assets/static/img/icons/144x144.png b/assets/static/img/icons/144x144.png new file mode 100644 index 0000000..7269665 Binary files /dev/null and b/assets/static/img/icons/144x144.png differ diff --git a/assets/static/img/icons/152x152.png b/assets/static/img/icons/152x152.png new file mode 100644 index 0000000..52ef848 Binary files /dev/null and b/assets/static/img/icons/152x152.png differ diff --git a/assets/static/img/icons/192x192.png b/assets/static/img/icons/192x192.png new file mode 100644 index 0000000..76d2afd Binary files /dev/null and b/assets/static/img/icons/192x192.png differ diff --git a/assets/static/img/icons/384x384.png b/assets/static/img/icons/384x384.png new file mode 100644 index 0000000..b120aa2 Binary files /dev/null and b/assets/static/img/icons/384x384.png differ diff --git a/assets/static/img/icons/512x512.png b/assets/static/img/icons/512x512.png new file mode 100644 index 0000000..f9d1644 Binary files /dev/null and b/assets/static/img/icons/512x512.png differ diff --git a/assets/static/img/icons/72x72.png b/assets/static/img/icons/72x72.png new file mode 100644 index 0000000..1a03ba5 Binary files /dev/null and b/assets/static/img/icons/72x72.png differ diff --git a/assets/static/img/icons/96x96.png b/assets/static/img/icons/96x96.png new file mode 100644 index 0000000..e5218a9 Binary files /dev/null and b/assets/static/img/icons/96x96.png differ diff --git a/assets/static/img/screenshots/BrainMinder-screenshot-narrow-1.webp b/assets/static/img/screenshots/BrainMinder-screenshot-narrow-1.webp new file mode 100644 index 0000000..f6a4ec3 Binary files /dev/null and b/assets/static/img/screenshots/BrainMinder-screenshot-narrow-1.webp differ diff --git a/assets/static/img/screenshots/BrainMinder-screenshot-narrow.webp b/assets/static/img/screenshots/BrainMinder-screenshot-narrow.webp new file mode 100644 index 0000000..77a0fd7 Binary files /dev/null and b/assets/static/img/screenshots/BrainMinder-screenshot-narrow.webp differ diff --git a/assets/static/img/screenshots/BrainMinder-screenshot-wide-1.webp b/assets/static/img/screenshots/BrainMinder-screenshot-wide-1.webp new file mode 100644 index 0000000..2c4fe94 Binary files /dev/null and b/assets/static/img/screenshots/BrainMinder-screenshot-wide-1.webp differ diff --git a/assets/static/img/screenshots/BrainMinder-screenshot-wide.webp b/assets/static/img/screenshots/BrainMinder-screenshot-wide.webp new file mode 100644 index 0000000..457977c Binary files /dev/null and b/assets/static/img/screenshots/BrainMinder-screenshot-wide.webp differ diff --git a/assets/static/js/.keep b/assets/static/js/.keep new file mode 100644 index 0000000..e69de29 diff --git a/assets/static/js/Sortable.min.js b/assets/static/js/Sortable.min.js new file mode 100644 index 0000000..bb99533 --- /dev/null +++ b/assets/static/js/Sortable.min.js @@ -0,0 +1,2 @@ +/*! Sortable 1.15.2 - MIT | git://github.com/SortableJS/Sortable.git */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).Sortable=e()}(this,function(){"use strict";function e(e,t){var n,o=Object.keys(e);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(e),t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),o.push.apply(o,n)),o}function I(o){for(var t=1;tt.length)&&(e=t.length);for(var n=0,o=new Array(e);n"===e[0]&&(e=e.substring(1)),t))try{if(t.matches)return t.matches(e);if(t.msMatchesSelector)return t.msMatchesSelector(e);if(t.webkitMatchesSelector)return t.webkitMatchesSelector(e)}catch(t){return}}function P(t,e,n,o){if(t){n=n||document;do{if(null!=e&&(">"!==e[0]||t.parentNode===n)&&p(t,e)||o&&t===n)return t}while(t!==n&&(t=(i=t).host&&i!==document&&i.host.nodeType?i.host:i.parentNode))}var i;return null}var g,m=/\s+/g;function k(t,e,n){var o;t&&e&&(t.classList?t.classList[n?"add":"remove"](e):(o=(" "+t.className+" ").replace(m," ").replace(" "+e+" "," "),t.className=(o+(n?" "+e:"")).replace(m," ")))}function R(t,e,n){var o=t&&t.style;if(o){if(void 0===n)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(t,""):t.currentStyle&&(n=t.currentStyle),void 0===e?n:n[e];o[e=!(e in o||-1!==e.indexOf("webkit"))?"-webkit-"+e:e]=n+("string"==typeof n?"":"px")}}function v(t,e){var n="";if("string"==typeof t)n=t;else do{var o=R(t,"transform")}while(o&&"none"!==o&&(n=o+" "+n),!e&&(t=t.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(n)}function b(t,e,n){if(t){var o=t.getElementsByTagName(e),i=0,r=o.length;if(n)for(;i=n.left-e&&i<=n.right+e,e=r>=n.top-e&&r<=n.bottom+e;return o&&e?a=t:void 0}}),a);if(e){var n,o={};for(n in t)t.hasOwnProperty(n)&&(o[n]=t[n]);o.target=o.rootEl=e,o.preventDefault=void 0,o.stopPropagation=void 0,e[K]._onDragOver(o)}}var i,r,a}function Bt(t){V&&V.parentNode[K]._isOutsideThisEl(t.target)}function Ft(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(t));this.el=t,this.options=e=a({},e),t[K]=this;var n,o,i={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(t.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return Pt(t,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(t,e){t.setData("Text",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==Ft.supportPointer&&"PointerEvent"in window&&!u,emptyInsertThreshold:5};for(n in W.initializePlugins(this,t,i),i)n in e||(e[n]=i[n]);for(o in kt(e),this)"_"===o.charAt(0)&&"function"==typeof this[o]&&(this[o]=this[o].bind(this));this.nativeDraggable=!e.forceFallback&&Nt,this.nativeDraggable&&(this.options.touchStartThreshold=1),e.supportPointer?h(t,"pointerdown",this._onTapStart):(h(t,"mousedown",this._onTapStart),h(t,"touchstart",this._onTapStart)),this.nativeDraggable&&(h(t,"dragover",this),h(t,"dragenter",this)),Dt.push(this.el),e.store&&e.store.get&&this.sort(e.store.get(this)||[]),a(this,x())}function jt(t,e,n,o,i,r,a,l){var s,c,u=t[K],d=u.options.onMove;return!window.CustomEvent||y||w?(s=document.createEvent("Event")).initEvent("move",!0,!0):s=new CustomEvent("move",{bubbles:!0,cancelable:!0}),s.to=e,s.from=t,s.dragged=n,s.draggedRect=o,s.related=i||e,s.relatedRect=r||X(e),s.willInsertAfter=l,s.originalEvent=a,t.dispatchEvent(s),c=d?d.call(u,s,a):c}function Ht(t){t.draggable=!1}function Lt(){Tt=!1}function Kt(t){return setTimeout(t,0)}function Wt(t){return clearTimeout(t)}Ft.prototype={constructor:Ft,_isOutsideThisEl:function(t){this.el.contains(t)||t===this.el||(mt=null)},_getDirection:function(t,e){return"function"==typeof this.options.direction?this.options.direction.call(this,t,e,V):this.options.direction},_onTapStart:function(e){if(e.cancelable){var n=this,o=this.el,t=this.options,i=t.preventOnFilter,r=e.type,a=e.touches&&e.touches[0]||e.pointerType&&"touch"===e.pointerType&&e,l=(a||e).target,s=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||l,c=t.filter;if(!function(t){xt.length=0;var e=t.getElementsByTagName("input"),n=e.length;for(;n--;){var o=e[n];o.checked&&xt.push(o)}}(o),!V&&!(/mousedown|pointerdown/.test(r)&&0!==e.button||t.disabled)&&!s.isContentEditable&&(this.nativeDraggable||!u||!l||"SELECT"!==l.tagName.toUpperCase())&&!((l=P(l,t.draggable,o,!1))&&l.animated||tt===l)){if(ot=j(l),rt=j(l,t.draggable),"function"==typeof c){if(c.call(this,e,l,this))return q({sortable:n,rootEl:s,name:"filter",targetEl:l,toEl:o,fromEl:o}),G("filter",n,{evt:e}),void(i&&e.cancelable&&e.preventDefault())}else if(c=c&&c.split(",").some(function(t){if(t=P(s,t.trim(),o,!1))return q({sortable:n,rootEl:t,name:"filter",targetEl:l,fromEl:o,toEl:o}),G("filter",n,{evt:e}),!0}))return void(i&&e.cancelable&&e.preventDefault());t.handle&&!P(s,t.handle,o,!1)||this._prepareDragStart(e,a,l)}}},_prepareDragStart:function(t,e,n){var o,i=this,r=i.el,a=i.options,l=r.ownerDocument;n&&!V&&n.parentNode===r&&(o=X(n),Q=r,Z=(V=n).parentNode,J=V.nextSibling,tt=n,lt=a.group,ct={target:Ft.dragged=V,clientX:(e||t).clientX,clientY:(e||t).clientY},ft=ct.clientX-o.left,pt=ct.clientY-o.top,this._lastX=(e||t).clientX,this._lastY=(e||t).clientY,V.style["will-change"]="all",o=function(){G("delayEnded",i,{evt:t}),Ft.eventCanceled?i._onDrop():(i._disableDelayedDragEvents(),!s&&i.nativeDraggable&&(V.draggable=!0),i._triggerDragStart(t,e),q({sortable:i,name:"choose",originalEvent:t}),k(V,a.chosenClass,!0))},a.ignore.split(",").forEach(function(t){b(V,t.trim(),Ht)}),h(l,"dragover",Yt),h(l,"mousemove",Yt),h(l,"touchmove",Yt),h(l,"mouseup",i._onDrop),h(l,"touchend",i._onDrop),h(l,"touchcancel",i._onDrop),s&&this.nativeDraggable&&(this.options.touchStartThreshold=4,V.draggable=!0),G("delayStart",this,{evt:t}),!a.delay||a.delayOnTouchOnly&&!e||this.nativeDraggable&&(w||y)?o():Ft.eventCanceled?this._onDrop():(h(l,"mouseup",i._disableDelayedDrag),h(l,"touchend",i._disableDelayedDrag),h(l,"touchcancel",i._disableDelayedDrag),h(l,"mousemove",i._delayedDragTouchMoveHandler),h(l,"touchmove",i._delayedDragTouchMoveHandler),a.supportPointer&&h(l,"pointermove",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(o,a.delay)))},_delayedDragTouchMoveHandler:function(t){t=t.touches?t.touches[0]:t;Math.max(Math.abs(t.clientX-this._lastX),Math.abs(t.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){V&&Ht(V),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;f(t,"mouseup",this._disableDelayedDrag),f(t,"touchend",this._disableDelayedDrag),f(t,"touchcancel",this._disableDelayedDrag),f(t,"mousemove",this._delayedDragTouchMoveHandler),f(t,"touchmove",this._delayedDragTouchMoveHandler),f(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,e){e=e||"touch"==t.pointerType&&t,!this.nativeDraggable||e?this.options.supportPointer?h(document,"pointermove",this._onTouchMove):h(document,e?"touchmove":"mousemove",this._onTouchMove):(h(V,"dragend",this),h(Q,"dragstart",this._onDragStart));try{document.selection?Kt(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch(t){}},_dragStarted:function(t,e){var n;wt=!1,Q&&V?(G("dragStarted",this,{evt:e}),this.nativeDraggable&&h(document,"dragover",Bt),n=this.options,t||k(V,n.dragClass,!1),k(V,n.ghostClass,!0),Ft.active=this,t&&this._appendGhost(),q({sortable:this,name:"start",originalEvent:e})):this._nulling()},_emulateDragOver:function(){if(ut){this._lastX=ut.clientX,this._lastY=ut.clientY,Rt();for(var t=document.elementFromPoint(ut.clientX,ut.clientY),e=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(ut.clientX,ut.clientY))!==e;)e=t;if(V.parentNode[K]._isOutsideThisEl(t),e)do{if(e[K])if(e[K]._onDragOver({clientX:ut.clientX,clientY:ut.clientY,target:t,rootEl:e})&&!this.options.dragoverBubble)break}while(e=(t=e).parentNode);Xt()}},_onTouchMove:function(t){if(ct){var e=this.options,n=e.fallbackTolerance,o=e.fallbackOffset,i=t.touches?t.touches[0]:t,r=$&&v($,!0),a=$&&r&&r.a,l=$&&r&&r.d,e=Mt&&yt&&E(yt),a=(i.clientX-ct.clientX+o.x)/(a||1)+(e?e[0]-Ct[0]:0)/(a||1),l=(i.clientY-ct.clientY+o.y)/(l||1)+(e?e[1]-Ct[1]:0)/(l||1);if(!Ft.active&&!wt){if(n&&Math.max(Math.abs(i.clientX-this._lastX),Math.abs(i.clientY-this._lastY))D.right+10||S.clientY>x.bottom&&S.clientX>x.left:S.clientY>D.bottom+10||S.clientX>x.right&&S.clientY>x.top)||m.animated)){if(m&&(t=n,e=r,C=X(B((_=this).el,0,_.options,!0)),_=L(_.el,_.options,$),e?t.clientX<_.left-10||t.clientY= 2.0.0-beta.1', + 7: '>= 4.0.0 <4.3.0', + 8: '>= 4.3.0' + }; + + exports.REVISION_CHANGES = REVISION_CHANGES; + var objectType = '[object Object]'; + + function HandlebarsEnvironment(helpers, partials, decorators) { + this.helpers = helpers || {}; + this.partials = partials || {}; + this.decorators = decorators || {}; + + _helpers.registerDefaultHelpers(this); + _decorators.registerDefaultDecorators(this); + } + + HandlebarsEnvironment.prototype = { + constructor: HandlebarsEnvironment, + + logger: _logger2['default'], + log: _logger2['default'].log, + + registerHelper: function registerHelper(name, fn) { + if (_utils.toString.call(name) === objectType) { + if (fn) { + throw new _exception2['default']('Arg not supported with multiple helpers'); + } + _utils.extend(this.helpers, name); + } else { + this.helpers[name] = fn; + } + }, + unregisterHelper: function unregisterHelper(name) { + delete this.helpers[name]; + }, + + registerPartial: function registerPartial(name, partial) { + if (_utils.toString.call(name) === objectType) { + _utils.extend(this.partials, name); + } else { + if (typeof partial === 'undefined') { + throw new _exception2['default']('Attempting to register a partial called "' + name + '" as undefined'); + } + this.partials[name] = partial; + } + }, + unregisterPartial: function unregisterPartial(name) { + delete this.partials[name]; + }, + + registerDecorator: function registerDecorator(name, fn) { + if (_utils.toString.call(name) === objectType) { + if (fn) { + throw new _exception2['default']('Arg not supported with multiple decorators'); + } + _utils.extend(this.decorators, name); + } else { + this.decorators[name] = fn; + } + }, + unregisterDecorator: function unregisterDecorator(name) { + delete this.decorators[name]; + }, + /** + * Reset the memory of illegal property accesses that have already been logged. + * @deprecated should only be used in handlebars test-cases + */ + resetLoggedPropertyAccesses: function resetLoggedPropertyAccesses() { + _internalProtoAccess.resetLoggedProperties(); + } + }; + + var log = _logger2['default'].log; + + exports.log = log; + exports.createFrame = _utils.createFrame; + exports.logger = _logger2['default']; + +/***/ }), +/* 4 */ +/***/ (function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + exports.extend = extend; + exports.indexOf = indexOf; + exports.escapeExpression = escapeExpression; + exports.isEmpty = isEmpty; + exports.createFrame = createFrame; + exports.blockParams = blockParams; + exports.appendContextPath = appendContextPath; + var escape = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`', + '=': '=' + }; + + var badChars = /[&<>"'`=]/g, + possible = /[&<>"'`=]/; + + function escapeChar(chr) { + return escape[chr]; + } + + function extend(obj /* , ...source */) { + for (var i = 1; i < arguments.length; i++) { + for (var key in arguments[i]) { + if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { + obj[key] = arguments[i][key]; + } + } + } + + return obj; + } + + var toString = Object.prototype.toString; + + exports.toString = toString; + // Sourced from lodash + // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt + /* eslint-disable func-style */ + var isFunction = function isFunction(value) { + return typeof value === 'function'; + }; + // fallback for older versions of Chrome and Safari + /* istanbul ignore next */ + if (isFunction(/x/)) { + exports.isFunction = isFunction = function (value) { + return typeof value === 'function' && toString.call(value) === '[object Function]'; + }; + } + exports.isFunction = isFunction; + + /* eslint-enable func-style */ + + /* istanbul ignore next */ + var isArray = Array.isArray || function (value) { + return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; + }; + + exports.isArray = isArray; + // Older IE versions do not directly support indexOf so we must implement our own, sadly. + + function indexOf(array, value) { + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === value) { + return i; + } + } + return -1; + } + + function escapeExpression(string) { + if (typeof string !== 'string') { + // don't escape SafeStrings, since they're already safe + if (string && string.toHTML) { + return string.toHTML(); + } else if (string == null) { + return ''; + } else if (!string) { + return string + ''; + } + + // Force a string conversion as this will be done by the append regardless and + // the regex test will do this transparently behind the scenes, causing issues if + // an object's to string has escaped characters in it. + string = '' + string; + } + + if (!possible.test(string)) { + return string; + } + return string.replace(badChars, escapeChar); + } + + function isEmpty(value) { + if (!value && value !== 0) { + return true; + } else if (isArray(value) && value.length === 0) { + return true; + } else { + return false; + } + } + + function createFrame(object) { + var frame = extend({}, object); + frame._parent = object; + return frame; + } + + function blockParams(params, ids) { + params.path = ids; + return params; + } + + function appendContextPath(contextPath, id) { + return (contextPath ? contextPath + '.' : '') + id; + } + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _Object$defineProperty = __webpack_require__(6)['default']; + + exports.__esModule = true; + var errorProps = ['description', 'fileName', 'lineNumber', 'endLineNumber', 'message', 'name', 'number', 'stack']; + + function Exception(message, node) { + var loc = node && node.loc, + line = undefined, + endLineNumber = undefined, + column = undefined, + endColumn = undefined; + + if (loc) { + line = loc.start.line; + endLineNumber = loc.end.line; + column = loc.start.column; + endColumn = loc.end.column; + + message += ' - ' + line + ':' + column; + } + + var tmp = Error.prototype.constructor.call(this, message); + + // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. + for (var idx = 0; idx < errorProps.length; idx++) { + this[errorProps[idx]] = tmp[errorProps[idx]]; + } + + /* istanbul ignore else */ + if (Error.captureStackTrace) { + Error.captureStackTrace(this, Exception); + } + + try { + if (loc) { + this.lineNumber = line; + this.endLineNumber = endLineNumber; + + // Work around issue under safari where we can't directly set the column value + /* istanbul ignore next */ + if (_Object$defineProperty) { + Object.defineProperty(this, 'column', { + value: column, + enumerable: true + }); + Object.defineProperty(this, 'endColumn', { + value: endColumn, + enumerable: true + }); + } else { + this.column = column; + this.endColumn = endColumn; + } + } + } catch (nop) { + /* Ignore if the browser is very particular */ + } + } + + Exception.prototype = new Error(); + + exports['default'] = Exception; + module.exports = exports['default']; + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + + module.exports = { "default": __webpack_require__(7), __esModule: true }; + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + + var $ = __webpack_require__(8); + module.exports = function defineProperty(it, key, desc){ + return $.setDesc(it, key, desc); + }; + +/***/ }), +/* 8 */ +/***/ (function(module, exports) { + + var $Object = Object; + module.exports = { + create: $Object.create, + getProto: $Object.getPrototypeOf, + isEnum: {}.propertyIsEnumerable, + getDesc: $Object.getOwnPropertyDescriptor, + setDesc: $Object.defineProperty, + setDescs: $Object.defineProperties, + getKeys: $Object.keys, + getNames: $Object.getOwnPropertyNames, + getSymbols: $Object.getOwnPropertySymbols, + each: [].forEach + }; + +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + exports.registerDefaultHelpers = registerDefaultHelpers; + exports.moveHelperToHooks = moveHelperToHooks; + + var _helpersBlockHelperMissing = __webpack_require__(10); + + var _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing); + + var _helpersEach = __webpack_require__(11); + + var _helpersEach2 = _interopRequireDefault(_helpersEach); + + var _helpersHelperMissing = __webpack_require__(64); + + var _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing); + + var _helpersIf = __webpack_require__(65); + + var _helpersIf2 = _interopRequireDefault(_helpersIf); + + var _helpersLog = __webpack_require__(66); + + var _helpersLog2 = _interopRequireDefault(_helpersLog); + + var _helpersLookup = __webpack_require__(67); + + var _helpersLookup2 = _interopRequireDefault(_helpersLookup); + + var _helpersWith = __webpack_require__(68); + + var _helpersWith2 = _interopRequireDefault(_helpersWith); + + function registerDefaultHelpers(instance) { + _helpersBlockHelperMissing2['default'](instance); + _helpersEach2['default'](instance); + _helpersHelperMissing2['default'](instance); + _helpersIf2['default'](instance); + _helpersLog2['default'](instance); + _helpersLookup2['default'](instance); + _helpersWith2['default'](instance); + } + + function moveHelperToHooks(instance, helperName, keepHelper) { + if (instance.helpers[helperName]) { + instance.hooks[helperName] = instance.helpers[helperName]; + if (!keepHelper) { + delete instance.helpers[helperName]; + } + } + } + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + exports['default'] = function (instance) { + instance.registerHelper('blockHelperMissing', function (context, options) { + var inverse = options.inverse, + fn = options.fn; + + if (context === true) { + return fn(this); + } else if (context === false || context == null) { + return inverse(this); + } else if (_utils.isArray(context)) { + if (context.length > 0) { + if (options.ids) { + options.ids = [options.name]; + } + + return instance.helpers.each(context, options); + } else { + return inverse(this); + } + } else { + if (options.data && options.ids) { + var data = _utils.createFrame(options.data); + data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name); + options = { data: data }; + } + + return fn(context, options); + } + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _Symbol = __webpack_require__(12)['default']; + + var _Symbol$iterator = __webpack_require__(42)['default']; + + var _getIterator = __webpack_require__(54)['default']; + + var _Object$keys = __webpack_require__(59)['default']; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + var _exception = __webpack_require__(5); + + var _exception2 = _interopRequireDefault(_exception); + + exports['default'] = function (instance) { + instance.registerHelper('each', function (context, options) { + if (!options) { + throw new _exception2['default']('Must pass iterator to #each'); + } + + var fn = options.fn, + inverse = options.inverse, + i = 0, + ret = '', + data = undefined, + contextPath = undefined; + + if (options.data && options.ids) { + contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; + } + + if (_utils.isFunction(context)) { + context = context.call(this); + } + + if (options.data) { + data = _utils.createFrame(options.data); + } + + function execIteration(field, index, last) { + if (data) { + data.key = field; + data.index = index; + data.first = index === 0; + data.last = !!last; + + if (contextPath) { + data.contextPath = contextPath + field; + } + } + + ret = ret + fn(context[field], { + data: data, + blockParams: _utils.blockParams([context[field], field], [contextPath + field, null]) + }); + } + + if (context && typeof context === 'object') { + if (_utils.isArray(context)) { + for (var j = context.length; i < j; i++) { + if (i in context) { + execIteration(i, i, i === context.length - 1); + } + } + } else if (typeof _Symbol === 'function' && context[_Symbol$iterator]) { + var newContext = []; + var iterator = _getIterator(context); + for (var it = iterator.next(); !it.done; it = iterator.next()) { + newContext.push(it.value); + } + context = newContext; + for (var j = context.length; i < j; i++) { + execIteration(i, i, i === context.length - 1); + } + } else { + (function () { + var priorKey = undefined; + + _Object$keys(context).forEach(function (key) { + // We're running the iterations one step out of sync so we can detect + // the last iteration without have to scan the object twice and create + // an itermediate keys array. + if (priorKey !== undefined) { + execIteration(priorKey, i - 1); + } + priorKey = key; + i++; + }); + if (priorKey !== undefined) { + execIteration(priorKey, i - 1, true); + } + })(); + } + } + + if (i === 0) { + ret = inverse(this); + } + + return ret; + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { + + module.exports = { "default": __webpack_require__(13), __esModule: true }; + +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { + + __webpack_require__(14); + __webpack_require__(41); + module.exports = __webpack_require__(20).Symbol; + +/***/ }), +/* 14 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + // ECMAScript 6 symbols shim + var $ = __webpack_require__(8) + , global = __webpack_require__(15) + , has = __webpack_require__(16) + , DESCRIPTORS = __webpack_require__(17) + , $export = __webpack_require__(19) + , redefine = __webpack_require__(23) + , $fails = __webpack_require__(18) + , shared = __webpack_require__(26) + , setToStringTag = __webpack_require__(27) + , uid = __webpack_require__(29) + , wks = __webpack_require__(28) + , keyOf = __webpack_require__(30) + , $names = __webpack_require__(35) + , enumKeys = __webpack_require__(36) + , isArray = __webpack_require__(37) + , anObject = __webpack_require__(38) + , toIObject = __webpack_require__(31) + , createDesc = __webpack_require__(25) + , getDesc = $.getDesc + , setDesc = $.setDesc + , _create = $.create + , getNames = $names.get + , $Symbol = global.Symbol + , $JSON = global.JSON + , _stringify = $JSON && $JSON.stringify + , setter = false + , HIDDEN = wks('_hidden') + , isEnum = $.isEnum + , SymbolRegistry = shared('symbol-registry') + , AllSymbols = shared('symbols') + , useNative = typeof $Symbol == 'function' + , ObjectProto = Object.prototype; + + // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 + var setSymbolDesc = DESCRIPTORS && $fails(function(){ + return _create(setDesc({}, 'a', { + get: function(){ return setDesc(this, 'a', {value: 7}).a; } + })).a != 7; + }) ? function(it, key, D){ + var protoDesc = getDesc(ObjectProto, key); + if(protoDesc)delete ObjectProto[key]; + setDesc(it, key, D); + if(protoDesc && it !== ObjectProto)setDesc(ObjectProto, key, protoDesc); + } : setDesc; + + var wrap = function(tag){ + var sym = AllSymbols[tag] = _create($Symbol.prototype); + sym._k = tag; + DESCRIPTORS && setter && setSymbolDesc(ObjectProto, tag, { + configurable: true, + set: function(value){ + if(has(this, HIDDEN) && has(this[HIDDEN], tag))this[HIDDEN][tag] = false; + setSymbolDesc(this, tag, createDesc(1, value)); + } + }); + return sym; + }; + + var isSymbol = function(it){ + return typeof it == 'symbol'; + }; + + var $defineProperty = function defineProperty(it, key, D){ + if(D && has(AllSymbols, key)){ + if(!D.enumerable){ + if(!has(it, HIDDEN))setDesc(it, HIDDEN, createDesc(1, {})); + it[HIDDEN][key] = true; + } else { + if(has(it, HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false; + D = _create(D, {enumerable: createDesc(0, false)}); + } return setSymbolDesc(it, key, D); + } return setDesc(it, key, D); + }; + var $defineProperties = function defineProperties(it, P){ + anObject(it); + var keys = enumKeys(P = toIObject(P)) + , i = 0 + , l = keys.length + , key; + while(l > i)$defineProperty(it, key = keys[i++], P[key]); + return it; + }; + var $create = function create(it, P){ + return P === undefined ? _create(it) : $defineProperties(_create(it), P); + }; + var $propertyIsEnumerable = function propertyIsEnumerable(key){ + var E = isEnum.call(this, key); + return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] + ? E : true; + }; + var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){ + var D = getDesc(it = toIObject(it), key); + if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true; + return D; + }; + var $getOwnPropertyNames = function getOwnPropertyNames(it){ + var names = getNames(toIObject(it)) + , result = [] + , i = 0 + , key; + while(names.length > i)if(!has(AllSymbols, key = names[i++]) && key != HIDDEN)result.push(key); + return result; + }; + var $getOwnPropertySymbols = function getOwnPropertySymbols(it){ + var names = getNames(toIObject(it)) + , result = [] + , i = 0 + , key; + while(names.length > i)if(has(AllSymbols, key = names[i++]))result.push(AllSymbols[key]); + return result; + }; + var $stringify = function stringify(it){ + if(it === undefined || isSymbol(it))return; // IE8 returns string on undefined + var args = [it] + , i = 1 + , $$ = arguments + , replacer, $replacer; + while($$.length > i)args.push($$[i++]); + replacer = args[1]; + if(typeof replacer == 'function')$replacer = replacer; + if($replacer || !isArray(replacer))replacer = function(key, value){ + if($replacer)value = $replacer.call(this, key, value); + if(!isSymbol(value))return value; + }; + args[1] = replacer; + return _stringify.apply($JSON, args); + }; + var buggyJSON = $fails(function(){ + var S = $Symbol(); + // MS Edge converts symbol values to JSON as {} + // WebKit converts symbol values to JSON as null + // V8 throws on boxed symbols + return _stringify([S]) != '[null]' || _stringify({a: S}) != '{}' || _stringify(Object(S)) != '{}'; + }); + + // 19.4.1.1 Symbol([description]) + if(!useNative){ + $Symbol = function Symbol(){ + if(isSymbol(this))throw TypeError('Symbol is not a constructor'); + return wrap(uid(arguments.length > 0 ? arguments[0] : undefined)); + }; + redefine($Symbol.prototype, 'toString', function toString(){ + return this._k; + }); + + isSymbol = function(it){ + return it instanceof $Symbol; + }; + + $.create = $create; + $.isEnum = $propertyIsEnumerable; + $.getDesc = $getOwnPropertyDescriptor; + $.setDesc = $defineProperty; + $.setDescs = $defineProperties; + $.getNames = $names.get = $getOwnPropertyNames; + $.getSymbols = $getOwnPropertySymbols; + + if(DESCRIPTORS && !__webpack_require__(40)){ + redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true); + } + } + + var symbolStatics = { + // 19.4.2.1 Symbol.for(key) + 'for': function(key){ + return has(SymbolRegistry, key += '') + ? SymbolRegistry[key] + : SymbolRegistry[key] = $Symbol(key); + }, + // 19.4.2.5 Symbol.keyFor(sym) + keyFor: function keyFor(key){ + return keyOf(SymbolRegistry, key); + }, + useSetter: function(){ setter = true; }, + useSimple: function(){ setter = false; } + }; + // 19.4.2.2 Symbol.hasInstance + // 19.4.2.3 Symbol.isConcatSpreadable + // 19.4.2.4 Symbol.iterator + // 19.4.2.6 Symbol.match + // 19.4.2.8 Symbol.replace + // 19.4.2.9 Symbol.search + // 19.4.2.10 Symbol.species + // 19.4.2.11 Symbol.split + // 19.4.2.12 Symbol.toPrimitive + // 19.4.2.13 Symbol.toStringTag + // 19.4.2.14 Symbol.unscopables + $.each.call(( + 'hasInstance,isConcatSpreadable,iterator,match,replace,search,' + + 'species,split,toPrimitive,toStringTag,unscopables' + ).split(','), function(it){ + var sym = wks(it); + symbolStatics[it] = useNative ? sym : wrap(sym); + }); + + setter = true; + + $export($export.G + $export.W, {Symbol: $Symbol}); + + $export($export.S, 'Symbol', symbolStatics); + + $export($export.S + $export.F * !useNative, 'Object', { + // 19.1.2.2 Object.create(O [, Properties]) + create: $create, + // 19.1.2.4 Object.defineProperty(O, P, Attributes) + defineProperty: $defineProperty, + // 19.1.2.3 Object.defineProperties(O, Properties) + defineProperties: $defineProperties, + // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) + getOwnPropertyDescriptor: $getOwnPropertyDescriptor, + // 19.1.2.7 Object.getOwnPropertyNames(O) + getOwnPropertyNames: $getOwnPropertyNames, + // 19.1.2.8 Object.getOwnPropertySymbols(O) + getOwnPropertySymbols: $getOwnPropertySymbols + }); + + // 24.3.2 JSON.stringify(value [, replacer [, space]]) + $JSON && $export($export.S + $export.F * (!useNative || buggyJSON), 'JSON', {stringify: $stringify}); + + // 19.4.3.5 Symbol.prototype[@@toStringTag] + setToStringTag($Symbol, 'Symbol'); + // 20.2.1.9 Math[@@toStringTag] + setToStringTag(Math, 'Math', true); + // 24.3.3 JSON[@@toStringTag] + setToStringTag(global.JSON, 'JSON', true); + +/***/ }), +/* 15 */ +/***/ (function(module, exports) { + + // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 + var global = module.exports = typeof window != 'undefined' && window.Math == Math + ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')(); + if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef + +/***/ }), +/* 16 */ +/***/ (function(module, exports) { + + var hasOwnProperty = {}.hasOwnProperty; + module.exports = function(it, key){ + return hasOwnProperty.call(it, key); + }; + +/***/ }), +/* 17 */ +/***/ (function(module, exports, __webpack_require__) { + + // Thank's IE8 for his funny defineProperty + module.exports = !__webpack_require__(18)(function(){ + return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7; + }); + +/***/ }), +/* 18 */ +/***/ (function(module, exports) { + + module.exports = function(exec){ + try { + return !!exec(); + } catch(e){ + return true; + } + }; + +/***/ }), +/* 19 */ +/***/ (function(module, exports, __webpack_require__) { + + var global = __webpack_require__(15) + , core = __webpack_require__(20) + , ctx = __webpack_require__(21) + , PROTOTYPE = 'prototype'; + + var $export = function(type, name, source){ + var IS_FORCED = type & $export.F + , IS_GLOBAL = type & $export.G + , IS_STATIC = type & $export.S + , IS_PROTO = type & $export.P + , IS_BIND = type & $export.B + , IS_WRAP = type & $export.W + , exports = IS_GLOBAL ? core : core[name] || (core[name] = {}) + , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE] + , key, own, out; + if(IS_GLOBAL)source = name; + for(key in source){ + // contains in native + own = !IS_FORCED && target && key in target; + if(own && key in exports)continue; + // export native or passed + out = own ? target[key] : source[key]; + // prevent global pollution for namespaces + exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key] + // bind timers to global for call from export context + : IS_BIND && own ? ctx(out, global) + // wrap global constructors for prevent change them in library + : IS_WRAP && target[key] == out ? (function(C){ + var F = function(param){ + return this instanceof C ? new C(param) : C(param); + }; + F[PROTOTYPE] = C[PROTOTYPE]; + return F; + // make static versions for prototype methods + })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; + if(IS_PROTO)(exports[PROTOTYPE] || (exports[PROTOTYPE] = {}))[key] = out; + } + }; + // type bitmap + $export.F = 1; // forced + $export.G = 2; // global + $export.S = 4; // static + $export.P = 8; // proto + $export.B = 16; // bind + $export.W = 32; // wrap + module.exports = $export; + +/***/ }), +/* 20 */ +/***/ (function(module, exports) { + + var core = module.exports = {version: '1.2.6'}; + if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef + +/***/ }), +/* 21 */ +/***/ (function(module, exports, __webpack_require__) { + + // optional / simple context binding + var aFunction = __webpack_require__(22); + module.exports = function(fn, that, length){ + aFunction(fn); + if(that === undefined)return fn; + switch(length){ + case 1: return function(a){ + return fn.call(that, a); + }; + case 2: return function(a, b){ + return fn.call(that, a, b); + }; + case 3: return function(a, b, c){ + return fn.call(that, a, b, c); + }; + } + return function(/* ...args */){ + return fn.apply(that, arguments); + }; + }; + +/***/ }), +/* 22 */ +/***/ (function(module, exports) { + + module.exports = function(it){ + if(typeof it != 'function')throw TypeError(it + ' is not a function!'); + return it; + }; + +/***/ }), +/* 23 */ +/***/ (function(module, exports, __webpack_require__) { + + module.exports = __webpack_require__(24); + +/***/ }), +/* 24 */ +/***/ (function(module, exports, __webpack_require__) { + + var $ = __webpack_require__(8) + , createDesc = __webpack_require__(25); + module.exports = __webpack_require__(17) ? function(object, key, value){ + return $.setDesc(object, key, createDesc(1, value)); + } : function(object, key, value){ + object[key] = value; + return object; + }; + +/***/ }), +/* 25 */ +/***/ (function(module, exports) { + + module.exports = function(bitmap, value){ + return { + enumerable : !(bitmap & 1), + configurable: !(bitmap & 2), + writable : !(bitmap & 4), + value : value + }; + }; + +/***/ }), +/* 26 */ +/***/ (function(module, exports, __webpack_require__) { + + var global = __webpack_require__(15) + , SHARED = '__core-js_shared__' + , store = global[SHARED] || (global[SHARED] = {}); + module.exports = function(key){ + return store[key] || (store[key] = {}); + }; + +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { + + var def = __webpack_require__(8).setDesc + , has = __webpack_require__(16) + , TAG = __webpack_require__(28)('toStringTag'); + + module.exports = function(it, tag, stat){ + if(it && !has(it = stat ? it : it.prototype, TAG))def(it, TAG, {configurable: true, value: tag}); + }; + +/***/ }), +/* 28 */ +/***/ (function(module, exports, __webpack_require__) { + + var store = __webpack_require__(26)('wks') + , uid = __webpack_require__(29) + , Symbol = __webpack_require__(15).Symbol; + module.exports = function(name){ + return store[name] || (store[name] = + Symbol && Symbol[name] || (Symbol || uid)('Symbol.' + name)); + }; + +/***/ }), +/* 29 */ +/***/ (function(module, exports) { + + var id = 0 + , px = Math.random(); + module.exports = function(key){ + return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); + }; + +/***/ }), +/* 30 */ +/***/ (function(module, exports, __webpack_require__) { + + var $ = __webpack_require__(8) + , toIObject = __webpack_require__(31); + module.exports = function(object, el){ + var O = toIObject(object) + , keys = $.getKeys(O) + , length = keys.length + , index = 0 + , key; + while(length > index)if(O[key = keys[index++]] === el)return key; + }; + +/***/ }), +/* 31 */ +/***/ (function(module, exports, __webpack_require__) { + + // to indexed object, toObject with fallback for non-array-like ES3 strings + var IObject = __webpack_require__(32) + , defined = __webpack_require__(34); + module.exports = function(it){ + return IObject(defined(it)); + }; + +/***/ }), +/* 32 */ +/***/ (function(module, exports, __webpack_require__) { + + // fallback for non-array-like ES3 and non-enumerable old V8 strings + var cof = __webpack_require__(33); + module.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){ + return cof(it) == 'String' ? it.split('') : Object(it); + }; + +/***/ }), +/* 33 */ +/***/ (function(module, exports) { + + var toString = {}.toString; + + module.exports = function(it){ + return toString.call(it).slice(8, -1); + }; + +/***/ }), +/* 34 */ +/***/ (function(module, exports) { + + // 7.2.1 RequireObjectCoercible(argument) + module.exports = function(it){ + if(it == undefined)throw TypeError("Can't call method on " + it); + return it; + }; + +/***/ }), +/* 35 */ +/***/ (function(module, exports, __webpack_require__) { + + // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window + var toIObject = __webpack_require__(31) + , getNames = __webpack_require__(8).getNames + , toString = {}.toString; + + var windowNames = typeof window == 'object' && Object.getOwnPropertyNames + ? Object.getOwnPropertyNames(window) : []; + + var getWindowNames = function(it){ + try { + return getNames(it); + } catch(e){ + return windowNames.slice(); + } + }; + + module.exports.get = function getOwnPropertyNames(it){ + if(windowNames && toString.call(it) == '[object Window]')return getWindowNames(it); + return getNames(toIObject(it)); + }; + +/***/ }), +/* 36 */ +/***/ (function(module, exports, __webpack_require__) { + + // all enumerable object keys, includes symbols + var $ = __webpack_require__(8); + module.exports = function(it){ + var keys = $.getKeys(it) + , getSymbols = $.getSymbols; + if(getSymbols){ + var symbols = getSymbols(it) + , isEnum = $.isEnum + , i = 0 + , key; + while(symbols.length > i)if(isEnum.call(it, key = symbols[i++]))keys.push(key); + } + return keys; + }; + +/***/ }), +/* 37 */ +/***/ (function(module, exports, __webpack_require__) { + + // 7.2.2 IsArray(argument) + var cof = __webpack_require__(33); + module.exports = Array.isArray || function(arg){ + return cof(arg) == 'Array'; + }; + +/***/ }), +/* 38 */ +/***/ (function(module, exports, __webpack_require__) { + + var isObject = __webpack_require__(39); + module.exports = function(it){ + if(!isObject(it))throw TypeError(it + ' is not an object!'); + return it; + }; + +/***/ }), +/* 39 */ +/***/ (function(module, exports) { + + module.exports = function(it){ + return typeof it === 'object' ? it !== null : typeof it === 'function'; + }; + +/***/ }), +/* 40 */ +/***/ (function(module, exports) { + + module.exports = true; + +/***/ }), +/* 41 */ +/***/ (function(module, exports) { + + + +/***/ }), +/* 42 */ +/***/ (function(module, exports, __webpack_require__) { + + module.exports = { "default": __webpack_require__(43), __esModule: true }; + +/***/ }), +/* 43 */ +/***/ (function(module, exports, __webpack_require__) { + + __webpack_require__(44); + __webpack_require__(50); + module.exports = __webpack_require__(28)('iterator'); + +/***/ }), +/* 44 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + var $at = __webpack_require__(45)(true); + + // 21.1.3.27 String.prototype[@@iterator]() + __webpack_require__(47)(String, 'String', function(iterated){ + this._t = String(iterated); // target + this._i = 0; // next index + // 21.1.5.2.1 %StringIteratorPrototype%.next() + }, function(){ + var O = this._t + , index = this._i + , point; + if(index >= O.length)return {value: undefined, done: true}; + point = $at(O, index); + this._i += point.length; + return {value: point, done: false}; + }); + +/***/ }), +/* 45 */ +/***/ (function(module, exports, __webpack_require__) { + + var toInteger = __webpack_require__(46) + , defined = __webpack_require__(34); + // true -> String#at + // false -> String#codePointAt + module.exports = function(TO_STRING){ + return function(that, pos){ + var s = String(defined(that)) + , i = toInteger(pos) + , l = s.length + , a, b; + if(i < 0 || i >= l)return TO_STRING ? '' : undefined; + a = s.charCodeAt(i); + return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff + ? TO_STRING ? s.charAt(i) : a + : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; + }; + }; + +/***/ }), +/* 46 */ +/***/ (function(module, exports) { + + // 7.1.4 ToInteger + var ceil = Math.ceil + , floor = Math.floor; + module.exports = function(it){ + return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); + }; + +/***/ }), +/* 47 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + var LIBRARY = __webpack_require__(40) + , $export = __webpack_require__(19) + , redefine = __webpack_require__(23) + , hide = __webpack_require__(24) + , has = __webpack_require__(16) + , Iterators = __webpack_require__(48) + , $iterCreate = __webpack_require__(49) + , setToStringTag = __webpack_require__(27) + , getProto = __webpack_require__(8).getProto + , ITERATOR = __webpack_require__(28)('iterator') + , BUGGY = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next` + , FF_ITERATOR = '@@iterator' + , KEYS = 'keys' + , VALUES = 'values'; + + var returnThis = function(){ return this; }; + + module.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED){ + $iterCreate(Constructor, NAME, next); + var getMethod = function(kind){ + if(!BUGGY && kind in proto)return proto[kind]; + switch(kind){ + case KEYS: return function keys(){ return new Constructor(this, kind); }; + case VALUES: return function values(){ return new Constructor(this, kind); }; + } return function entries(){ return new Constructor(this, kind); }; + }; + var TAG = NAME + ' Iterator' + , DEF_VALUES = DEFAULT == VALUES + , VALUES_BUG = false + , proto = Base.prototype + , $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT] + , $default = $native || getMethod(DEFAULT) + , methods, key; + // Fix native + if($native){ + var IteratorPrototype = getProto($default.call(new Base)); + // Set @@toStringTag to native iterators + setToStringTag(IteratorPrototype, TAG, true); + // FF fix + if(!LIBRARY && has(proto, FF_ITERATOR))hide(IteratorPrototype, ITERATOR, returnThis); + // fix Array#{values, @@iterator}.name in V8 / FF + if(DEF_VALUES && $native.name !== VALUES){ + VALUES_BUG = true; + $default = function values(){ return $native.call(this); }; + } + } + // Define iterator + if((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])){ + hide(proto, ITERATOR, $default); + } + // Plug for library + Iterators[NAME] = $default; + Iterators[TAG] = returnThis; + if(DEFAULT){ + methods = { + values: DEF_VALUES ? $default : getMethod(VALUES), + keys: IS_SET ? $default : getMethod(KEYS), + entries: !DEF_VALUES ? $default : getMethod('entries') + }; + if(FORCED)for(key in methods){ + if(!(key in proto))redefine(proto, key, methods[key]); + } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods); + } + return methods; + }; + +/***/ }), +/* 48 */ +/***/ (function(module, exports) { + + module.exports = {}; + +/***/ }), +/* 49 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + var $ = __webpack_require__(8) + , descriptor = __webpack_require__(25) + , setToStringTag = __webpack_require__(27) + , IteratorPrototype = {}; + + // 25.1.2.1.1 %IteratorPrototype%[@@iterator]() + __webpack_require__(24)(IteratorPrototype, __webpack_require__(28)('iterator'), function(){ return this; }); + + module.exports = function(Constructor, NAME, next){ + Constructor.prototype = $.create(IteratorPrototype, {next: descriptor(1, next)}); + setToStringTag(Constructor, NAME + ' Iterator'); + }; + +/***/ }), +/* 50 */ +/***/ (function(module, exports, __webpack_require__) { + + __webpack_require__(51); + var Iterators = __webpack_require__(48); + Iterators.NodeList = Iterators.HTMLCollection = Iterators.Array; + +/***/ }), +/* 51 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + var addToUnscopables = __webpack_require__(52) + , step = __webpack_require__(53) + , Iterators = __webpack_require__(48) + , toIObject = __webpack_require__(31); + + // 22.1.3.4 Array.prototype.entries() + // 22.1.3.13 Array.prototype.keys() + // 22.1.3.29 Array.prototype.values() + // 22.1.3.30 Array.prototype[@@iterator]() + module.exports = __webpack_require__(47)(Array, 'Array', function(iterated, kind){ + this._t = toIObject(iterated); // target + this._i = 0; // next index + this._k = kind; // kind + // 22.1.5.2.1 %ArrayIteratorPrototype%.next() + }, function(){ + var O = this._t + , kind = this._k + , index = this._i++; + if(!O || index >= O.length){ + this._t = undefined; + return step(1); + } + if(kind == 'keys' )return step(0, index); + if(kind == 'values')return step(0, O[index]); + return step(0, [index, O[index]]); + }, 'values'); + + // argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) + Iterators.Arguments = Iterators.Array; + + addToUnscopables('keys'); + addToUnscopables('values'); + addToUnscopables('entries'); + +/***/ }), +/* 52 */ +/***/ (function(module, exports) { + + module.exports = function(){ /* empty */ }; + +/***/ }), +/* 53 */ +/***/ (function(module, exports) { + + module.exports = function(done, value){ + return {value: value, done: !!done}; + }; + +/***/ }), +/* 54 */ +/***/ (function(module, exports, __webpack_require__) { + + module.exports = { "default": __webpack_require__(55), __esModule: true }; + +/***/ }), +/* 55 */ +/***/ (function(module, exports, __webpack_require__) { + + __webpack_require__(50); + __webpack_require__(44); + module.exports = __webpack_require__(56); + +/***/ }), +/* 56 */ +/***/ (function(module, exports, __webpack_require__) { + + var anObject = __webpack_require__(38) + , get = __webpack_require__(57); + module.exports = __webpack_require__(20).getIterator = function(it){ + var iterFn = get(it); + if(typeof iterFn != 'function')throw TypeError(it + ' is not iterable!'); + return anObject(iterFn.call(it)); + }; + +/***/ }), +/* 57 */ +/***/ (function(module, exports, __webpack_require__) { + + var classof = __webpack_require__(58) + , ITERATOR = __webpack_require__(28)('iterator') + , Iterators = __webpack_require__(48); + module.exports = __webpack_require__(20).getIteratorMethod = function(it){ + if(it != undefined)return it[ITERATOR] + || it['@@iterator'] + || Iterators[classof(it)]; + }; + +/***/ }), +/* 58 */ +/***/ (function(module, exports, __webpack_require__) { + + // getting tag from 19.1.3.6 Object.prototype.toString() + var cof = __webpack_require__(33) + , TAG = __webpack_require__(28)('toStringTag') + // ES3 wrong here + , ARG = cof(function(){ return arguments; }()) == 'Arguments'; + + module.exports = function(it){ + var O, T, B; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (T = (O = Object(it))[TAG]) == 'string' ? T + // builtinTag case + : ARG ? cof(O) + // ES3 arguments fallback + : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; + }; + +/***/ }), +/* 59 */ +/***/ (function(module, exports, __webpack_require__) { + + module.exports = { "default": __webpack_require__(60), __esModule: true }; + +/***/ }), +/* 60 */ +/***/ (function(module, exports, __webpack_require__) { + + __webpack_require__(61); + module.exports = __webpack_require__(20).Object.keys; + +/***/ }), +/* 61 */ +/***/ (function(module, exports, __webpack_require__) { + + // 19.1.2.14 Object.keys(O) + var toObject = __webpack_require__(62); + + __webpack_require__(63)('keys', function($keys){ + return function keys(it){ + return $keys(toObject(it)); + }; + }); + +/***/ }), +/* 62 */ +/***/ (function(module, exports, __webpack_require__) { + + // 7.1.13 ToObject(argument) + var defined = __webpack_require__(34); + module.exports = function(it){ + return Object(defined(it)); + }; + +/***/ }), +/* 63 */ +/***/ (function(module, exports, __webpack_require__) { + + // most Object methods by ES6 should accept primitives + var $export = __webpack_require__(19) + , core = __webpack_require__(20) + , fails = __webpack_require__(18); + module.exports = function(KEY, exec){ + var fn = (core.Object || {})[KEY] || Object[KEY] + , exp = {}; + exp[KEY] = exec(fn); + $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp); + }; + +/***/ }), +/* 64 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + + var _exception = __webpack_require__(5); + + var _exception2 = _interopRequireDefault(_exception); + + exports['default'] = function (instance) { + instance.registerHelper('helperMissing', function () /* [args, ]options */{ + if (arguments.length === 1) { + // A missing field in a {{foo}} construct. + return undefined; + } else { + // Someone is actually trying to call something, blow up. + throw new _exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"'); + } + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 65 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + var _exception = __webpack_require__(5); + + var _exception2 = _interopRequireDefault(_exception); + + exports['default'] = function (instance) { + instance.registerHelper('if', function (conditional, options) { + if (arguments.length != 2) { + throw new _exception2['default']('#if requires exactly one argument'); + } + if (_utils.isFunction(conditional)) { + conditional = conditional.call(this); + } + + // Default behavior is to render the positive path if the value is truthy and not empty. + // The `includeZero` option may be set to treat the condtional as purely not empty based on the + // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. + if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) { + return options.inverse(this); + } else { + return options.fn(this); + } + }); + + instance.registerHelper('unless', function (conditional, options) { + if (arguments.length != 2) { + throw new _exception2['default']('#unless requires exactly one argument'); + } + return instance.helpers['if'].call(this, conditional, { + fn: options.inverse, + inverse: options.fn, + hash: options.hash + }); + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 66 */ +/***/ (function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + + exports['default'] = function (instance) { + instance.registerHelper('log', function () /* message, options */{ + var args = [undefined], + options = arguments[arguments.length - 1]; + for (var i = 0; i < arguments.length - 1; i++) { + args.push(arguments[i]); + } + + var level = 1; + if (options.hash.level != null) { + level = options.hash.level; + } else if (options.data && options.data.level != null) { + level = options.data.level; + } + args[0] = level; + + instance.log.apply(instance, args); + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 67 */ +/***/ (function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + + exports['default'] = function (instance) { + instance.registerHelper('lookup', function (obj, field, options) { + if (!obj) { + // Note for 5.0: Change to "obj == null" in 5.0 + return obj; + } + return options.lookupProperty(obj, field); + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 68 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + var _exception = __webpack_require__(5); + + var _exception2 = _interopRequireDefault(_exception); + + exports['default'] = function (instance) { + instance.registerHelper('with', function (context, options) { + if (arguments.length != 2) { + throw new _exception2['default']('#with requires exactly one argument'); + } + if (_utils.isFunction(context)) { + context = context.call(this); + } + + var fn = options.fn; + + if (!_utils.isEmpty(context)) { + var data = options.data; + if (options.data && options.ids) { + data = _utils.createFrame(options.data); + data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]); + } + + return fn(context, { + data: data, + blockParams: _utils.blockParams([context], [data && data.contextPath]) + }); + } else { + return options.inverse(this); + } + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 69 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + exports.registerDefaultDecorators = registerDefaultDecorators; + + var _decoratorsInline = __webpack_require__(70); + + var _decoratorsInline2 = _interopRequireDefault(_decoratorsInline); + + function registerDefaultDecorators(instance) { + _decoratorsInline2['default'](instance); + } + +/***/ }), +/* 70 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + exports['default'] = function (instance) { + instance.registerDecorator('inline', function (fn, props, container, options) { + var ret = fn; + if (!props.partials) { + props.partials = {}; + ret = function (context, options) { + // Create a new partials stack frame prior to exec. + var original = container.partials; + container.partials = _utils.extend({}, original, props.partials); + var ret = fn(context, options); + container.partials = original; + return ret; + }; + } + + props.partials[options.args[0]] = options.fn; + + return ret; + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 71 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + var logger = { + methodMap: ['debug', 'info', 'warn', 'error'], + level: 'info', + + // Maps a given level value to the `methodMap` indexes above. + lookupLevel: function lookupLevel(level) { + if (typeof level === 'string') { + var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase()); + if (levelMap >= 0) { + level = levelMap; + } else { + level = parseInt(level, 10); + } + } + + return level; + }, + + // Can be overridden in the host environment + log: function log(level) { + level = logger.lookupLevel(level); + + if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) { + var method = logger.methodMap[level]; + // eslint-disable-next-line no-console + if (!console[method]) { + method = 'log'; + } + + for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + message[_key - 1] = arguments[_key]; + } + + console[method].apply(console, message); // eslint-disable-line no-console + } + } + }; + + exports['default'] = logger; + module.exports = exports['default']; + +/***/ }), +/* 72 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _Object$create = __webpack_require__(73)['default']; + + var _Object$keys = __webpack_require__(59)['default']; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + exports.createProtoAccessControl = createProtoAccessControl; + exports.resultIsAllowed = resultIsAllowed; + exports.resetLoggedProperties = resetLoggedProperties; + + var _createNewLookupObject = __webpack_require__(75); + + var _logger = __webpack_require__(71); + + var _logger2 = _interopRequireDefault(_logger); + + var loggedProperties = _Object$create(null); + + function createProtoAccessControl(runtimeOptions) { + var defaultMethodWhiteList = _Object$create(null); + defaultMethodWhiteList['constructor'] = false; + defaultMethodWhiteList['__defineGetter__'] = false; + defaultMethodWhiteList['__defineSetter__'] = false; + defaultMethodWhiteList['__lookupGetter__'] = false; + + var defaultPropertyWhiteList = _Object$create(null); + // eslint-disable-next-line no-proto + defaultPropertyWhiteList['__proto__'] = false; + + return { + properties: { + whitelist: _createNewLookupObject.createNewLookupObject(defaultPropertyWhiteList, runtimeOptions.allowedProtoProperties), + defaultValue: runtimeOptions.allowProtoPropertiesByDefault + }, + methods: { + whitelist: _createNewLookupObject.createNewLookupObject(defaultMethodWhiteList, runtimeOptions.allowedProtoMethods), + defaultValue: runtimeOptions.allowProtoMethodsByDefault + } + }; + } + + function resultIsAllowed(result, protoAccessControl, propertyName) { + if (typeof result === 'function') { + return checkWhiteList(protoAccessControl.methods, propertyName); + } else { + return checkWhiteList(protoAccessControl.properties, propertyName); + } + } + + function checkWhiteList(protoAccessControlForType, propertyName) { + if (protoAccessControlForType.whitelist[propertyName] !== undefined) { + return protoAccessControlForType.whitelist[propertyName] === true; + } + if (protoAccessControlForType.defaultValue !== undefined) { + return protoAccessControlForType.defaultValue; + } + logUnexpecedPropertyAccessOnce(propertyName); + return false; + } + + function logUnexpecedPropertyAccessOnce(propertyName) { + if (loggedProperties[propertyName] !== true) { + loggedProperties[propertyName] = true; + _logger2['default'].log('error', 'Handlebars: Access has been denied to resolve the property "' + propertyName + '" because it is not an "own property" of its parent.\n' + 'You can add a runtime option to disable the check or this warning:\n' + 'See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details'); + } + } + + function resetLoggedProperties() { + _Object$keys(loggedProperties).forEach(function (propertyName) { + delete loggedProperties[propertyName]; + }); + } + +/***/ }), +/* 73 */ +/***/ (function(module, exports, __webpack_require__) { + + module.exports = { "default": __webpack_require__(74), __esModule: true }; + +/***/ }), +/* 74 */ +/***/ (function(module, exports, __webpack_require__) { + + var $ = __webpack_require__(8); + module.exports = function create(P, D){ + return $.create(P, D); + }; + +/***/ }), +/* 75 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _Object$create = __webpack_require__(73)['default']; + + exports.__esModule = true; + exports.createNewLookupObject = createNewLookupObject; + + var _utils = __webpack_require__(4); + + /** + * Create a new object with "null"-prototype to avoid truthy results on prototype properties. + * The resulting object can be used with "object[property]" to check if a property exists + * @param {...object} sources a varargs parameter of source objects that will be merged + * @returns {object} + */ + + function createNewLookupObject() { + for (var _len = arguments.length, sources = Array(_len), _key = 0; _key < _len; _key++) { + sources[_key] = arguments[_key]; + } + + return _utils.extend.apply(undefined, [_Object$create(null)].concat(sources)); + } + +/***/ }), +/* 76 */ +/***/ (function(module, exports) { + + // Build out our basic SafeString type + 'use strict'; + + exports.__esModule = true; + function SafeString(string) { + this.string = string; + } + + SafeString.prototype.toString = SafeString.prototype.toHTML = function () { + return '' + this.string; + }; + + exports['default'] = SafeString; + module.exports = exports['default']; + +/***/ }), +/* 77 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _Object$seal = __webpack_require__(78)['default']; + + var _Object$keys = __webpack_require__(59)['default']; + + var _interopRequireWildcard = __webpack_require__(1)['default']; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + exports.checkRevision = checkRevision; + exports.template = template; + exports.wrapProgram = wrapProgram; + exports.resolvePartial = resolvePartial; + exports.invokePartial = invokePartial; + exports.noop = noop; + + var _utils = __webpack_require__(4); + + var Utils = _interopRequireWildcard(_utils); + + var _exception = __webpack_require__(5); + + var _exception2 = _interopRequireDefault(_exception); + + var _base = __webpack_require__(3); + + var _helpers = __webpack_require__(9); + + var _internalWrapHelper = __webpack_require__(81); + + var _internalProtoAccess = __webpack_require__(72); + + function checkRevision(compilerInfo) { + var compilerRevision = compilerInfo && compilerInfo[0] || 1, + currentRevision = _base.COMPILER_REVISION; + + if (compilerRevision >= _base.LAST_COMPATIBLE_COMPILER_REVISION && compilerRevision <= _base.COMPILER_REVISION) { + return; + } + + if (compilerRevision < _base.LAST_COMPATIBLE_COMPILER_REVISION) { + var runtimeVersions = _base.REVISION_CHANGES[currentRevision], + compilerVersions = _base.REVISION_CHANGES[compilerRevision]; + throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); + } else { + // Use the embedded version info since the runtime doesn't know about this revision yet + throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); + } + } + + function template(templateSpec, env) { + /* istanbul ignore next */ + if (!env) { + throw new _exception2['default']('No environment passed to template'); + } + if (!templateSpec || !templateSpec.main) { + throw new _exception2['default']('Unknown template object: ' + typeof templateSpec); + } + + templateSpec.main.decorator = templateSpec.main_d; + + // Note: Using env.VM references rather than local var references throughout this section to allow + // for external users to override these as pseudo-supported APIs. + env.VM.checkRevision(templateSpec.compiler); + + // backwards compatibility for precompiled templates with compiler-version 7 (<4.3.0) + var templateWasPrecompiledWithCompilerV7 = templateSpec.compiler && templateSpec.compiler[0] === 7; + + function invokePartialWrapper(partial, context, options) { + if (options.hash) { + context = Utils.extend({}, context, options.hash); + if (options.ids) { + options.ids[0] = true; + } + } + partial = env.VM.resolvePartial.call(this, partial, context, options); + + var extendedOptions = Utils.extend({}, options, { + hooks: this.hooks, + protoAccessControl: this.protoAccessControl + }); + + var result = env.VM.invokePartial.call(this, partial, context, extendedOptions); + + if (result == null && env.compile) { + options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); + result = options.partials[options.name](context, extendedOptions); + } + if (result != null) { + if (options.indent) { + var lines = result.split('\n'); + for (var i = 0, l = lines.length; i < l; i++) { + if (!lines[i] && i + 1 === l) { + break; + } + + lines[i] = options.indent + lines[i]; + } + result = lines.join('\n'); + } + return result; + } else { + throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); + } + } + + // Just add water + var container = { + strict: function strict(obj, name, loc) { + if (!obj || !(name in obj)) { + throw new _exception2['default']('"' + name + '" not defined in ' + obj, { + loc: loc + }); + } + return container.lookupProperty(obj, name); + }, + lookupProperty: function lookupProperty(parent, propertyName) { + var result = parent[propertyName]; + if (result == null) { + return result; + } + if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { + return result; + } + + if (_internalProtoAccess.resultIsAllowed(result, container.protoAccessControl, propertyName)) { + return result; + } + return undefined; + }, + lookup: function lookup(depths, name) { + var len = depths.length; + for (var i = 0; i < len; i++) { + var result = depths[i] && container.lookupProperty(depths[i], name); + if (result != null) { + return depths[i][name]; + } + } + }, + lambda: function lambda(current, context) { + return typeof current === 'function' ? current.call(context) : current; + }, + + escapeExpression: Utils.escapeExpression, + invokePartial: invokePartialWrapper, + + fn: function fn(i) { + var ret = templateSpec[i]; + ret.decorator = templateSpec[i + '_d']; + return ret; + }, + + programs: [], + program: function program(i, data, declaredBlockParams, blockParams, depths) { + var programWrapper = this.programs[i], + fn = this.fn(i); + if (data || depths || blockParams || declaredBlockParams) { + programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); + } else if (!programWrapper) { + programWrapper = this.programs[i] = wrapProgram(this, i, fn); + } + return programWrapper; + }, + + data: function data(value, depth) { + while (value && depth--) { + value = value._parent; + } + return value; + }, + mergeIfNeeded: function mergeIfNeeded(param, common) { + var obj = param || common; + + if (param && common && param !== common) { + obj = Utils.extend({}, common, param); + } + + return obj; + }, + // An empty object to use as replacement for null-contexts + nullContext: _Object$seal({}), + + noop: env.VM.noop, + compilerInfo: templateSpec.compiler + }; + + function ret(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var data = options.data; + + ret._setup(options); + if (!options.partial && templateSpec.useData) { + data = initData(context, data); + } + var depths = undefined, + blockParams = templateSpec.useBlockParams ? [] : undefined; + if (templateSpec.useDepths) { + if (options.depths) { + depths = context != options.depths[0] ? [context].concat(options.depths) : options.depths; + } else { + depths = [context]; + } + } + + function main(context /*, options*/) { + return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths); + } + + main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams); + return main(context, options); + } + + ret.isTop = true; + + ret._setup = function (options) { + if (!options.partial) { + var mergedHelpers = Utils.extend({}, env.helpers, options.helpers); + wrapHelpersToPassLookupProperty(mergedHelpers, container); + container.helpers = mergedHelpers; + + if (templateSpec.usePartial) { + // Use mergeIfNeeded here to prevent compiling global partials multiple times + container.partials = container.mergeIfNeeded(options.partials, env.partials); + } + if (templateSpec.usePartial || templateSpec.useDecorators) { + container.decorators = Utils.extend({}, env.decorators, options.decorators); + } + + container.hooks = {}; + container.protoAccessControl = _internalProtoAccess.createProtoAccessControl(options); + + var keepHelperInHelpers = options.allowCallsToHelperMissing || templateWasPrecompiledWithCompilerV7; + _helpers.moveHelperToHooks(container, 'helperMissing', keepHelperInHelpers); + _helpers.moveHelperToHooks(container, 'blockHelperMissing', keepHelperInHelpers); + } else { + container.protoAccessControl = options.protoAccessControl; // internal option + container.helpers = options.helpers; + container.partials = options.partials; + container.decorators = options.decorators; + container.hooks = options.hooks; + } + }; + + ret._child = function (i, data, blockParams, depths) { + if (templateSpec.useBlockParams && !blockParams) { + throw new _exception2['default']('must pass block params'); + } + if (templateSpec.useDepths && !depths) { + throw new _exception2['default']('must pass parent depths'); + } + + return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); + }; + return ret; + } + + function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { + function prog(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var currentDepths = depths; + if (depths && context != depths[0] && !(context === container.nullContext && depths[0] === null)) { + currentDepths = [context].concat(depths); + } + + return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths); + } + + prog = executeDecorators(fn, prog, container, depths, data, blockParams); + + prog.program = i; + prog.depth = depths ? depths.length : 0; + prog.blockParams = declaredBlockParams || 0; + return prog; + } + + /** + * This is currently part of the official API, therefore implementation details should not be changed. + */ + + function resolvePartial(partial, context, options) { + if (!partial) { + if (options.name === '@partial-block') { + partial = options.data['partial-block']; + } else { + partial = options.partials[options.name]; + } + } else if (!partial.call && !options.name) { + // This is a dynamic partial that returned a string + options.name = partial; + partial = options.partials[partial]; + } + return partial; + } + + function invokePartial(partial, context, options) { + // Use the current closure context to save the partial-block if this partial + var currentPartialBlock = options.data && options.data['partial-block']; + options.partial = true; + if (options.ids) { + options.data.contextPath = options.ids[0] || options.data.contextPath; + } + + var partialBlock = undefined; + if (options.fn && options.fn !== noop) { + (function () { + options.data = _base.createFrame(options.data); + // Wrapper function to get access to currentPartialBlock from the closure + var fn = options.fn; + partialBlock = options.data['partial-block'] = function partialBlockWrapper(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + // Restore the partial-block from the closure for the execution of the block + // i.e. the part inside the block of the partial call. + options.data = _base.createFrame(options.data); + options.data['partial-block'] = currentPartialBlock; + return fn(context, options); + }; + if (fn.partials) { + options.partials = Utils.extend({}, options.partials, fn.partials); + } + })(); + } + + if (partial === undefined && partialBlock) { + partial = partialBlock; + } + + if (partial === undefined) { + throw new _exception2['default']('The partial ' + options.name + ' could not be found'); + } else if (partial instanceof Function) { + return partial(context, options); + } + } + + function noop() { + return ''; + } + + function initData(context, data) { + if (!data || !('root' in data)) { + data = data ? _base.createFrame(data) : {}; + data.root = context; + } + return data; + } + + function executeDecorators(fn, prog, container, depths, data, blockParams) { + if (fn.decorator) { + var props = {}; + prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths); + Utils.extend(prog, props); + } + return prog; + } + + function wrapHelpersToPassLookupProperty(mergedHelpers, container) { + _Object$keys(mergedHelpers).forEach(function (helperName) { + var helper = mergedHelpers[helperName]; + mergedHelpers[helperName] = passLookupPropertyOption(helper, container); + }); + } + + function passLookupPropertyOption(helper, container) { + var lookupProperty = container.lookupProperty; + return _internalWrapHelper.wrapHelper(helper, function (options) { + return Utils.extend({ lookupProperty: lookupProperty }, options); + }); + } + +/***/ }), +/* 78 */ +/***/ (function(module, exports, __webpack_require__) { + + module.exports = { "default": __webpack_require__(79), __esModule: true }; + +/***/ }), +/* 79 */ +/***/ (function(module, exports, __webpack_require__) { + + __webpack_require__(80); + module.exports = __webpack_require__(20).Object.seal; + +/***/ }), +/* 80 */ +/***/ (function(module, exports, __webpack_require__) { + + // 19.1.2.17 Object.seal(O) + var isObject = __webpack_require__(39); + + __webpack_require__(63)('seal', function($seal){ + return function seal(it){ + return $seal && isObject(it) ? $seal(it) : it; + }; + }); + +/***/ }), +/* 81 */ +/***/ (function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + exports.wrapHelper = wrapHelper; + + function wrapHelper(helper, transformOptionsFn) { + if (typeof helper !== 'function') { + // This should not happen, but apparently it does in https://github.com/wycats/handlebars.js/issues/1639 + // We try to make the wrapper least-invasive by not wrapping it, if the helper is not a function. + return helper; + } + var wrapper = function wrapper() /* dynamic arguments */{ + var options = arguments[arguments.length - 1]; + arguments[arguments.length - 1] = transformOptionsFn(options); + return helper.apply(this, arguments); + }; + return wrapper; + } + +/***/ }), +/* 82 */ +/***/ (function(module, exports) { + + /* global globalThis */ + 'use strict'; + + exports.__esModule = true; + + exports['default'] = function (Handlebars) { + /* istanbul ignore next */ + // https://mathiasbynens.be/notes/globalthis + (function () { + if (typeof globalThis === 'object') return; + Object.prototype.__defineGetter__('__magic__', function () { + return this; + }); + __magic__.globalThis = __magic__; // eslint-disable-line no-undef + delete Object.prototype.__magic__; + })(); + + var $Handlebars = globalThis.Handlebars; + + /* istanbul ignore next */ + Handlebars.noConflict = function () { + if (globalThis.Handlebars === Handlebars) { + globalThis.Handlebars = $Handlebars; + } + return Handlebars; + }; + }; + + module.exports = exports['default']; + +/***/ }) +/******/ ]) +}); +; \ No newline at end of file diff --git a/assets/static/js/htmx/ext/ajax-header.js b/assets/static/js/htmx/ext/ajax-header.js new file mode 100644 index 0000000..5c6221b --- /dev/null +++ b/assets/static/js/htmx/ext/ajax-header.js @@ -0,0 +1,7 @@ +htmx.defineExtension('ajax-header', { + onEvent: function (name, evt) { + if (name === "htmx:configRequest") { + evt.detail.headers['X-Requested-With'] = 'XMLHttpRequest'; + } + } +}); \ No newline at end of file diff --git a/assets/static/js/htmx/ext/alpine-morph.js b/assets/static/js/htmx/ext/alpine-morph.js new file mode 100644 index 0000000..1872dae --- /dev/null +++ b/assets/static/js/htmx/ext/alpine-morph.js @@ -0,0 +1,16 @@ +htmx.defineExtension('alpine-morph', { + isInlineSwap: function (swapStyle) { + return swapStyle === 'morph'; + }, + handleSwap: function (swapStyle, target, fragment) { + if (swapStyle === 'morph') { + if (fragment.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { + Alpine.morph(target, fragment.firstElementChild); + return [target]; + } else { + Alpine.morph(target, fragment.outerHTML); + return [target]; + } + } + } +}); \ No newline at end of file diff --git a/assets/static/js/htmx/ext/class-tools.js b/assets/static/js/htmx/ext/class-tools.js new file mode 100644 index 0000000..1cf4b42 --- /dev/null +++ b/assets/static/js/htmx/ext/class-tools.js @@ -0,0 +1,92 @@ +(function () { + + function splitOnWhitespace(trigger) { + return trigger.split(/\s+/); + } + + function parseClassOperation(trimmedValue) { + var split = splitOnWhitespace(trimmedValue); + if (split.length > 1) { + var operation = split[0]; + var classDef = split[1].trim(); + var cssClass; + var delay; + if (classDef.indexOf(":") > 0) { + var splitCssClass = classDef.split(':'); + cssClass = splitCssClass[0]; + delay = htmx.parseInterval(splitCssClass[1]); + } else { + cssClass = classDef; + delay = 100; + } + return { + operation: operation, + cssClass: cssClass, + delay: delay + } + } else { + return null; + } + } + + function performOperation(elt, classOperation, classList, currentRunTime) { + setTimeout(function () { + elt.classList[classOperation.operation].call(elt.classList, classOperation.cssClass); + }, currentRunTime) + } + + function toggleOperation(elt, classOperation, classList, currentRunTime) { + setTimeout(function () { + setInterval(function () { + elt.classList[classOperation.operation].call(elt.classList, classOperation.cssClass); + }, classOperation.delay); + }, currentRunTime) + } + + function processClassList(elt, classList) { + var runs = classList.split("&"); + for (var i = 0; i < runs.length; i++) { + var run = runs[i]; + var currentRunTime = 0; + var classOperations = run.split(","); + for (var j = 0; j < classOperations.length; j++) { + var value = classOperations[j]; + var trimmedValue = value.trim(); + var classOperation = parseClassOperation(trimmedValue); + if (classOperation) { + if (classOperation.operation === "toggle") { + toggleOperation(elt, classOperation, classList, currentRunTime); + currentRunTime = currentRunTime + classOperation.delay; + } else { + currentRunTime = currentRunTime + classOperation.delay; + performOperation(elt, classOperation, classList, currentRunTime); + } + } + } + } + } + + function maybeProcessClasses(elt) { + if (elt.getAttribute) { + var classList = elt.getAttribute("classes") || elt.getAttribute("data-classes"); + if (classList) { + processClassList(elt, classList); + } + } + } + + htmx.defineExtension('class-tools', { + onEvent: function (name, evt) { + if (name === "htmx:afterProcessNode") { + var elt = evt.detail.elt; + maybeProcessClasses(elt); + if (elt.querySelectorAll) { + var children = elt.querySelectorAll("[classes], [data-classes]"); + for (var i = 0; i < children.length; i++) { + maybeProcessClasses(children[i]); + } + } + } + } + }); +})(); \ No newline at end of file diff --git a/assets/static/js/htmx/ext/client-side-templates.js b/assets/static/js/htmx/ext/client-side-templates.js new file mode 100644 index 0000000..2bace41 --- /dev/null +++ b/assets/static/js/htmx/ext/client-side-templates.js @@ -0,0 +1,96 @@ +htmx.defineExtension('client-side-templates', { + transformResponse : function(text, xhr, elt) { + + var mustacheTemplate = htmx.closest(elt, "[mustache-template]"); + if (mustacheTemplate) { + var data = JSON.parse(text); + var templateId = mustacheTemplate.getAttribute('mustache-template'); + var template = htmx.find("#" + templateId); + if (template) { + return Mustache.render(template.innerHTML, data); + } else { + throw "Unknown mustache template: " + templateId; + } + } + + var mustacheArrayTemplate = htmx.closest(elt, "[mustache-array-template]"); + if (mustacheArrayTemplate) { + var data = JSON.parse(text); + var templateId = mustacheArrayTemplate.getAttribute('mustache-array-template'); + var template = htmx.find("#" + templateId); + if (template) { + return Mustache.render(template.innerHTML, {"data": data }); + } else { + throw "Unknown mustache template: " + templateId; + } + } + + var handlebarsTemplate = htmx.closest(elt, "[handlebars-template]"); + if (handlebarsTemplate) { + var data = JSON.parse(text); + var templateId = handlebarsTemplate.getAttribute('handlebars-template'); + var templateElement = htmx.find('#' + templateId).innerHTML; + var renderTemplate = Handlebars.compile(templateElement); + if (renderTemplate) { + return renderTemplate(data); + } else { + throw "Unknown handlebars template: " + templateId; + } + } + + var handlebarsArrayTemplate = htmx.closest(elt, "[handlebars-array-template]"); + if (handlebarsArrayTemplate) { + var data = JSON.parse(text); + var templateId = handlebarsArrayTemplate.getAttribute('handlebars-array-template'); + var templateElement = htmx.find('#' + templateId).innerHTML; + var renderTemplate = Handlebars.compile(templateElement); + if (renderTemplate) { + return renderTemplate(data); + } else { + throw "Unknown handlebars template: " + templateId; + } + } + + var nunjucksTemplate = htmx.closest(elt, "[nunjucks-template]"); + if (nunjucksTemplate) { + var data = JSON.parse(text); + var templateName = nunjucksTemplate.getAttribute('nunjucks-template'); + var template = htmx.find('#' + templateName); + if (template) { + return nunjucks.renderString(template.innerHTML, data); + } else { + return nunjucks.render(templateName, data); + } + } + + var xsltTemplate = htmx.closest(elt, "[xslt-template]"); + if (xsltTemplate) { + var templateId = xsltTemplate.getAttribute('xslt-template'); + var template = htmx.find("#" + templateId); + if (template) { + var content = template.innerHTML ? new DOMParser().parseFromString(template.innerHTML, 'application/xml') + : template.contentDocument; + var processor = new XSLTProcessor(); + processor.importStylesheet(content); + var data = new DOMParser().parseFromString(text, "application/xml"); + var frag = processor.transformToFragment(data, document); + return new XMLSerializer().serializeToString(frag); + } else { + throw "Unknown XSLT template: " + templateId; + } + } + + var nunjucksArrayTemplate = htmx.closest(elt, "[nunjucks-array-template]"); + if (nunjucksArrayTemplate) { + var data = JSON.parse(text); + var templateName = nunjucksArrayTemplate.getAttribute('nunjucks-array-template'); + var template = htmx.find('#' + templateName); + if (template) { + return nunjucks.renderString(template.innerHTML, {"data": data}); + } else { + return nunjucks.render(templateName, {"data": data}); + } + } + return text; + } +}); diff --git a/assets/static/js/htmx/ext/debug.js b/assets/static/js/htmx/ext/debug.js new file mode 100644 index 0000000..861ee74 --- /dev/null +++ b/assets/static/js/htmx/ext/debug.js @@ -0,0 +1,11 @@ +htmx.defineExtension('debug', { + onEvent: function (name, evt) { + if (console.debug) { + console.debug(name, evt); + } else if (console) { + console.log("DEBUG:", name, evt); + } else { + throw "NO CONSOLE SUPPORTED" + } + } +}); diff --git a/assets/static/js/htmx/ext/disable-element.js b/assets/static/js/htmx/ext/disable-element.js new file mode 100644 index 0000000..07bef62 --- /dev/null +++ b/assets/static/js/htmx/ext/disable-element.js @@ -0,0 +1,18 @@ +"use strict"; + +// Disable Submit Button +htmx.defineExtension('disable-element', { + onEvent: function (name, evt) { + let elt = evt.detail.elt; + let target = elt.getAttribute("hx-disable-element"); + let targetElements = (target == "self") ? [ elt ] : document.querySelectorAll(target); + + for (var i = 0; i < targetElements.length; i++) { + if (name === "htmx:beforeRequest" && targetElements[i]) { + targetElements[i].disabled = true; + } else if (name == "htmx:afterRequest" && targetElements[i]) { + targetElements[i].disabled = false; + } + } + } +}); \ No newline at end of file diff --git a/assets/static/js/htmx/ext/event-header.js b/assets/static/js/htmx/ext/event-header.js new file mode 100644 index 0000000..c7d2933 --- /dev/null +++ b/assets/static/js/htmx/ext/event-header.js @@ -0,0 +1,37 @@ +(function(){ + function stringifyEvent(event) { + var obj = {}; + for (var key in event) { + obj[key] = event[key]; + } + return JSON.stringify(obj, function(key, value){ + if(value instanceof Node){ + var nodeRep = value.tagName; + if (nodeRep) { + nodeRep = nodeRep.toLowerCase(); + if(value.id){ + nodeRep += "#" + value.id; + } + if(value.classList && value.classList.length){ + nodeRep += "." + value.classList.toString().replace(" ", ".") + } + return nodeRep; + } else { + return "Node" + } + } + if (value instanceof Window) return 'Window'; + return value; + }); + } + + htmx.defineExtension('event-header', { + onEvent: function (name, evt) { + if (name === "htmx:configRequest") { + if (evt.detail.triggeringEvent) { + evt.detail.headers['Triggering-Event'] = stringifyEvent(evt.detail.triggeringEvent); + } + } + } + }); +})(); diff --git a/assets/static/js/htmx/ext/head-support.js b/assets/static/js/htmx/ext/head-support.js new file mode 100644 index 0000000..67cfc69 --- /dev/null +++ b/assets/static/js/htmx/ext/head-support.js @@ -0,0 +1,141 @@ +//========================================================== +// head-support.js +// +// An extension to htmx 1.0 to add head tag merging. +//========================================================== +(function(){ + + var api = null; + + function log() { + //console.log(arguments); + } + + function mergeHead(newContent, defaultMergeStrategy) { + + if (newContent && newContent.indexOf(' -1) { + const htmlDoc = document.createElement("html"); + // remove svgs to avoid conflicts + var contentWithSvgsRemoved = newContent.replace(/]*>|>)([\s\S]*?)<\/svg>/gim, ''); + // extract head tag + var headTag = contentWithSvgsRemoved.match(/(]*>|>)([\s\S]*?)<\/head>)/im); + + // if the head tag exists... + if (headTag) { + + var added = [] + var removed = [] + var preserved = [] + var nodesToAppend = [] + + htmlDoc.innerHTML = headTag; + var newHeadTag = htmlDoc.querySelector("head"); + var currentHead = document.head; + + if (newHeadTag == null) { + return; + } else { + // put all new head elements into a Map, by their outerHTML + var srcToNewHeadNodes = new Map(); + for (const newHeadChild of newHeadTag.children) { + srcToNewHeadNodes.set(newHeadChild.outerHTML, newHeadChild); + } + } + + + + // determine merge strategy + var mergeStrategy = api.getAttributeValue(newHeadTag, "hx-head") || defaultMergeStrategy; + + // get the current head + for (const currentHeadElt of currentHead.children) { + + // If the current head element is in the map + var inNewContent = srcToNewHeadNodes.has(currentHeadElt.outerHTML); + var isReAppended = currentHeadElt.getAttribute("hx-head") === "re-eval"; + var isPreserved = api.getAttributeValue(currentHeadElt, "hx-preserve") === "true"; + if (inNewContent || isPreserved) { + if (isReAppended) { + // remove the current version and let the new version replace it and re-execute + removed.push(currentHeadElt); + } else { + // this element already exists and should not be re-appended, so remove it from + // the new content map, preserving it in the DOM + srcToNewHeadNodes.delete(currentHeadElt.outerHTML); + preserved.push(currentHeadElt); + } + } else { + if (mergeStrategy === "append") { + // we are appending and this existing element is not new content + // so if and only if it is marked for re-append do we do anything + if (isReAppended) { + removed.push(currentHeadElt); + nodesToAppend.push(currentHeadElt); + } + } else { + // if this is a merge, we remove this content since it is not in the new head + if (api.triggerEvent(document.body, "htmx:removingHeadElement", {headElement: currentHeadElt}) !== false) { + removed.push(currentHeadElt); + } + } + } + } + + // Push the tremaining new head elements in the Map into the + // nodes to append to the head tag + nodesToAppend.push(...srcToNewHeadNodes.values()); + log("to append: ", nodesToAppend); + + for (const newNode of nodesToAppend) { + log("adding: ", newNode); + var newElt = document.createRange().createContextualFragment(newNode.outerHTML); + log(newElt); + if (api.triggerEvent(document.body, "htmx:addingHeadElement", {headElement: newElt}) !== false) { + currentHead.appendChild(newElt); + added.push(newElt); + } + } + + // remove all removed elements, after we have appended the new elements to avoid + // additional network requests for things like style sheets + for (const removedElement of removed) { + if (api.triggerEvent(document.body, "htmx:removingHeadElement", {headElement: removedElement}) !== false) { + currentHead.removeChild(removedElement); + } + } + + api.triggerEvent(document.body, "htmx:afterHeadMerge", {added: added, kept: preserved, removed: removed}); + } + } + } + + htmx.defineExtension("head-support", { + init: function(apiRef) { + // store a reference to the internal API. + api = apiRef; + + htmx.on('htmx:afterSwap', function(evt){ + var serverResponse = evt.detail.xhr.response; + if (api.triggerEvent(document.body, "htmx:beforeHeadMerge", evt.detail)) { + mergeHead(serverResponse, evt.detail.boosted ? "merge" : "append"); + } + }) + + htmx.on('htmx:historyRestore', function(evt){ + if (api.triggerEvent(document.body, "htmx:beforeHeadMerge", evt.detail)) { + if (evt.detail.cacheMiss) { + mergeHead(evt.detail.serverResponse, "merge"); + } else { + mergeHead(evt.detail.item.head, "merge"); + } + } + }) + + htmx.on('htmx:historyItemCreated', function(evt){ + var historyItem = evt.detail.item; + historyItem.head = document.head.outerHTML; + }) + } + }); + +})() \ No newline at end of file diff --git a/assets/static/js/htmx/ext/htmx-shoelace.js b/assets/static/js/htmx/ext/htmx-shoelace.js new file mode 100644 index 0000000..4d79c75 --- /dev/null +++ b/assets/static/js/htmx/ext/htmx-shoelace.js @@ -0,0 +1,45 @@ +const slTypes = 'sl-checkbox, sl-color-picker, sl-input, sl-radio-group, sl-range, sl-rating, sl-select, sl-switch, sl-textarea' + +/* Lightly modified version of the same function in htmx.js */ +function shouldInclude(elt) { + + // sl-rating doesn't have a name attribute exposed through the Shoelace API (for elt.name) so this check needs to come before the name==="" check + if (elt.tagName === 'SL-RATING' && elt.getAttribute('name')) { + return true + } + + if (elt.name === "" || elt.name == null || elt.disabled || elt.closest("fieldset[disabled]")) { + return false + } + + if (elt.tagName === 'SL-CHECKBOX' || elt.tagName === 'SL-SWITCH') { + return elt.checked + } + + if (elt.tagName === "SL-RADIO-GROUP") { + return elt.value.length > 0 + } + + return true; +} + +htmx.defineExtension('shoelace', { + onEvent : function(name, evt) { + if ((name === "htmx:configRequest") && (evt.detail.elt.tagName === 'FORM')) { + evt.detail.elt.querySelectorAll(slTypes).forEach((elt) => { + if (shouldInclude(elt)) { + if (elt.tagName === 'SL-CHECKBOX' || elt.tagName === 'SL-SWITCH') { + // Shoelace normally does this bit internally when the formdata event fires, but htmx doesn't fire the formdata event, so we do it here instead. See https://github.com/shoelace-style/shoelace/issues/1891 + evt.detail.parameters[elt.name] = elt.value || 'on' + + } else if (elt.tagName == 'SL-RATING') { + evt.detail.parameters[elt.getAttribute('name')] = elt.value + + } else { + evt.detail.parameters[elt.name] = elt.value + } + } + }) + } + } +}) \ No newline at end of file diff --git a/assets/static/js/htmx/ext/include-vals.js b/assets/static/js/htmx/ext/include-vals.js new file mode 100644 index 0000000..d8f5ce4 --- /dev/null +++ b/assets/static/js/htmx/ext/include-vals.js @@ -0,0 +1,24 @@ +(function(){ + + function mergeObjects(obj1, obj2) { + for (var key in obj2) { + if (obj2.hasOwnProperty(key)) { + obj1[key] = obj2[key]; + } + } + return obj1; + } + + htmx.defineExtension('include-vals', { + onEvent: function (name, evt) { + if (name === "htmx:configRequest") { + var includeValsElt = htmx.closest(evt.detail.elt, "[include-vals],[data-include-vals]"); + if (includeValsElt) { + var includeVals = includeValsElt.getAttribute("include-vals") || includeValsElt.getAttribute("data-include-vals"); + var valuesToInclude = eval("({" + includeVals + "})"); + mergeObjects(evt.detail.parameters, valuesToInclude); + } + } + } + }); +})(); diff --git a/assets/static/js/htmx/ext/json-enc.js b/assets/static/js/htmx/ext/json-enc.js new file mode 100644 index 0000000..db0aa36 --- /dev/null +++ b/assets/static/js/htmx/ext/json-enc.js @@ -0,0 +1,12 @@ +htmx.defineExtension('json-enc', { + onEvent: function (name, evt) { + if (name === "htmx:configRequest") { + evt.detail.headers['Content-Type'] = "application/json"; + } + }, + + encodeParameters : function(xhr, parameters, elt) { + xhr.overrideMimeType('text/json'); + return (JSON.stringify(parameters)); + } +}); \ No newline at end of file diff --git a/assets/static/js/htmx/ext/loading-states.js b/assets/static/js/htmx/ext/loading-states.js new file mode 100644 index 0000000..c8ab51d --- /dev/null +++ b/assets/static/js/htmx/ext/loading-states.js @@ -0,0 +1,183 @@ +;(function () { + let loadingStatesUndoQueue = [] + + function loadingStateContainer(target) { + return htmx.closest(target, '[data-loading-states]') || document.body + } + + function mayProcessUndoCallback(target, callback) { + if (document.body.contains(target)) { + callback() + } + } + + function mayProcessLoadingStateByPath(elt, requestPath) { + const pathElt = htmx.closest(elt, '[data-loading-path]') + if (!pathElt) { + return true + } + + return pathElt.getAttribute('data-loading-path') === requestPath + } + + function queueLoadingState(sourceElt, targetElt, doCallback, undoCallback) { + const delayElt = htmx.closest(sourceElt, '[data-loading-delay]') + if (delayElt) { + const delayInMilliseconds = + delayElt.getAttribute('data-loading-delay') || 200 + const timeout = setTimeout(function () { + doCallback() + + loadingStatesUndoQueue.push(function () { + mayProcessUndoCallback(targetElt, undoCallback) + }) + }, delayInMilliseconds) + + loadingStatesUndoQueue.push(function () { + mayProcessUndoCallback(targetElt, function () { clearTimeout(timeout) }) + }) + } else { + doCallback() + loadingStatesUndoQueue.push(function () { + mayProcessUndoCallback(targetElt, undoCallback) + }) + } + } + + function getLoadingStateElts(loadingScope, type, path) { + return Array.from(htmx.findAll(loadingScope, "[" + type + "]")).filter( + function (elt) { return mayProcessLoadingStateByPath(elt, path) } + ) + } + + function getLoadingTarget(elt) { + if (elt.getAttribute('data-loading-target')) { + return Array.from( + htmx.findAll(elt.getAttribute('data-loading-target')) + ) + } + return [elt] + } + + htmx.defineExtension('loading-states', { + onEvent: function (name, evt) { + if (name === 'htmx:beforeRequest') { + const container = loadingStateContainer(evt.target) + + const loadingStateTypes = [ + 'data-loading', + 'data-loading-class', + 'data-loading-class-remove', + 'data-loading-disable', + 'data-loading-aria-busy', + ] + + let loadingStateEltsByType = {} + + loadingStateTypes.forEach(function (type) { + loadingStateEltsByType[type] = getLoadingStateElts( + container, + type, + evt.detail.pathInfo.requestPath + ) + }) + + loadingStateEltsByType['data-loading'].forEach(function (sourceElt) { + getLoadingTarget(sourceElt).forEach(function (targetElt) { + queueLoadingState( + sourceElt, + targetElt, + function () { + targetElt.style.display = + sourceElt.getAttribute('data-loading') || + 'inline-block' }, + function () { targetElt.style.display = 'none' } + ) + }) + }) + + loadingStateEltsByType['data-loading-class'].forEach( + function (sourceElt) { + const classNames = sourceElt + .getAttribute('data-loading-class') + .split(' ') + + getLoadingTarget(sourceElt).forEach(function (targetElt) { + queueLoadingState( + sourceElt, + targetElt, + function () { + classNames.forEach(function (className) { + targetElt.classList.add(className) + }) + }, + function() { + classNames.forEach(function (className) { + targetElt.classList.remove(className) + }) + } + ) + }) + } + ) + + loadingStateEltsByType['data-loading-class-remove'].forEach( + function (sourceElt) { + const classNames = sourceElt + .getAttribute('data-loading-class-remove') + .split(' ') + + getLoadingTarget(sourceElt).forEach(function (targetElt) { + queueLoadingState( + sourceElt, + targetElt, + function () { + classNames.forEach(function (className) { + targetElt.classList.remove(className) + }) + }, + function() { + classNames.forEach(function (className) { + targetElt.classList.add(className) + }) + } + ) + }) + } + ) + + loadingStateEltsByType['data-loading-disable'].forEach( + function (sourceElt) { + getLoadingTarget(sourceElt).forEach(function (targetElt) { + queueLoadingState( + sourceElt, + targetElt, + function() { targetElt.disabled = true }, + function() { targetElt.disabled = false } + ) + }) + } + ) + + loadingStateEltsByType['data-loading-aria-busy'].forEach( + function (sourceElt) { + getLoadingTarget(sourceElt).forEach(function (targetElt) { + queueLoadingState( + sourceElt, + targetElt, + function () { targetElt.setAttribute("aria-busy", "true") }, + function () { targetElt.removeAttribute("aria-busy") } + ) + }) + } + ) + } + + if (name === 'htmx:beforeOnLoad') { + while (loadingStatesUndoQueue.length > 0) { + loadingStatesUndoQueue.shift()() + } + } + }, + }) +})() diff --git a/assets/static/js/htmx/ext/method-override.js b/assets/static/js/htmx/ext/method-override.js new file mode 100644 index 0000000..2e3504c --- /dev/null +++ b/assets/static/js/htmx/ext/method-override.js @@ -0,0 +1,11 @@ +htmx.defineExtension('method-override', { + onEvent: function (name, evt) { + if (name === "htmx:configRequest") { + var method = evt.detail.verb; + if (method !== "get" || method !== "post") { + evt.detail.headers['X-HTTP-Method-Override'] = method.toUpperCase(); + evt.detail.verb = "post"; + } + } + } +}); diff --git a/assets/static/js/htmx/ext/morphdom-swap.js b/assets/static/js/htmx/ext/morphdom-swap.js new file mode 100644 index 0000000..a1e53ce --- /dev/null +++ b/assets/static/js/htmx/ext/morphdom-swap.js @@ -0,0 +1,17 @@ +htmx.defineExtension('morphdom-swap', { + isInlineSwap: function(swapStyle) { + return swapStyle === 'morphdom'; + }, + handleSwap: function (swapStyle, target, fragment) { + if (swapStyle === 'morphdom') { + if (fragment.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { + // IE11 doesn't support DocumentFragment.firstElementChild + morphdom(target, fragment.firstElementChild || fragment.firstChild); + return [target]; + } else { + morphdom(target, fragment.outerHTML); + return [target]; + } + } + } +}); diff --git a/assets/static/js/htmx/ext/multi-swap.js b/assets/static/js/htmx/ext/multi-swap.js new file mode 100644 index 0000000..f38f5b0 --- /dev/null +++ b/assets/static/js/htmx/ext/multi-swap.js @@ -0,0 +1,45 @@ +(function () { + + /** @type {import("../htmx").HtmxInternalApi} */ + var api; + + htmx.defineExtension('multi-swap', { + init: function (apiRef) { + api = apiRef; + }, + isInlineSwap: function (swapStyle) { + return swapStyle.indexOf('multi:') === 0; + }, + handleSwap: function (swapStyle, target, fragment, settleInfo) { + if (swapStyle.indexOf('multi:') === 0) { + var selectorToSwapStyle = {}; + var elements = swapStyle.replace(/^multi\s*:\s*/, '').split(/\s*,\s*/); + + elements.map(function (element) { + var split = element.split(/\s*:\s*/); + var elementSelector = split[0]; + var elementSwapStyle = typeof (split[1]) !== "undefined" ? split[1] : "innerHTML"; + + if (elementSelector.charAt(0) !== '#') { + console.error("HTMX multi-swap: unsupported selector '" + elementSelector + "'. Only ID selectors starting with '#' are supported."); + return; + } + + selectorToSwapStyle[elementSelector] = elementSwapStyle; + }); + + for (var selector in selectorToSwapStyle) { + var swapStyle = selectorToSwapStyle[selector]; + var elementToSwap = fragment.querySelector(selector); + if (elementToSwap) { + api.oobSwap(swapStyle, elementToSwap, settleInfo); + } else { + console.warn("HTMX multi-swap: selector '" + selector + "' not found in source content."); + } + } + + return true; + } + } + }); +})(); \ No newline at end of file diff --git a/assets/static/js/htmx/ext/path-deps.js b/assets/static/js/htmx/ext/path-deps.js new file mode 100644 index 0000000..4987e50 --- /dev/null +++ b/assets/static/js/htmx/ext/path-deps.js @@ -0,0 +1,60 @@ +(function(undefined){ + 'use strict'; + + // Save a reference to the global object (window in the browser) + var _root = this; + + function dependsOn(pathSpec, url) { + if (pathSpec === "ignore") { + return false; + } + var dependencyPath = pathSpec.split("/"); + var urlPath = url.split("/"); + for (var i = 0; i < urlPath.length; i++) { + var dependencyElement = dependencyPath.shift(); + var pathElement = urlPath[i]; + if (dependencyElement !== pathElement && dependencyElement !== "*") { + return false; + } + if (dependencyPath.length === 0 || (dependencyPath.length === 1 && dependencyPath[0] === "")) { + return true; + } + } + return false; + } + + function refreshPath(path) { + var eltsWithDeps = htmx.findAll("[path-deps]"); + for (var i = 0; i < eltsWithDeps.length; i++) { + var elt = eltsWithDeps[i]; + if (dependsOn(elt.getAttribute('path-deps'), path)) { + htmx.trigger(elt, "path-deps"); + } + } + } + + htmx.defineExtension('path-deps', { + onEvent: function (name, evt) { + if (name === "htmx:beforeOnLoad") { + var config = evt.detail.requestConfig; + // mutating call + if (config.verb !== "get" && evt.target.getAttribute('path-deps') !== 'ignore') { + refreshPath(config.path); + } + } + } + }); + + /** + * ******************** + * Expose functionality + * ******************** + */ + + _root.PathDeps = { + refresh: function(path) { + refreshPath(path); + } + }; + +}).call(this); diff --git a/assets/static/js/htmx/ext/preload.js b/assets/static/js/htmx/ext/preload.js new file mode 100644 index 0000000..a749370 --- /dev/null +++ b/assets/static/js/htmx/ext/preload.js @@ -0,0 +1,147 @@ +// This adds the "preload" extension to htmx. By default, this will +// preload the targets of any tags with `href` or `hx-get` attributes +// if they also have a `preload` attribute as well. See documentation +// for more details +htmx.defineExtension("preload", { + + onEvent: function(name, event) { + + // Only take actions on "htmx:afterProcessNode" + if (name !== "htmx:afterProcessNode") { + return; + } + + // SOME HELPER FUNCTIONS WE'LL NEED ALONG THE WAY + + // attr gets the closest non-empty value from the attribute. + var attr = function(node, property) { + if (node == undefined) {return undefined;} + return node.getAttribute(property) || node.getAttribute("data-" + property) || attr(node.parentElement, property) + } + + // load handles the actual HTTP fetch, and uses htmx.ajax in cases where we're + // preloading an htmx resource (this sends the same HTTP headers as a regular htmx request) + var load = function(node) { + + // Called after a successful AJAX request, to mark the + // content as loaded (and prevent additional AJAX calls.) + var done = function(html) { + if (!node.preloadAlways) { + node.preloadState = "DONE" + } + + if (attr(node, "preload-images") == "true") { + document.createElement("div").innerHTML = html // create and populate a node to load linked resources, too. + } + } + + return function() { + + // If this value has already been loaded, then do not try again. + if (node.preloadState !== "READY") { + return; + } + + // Special handling for HX-GET - use built-in htmx.ajax function + // so that headers match other htmx requests, then set + // node.preloadState = TRUE so that requests are not duplicated + // in the future + var hxGet = node.getAttribute("hx-get") || node.getAttribute("data-hx-get") + if (hxGet) { + htmx.ajax("GET", hxGet, { + source: node, + handler:function(elt, info) { + done(info.xhr.responseText); + } + }); + return; + } + + // Otherwise, perform a standard xhr request, then set + // node.preloadState = TRUE so that requests are not duplicated + // in the future. + if (node.getAttribute("href")) { + var r = new XMLHttpRequest(); + r.open("GET", node.getAttribute("href")); + r.onload = function() {done(r.responseText);}; + r.send(); + return; + } + } + } + + // This function processes a specific node and sets up event handlers. + // We'll search for nodes and use it below. + var init = function(node) { + + // If this node DOES NOT include a "GET" transaction, then there's nothing to do here. + if (node.getAttribute("href") + node.getAttribute("hx-get") + node.getAttribute("data-hx-get") == "") { + return; + } + + // Guarantee that we only initialize each node once. + if (node.preloadState !== undefined) { + return; + } + + // Get event name from config. + var on = attr(node, "preload") || "mousedown" + const always = on.indexOf("always") !== -1 + if (always) { + on = on.replace('always', '').trim() + } + + // FALL THROUGH to here means we need to add an EventListener + + // Apply the listener to the node + node.addEventListener(on, function(evt) { + if (node.preloadState === "PAUSE") { // Only add one event listener + node.preloadState = "READY"; // Required for the `load` function to trigger + + // Special handling for "mouseover" events. Wait 100ms before triggering load. + if (on === "mouseover") { + window.setTimeout(load(node), 100); + } else { + load(node)() // all other events trigger immediately. + } + } + }) + + // Special handling for certain built-in event handlers + switch (on) { + + case "mouseover": + // Mirror `touchstart` events (fires immediately) + node.addEventListener("touchstart", load(node)); + + // WHhen the mouse leaves, immediately disable the preload + node.addEventListener("mouseout", function(evt) { + if ((evt.target === node) && (node.preloadState === "READY")) { + node.preloadState = "PAUSE"; + } + }) + break; + + case "mousedown": + // Mirror `touchstart` events (fires immediately) + node.addEventListener("touchstart", load(node)); + break; + } + + // Mark the node as ready to run. + node.preloadState = "PAUSE"; + node.preloadAlways = always; + htmx.trigger(node, "preload:init") // This event can be used to load content immediately. + } + + // Search for all child nodes that have a "preload" attribute + event.target.querySelectorAll("[preload]").forEach(function(node) { + + // Initialize the node with the "preload" attribute + init(node) + + // Initialize all child elements that are anchors or have `hx-get` (use with care) + node.querySelectorAll("a,[hx-get],[data-hx-get]").forEach(init) + }) + } +}) diff --git a/assets/static/js/htmx/ext/rails-method.js b/assets/static/js/htmx/ext/rails-method.js new file mode 100644 index 0000000..5d48ecc --- /dev/null +++ b/assets/static/js/htmx/ext/rails-method.js @@ -0,0 +1,10 @@ +htmx.defineExtension('rails-method', { + onEvent: function (name, evt) { + if (name === "configRequest.htmx") { + var methodOverride = evt.detail.headers['X-HTTP-Method-Override']; + if (methodOverride) { + evt.detail.parameters['_method'] = methodOverride; + } + } + } +}); diff --git a/assets/static/js/htmx/ext/remove-me.js b/assets/static/js/htmx/ext/remove-me.js new file mode 100644 index 0000000..42be993 --- /dev/null +++ b/assets/static/js/htmx/ext/remove-me.js @@ -0,0 +1,27 @@ +(function(){ + function maybeRemoveMe(elt) { + var timing = elt.getAttribute("remove-me") || elt.getAttribute("data-remove-me"); + if (timing) { + setTimeout(function () { + elt.parentElement.removeChild(elt); + }, htmx.parseInterval(timing)); + } + } + + htmx.defineExtension('remove-me', { + onEvent: function (name, evt) { + if (name === "htmx:afterProcessNode") { + var elt = evt.detail.elt; + if (elt.getAttribute) { + maybeRemoveMe(elt); + if (elt.querySelectorAll) { + var children = elt.querySelectorAll("[remove-me], [data-remove-me]"); + for (var i = 0; i < children.length; i++) { + maybeRemoveMe(children[i]); + } + } + } + } + } + }); +})(); diff --git a/assets/static/js/htmx/ext/response-targets.js b/assets/static/js/htmx/ext/response-targets.js new file mode 100644 index 0000000..dd6fd41 --- /dev/null +++ b/assets/static/js/htmx/ext/response-targets.js @@ -0,0 +1,130 @@ +(function(){ + + /** @type {import("../htmx").HtmxInternalApi} */ + var api; + + var attrPrefix = 'hx-target-'; + + // IE11 doesn't support string.startsWith + function startsWith(str, prefix) { + return str.substring(0, prefix.length) === prefix + } + + /** + * @param {HTMLElement} elt + * @param {number} respCode + * @returns {HTMLElement | null} + */ + function getRespCodeTarget(elt, respCodeNumber) { + if (!elt || !respCodeNumber) return null; + + var respCode = respCodeNumber.toString(); + + // '*' is the original syntax, as the obvious character for a wildcard. + // The 'x' alternative was added for maximum compatibility with HTML + // templating engines, due to ambiguity around which characters are + // supported in HTML attributes. + // + // Start with the most specific possible attribute and generalize from + // there. + var attrPossibilities = [ + respCode, + + respCode.substr(0, 2) + '*', + respCode.substr(0, 2) + 'x', + + respCode.substr(0, 1) + '*', + respCode.substr(0, 1) + 'x', + respCode.substr(0, 1) + '**', + respCode.substr(0, 1) + 'xx', + + '*', + 'x', + '***', + 'xxx', + ]; + if (startsWith(respCode, '4') || startsWith(respCode, '5')) { + attrPossibilities.push('error'); + } + + for (var i = 0; i < attrPossibilities.length; i++) { + var attr = attrPrefix + attrPossibilities[i]; + var attrValue = api.getClosestAttributeValue(elt, attr); + if (attrValue) { + if (attrValue === "this") { + return api.findThisElement(elt, attr); + } else { + return api.querySelectorExt(elt, attrValue); + } + } + } + + return null; + } + + /** @param {Event} evt */ + function handleErrorFlag(evt) { + if (evt.detail.isError) { + if (htmx.config.responseTargetUnsetsError) { + evt.detail.isError = false; + } + } else if (htmx.config.responseTargetSetsError) { + evt.detail.isError = true; + } + } + + htmx.defineExtension('response-targets', { + + /** @param {import("../htmx").HtmxInternalApi} apiRef */ + init: function (apiRef) { + api = apiRef; + + if (htmx.config.responseTargetUnsetsError === undefined) { + htmx.config.responseTargetUnsetsError = true; + } + if (htmx.config.responseTargetSetsError === undefined) { + htmx.config.responseTargetSetsError = false; + } + if (htmx.config.responseTargetPrefersExisting === undefined) { + htmx.config.responseTargetPrefersExisting = false; + } + if (htmx.config.responseTargetPrefersRetargetHeader === undefined) { + htmx.config.responseTargetPrefersRetargetHeader = true; + } + }, + + /** + * @param {string} name + * @param {Event} evt + */ + onEvent: function (name, evt) { + if (name === "htmx:beforeSwap" && + evt.detail.xhr && + evt.detail.xhr.status !== 200) { + if (evt.detail.target) { + if (htmx.config.responseTargetPrefersExisting) { + evt.detail.shouldSwap = true; + handleErrorFlag(evt); + return true; + } + if (htmx.config.responseTargetPrefersRetargetHeader && + evt.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)) { + evt.detail.shouldSwap = true; + handleErrorFlag(evt); + return true; + } + } + if (!evt.detail.requestConfig) { + return true; + } + var target = getRespCodeTarget(evt.detail.requestConfig.elt, evt.detail.xhr.status); + if (target) { + handleErrorFlag(evt); + evt.detail.shouldSwap = true; + evt.detail.target = target; + } + return true; + } + } + }); +})(); diff --git a/assets/static/js/htmx/ext/restored.js b/assets/static/js/htmx/ext/restored.js new file mode 100644 index 0000000..6f65267 --- /dev/null +++ b/assets/static/js/htmx/ext/restored.js @@ -0,0 +1,15 @@ +htmx.defineExtension('restored', { + onEvent : function(name, evt) { + if (name === 'htmx:restored'){ + var restoredElts = evt.detail.document.querySelectorAll( + "[hx-trigger='restored'],[data-hx-trigger='restored']" + ); + // need a better way to do this, would prefer to just trigger from evt.detail.elt + var foundElt = Array.from(restoredElts).find( + (x) => (x.outerHTML === evt.detail.elt.outerHTML) + ); + var restoredEvent = evt.detail.triggerEvent(foundElt, 'restored'); + } + return; + } +}) \ No newline at end of file diff --git a/assets/static/js/htmx/ext/sse.js b/assets/static/js/htmx/ext/sse.js new file mode 100644 index 0000000..75c875a --- /dev/null +++ b/assets/static/js/htmx/ext/sse.js @@ -0,0 +1,322 @@ +/* +Server Sent Events Extension +============================ +This extension adds support for Server Sent Events to htmx. See /www/extensions/sse.md for usage instructions. + +*/ + +(function(){ + + /** @type {import("../htmx").HtmxInternalApi} */ + var api; + + htmx.defineExtension("sse", { + + /** + * Init saves the provided reference to the internal HTMX API. + * + * @param {import("../htmx").HtmxInternalApi} api + * @returns void + */ + init: function(apiRef) { + // store a reference to the internal API. + api = apiRef; + + // set a function in the public API for creating new EventSource objects + if (htmx.createEventSource == undefined) { + htmx.createEventSource = createEventSource; + } + }, + + /** + * onEvent handles all events passed to this extension. + * + * @param {string} name + * @param {Event} evt + * @returns void + */ + onEvent: function(name, evt) { + + switch (name) { + + // Try to remove remove an EventSource when elements are removed + case "htmx:beforeCleanupElement": + var internalData = api.getInternalData(evt.target) + if (internalData.sseEventSource) { + internalData.sseEventSource.close(); + } + return; + + // Try to create EventSources when elements are processed + case "htmx:afterProcessNode": + createEventSourceOnElement(evt.target); + } + } + }); + + /////////////////////////////////////////////// + // HELPER FUNCTIONS + /////////////////////////////////////////////// + + + /** + * createEventSource is the default method for creating new EventSource objects. + * it is hoisted into htmx.config.createEventSource to be overridden by the user, if needed. + * + * @param {string} url + * @returns EventSource + */ + function createEventSource(url) { + return new EventSource(url, {withCredentials:true}); + } + + function splitOnWhitespace(trigger) { + return trigger.trim().split(/\s+/); + } + + function getLegacySSEURL(elt) { + var legacySSEValue = api.getAttributeValue(elt, "hx-sse"); + if (legacySSEValue) { + var values = splitOnWhitespace(legacySSEValue); + for (var i = 0; i < values.length; i++) { + var value = values[i].split(/:(.+)/); + if (value[0] === "connect") { + return value[1]; + } + } + } + } + + function getLegacySSESwaps(elt) { + var legacySSEValue = api.getAttributeValue(elt, "hx-sse"); + var returnArr = []; + if (legacySSEValue) { + var values = splitOnWhitespace(legacySSEValue); + for (var i = 0; i < values.length; i++) { + var value = values[i].split(/:(.+)/); + if (value[0] === "swap") { + returnArr.push(value[1]); + } + } + } + return returnArr; + } + + /** + * createEventSourceOnElement creates a new EventSource connection on the provided element. + * If a usable EventSource already exists, then it is returned. If not, then a new EventSource + * is created and stored in the element's internalData. + * @param {HTMLElement} elt + * @param {number} retryCount + * @returns {EventSource | null} + */ + function createEventSourceOnElement(elt, retryCount) { + + if (elt == null) { + return null; + } + + var internalData = api.getInternalData(elt); + + // get URL from element's attribute + var sseURL = api.getAttributeValue(elt, "sse-connect"); + + + if (sseURL == undefined) { + var legacyURL = getLegacySSEURL(elt) + if (legacyURL) { + sseURL = legacyURL; + } else { + return null; + } + } + + // Connect to the EventSource + var source = htmx.createEventSource(sseURL); + internalData.sseEventSource = source; + + // Create event handlers + source.onerror = function (err) { + + // Log an error event + api.triggerErrorEvent(elt, "htmx:sseError", {error:err, source:source}); + + // If parent no longer exists in the document, then clean up this EventSource + if (maybeCloseSSESource(elt)) { + return; + } + + // Otherwise, try to reconnect the EventSource + if (source.readyState === EventSource.CLOSED) { + retryCount = retryCount || 0; + var timeout = Math.random() * (2 ^ retryCount) * 500; + window.setTimeout(function() { + createEventSourceOnElement(elt, Math.min(7, retryCount+1)); + }, timeout); + } + }; + + source.onopen = function (evt) { + api.triggerEvent(elt, "htmx:sseOpen", {source: source}); + } + + // Add message handlers for every `sse-swap` attribute + queryAttributeOnThisOrChildren(elt, "sse-swap").forEach(function(child) { + + var sseSwapAttr = api.getAttributeValue(child, "sse-swap"); + if (sseSwapAttr) { + var sseEventNames = sseSwapAttr.split(","); + } else { + var sseEventNames = getLegacySSESwaps(child); + } + + for (var i = 0 ; i < sseEventNames.length ; i++) { + var sseEventName = sseEventNames[i].trim(); + var listener = function(event) { + + // If the parent is missing then close SSE and remove listener + if (maybeCloseSSESource(elt)) { + source.removeEventListener(sseEventName, listener); + return; + } + + // swap the response into the DOM and trigger a notification + swap(child, event.data); + api.triggerEvent(elt, "htmx:sseMessage", event); + }; + + // Register the new listener + api.getInternalData(elt).sseEventListener = listener; + source.addEventListener(sseEventName, listener); + } + }); + + // Add message handlers for every `hx-trigger="sse:*"` attribute + queryAttributeOnThisOrChildren(elt, "hx-trigger").forEach(function(child) { + + var sseEventName = api.getAttributeValue(child, "hx-trigger"); + if (sseEventName == null) { + return; + } + + // Only process hx-triggers for events with the "sse:" prefix + if (sseEventName.slice(0, 4) != "sse:") { + return; + } + + var listener = function(event) { + + // If parent is missing, then close SSE and remove listener + if (maybeCloseSSESource(elt)) { + source.removeEventListener(sseEventName, listener); + return; + } + + // Trigger events to be handled by the rest of htmx + htmx.trigger(child, sseEventName, event); + htmx.trigger(child, "htmx:sseMessage", event); + } + + // Register the new listener + api.getInternalData(elt).sseEventListener = listener; + source.addEventListener(sseEventName.slice(4), listener); + }); + } + + /** + * maybeCloseSSESource confirms that the parent element still exists. + * If not, then any associated SSE source is closed and the function returns true. + * + * @param {HTMLElement} elt + * @returns boolean + */ + function maybeCloseSSESource(elt) { + if (!api.bodyContains(elt)) { + var source = api.getInternalData(elt).sseEventSource; + if (source != undefined) { + source.close(); + // source = null + return true; + } + } + return false; + } + + /** + * queryAttributeOnThisOrChildren returns all nodes that contain the requested attributeName, INCLUDING THE PROVIDED ROOT ELEMENT. + * + * @param {HTMLElement} elt + * @param {string} attributeName + */ + function queryAttributeOnThisOrChildren(elt, attributeName) { + + var result = []; + + // If the parent element also contains the requested attribute, then add it to the results too. + if (api.hasAttribute(elt, attributeName) || api.hasAttribute(elt, "hx-sse")) { + result.push(elt); + } + + // Search all child nodes that match the requested attribute + elt.querySelectorAll("[" + attributeName + "], [data-" + attributeName + "], [hx-sse], [data-hx-sse]").forEach(function(node) { + result.push(node); + }); + + return result; + } + + /** + * @param {HTMLElement} elt + * @param {string} content + */ + function swap(elt, content) { + + api.withExtensions(elt, function(extension) { + content = extension.transformResponse(content, null, elt); + }); + + var swapSpec = api.getSwapSpecification(elt); + var target = api.getTarget(elt); + var settleInfo = api.makeSettleInfo(elt); + + api.selectAndSwap(swapSpec.swapStyle, target, elt, content, settleInfo); + + settleInfo.elts.forEach(function (elt) { + if (elt.classList) { + elt.classList.add(htmx.config.settlingClass); + } + api.triggerEvent(elt, 'htmx:beforeSettle'); + }); + + // Handle settle tasks (with delay if requested) + if (swapSpec.settleDelay > 0) { + setTimeout(doSettle(settleInfo), swapSpec.settleDelay); + } else { + doSettle(settleInfo)(); + } + } + + /** + * doSettle mirrors much of the functionality in htmx that + * settles elements after their content has been swapped. + * TODO: this should be published by htmx, and not duplicated here + * @param {import("../htmx").HtmxSettleInfo} settleInfo + * @returns () => void + */ + function doSettle(settleInfo) { + + return function() { + settleInfo.tasks.forEach(function (task) { + task.call(); + }); + + settleInfo.elts.forEach(function (elt) { + if (elt.classList) { + elt.classList.remove(htmx.config.settlingClass); + } + api.triggerEvent(elt, 'htmx:afterSettle'); + }); + } + } + +})(); \ No newline at end of file diff --git a/assets/static/js/htmx/ext/ws.js b/assets/static/js/htmx/ext/ws.js new file mode 100644 index 0000000..3366e9e --- /dev/null +++ b/assets/static/js/htmx/ext/ws.js @@ -0,0 +1,477 @@ +/* +WebSockets Extension +============================ +This extension adds support for WebSockets to htmx. See /www/extensions/ws.md for usage instructions. +*/ + +(function () { + + /** @type {import("../htmx").HtmxInternalApi} */ + var api; + + htmx.defineExtension("ws", { + + /** + * init is called once, when this extension is first registered. + * @param {import("../htmx").HtmxInternalApi} apiRef + */ + init: function (apiRef) { + + // Store reference to internal API + api = apiRef; + + // Default function for creating new EventSource objects + if (!htmx.createWebSocket) { + htmx.createWebSocket = createWebSocket; + } + + // Default setting for reconnect delay + if (!htmx.config.wsReconnectDelay) { + htmx.config.wsReconnectDelay = "full-jitter"; + } + }, + + /** + * onEvent handles all events passed to this extension. + * + * @param {string} name + * @param {Event} evt + */ + onEvent: function (name, evt) { + + switch (name) { + + // Try to close the socket when elements are removed + case "htmx:beforeCleanupElement": + + var internalData = api.getInternalData(evt.target) + + if (internalData.webSocket) { + internalData.webSocket.close(); + } + return; + + // Try to create websockets when elements are processed + case "htmx:beforeProcessNode": + var parent = evt.target; + + forEach(queryAttributeOnThisOrChildren(parent, "ws-connect"), function (child) { + ensureWebSocket(child) + }); + forEach(queryAttributeOnThisOrChildren(parent, "ws-send"), function (child) { + ensureWebSocketSend(child) + }); + } + } + }); + + function splitOnWhitespace(trigger) { + return trigger.trim().split(/\s+/); + } + + function getLegacyWebsocketURL(elt) { + var legacySSEValue = api.getAttributeValue(elt, "hx-ws"); + if (legacySSEValue) { + var values = splitOnWhitespace(legacySSEValue); + for (var i = 0; i < values.length; i++) { + var value = values[i].split(/:(.+)/); + if (value[0] === "connect") { + return value[1]; + } + } + } + } + + /** + * ensureWebSocket creates a new WebSocket on the designated element, using + * the element's "ws-connect" attribute. + * @param {HTMLElement} socketElt + * @returns + */ + function ensureWebSocket(socketElt) { + + // If the element containing the WebSocket connection no longer exists, then + // do not connect/reconnect the WebSocket. + if (!api.bodyContains(socketElt)) { + return; + } + + // Get the source straight from the element's value + var wssSource = api.getAttributeValue(socketElt, "ws-connect") + + if (wssSource == null || wssSource === "") { + var legacySource = getLegacyWebsocketURL(socketElt); + if (legacySource == null) { + return; + } else { + wssSource = legacySource; + } + } + + // Guarantee that the wssSource value is a fully qualified URL + if (wssSource.indexOf("/") === 0) { + var base_part = location.hostname + (location.port ? ':' + location.port : ''); + if (location.protocol === 'https:') { + wssSource = "wss://" + base_part + wssSource; + } else if (location.protocol === 'http:') { + wssSource = "ws://" + base_part + wssSource; + } + } + + var socketWrapper = createWebsocketWrapper(socketElt, function () { + return htmx.createWebSocket(wssSource) + }); + + socketWrapper.addEventListener('message', function (event) { + if (maybeCloseWebSocketSource(socketElt)) { + return; + } + + var response = event.data; + if (!api.triggerEvent(socketElt, "htmx:wsBeforeMessage", { + message: response, + socketWrapper: socketWrapper.publicInterface + })) { + return; + } + + api.withExtensions(socketElt, function (extension) { + response = extension.transformResponse(response, null, socketElt); + }); + + var settleInfo = api.makeSettleInfo(socketElt); + var fragment = api.makeFragment(response); + + if (fragment.children.length) { + var children = Array.from(fragment.children); + for (var i = 0; i < children.length; i++) { + api.oobSwap(api.getAttributeValue(children[i], "hx-swap-oob") || "true", children[i], settleInfo); + } + } + + api.settleImmediately(settleInfo.tasks); + api.triggerEvent(socketElt, "htmx:wsAfterMessage", { message: response, socketWrapper: socketWrapper.publicInterface }) + }); + + // Put the WebSocket into the HTML Element's custom data. + api.getInternalData(socketElt).webSocket = socketWrapper; + } + + /** + * @typedef {Object} WebSocketWrapper + * @property {WebSocket} socket + * @property {Array<{message: string, sendElt: Element}>} messageQueue + * @property {number} retryCount + * @property {(message: string, sendElt: Element) => void} sendImmediately sendImmediately sends message regardless of websocket connection state + * @property {(message: string, sendElt: Element) => void} send + * @property {(event: string, handler: Function) => void} addEventListener + * @property {() => void} handleQueuedMessages + * @property {() => void} init + * @property {() => void} close + */ + /** + * + * @param socketElt + * @param socketFunc + * @returns {WebSocketWrapper} + */ + function createWebsocketWrapper(socketElt, socketFunc) { + var wrapper = { + socket: null, + messageQueue: [], + retryCount: 0, + + /** @type {Object} */ + events: {}, + + addEventListener: function (event, handler) { + if (this.socket) { + this.socket.addEventListener(event, handler); + } + + if (!this.events[event]) { + this.events[event] = []; + } + + this.events[event].push(handler); + }, + + sendImmediately: function (message, sendElt) { + if (!this.socket) { + api.triggerErrorEvent() + } + if (sendElt && api.triggerEvent(sendElt, 'htmx:wsBeforeSend', { + message: message, + socketWrapper: this.publicInterface + })) { + this.socket.send(message); + sendElt && api.triggerEvent(sendElt, 'htmx:wsAfterSend', { + message: message, + socketWrapper: this.publicInterface + }) + } + }, + + send: function (message, sendElt) { + if (this.socket.readyState !== this.socket.OPEN) { + this.messageQueue.push({ message: message, sendElt: sendElt }); + } else { + this.sendImmediately(message, sendElt); + } + }, + + handleQueuedMessages: function () { + while (this.messageQueue.length > 0) { + var queuedItem = this.messageQueue[0] + if (this.socket.readyState === this.socket.OPEN) { + this.sendImmediately(queuedItem.message, queuedItem.sendElt); + this.messageQueue.shift(); + } else { + break; + } + } + }, + + init: function () { + if (this.socket && this.socket.readyState === this.socket.OPEN) { + // Close discarded socket + this.socket.close() + } + + // Create a new WebSocket and event handlers + /** @type {WebSocket} */ + var socket = socketFunc(); + + // The event.type detail is added for interface conformance with the + // other two lifecycle events (open and close) so a single handler method + // can handle them polymorphically, if required. + api.triggerEvent(socketElt, "htmx:wsConnecting", { event: { type: 'connecting' } }); + + this.socket = socket; + + socket.onopen = function (e) { + wrapper.retryCount = 0; + api.triggerEvent(socketElt, "htmx:wsOpen", { event: e, socketWrapper: wrapper.publicInterface }); + wrapper.handleQueuedMessages(); + } + + socket.onclose = function (e) { + // If socket should not be connected, stop further attempts to establish connection + // If Abnormal Closure/Service Restart/Try Again Later, then set a timer to reconnect after a pause. + if (!maybeCloseWebSocketSource(socketElt) && [1006, 1012, 1013].indexOf(e.code) >= 0) { + var delay = getWebSocketReconnectDelay(wrapper.retryCount); + setTimeout(function () { + wrapper.retryCount += 1; + wrapper.init(); + }, delay); + } + + // Notify client code that connection has been closed. Client code can inspect `event` field + // to determine whether closure has been valid or abnormal + api.triggerEvent(socketElt, "htmx:wsClose", { event: e, socketWrapper: wrapper.publicInterface }) + }; + + socket.onerror = function (e) { + api.triggerErrorEvent(socketElt, "htmx:wsError", { error: e, socketWrapper: wrapper }); + maybeCloseWebSocketSource(socketElt); + }; + + var events = this.events; + Object.keys(events).forEach(function (k) { + events[k].forEach(function (e) { + socket.addEventListener(k, e); + }) + }); + }, + + close: function () { + this.socket.close() + } + } + + wrapper.init(); + + wrapper.publicInterface = { + send: wrapper.send.bind(wrapper), + sendImmediately: wrapper.sendImmediately.bind(wrapper), + queue: wrapper.messageQueue + }; + + return wrapper; + } + + /** + * ensureWebSocketSend attaches trigger handles to elements with + * "ws-send" attribute + * @param {HTMLElement} elt + */ + function ensureWebSocketSend(elt) { + var legacyAttribute = api.getAttributeValue(elt, "hx-ws"); + if (legacyAttribute && legacyAttribute !== 'send') { + return; + } + + var webSocketParent = api.getClosestMatch(elt, hasWebSocket) + processWebSocketSend(webSocketParent, elt); + } + + /** + * hasWebSocket function checks if a node has webSocket instance attached + * @param {HTMLElement} node + * @returns {boolean} + */ + function hasWebSocket(node) { + return api.getInternalData(node).webSocket != null; + } + + /** + * processWebSocketSend adds event listeners to the
    element so that + * messages can be sent to the WebSocket server when the form is submitted. + * @param {HTMLElement} socketElt + * @param {HTMLElement} sendElt + */ + function processWebSocketSend(socketElt, sendElt) { + var nodeData = api.getInternalData(sendElt); + var triggerSpecs = api.getTriggerSpecs(sendElt); + triggerSpecs.forEach(function (ts) { + api.addTriggerHandler(sendElt, ts, nodeData, function (elt, evt) { + if (maybeCloseWebSocketSource(socketElt)) { + return; + } + + /** @type {WebSocketWrapper} */ + var socketWrapper = api.getInternalData(socketElt).webSocket; + var headers = api.getHeaders(sendElt, api.getTarget(sendElt)); + var results = api.getInputValues(sendElt, 'post'); + var errors = results.errors; + var rawParameters = results.values; + var expressionVars = api.getExpressionVars(sendElt); + var allParameters = api.mergeObjects(rawParameters, expressionVars); + var filteredParameters = api.filterValues(allParameters, sendElt); + + var sendConfig = { + parameters: filteredParameters, + unfilteredParameters: allParameters, + headers: headers, + errors: errors, + + triggeringEvent: evt, + messageBody: undefined, + socketWrapper: socketWrapper.publicInterface + }; + + if (!api.triggerEvent(elt, 'htmx:wsConfigSend', sendConfig)) { + return; + } + + if (errors && errors.length > 0) { + api.triggerEvent(elt, 'htmx:validation:halted', errors); + return; + } + + var body = sendConfig.messageBody; + if (body === undefined) { + var toSend = Object.assign({}, sendConfig.parameters); + if (sendConfig.headers) + toSend['HEADERS'] = headers; + body = JSON.stringify(toSend); + } + + socketWrapper.send(body, elt); + + if (evt && api.shouldCancel(evt, elt)) { + evt.preventDefault(); + } + }); + }); + } + + /** + * getWebSocketReconnectDelay is the default easing function for WebSocket reconnects. + * @param {number} retryCount // The number of retries that have already taken place + * @returns {number} + */ + function getWebSocketReconnectDelay(retryCount) { + + /** @type {"full-jitter" | ((retryCount:number) => number)} */ + var delay = htmx.config.wsReconnectDelay; + if (typeof delay === 'function') { + return delay(retryCount); + } + if (delay === 'full-jitter') { + var exp = Math.min(retryCount, 6); + var maxDelay = 1000 * Math.pow(2, exp); + return maxDelay * Math.random(); + } + + logError('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"'); + } + + /** + * maybeCloseWebSocketSource checks to the if the element that created the WebSocket + * still exists in the DOM. If NOT, then the WebSocket is closed and this function + * returns TRUE. If the element DOES EXIST, then no action is taken, and this function + * returns FALSE. + * + * @param {*} elt + * @returns + */ + function maybeCloseWebSocketSource(elt) { + if (!api.bodyContains(elt)) { + api.getInternalData(elt).webSocket.close(); + return true; + } + return false; + } + + /** + * createWebSocket is the default method for creating new WebSocket objects. + * it is hoisted into htmx.createWebSocket to be overridden by the user, if needed. + * + * @param {string} url + * @returns WebSocket + */ + function createWebSocket(url) { + var sock = new WebSocket(url, []); + sock.binaryType = htmx.config.wsBinaryType; + return sock; + } + + /** + * queryAttributeOnThisOrChildren returns all nodes that contain the requested attributeName, INCLUDING THE PROVIDED ROOT ELEMENT. + * + * @param {HTMLElement} elt + * @param {string} attributeName + */ + function queryAttributeOnThisOrChildren(elt, attributeName) { + + var result = [] + + // If the parent element also contains the requested attribute, then add it to the results too. + if (api.hasAttribute(elt, attributeName) || api.hasAttribute(elt, "hx-ws")) { + result.push(elt); + } + + // Search all child nodes that match the requested attribute + elt.querySelectorAll("[" + attributeName + "], [data-" + attributeName + "], [data-hx-ws], [hx-ws]").forEach(function (node) { + result.push(node) + }) + + return result + } + + /** + * @template T + * @param {T[]} arr + * @param {(T) => void} func + */ + function forEach(arr, func) { + if (arr) { + for (var i = 0; i < arr.length; i++) { + func(arr[i]); + } + } + } + +})(); + diff --git a/assets/static/js/htmx/htmx.d.ts b/assets/static/js/htmx/htmx.d.ts new file mode 100644 index 0000000..ee9c6d9 --- /dev/null +++ b/assets/static/js/htmx/htmx.d.ts @@ -0,0 +1,399 @@ +// https://htmx.org/reference/#api + +/** + * This method adds a class to the given element. + * + * https://htmx.org/api/#addClass + * + * @param elt the element to add the class to + * @param clazz the class to add + * @param delay the delay (in milliseconds before class is added) + */ +export function addClass(elt: Element, clazz: string, delay?: number): void; + +/** + * Issues an htmx-style AJAX request + * + * https://htmx.org/api/#ajax + * + * @param verb 'GET', 'POST', etc. + * @param path the URL path to make the AJAX + * @param element the element to target (defaults to the **body**) + * @returns Promise that resolves immediately if no request is sent, or when the request is complete + */ +export function ajax(verb: string, path: string, element: Element): Promise; + +/** + * Issues an htmx-style AJAX request + * + * https://htmx.org/api/#ajax + * + * @param verb 'GET', 'POST', etc. + * @param path the URL path to make the AJAX + * @param selector a selector for the target + * @returns Promise that resolves immediately if no request is sent, or when the request is complete + */ +export function ajax(verb: string, path: string, selector: string): Promise; + +/** + * Issues an htmx-style AJAX request + * + * https://htmx.org/api/#ajax + * + * @param verb 'GET', 'POST', etc. + * @param path the URL path to make the AJAX + * @param context a context object that contains any of the following + * @returns Promise that resolves immediately if no request is sent, or when the request is complete + */ +export function ajax( + verb: string, + path: string, + context: Partial<{ source: any; event: any; handler: any; target: any; swap: any; values: any; headers: any }> +): Promise; + +/** + * Finds the closest matching element in the given elements parentage, inclusive of the element + * + * https://htmx.org/api/#closest + * + * @param elt the element to find the selector from + * @param selector the selector to find + */ +export function closest(elt: Element, selector: string): Element | null; + +/** + * A property holding the configuration htmx uses at runtime. + * + * Note that using a [meta tag](https://htmx.org/docs/#config) is the preferred mechanism for setting these properties. + * + * https://htmx.org/api/#config + */ +export var config: HtmxConfig; + +/** + * A property used to create new [Server Sent Event](https://htmx.org/docs/#sse) sources. This can be updated to provide custom SSE setup. + * + * https://htmx.org/api/#createEventSource + */ +export var createEventSource: (url: string) => EventSource; + +/** + * A property used to create new [WebSocket](https://htmx.org/docs/#websockets). This can be updated to provide custom WebSocket setup. + * + * https://htmx.org/api/#createWebSocket + */ +export var createWebSocket: (url: string) => WebSocket; + +/** + * Defines a new htmx [extension](https://htmx.org/extensions). + * + * https://htmx.org/api/#defineExtension + * + * @param name the extension name + * @param ext the extension definition + */ +export function defineExtension(name: string, ext: HtmxExtension): void; + +/** + * Finds an element matching the selector + * + * https://htmx.org/api/#find + * + * @param selector the selector to match + */ +export function find(selector: string): Element | null; + +/** + * Finds an element matching the selector + * + * https://htmx.org/api/#find + * + * @param elt the root element to find the matching element in, inclusive + * @param selector the selector to match + */ +export function find(elt: Element, selector: string): Element | null; + +/** + * Finds all elements matching the selector + * + * https://htmx.org/api/#findAll + * + * @param selector the selector to match + */ +export function findAll(selector: string): NodeListOf; + +/** + * Finds all elements matching the selector + * + * https://htmx.org/api/#findAll + * + * @param elt the root element to find the matching elements in, inclusive + * @param selector the selector to match + */ +export function findAll(elt: Element, selector: string): NodeListOf; + +/** + * Log all htmx events, useful for debugging. + * + * https://htmx.org/api/#logAll + */ +export function logAll(): void; + +/** + * The logger htmx uses to log with + * + * https://htmx.org/api/#logger + */ +export var logger: (elt: Element, eventName: string, detail: any) => void | null; + +/** + * Removes an event listener from an element + * + * https://htmx.org/api/#off + * + * @param eventName the event name to remove the listener from + * @param listener the listener to remove + */ +export function off(eventName: string, listener: (evt: Event) => void): (evt: Event) => void; + +/** + * Removes an event listener from an element + * + * https://htmx.org/api/#off + * + * @param target the element to remove the listener from + * @param eventName the event name to remove the listener from + * @param listener the listener to remove + */ +export function off(target: string, eventName: string, listener: (evt: Event) => void): (evt: Event) => void; + +/** + * Adds an event listener to an element + * + * https://htmx.org/api/#on + * + * @param eventName the event name to add the listener for + * @param listener the listener to add + */ +export function on(eventName: string, listener: (evt: Event) => void): (evt: Event) => void; + +/** + * Adds an event listener to an element + * + * https://htmx.org/api/#on + * + * @param target the element to add the listener to + * @param eventName the event name to add the listener for + * @param listener the listener to add + */ +export function on(target: string, eventName: string, listener: (evt: Event) => void): (evt: Event) => void; + +/** + * Adds a callback for the **htmx:load** event. This can be used to process new content, for example initializing the content with a javascript library + * + * https://htmx.org/api/#onLoad + * + * @param callback the callback to call on newly loaded content + */ +export function onLoad(callback: (element: Element) => void): void; + +/** + * Parses an interval string consistent with the way htmx does. Useful for plugins that have timing-related attributes. + * + * Caution: Accepts an int followed by either **s** or **ms**. All other values use **parseFloat** + * + * https://htmx.org/api/#parseInterval + * + * @param str timing string + */ +export function parseInterval(str: string): number; + +/** + * Processes new content, enabling htmx behavior. This can be useful if you have content that is added to the DOM outside of the normal htmx request cycle but still want htmx attributes to work. + * + * https://htmx.org/api/#process + * + * @param element element to process + */ +export function process(element: Element): void; + +/** + * Removes an element from the DOM + * + * https://htmx.org/api/#remove + * + * @param elt element to remove + * @param delay the delay (in milliseconds before element is removed) + */ +export function remove(elt: Element, delay?: number): void; + +/** + * Removes a class from the given element + * + * https://htmx.org/api/#removeClass + * + * @param elt element to remove the class from + * @param clazz the class to remove + * @param delay the delay (in milliseconds before class is removed) + */ +export function removeClass(elt: Element, clazz: string, delay?: number): void; + +/** + * Removes the given extension from htmx + * + * https://htmx.org/api/#removeExtension + * + * @param name the name of the extension to remove + */ +export function removeExtension(name: string): void; + +/** + * Takes the given class from its siblings, so that among its siblings, only the given element will have the class. + * + * https://htmx.org/api/#takeClass + * + * @param elt the element that will take the class + * @param clazz the class to take + */ +export function takeClass(elt: Element, clazz: string): void; + +/** + * Toggles the given class on an element + * + * https://htmx.org/api/#toggleClass + * + * @param elt the element to toggle the class on + * @param clazz the class to toggle + */ +export function toggleClass(elt: Element, clazz: string): void; + +/** + * Triggers a given event on an element + * + * https://htmx.org/api/#trigger + * + * @param elt the element to trigger the event on + * @param name the name of the event to trigger + * @param detail details for the event + */ +export function trigger(elt: Element, name: string, detail: any): void; + +/** + * Returns the input values that would resolve for a given element via the htmx value resolution mechanism + * + * https://htmx.org/api/#values + * + * @param elt the element to resolve values on + * @param requestType the request type (e.g. **get** or **post**) non-GET's will include the enclosing form of the element. Defaults to **post** + */ +export function values(elt: Element, requestType?: string): any; + +export const version: string; + +export interface HtmxConfig { + /** + * The attributes to settle during the settling phase. + * @default ["class", "style", "width", "height"] + */ + attributesToSettle?: ["class", "style", "width", "height"] | string[]; + /** + * If the focused element should be scrolled into view. + * @default false + */ + defaultFocusScroll?: boolean; + /** + * The default delay between completing the content swap and settling attributes. + * @default 20 + */ + defaultSettleDelay?: number; + /** + * The default delay between receiving a response from the server and doing the swap. + * @default 0 + */ + defaultSwapDelay?: number; + /** + * The default swap style to use if **[hx-swap](https://htmx.org/attributes/hx-swap)** is omitted. + * @default "innerHTML" + */ + defaultSwapStyle?: "innerHTML" | string; + /** + * The number of pages to keep in **localStorage** for history support. + * @default 10 + */ + historyCacheSize?: number; + /** + * Whether or not to use history. + * @default true + */ + historyEnabled?: boolean; + /** + * If true, htmx will inject a small amount of CSS into the page to make indicators invisible unless the **htmx-indicator** class is present. + * @default true + */ + includeIndicatorStyles?: boolean; + /** + * The class to place on indicators when a request is in flight. + * @default "htmx-indicator" + */ + indicatorClass?: "htmx-indicator" | string; + /** + * The class to place on triggering elements when a request is in flight. + * @default "htmx-request" + */ + requestClass?: "htmx-request" | string; + /** + * The class to temporarily place on elements that htmx has added to the DOM. + * @default "htmx-added" + */ + addedClass?: "htmx-added" | string; + /** + * The class to place on target elements when htmx is in the settling phase. + * @default "htmx-settling" + */ + settlingClass?: "htmx-settling" | string; + /** + * The class to place on target elements when htmx is in the swapping phase. + * @default "htmx-swapping" + */ + swappingClass?: "htmx-swapping" | string; + /** + * Allows the use of eval-like functionality in htmx, to enable **hx-vars**, trigger conditions & script tag evaluation. Can be set to **false** for CSP compatibility. + * @default true + */ + allowEval?: boolean; + /** + * Use HTML template tags for parsing content from the server. This allows you to use Out of Band content when returning things like table rows, but it is *not* IE11 compatible. + * @default false + */ + useTemplateFragments?: boolean; + /** + * Allow cross-site Access-Control requests using credentials such as cookies, authorization headers or TLS client certificates. + * @default false + */ + withCredentials?: boolean; + /** + * The default implementation of **getWebSocketReconnectDelay** for reconnecting after unexpected connection loss by the event code **Abnormal Closure**, **Service Restart** or **Try Again Later**. + * @default "full-jitter" + */ + wsReconnectDelay?: "full-jitter" | string | ((retryCount: number) => number); + // following don't appear in the docs + /** @default false */ + refreshOnHistoryMiss?: boolean; + /** @default 0 */ + timeout?: number; + /** @default "[hx-disable], [data-hx-disable]" */ + disableSelector?: "[hx-disable], [data-hx-disable]" | string; + /** @default "smooth" */ + scrollBehavior?: "smooth" | "auto"; +} + +/** + * https://htmx.org/extensions/#defining + */ +export interface HtmxExtension { + onEvent?: (name: string, evt: CustomEvent) => any; + transformResponse?: (text: any, xhr: XMLHttpRequest, elt: any) => any; + isInlineSwap?: (swapStyle: any) => any; + handleSwap?: (swapStyle: any, target: any, fragment: any, settleInfo: any) => any; + encodeParameters?: (xhr: XMLHttpRequest, parameters: any, elt: any) => any; +} diff --git a/assets/static/js/htmx/htmx.js b/assets/static/js/htmx/htmx.js new file mode 100644 index 0000000..9a8f109 --- /dev/null +++ b/assets/static/js/htmx/htmx.js @@ -0,0 +1,3818 @@ +// UMD insanity +// This code sets up support for (in order) AMD, ES6 modules, and globals. +(function (root, factory) { + //@ts-ignore + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + //@ts-ignore + define([], factory); + } else if (typeof module === 'object' && module.exports) { + // Node. Does not work with strict CommonJS, but + // only CommonJS-like environments that support module.exports, + // like Node. + module.exports = factory(); + } else { + // Browser globals + root.htmx = root.htmx || factory(); + } +}(typeof self !== 'undefined' ? self : this, function () { +return (function () { + 'use strict'; + + // Public API + //** @type {import("./htmx").HtmxApi} */ + // TODO: list all methods in public API + var htmx = { + onLoad: onLoadHelper, + process: processNode, + on: addEventListenerImpl, + off: removeEventListenerImpl, + trigger : triggerEvent, + ajax : ajaxHelper, + find : find, + findAll : findAll, + closest : closest, + values : function(elt, type){ + var inputValues = getInputValues(elt, type || "post"); + return inputValues.values; + }, + remove : removeElement, + addClass : addClassToElement, + removeClass : removeClassFromElement, + toggleClass : toggleClassOnElement, + takeClass : takeClassForElement, + defineExtension : defineExtension, + removeExtension : removeExtension, + logAll : logAll, + logNone : logNone, + logger : null, + config : { + historyEnabled:true, + historyCacheSize:10, + refreshOnHistoryMiss:false, + defaultSwapStyle:'innerHTML', + defaultSwapDelay:0, + defaultSettleDelay:20, + includeIndicatorStyles:true, + indicatorClass:'htmx-indicator', + requestClass:'htmx-request', + addedClass:'htmx-added', + settlingClass:'htmx-settling', + swappingClass:'htmx-swapping', + allowEval:true, + allowScriptTags:true, + inlineScriptNonce:'', + attributesToSettle:["class", "style", "width", "height"], + withCredentials:false, + timeout:0, + wsReconnectDelay: 'full-jitter', + wsBinaryType: 'blob', + disableSelector: "[hx-disable], [data-hx-disable]", + useTemplateFragments: false, + scrollBehavior: 'smooth', + defaultFocusScroll: false, + getCacheBusterParam: false, + globalViewTransitions: false, + methodsThatUseUrlParams: ["get"], + selfRequestsOnly: false, + scrollIntoViewOnBoost: true + }, + parseInterval:parseInterval, + _:internalEval, + createEventSource: function(url){ + return new EventSource(url, {withCredentials:true}) + }, + createWebSocket: function(url){ + var sock = new WebSocket(url, []); + sock.binaryType = htmx.config.wsBinaryType; + return sock; + }, + version: "1.9.7" + }; + + /** @type {import("./htmx").HtmxInternalApi} */ + var internalAPI = { + addTriggerHandler: addTriggerHandler, + bodyContains: bodyContains, + canAccessLocalStorage: canAccessLocalStorage, + findThisElement: findThisElement, + filterValues: filterValues, + hasAttribute: hasAttribute, + getAttributeValue: getAttributeValue, + getClosestAttributeValue: getClosestAttributeValue, + getClosestMatch: getClosestMatch, + getExpressionVars: getExpressionVars, + getHeaders: getHeaders, + getInputValues: getInputValues, + getInternalData: getInternalData, + getSwapSpecification: getSwapSpecification, + getTriggerSpecs: getTriggerSpecs, + getTarget: getTarget, + makeFragment: makeFragment, + mergeObjects: mergeObjects, + makeSettleInfo: makeSettleInfo, + oobSwap: oobSwap, + querySelectorExt: querySelectorExt, + selectAndSwap: selectAndSwap, + settleImmediately: settleImmediately, + shouldCancel: shouldCancel, + triggerEvent: triggerEvent, + triggerErrorEvent: triggerErrorEvent, + withExtensions: withExtensions, + } + + var VERBS = ['get', 'post', 'put', 'delete', 'patch']; + var VERB_SELECTOR = VERBS.map(function(verb){ + return "[hx-" + verb + "], [data-hx-" + verb + "]" + }).join(", "); + + //==================================================================== + // Utilities + //==================================================================== + + function parseInterval(str) { + if (str == undefined) { + return undefined + } + if (str.slice(-2) == "ms") { + return parseFloat(str.slice(0,-2)) || undefined + } + if (str.slice(-1) == "s") { + return (parseFloat(str.slice(0,-1)) * 1000) || undefined + } + if (str.slice(-1) == "m") { + return (parseFloat(str.slice(0,-1)) * 1000 * 60) || undefined + } + return parseFloat(str) || undefined + } + + /** + * @param {HTMLElement} elt + * @param {string} name + * @returns {(string | null)} + */ + function getRawAttribute(elt, name) { + return elt.getAttribute && elt.getAttribute(name); + } + + // resolve with both hx and data-hx prefixes + function hasAttribute(elt, qualifiedName) { + return elt.hasAttribute && (elt.hasAttribute(qualifiedName) || + elt.hasAttribute("data-" + qualifiedName)); + } + + /** + * + * @param {HTMLElement} elt + * @param {string} qualifiedName + * @returns {(string | null)} + */ + function getAttributeValue(elt, qualifiedName) { + return getRawAttribute(elt, qualifiedName) || getRawAttribute(elt, "data-" + qualifiedName); + } + + /** + * @param {HTMLElement} elt + * @returns {HTMLElement | null} + */ + function parentElt(elt) { + return elt.parentElement; + } + + /** + * @returns {Document} + */ + function getDocument() { + return document; + } + + /** + * @param {HTMLElement} elt + * @param {(e:HTMLElement) => boolean} condition + * @returns {HTMLElement | null} + */ + function getClosestMatch(elt, condition) { + while (elt && !condition(elt)) { + elt = parentElt(elt); + } + + return elt ? elt : null; + } + + function getAttributeValueWithDisinheritance(initialElement, ancestor, attributeName){ + var attributeValue = getAttributeValue(ancestor, attributeName); + var disinherit = getAttributeValue(ancestor, "hx-disinherit"); + if (initialElement !== ancestor && disinherit && (disinherit === "*" || disinherit.split(" ").indexOf(attributeName) >= 0)) { + return "unset"; + } else { + return attributeValue + } + } + + /** + * @param {HTMLElement} elt + * @param {string} attributeName + * @returns {string | null} + */ + function getClosestAttributeValue(elt, attributeName) { + var closestAttr = null; + getClosestMatch(elt, function (e) { + return closestAttr = getAttributeValueWithDisinheritance(elt, e, attributeName); + }); + if (closestAttr !== "unset") { + return closestAttr; + } + } + + /** + * @param {HTMLElement} elt + * @param {string} selector + * @returns {boolean} + */ + function matches(elt, selector) { + // @ts-ignore: non-standard properties for browser compatibility + // noinspection JSUnresolvedVariable + var matchesFunction = elt.matches || elt.matchesSelector || elt.msMatchesSelector || elt.mozMatchesSelector || elt.webkitMatchesSelector || elt.oMatchesSelector; + return matchesFunction && matchesFunction.call(elt, selector); + } + + /** + * @param {string} str + * @returns {string} + */ + function getStartTag(str) { + var tagMatcher = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i + var match = tagMatcher.exec( str ); + if (match) { + return match[1].toLowerCase(); + } else { + return ""; + } + } + + /** + * + * @param {string} resp + * @param {number} depth + * @returns {Element} + */ + function parseHTML(resp, depth) { + var parser = new DOMParser(); + var responseDoc = parser.parseFromString(resp, "text/html"); + + /** @type {Element} */ + var responseNode = responseDoc.body; + while (depth > 0) { + depth--; + // @ts-ignore + responseNode = responseNode.firstChild; + } + if (responseNode == null) { + // @ts-ignore + responseNode = getDocument().createDocumentFragment(); + } + return responseNode; + } + + function aFullPageResponse(resp) { + return resp.match(/", 0); + // @ts-ignore type mismatch between DocumentFragment and Element. + // TODO: Are these close enough for htmx to use interchangeably? + return documentFragment.querySelector('template').content; + } else { + var startTag = getStartTag(resp); + switch (startTag) { + case "thead": + case "tbody": + case "tfoot": + case "colgroup": + case "caption": + return parseHTML("" + resp + "
    ", 1); + case "col": + return parseHTML("" + resp + "
    ", 2); + case "tr": + return parseHTML("" + resp + "
    ", 2); + case "td": + case "th": + return parseHTML("" + resp + "
    ", 3); + case "script": + case "style": + return parseHTML("
    " + resp + "
    ", 1); + default: + return parseHTML(resp, 0); + } + } + } + + /** + * @param {Function} func + */ + function maybeCall(func){ + if(func) { + func(); + } + } + + /** + * @param {any} o + * @param {string} type + * @returns + */ + function isType(o, type) { + return Object.prototype.toString.call(o) === "[object " + type + "]"; + } + + /** + * @param {*} o + * @returns {o is Function} + */ + function isFunction(o) { + return isType(o, "Function"); + } + + /** + * @param {*} o + * @returns {o is Object} + */ + function isRawObject(o) { + return isType(o, "Object"); + } + + /** + * getInternalData retrieves "private" data stored by htmx within an element + * @param {HTMLElement} elt + * @returns {*} + */ + function getInternalData(elt) { + var dataProp = 'htmx-internal-data'; + var data = elt[dataProp]; + if (!data) { + data = elt[dataProp] = {}; + } + return data; + } + + /** + * toArray converts an ArrayLike object into a real array. + * @param {ArrayLike} arr + * @returns {any[]} + */ + function toArray(arr) { + var returnArr = []; + if (arr) { + for (var i = 0; i < arr.length; i++) { + returnArr.push(arr[i]); + } + } + return returnArr + } + + function forEach(arr, func) { + if (arr) { + for (var i = 0; i < arr.length; i++) { + func(arr[i]); + } + } + } + + function isScrolledIntoView(el) { + var rect = el.getBoundingClientRect(); + var elemTop = rect.top; + var elemBottom = rect.bottom; + return elemTop < window.innerHeight && elemBottom >= 0; + } + + function bodyContains(elt) { + // IE Fix + if (elt.getRootNode && elt.getRootNode() instanceof window.ShadowRoot) { + return getDocument().body.contains(elt.getRootNode().host); + } else { + return getDocument().body.contains(elt); + } + } + + function splitOnWhitespace(trigger) { + return trigger.trim().split(/\s+/); + } + + /** + * mergeObjects takes all of the keys from + * obj2 and duplicates them into obj1 + * @param {Object} obj1 + * @param {Object} obj2 + * @returns {Object} + */ + function mergeObjects(obj1, obj2) { + for (var key in obj2) { + if (obj2.hasOwnProperty(key)) { + obj1[key] = obj2[key]; + } + } + return obj1; + } + + function parseJSON(jString) { + try { + return JSON.parse(jString); + } catch(error) { + logError(error); + return null; + } + } + + function canAccessLocalStorage() { + var test = 'htmx:localStorageTest'; + try { + localStorage.setItem(test, test); + localStorage.removeItem(test); + return true; + } catch(e) { + return false; + } + } + + function normalizePath(path) { + try { + var url = new URL(path); + if (url) { + path = url.pathname + url.search; + } + // remove trailing slash, unless index page + if (!path.match('^/$')) { + path = path.replace(/\/+$/, ''); + } + return path; + } catch (e) { + // be kind to IE11, which doesn't support URL() + return path; + } + } + + //========================================================================================== + // public API + //========================================================================================== + + function internalEval(str){ + return maybeEval(getDocument().body, function () { + return eval(str); + }); + } + + function onLoadHelper(callback) { + var value = htmx.on("htmx:load", function(evt) { + callback(evt.detail.elt); + }); + return value; + } + + function logAll(){ + htmx.logger = function(elt, event, data) { + if(console) { + console.log(event, elt, data); + } + } + } + + function logNone() { + htmx.logger = null + } + + function find(eltOrSelector, selector) { + if (selector) { + return eltOrSelector.querySelector(selector); + } else { + return find(getDocument(), eltOrSelector); + } + } + + function findAll(eltOrSelector, selector) { + if (selector) { + return eltOrSelector.querySelectorAll(selector); + } else { + return findAll(getDocument(), eltOrSelector); + } + } + + function removeElement(elt, delay) { + elt = resolveTarget(elt); + if (delay) { + setTimeout(function(){ + removeElement(elt); + elt = null; + }, delay); + } else { + elt.parentElement.removeChild(elt); + } + } + + function addClassToElement(elt, clazz, delay) { + elt = resolveTarget(elt); + if (delay) { + setTimeout(function(){ + addClassToElement(elt, clazz); + elt = null; + }, delay); + } else { + elt.classList && elt.classList.add(clazz); + } + } + + function removeClassFromElement(elt, clazz, delay) { + elt = resolveTarget(elt); + if (delay) { + setTimeout(function(){ + removeClassFromElement(elt, clazz); + elt = null; + }, delay); + } else { + if (elt.classList) { + elt.classList.remove(clazz); + // if there are no classes left, remove the class attribute + if (elt.classList.length === 0) { + elt.removeAttribute("class"); + } + } + } + } + + function toggleClassOnElement(elt, clazz) { + elt = resolveTarget(elt); + elt.classList.toggle(clazz); + } + + function takeClassForElement(elt, clazz) { + elt = resolveTarget(elt); + forEach(elt.parentElement.children, function(child){ + removeClassFromElement(child, clazz); + }) + addClassToElement(elt, clazz); + } + + function closest(elt, selector) { + elt = resolveTarget(elt); + if (elt.closest) { + return elt.closest(selector); + } else { + // TODO remove when IE goes away + do{ + if (elt == null || matches(elt, selector)){ + return elt; + } + } + while (elt = elt && parentElt(elt)); + return null; + } + } + + function startsWith(str, prefix) { + return str.substring(0, prefix.length) === prefix + } + + function endsWith(str, suffix) { + return str.substring(str.length - suffix.length) === suffix + } + + function normalizeSelector(selector) { + var trimmedSelector = selector.trim(); + if (startsWith(trimmedSelector, "<") && endsWith(trimmedSelector, "/>")) { + return trimmedSelector.substring(1, trimmedSelector.length - 2); + } else { + return trimmedSelector; + } + } + + function querySelectorAllExt(elt, selector) { + if (selector.indexOf("closest ") === 0) { + return [closest(elt, normalizeSelector(selector.substr(8)))]; + } else if (selector.indexOf("find ") === 0) { + return [find(elt, normalizeSelector(selector.substr(5)))]; + } else if (selector === "next") { + return [elt.nextElementSibling] + } else if (selector.indexOf("next ") === 0) { + return [scanForwardQuery(elt, normalizeSelector(selector.substr(5)))]; + } else if (selector === "previous") { + return [elt.previousElementSibling] + } else if (selector.indexOf("previous ") === 0) { + return [scanBackwardsQuery(elt, normalizeSelector(selector.substr(9)))]; + } else if (selector === 'document') { + return [document]; + } else if (selector === 'window') { + return [window]; + } else if (selector === 'body') { + return [document.body]; + } else { + return getDocument().querySelectorAll(normalizeSelector(selector)); + } + } + + var scanForwardQuery = function(start, match) { + var results = getDocument().querySelectorAll(match); + for (var i = 0; i < results.length; i++) { + var elt = results[i]; + if (elt.compareDocumentPosition(start) === Node.DOCUMENT_POSITION_PRECEDING) { + return elt; + } + } + } + + var scanBackwardsQuery = function(start, match) { + var results = getDocument().querySelectorAll(match); + for (var i = results.length - 1; i >= 0; i--) { + var elt = results[i]; + if (elt.compareDocumentPosition(start) === Node.DOCUMENT_POSITION_FOLLOWING) { + return elt; + } + } + } + + function querySelectorExt(eltOrSelector, selector) { + if (selector) { + return querySelectorAllExt(eltOrSelector, selector)[0]; + } else { + return querySelectorAllExt(getDocument().body, eltOrSelector)[0]; + } + } + + function resolveTarget(arg2) { + if (isType(arg2, 'String')) { + return find(arg2); + } else { + return arg2; + } + } + + function processEventArgs(arg1, arg2, arg3) { + if (isFunction(arg2)) { + return { + target: getDocument().body, + event: arg1, + listener: arg2 + } + } else { + return { + target: resolveTarget(arg1), + event: arg2, + listener: arg3 + } + } + + } + + function addEventListenerImpl(arg1, arg2, arg3) { + ready(function(){ + var eventArgs = processEventArgs(arg1, arg2, arg3); + eventArgs.target.addEventListener(eventArgs.event, eventArgs.listener); + }) + var b = isFunction(arg2); + return b ? arg2 : arg3; + } + + function removeEventListenerImpl(arg1, arg2, arg3) { + ready(function(){ + var eventArgs = processEventArgs(arg1, arg2, arg3); + eventArgs.target.removeEventListener(eventArgs.event, eventArgs.listener); + }) + return isFunction(arg2) ? arg2 : arg3; + } + + //==================================================================== + // Node processing + //==================================================================== + + var DUMMY_ELT = getDocument().createElement("output"); // dummy element for bad selectors + function findAttributeTargets(elt, attrName) { + var attrTarget = getClosestAttributeValue(elt, attrName); + if (attrTarget) { + if (attrTarget === "this") { + return [findThisElement(elt, attrName)]; + } else { + var result = querySelectorAllExt(elt, attrTarget); + if (result.length === 0) { + logError('The selector "' + attrTarget + '" on ' + attrName + " returned no matches!"); + return [DUMMY_ELT] + } else { + return result; + } + } + } + } + + function findThisElement(elt, attribute){ + return getClosestMatch(elt, function (elt) { + return getAttributeValue(elt, attribute) != null; + }) + } + + function getTarget(elt) { + var targetStr = getClosestAttributeValue(elt, "hx-target"); + if (targetStr) { + if (targetStr === "this") { + return findThisElement(elt,'hx-target'); + } else { + return querySelectorExt(elt, targetStr) + } + } else { + var data = getInternalData(elt); + if (data.boosted) { + return getDocument().body; + } else { + return elt; + } + } + } + + function shouldSettleAttribute(name) { + var attributesToSettle = htmx.config.attributesToSettle; + for (var i = 0; i < attributesToSettle.length; i++) { + if (name === attributesToSettle[i]) { + return true; + } + } + return false; + } + + function cloneAttributes(mergeTo, mergeFrom) { + forEach(mergeTo.attributes, function (attr) { + if (!mergeFrom.hasAttribute(attr.name) && shouldSettleAttribute(attr.name)) { + mergeTo.removeAttribute(attr.name) + } + }); + forEach(mergeFrom.attributes, function (attr) { + if (shouldSettleAttribute(attr.name)) { + mergeTo.setAttribute(attr.name, attr.value); + } + }); + } + + function isInlineSwap(swapStyle, target) { + var extensions = getExtensions(target); + for (var i = 0; i < extensions.length; i++) { + var extension = extensions[i]; + try { + if (extension.isInlineSwap(swapStyle)) { + return true; + } + } catch(e) { + logError(e); + } + } + return swapStyle === "outerHTML"; + } + + /** + * + * @param {string} oobValue + * @param {HTMLElement} oobElement + * @param {*} settleInfo + * @returns + */ + function oobSwap(oobValue, oobElement, settleInfo) { + var selector = "#" + getRawAttribute(oobElement, "id"); + var swapStyle = "outerHTML"; + if (oobValue === "true") { + // do nothing + } else if (oobValue.indexOf(":") > 0) { + swapStyle = oobValue.substr(0, oobValue.indexOf(":")); + selector = oobValue.substr(oobValue.indexOf(":") + 1, oobValue.length); + } else { + swapStyle = oobValue; + } + + var targets = getDocument().querySelectorAll(selector); + if (targets) { + forEach( + targets, + function (target) { + var fragment; + var oobElementClone = oobElement.cloneNode(true); + fragment = getDocument().createDocumentFragment(); + fragment.appendChild(oobElementClone); + if (!isInlineSwap(swapStyle, target)) { + fragment = oobElementClone; // if this is not an inline swap, we use the content of the node, not the node itself + } + + var beforeSwapDetails = {shouldSwap: true, target: target, fragment:fragment }; + if (!triggerEvent(target, 'htmx:oobBeforeSwap', beforeSwapDetails)) return; + + target = beforeSwapDetails.target; // allow re-targeting + if (beforeSwapDetails['shouldSwap']){ + swap(swapStyle, target, target, fragment, settleInfo); + } + forEach(settleInfo.elts, function (elt) { + triggerEvent(elt, 'htmx:oobAfterSwap', beforeSwapDetails); + }); + } + ); + oobElement.parentNode.removeChild(oobElement); + } else { + oobElement.parentNode.removeChild(oobElement); + triggerErrorEvent(getDocument().body, "htmx:oobErrorNoTarget", {content: oobElement}); + } + return oobValue; + } + + function handleOutOfBandSwaps(elt, fragment, settleInfo) { + var oobSelects = getClosestAttributeValue(elt, "hx-select-oob"); + if (oobSelects) { + var oobSelectValues = oobSelects.split(","); + for (let i = 0; i < oobSelectValues.length; i++) { + var oobSelectValue = oobSelectValues[i].split(":", 2); + var id = oobSelectValue[0].trim(); + if (id.indexOf("#") === 0) { + id = id.substring(1); + } + var oobValue = oobSelectValue[1] || "true"; + var oobElement = fragment.querySelector("#" + id); + if (oobElement) { + oobSwap(oobValue, oobElement, settleInfo); + } + } + } + forEach(findAll(fragment, '[hx-swap-oob], [data-hx-swap-oob]'), function (oobElement) { + var oobValue = getAttributeValue(oobElement, "hx-swap-oob"); + if (oobValue != null) { + oobSwap(oobValue, oobElement, settleInfo); + } + }); + } + + function handlePreservedElements(fragment) { + forEach(findAll(fragment, '[hx-preserve], [data-hx-preserve]'), function (preservedElt) { + var id = getAttributeValue(preservedElt, "id"); + var oldElt = getDocument().getElementById(id); + if (oldElt != null) { + preservedElt.parentNode.replaceChild(oldElt, preservedElt); + } + }); + } + + function handleAttributes(parentNode, fragment, settleInfo) { + forEach(fragment.querySelectorAll("[id]"), function (newNode) { + var id = getRawAttribute(newNode, "id") + if (id && id.length > 0) { + var normalizedId = id.replace("'", "\\'"); + var normalizedTag = newNode.tagName.replace(':', '\\:'); + var oldNode = parentNode.querySelector(normalizedTag + "[id='" + normalizedId + "']"); + if (oldNode && oldNode !== parentNode) { + var newAttributes = newNode.cloneNode(); + cloneAttributes(newNode, oldNode); + settleInfo.tasks.push(function () { + cloneAttributes(newNode, newAttributes); + }); + } + } + }); + } + + function makeAjaxLoadTask(child) { + return function () { + removeClassFromElement(child, htmx.config.addedClass); + processNode(child); + processScripts(child); + processFocus(child) + triggerEvent(child, 'htmx:load'); + }; + } + + function processFocus(child) { + var autofocus = "[autofocus]"; + var autoFocusedElt = matches(child, autofocus) ? child : child.querySelector(autofocus) + if (autoFocusedElt != null) { + autoFocusedElt.focus(); + } + } + + function insertNodesBefore(parentNode, insertBefore, fragment, settleInfo) { + handleAttributes(parentNode, fragment, settleInfo); + while(fragment.childNodes.length > 0){ + var child = fragment.firstChild; + addClassToElement(child, htmx.config.addedClass); + parentNode.insertBefore(child, insertBefore); + if (child.nodeType !== Node.TEXT_NODE && child.nodeType !== Node.COMMENT_NODE) { + settleInfo.tasks.push(makeAjaxLoadTask(child)); + } + } + } + + // based on https://gist.github.com/hyamamoto/fd435505d29ebfa3d9716fd2be8d42f0, + // derived from Java's string hashcode implementation + function stringHash(string, hash) { + var char = 0; + while (char < string.length){ + hash = (hash << 5) - hash + string.charCodeAt(char++) | 0; // bitwise or ensures we have a 32-bit int + } + return hash; + } + + function attributeHash(elt) { + var hash = 0; + // IE fix + if (elt.attributes) { + for (var i = 0; i < elt.attributes.length; i++) { + var attribute = elt.attributes[i]; + if(attribute.value){ // only include attributes w/ actual values (empty is same as non-existent) + hash = stringHash(attribute.name, hash); + hash = stringHash(attribute.value, hash); + } + } + } + return hash; + } + + function deInitOnHandlers(elt) { + var internalData = getInternalData(elt); + if (internalData.onHandlers) { + for (let i = 0; i < internalData.onHandlers.length; i++) { + const handlerInfo = internalData.onHandlers[i]; + elt.removeEventListener(handlerInfo.event, handlerInfo.listener); + } + delete internalData.onHandlers + } + } + + function deInitNode(element) { + var internalData = getInternalData(element); + if (internalData.timeout) { + clearTimeout(internalData.timeout); + } + if (internalData.webSocket) { + internalData.webSocket.close(); + } + if (internalData.sseEventSource) { + internalData.sseEventSource.close(); + } + if (internalData.listenerInfos) { + forEach(internalData.listenerInfos, function (info) { + if (info.on) { + info.on.removeEventListener(info.trigger, info.listener); + } + }); + } + if (internalData.initHash) { + internalData.initHash = null + } + deInitOnHandlers(element); + } + + function cleanUpElement(element) { + triggerEvent(element, "htmx:beforeCleanupElement") + deInitNode(element); + if (element.children) { // IE + forEach(element.children, function(child) { cleanUpElement(child) }); + } + } + + function swapOuterHTML(target, fragment, settleInfo) { + if (target.tagName === "BODY") { + return swapInnerHTML(target, fragment, settleInfo); + } else { + // @type {HTMLElement} + var newElt + var eltBeforeNewContent = target.previousSibling; + insertNodesBefore(parentElt(target), target, fragment, settleInfo); + if (eltBeforeNewContent == null) { + newElt = parentElt(target).firstChild; + } else { + newElt = eltBeforeNewContent.nextSibling; + } + getInternalData(target).replacedWith = newElt; // tuck away so we can fire events on it later + settleInfo.elts = settleInfo.elts.filter(function(e) { return e != target }); + while(newElt && newElt !== target) { + if (newElt.nodeType === Node.ELEMENT_NODE) { + settleInfo.elts.push(newElt); + } + newElt = newElt.nextElementSibling; + } + cleanUpElement(target); + parentElt(target).removeChild(target); + } + } + + function swapAfterBegin(target, fragment, settleInfo) { + return insertNodesBefore(target, target.firstChild, fragment, settleInfo); + } + + function swapBeforeBegin(target, fragment, settleInfo) { + return insertNodesBefore(parentElt(target), target, fragment, settleInfo); + } + + function swapBeforeEnd(target, fragment, settleInfo) { + return insertNodesBefore(target, null, fragment, settleInfo); + } + + function swapAfterEnd(target, fragment, settleInfo) { + return insertNodesBefore(parentElt(target), target.nextSibling, fragment, settleInfo); + } + function swapDelete(target, fragment, settleInfo) { + cleanUpElement(target); + return parentElt(target).removeChild(target); + } + + function swapInnerHTML(target, fragment, settleInfo) { + var firstChild = target.firstChild; + insertNodesBefore(target, firstChild, fragment, settleInfo); + if (firstChild) { + while (firstChild.nextSibling) { + cleanUpElement(firstChild.nextSibling) + target.removeChild(firstChild.nextSibling); + } + cleanUpElement(firstChild) + target.removeChild(firstChild); + } + } + + function maybeSelectFromResponse(elt, fragment, selectOverride) { + var selector = selectOverride || getClosestAttributeValue(elt, "hx-select"); + if (selector) { + var newFragment = getDocument().createDocumentFragment(); + forEach(fragment.querySelectorAll(selector), function (node) { + newFragment.appendChild(node); + }); + fragment = newFragment; + } + return fragment; + } + + function swap(swapStyle, elt, target, fragment, settleInfo) { + switch (swapStyle) { + case "none": + return; + case "outerHTML": + swapOuterHTML(target, fragment, settleInfo); + return; + case "afterbegin": + swapAfterBegin(target, fragment, settleInfo); + return; + case "beforebegin": + swapBeforeBegin(target, fragment, settleInfo); + return; + case "beforeend": + swapBeforeEnd(target, fragment, settleInfo); + return; + case "afterend": + swapAfterEnd(target, fragment, settleInfo); + return; + case "delete": + swapDelete(target, fragment, settleInfo); + return; + default: + var extensions = getExtensions(elt); + for (var i = 0; i < extensions.length; i++) { + var ext = extensions[i]; + try { + var newElements = ext.handleSwap(swapStyle, target, fragment, settleInfo); + if (newElements) { + if (typeof newElements.length !== 'undefined') { + // if handleSwap returns an array (like) of elements, we handle them + for (var j = 0; j < newElements.length; j++) { + var child = newElements[j]; + if (child.nodeType !== Node.TEXT_NODE && child.nodeType !== Node.COMMENT_NODE) { + settleInfo.tasks.push(makeAjaxLoadTask(child)); + } + } + } + return; + } + } catch (e) { + logError(e); + } + } + if (swapStyle === "innerHTML") { + swapInnerHTML(target, fragment, settleInfo); + } else { + swap(htmx.config.defaultSwapStyle, elt, target, fragment, settleInfo); + } + } + } + + function findTitle(content) { + if (content.indexOf(' -1) { + var contentWithSvgsRemoved = content.replace(/]*>|>)([\s\S]*?)<\/svg>/gim, ''); + var result = contentWithSvgsRemoved.match(/]*>|>)([\s\S]*?)<\/title>/im); + + if (result) { + return result[2]; + } + } + } + + function selectAndSwap(swapStyle, target, elt, responseText, settleInfo, selectOverride) { + settleInfo.title = findTitle(responseText); + var fragment = makeFragment(responseText); + if (fragment) { + handleOutOfBandSwaps(elt, fragment, settleInfo); + fragment = maybeSelectFromResponse(elt, fragment, selectOverride); + handlePreservedElements(fragment); + return swap(swapStyle, elt, target, fragment, settleInfo); + } + } + + function handleTrigger(xhr, header, elt) { + var triggerBody = xhr.getResponseHeader(header); + if (triggerBody.indexOf("{") === 0) { + var triggers = parseJSON(triggerBody); + for (var eventName in triggers) { + if (triggers.hasOwnProperty(eventName)) { + var detail = triggers[eventName]; + if (!isRawObject(detail)) { + detail = {"value": detail} + } + triggerEvent(elt, eventName, detail); + } + } + } else { + var eventNames = triggerBody.split(",") + for (var i = 0; i < eventNames.length; i++) { + triggerEvent(elt, eventNames[i].trim(), []); + } + } + } + + var WHITESPACE = /\s/; + var WHITESPACE_OR_COMMA = /[\s,]/; + var SYMBOL_START = /[_$a-zA-Z]/; + var SYMBOL_CONT = /[_$a-zA-Z0-9]/; + var STRINGISH_START = ['"', "'", "/"]; + var NOT_WHITESPACE = /[^\s]/; + function tokenizeString(str) { + var tokens = []; + var position = 0; + while (position < str.length) { + if(SYMBOL_START.exec(str.charAt(position))) { + var startPosition = position; + while (SYMBOL_CONT.exec(str.charAt(position + 1))) { + position++; + } + tokens.push(str.substr(startPosition, position - startPosition + 1)); + } else if (STRINGISH_START.indexOf(str.charAt(position)) !== -1) { + var startChar = str.charAt(position); + var startPosition = position; + position++; + while (position < str.length && str.charAt(position) !== startChar ) { + if (str.charAt(position) === "\\") { + position++; + } + position++; + } + tokens.push(str.substr(startPosition, position - startPosition + 1)); + } else { + var symbol = str.charAt(position); + tokens.push(symbol); + } + position++; + } + return tokens; + } + + function isPossibleRelativeReference(token, last, paramName) { + return SYMBOL_START.exec(token.charAt(0)) && + token !== "true" && + token !== "false" && + token !== "this" && + token !== paramName && + last !== "."; + } + + function maybeGenerateConditional(elt, tokens, paramName) { + if (tokens[0] === '[') { + tokens.shift(); + var bracketCount = 1; + var conditionalSource = " return (function(" + paramName + "){ return ("; + var last = null; + while (tokens.length > 0) { + var token = tokens[0]; + if (token === "]") { + bracketCount--; + if (bracketCount === 0) { + if (last === null) { + conditionalSource = conditionalSource + "true"; + } + tokens.shift(); + conditionalSource += ")})"; + try { + var conditionFunction = maybeEval(elt,function () { + return Function(conditionalSource)(); + }, + function(){return true}) + conditionFunction.source = conditionalSource; + return conditionFunction; + } catch (e) { + triggerErrorEvent(getDocument().body, "htmx:syntax:error", {error:e, source:conditionalSource}) + return null; + } + } + } else if (token === "[") { + bracketCount++; + } + if (isPossibleRelativeReference(token, last, paramName)) { + conditionalSource += "((" + paramName + "." + token + ") ? (" + paramName + "." + token + ") : (window." + token + "))"; + } else { + conditionalSource = conditionalSource + token; + } + last = tokens.shift(); + } + } + } + + function consumeUntil(tokens, match) { + var result = ""; + while (tokens.length > 0 && !tokens[0].match(match)) { + result += tokens.shift(); + } + return result; + } + + var INPUT_SELECTOR = 'input, textarea, select'; + + /** + * @param {HTMLElement} elt + * @returns {import("./htmx").HtmxTriggerSpecification[]} + */ + function getTriggerSpecs(elt) { + var explicitTrigger = getAttributeValue(elt, 'hx-trigger'); + var triggerSpecs = []; + if (explicitTrigger) { + var tokens = tokenizeString(explicitTrigger); + do { + consumeUntil(tokens, NOT_WHITESPACE); + var initialLength = tokens.length; + var trigger = consumeUntil(tokens, /[,\[\s]/); + if (trigger !== "") { + if (trigger === "every") { + var every = {trigger: 'every'}; + consumeUntil(tokens, NOT_WHITESPACE); + every.pollInterval = parseInterval(consumeUntil(tokens, /[,\[\s]/)); + consumeUntil(tokens, NOT_WHITESPACE); + var eventFilter = maybeGenerateConditional(elt, tokens, "event"); + if (eventFilter) { + every.eventFilter = eventFilter; + } + triggerSpecs.push(every); + } else if (trigger.indexOf("sse:") === 0) { + triggerSpecs.push({trigger: 'sse', sseEvent: trigger.substr(4)}); + } else { + var triggerSpec = {trigger: trigger}; + var eventFilter = maybeGenerateConditional(elt, tokens, "event"); + if (eventFilter) { + triggerSpec.eventFilter = eventFilter; + } + while (tokens.length > 0 && tokens[0] !== ",") { + consumeUntil(tokens, NOT_WHITESPACE) + var token = tokens.shift(); + if (token === "changed") { + triggerSpec.changed = true; + } else if (token === "once") { + triggerSpec.once = true; + } else if (token === "consume") { + triggerSpec.consume = true; + } else if (token === "delay" && tokens[0] === ":") { + tokens.shift(); + triggerSpec.delay = parseInterval(consumeUntil(tokens, WHITESPACE_OR_COMMA)); + } else if (token === "from" && tokens[0] === ":") { + tokens.shift(); + var from_arg = consumeUntil(tokens, WHITESPACE_OR_COMMA); + if (from_arg === "closest" || from_arg === "find" || from_arg === "next" || from_arg === "previous") { + tokens.shift(); + var selector = consumeUntil( + tokens, + WHITESPACE_OR_COMMA + ) + // `next` and `previous` allow a selector-less syntax + if (selector.length > 0) { + from_arg += " " + selector; + } + } + triggerSpec.from = from_arg; + } else if (token === "target" && tokens[0] === ":") { + tokens.shift(); + triggerSpec.target = consumeUntil(tokens, WHITESPACE_OR_COMMA); + } else if (token === "throttle" && tokens[0] === ":") { + tokens.shift(); + triggerSpec.throttle = parseInterval(consumeUntil(tokens, WHITESPACE_OR_COMMA)); + } else if (token === "queue" && tokens[0] === ":") { + tokens.shift(); + triggerSpec.queue = consumeUntil(tokens, WHITESPACE_OR_COMMA); + } else if ((token === "root" || token === "threshold") && tokens[0] === ":") { + tokens.shift(); + triggerSpec[token] = consumeUntil(tokens, WHITESPACE_OR_COMMA); + } else { + triggerErrorEvent(elt, "htmx:syntax:error", {token:tokens.shift()}); + } + } + triggerSpecs.push(triggerSpec); + } + } + if (tokens.length === initialLength) { + triggerErrorEvent(elt, "htmx:syntax:error", {token:tokens.shift()}); + } + consumeUntil(tokens, NOT_WHITESPACE); + } while (tokens[0] === "," && tokens.shift()) + } + + if (triggerSpecs.length > 0) { + return triggerSpecs; + } else if (matches(elt, 'form')) { + return [{trigger: 'submit'}]; + } else if (matches(elt, 'input[type="button"], input[type="submit"]')){ + return [{trigger: 'click'}]; + } else if (matches(elt, INPUT_SELECTOR)) { + return [{trigger: 'change'}]; + } else { + return [{trigger: 'click'}]; + } + } + + function cancelPolling(elt) { + getInternalData(elt).cancelled = true; + } + + function processPolling(elt, handler, spec) { + var nodeData = getInternalData(elt); + nodeData.timeout = setTimeout(function () { + if (bodyContains(elt) && nodeData.cancelled !== true) { + if (!maybeFilterEvent(spec, elt, makeEvent('hx:poll:trigger', { + triggerSpec: spec, + target: elt + }))) { + handler(elt); + } + processPolling(elt, handler, spec); + } + }, spec.pollInterval); + } + + function isLocalLink(elt) { + return location.hostname === elt.hostname && + getRawAttribute(elt,'href') && + getRawAttribute(elt,'href').indexOf("#") !== 0; + } + + function boostElement(elt, nodeData, triggerSpecs) { + if ((elt.tagName === "A" && isLocalLink(elt) && (elt.target === "" || elt.target === "_self")) || elt.tagName === "FORM") { + nodeData.boosted = true; + var verb, path; + if (elt.tagName === "A") { + verb = "get"; + path = getRawAttribute(elt, 'href') + } else { + var rawAttribute = getRawAttribute(elt, "method"); + verb = rawAttribute ? rawAttribute.toLowerCase() : "get"; + if (verb === "get") { + } + path = getRawAttribute(elt, 'action'); + } + triggerSpecs.forEach(function(triggerSpec) { + addEventListener(elt, function(elt, evt) { + if (closest(elt, htmx.config.disableSelector)) { + cleanUpElement(elt) + return + } + issueAjaxRequest(verb, path, elt, evt) + }, nodeData, triggerSpec, true); + }); + } + } + + /** + * + * @param {Event} evt + * @param {HTMLElement} elt + * @returns + */ + function shouldCancel(evt, elt) { + if (evt.type === "submit" || evt.type === "click") { + if (elt.tagName === "FORM") { + return true; + } + if (matches(elt, 'input[type="submit"], button') && closest(elt, 'form') !== null) { + return true; + } + if (elt.tagName === "A" && elt.href && + (elt.getAttribute('href') === '#' || elt.getAttribute('href').indexOf("#") !== 0)) { + return true; + } + } + return false; + } + + function ignoreBoostedAnchorCtrlClick(elt, evt) { + return getInternalData(elt).boosted && elt.tagName === "A" && evt.type === "click" && (evt.ctrlKey || evt.metaKey); + } + + function maybeFilterEvent(triggerSpec, elt, evt) { + var eventFilter = triggerSpec.eventFilter; + if(eventFilter){ + try { + return eventFilter.call(elt, evt) !== true; + } catch(e) { + triggerErrorEvent(getDocument().body, "htmx:eventFilter:error", {error: e, source:eventFilter.source}); + return true; + } + } + return false; + } + + function addEventListener(elt, handler, nodeData, triggerSpec, explicitCancel) { + var elementData = getInternalData(elt); + var eltsToListenOn; + if (triggerSpec.from) { + eltsToListenOn = querySelectorAllExt(elt, triggerSpec.from); + } else { + eltsToListenOn = [elt]; + } + // store the initial values of the elements, so we can tell if they change + if (triggerSpec.changed) { + eltsToListenOn.forEach(function (eltToListenOn) { + var eltToListenOnData = getInternalData(eltToListenOn); + eltToListenOnData.lastValue = eltToListenOn.value; + }) + } + forEach(eltsToListenOn, function (eltToListenOn) { + var eventListener = function (evt) { + if (!bodyContains(elt)) { + eltToListenOn.removeEventListener(triggerSpec.trigger, eventListener); + return; + } + if (ignoreBoostedAnchorCtrlClick(elt, evt)) { + return; + } + if (explicitCancel || shouldCancel(evt, elt)) { + evt.preventDefault(); + } + if (maybeFilterEvent(triggerSpec, elt, evt)) { + return; + } + var eventData = getInternalData(evt); + eventData.triggerSpec = triggerSpec; + if (eventData.handledFor == null) { + eventData.handledFor = []; + } + if (eventData.handledFor.indexOf(elt) < 0) { + eventData.handledFor.push(elt); + if (triggerSpec.consume) { + evt.stopPropagation(); + } + if (triggerSpec.target && evt.target) { + if (!matches(evt.target, triggerSpec.target)) { + return; + } + } + if (triggerSpec.once) { + if (elementData.triggeredOnce) { + return; + } else { + elementData.triggeredOnce = true; + } + } + if (triggerSpec.changed) { + var eltToListenOnData = getInternalData(eltToListenOn) + if (eltToListenOnData.lastValue === eltToListenOn.value) { + return; + } + eltToListenOnData.lastValue = eltToListenOn.value + } + if (elementData.delayed) { + clearTimeout(elementData.delayed); + } + if (elementData.throttle) { + return; + } + + if (triggerSpec.throttle) { + if (!elementData.throttle) { + handler(elt, evt); + elementData.throttle = setTimeout(function () { + elementData.throttle = null; + }, triggerSpec.throttle); + } + } else if (triggerSpec.delay) { + elementData.delayed = setTimeout(function() { handler(elt, evt) }, triggerSpec.delay); + } else { + triggerEvent(elt, 'htmx:trigger') + handler(elt, evt); + } + } + }; + if (nodeData.listenerInfos == null) { + nodeData.listenerInfos = []; + } + nodeData.listenerInfos.push({ + trigger: triggerSpec.trigger, + listener: eventListener, + on: eltToListenOn + }) + eltToListenOn.addEventListener(triggerSpec.trigger, eventListener); + }); + } + + var windowIsScrolling = false // used by initScrollHandler + var scrollHandler = null; + function initScrollHandler() { + if (!scrollHandler) { + scrollHandler = function() { + windowIsScrolling = true + }; + window.addEventListener("scroll", scrollHandler) + setInterval(function() { + if (windowIsScrolling) { + windowIsScrolling = false; + forEach(getDocument().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"), function (elt) { + maybeReveal(elt); + }) + } + }, 200); + } + } + + function maybeReveal(elt) { + if (!hasAttribute(elt,'data-hx-revealed') && isScrolledIntoView(elt)) { + elt.setAttribute('data-hx-revealed', 'true'); + var nodeData = getInternalData(elt); + if (nodeData.initHash) { + triggerEvent(elt, 'revealed'); + } else { + // if the node isn't initialized, wait for it before triggering the request + elt.addEventListener("htmx:afterProcessNode", function(evt) { triggerEvent(elt, 'revealed') }, {once: true}); + } + } + } + + //==================================================================== + // Web Sockets + //==================================================================== + + function processWebSocketInfo(elt, nodeData, info) { + var values = splitOnWhitespace(info); + for (var i = 0; i < values.length; i++) { + var value = values[i].split(/:(.+)/); + if (value[0] === "connect") { + ensureWebSocket(elt, value[1], 0); + } + if (value[0] === "send") { + processWebSocketSend(elt); + } + } + } + + function ensureWebSocket(elt, wssSource, retryCount) { + if (!bodyContains(elt)) { + return; // stop ensuring websocket connection when socket bearing element ceases to exist + } + + if (wssSource.indexOf("/") == 0) { // complete absolute paths only + var base_part = location.hostname + (location.port ? ':'+location.port: ''); + if (location.protocol == 'https:') { + wssSource = "wss://" + base_part + wssSource; + } else if (location.protocol == 'http:') { + wssSource = "ws://" + base_part + wssSource; + } + } + var socket = htmx.createWebSocket(wssSource); + socket.onerror = function (e) { + triggerErrorEvent(elt, "htmx:wsError", {error:e, socket:socket}); + maybeCloseWebSocketSource(elt); + }; + + socket.onclose = function (e) { + if ([1006, 1012, 1013].indexOf(e.code) >= 0) { // Abnormal Closure/Service Restart/Try Again Later + var delay = getWebSocketReconnectDelay(retryCount); + setTimeout(function() { + ensureWebSocket(elt, wssSource, retryCount+1); // creates a websocket with a new timeout + }, delay); + } + }; + socket.onopen = function (e) { + retryCount = 0; + } + + getInternalData(elt).webSocket = socket; + socket.addEventListener('message', function (event) { + if (maybeCloseWebSocketSource(elt)) { + return; + } + + var response = event.data; + withExtensions(elt, function(extension){ + response = extension.transformResponse(response, null, elt); + }); + + var settleInfo = makeSettleInfo(elt); + var fragment = makeFragment(response); + var children = toArray(fragment.children); + for (var i = 0; i < children.length; i++) { + var child = children[i]; + oobSwap(getAttributeValue(child, "hx-swap-oob") || "true", child, settleInfo); + } + + settleImmediately(settleInfo.tasks); + }); + } + + function maybeCloseWebSocketSource(elt) { + if (!bodyContains(elt)) { + getInternalData(elt).webSocket.close(); + return true; + } + } + + function processWebSocketSend(elt) { + var webSocketSourceElt = getClosestMatch(elt, function (parent) { + return getInternalData(parent).webSocket != null; + }); + if (webSocketSourceElt) { + elt.addEventListener(getTriggerSpecs(elt)[0].trigger, function (evt) { + var webSocket = getInternalData(webSocketSourceElt).webSocket; + var headers = getHeaders(elt, webSocketSourceElt); + var results = getInputValues(elt, 'post'); + var errors = results.errors; + var rawParameters = results.values; + var expressionVars = getExpressionVars(elt); + var allParameters = mergeObjects(rawParameters, expressionVars); + var filteredParameters = filterValues(allParameters, elt); + filteredParameters['HEADERS'] = headers; + if (errors && errors.length > 0) { + triggerEvent(elt, 'htmx:validation:halted', errors); + return; + } + webSocket.send(JSON.stringify(filteredParameters)); + if(shouldCancel(evt, elt)){ + evt.preventDefault(); + } + }); + } else { + triggerErrorEvent(elt, "htmx:noWebSocketSourceError"); + } + } + + function getWebSocketReconnectDelay(retryCount) { + var delay = htmx.config.wsReconnectDelay; + if (typeof delay === 'function') { + // @ts-ignore + return delay(retryCount); + } + if (delay === 'full-jitter') { + var exp = Math.min(retryCount, 6); + var maxDelay = 1000 * Math.pow(2, exp); + return maxDelay * Math.random(); + } + logError('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"'); + } + + //==================================================================== + // Server Sent Events + //==================================================================== + + function processSSEInfo(elt, nodeData, info) { + var values = splitOnWhitespace(info); + for (var i = 0; i < values.length; i++) { + var value = values[i].split(/:(.+)/); + if (value[0] === "connect") { + processSSESource(elt, value[1]); + } + + if ((value[0] === "swap")) { + processSSESwap(elt, value[1]) + } + } + } + + function processSSESource(elt, sseSrc) { + var source = htmx.createEventSource(sseSrc); + source.onerror = function (e) { + triggerErrorEvent(elt, "htmx:sseError", {error:e, source:source}); + maybeCloseSSESource(elt); + }; + getInternalData(elt).sseEventSource = source; + } + + function processSSESwap(elt, sseEventName) { + var sseSourceElt = getClosestMatch(elt, hasEventSource); + if (sseSourceElt) { + var sseEventSource = getInternalData(sseSourceElt).sseEventSource; + var sseListener = function (event) { + if (maybeCloseSSESource(sseSourceElt)) { + return; + } + if (!bodyContains(elt)) { + sseEventSource.removeEventListener(sseEventName, sseListener); + return; + } + + /////////////////////////// + // TODO: merge this code with AJAX and WebSockets code in the future. + + var response = event.data; + withExtensions(elt, function(extension){ + response = extension.transformResponse(response, null, elt); + }); + + var swapSpec = getSwapSpecification(elt) + var target = getTarget(elt) + var settleInfo = makeSettleInfo(elt); + + selectAndSwap(swapSpec.swapStyle, target, elt, response, settleInfo) + settleImmediately(settleInfo.tasks) + triggerEvent(elt, "htmx:sseMessage", event) + }; + + getInternalData(elt).sseListener = sseListener; + sseEventSource.addEventListener(sseEventName, sseListener); + } else { + triggerErrorEvent(elt, "htmx:noSSESourceError"); + } + } + + function processSSETrigger(elt, handler, sseEventName) { + var sseSourceElt = getClosestMatch(elt, hasEventSource); + if (sseSourceElt) { + var sseEventSource = getInternalData(sseSourceElt).sseEventSource; + var sseListener = function () { + if (!maybeCloseSSESource(sseSourceElt)) { + if (bodyContains(elt)) { + handler(elt); + } else { + sseEventSource.removeEventListener(sseEventName, sseListener); + } + } + }; + getInternalData(elt).sseListener = sseListener; + sseEventSource.addEventListener(sseEventName, sseListener); + } else { + triggerErrorEvent(elt, "htmx:noSSESourceError"); + } + } + + function maybeCloseSSESource(elt) { + if (!bodyContains(elt)) { + getInternalData(elt).sseEventSource.close(); + return true; + } + } + + function hasEventSource(node) { + return getInternalData(node).sseEventSource != null; + } + + //==================================================================== + + function loadImmediately(elt, handler, nodeData, delay) { + var load = function(){ + if (!nodeData.loaded) { + nodeData.loaded = true; + handler(elt); + } + } + if (delay) { + setTimeout(load, delay); + } else { + load(); + } + } + + function processVerbs(elt, nodeData, triggerSpecs) { + var explicitAction = false; + forEach(VERBS, function (verb) { + if (hasAttribute(elt,'hx-' + verb)) { + var path = getAttributeValue(elt, 'hx-' + verb); + explicitAction = true; + nodeData.path = path; + nodeData.verb = verb; + triggerSpecs.forEach(function(triggerSpec) { + addTriggerHandler(elt, triggerSpec, nodeData, function (elt, evt) { + if (closest(elt, htmx.config.disableSelector)) { + cleanUpElement(elt) + return + } + issueAjaxRequest(verb, path, elt, evt) + }) + }); + } + }); + return explicitAction; + } + + function addTriggerHandler(elt, triggerSpec, nodeData, handler) { + if (triggerSpec.sseEvent) { + processSSETrigger(elt, handler, triggerSpec.sseEvent); + } else if (triggerSpec.trigger === "revealed") { + initScrollHandler(); + addEventListener(elt, handler, nodeData, triggerSpec); + maybeReveal(elt); + } else if (triggerSpec.trigger === "intersect") { + var observerOptions = {}; + if (triggerSpec.root) { + observerOptions.root = querySelectorExt(elt, triggerSpec.root) + } + if (triggerSpec.threshold) { + observerOptions.threshold = parseFloat(triggerSpec.threshold); + } + var observer = new IntersectionObserver(function (entries) { + for (var i = 0; i < entries.length; i++) { + var entry = entries[i]; + if (entry.isIntersecting) { + triggerEvent(elt, "intersect"); + break; + } + } + }, observerOptions); + observer.observe(elt); + addEventListener(elt, handler, nodeData, triggerSpec); + } else if (triggerSpec.trigger === "load") { + if (!maybeFilterEvent(triggerSpec, elt, makeEvent("load", {elt: elt}))) { + loadImmediately(elt, handler, nodeData, triggerSpec.delay); + } + } else if (triggerSpec.pollInterval) { + nodeData.polling = true; + processPolling(elt, handler, triggerSpec); + } else { + addEventListener(elt, handler, nodeData, triggerSpec); + } + } + + function evalScript(script) { + if (htmx.config.allowScriptTags && (script.type === "text/javascript" || script.type === "module" || script.type === "") ) { + var newScript = getDocument().createElement("script"); + forEach(script.attributes, function (attr) { + newScript.setAttribute(attr.name, attr.value); + }); + newScript.textContent = script.textContent; + newScript.async = false; + if (htmx.config.inlineScriptNonce) { + newScript.nonce = htmx.config.inlineScriptNonce; + } + var parent = script.parentElement; + + try { + parent.insertBefore(newScript, script); + } catch (e) { + logError(e); + } finally { + // remove old script element, but only if it is still in DOM + if (script.parentElement) { + script.parentElement.removeChild(script); + } + } + } + } + + function processScripts(elt) { + if (matches(elt, "script")) { + evalScript(elt); + } + forEach(findAll(elt, "script"), function (script) { + evalScript(script); + }); + } + + function hasChanceOfBeingBoosted() { + return document.querySelector("[hx-boost], [data-hx-boost]"); + } + + function findHxOnWildcardElements(elt) { + var node = null + var elements = [] + + if (document.evaluate) { + var iter = document.evaluate('//*[@*[ starts-with(name(), "hx-on:") or starts-with(name(), "data-hx-on:") ]]', elt) + while (node = iter.iterateNext()) elements.push(node) + } else { + var allElements = document.getElementsByTagName("*") + for (var i = 0; i < allElements.length; i++) { + var attributes = allElements[i].attributes + for (var j = 0; j < attributes.length; j++) { + var attrName = attributes[j].name + if (startsWith(attrName, "hx-on:") || startsWith(attrName, "data-hx-on:")) { + elements.push(allElements[i]) + } + } + } + } + + return elements + } + + function findElementsToProcess(elt) { + if (elt.querySelectorAll) { + var boostedElts = hasChanceOfBeingBoosted() ? ", a" : ""; + var results = elt.querySelectorAll(VERB_SELECTOR + boostedElts + ", form, [type='submit'], [hx-sse], [data-hx-sse], [hx-ws]," + + " [data-hx-ws], [hx-ext], [data-hx-ext], [hx-trigger], [data-hx-trigger], [hx-on], [data-hx-on]"); + return results; + } else { + return []; + } + } + + // Handle submit buttons/inputs that have the form attribute set + // see https://developer.mozilla.org/docs/Web/HTML/Element/button + function maybeSetLastButtonClicked(evt) { + var elt = closest(evt.target, "button, input[type='submit']"); + var internalData = getRelatedFormData(evt) + if (internalData) { + internalData.lastButtonClicked = elt; + } + }; + function maybeUnsetLastButtonClicked(evt){ + var internalData = getRelatedFormData(evt) + if (internalData) { + internalData.lastButtonClicked = null; + } + } + function getRelatedFormData(evt) { + var elt = closest(evt.target, "button, input[type='submit']"); + if (!elt) { + return; + } + var form = resolveTarget('#' + getRawAttribute(elt, 'form')) || closest(elt, 'form'); + if (!form) { + return; + } + return getInternalData(form); + } + function initButtonTracking(elt) { + // need to handle both click and focus in: + // focusin - in case someone tabs in to a button and hits the space bar + // click - on OSX buttons do not focus on click see https://bugs.webkit.org/show_bug.cgi?id=13724 + elt.addEventListener('click', maybeSetLastButtonClicked) + elt.addEventListener('focusin', maybeSetLastButtonClicked) + elt.addEventListener('focusout', maybeUnsetLastButtonClicked) + } + + function countCurlies(line) { + var tokens = tokenizeString(line); + var netCurlies = 0; + for (let i = 0; i < tokens.length; i++) { + const token = tokens[i]; + if (token === "{") { + netCurlies++; + } else if (token === "}") { + netCurlies--; + } + } + return netCurlies; + } + + function addHxOnEventHandler(elt, eventName, code) { + var nodeData = getInternalData(elt); + if (!Array.isArray(nodeData.onHandlers)) { + nodeData.onHandlers = []; + } + var func; + var listener = function (e) { + return maybeEval(elt, function() { + if (!func) { + func = new Function("event", code); + } + func.call(elt, e); + }); + }; + elt.addEventListener(eventName, listener); + nodeData.onHandlers.push({event:eventName, listener:listener}); + } + + function processHxOn(elt) { + var hxOnValue = getAttributeValue(elt, 'hx-on'); + if (hxOnValue) { + var handlers = {} + var lines = hxOnValue.split("\n"); + var currentEvent = null; + var curlyCount = 0; + while (lines.length > 0) { + var line = lines.shift(); + var match = line.match(/^\s*([a-zA-Z:\-\.]+:)(.*)/); + if (curlyCount === 0 && match) { + line.split(":") + currentEvent = match[1].slice(0, -1); // strip last colon + handlers[currentEvent] = match[2]; + } else { + handlers[currentEvent] += line; + } + curlyCount += countCurlies(line); + } + + for (var eventName in handlers) { + addHxOnEventHandler(elt, eventName, handlers[eventName]); + } + } + } + + function processHxOnWildcard(elt) { + // wipe any previous on handlers so that this function takes precedence + deInitOnHandlers(elt) + + for (var i = 0; i < elt.attributes.length; i++) { + var name = elt.attributes[i].name + var value = elt.attributes[i].value + if (startsWith(name, "hx-on:") || startsWith(name, "data-hx-on:")) { + let eventName = name.slice(name.indexOf(":") + 1) + // if the eventName starts with a colon, prepend "htmx" for shorthand support + if (startsWith(eventName, ":")) eventName = "htmx" + eventName + + addHxOnEventHandler(elt, eventName, value) + } + } + } + + function initNode(elt) { + if (closest(elt, htmx.config.disableSelector)) { + cleanUpElement(elt) + return; + } + var nodeData = getInternalData(elt); + if (nodeData.initHash !== attributeHash(elt)) { + // clean up any previously processed info + deInitNode(elt); + + nodeData.initHash = attributeHash(elt); + + processHxOn(elt); + + triggerEvent(elt, "htmx:beforeProcessNode") + + if (elt.value) { + nodeData.lastValue = elt.value; + } + + var triggerSpecs = getTriggerSpecs(elt); + var hasExplicitHttpAction = processVerbs(elt, nodeData, triggerSpecs); + + if (!hasExplicitHttpAction) { + if (getClosestAttributeValue(elt, "hx-boost") === "true") { + boostElement(elt, nodeData, triggerSpecs); + } else if (hasAttribute(elt, 'hx-trigger')) { + triggerSpecs.forEach(function (triggerSpec) { + // For "naked" triggers, don't do anything at all + addTriggerHandler(elt, triggerSpec, nodeData, function () { + }) + }) + } + } + + // Handle submit buttons/inputs that have the form attribute set + // see https://developer.mozilla.org/docs/Web/HTML/Element/button + if (elt.tagName === "FORM" || (getRawAttribute(elt, "type") === "submit" && hasAttribute(elt, "form"))) { + initButtonTracking(elt) + } + + var sseInfo = getAttributeValue(elt, 'hx-sse'); + if (sseInfo) { + processSSEInfo(elt, nodeData, sseInfo); + } + + var wsInfo = getAttributeValue(elt, 'hx-ws'); + if (wsInfo) { + processWebSocketInfo(elt, nodeData, wsInfo); + } + triggerEvent(elt, "htmx:afterProcessNode"); + } + } + + function processNode(elt) { + elt = resolveTarget(elt); + if (closest(elt, htmx.config.disableSelector)) { + cleanUpElement(elt) + return; + } + initNode(elt); + forEach(findElementsToProcess(elt), function(child) { initNode(child) }); + // Because it happens second, the new way of adding onHandlers superseeds the old one + // i.e. if there are any hx-on:eventName attributes, the hx-on attribute will be ignored + forEach(findHxOnWildcardElements(elt), processHxOnWildcard); + } + + //==================================================================== + // Event/Log Support + //==================================================================== + + function kebabEventName(str) { + return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase(); + } + + function makeEvent(eventName, detail) { + var evt; + if (window.CustomEvent && typeof window.CustomEvent === 'function') { + evt = new CustomEvent(eventName, {bubbles: true, cancelable: true, detail: detail}); + } else { + evt = getDocument().createEvent('CustomEvent'); + evt.initCustomEvent(eventName, true, true, detail); + } + return evt; + } + + function triggerErrorEvent(elt, eventName, detail) { + triggerEvent(elt, eventName, mergeObjects({error:eventName}, detail)); + } + + function ignoreEventForLogging(eventName) { + return eventName === "htmx:afterProcessNode" + } + + /** + * `withExtensions` locates all active extensions for a provided element, then + * executes the provided function using each of the active extensions. It should + * be called internally at every extendable execution point in htmx. + * + * @param {HTMLElement} elt + * @param {(extension:import("./htmx").HtmxExtension) => void} toDo + * @returns void + */ + function withExtensions(elt, toDo) { + forEach(getExtensions(elt), function(extension){ + try { + toDo(extension); + } catch (e) { + logError(e); + } + }); + } + + function logError(msg) { + if(console.error) { + console.error(msg); + } else if (console.log) { + console.log("ERROR: ", msg); + } + } + + function triggerEvent(elt, eventName, detail) { + elt = resolveTarget(elt); + if (detail == null) { + detail = {}; + } + detail["elt"] = elt; + var event = makeEvent(eventName, detail); + if (htmx.logger && !ignoreEventForLogging(eventName)) { + htmx.logger(elt, eventName, detail); + } + if (detail.error) { + logError(detail.error); + triggerEvent(elt, "htmx:error", {errorInfo:detail}) + } + var eventResult = elt.dispatchEvent(event); + var kebabName = kebabEventName(eventName); + if (eventResult && kebabName !== eventName) { + var kebabedEvent = makeEvent(kebabName, event.detail); + eventResult = eventResult && elt.dispatchEvent(kebabedEvent) + } + withExtensions(elt, function (extension) { + eventResult = eventResult && (extension.onEvent(eventName, event) !== false && !event.defaultPrevented) + }); + return eventResult; + } + + //==================================================================== + // History Support + //==================================================================== + var currentPathForHistory = location.pathname+location.search; + + function getHistoryElement() { + var historyElt = getDocument().querySelector('[hx-history-elt],[data-hx-history-elt]'); + return historyElt || getDocument().body; + } + + function saveToHistoryCache(url, content, title, scroll) { + if (!canAccessLocalStorage()) { + return; + } + + if (htmx.config.historyCacheSize <= 0) { + // make sure that an eventually already existing cache is purged + localStorage.removeItem("htmx-history-cache"); + return; + } + + url = normalizePath(url); + + var historyCache = parseJSON(localStorage.getItem("htmx-history-cache")) || []; + for (var i = 0; i < historyCache.length; i++) { + if (historyCache[i].url === url) { + historyCache.splice(i, 1); + break; + } + } + var newHistoryItem = {url:url, content: content, title:title, scroll:scroll}; + triggerEvent(getDocument().body, "htmx:historyItemCreated", {item:newHistoryItem, cache: historyCache}) + historyCache.push(newHistoryItem) + while (historyCache.length > htmx.config.historyCacheSize) { + historyCache.shift(); + } + while(historyCache.length > 0){ + try { + localStorage.setItem("htmx-history-cache", JSON.stringify(historyCache)); + break; + } catch (e) { + triggerErrorEvent(getDocument().body, "htmx:historyCacheError", {cause:e, cache: historyCache}) + historyCache.shift(); // shrink the cache and retry + } + } + } + + function getCachedHistory(url) { + if (!canAccessLocalStorage()) { + return null; + } + + url = normalizePath(url); + + var historyCache = parseJSON(localStorage.getItem("htmx-history-cache")) || []; + for (var i = 0; i < historyCache.length; i++) { + if (historyCache[i].url === url) { + return historyCache[i]; + } + } + return null; + } + + function cleanInnerHtmlForHistory(elt) { + var className = htmx.config.requestClass; + var clone = elt.cloneNode(true); + forEach(findAll(clone, "." + className), function(child){ + removeClassFromElement(child, className); + }); + return clone.innerHTML; + } + + function saveCurrentPageToHistory() { + var elt = getHistoryElement(); + var path = currentPathForHistory || location.pathname+location.search; + + // Allow history snapshot feature to be disabled where hx-history="false" + // is present *anywhere* in the current document we're about to save, + // so we can prevent privileged data entering the cache. + // The page will still be reachable as a history entry, but htmx will fetch it + // live from the server onpopstate rather than look in the localStorage cache + var disableHistoryCache + try { + disableHistoryCache = getDocument().querySelector('[hx-history="false" i],[data-hx-history="false" i]') + } catch (e) { + // IE11: insensitive modifier not supported so fallback to case sensitive selector + disableHistoryCache = getDocument().querySelector('[hx-history="false"],[data-hx-history="false"]') + } + if (!disableHistoryCache) { + triggerEvent(getDocument().body, "htmx:beforeHistorySave", {path: path, historyElt: elt}); + saveToHistoryCache(path, cleanInnerHtmlForHistory(elt), getDocument().title, window.scrollY); + } + + if (htmx.config.historyEnabled) history.replaceState({htmx: true}, getDocument().title, window.location.href); + } + + function pushUrlIntoHistory(path) { + // remove the cache buster parameter, if any + if (htmx.config.getCacheBusterParam) { + path = path.replace(/org\.htmx\.cache-buster=[^&]*&?/, '') + if (endsWith(path, '&') || endsWith(path, "?")) { + path = path.slice(0, -1); + } + } + if(htmx.config.historyEnabled) { + history.pushState({htmx:true}, "", path); + } + currentPathForHistory = path; + } + + function replaceUrlInHistory(path) { + if(htmx.config.historyEnabled) history.replaceState({htmx:true}, "", path); + currentPathForHistory = path; + } + + function settleImmediately(tasks) { + forEach(tasks, function (task) { + task.call(); + }); + } + + function loadHistoryFromServer(path) { + var request = new XMLHttpRequest(); + var details = {path: path, xhr:request}; + triggerEvent(getDocument().body, "htmx:historyCacheMiss", details); + request.open('GET', path, true); + request.setRequestHeader("HX-History-Restore-Request", "true"); + request.onload = function () { + if (this.status >= 200 && this.status < 400) { + triggerEvent(getDocument().body, "htmx:historyCacheMissLoad", details); + var fragment = makeFragment(this.response); + // @ts-ignore + fragment = fragment.querySelector('[hx-history-elt],[data-hx-history-elt]') || fragment; + var historyElement = getHistoryElement(); + var settleInfo = makeSettleInfo(historyElement); + var title = findTitle(this.response); + if (title) { + var titleElt = find("title"); + if (titleElt) { + titleElt.innerHTML = title; + } else { + window.document.title = title; + } + } + // @ts-ignore + swapInnerHTML(historyElement, fragment, settleInfo) + settleImmediately(settleInfo.tasks); + currentPathForHistory = path; + triggerEvent(getDocument().body, "htmx:historyRestore", {path: path, cacheMiss:true, serverResponse:this.response}); + } else { + triggerErrorEvent(getDocument().body, "htmx:historyCacheMissLoadError", details); + } + }; + request.send(); + } + + function restoreHistory(path) { + saveCurrentPageToHistory(); + path = path || location.pathname+location.search; + var cached = getCachedHistory(path); + if (cached) { + var fragment = makeFragment(cached.content); + var historyElement = getHistoryElement(); + var settleInfo = makeSettleInfo(historyElement); + swapInnerHTML(historyElement, fragment, settleInfo) + settleImmediately(settleInfo.tasks); + document.title = cached.title; + setTimeout(function () { + window.scrollTo(0, cached.scroll); + }, 0); // next 'tick', so browser has time to render layout + currentPathForHistory = path; + triggerEvent(getDocument().body, "htmx:historyRestore", {path:path, item:cached}); + } else { + if (htmx.config.refreshOnHistoryMiss) { + + // @ts-ignore: optional parameter in reload() function throws error + window.location.reload(true); + } else { + loadHistoryFromServer(path); + } + } + } + + function addRequestIndicatorClasses(elt) { + var indicators = findAttributeTargets(elt, 'hx-indicator'); + if (indicators == null) { + indicators = [elt]; + } + forEach(indicators, function (ic) { + var internalData = getInternalData(ic); + internalData.requestCount = (internalData.requestCount || 0) + 1; + ic.classList["add"].call(ic.classList, htmx.config.requestClass); + }); + return indicators; + } + + function disableElements(elt) { + var disabledElts = findAttributeTargets(elt, 'hx-disabled-elt'); + if (disabledElts == null) { + disabledElts = []; + } + forEach(disabledElts, function (disabledElement) { + var internalData = getInternalData(disabledElement); + internalData.requestCount = (internalData.requestCount || 0) + 1; + disabledElement.setAttribute("disabled", ""); + }); + return disabledElts; + } + + function removeRequestIndicators(indicators, disabled) { + forEach(indicators, function (ic) { + var internalData = getInternalData(ic); + internalData.requestCount = (internalData.requestCount || 0) - 1; + if (internalData.requestCount === 0) { + ic.classList["remove"].call(ic.classList, htmx.config.requestClass); + } + }); + forEach(disabled, function (disabledElement) { + var internalData = getInternalData(disabledElement); + internalData.requestCount = (internalData.requestCount || 0) - 1; + if (internalData.requestCount === 0) { + disabledElement.removeAttribute('disabled'); + } + }); + } + + //==================================================================== + // Input Value Processing + //==================================================================== + + function haveSeenNode(processed, elt) { + for (var i = 0; i < processed.length; i++) { + var node = processed[i]; + if (node.isSameNode(elt)) { + return true; + } + } + return false; + } + + function shouldInclude(elt) { + if(elt.name === "" || elt.name == null || elt.disabled) { + return false; + } + // ignore "submitter" types (see jQuery src/serialize.js) + if (elt.type === "button" || elt.type === "submit" || elt.tagName === "image" || elt.tagName === "reset" || elt.tagName === "file" ) { + return false; + } + if (elt.type === "checkbox" || elt.type === "radio" ) { + return elt.checked; + } + return true; + } + + function addValueToValues(name, value, values) { + // This is a little ugly because both the current value of the named value in the form + // and the new value could be arrays, so we have to handle all four cases :/ + if (name != null && value != null) { + var current = values[name]; + if (current === undefined) { + values[name] = value; + } else if (Array.isArray(current)) { + if (Array.isArray(value)) { + values[name] = current.concat(value); + } else { + current.push(value); + } + } else { + if (Array.isArray(value)) { + values[name] = [current].concat(value); + } else { + values[name] = [current, value]; + } + } + } + } + + function processInputValue(processed, values, errors, elt, validate) { + if (elt == null || haveSeenNode(processed, elt)) { + return; + } else { + processed.push(elt); + } + if (shouldInclude(elt)) { + var name = getRawAttribute(elt,"name"); + var value = elt.value; + if (elt.multiple && elt.tagName === "SELECT") { + value = toArray(elt.querySelectorAll("option:checked")).map(function (e) { return e.value }); + } + // include file inputs + if (elt.files) { + value = toArray(elt.files); + } + addValueToValues(name, value, values); + if (validate) { + validateElement(elt, errors); + } + } + if (matches(elt, 'form')) { + var inputs = elt.elements; + forEach(inputs, function(input) { + processInputValue(processed, values, errors, input, validate); + }); + } + } + + function validateElement(element, errors) { + if (element.willValidate) { + triggerEvent(element, "htmx:validation:validate") + if (!element.checkValidity()) { + errors.push({elt: element, message:element.validationMessage, validity:element.validity}); + triggerEvent(element, "htmx:validation:failed", {message:element.validationMessage, validity:element.validity}) + } + } + } + + /** + * @param {HTMLElement} elt + * @param {string} verb + */ + function getInputValues(elt, verb) { + var processed = []; + var values = {}; + var formValues = {}; + var errors = []; + var internalData = getInternalData(elt); + if (internalData.lastButtonClicked && !bodyContains(internalData.lastButtonClicked)) { + internalData.lastButtonClicked = null + } + + // only validate when form is directly submitted and novalidate or formnovalidate are not set + // or if the element has an explicit hx-validate="true" on it + var validate = (matches(elt, 'form') && elt.noValidate !== true) || getAttributeValue(elt, "hx-validate") === "true"; + if (internalData.lastButtonClicked) { + validate = validate && internalData.lastButtonClicked.formNoValidate !== true; + } + + // for a non-GET include the closest form + if (verb !== 'get') { + processInputValue(processed, formValues, errors, closest(elt, 'form'), validate); + } + + // include the element itself + processInputValue(processed, values, errors, elt, validate); + + // if a button or submit was clicked last, include its value + if (internalData.lastButtonClicked || elt.tagName === "BUTTON" || + (elt.tagName === "INPUT" && getRawAttribute(elt, "type") === "submit")) { + var button = internalData.lastButtonClicked || elt + var name = getRawAttribute(button, "name") + addValueToValues(name, button.value, formValues) + } + + // include any explicit includes + var includes = findAttributeTargets(elt, "hx-include"); + forEach(includes, function(node) { + processInputValue(processed, values, errors, node, validate); + // if a non-form is included, include any input values within it + if (!matches(node, 'form')) { + forEach(node.querySelectorAll(INPUT_SELECTOR), function (descendant) { + processInputValue(processed, values, errors, descendant, validate); + }) + } + }); + + // form values take precedence, overriding the regular values + values = mergeObjects(values, formValues); + + return {errors:errors, values:values}; + } + + function appendParam(returnStr, name, realValue) { + if (returnStr !== "") { + returnStr += "&"; + } + if (String(realValue) === "[object Object]") { + realValue = JSON.stringify(realValue); + } + var s = encodeURIComponent(realValue); + returnStr += encodeURIComponent(name) + "=" + s; + return returnStr; + } + + function urlEncode(values) { + var returnStr = ""; + for (var name in values) { + if (values.hasOwnProperty(name)) { + var value = values[name]; + if (Array.isArray(value)) { + forEach(value, function(v) { + returnStr = appendParam(returnStr, name, v); + }); + } else { + returnStr = appendParam(returnStr, name, value); + } + } + } + return returnStr; + } + + function makeFormData(values) { + var formData = new FormData(); + for (var name in values) { + if (values.hasOwnProperty(name)) { + var value = values[name]; + if (Array.isArray(value)) { + forEach(value, function(v) { + formData.append(name, v); + }); + } else { + formData.append(name, value); + } + } + } + return formData; + } + + //==================================================================== + // Ajax + //==================================================================== + + /** + * @param {HTMLElement} elt + * @param {HTMLElement} target + * @param {string} prompt + * @returns {Object} // TODO: Define/Improve HtmxHeaderSpecification + */ + function getHeaders(elt, target, prompt) { + var headers = { + "HX-Request" : "true", + "HX-Trigger" : getRawAttribute(elt, "id"), + "HX-Trigger-Name" : getRawAttribute(elt, "name"), + "HX-Target" : getAttributeValue(target, "id"), + "HX-Current-URL" : getDocument().location.href, + } + getValuesForElement(elt, "hx-headers", false, headers) + if (prompt !== undefined) { + headers["HX-Prompt"] = prompt; + } + if (getInternalData(elt).boosted) { + headers["HX-Boosted"] = "true"; + } + return headers; + } + + /** + * filterValues takes an object containing form input values + * and returns a new object that only contains keys that are + * specified by the closest "hx-params" attribute + * @param {Object} inputValues + * @param {HTMLElement} elt + * @returns {Object} + */ + function filterValues(inputValues, elt) { + var paramsValue = getClosestAttributeValue(elt, "hx-params"); + if (paramsValue) { + if (paramsValue === "none") { + return {}; + } else if (paramsValue === "*") { + return inputValues; + } else if(paramsValue.indexOf("not ") === 0) { + forEach(paramsValue.substr(4).split(","), function (name) { + name = name.trim(); + delete inputValues[name]; + }); + return inputValues; + } else { + var newValues = {} + forEach(paramsValue.split(","), function (name) { + name = name.trim(); + newValues[name] = inputValues[name]; + }); + return newValues; + } + } else { + return inputValues; + } + } + + function isAnchorLink(elt) { + return getRawAttribute(elt, 'href') && getRawAttribute(elt, 'href').indexOf("#") >=0 + } + + /** + * + * @param {HTMLElement} elt + * @param {string} swapInfoOverride + * @returns {import("./htmx").HtmxSwapSpecification} + */ + function getSwapSpecification(elt, swapInfoOverride) { + var swapInfo = swapInfoOverride ? swapInfoOverride : getClosestAttributeValue(elt, "hx-swap"); + var swapSpec = { + "swapStyle" : getInternalData(elt).boosted ? 'innerHTML' : htmx.config.defaultSwapStyle, + "swapDelay" : htmx.config.defaultSwapDelay, + "settleDelay" : htmx.config.defaultSettleDelay + } + if (htmx.config.scrollIntoViewOnBoost && getInternalData(elt).boosted && !isAnchorLink(elt)) { + swapSpec["show"] = "top" + } + if (swapInfo) { + var split = splitOnWhitespace(swapInfo); + if (split.length > 0) { + for (var i = 0; i < split.length; i++) { + var value = split[i]; + if (value.indexOf("swap:") === 0) { + swapSpec["swapDelay"] = parseInterval(value.substr(5)); + } else if (value.indexOf("settle:") === 0) { + swapSpec["settleDelay"] = parseInterval(value.substr(7)); + } else if (value.indexOf("transition:") === 0) { + swapSpec["transition"] = value.substr(11) === "true"; + } else if (value.indexOf("ignoreTitle:") === 0) { + swapSpec["ignoreTitle"] = value.substr(12) === "true"; + } else if (value.indexOf("scroll:") === 0) { + var scrollSpec = value.substr(7); + var splitSpec = scrollSpec.split(":"); + var scrollVal = splitSpec.pop(); + var selectorVal = splitSpec.length > 0 ? splitSpec.join(":") : null; + swapSpec["scroll"] = scrollVal; + swapSpec["scrollTarget"] = selectorVal; + } else if (value.indexOf("show:") === 0) { + var showSpec = value.substr(5); + var splitSpec = showSpec.split(":"); + var showVal = splitSpec.pop(); + var selectorVal = splitSpec.length > 0 ? splitSpec.join(":") : null; + swapSpec["show"] = showVal; + swapSpec["showTarget"] = selectorVal; + } else if (value.indexOf("focus-scroll:") === 0) { + var focusScrollVal = value.substr("focus-scroll:".length); + swapSpec["focusScroll"] = focusScrollVal == "true"; + } else if (i == 0) { + swapSpec["swapStyle"] = value; + } else { + logError('Unknown modifier in hx-swap: ' + value); + } + } + } + } + return swapSpec; + } + + function usesFormData(elt) { + return getClosestAttributeValue(elt, "hx-encoding") === "multipart/form-data" || + (matches(elt, "form") && getRawAttribute(elt, 'enctype') === "multipart/form-data"); + } + + function encodeParamsForBody(xhr, elt, filteredParameters) { + var encodedParameters = null; + withExtensions(elt, function (extension) { + if (encodedParameters == null) { + encodedParameters = extension.encodeParameters(xhr, filteredParameters, elt); + } + }); + if (encodedParameters != null) { + return encodedParameters; + } else { + if (usesFormData(elt)) { + return makeFormData(filteredParameters); + } else { + return urlEncode(filteredParameters); + } + } + } + + /** + * + * @param {Element} target + * @returns {import("./htmx").HtmxSettleInfo} + */ + function makeSettleInfo(target) { + return {tasks: [], elts: [target]}; + } + + function updateScrollState(content, swapSpec) { + var first = content[0]; + var last = content[content.length - 1]; + if (swapSpec.scroll) { + var target = null; + if (swapSpec.scrollTarget) { + target = querySelectorExt(first, swapSpec.scrollTarget); + } + if (swapSpec.scroll === "top" && (first || target)) { + target = target || first; + target.scrollTop = 0; + } + if (swapSpec.scroll === "bottom" && (last || target)) { + target = target || last; + target.scrollTop = target.scrollHeight; + } + } + if (swapSpec.show) { + var target = null; + if (swapSpec.showTarget) { + var targetStr = swapSpec.showTarget; + if (swapSpec.showTarget === "window") { + targetStr = "body"; + } + target = querySelectorExt(first, targetStr); + } + if (swapSpec.show === "top" && (first || target)) { + target = target || first; + target.scrollIntoView({block:'start', behavior: htmx.config.scrollBehavior}); + } + if (swapSpec.show === "bottom" && (last || target)) { + target = target || last; + target.scrollIntoView({block:'end', behavior: htmx.config.scrollBehavior}); + } + } + } + + /** + * @param {HTMLElement} elt + * @param {string} attr + * @param {boolean=} evalAsDefault + * @param {Object=} values + * @returns {Object} + */ + function getValuesForElement(elt, attr, evalAsDefault, values) { + if (values == null) { + values = {}; + } + if (elt == null) { + return values; + } + var attributeValue = getAttributeValue(elt, attr); + if (attributeValue) { + var str = attributeValue.trim(); + var evaluateValue = evalAsDefault; + if (str === "unset") { + return null; + } + if (str.indexOf("javascript:") === 0) { + str = str.substr(11); + evaluateValue = true; + } else if (str.indexOf("js:") === 0) { + str = str.substr(3); + evaluateValue = true; + } + if (str.indexOf('{') !== 0) { + str = "{" + str + "}"; + } + var varsValues; + if (evaluateValue) { + varsValues = maybeEval(elt,function () {return Function("return (" + str + ")")();}, {}); + } else { + varsValues = parseJSON(str); + } + for (var key in varsValues) { + if (varsValues.hasOwnProperty(key)) { + if (values[key] == null) { + values[key] = varsValues[key]; + } + } + } + } + return getValuesForElement(parentElt(elt), attr, evalAsDefault, values); + } + + function maybeEval(elt, toEval, defaultVal) { + if (htmx.config.allowEval) { + return toEval(); + } else { + triggerErrorEvent(elt, 'htmx:evalDisallowedError'); + return defaultVal; + } + } + + /** + * @param {HTMLElement} elt + * @param {*} expressionVars + * @returns + */ + function getHXVarsForElement(elt, expressionVars) { + return getValuesForElement(elt, "hx-vars", true, expressionVars); + } + + /** + * @param {HTMLElement} elt + * @param {*} expressionVars + * @returns + */ + function getHXValsForElement(elt, expressionVars) { + return getValuesForElement(elt, "hx-vals", false, expressionVars); + } + + /** + * @param {HTMLElement} elt + * @returns {Object} + */ + function getExpressionVars(elt) { + return mergeObjects(getHXVarsForElement(elt), getHXValsForElement(elt)); + } + + function safelySetHeaderValue(xhr, header, headerValue) { + if (headerValue !== null) { + try { + xhr.setRequestHeader(header, headerValue); + } catch (e) { + // On an exception, try to set the header URI encoded instead + xhr.setRequestHeader(header, encodeURIComponent(headerValue)); + xhr.setRequestHeader(header + "-URI-AutoEncoded", "true"); + } + } + } + + function getPathFromResponse(xhr) { + // NB: IE11 does not support this stuff + if (xhr.responseURL && typeof(URL) !== "undefined") { + try { + var url = new URL(xhr.responseURL); + return url.pathname + url.search; + } catch (e) { + triggerErrorEvent(getDocument().body, "htmx:badResponseUrl", {url: xhr.responseURL}); + } + } + } + + function hasHeader(xhr, regexp) { + return xhr.getAllResponseHeaders().match(regexp); + } + + function ajaxHelper(verb, path, context) { + verb = verb.toLowerCase(); + if (context) { + if (context instanceof Element || isType(context, 'String')) { + return issueAjaxRequest(verb, path, null, null, { + targetOverride: resolveTarget(context), + returnPromise: true + }); + } else { + return issueAjaxRequest(verb, path, resolveTarget(context.source), context.event, + { + handler : context.handler, + headers : context.headers, + values : context.values, + targetOverride: resolveTarget(context.target), + swapOverride: context.swap, + returnPromise: true + }); + } + } else { + return issueAjaxRequest(verb, path, null, null, { + returnPromise: true + }); + } + } + + function hierarchyForElt(elt) { + var arr = []; + while (elt) { + arr.push(elt); + elt = elt.parentElement; + } + return arr; + } + + function verifyPath(elt, path, requestConfig) { + var sameHost + var url + if (typeof URL === "function") { + url = new URL(path, document.location.href); + var origin = document.location.origin; + sameHost = origin === url.origin; + } else { + // IE11 doesn't support URL + url = path + sameHost = startsWith(path, document.location.origin) + } + + if (htmx.config.selfRequestsOnly) { + if (!sameHost) { + return false; + } + } + return triggerEvent(elt, "htmx:validateUrl", mergeObjects({url: url, sameHost: sameHost}, requestConfig)); + } + + function issueAjaxRequest(verb, path, elt, event, etc, confirmed) { + var resolve = null; + var reject = null; + etc = etc != null ? etc : {}; + if(etc.returnPromise && typeof Promise !== "undefined"){ + var promise = new Promise(function (_resolve, _reject) { + resolve = _resolve; + reject = _reject; + }); + } + if(elt == null) { + elt = getDocument().body; + } + var responseHandler = etc.handler || handleAjaxResponse; + + if (!bodyContains(elt)) { + // do not issue requests for elements removed from the DOM + maybeCall(resolve); + return promise; + } + var target = etc.targetOverride || getTarget(elt); + if (target == null || target == DUMMY_ELT) { + triggerErrorEvent(elt, 'htmx:targetError', {target: getAttributeValue(elt, "hx-target")}); + maybeCall(reject); + return promise; + } + + var eltData = getInternalData(elt); + var submitter = eltData.lastButtonClicked; + + if (submitter) { + var buttonPath = getRawAttribute(submitter, "formaction"); + if (buttonPath != null) { + path = buttonPath; + } + + var buttonVerb = getRawAttribute(submitter, "formmethod") + if (buttonVerb != null) { + // ignore buttons with formmethod="dialog" + if (buttonVerb.toLowerCase() !== "dialog") { + verb = buttonVerb; + } + } + } + + var confirmQuestion = getClosestAttributeValue(elt, "hx-confirm"); + // allow event-based confirmation w/ a callback + if (confirmed === undefined) { + var issueRequest = function(skipConfirmation) { + return issueAjaxRequest(verb, path, elt, event, etc, !!skipConfirmation); + } + var confirmDetails = {target: target, elt: elt, path: path, verb: verb, triggeringEvent: event, etc: etc, issueRequest: issueRequest, question: confirmQuestion}; + if (triggerEvent(elt, 'htmx:confirm', confirmDetails) === false) { + maybeCall(resolve); + return promise; + } + } + + var syncElt = elt; + var syncStrategy = getClosestAttributeValue(elt, "hx-sync"); + var queueStrategy = null; + var abortable = false; + if (syncStrategy) { + var syncStrings = syncStrategy.split(":"); + var selector = syncStrings[0].trim(); + if (selector === "this") { + syncElt = findThisElement(elt, 'hx-sync'); + } else { + syncElt = querySelectorExt(elt, selector); + } + // default to the drop strategy + syncStrategy = (syncStrings[1] || 'drop').trim(); + eltData = getInternalData(syncElt); + if (syncStrategy === "drop" && eltData.xhr && eltData.abortable !== true) { + maybeCall(resolve); + return promise; + } else if (syncStrategy === "abort") { + if (eltData.xhr) { + maybeCall(resolve); + return promise; + } else { + abortable = true; + } + } else if (syncStrategy === "replace") { + triggerEvent(syncElt, 'htmx:abort'); // abort the current request and continue + } else if (syncStrategy.indexOf("queue") === 0) { + var queueStrArray = syncStrategy.split(" "); + queueStrategy = (queueStrArray[1] || "last").trim(); + } + } + + if (eltData.xhr) { + if (eltData.abortable) { + triggerEvent(syncElt, 'htmx:abort'); // abort the current request and continue + } else { + if(queueStrategy == null){ + if (event) { + var eventData = getInternalData(event); + if (eventData && eventData.triggerSpec && eventData.triggerSpec.queue) { + queueStrategy = eventData.triggerSpec.queue; + } + } + if (queueStrategy == null) { + queueStrategy = "last"; + } + } + if (eltData.queuedRequests == null) { + eltData.queuedRequests = []; + } + if (queueStrategy === "first" && eltData.queuedRequests.length === 0) { + eltData.queuedRequests.push(function () { + issueAjaxRequest(verb, path, elt, event, etc) + }); + } else if (queueStrategy === "all") { + eltData.queuedRequests.push(function () { + issueAjaxRequest(verb, path, elt, event, etc) + }); + } else if (queueStrategy === "last") { + eltData.queuedRequests = []; // dump existing queue + eltData.queuedRequests.push(function () { + issueAjaxRequest(verb, path, elt, event, etc) + }); + } + maybeCall(resolve); + return promise; + } + } + + var xhr = new XMLHttpRequest(); + eltData.xhr = xhr; + eltData.abortable = abortable; + var endRequestLock = function(){ + eltData.xhr = null; + eltData.abortable = false; + if (eltData.queuedRequests != null && + eltData.queuedRequests.length > 0) { + var queuedRequest = eltData.queuedRequests.shift(); + queuedRequest(); + } + } + var promptQuestion = getClosestAttributeValue(elt, "hx-prompt"); + if (promptQuestion) { + var promptResponse = prompt(promptQuestion); + // prompt returns null if cancelled and empty string if accepted with no entry + if (promptResponse === null || + !triggerEvent(elt, 'htmx:prompt', {prompt: promptResponse, target:target})) { + maybeCall(resolve); + endRequestLock(); + return promise; + } + } + + if (confirmQuestion && !confirmed) { + if(!confirm(confirmQuestion)) { + maybeCall(resolve); + endRequestLock() + return promise; + } + } + + + var headers = getHeaders(elt, target, promptResponse); + if (etc.headers) { + headers = mergeObjects(headers, etc.headers); + } + var results = getInputValues(elt, verb); + var errors = results.errors; + var rawParameters = results.values; + if (etc.values) { + rawParameters = mergeObjects(rawParameters, etc.values); + } + var expressionVars = getExpressionVars(elt); + var allParameters = mergeObjects(rawParameters, expressionVars); + var filteredParameters = filterValues(allParameters, elt); + + if (verb !== 'get' && !usesFormData(elt)) { + headers['Content-Type'] = 'application/x-www-form-urlencoded'; + } + + if (htmx.config.getCacheBusterParam && verb === 'get') { + filteredParameters['org.htmx.cache-buster'] = getRawAttribute(target, "id") || "true"; + } + + // behavior of anchors w/ empty href is to use the current URL + if (path == null || path === "") { + path = getDocument().location.href; + } + + + var requestAttrValues = getValuesForElement(elt, 'hx-request'); + + var eltIsBoosted = getInternalData(elt).boosted; + + var useUrlParams = htmx.config.methodsThatUseUrlParams.indexOf(verb) >= 0 + + var requestConfig = { + boosted: eltIsBoosted, + useUrlParams: useUrlParams, + parameters: filteredParameters, + unfilteredParameters: allParameters, + headers:headers, + target:target, + verb:verb, + errors:errors, + withCredentials: etc.credentials || requestAttrValues.credentials || htmx.config.withCredentials, + timeout: etc.timeout || requestAttrValues.timeout || htmx.config.timeout, + path:path, + triggeringEvent:event + }; + + if(!triggerEvent(elt, 'htmx:configRequest', requestConfig)){ + maybeCall(resolve); + endRequestLock(); + return promise; + } + + // copy out in case the object was overwritten + path = requestConfig.path; + verb = requestConfig.verb; + headers = requestConfig.headers; + filteredParameters = requestConfig.parameters; + errors = requestConfig.errors; + useUrlParams = requestConfig.useUrlParams; + + if(errors && errors.length > 0){ + triggerEvent(elt, 'htmx:validation:halted', requestConfig) + maybeCall(resolve); + endRequestLock(); + return promise; + } + + var splitPath = path.split("#"); + var pathNoAnchor = splitPath[0]; + var anchor = splitPath[1]; + + var finalPath = path + if (useUrlParams) { + finalPath = pathNoAnchor; + var values = Object.keys(filteredParameters).length !== 0; + if (values) { + if (finalPath.indexOf("?") < 0) { + finalPath += "?"; + } else { + finalPath += "&"; + } + finalPath += urlEncode(filteredParameters); + if (anchor) { + finalPath += "#" + anchor; + } + } + } + + if (!verifyPath(elt, finalPath, requestConfig)) { + triggerErrorEvent(elt, 'htmx:invalidPath', requestConfig) + maybeCall(reject); + return promise; + }; + + xhr.open(verb.toUpperCase(), finalPath, true); + xhr.overrideMimeType("text/html"); + xhr.withCredentials = requestConfig.withCredentials; + xhr.timeout = requestConfig.timeout; + + // request headers + if (requestAttrValues.noHeaders) { + // ignore all headers + } else { + for (var header in headers) { + if (headers.hasOwnProperty(header)) { + var headerValue = headers[header]; + safelySetHeaderValue(xhr, header, headerValue); + } + } + } + + var responseInfo = { + xhr: xhr, target: target, requestConfig: requestConfig, etc: etc, boosted: eltIsBoosted, + pathInfo: { + requestPath: path, + finalRequestPath: finalPath, + anchor: anchor + } + }; + + xhr.onload = function () { + try { + var hierarchy = hierarchyForElt(elt); + responseInfo.pathInfo.responsePath = getPathFromResponse(xhr); + responseHandler(elt, responseInfo); + removeRequestIndicators(indicators, disableElts); + triggerEvent(elt, 'htmx:afterRequest', responseInfo); + triggerEvent(elt, 'htmx:afterOnLoad', responseInfo); + // if the body no longer contains the element, trigger the event on the closest parent + // remaining in the DOM + if (!bodyContains(elt)) { + var secondaryTriggerElt = null; + while (hierarchy.length > 0 && secondaryTriggerElt == null) { + var parentEltInHierarchy = hierarchy.shift(); + if (bodyContains(parentEltInHierarchy)) { + secondaryTriggerElt = parentEltInHierarchy; + } + } + if (secondaryTriggerElt) { + triggerEvent(secondaryTriggerElt, 'htmx:afterRequest', responseInfo); + triggerEvent(secondaryTriggerElt, 'htmx:afterOnLoad', responseInfo); + } + } + maybeCall(resolve); + endRequestLock(); + } catch (e) { + triggerErrorEvent(elt, 'htmx:onLoadError', mergeObjects({error:e}, responseInfo)); + throw e; + } + } + xhr.onerror = function () { + removeRequestIndicators(indicators, disableElts); + triggerErrorEvent(elt, 'htmx:afterRequest', responseInfo); + triggerErrorEvent(elt, 'htmx:sendError', responseInfo); + maybeCall(reject); + endRequestLock(); + } + xhr.onabort = function() { + removeRequestIndicators(indicators, disableElts); + triggerErrorEvent(elt, 'htmx:afterRequest', responseInfo); + triggerErrorEvent(elt, 'htmx:sendAbort', responseInfo); + maybeCall(reject); + endRequestLock(); + } + xhr.ontimeout = function() { + removeRequestIndicators(indicators, disableElts); + triggerErrorEvent(elt, 'htmx:afterRequest', responseInfo); + triggerErrorEvent(elt, 'htmx:timeout', responseInfo); + maybeCall(reject); + endRequestLock(); + } + if(!triggerEvent(elt, 'htmx:beforeRequest', responseInfo)){ + maybeCall(resolve); + endRequestLock() + return promise + } + var indicators = addRequestIndicatorClasses(elt); + var disableElts = disableElements(elt); + + forEach(['loadstart', 'loadend', 'progress', 'abort'], function(eventName) { + forEach([xhr, xhr.upload], function (target) { + target.addEventListener(eventName, function(event){ + triggerEvent(elt, "htmx:xhr:" + eventName, { + lengthComputable:event.lengthComputable, + loaded:event.loaded, + total:event.total + }); + }) + }); + }); + triggerEvent(elt, 'htmx:beforeSend', responseInfo); + var params = useUrlParams ? null : encodeParamsForBody(xhr, elt, filteredParameters) + xhr.send(params); + return promise; + } + + function determineHistoryUpdates(elt, responseInfo) { + + var xhr = responseInfo.xhr; + + //=========================================== + // First consult response headers + //=========================================== + var pathFromHeaders = null; + var typeFromHeaders = null; + if (hasHeader(xhr,/HX-Push:/i)) { + pathFromHeaders = xhr.getResponseHeader("HX-Push"); + typeFromHeaders = "push"; + } else if (hasHeader(xhr,/HX-Push-Url:/i)) { + pathFromHeaders = xhr.getResponseHeader("HX-Push-Url"); + typeFromHeaders = "push"; + } else if (hasHeader(xhr,/HX-Replace-Url:/i)) { + pathFromHeaders = xhr.getResponseHeader("HX-Replace-Url"); + typeFromHeaders = "replace"; + } + + // if there was a response header, that has priority + if (pathFromHeaders) { + if (pathFromHeaders === "false") { + return {} + } else { + return { + type: typeFromHeaders, + path : pathFromHeaders + } + } + } + + //=========================================== + // Next resolve via DOM values + //=========================================== + var requestPath = responseInfo.pathInfo.finalRequestPath; + var responsePath = responseInfo.pathInfo.responsePath; + + var pushUrl = getClosestAttributeValue(elt, "hx-push-url"); + var replaceUrl = getClosestAttributeValue(elt, "hx-replace-url"); + var elementIsBoosted = getInternalData(elt).boosted; + + var saveType = null; + var path = null; + + if (pushUrl) { + saveType = "push"; + path = pushUrl; + } else if (replaceUrl) { + saveType = "replace"; + path = replaceUrl; + } else if (elementIsBoosted) { + saveType = "push"; + path = responsePath || requestPath; // if there is no response path, go with the original request path + } + + if (path) { + // false indicates no push, return empty object + if (path === "false") { + return {}; + } + + // true indicates we want to follow wherever the server ended up sending us + if (path === "true") { + path = responsePath || requestPath; // if there is no response path, go with the original request path + } + + // restore any anchor associated with the request + if (responseInfo.pathInfo.anchor && + path.indexOf("#") === -1) { + path = path + "#" + responseInfo.pathInfo.anchor; + } + + return { + type:saveType, + path: path + } + } else { + return {}; + } + } + + function handleAjaxResponse(elt, responseInfo) { + var xhr = responseInfo.xhr; + var target = responseInfo.target; + var etc = responseInfo.etc; + var requestConfig = responseInfo.requestConfig; + + if (!triggerEvent(elt, 'htmx:beforeOnLoad', responseInfo)) return; + + if (hasHeader(xhr, /HX-Trigger:/i)) { + handleTrigger(xhr, "HX-Trigger", elt); + } + + if (hasHeader(xhr, /HX-Location:/i)) { + saveCurrentPageToHistory(); + var redirectPath = xhr.getResponseHeader("HX-Location"); + var swapSpec; + if (redirectPath.indexOf("{") === 0) { + swapSpec = parseJSON(redirectPath); + // what's the best way to throw an error if the user didn't include this + redirectPath = swapSpec['path']; + delete swapSpec['path']; + } + ajaxHelper('GET', redirectPath, swapSpec).then(function(){ + pushUrlIntoHistory(redirectPath); + }); + return; + } + + var shouldRefresh = hasHeader(xhr, /HX-Refresh:/i) && "true" === xhr.getResponseHeader("HX-Refresh"); + + if (hasHeader(xhr, /HX-Redirect:/i)) { + location.href = xhr.getResponseHeader("HX-Redirect"); + shouldRefresh && location.reload(); + return; + } + + if (shouldRefresh) { + location.reload(); + return; + } + + if (hasHeader(xhr,/HX-Retarget:/i)) { + responseInfo.target = getDocument().querySelector(xhr.getResponseHeader("HX-Retarget")); + } + + var historyUpdate = determineHistoryUpdates(elt, responseInfo); + + // by default htmx only swaps on 200 return codes and does not swap + // on 204 'No Content' + // this can be ovverriden by responding to the htmx:beforeSwap event and + // overriding the detail.shouldSwap property + var shouldSwap = xhr.status >= 200 && xhr.status < 400 && xhr.status !== 204; + var serverResponse = xhr.response; + var isError = xhr.status >= 400; + var ignoreTitle = htmx.config.ignoreTitle + var beforeSwapDetails = mergeObjects({shouldSwap: shouldSwap, serverResponse:serverResponse, isError:isError, ignoreTitle:ignoreTitle }, responseInfo); + if (!triggerEvent(target, 'htmx:beforeSwap', beforeSwapDetails)) return; + + target = beforeSwapDetails.target; // allow re-targeting + serverResponse = beforeSwapDetails.serverResponse; // allow updating content + isError = beforeSwapDetails.isError; // allow updating error + ignoreTitle = beforeSwapDetails.ignoreTitle; // allow updating ignoring title + + responseInfo.target = target; // Make updated target available to response events + responseInfo.failed = isError; // Make failed property available to response events + responseInfo.successful = !isError; // Make successful property available to response events + + if (beforeSwapDetails.shouldSwap) { + if (xhr.status === 286) { + cancelPolling(elt); + } + + withExtensions(elt, function (extension) { + serverResponse = extension.transformResponse(serverResponse, xhr, elt); + }); + + // Save current page if there will be a history update + if (historyUpdate.type) { + saveCurrentPageToHistory(); + } + + var swapOverride = etc.swapOverride; + if (hasHeader(xhr,/HX-Reswap:/i)) { + swapOverride = xhr.getResponseHeader("HX-Reswap"); + } + var swapSpec = getSwapSpecification(elt, swapOverride); + + if (swapSpec.hasOwnProperty('ignoreTitle')) { + ignoreTitle = swapSpec.ignoreTitle; + } + + target.classList.add(htmx.config.swappingClass); + + // optional transition API promise callbacks + var settleResolve = null; + var settleReject = null; + + var doSwap = function () { + try { + var activeElt = document.activeElement; + var selectionInfo = {}; + try { + selectionInfo = { + elt: activeElt, + // @ts-ignore + start: activeElt ? activeElt.selectionStart : null, + // @ts-ignore + end: activeElt ? activeElt.selectionEnd : null + }; + } catch (e) { + // safari issue - see https://github.com/microsoft/playwright/issues/5894 + } + + var selectOverride; + if (hasHeader(xhr, /HX-Reselect:/i)) { + selectOverride = xhr.getResponseHeader("HX-Reselect"); + } + + var settleInfo = makeSettleInfo(target); + selectAndSwap(swapSpec.swapStyle, target, elt, serverResponse, settleInfo, selectOverride); + + if (selectionInfo.elt && + !bodyContains(selectionInfo.elt) && + getRawAttribute(selectionInfo.elt, "id")) { + var newActiveElt = document.getElementById(getRawAttribute(selectionInfo.elt, "id")); + var focusOptions = { preventScroll: swapSpec.focusScroll !== undefined ? !swapSpec.focusScroll : !htmx.config.defaultFocusScroll }; + if (newActiveElt) { + // @ts-ignore + if (selectionInfo.start && newActiveElt.setSelectionRange) { + // @ts-ignore + try { + newActiveElt.setSelectionRange(selectionInfo.start, selectionInfo.end); + } catch (e) { + // the setSelectionRange method is present on fields that don't support it, so just let this fail + } + } + newActiveElt.focus(focusOptions); + } + } + + target.classList.remove(htmx.config.swappingClass); + forEach(settleInfo.elts, function (elt) { + if (elt.classList) { + elt.classList.add(htmx.config.settlingClass); + } + triggerEvent(elt, 'htmx:afterSwap', responseInfo); + }); + + if (hasHeader(xhr, /HX-Trigger-After-Swap:/i)) { + var finalElt = elt; + if (!bodyContains(elt)) { + finalElt = getDocument().body; + } + handleTrigger(xhr, "HX-Trigger-After-Swap", finalElt); + } + + var doSettle = function () { + forEach(settleInfo.tasks, function (task) { + task.call(); + }); + forEach(settleInfo.elts, function (elt) { + if (elt.classList) { + elt.classList.remove(htmx.config.settlingClass); + } + triggerEvent(elt, 'htmx:afterSettle', responseInfo); + }); + + // if we need to save history, do so + if (historyUpdate.type) { + triggerEvent(getDocument().body, 'htmx:beforeHistoryUpdate', mergeObjects({ history: historyUpdate }, responseInfo)); + if (historyUpdate.type === "push") { + pushUrlIntoHistory(historyUpdate.path); + triggerEvent(getDocument().body, 'htmx:pushedIntoHistory', {path: historyUpdate.path}); + } else { + replaceUrlInHistory(historyUpdate.path); + triggerEvent(getDocument().body, 'htmx:replacedInHistory', {path: historyUpdate.path}); + } + } + if (responseInfo.pathInfo.anchor) { + var anchorTarget = getDocument().getElementById(responseInfo.pathInfo.anchor); + if(anchorTarget) { + anchorTarget.scrollIntoView({block:'start', behavior: "auto"}); + } + } + + if(settleInfo.title && !ignoreTitle) { + var titleElt = find("title"); + if(titleElt) { + titleElt.innerHTML = settleInfo.title; + } else { + window.document.title = settleInfo.title; + } + } + + updateScrollState(settleInfo.elts, swapSpec); + + if (hasHeader(xhr, /HX-Trigger-After-Settle:/i)) { + var finalElt = elt; + if (!bodyContains(elt)) { + finalElt = getDocument().body; + } + handleTrigger(xhr, "HX-Trigger-After-Settle", finalElt); + } + maybeCall(settleResolve); + } + + if (swapSpec.settleDelay > 0) { + setTimeout(doSettle, swapSpec.settleDelay) + } else { + doSettle(); + } + } catch (e) { + triggerErrorEvent(elt, 'htmx:swapError', responseInfo); + maybeCall(settleReject); + throw e; + } + }; + + var shouldTransition = htmx.config.globalViewTransitions + if(swapSpec.hasOwnProperty('transition')){ + shouldTransition = swapSpec.transition; + } + + if(shouldTransition && + triggerEvent(elt, 'htmx:beforeTransition', responseInfo) && + typeof Promise !== "undefined" && document.startViewTransition){ + var settlePromise = new Promise(function (_resolve, _reject) { + settleResolve = _resolve; + settleReject = _reject; + }); + // wrap the original doSwap() in a call to startViewTransition() + var innerDoSwap = doSwap; + doSwap = function() { + document.startViewTransition(function () { + innerDoSwap(); + return settlePromise; + }); + } + } + + + if (swapSpec.swapDelay > 0) { + setTimeout(doSwap, swapSpec.swapDelay) + } else { + doSwap(); + } + } + if (isError) { + triggerErrorEvent(elt, 'htmx:responseError', mergeObjects({error: "Response Status Error Code " + xhr.status + " from " + responseInfo.pathInfo.requestPath}, responseInfo)); + } + } + + //==================================================================== + // Extensions API + //==================================================================== + + /** @type {Object} */ + var extensions = {}; + + /** + * extensionBase defines the default functions for all extensions. + * @returns {import("./htmx").HtmxExtension} + */ + function extensionBase() { + return { + init: function(api) {return null;}, + onEvent : function(name, evt) {return true;}, + transformResponse : function(text, xhr, elt) {return text;}, + isInlineSwap : function(swapStyle) {return false;}, + handleSwap : function(swapStyle, target, fragment, settleInfo) {return false;}, + encodeParameters : function(xhr, parameters, elt) {return null;} + } + } + + /** + * defineExtension initializes the extension and adds it to the htmx registry + * + * @param {string} name + * @param {import("./htmx").HtmxExtension} extension + */ + function defineExtension(name, extension) { + if(extension.init) { + extension.init(internalAPI) + } + extensions[name] = mergeObjects(extensionBase(), extension); + } + + /** + * removeExtension removes an extension from the htmx registry + * + * @param {string} name + */ + function removeExtension(name) { + delete extensions[name]; + } + + /** + * getExtensions searches up the DOM tree to return all extensions that can be applied to a given element + * + * @param {HTMLElement} elt + * @param {import("./htmx").HtmxExtension[]=} extensionsToReturn + * @param {import("./htmx").HtmxExtension[]=} extensionsToIgnore + */ + function getExtensions(elt, extensionsToReturn, extensionsToIgnore) { + + if (elt == undefined) { + return extensionsToReturn; + } + if (extensionsToReturn == undefined) { + extensionsToReturn = []; + } + if (extensionsToIgnore == undefined) { + extensionsToIgnore = []; + } + var extensionsForElement = getAttributeValue(elt, "hx-ext"); + if (extensionsForElement) { + forEach(extensionsForElement.split(","), function(extensionName){ + extensionName = extensionName.replace(/ /g, ''); + if (extensionName.slice(0, 7) == "ignore:") { + extensionsToIgnore.push(extensionName.slice(7)); + return; + } + if (extensionsToIgnore.indexOf(extensionName) < 0) { + var extension = extensions[extensionName]; + if (extension && extensionsToReturn.indexOf(extension) < 0) { + extensionsToReturn.push(extension); + } + } + }); + } + return getExtensions(parentElt(elt), extensionsToReturn, extensionsToIgnore); + } + + //==================================================================== + // Initialization + //==================================================================== + var isReady = false + getDocument().addEventListener('DOMContentLoaded', function() { + isReady = true + }) + + /** + * Execute a function now if DOMContentLoaded has fired, otherwise listen for it. + * + * This function uses isReady because there is no realiable way to ask the browswer whether + * the DOMContentLoaded event has already been fired; there's a gap between DOMContentLoaded + * firing and readystate=complete. + */ + function ready(fn) { + // Checking readyState here is a failsafe in case the htmx script tag entered the DOM by + // some means other than the initial page load. + if (isReady || getDocument().readyState === 'complete') { + fn(); + } else { + getDocument().addEventListener('DOMContentLoaded', fn); + } + } + + function insertIndicatorStyles() { + if (htmx.config.includeIndicatorStyles !== false) { + getDocument().head.insertAdjacentHTML("beforeend", + ""); + } + } + + function getMetaConfig() { + var element = getDocument().querySelector('meta[name="htmx-config"]'); + if (element) { + // @ts-ignore + return parseJSON(element.content); + } else { + return null; + } + } + + function mergeMetaConfig() { + var metaConfig = getMetaConfig(); + if (metaConfig) { + htmx.config = mergeObjects(htmx.config , metaConfig) + } + } + + // initialize the document + ready(function () { + mergeMetaConfig(); + insertIndicatorStyles(); + var body = getDocument().body; + processNode(body); + var restoredElts = getDocument().querySelectorAll( + "[hx-trigger='restored'],[data-hx-trigger='restored']" + ); + body.addEventListener("htmx:abort", function (evt) { + var target = evt.target; + var internalData = getInternalData(target); + if (internalData && internalData.xhr) { + internalData.xhr.abort(); + } + }); + var originalPopstate = window.onpopstate; + window.onpopstate = function (event) { + if (event.state && event.state.htmx) { + restoreHistory(); + forEach(restoredElts, function(elt){ + triggerEvent(elt, 'htmx:restored', { + 'document': getDocument(), + 'triggerEvent': triggerEvent + }); + }); + } else { + if (originalPopstate) { + originalPopstate(event); + } + } + }; + setTimeout(function () { + triggerEvent(body, 'htmx:load', {}); // give ready handlers a chance to load up before firing this event + body = null; // kill reference for gc + }, 0); + }) + + return htmx; + } +)() +})); diff --git a/assets/static/js/htmx/htmx.min.js b/assets/static/js/htmx/htmx.min.js new file mode 100644 index 0000000..daab078 --- /dev/null +++ b/assets/static/js/htmx/htmx.min.js @@ -0,0 +1 @@ +(function(e,t){if(typeof define==="function"&&define.amd){define([],t)}else if(typeof module==="object"&&module.exports){module.exports=t()}else{e.htmx=e.htmx||t()}})(typeof self!=="undefined"?self:this,function(){return function(){"use strict";var Y={onLoad:t,process:Dt,on:Z,off:K,trigger:fe,ajax:Cr,find:E,findAll:f,closest:d,values:function(e,t){var r=or(e,t||"post");return r.values},remove:B,addClass:F,removeClass:n,toggleClass:V,takeClass:j,defineExtension:Ar,removeExtension:Nr,logAll:X,logNone:U,logger:null,config:{historyEnabled:true,historyCacheSize:10,refreshOnHistoryMiss:false,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:true,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:true,allowScriptTags:true,inlineScriptNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:false,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",useTemplateFragments:false,scrollBehavior:"smooth",defaultFocusScroll:false,getCacheBusterParam:false,globalViewTransitions:false,methodsThatUseUrlParams:["get"],selfRequestsOnly:false,scrollIntoViewOnBoost:true},parseInterval:v,_:e,createEventSource:function(e){return new EventSource(e,{withCredentials:true})},createWebSocket:function(e){var t=new WebSocket(e,[]);t.binaryType=Y.config.wsBinaryType;return t},version:"1.9.7"};var r={addTriggerHandler:St,bodyContains:oe,canAccessLocalStorage:M,findThisElement:ve,filterValues:cr,hasAttribute:o,getAttributeValue:ee,getClosestAttributeValue:re,getClosestMatch:c,getExpressionVars:wr,getHeaders:fr,getInputValues:or,getInternalData:ie,getSwapSpecification:dr,getTriggerSpecs:Ze,getTarget:ge,makeFragment:l,mergeObjects:se,makeSettleInfo:T,oobSwap:ye,querySelectorExt:le,selectAndSwap:Ue,settleImmediately:Jt,shouldCancel:tt,triggerEvent:fe,triggerErrorEvent:ue,withExtensions:C};var b=["get","post","put","delete","patch"];var w=b.map(function(e){return"[hx-"+e+"], [data-hx-"+e+"]"}).join(", ");function v(e){if(e==undefined){return undefined}if(e.slice(-2)=="ms"){return parseFloat(e.slice(0,-2))||undefined}if(e.slice(-1)=="s"){return parseFloat(e.slice(0,-1))*1e3||undefined}if(e.slice(-1)=="m"){return parseFloat(e.slice(0,-1))*1e3*60||undefined}return parseFloat(e)||undefined}function Q(e,t){return e.getAttribute&&e.getAttribute(t)}function o(e,t){return e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function ee(e,t){return Q(e,t)||Q(e,"data-"+t)}function u(e){return e.parentElement}function te(){return document}function c(e,t){while(e&&!t(e)){e=u(e)}return e?e:null}function R(e,t,r){var n=ee(t,r);var i=ee(t,"hx-disinherit");if(e!==t&&i&&(i==="*"||i.split(" ").indexOf(r)>=0)){return"unset"}else{return n}}function re(t,r){var n=null;c(t,function(e){return n=R(t,e,r)});if(n!=="unset"){return n}}function h(e,t){var r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector;return r&&r.call(e,t)}function q(e){var t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i;var r=t.exec(e);if(r){return r[1].toLowerCase()}else{return""}}function i(e,t){var r=new DOMParser;var n=r.parseFromString(e,"text/html");var i=n.body;while(t>0){t--;i=i.firstChild}if(i==null){i=te().createDocumentFragment()}return i}function H(e){return e.match(/",0);return r.querySelector("template").content}else{var n=q(e);switch(n){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return i(""+e+"
    ",1);case"col":return i(""+e+"
    ",2);case"tr":return i(""+e+"
    ",2);case"td":case"th":return i(""+e+"
    ",3);case"script":case"style":return i("
    "+e+"
    ",1);default:return i(e,0)}}}function ne(e){if(e){e()}}function L(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function A(e){return L(e,"Function")}function N(e){return L(e,"Object")}function ie(e){var t="htmx-internal-data";var r=e[t];if(!r){r=e[t]={}}return r}function I(e){var t=[];if(e){for(var r=0;r=0}function oe(e){if(e.getRootNode&&e.getRootNode()instanceof window.ShadowRoot){return te().body.contains(e.getRootNode().host)}else{return te().body.contains(e)}}function P(e){return e.trim().split(/\s+/)}function se(e,t){for(var r in t){if(t.hasOwnProperty(r)){e[r]=t[r]}}return e}function S(e){try{return JSON.parse(e)}catch(e){y(e);return null}}function M(){var e="htmx:localStorageTest";try{localStorage.setItem(e,e);localStorage.removeItem(e);return true}catch(e){return false}}function D(t){try{var e=new URL(t);if(e){t=e.pathname+e.search}if(!t.match("^/$")){t=t.replace(/\/+$/,"")}return t}catch(e){return t}}function e(e){return xr(te().body,function(){return eval(e)})}function t(t){var e=Y.on("htmx:load",function(e){t(e.detail.elt)});return e}function X(){Y.logger=function(e,t,r){if(console){console.log(t,e,r)}}}function U(){Y.logger=null}function E(e,t){if(t){return e.querySelector(t)}else{return E(te(),e)}}function f(e,t){if(t){return e.querySelectorAll(t)}else{return f(te(),e)}}function B(e,t){e=s(e);if(t){setTimeout(function(){B(e);e=null},t)}else{e.parentElement.removeChild(e)}}function F(e,t,r){e=s(e);if(r){setTimeout(function(){F(e,t);e=null},r)}else{e.classList&&e.classList.add(t)}}function n(e,t,r){e=s(e);if(r){setTimeout(function(){n(e,t);e=null},r)}else{if(e.classList){e.classList.remove(t);if(e.classList.length===0){e.removeAttribute("class")}}}}function V(e,t){e=s(e);e.classList.toggle(t)}function j(e,t){e=s(e);ae(e.parentElement.children,function(e){n(e,t)});F(e,t)}function d(e,t){e=s(e);if(e.closest){return e.closest(t)}else{do{if(e==null||h(e,t)){return e}}while(e=e&&u(e));return null}}function g(e,t){return e.substring(0,t.length)===t}function _(e,t){return e.substring(e.length-t.length)===t}function z(e){var t=e.trim();if(g(t,"<")&&_(t,"/>")){return t.substring(1,t.length-2)}else{return t}}function W(e,t){if(t.indexOf("closest ")===0){return[d(e,z(t.substr(8)))]}else if(t.indexOf("find ")===0){return[E(e,z(t.substr(5)))]}else if(t==="next"){return[e.nextElementSibling]}else if(t.indexOf("next ")===0){return[$(e,z(t.substr(5)))]}else if(t==="previous"){return[e.previousElementSibling]}else if(t.indexOf("previous ")===0){return[G(e,z(t.substr(9)))]}else if(t==="document"){return[document]}else if(t==="window"){return[window]}else if(t==="body"){return[document.body]}else{return te().querySelectorAll(z(t))}}var $=function(e,t){var r=te().querySelectorAll(t);for(var n=0;n=0;n--){var i=r[n];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING){return i}}};function le(e,t){if(t){return W(e,t)[0]}else{return W(te().body,e)[0]}}function s(e){if(L(e,"String")){return E(e)}else{return e}}function J(e,t,r){if(A(t)){return{target:te().body,event:e,listener:t}}else{return{target:s(e),event:t,listener:r}}}function Z(t,r,n){Pr(function(){var e=J(t,r,n);e.target.addEventListener(e.event,e.listener)});var e=A(r);return e?r:n}function K(t,r,n){Pr(function(){var e=J(t,r,n);e.target.removeEventListener(e.event,e.listener)});return A(r)?r:n}var he=te().createElement("output");function de(e,t){var r=re(e,t);if(r){if(r==="this"){return[ve(e,t)]}else{var n=W(e,r);if(n.length===0){y('The selector "'+r+'" on '+t+" returned no matches!");return[he]}else{return n}}}}function ve(e,t){return c(e,function(e){return ee(e,t)!=null})}function ge(e){var t=re(e,"hx-target");if(t){if(t==="this"){return ve(e,"hx-target")}else{return le(e,t)}}else{var r=ie(e);if(r.boosted){return te().body}else{return e}}}function me(e){var t=Y.config.attributesToSettle;for(var r=0;r0){o=e.substr(0,e.indexOf(":"));t=e.substr(e.indexOf(":")+1,e.length)}else{o=e}var r=te().querySelectorAll(t);if(r){ae(r,function(e){var t;var r=i.cloneNode(true);t=te().createDocumentFragment();t.appendChild(r);if(!xe(o,e)){t=r}var n={shouldSwap:true,target:e,fragment:t};if(!fe(e,"htmx:oobBeforeSwap",n))return;e=n.target;if(n["shouldSwap"]){De(o,e,e,t,a)}ae(a.elts,function(e){fe(e,"htmx:oobAfterSwap",n)})});i.parentNode.removeChild(i)}else{i.parentNode.removeChild(i);ue(te().body,"htmx:oobErrorNoTarget",{content:i})}return e}function be(e,t,r){var n=re(e,"hx-select-oob");if(n){var i=n.split(",");for(let e=0;e0){var r=t.replace("'","\\'");var n=e.tagName.replace(":","\\:");var i=o.querySelector(n+"[id='"+r+"']");if(i&&i!==o){var a=e.cloneNode();pe(e,i);s.tasks.push(function(){pe(e,a)})}}})}function Ee(e){return function(){n(e,Y.config.addedClass);Dt(e);Ct(e);Ce(e);fe(e,"htmx:load")}}function Ce(e){var t="[autofocus]";var r=h(e,t)?e:e.querySelector(t);if(r!=null){r.focus()}}function a(e,t,r,n){Se(e,r,n);while(r.childNodes.length>0){var i=r.firstChild;F(i,Y.config.addedClass);e.insertBefore(i,t);if(i.nodeType!==Node.TEXT_NODE&&i.nodeType!==Node.COMMENT_NODE){n.tasks.push(Ee(i))}}}function Te(e,t){var r=0;while(r-1){var t=e.replace(/]*>|>)([\s\S]*?)<\/svg>/gim,"");var r=t.match(/]*>|>)([\s\S]*?)<\/title>/im);if(r){return r[2]}}}function Ue(e,t,r,n,i,a){i.title=Xe(n);var o=l(n);if(o){be(r,o,i);o=Me(r,o,a);we(o);return De(e,r,t,o,i)}}function Be(e,t,r){var n=e.getResponseHeader(t);if(n.indexOf("{")===0){var i=S(n);for(var a in i){if(i.hasOwnProperty(a)){var o=i[a];if(!N(o)){o={value:o}}fe(r,a,o)}}}else{var s=n.split(",");for(var l=0;l0){var o=t[0];if(o==="]"){n--;if(n===0){if(a===null){i=i+"true"}t.shift();i+=")})";try{var s=xr(e,function(){return Function(i)()},function(){return true});s.source=i;return s}catch(e){ue(te().body,"htmx:syntax:error",{error:e,source:i});return null}}}else if(o==="["){n++}if($e(o,a,r)){i+="(("+r+"."+o+") ? ("+r+"."+o+") : (window."+o+"))"}else{i=i+o}a=t.shift()}}}function x(e,t){var r="";while(e.length>0&&!e[0].match(t)){r+=e.shift()}return r}var Je="input, textarea, select";function Ze(e){var t=ee(e,"hx-trigger");var r=[];if(t){var n=We(t);do{x(n,ze);var i=n.length;var a=x(n,/[,\[\s]/);if(a!==""){if(a==="every"){var o={trigger:"every"};x(n,ze);o.pollInterval=v(x(n,/[,\[\s]/));x(n,ze);var s=Ge(e,n,"event");if(s){o.eventFilter=s}r.push(o)}else if(a.indexOf("sse:")===0){r.push({trigger:"sse",sseEvent:a.substr(4)})}else{var l={trigger:a};var s=Ge(e,n,"event");if(s){l.eventFilter=s}while(n.length>0&&n[0]!==","){x(n,ze);var u=n.shift();if(u==="changed"){l.changed=true}else if(u==="once"){l.once=true}else if(u==="consume"){l.consume=true}else if(u==="delay"&&n[0]===":"){n.shift();l.delay=v(x(n,p))}else if(u==="from"&&n[0]===":"){n.shift();var f=x(n,p);if(f==="closest"||f==="find"||f==="next"||f==="previous"){n.shift();var c=x(n,p);if(c.length>0){f+=" "+c}}l.from=f}else if(u==="target"&&n[0]===":"){n.shift();l.target=x(n,p)}else if(u==="throttle"&&n[0]===":"){n.shift();l.throttle=v(x(n,p))}else if(u==="queue"&&n[0]===":"){n.shift();l.queue=x(n,p)}else if((u==="root"||u==="threshold")&&n[0]===":"){n.shift();l[u]=x(n,p)}else{ue(e,"htmx:syntax:error",{token:n.shift()})}}r.push(l)}}if(n.length===i){ue(e,"htmx:syntax:error",{token:n.shift()})}x(n,ze)}while(n[0]===","&&n.shift())}if(r.length>0){return r}else if(h(e,"form")){return[{trigger:"submit"}]}else if(h(e,'input[type="button"], input[type="submit"]')){return[{trigger:"click"}]}else if(h(e,Je)){return[{trigger:"change"}]}else{return[{trigger:"click"}]}}function Ke(e){ie(e).cancelled=true}function Ye(e,t,r){var n=ie(e);n.timeout=setTimeout(function(){if(oe(e)&&n.cancelled!==true){if(!nt(r,e,Ut("hx:poll:trigger",{triggerSpec:r,target:e}))){t(e)}Ye(e,t,r)}},r.pollInterval)}function Qe(e){return location.hostname===e.hostname&&Q(e,"href")&&Q(e,"href").indexOf("#")!==0}function et(t,r,e){if(t.tagName==="A"&&Qe(t)&&(t.target===""||t.target==="_self")||t.tagName==="FORM"){r.boosted=true;var n,i;if(t.tagName==="A"){n="get";i=Q(t,"href")}else{var a=Q(t,"method");n=a?a.toLowerCase():"get";if(n==="get"){}i=Q(t,"action")}e.forEach(function(e){it(t,function(e,t){if(d(e,Y.config.disableSelector)){m(e);return}ce(n,i,e,t)},r,e,true)})}}function tt(e,t){if(e.type==="submit"||e.type==="click"){if(t.tagName==="FORM"){return true}if(h(t,'input[type="submit"], button')&&d(t,"form")!==null){return true}if(t.tagName==="A"&&t.href&&(t.getAttribute("href")==="#"||t.getAttribute("href").indexOf("#")!==0)){return true}}return false}function rt(e,t){return ie(e).boosted&&e.tagName==="A"&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function nt(e,t,r){var n=e.eventFilter;if(n){try{return n.call(t,r)!==true}catch(e){ue(te().body,"htmx:eventFilter:error",{error:e,source:n.source});return true}}return false}function it(a,o,e,s,l){var u=ie(a);var t;if(s.from){t=W(a,s.from)}else{t=[a]}if(s.changed){t.forEach(function(e){var t=ie(e);t.lastValue=e.value})}ae(t,function(n){var i=function(e){if(!oe(a)){n.removeEventListener(s.trigger,i);return}if(rt(a,e)){return}if(l||tt(e,a)){e.preventDefault()}if(nt(s,a,e)){return}var t=ie(e);t.triggerSpec=s;if(t.handledFor==null){t.handledFor=[]}if(t.handledFor.indexOf(a)<0){t.handledFor.push(a);if(s.consume){e.stopPropagation()}if(s.target&&e.target){if(!h(e.target,s.target)){return}}if(s.once){if(u.triggeredOnce){return}else{u.triggeredOnce=true}}if(s.changed){var r=ie(n);if(r.lastValue===n.value){return}r.lastValue=n.value}if(u.delayed){clearTimeout(u.delayed)}if(u.throttle){return}if(s.throttle){if(!u.throttle){o(a,e);u.throttle=setTimeout(function(){u.throttle=null},s.throttle)}}else if(s.delay){u.delayed=setTimeout(function(){o(a,e)},s.delay)}else{fe(a,"htmx:trigger");o(a,e)}}};if(e.listenerInfos==null){e.listenerInfos=[]}e.listenerInfos.push({trigger:s.trigger,listener:i,on:n});n.addEventListener(s.trigger,i)})}var at=false;var ot=null;function st(){if(!ot){ot=function(){at=true};window.addEventListener("scroll",ot);setInterval(function(){if(at){at=false;ae(te().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(e){lt(e)})}},200)}}function lt(t){if(!o(t,"data-hx-revealed")&&k(t)){t.setAttribute("data-hx-revealed","true");var e=ie(t);if(e.initHash){fe(t,"revealed")}else{t.addEventListener("htmx:afterProcessNode",function(e){fe(t,"revealed")},{once:true})}}}function ut(e,t,r){var n=P(r);for(var i=0;i=0){var t=dt(n);setTimeout(function(){ft(s,r,n+1)},t)}};t.onopen=function(e){n=0};ie(s).webSocket=t;t.addEventListener("message",function(e){if(ct(s)){return}var t=e.data;C(s,function(e){t=e.transformResponse(t,null,s)});var r=T(s);var n=l(t);var i=I(n.children);for(var a=0;a0){fe(u,"htmx:validation:halted",i);return}t.send(JSON.stringify(l));if(tt(e,u)){e.preventDefault()}})}else{ue(u,"htmx:noWebSocketSourceError")}}function dt(e){var t=Y.config.wsReconnectDelay;if(typeof t==="function"){return t(e)}if(t==="full-jitter"){var r=Math.min(e,6);var n=1e3*Math.pow(2,r);return n*Math.random()}y('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"')}function vt(e,t,r){var n=P(r);for(var i=0;i0){var o=n.shift();var s=o.match(/^\s*([a-zA-Z:\-\.]+:)(.*)/);if(a===0&&s){o.split(":");i=s[1].slice(0,-1);r[i]=s[2]}else{r[i]+=o}a+=Nt(o)}for(var l in r){It(e,l,r[l])}}}function Pt(t){Re(t);for(var e=0;eY.config.historyCacheSize){i.shift()}while(i.length>0){try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(e){ue(te().body,"htmx:historyCacheError",{cause:e,cache:i});i.shift()}}}function _t(e){if(!M()){return null}e=D(e);var t=S(localStorage.getItem("htmx-history-cache"))||[];for(var r=0;r=200&&this.status<400){fe(te().body,"htmx:historyCacheMissLoad",o);var e=l(this.response);e=e.querySelector("[hx-history-elt],[data-hx-history-elt]")||e;var t=Vt();var r=T(t);var n=Xe(this.response);if(n){var i=E("title");if(i){i.innerHTML=n}else{window.document.title=n}}Pe(t,e,r);Jt(r.tasks);Ft=a;fe(te().body,"htmx:historyRestore",{path:a,cacheMiss:true,serverResponse:this.response})}else{ue(te().body,"htmx:historyCacheMissLoadError",o)}};e.send()}function Kt(e){Wt();e=e||location.pathname+location.search;var t=_t(e);if(t){var r=l(t.content);var n=Vt();var i=T(n);Pe(n,r,i);Jt(i.tasks);document.title=t.title;setTimeout(function(){window.scrollTo(0,t.scroll)},0);Ft=e;fe(te().body,"htmx:historyRestore",{path:e,item:t})}else{if(Y.config.refreshOnHistoryMiss){window.location.reload(true)}else{Zt(e)}}}function Yt(e){var t=de(e,"hx-indicator");if(t==null){t=[e]}ae(t,function(e){var t=ie(e);t.requestCount=(t.requestCount||0)+1;e.classList["add"].call(e.classList,Y.config.requestClass)});return t}function Qt(e){var t=de(e,"hx-disabled-elt");if(t==null){t=[]}ae(t,function(e){var t=ie(e);t.requestCount=(t.requestCount||0)+1;e.setAttribute("disabled","")});return t}function er(e,t){ae(e,function(e){var t=ie(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.classList["remove"].call(e.classList,Y.config.requestClass)}});ae(t,function(e){var t=ie(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.removeAttribute("disabled")}})}function tr(e,t){for(var r=0;r=0}function dr(e,t){var r=t?t:re(e,"hx-swap");var n={swapStyle:ie(e).boosted?"innerHTML":Y.config.defaultSwapStyle,swapDelay:Y.config.defaultSwapDelay,settleDelay:Y.config.defaultSettleDelay};if(Y.config.scrollIntoViewOnBoost&&ie(e).boosted&&!hr(e)){n["show"]="top"}if(r){var i=P(r);if(i.length>0){for(var a=0;a0?l.join(":"):null;n["scroll"]=u;n["scrollTarget"]=f}else if(o.indexOf("show:")===0){var c=o.substr(5);var l=c.split(":");var h=l.pop();var f=l.length>0?l.join(":"):null;n["show"]=h;n["showTarget"]=f}else if(o.indexOf("focus-scroll:")===0){var d=o.substr("focus-scroll:".length);n["focusScroll"]=d=="true"}else if(a==0){n["swapStyle"]=o}else{y("Unknown modifier in hx-swap: "+o)}}}}return n}function vr(e){return re(e,"hx-encoding")==="multipart/form-data"||h(e,"form")&&Q(e,"enctype")==="multipart/form-data"}function gr(t,r,n){var i=null;C(r,function(e){if(i==null){i=e.encodeParameters(t,n,r)}});if(i!=null){return i}else{if(vr(r)){return ur(n)}else{return lr(n)}}}function T(e){return{tasks:[],elts:[e]}}function mr(e,t){var r=e[0];var n=e[e.length-1];if(t.scroll){var i=null;if(t.scrollTarget){i=le(r,t.scrollTarget)}if(t.scroll==="top"&&(r||i)){i=i||r;i.scrollTop=0}if(t.scroll==="bottom"&&(n||i)){i=i||n;i.scrollTop=i.scrollHeight}}if(t.show){var i=null;if(t.showTarget){var a=t.showTarget;if(t.showTarget==="window"){a="body"}i=le(r,a)}if(t.show==="top"&&(r||i)){i=i||r;i.scrollIntoView({block:"start",behavior:Y.config.scrollBehavior})}if(t.show==="bottom"&&(n||i)){i=i||n;i.scrollIntoView({block:"end",behavior:Y.config.scrollBehavior})}}}function pr(e,t,r,n){if(n==null){n={}}if(e==null){return n}var i=ee(e,t);if(i){var a=i.trim();var o=r;if(a==="unset"){return null}if(a.indexOf("javascript:")===0){a=a.substr(11);o=true}else if(a.indexOf("js:")===0){a=a.substr(3);o=true}if(a.indexOf("{")!==0){a="{"+a+"}"}var s;if(o){s=xr(e,function(){return Function("return ("+a+")")()},{})}else{s=S(a)}for(var l in s){if(s.hasOwnProperty(l)){if(n[l]==null){n[l]=s[l]}}}}return pr(u(e),t,r,n)}function xr(e,t,r){if(Y.config.allowEval){return t()}else{ue(e,"htmx:evalDisallowedError");return r}}function yr(e,t){return pr(e,"hx-vars",true,t)}function br(e,t){return pr(e,"hx-vals",false,t)}function wr(e){return se(yr(e),br(e))}function Sr(t,r,n){if(n!==null){try{t.setRequestHeader(r,n)}catch(e){t.setRequestHeader(r,encodeURIComponent(n));t.setRequestHeader(r+"-URI-AutoEncoded","true")}}}function Er(t){if(t.responseURL&&typeof URL!=="undefined"){try{var e=new URL(t.responseURL);return e.pathname+e.search}catch(e){ue(te().body,"htmx:badResponseUrl",{url:t.responseURL})}}}function O(e,t){return e.getAllResponseHeaders().match(t)}function Cr(e,t,r){e=e.toLowerCase();if(r){if(r instanceof Element||L(r,"String")){return ce(e,t,null,null,{targetOverride:s(r),returnPromise:true})}else{return ce(e,t,s(r.source),r.event,{handler:r.handler,headers:r.headers,values:r.values,targetOverride:s(r.target),swapOverride:r.swap,returnPromise:true})}}else{return ce(e,t,null,null,{returnPromise:true})}}function Tr(e){var t=[];while(e){t.push(e);e=e.parentElement}return t}function Or(e,t,r){var n;var i;if(typeof URL==="function"){i=new URL(t,document.location.href);var a=document.location.origin;n=a===i.origin}else{i=t;n=g(t,document.location.origin)}if(Y.config.selfRequestsOnly){if(!n){return false}}return fe(e,"htmx:validateUrl",se({url:i,sameHost:n},r))}function ce(t,r,n,i,a,e){var o=null;var s=null;a=a!=null?a:{};if(a.returnPromise&&typeof Promise!=="undefined"){var l=new Promise(function(e,t){o=e;s=t})}if(n==null){n=te().body}var M=a.handler||qr;if(!oe(n)){ne(o);return l}var u=a.targetOverride||ge(n);if(u==null||u==he){ue(n,"htmx:targetError",{target:ee(n,"hx-target")});ne(s);return l}var f=ie(n);var c=f.lastButtonClicked;if(c){var h=Q(c,"formaction");if(h!=null){r=h}var d=Q(c,"formmethod");if(d!=null){if(d.toLowerCase()!=="dialog"){t=d}}}var v=re(n,"hx-confirm");if(e===undefined){var D=function(e){return ce(t,r,n,i,a,!!e)};var X={target:u,elt:n,path:r,verb:t,triggeringEvent:i,etc:a,issueRequest:D,question:v};if(fe(n,"htmx:confirm",X)===false){ne(o);return l}}var g=n;var m=re(n,"hx-sync");var p=null;var x=false;if(m){var U=m.split(":");var B=U[0].trim();if(B==="this"){g=ve(n,"hx-sync")}else{g=le(n,B)}m=(U[1]||"drop").trim();f=ie(g);if(m==="drop"&&f.xhr&&f.abortable!==true){ne(o);return l}else if(m==="abort"){if(f.xhr){ne(o);return l}else{x=true}}else if(m==="replace"){fe(g,"htmx:abort")}else if(m.indexOf("queue")===0){var F=m.split(" ");p=(F[1]||"last").trim()}}if(f.xhr){if(f.abortable){fe(g,"htmx:abort")}else{if(p==null){if(i){var y=ie(i);if(y&&y.triggerSpec&&y.triggerSpec.queue){p=y.triggerSpec.queue}}if(p==null){p="last"}}if(f.queuedRequests==null){f.queuedRequests=[]}if(p==="first"&&f.queuedRequests.length===0){f.queuedRequests.push(function(){ce(t,r,n,i,a)})}else if(p==="all"){f.queuedRequests.push(function(){ce(t,r,n,i,a)})}else if(p==="last"){f.queuedRequests=[];f.queuedRequests.push(function(){ce(t,r,n,i,a)})}ne(o);return l}}var b=new XMLHttpRequest;f.xhr=b;f.abortable=x;var w=function(){f.xhr=null;f.abortable=false;if(f.queuedRequests!=null&&f.queuedRequests.length>0){var e=f.queuedRequests.shift();e()}};var V=re(n,"hx-prompt");if(V){var S=prompt(V);if(S===null||!fe(n,"htmx:prompt",{prompt:S,target:u})){ne(o);w();return l}}if(v&&!e){if(!confirm(v)){ne(o);w();return l}}var E=fr(n,u,S);if(a.headers){E=se(E,a.headers)}var j=or(n,t);var C=j.errors;var T=j.values;if(a.values){T=se(T,a.values)}var _=wr(n);var z=se(T,_);var O=cr(z,n);if(t!=="get"&&!vr(n)){E["Content-Type"]="application/x-www-form-urlencoded"}if(Y.config.getCacheBusterParam&&t==="get"){O["org.htmx.cache-buster"]=Q(u,"id")||"true"}if(r==null||r===""){r=te().location.href}var R=pr(n,"hx-request");var W=ie(n).boosted;var q=Y.config.methodsThatUseUrlParams.indexOf(t)>=0;var H={boosted:W,useUrlParams:q,parameters:O,unfilteredParameters:z,headers:E,target:u,verb:t,errors:C,withCredentials:a.credentials||R.credentials||Y.config.withCredentials,timeout:a.timeout||R.timeout||Y.config.timeout,path:r,triggeringEvent:i};if(!fe(n,"htmx:configRequest",H)){ne(o);w();return l}r=H.path;t=H.verb;E=H.headers;O=H.parameters;C=H.errors;q=H.useUrlParams;if(C&&C.length>0){fe(n,"htmx:validation:halted",H);ne(o);w();return l}var $=r.split("#");var G=$[0];var L=$[1];var A=r;if(q){A=G;var J=Object.keys(O).length!==0;if(J){if(A.indexOf("?")<0){A+="?"}else{A+="&"}A+=lr(O);if(L){A+="#"+L}}}if(!Or(n,A,H)){ue(n,"htmx:invalidPath",H);ne(s);return l}b.open(t.toUpperCase(),A,true);b.overrideMimeType("text/html");b.withCredentials=H.withCredentials;b.timeout=H.timeout;if(R.noHeaders){}else{for(var N in E){if(E.hasOwnProperty(N)){var Z=E[N];Sr(b,N,Z)}}}var I={xhr:b,target:u,requestConfig:H,etc:a,boosted:W,pathInfo:{requestPath:r,finalRequestPath:A,anchor:L}};b.onload=function(){try{var e=Tr(n);I.pathInfo.responsePath=Er(b);M(n,I);er(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:afterOnLoad",I);if(!oe(n)){var t=null;while(e.length>0&&t==null){var r=e.shift();if(oe(r)){t=r}}if(t){fe(t,"htmx:afterRequest",I);fe(t,"htmx:afterOnLoad",I)}}ne(o);w()}catch(e){ue(n,"htmx:onLoadError",se({error:e},I));throw e}};b.onerror=function(){er(k,P);ue(n,"htmx:afterRequest",I);ue(n,"htmx:sendError",I);ne(s);w()};b.onabort=function(){er(k,P);ue(n,"htmx:afterRequest",I);ue(n,"htmx:sendAbort",I);ne(s);w()};b.ontimeout=function(){er(k,P);ue(n,"htmx:afterRequest",I);ue(n,"htmx:timeout",I);ne(s);w()};if(!fe(n,"htmx:beforeRequest",I)){ne(o);w();return l}var k=Yt(n);var P=Qt(n);ae(["loadstart","loadend","progress","abort"],function(t){ae([b,b.upload],function(e){e.addEventListener(t,function(e){fe(n,"htmx:xhr:"+t,{lengthComputable:e.lengthComputable,loaded:e.loaded,total:e.total})})})});fe(n,"htmx:beforeSend",I);var K=q?null:gr(b,n,O);b.send(K);return l}function Rr(e,t){var r=t.xhr;var n=null;var i=null;if(O(r,/HX-Push:/i)){n=r.getResponseHeader("HX-Push");i="push"}else if(O(r,/HX-Push-Url:/i)){n=r.getResponseHeader("HX-Push-Url");i="push"}else if(O(r,/HX-Replace-Url:/i)){n=r.getResponseHeader("HX-Replace-Url");i="replace"}if(n){if(n==="false"){return{}}else{return{type:i,path:n}}}var a=t.pathInfo.finalRequestPath;var o=t.pathInfo.responsePath;var s=re(e,"hx-push-url");var l=re(e,"hx-replace-url");var u=ie(e).boosted;var f=null;var c=null;if(s){f="push";c=s}else if(l){f="replace";c=l}else if(u){f="push";c=o||a}if(c){if(c==="false"){return{}}if(c==="true"){c=o||a}if(t.pathInfo.anchor&&c.indexOf("#")===-1){c=c+"#"+t.pathInfo.anchor}return{type:f,path:c}}else{return{}}}function qr(l,u){var f=u.xhr;var c=u.target;var e=u.etc;var t=u.requestConfig;if(!fe(l,"htmx:beforeOnLoad",u))return;if(O(f,/HX-Trigger:/i)){Be(f,"HX-Trigger",l)}if(O(f,/HX-Location:/i)){Wt();var r=f.getResponseHeader("HX-Location");var h;if(r.indexOf("{")===0){h=S(r);r=h["path"];delete h["path"]}Cr("GET",r,h).then(function(){$t(r)});return}var n=O(f,/HX-Refresh:/i)&&"true"===f.getResponseHeader("HX-Refresh");if(O(f,/HX-Redirect:/i)){location.href=f.getResponseHeader("HX-Redirect");n&&location.reload();return}if(n){location.reload();return}if(O(f,/HX-Retarget:/i)){u.target=te().querySelector(f.getResponseHeader("HX-Retarget"))}var d=Rr(l,u);var i=f.status>=200&&f.status<400&&f.status!==204;var v=f.response;var a=f.status>=400;var g=Y.config.ignoreTitle;var o=se({shouldSwap:i,serverResponse:v,isError:a,ignoreTitle:g},u);if(!fe(c,"htmx:beforeSwap",o))return;c=o.target;v=o.serverResponse;a=o.isError;g=o.ignoreTitle;u.target=c;u.failed=a;u.successful=!a;if(o.shouldSwap){if(f.status===286){Ke(l)}C(l,function(e){v=e.transformResponse(v,f,l)});if(d.type){Wt()}var s=e.swapOverride;if(O(f,/HX-Reswap:/i)){s=f.getResponseHeader("HX-Reswap")}var h=dr(l,s);if(h.hasOwnProperty("ignoreTitle")){g=h.ignoreTitle}c.classList.add(Y.config.swappingClass);var m=null;var p=null;var x=function(){try{var e=document.activeElement;var t={};try{t={elt:e,start:e?e.selectionStart:null,end:e?e.selectionEnd:null}}catch(e){}var r;if(O(f,/HX-Reselect:/i)){r=f.getResponseHeader("HX-Reselect")}var n=T(c);Ue(h.swapStyle,c,l,v,n,r);if(t.elt&&!oe(t.elt)&&Q(t.elt,"id")){var i=document.getElementById(Q(t.elt,"id"));var a={preventScroll:h.focusScroll!==undefined?!h.focusScroll:!Y.config.defaultFocusScroll};if(i){if(t.start&&i.setSelectionRange){try{i.setSelectionRange(t.start,t.end)}catch(e){}}i.focus(a)}}c.classList.remove(Y.config.swappingClass);ae(n.elts,function(e){if(e.classList){e.classList.add(Y.config.settlingClass)}fe(e,"htmx:afterSwap",u)});if(O(f,/HX-Trigger-After-Swap:/i)){var o=l;if(!oe(l)){o=te().body}Be(f,"HX-Trigger-After-Swap",o)}var s=function(){ae(n.tasks,function(e){e.call()});ae(n.elts,function(e){if(e.classList){e.classList.remove(Y.config.settlingClass)}fe(e,"htmx:afterSettle",u)});if(d.type){fe(te().body,"htmx:beforeHistoryUpdate",se({history:d},u));if(d.type==="push"){$t(d.path);fe(te().body,"htmx:pushedIntoHistory",{path:d.path})}else{Gt(d.path);fe(te().body,"htmx:replacedInHistory",{path:d.path})}}if(u.pathInfo.anchor){var e=te().getElementById(u.pathInfo.anchor);if(e){e.scrollIntoView({block:"start",behavior:"auto"})}}if(n.title&&!g){var t=E("title");if(t){t.innerHTML=n.title}else{window.document.title=n.title}}mr(n.elts,h);if(O(f,/HX-Trigger-After-Settle:/i)){var r=l;if(!oe(l)){r=te().body}Be(f,"HX-Trigger-After-Settle",r)}ne(m)};if(h.settleDelay>0){setTimeout(s,h.settleDelay)}else{s()}}catch(e){ue(l,"htmx:swapError",u);ne(p);throw e}};var y=Y.config.globalViewTransitions;if(h.hasOwnProperty("transition")){y=h.transition}if(y&&fe(l,"htmx:beforeTransition",u)&&typeof Promise!=="undefined"&&document.startViewTransition){var b=new Promise(function(e,t){m=e;p=t});var w=x;x=function(){document.startViewTransition(function(){w();return b})}}if(h.swapDelay>0){setTimeout(x,h.swapDelay)}else{x()}}if(a){ue(l,"htmx:responseError",se({error:"Response Status Error Code "+f.status+" from "+u.pathInfo.requestPath},u))}}var Hr={};function Lr(){return{init:function(e){return null},onEvent:function(e,t){return true},transformResponse:function(e,t,r){return e},isInlineSwap:function(e){return false},handleSwap:function(e,t,r,n){return false},encodeParameters:function(e,t,r){return null}}}function Ar(e,t){if(t.init){t.init(r)}Hr[e]=se(Lr(),t)}function Nr(e){delete Hr[e]}function Ir(e,r,n){if(e==undefined){return r}if(r==undefined){r=[]}if(n==undefined){n=[]}var t=ee(e,"hx-ext");if(t){ae(t.split(","),function(e){e=e.replace(/ /g,"");if(e.slice(0,7)=="ignore:"){n.push(e.slice(7));return}if(n.indexOf(e)<0){var t=Hr[e];if(t&&r.indexOf(t)<0){r.push(t)}}})}return Ir(u(e),r,n)}var kr=false;te().addEventListener("DOMContentLoaded",function(){kr=true});function Pr(e){if(kr||te().readyState==="complete"){e()}else{te().addEventListener("DOMContentLoaded",e)}}function Mr(){if(Y.config.includeIndicatorStyles!==false){te().head.insertAdjacentHTML("beforeend","")}}function Dr(){var e=te().querySelector('meta[name="htmx-config"]');if(e){return S(e.content)}else{return null}}function Xr(){var e=Dr();if(e){Y.config=se(Y.config,e)}}Pr(function(){Xr();Mr();var e=te().body;Dt(e);var t=te().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(e){var t=e.target;var r=ie(t);if(r&&r.xhr){r.xhr.abort()}});var r=window.onpopstate;window.onpopstate=function(e){if(e.state&&e.state.htmx){Kt();ae(t,function(e){fe(e,"htmx:restored",{document:te(),triggerEvent:fe})})}else{if(r){r(e)}}};setTimeout(function(){fe(e,"htmx:load",{});e=null},0)});return Y}()}); \ No newline at end of file diff --git a/assets/static/js/htmx/htmx.min.js.gz b/assets/static/js/htmx/htmx.min.js.gz new file mode 100644 index 0000000..7f7945c Binary files /dev/null and b/assets/static/js/htmx/htmx.min.js.gz differ diff --git a/assets/static/js/htmx/htmx.test.ts b/assets/static/js/htmx/htmx.test.ts new file mode 100644 index 0000000..71ed2d2 --- /dev/null +++ b/assets/static/js/htmx/htmx.test.ts @@ -0,0 +1,96 @@ +import htmx from "./htmx"; + +// add the class 'myClass' to the element with the id 'demo' +htmx.addClass(htmx.find("#demo"), "myClass"); + +// issue a GET to /example and put the response HTML into #myDiv +htmx.ajax("GET", "/example", "#myDiv"); + +// find the closest enclosing div of the element with the id 'demo' +htmx.closest(htmx.find("#demo"), "div"); + +// update the history cache size to 30 +htmx.config.historyCacheSize = 30; + +// override SSE event sources to not use credentials +htmx.createEventSource = function (url) { + return new EventSource(url, { withCredentials: false }); +}; + +// override WebSocket to use a specific protocol +htmx.createWebSocket = function (url) { + return new WebSocket(url, ["wss"]); +}; + +// defines a silly extension that just logs the name of all events triggered +htmx.defineExtension("silly", { + onEvent: function (name, evt) { + console.log("Event " + name + " was triggered!"); + } +}); + +// find div with id my-div +var div = htmx.find("#my-div"); + +// find div with id another-div within that div +var anotherDiv = htmx.find(div, "#another-div"); + +// find all divs +var allDivs = htmx.findAll("div"); + +// find all paragraphs within a given div +var allParagraphsInMyDiv = htmx.findAll(htmx.find("#my-div"), "p"); + +htmx.logAll(); + +// remove this click listener from the body +htmx.off("click", myEventListener); + +// remove this click listener from the given div +htmx.off("#my-div", "click", myEventListener); + +// add a click listener to the body +var myEventListener = htmx.on("click", function (evt) { + console.log(evt); +}); + +// add a click listener to the given div +var myEventListener = htmx.on("#my-div", "click", function (evt) { + console.log(evt); +}); + +const MyLibrary: any = null; + +htmx.onLoad(function (elt) { + MyLibrary.init(elt); +}); + +// returns 3000 +var milliseconds = htmx.parseInterval("3s"); + +// returns 3 - Caution +var milliseconds = htmx.parseInterval("3m"); + +document.body.innerHTML = "
    Get it!
    "; +// process the newly added content +htmx.process(document.body); + +// removes my-div from the DOM +htmx.remove(htmx.find("#my-div")); + +// removes .myClass from my-div +htmx.removeClass(htmx.find("#my-div"), "myClass"); + +htmx.removeExtension("my-extension"); + +// takes the selected class from tab2"s siblings +htmx.takeClass(htmx.find("#tab2"), "selected"); + +// toggles the selected class on tab2 +htmx.toggleClass(htmx.find("#tab2"), "selected"); + +// triggers the myEvent event on #tab2 with the answer 42 +htmx.trigger(htmx.find("#tab2"), "myEvent", { answer: 42 }); + +// gets the values associated with this form +var values = htmx.values(htmx.find("#myForm")); diff --git a/assets/static/js/hyperscript.min.js b/assets/static/js/hyperscript.min.js new file mode 100644 index 0000000..355c78a --- /dev/null +++ b/assets/static/js/hyperscript.min.js @@ -0,0 +1 @@ +(function(e,t){const r=t(e);if(typeof exports==="object"&&typeof exports["nodeName"]!=="string"){module.exports=r}else{e["_hyperscript"]=r;if("document"in e)e["_hyperscript"].browserInit()}})(typeof self!=="undefined"?self:this,(e=>{"use strict";const t={dynamicResolvers:[function(e,t){if(e==="Fixed"){return Number(t).toFixed()}else if(e.indexOf("Fixed:")===0){let r=e.split(":")[1];return Number(t).toFixed(parseInt(r))}}],String:function(e){if(e.toString){return e.toString()}else{return""+e}},Int:function(e){return parseInt(e)},Float:function(e){return parseFloat(e)},Number:function(e){return Number(e)},Date:function(e){return new Date(e)},Array:function(e){return Array.from(e)},JSON:function(e){return JSON.stringify(e)},Object:function(e){if(e instanceof String){e=e.toString()}if(typeof e==="string"){return JSON.parse(e)}else{return Object.assign({},e)}}};const r={attributes:"_, script, data-script",defaultTransition:"all 500ms ease-in",disableSelector:"[disable-scripting], [data-disable-scripting]",hideShowStrategies:{},conversions:t};class n{static OP_TABLE={"+":"PLUS","-":"MINUS","*":"MULTIPLY","/":"DIVIDE",".":"PERIOD","..":"ELLIPSIS","\\":"BACKSLASH",":":"COLON","%":"PERCENT","|":"PIPE","!":"EXCLAMATION","?":"QUESTION","#":"POUND","&":"AMPERSAND",$:"DOLLAR",";":"SEMI",",":"COMMA","(":"L_PAREN",")":"R_PAREN","<":"L_ANG",">":"R_ANG","<=":"LTE_ANG",">=":"GTE_ANG","==":"EQ","===":"EQQ","!=":"NEQ","!==":"NEQQ","{":"L_BRACE","}":"R_BRACE","[":"L_BRACKET","]":"R_BRACKET","=":"EQUALS"};static isValidCSSClassChar(e){return n.isAlpha(e)||n.isNumeric(e)||e==="-"||e==="_"||e===":"}static isValidCSSIDChar(e){return n.isAlpha(e)||n.isNumeric(e)||e==="-"||e==="_"||e===":"}static isWhitespace(e){return e===" "||e==="\t"||n.isNewline(e)}static positionString(e){return"[Line: "+e.line+", Column: "+e.column+"]"}static isNewline(e){return e==="\r"||e==="\n"}static isNumeric(e){return e>="0"&&e<="9"}static isAlpha(e){return e>="a"&&e<="z"||e>="A"&&e<="Z"}static isIdentifierChar(e,t){return e==="_"||e==="$"}static isReservedChar(e){return e==="`"||e==="^"}static isValidSingleQuoteStringStart(e){if(e.length>0){var t=e[e.length-1];if(t.type==="IDENTIFIER"||t.type==="CLASS_REF"||t.type==="ID_REF"){return false}if(t.op&&(t.value===">"||t.value===")")){return false}}return true}static tokenize(e,t){var r=[];var a=e;var o=0;var s=0;var u=1;var l="";var c=0;function f(){return t&&c===0}while(o=0){return this.consumeToken()}}requireToken(e,t){var r=this.matchToken(e,t);if(r){return r}else{this.raiseError(this,"Expected '"+e+"' but found '"+this.currentToken().value+"'")}}peekToken(e,t,r){t=t||0;r=r||"IDENTIFIER";if(this.tokens[t]&&this.tokens[t].value===e&&this.tokens[t].type===r){return this.tokens[t]}}matchToken(e,t){if(this.follows.indexOf(e)!==-1){return}t=t||"IDENTIFIER";if(this.currentToken()&&this.currentToken().value===e&&this.currentToken().type===t){return this.consumeToken()}}consumeToken(){var e=this.tokens.shift();this.consumed.push(e);this._lastConsumed=e;this.consumeWhitespace();return e}consumeUntil(e,t){var r=[];var n=this.token(0,true);while((t==null||n.type!==t)&&(e==null||n.value!==e)&&n.type!=="EOF"){var i=this.tokens.shift();this.consumed.push(i);r.push(n);n=this.token(0,true)}this.consumeWhitespace();return r}lastWhitespace(){if(this.consumed[this.consumed.length-1]&&this.consumed[this.consumed.length-1].type==="WHITESPACE"){return this.consumed[this.consumed.length-1].value}else{return""}}consumeUntilWhitespace(){return this.consumeUntil(null,"WHITESPACE")}hasMore(){return this.tokens.length>0}token(e,t){var r;var n=0;do{if(!t){while(this.tokens[n]&&this.tokens[n].type==="WHITESPACE"){n++}}r=this.tokens[n];e--;n++}while(e>-1);if(r){return r}else{return{type:"EOF",value:"<<>>"}}}currentToken(){return this.token(0)}lastMatch(){return this._lastConsumed}static sourceFor=function(){return this.programSource.substring(this.startToken.start,this.endToken.end)};static lineFor=function(){return this.programSource.split("\n")[this.startToken.line-1]};follows=[];pushFollow(e){this.follows.push(e)}popFollow(){this.follows.pop()}clearFollows(){var e=this.follows;this.follows=[];return e}restoreFollows(e){this.follows=e}}class a{constructor(e){this.runtime=e;this.possessivesDisabled=false;this.addGrammarElement("feature",(function(e,t,r){if(r.matchOpToken("(")){var n=e.requireElement("feature",r);r.requireOpToken(")");return n}var i=e.FEATURES[r.currentToken().value||""];if(i){return i(e,t,r)}}));this.addGrammarElement("command",(function(e,t,r){if(r.matchOpToken("(")){const t=e.requireElement("command",r);r.requireOpToken(")");return t}var n=e.COMMANDS[r.currentToken().value||""];let i;if(n){i=n(e,t,r)}else if(r.currentToken().type==="IDENTIFIER"){i=e.parseElement("pseudoCommand",r)}if(i){return e.parseElement("indirectStatement",r,i)}return i}));this.addGrammarElement("commandList",(function(e,t,r){if(r.hasMore()){var n=e.parseElement("command",r);if(n){r.matchToken("then");const t=e.parseElement("commandList",r);if(t)n.next=t;return n}}return{type:"emptyCommandListCommand",op:function(e){return t.findNext(this,e)},execute:function(e){return t.unifiedExec(this,e)}}}));this.addGrammarElement("leaf",(function(e,t,r){var n=e.parseAnyOf(e.LEAF_EXPRESSIONS,r);if(n==null){return e.parseElement("symbol",r)}return n}));this.addGrammarElement("indirectExpression",(function(e,t,r,n){for(var i=0;i{this.unifiedExec(e,t)})).catch((e=>{this.unifiedExec({op:function(){throw e}},t)}));return}else if(r===o.HALT){if(t.meta.finallyHandler&&!t.meta.handlingFinally){t.meta.handlingFinally=true;e=t.meta.finallyHandler}else{if(t.meta.onHalt){t.meta.onHalt()}if(t.meta.currentException){if(t.meta.reject){t.meta.reject(t.meta.currentException);return}else{throw t.meta.currentException}}else{return}}}else{e=r}}}unifiedEval(e,t){var r=[t];var n=false;var i=false;if(e.args){for(var a=0;a{r=this.wrapArrays(r);Promise.all(r).then((function(r){if(i){this.unwrapAsyncs(r)}try{var a=e.op.apply(e,r);t(a)}catch(e){n(e)}})).catch((function(e){n(e)}))}))}else{if(i){this.unwrapAsyncs(r)}return e.op.apply(e,r)}}_scriptAttrs=null;getScriptAttributes(){if(this._scriptAttrs==null){this._scriptAttrs=r.attributes.replace(/ /g,"").split(",")}return this._scriptAttrs}getScript(e){for(var t=0;t{this.initElement(e,e instanceof HTMLScriptElement&&e.type==="text/hyperscript"?document.body:e)}))}}initElement(e,t){if(e.closest&&e.closest(r.disableSelector)){return}var n=this.getInternalData(e);if(!n.initialized){var i=this.getScript(e);if(i){try{n.initialized=true;n.script=i;const r=this.lexer,s=this.parser;var a=r.tokenize(i);var o=s.parseHyperScript(a);if(!o)return;o.apply(t||e,e);setTimeout((()=>{this.triggerEvent(t||e,"load",{hyperscript:true})}),1)}catch(t){this.triggerEvent(e,"exception",{error:t});console.error("hyperscript errors were found on the following element:",e,"\n\n",t.message,t.stack)}}}}internalDataMap=new WeakMap;getInternalData(e){var t=this.internalDataMap.get(e);if(typeof t==="undefined"){this.internalDataMap.set(e,t={})}return t}typeCheck(e,t,r){if(e==null&&r){return true}var n=Object.prototype.toString.call(e).slice(8,-1);return n===t}getElementScope(e){var t=e.meta&&e.meta.owner;if(t){var r=this.getInternalData(t);var n="elementScope";if(e.meta.feature&&e.meta.feature.behavior){n=e.meta.feature.behavior+"Scope"}var i=h(r,n);return i}else{return{}}}isReservedWord(e){return["meta","it","result","locals","event","target","detail","sender","body"].includes(e)}isHyperscriptContext(e){return e instanceof f}resolveSymbol(t,r,n){if(t==="me"||t==="my"||t==="I"){return r.me}if(t==="it"||t==="its"||t==="result"){return r.result}if(t==="you"||t==="your"||t==="yourself"){return r.you}else{if(n==="global"){return e[t]}else if(n==="element"){var i=this.getElementScope(r);return i[t]}else if(n==="local"){return r.locals[t]}else{if(r.meta&&r.meta.context){var a=r.meta.context[t];if(typeof a!=="undefined"){return a}if(r.meta.context.detail){a=r.meta.context.detail[t];if(typeof a!=="undefined"){return a}}}if(this.isHyperscriptContext(r)&&!this.isReservedWord(t)){var o=r.locals[t]}else{var o=r[t]}if(typeof o!=="undefined"){return o}else{var i=this.getElementScope(r);o=i[t];if(typeof o!=="undefined"){return o}else{return e[t]}}}}}setSymbol(t,r,n,i){if(n==="global"){e[t]=i}else if(n==="element"){var a=this.getElementScope(r);a[t]=i}else if(n==="local"){r.locals[t]=i}else{if(this.isHyperscriptContext(r)&&!this.isReservedWord(t)&&typeof r.locals[t]!=="undefined"){r.locals[t]=i}else{var a=this.getElementScope(r);var o=a[t];if(typeof o!=="undefined"){a[t]=i}else{if(this.isHyperscriptContext(r)&&!this.isReservedWord(t)){r.locals[t]=i}else{r[t]=i}}}}}findNext(e,t){if(e){if(e.resolveNext){return e.resolveNext(t)}else if(e.next){return e.next}else{return this.findNext(e.parent,t)}}}flatGet(e,t,r){if(e!=null){var n=r(e,t);if(typeof n!=="undefined"){return n}if(this.shouldAutoIterate(e)){var i=[];for(var a of e){var o=r(a,t);i.push(o)}return i}}}resolveProperty(e,t){return this.flatGet(e,t,((e,t)=>e[t]))}resolveAttribute(e,t){return this.flatGet(e,t,((e,t)=>e.getAttribute&&e.getAttribute(t)))}resolveStyle(e,t){return this.flatGet(e,t,((e,t)=>e.style&&e.style[t]))}resolveComputedStyle(e,t){return this.flatGet(e,t,((e,t)=>getComputedStyle(e).getPropertyValue(t)))}assignToNamespace(t,r,n,i){let a;if(typeof document!=="undefined"&&t===document.body){a=e}else{a=this.getHyperscriptFeatures(t)}var o;while((o=r.shift())!==undefined){var s=a[o];if(s==null){s={};a[o]=s}a=s}a[n]=i}getHyperTrace(e,t){var r=[];var n=e;while(n.meta.caller){n=n.meta.caller}if(n.meta.traceMap){return n.meta.traceMap.get(t,r)}}registerHyperTrace(e,t){var r=[];var n=null;while(e!=null){r.push(e);n=e;e=e.meta.caller}if(n.meta.traceMap==null){n.meta.traceMap=new Map}if(!n.meta.traceMap.get(t)){var i={trace:r,print:function(e){e=e||console.error;e("hypertrace /// ");var t=0;for(var n=0;n",i.meta.feature.displayName.padEnd(t+2),"-",i.meta.owner)}}};n.meta.traceMap.set(t,i)}}escapeSelector(e){return e.replace(/:/g,(function(e){return"\\"+e}))}nullCheck(e,t){if(e==null){throw new Error("'"+t.sourceFor()+"' is null")}}isEmpty(e){return e==undefined||e.length===0}doesExist(e){if(e==null){return false}if(this.shouldAutoIterate(e)){for(const t of e){return true}return false}return true}getRootNode(e){if(e&&e instanceof Node){var t=e.getRootNode();if(t instanceof Document||t instanceof ShadowRoot)return t}return document}getEventQueueFor(e,t){let r=this.getInternalData(e);var n=r.eventQueues;if(n==null){n=new Map;r.eventQueues=n}var i=n.get(t);if(i==null){i={queue:[],executing:false};n.set(t,i)}return i}beepValueToConsole(e,t,r){if(this.triggerEvent(e,"hyperscript:beep",{element:e,expression:t,value:r})){var n;if(r){if(r instanceof m){n="ElementCollection"}else if(r.constructor){n=r.constructor.name}else{n="unknown"}}else{n="object (null)"}var a=r;if(n==="String"){a='"'+a+'"'}else if(r instanceof m){a=Array.from(r)}console.log("///_ BEEP! The expression ("+i.sourceFor.call(t).replace("beep! ","")+") evaluates to:",a,"of type "+n)}}hyperscriptUrl="document"in e&&document.currentScript?document.currentScript.src:null}function s(){let e=document.cookie.split("; ").map((e=>{let t=e.split("=");return{name:t[0],value:decodeURIComponent(t[1])}}));return e}function u(e){document.cookie=e+"=;expires=Thu, 01 Jan 1970 00:00:00 GMT"}function l(){for(const e of s()){u(e.name)}}const c=new Proxy({},{get(e,t){if(t==="then"||t==="asyncWrapper"){return null}else if(t==="length"){return s().length}else if(t==="clear"){return u}else if(t==="clearAll"){return l}else if(typeof t==="string"){if(!isNaN(t)){return s()[parseInt(t)]}else{let e=document.cookie.split("; ").find((e=>e.startsWith(t+"=")))?.split("=")[1];if(e){return decodeURIComponent(e)}}}else if(t===Symbol.iterator){return s()[t]}},set(e,t,r){var n=null;if("string"===typeof r){n=encodeURIComponent(r);n+=";samesite=lax"}else{n=encodeURIComponent(r.value);if(r.expires){n+=";expires="+r.maxAge}if(r.maxAge){n+=";max-age="+r.maxAge}if(r.partitioned){n+=";partitioned="+r.partitioned}if(r.path){n+=";path="+r.path}if(r.samesite){n+=";samesite="+r.path}if(r.secure){n+=";secure="+r.path}}document.cookie=t+"="+n;return true}});class f{constructor(t,r,n,i,a){this.meta={parser:a.parser,lexer:a.lexer,runtime:a,owner:t,feature:r,iterators:{},ctx:this};this.locals={cookies:c};this.me=n,this.you=undefined;this.result=undefined;this.event=i;this.target=i?i.target:null;this.detail=i?i.detail:null;this.sender=i?i.detail?i.detail.sender:null:null;this.body="document"in e?document.body:null;a.addFeatures(t,this)}}class m{constructor(e,t,r){this._css=e;this.relativeToElement=t;this.escape=r;this[p]=true}get css(){if(this.escape){return o.prototype.escapeSelector(this._css)}else{return this._css}}get className(){return this._css.substr(1)}get id(){return this.className()}contains(e){for(let t of this){if(t.contains(e)){return true}}return false}get length(){return this.selectMatches().length}[Symbol.iterator](){let e=this.selectMatches();return e[Symbol.iterator]()}selectMatches(){let e=o.prototype.getRootNode(this.relativeToElement).querySelectorAll(this.css);return e}}const p=Symbol();function h(e,t){var r=e[t];if(r){return r}else{var n={};e[t]=n;return n}}function v(e){try{return JSON.parse(e)}catch(e){d(e);return null}}function d(e){if(console.error){console.error(e)}else if(console.log){console.log("ERROR: ",e)}}function E(e,t){return new(e.bind.apply(e,[e].concat(t)))}function T(t){t.addLeafExpression("parenthesized",(function(e,t,r){if(r.matchOpToken("(")){var n=r.clearFollows();try{var i=e.requireElement("expression",r)}finally{r.restoreFollows(n)}r.requireOpToken(")");return i}}));t.addLeafExpression("string",(function(e,t,r){var i=r.matchTokenType("STRING");if(!i)return;var a=i.value;var o;if(i.template){var s=n.tokenize(a,true);o=e.parseStringTemplate(s)}else{o=[]}return{type:"string",token:i,args:o,op:function(e){var t="";for(var r=1;re instanceof Element))}get css(){let e="",t=0;for(const r of this.templateParts){if(r instanceof Element){e+="[data-hs-query-id='"+t+++"']"}else e+=r}return e}[Symbol.iterator](){this.elements.forEach(((e,t)=>e.dataset.hsQueryId=t));const e=super[Symbol.iterator]();this.elements.forEach((e=>e.removeAttribute("data-hs-query-id")));return e}}t.addLeafExpression("queryRef",(function(e,t,i){var a=i.matchOpToken("<");if(!a)return;var o=i.consumeUntil("/");i.requireOpToken("/");i.requireOpToken(">");var s=o.map((function(e){if(e.type==="STRING"){return'"'+e.value+'"'}else{return e.value}})).join("");var u,l,c;if(s.indexOf("$")>=0){u=true;l=n.tokenize(s,true);c=e.parseStringTemplate(l)}return{type:"queryRef",css:s,args:c,op:function(e,...t){if(u){return new r(s,e.me,t)}else{return new m(s,e.me)}},evaluate:function(e){return t.unifiedEval(this,e)}}}));t.addLeafExpression("attributeRef",(function(e,t,r){var n=r.matchTokenType("ATTRIBUTE_REF");if(!n)return;if(!n.value)return;var i=n.value;if(i.indexOf("[")===0){var a=i.substring(2,i.length-1)}else{var a=i.substring(1)}var o="["+a+"]";var s=a.split("=");var u=s[0];var l=s[1];if(l){if(l.indexOf('"')===0){l=l.substring(1,l.length-1)}}return{type:"attributeRef",name:u,css:o,value:l,op:function(e){var t=e.you||e.me;if(t){return t.getAttribute(u)}},evaluate:function(e){return t.unifiedEval(this,e)}}}));t.addLeafExpression("styleRef",(function(e,t,r){var n=r.matchTokenType("STYLE_REF");if(!n)return;if(!n.value)return;var i=n.value.substr(1);if(i.startsWith("computed-")){i=i.substr("computed-".length);return{type:"computedStyleRef",name:i,op:function(e){var r=e.you||e.me;if(r){return t.resolveComputedStyle(r,i)}},evaluate:function(e){return t.unifiedEval(this,e)}}}else{return{type:"styleRef",name:i,op:function(e){var r=e.you||e.me;if(r){return t.resolveStyle(r,i)}},evaluate:function(e){return t.unifiedEval(this,e)}}}}));t.addGrammarElement("objectKey",(function(e,t,r){var n;if(n=r.matchTokenType("STRING")){return{type:"objectKey",key:n.value,evaluate:function(){return n.value}}}else if(r.matchOpToken("[")){var i=e.parseElement("expression",r);r.requireOpToken("]");return{type:"objectKey",expr:i,args:[i],op:function(e,t){return t},evaluate:function(e){return t.unifiedEval(this,e)}}}else{var a="";do{n=r.matchTokenType("IDENTIFIER")||r.matchOpToken("-");if(n)a+=n.value}while(n);return{type:"objectKey",key:a,evaluate:function(){return a}}}}));t.addLeafExpression("objectLiteral",(function(e,t,r){if(!r.matchOpToken("{"))return;var n=[];var i=[];if(!r.matchOpToken("}")){do{var a=e.requireElement("objectKey",r);r.requireOpToken(":");var o=e.requireElement("expression",r);i.push(o);n.push(a)}while(r.matchOpToken(","));r.requireOpToken("}")}return{type:"objectLiteral",args:[n,i],op:function(e,t,r){var n={};for(var i=0;i");var a=e.requireElement("expression",r);return{type:"blockLiteral",args:n,expr:a,evaluate:function(e){var t=function(){for(var t=0;t=0;a--){var o=i[a];if(o.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING){return o}}if(n){return i[i.length-1]}};var l=function(e,t,r,n){var i=[];o.prototype.forEach(t,(function(t){if(t.matches(r)||t===e){i.push(t)}}));for(var a=0;a","<=",">=","==","===","!=","!==");var a=i?i.value:null;var o=true;var s=false;if(a==null){if(r.matchToken("is")||r.matchToken("am")){if(r.matchToken("not")){if(r.matchToken("in")){a="not in"}else if(r.matchToken("a")){a="not a";s=true}else if(r.matchToken("empty")){a="not empty";o=false}else{if(r.matchToken("really")){a="!=="}else{a="!="}if(r.matchToken("equal")){r.matchToken("to")}}}else if(r.matchToken("in")){a="in"}else if(r.matchToken("a")){a="a";s=true}else if(r.matchToken("empty")){a="empty";o=false}else if(r.matchToken("less")){r.requireToken("than");if(r.matchToken("or")){r.requireToken("equal");r.requireToken("to");a="<="}else{a="<"}}else if(r.matchToken("greater")){r.requireToken("than");if(r.matchToken("or")){r.requireToken("equal");r.requireToken("to");a=">="}else{a=">"}}else{if(r.matchToken("really")){a="==="}else{a="=="}if(r.matchToken("equal")){r.matchToken("to")}}}else if(r.matchToken("equals")){a="=="}else if(r.matchToken("really")){r.requireToken("equals");a="==="}else if(r.matchToken("exist")||r.matchToken("exists")){a="exist";o=false}else if(r.matchToken("matches")||r.matchToken("match")){a="match"}else if(r.matchToken("contains")||r.matchToken("contain")){a="contain"}else if(r.matchToken("includes")||r.matchToken("include")){a="include"}else if(r.matchToken("do")||r.matchToken("does")){r.requireToken("not");if(r.matchToken("matches")||r.matchToken("match")){a="not match"}else if(r.matchToken("contains")||r.matchToken("contain")){a="not contain"}else if(r.matchToken("exist")||r.matchToken("exist")){a="not exist";o=false}else if(r.matchToken("include")){a="not include"}else{e.raiseParseError(r,"Expected matches or contains")}}}if(a){var u,l,c;if(s){u=r.requireTokenType("IDENTIFIER");l=!r.matchOpToken("!")}else if(o){c=e.requireElement("mathExpression",r);if(a==="match"||a==="not match"){c=c.css?c.css:c}}var m=n;n={type:"comparisonOperator",operator:a,typeName:u,nullOk:l,lhs:n,rhs:c,args:[n,c],op:function(e,r,n){if(a==="=="){return r==n}else if(a==="!="){return r!=n}if(a==="==="){return r===n}else if(a==="!=="){return r!==n}if(a==="match"){return r!=null&&p(m,r,n)}if(a==="not match"){return r==null||!p(m,r,n)}if(a==="in"){return n!=null&&f(c,n,r)}if(a==="not in"){return n==null||!f(c,n,r)}if(a==="contain"){return r!=null&&f(m,r,n)}if(a==="not contain"){return r==null||!f(m,r,n)}if(a==="include"){return r!=null&&f(m,r,n)}if(a==="not include"){return r==null||!f(m,r,n)}if(a==="==="){return r===n}else if(a==="!=="){return r!==n}else if(a==="<"){return r"){return r>n}else if(a==="<="){return r<=n}else if(a===">="){return r>=n}else if(a==="empty"){return t.isEmpty(r)}else if(a==="not empty"){return!t.isEmpty(r)}else if(a==="exist"){return t.doesExist(r)}else if(a==="not exist"){return!t.doesExist(r)}else if(a==="a"){return t.typeCheck(r,u.value,l)}else if(a==="not a"){return!t.typeCheck(r,u.value,l)}else{throw"Unknown comparison : "+a}},evaluate:function(e){return t.unifiedEval(this,e)}}}return n}));t.addGrammarElement("comparisonExpression",(function(e,t,r){return e.parseAnyOf(["comparisonOperator","mathExpression"],r)}));t.addGrammarElement("logicalOperator",(function(e,t,r){var n=e.parseElement("comparisonExpression",r);var i,a=null;i=r.matchToken("and")||r.matchToken("or");while(i){a=a||i;if(a.value!==i.value){e.raiseParseError(r,"You must parenthesize logical operations with different operators")}var o=e.requireElement("comparisonExpression",r);const s=i.value;n={type:"logicalOperator",operator:s,lhs:n,rhs:o,args:[n,o],op:function(e,t,r){if(s==="and"){return t&&r}else{return t||r}},evaluate:function(e){return t.unifiedEval(this,e)}};i=r.matchToken("and")||r.matchToken("or")}return n}));t.addGrammarElement("logicalExpression",(function(e,t,r){return e.parseAnyOf(["logicalOperator","mathExpression"],r)}));t.addGrammarElement("asyncExpression",(function(e,t,r){if(r.matchToken("async")){var n=e.requireElement("logicalExpression",r);var i={type:"asyncExpression",value:n,evaluate:function(e){return{asyncWrapper:true,value:this.value.evaluate(e)}}};return i}else{return e.parseElement("logicalExpression",r)}}));t.addGrammarElement("expression",(function(e,t,r){r.matchToken("the");return e.parseElement("asyncExpression",r)}));t.addGrammarElement("assignableExpression",(function(e,t,r){r.matchToken("the");var n=e.parseElement("primaryExpression",r);if(n&&(n.type==="symbol"||n.type==="ofExpression"||n.type==="propertyAccess"||n.type==="attributeRefAccess"||n.type==="attributeRef"||n.type==="styleRef"||n.type==="arrayIndex"||n.type==="possessive")){return n}else{e.raiseParseError(r,"A target expression must be writable. The expression type '"+(n&&n.type)+"' is not.")}return n}));t.addGrammarElement("hyperscript",(function(e,t,r){var n=[];if(r.hasMore()){while(e.featureStart(r.currentToken())||r.currentToken().value==="("){var i=e.requireElement("feature",r);n.push(i);r.matchToken("end")}}return{type:"hyperscript",features:n,apply:function(e,t,r){for(const i of n){i.install(e,t,r)}}}}));var v=function(e){var t=[];if(e.token(0).value==="("&&(e.token(1).value===")"||e.token(2).value===","||e.token(2).value===")")){e.matchOpToken("(");do{t.push(e.requireTokenType("IDENTIFIER"))}while(e.matchOpToken(","));e.requireOpToken(")")}return t};t.addFeature("on",(function(e,t,r){if(!r.matchToken("on"))return;var n=false;if(r.matchToken("every")){n=true}var i=[];var a=null;do{var o=e.requireElement("eventName",r,"Expected event name");var s=o.evaluate();if(a){a=a+" or "+s}else{a="on "+s}var u=v(r);var l=null;if(r.matchOpToken("[")){l=e.requireElement("expression",r);r.requireOpToken("]")}var c,f,m;if(r.currentToken().type==="NUMBER"){var p=r.consumeToken();if(!p.value)return;c=parseInt(p.value);if(r.matchToken("to")){var h=r.consumeToken();if(!h.value)return;f=parseInt(h.value)}else if(r.matchToken("and")){m=true;r.requireToken("on")}}var d,E;if(s==="intersection"){d={};if(r.matchToken("with")){d["with"]=e.requireElement("expression",r).evaluate()}if(r.matchToken("having")){do{if(r.matchToken("margin")){d["rootMargin"]=e.requireElement("stringLike",r).evaluate()}else if(r.matchToken("threshold")){d["threshold"]=e.requireElement("expression",r).evaluate()}else{e.raiseParseError(r,"Unknown intersection config specification")}}while(r.matchToken("and"))}}else if(s==="mutation"){E={};if(r.matchToken("of")){do{if(r.matchToken("anything")){E["attributes"]=true;E["subtree"]=true;E["characterData"]=true;E["childList"]=true}else if(r.matchToken("childList")){E["childList"]=true}else if(r.matchToken("attributes")){E["attributes"]=true;E["attributeOldValue"]=true}else if(r.matchToken("subtree")){E["subtree"]=true}else if(r.matchToken("characterData")){E["characterData"]=true;E["characterDataOldValue"]=true}else if(r.currentToken().type==="ATTRIBUTE_REF"){var T=r.consumeToken();if(E["attributeFilter"]==null){E["attributeFilter"]=[]}if(T.value.indexOf("@")==0){E["attributeFilter"].push(T.value.substring(1))}else{e.raiseParseError(r,"Only shorthand attribute references are allowed here")}}else{e.raiseParseError(r,"Unknown mutation config specification")}}while(r.matchToken("or"))}else{E["attributes"]=true;E["characterData"]=true;E["childList"]=true}}var y=null;var k=false;if(r.matchToken("from")){if(r.matchToken("elsewhere")){k=true}else{r.pushFollow("or");try{y=e.requireElement("expression",r)}finally{r.popFollow()}if(!y){e.raiseParseError(r,'Expected either target value or "elsewhere".')}}}if(y===null&&k===false&&r.matchToken("elsewhere")){k=true}if(r.matchToken("in")){var x=e.parseElement("unaryExpression",r)}if(r.matchToken("debounced")){r.requireToken("at");var g=e.requireElement("unaryExpression",r);var b=g.evaluate({})}else if(r.matchToken("throttled")){r.requireToken("at");var g=e.requireElement("unaryExpression",r);var w=g.evaluate({})}i.push({execCount:0,every:n,on:s,args:u,filter:l,from:y,inExpr:x,elsewhere:k,startCount:c,endCount:f,unbounded:m,debounceTime:b,throttleTime:w,mutationSpec:E,intersectionSpec:d,debounced:undefined,lastExec:undefined})}while(r.matchToken("or"));var S=true;if(!n){if(r.matchToken("queue")){if(r.matchToken("all")){var q=true;var S=false}else if(r.matchToken("first")){var N=true}else if(r.matchToken("none")){var I=true}else{r.requireToken("last")}}}var C=e.requireElement("commandList",r);e.ensureTerminated(C);var R,A;if(r.matchToken("catch")){R=r.requireTokenType("IDENTIFIER").value;A=e.requireElement("commandList",r);e.ensureTerminated(A)}if(r.matchToken("finally")){var L=e.requireElement("commandList",r);e.ensureTerminated(L)}var O={displayName:a,events:i,start:C,every:n,execCount:0,errorHandler:A,errorSymbol:R,execute:function(e){let r=t.getEventQueueFor(e.me,O);if(r.executing&&n===false){if(I||N&&r.queue.length>0){return}if(S){r.queue.length=0}r.queue.push(e);return}O.execCount++;r.executing=true;e.meta.onHalt=function(){r.executing=false;var e=r.queue.shift();if(e){setTimeout((function(){O.execute(e)}),1)}};e.meta.reject=function(r){console.error(r.message?r.message:r);var n=t.getHyperTrace(e,r);if(n){n.print()}t.triggerEvent(e.me,"exception",{error:r})};C.execute(e)},install:function(e,r){for(const r of O.events){var n;if(r.elsewhere){n=[document]}else if(r.from){n=r.from.evaluate(t.makeContext(e,O,e,null))}else{n=[e]}t.implicitLoop(n,(function(n){var i=r.on;if(n==null){console.warn("'%s' feature ignored because target does not exists:",a,e);return}if(r.mutationSpec){i="hyperscript:mutation";const e=new MutationObserver((function(e,r){if(!O.executing){t.triggerEvent(n,i,{mutationList:e,observer:r})}}));e.observe(n,r.mutationSpec)}if(r.intersectionSpec){i="hyperscript:intersection";const e=new IntersectionObserver((function(r){for(const o of r){var a={observer:e};a=Object.assign(a,o);a["intersecting"]=o.isIntersecting;t.triggerEvent(n,i,a)}}),r.intersectionSpec);e.observe(n)}var o=n.addEventListener||n.on;o.call(n,i,(function a(o){if(typeof Node!=="undefined"&&e instanceof Node&&n!==e&&!e.isConnected){n.removeEventListener(i,a);return}var s=t.makeContext(e,O,e,o);if(r.elsewhere&&e.contains(o.target)){return}if(r.from){s.result=n}for(const e of r.args){let t=s.event[e.value];if(t!==undefined){s.locals[e.value]=t}else if("detail"in s.event){s.locals[e.value]=s.event["detail"][e.value]}}s.meta.errorHandler=A;s.meta.errorSymbol=R;s.meta.finallyHandler=L;if(r.filter){var u=s.meta.context;s.meta.context=s.event;try{var l=r.filter.evaluate(s);if(l){}else{return}}finally{s.meta.context=u}}if(r.inExpr){var c=o.target;while(true){if(c.matches&&c.matches(r.inExpr.css)){s.result=c;break}else{c=c.parentElement;if(c==null){return}}}}r.execCount++;if(r.startCount){if(r.endCount){if(r.execCountr.endCount){return}}else if(r.unbounded){if(r.execCount{var a=false;for(const s of i){var o=n=>{e.result=n;if(s.args){for(const t of s.args){e.locals[t.value]=n[t.value]||(n.detail?n.detail[t.value]:null)}}if(!a){a=true;r(t.findNext(this,e))}};if(s.name){n.addEventListener(s.name,o,{once:true})}else if(s.time!=null){setTimeout(o,s.time,s.time)}}}))}};return n}else{var s;if(r.matchToken("a")){r.requireToken("tick");s=0}else{s=e.requireElement("expression",r)}n={type:"waitCmd",time:s,args:[s],op:function(e,r){return new Promise((n=>{setTimeout((()=>{n(t.findNext(this,e))}),r)}))},execute:function(e){return t.unifiedExec(this,e)}};return n}}));t.addGrammarElement("dotOrColonPath",(function(e,t,r){var n=r.matchTokenType("IDENTIFIER");if(n){var i=[n.value];var a=r.matchOpToken(".")||r.matchOpToken(":");if(a){do{i.push(r.requireTokenType("IDENTIFIER","NUMBER").value)}while(r.matchOpToken(a.value))}return{type:"dotOrColonPath",path:i,evaluate:function(){return i.join(a?a.value:"")}}}}));t.addGrammarElement("eventName",(function(e,t,r){var n;if(n=r.matchTokenType("STRING")){return{evaluate:function(){return n.value}}}return e.parseElement("dotOrColonPath",r)}));function d(e,t,r,n){var i=t.requireElement("eventName",n);var a=t.parseElement("namedArgumentList",n);if(e==="send"&&n.matchToken("to")||e==="trigger"&&n.matchToken("on")){var o=t.requireElement("expression",n)}else{var o=t.requireElement("implicitMeTarget",n)}var s={eventName:i,details:a,to:o,args:[o,i,a],op:function(e,t,n,i){r.nullCheck(t,o);r.implicitLoop(t,(function(t){r.triggerEvent(t,n,i,e.me)}));return r.findNext(s,e)}};return s}t.addCommand("trigger",(function(e,t,r){if(r.matchToken("trigger")){return d("trigger",e,t,r)}}));t.addCommand("send",(function(e,t,r){if(r.matchToken("send")){return d("send",e,t,r)}}));var T=function(e,t,r,n){if(n){if(e.commandBoundary(r.currentToken())){e.raiseParseError(r,"'return' commands must return a value. If you do not wish to return a value, use 'exit' instead.")}else{var i=e.requireElement("expression",r)}}var a={value:i,args:[i],op:function(e,r){var n=e.meta.resolve;e.meta.returned=true;e.meta.returnValue=r;if(n){if(r){n(r)}else{n()}}return t.HALT}};return a};t.addCommand("return",(function(e,t,r){if(r.matchToken("return")){return T(e,t,r,true)}}));t.addCommand("exit",(function(e,t,r){if(r.matchToken("exit")){return T(e,t,r,false)}}));t.addCommand("halt",(function(e,t,r){if(r.matchToken("halt")){if(r.matchToken("the")){r.requireToken("event");if(r.matchOpToken("'")){r.requireToken("s")}var n=true}if(r.matchToken("bubbling")){var i=true}else if(r.matchToken("default")){var a=true}var o=T(e,t,r,false);var s={keepExecuting:true,bubbling:i,haltDefault:a,exit:o,op:function(e){if(e.event){if(i){e.event.stopPropagation()}else if(a){e.event.preventDefault()}else{e.event.stopPropagation();e.event.preventDefault()}if(n){return t.findNext(this,e)}else{return o}}}};return s}}));t.addCommand("log",(function(e,t,r){if(!r.matchToken("log"))return;var n=[e.parseElement("expression",r)];while(r.matchOpToken(",")){n.push(e.requireElement("expression",r))}if(r.matchToken("with")){var i=e.requireElement("expression",r)}var a={exprs:n,withExpr:i,args:[i,n],op:function(e,r,n){if(r){r.apply(null,n)}else{console.log.apply(null,n)}return t.findNext(this,e)}};return a}));t.addCommand("beep!",(function(e,t,r){if(!r.matchToken("beep!"))return;var n=[e.parseElement("expression",r)];while(r.matchOpToken(",")){n.push(e.requireElement("expression",r))}var i={exprs:n,args:[n],op:function(e,r){for(let i=0;i{if(!r.matchToken("pick"))return;r.matchToken("the");if(r.matchToken("item")||r.matchToken("items")||r.matchToken("character")||r.matchToken("characters")){const n=g(e,t,r);r.requireToken("from");const i=e.requireElement("expression",r);return{args:[i,n.from,n.to],op(e,r,i,a){if(n.toEnd)a=r.length;if(!n.includeStart)i++;if(n.includeEnd)a++;if(a==null||a==undefined)a=i+1;e.result=r.slice(i,a);return t.findNext(this,e)}}}if(r.matchToken("match")){r.matchToken("of");const n=e.parseElement("expression",r);let i="";if(r.matchOpToken("|")){i=r.requireToken("identifier").value}r.requireToken("from");const a=e.parseElement("expression",r);return{args:[a,n],op(e,r,n){e.result=new RegExp(n,i).exec(r);return t.findNext(this,e)}}}if(r.matchToken("matches")){r.matchToken("of");const n=e.parseElement("expression",r);let i="gu";if(r.matchOpToken("|")){i="g"+r.requireToken("identifier").value.replace("g","")}console.log("flags",i);r.requireToken("from");const a=e.parseElement("expression",r);return{args:[a,n],op(e,r,n){e.result=new w(n,i,r);return t.findNext(this,e)}}}}));t.addCommand("increment",(function(e,t,r){if(!r.matchToken("increment"))return;var n;var i=e.parseElement("assignableExpression",r);if(r.matchToken("by")){n=e.requireElement("expression",r)}var a={type:"implicitIncrementOp",target:i,args:[i,n],op:function(e,t,r){t=t?parseFloat(t):0;r=n?parseFloat(r):1;var i=t+r;e.result=i;return i},evaluate:function(e){return t.unifiedEval(this,e)}};return k(e,t,r,i,a)}));t.addCommand("decrement",(function(e,t,r){if(!r.matchToken("decrement"))return;var n;var i=e.parseElement("assignableExpression",r);if(r.matchToken("by")){n=e.requireElement("expression",r)}var a={type:"implicitDecrementOp",target:i,args:[i,n],op:function(e,t,r){t=t?parseFloat(t):0;r=n?parseFloat(r):1;var i=t-r;e.result=i;return i},evaluate:function(e){return t.unifiedEval(this,e)}};return k(e,t,r,i,a)}));function S(e,t){var r="text";var n;e.matchToken("a")||e.matchToken("an");if(e.matchToken("json")||e.matchToken("Object")){r="json"}else if(e.matchToken("response")){r="response"}else if(e.matchToken("html")){r="html"}else if(e.matchToken("text")){}else{n=t.requireElement("dotOrColonPath",e).evaluate()}return{type:r,conversion:n}}t.addCommand("fetch",(function(e,t,r){if(!r.matchToken("fetch"))return;var n=e.requireElement("stringLike",r);if(r.matchToken("as")){var i=S(r,e)}if(r.matchToken("with")&&r.currentToken().value!=="{"){var a=e.parseElement("nakedNamedArgumentList",r)}else{var a=e.parseElement("objectLiteral",r)}if(i==null&&r.matchToken("as")){i=S(r,e)}var o=i?i.type:"text";var s=i?i.conversion:null;var u={url:n,argExpressions:a,args:[n,a],op:function(e,r,n){var i=n||{};i["sender"]=e.me;i["headers"]=i["headers"]||{};var a=new AbortController;let l=e.me.addEventListener("fetch:abort",(function(){a.abort()}),{once:true});i["signal"]=a.signal;t.triggerEvent(e.me,"hyperscript:beforeFetch",i);t.triggerEvent(e.me,"fetch:beforeRequest",i);n=i;var c=false;if(n.timeout){setTimeout((function(){if(!c){a.abort()}}),n.timeout)}return fetch(r,n).then((function(r){let n={response:r};t.triggerEvent(e.me,"fetch:afterResponse",n);r=n.response;if(o==="response"){e.result=r;t.triggerEvent(e.me,"fetch:afterRequest",{result:r});c=true;return t.findNext(u,e)}if(o==="json"){return r.json().then((function(r){e.result=r;t.triggerEvent(e.me,"fetch:afterRequest",{result:r});c=true;return t.findNext(u,e)}))}return r.text().then((function(r){if(s)r=t.convertValue(r,s);if(o==="html")r=t.convertValue(r,"Fragment");e.result=r;t.triggerEvent(e.me,"fetch:afterRequest",{result:r});c=true;return t.findNext(u,e)}))})).catch((function(r){t.triggerEvent(e.me,"fetch:error",{reason:r});throw r})).finally((function(){e.me.removeEventListener("fetch:abort",l)}))}};return u}))}function y(e){e.addCommand("settle",(function(e,t,r){if(r.matchToken("settle")){if(!e.commandBoundary(r.currentToken())){var n=e.requireElement("expression",r)}else{var n=e.requireElement("implicitMeTarget",r)}var i={type:"settleCmd",args:[n],op:function(e,r){t.nullCheck(r,n);var a=null;var o=false;var s=false;var u=new Promise((function(e){a=e}));r.addEventListener("transitionstart",(function(){s=true}),{once:true});setTimeout((function(){if(!s&&!o){a(t.findNext(i,e))}}),500);r.addEventListener("transitionend",(function(){if(!o){a(t.findNext(i,e))}}),{once:true});return u},execute:function(e){return t.unifiedExec(this,e)}};return i}}));e.addCommand("add",(function(e,t,r){if(r.matchToken("add")){var n=e.parseElement("classRef",r);var i=null;var a=null;if(n==null){i=e.parseElement("attributeRef",r);if(i==null){a=e.parseElement("styleLiteral",r);if(a==null){e.raiseParseError(r,"Expected either a class reference or attribute expression")}}}else{var o=[n];while(n=e.parseElement("classRef",r)){o.push(n)}}if(r.matchToken("to")){var s=e.requireElement("expression",r)}else{var s=e.requireElement("implicitMeTarget",r)}if(r.matchToken("when")){if(a){e.raiseParseError(r,"Only class and properties are supported with a when clause")}var u=e.requireElement("expression",r)}if(o){return{classRefs:o,to:s,args:[s,o],op:function(e,r,n){t.nullCheck(r,s);t.forEach(n,(function(n){t.implicitLoop(r,(function(r){if(u){e.result=r;let i=t.evaluateNoPromise(u,e);if(i){if(r instanceof Element)r.classList.add(n.className)}else{if(r instanceof Element)r.classList.remove(n.className)}e.result=null}else{if(r instanceof Element)r.classList.add(n.className)}}))}));return t.findNext(this,e)}}}else if(i){return{type:"addCmd",attributeRef:i,to:s,args:[s],op:function(e,r,n){t.nullCheck(r,s);t.implicitLoop(r,(function(r){if(u){e.result=r;let n=t.evaluateNoPromise(u,e);if(n){r.setAttribute(i.name,i.value)}else{r.removeAttribute(i.name)}e.result=null}else{r.setAttribute(i.name,i.value)}}));return t.findNext(this,e)},execute:function(e){return t.unifiedExec(this,e)}}}else{return{type:"addCmd",cssDeclaration:a,to:s,args:[s,a],op:function(e,r,n){t.nullCheck(r,s);t.implicitLoop(r,(function(e){e.style.cssText+=n}));return t.findNext(this,e)},execute:function(e){return t.unifiedExec(this,e)}}}}}));e.addGrammarElement("styleLiteral",(function(e,t,r){if(!r.matchOpToken("{"))return;var n=[""];var i=[];while(r.hasMore()){if(r.matchOpToken("\\")){r.consumeToken()}else if(r.matchOpToken("}")){break}else if(r.matchToken("$")){var a=r.matchOpToken("{");var o=e.parseElement("expression",r);if(a)r.requireOpToken("}");i.push(o);n.push("")}else{var s=r.consumeToken();n[n.length-1]+=r.source.substring(s.start,s.end)}n[n.length-1]+=r.lastWhitespace()}return{type:"styleLiteral",args:[i],op:function(e,t){var r="";n.forEach((function(e,n){r+=e;if(n in t)r+=t[n]}));return r},evaluate:function(e){return t.unifiedEval(this,e)}}}));e.addCommand("remove",(function(e,t,r){if(r.matchToken("remove")){var n=e.parseElement("classRef",r);var i=null;var a=null;if(n==null){i=e.parseElement("attributeRef",r);if(i==null){a=e.parseElement("expression",r);if(a==null){e.raiseParseError(r,"Expected either a class reference, attribute expression or value expression")}}}else{var o=[n];while(n=e.parseElement("classRef",r)){o.push(n)}}if(r.matchToken("from")){var s=e.requireElement("expression",r)}else{if(a==null){var s=e.requireElement("implicitMeTarget",r)}}if(a){return{elementExpr:a,from:s,args:[a,s],op:function(e,r,n){t.nullCheck(r,a);t.implicitLoop(r,(function(e){if(e.parentElement&&(n==null||n.contains(e))){e.parentElement.removeChild(e)}}));return t.findNext(this,e)}}}else{return{classRefs:o,attributeRef:i,elementExpr:a,from:s,args:[o,s],op:function(e,r,n){t.nullCheck(n,s);if(r){t.forEach(r,(function(e){t.implicitLoop(n,(function(t){t.classList.remove(e.className)}))}))}else{t.implicitLoop(n,(function(e){e.removeAttribute(i.name)}))}return t.findNext(this,e)}}}}}));e.addCommand("toggle",(function(e,t,r){if(r.matchToken("toggle")){r.matchAnyToken("the","my");if(r.currentToken().type==="STYLE_REF"){let t=r.consumeToken();var n=t.value.substr(1);var a=true;var o=i(e,r,n);if(r.matchToken("of")){r.pushFollow("with");try{var s=e.requireElement("expression",r)}finally{r.popFollow()}}else{var s=e.requireElement("implicitMeTarget",r)}}else if(r.matchToken("between")){var u=true;var l=e.parseElement("classRef",r);r.requireToken("and");var c=e.requireElement("classRef",r)}else{var l=e.parseElement("classRef",r);var f=null;if(l==null){f=e.parseElement("attributeRef",r);if(f==null){e.raiseParseError(r,"Expected either a class reference or attribute expression")}}else{var m=[l];while(l=e.parseElement("classRef",r)){m.push(l)}}}if(a!==true){if(r.matchToken("on")){var s=e.requireElement("expression",r)}else{var s=e.requireElement("implicitMeTarget",r)}}if(r.matchToken("for")){var p=e.requireElement("expression",r)}else if(r.matchToken("until")){var h=e.requireElement("dotOrColonPath",r,"Expected event name");if(r.matchToken("from")){var v=e.requireElement("expression",r)}}var d={classRef:l,classRef2:c,classRefs:m,attributeRef:f,on:s,time:p,evt:h,from:v,toggle:function(e,r,n,i){t.nullCheck(e,s);if(a){t.implicitLoop(e,(function(e){o("toggle",e)}))}else if(u){t.implicitLoop(e,(function(e){if(e.classList.contains(r.className)){e.classList.remove(r.className);e.classList.add(n.className)}else{e.classList.add(r.className);e.classList.remove(n.className)}}))}else if(i){t.forEach(i,(function(r){t.implicitLoop(e,(function(e){e.classList.toggle(r.className)}))}))}else{t.forEach(e,(function(e){if(e.hasAttribute(f.name)){e.removeAttribute(f.name)}else{e.setAttribute(f.name,f.value)}}))}},args:[s,p,h,v,l,c,m],op:function(e,r,n,i,a,o,s,u){if(n){return new Promise((function(i){d.toggle(r,o,s,u);setTimeout((function(){d.toggle(r,o,s,u);i(t.findNext(d,e))}),n)}))}else if(i){return new Promise((function(n){var l=a||e.me;l.addEventListener(i,(function(){d.toggle(r,o,s,u);n(t.findNext(d,e))}),{once:true});d.toggle(r,o,s,u)}))}else{this.toggle(r,o,s,u);return t.findNext(d,e)}}};return d}}));var t={display:function(r,n,i){if(i){n.style.display=i}else if(r==="toggle"){if(getComputedStyle(n).display==="none"){t.display("show",n,i)}else{t.display("hide",n,i)}}else if(r==="hide"){const t=e.runtime.getInternalData(n);if(t.originalDisplay==null){t.originalDisplay=n.style.display}n.style.display="none"}else{const t=e.runtime.getInternalData(n);if(t.originalDisplay&&t.originalDisplay!=="none"){n.style.display=t.originalDisplay}else{n.style.removeProperty("display")}}},visibility:function(e,r,n){if(n){r.style.visibility=n}else if(e==="toggle"){if(getComputedStyle(r).visibility==="hidden"){t.visibility("show",r,n)}else{t.visibility("hide",r,n)}}else if(e==="hide"){r.style.visibility="hidden"}else{r.style.visibility="visible"}},opacity:function(e,r,n){if(n){r.style.opacity=n}else if(e==="toggle"){if(getComputedStyle(r).opacity==="0"){t.opacity("show",r,n)}else{t.opacity("hide",r,n)}}else if(e==="hide"){r.style.opacity="0"}else{r.style.opacity="1"}}};var n=function(e,t,r){var n;var i=r.currentToken();if(i.value==="when"||i.value==="with"||e.commandBoundary(i)){n=e.parseElement("implicitMeTarget",r)}else{n=e.parseElement("expression",r)}return n};var i=function(e,n,i){var a=r.defaultHideShowStrategy;var o=t;if(r.hideShowStrategies){o=Object.assign(o,r.hideShowStrategies)}i=i||a||"display";var s=o[i];if(s==null){e.raiseParseError(n,"Unknown show/hide strategy : "+i)}return s};e.addCommand("hide",(function(e,t,r){if(r.matchToken("hide")){var a=n(e,t,r);var o=null;if(r.matchToken("with")){o=r.requireTokenType("IDENTIFIER","STYLE_REF").value;if(o.indexOf("*")===0){o=o.substr(1)}}var s=i(e,r,o);return{target:a,args:[a],op:function(e,r){t.nullCheck(r,a);t.implicitLoop(r,(function(e){s("hide",e)}));return t.findNext(this,e)}}}}));e.addCommand("show",(function(e,t,r){if(r.matchToken("show")){var a=n(e,t,r);var o=null;if(r.matchToken("with")){o=r.requireTokenType("IDENTIFIER","STYLE_REF").value;if(o.indexOf("*")===0){o=o.substr(1)}}var s=null;if(r.matchOpToken(":")){var u=r.consumeUntilWhitespace();r.matchTokenType("WHITESPACE");s=u.map((function(e){return e.value})).join("")}if(r.matchToken("when")){var l=e.requireElement("expression",r)}var c=i(e,r,o);return{target:a,when:l,args:[a],op:function(e,r){t.nullCheck(r,a);t.implicitLoop(r,(function(r){if(l){e.result=r;let n=t.evaluateNoPromise(l,e);if(n){c("show",r,s)}else{c("hide",r)}e.result=null}else{c("show",r,s)}}));return t.findNext(this,e)}}}}));e.addCommand("take",(function(e,t,r){if(r.matchToken("take")){let u=null;let l=[];while(u=e.parseElement("classRef",r)){l.push(u)}var n=null;var i=null;let c=l.length>0;if(!c){n=e.parseElement("attributeRef",r);if(n==null){e.raiseParseError(r,"Expected either a class reference or attribute expression")}if(r.matchToken("with")){i=e.requireElement("expression",r)}}if(r.matchToken("from")){var a=e.requireElement("expression",r)}if(r.matchToken("for")){var o=e.requireElement("expression",r)}else{var o=e.requireElement("implicitMeTarget",r)}if(c){var s={classRefs:l,from:a,forElt:o,args:[l,a,o],op:function(e,r,n,i){t.nullCheck(i,o);t.implicitLoop(r,(function(e){var r=e.className;if(n){t.implicitLoop(n,(function(e){e.classList.remove(r)}))}else{t.implicitLoop(e,(function(e){e.classList.remove(r)}))}t.implicitLoop(i,(function(e){e.classList.add(r)}))}));return t.findNext(this,e)}};return s}else{var s={attributeRef:n,from:a,forElt:o,args:[a,o,i],op:function(e,r,i,s){t.nullCheck(r,a);t.nullCheck(i,o);t.implicitLoop(r,(function(e){if(!s){e.removeAttribute(n.name)}else{e.setAttribute(n.name,s)}}));t.implicitLoop(i,(function(e){e.setAttribute(n.name,n.value||"")}));return t.findNext(this,e)}};return s}}}));function a(t,r,n,i){if(n!=null){var a=t.resolveSymbol(n,r)}else{var a=r}if(a instanceof Element||a instanceof HTMLDocument){while(a.firstChild)a.removeChild(a.firstChild);a.append(e.runtime.convertValue(i,"Fragment"));t.processNode(a)}else{if(n!=null){t.setSymbol(n,r,null,i)}else{throw"Don't know how to put a value into "+typeof r}}}e.addCommand("put",(function(e,t,r){if(r.matchToken("put")){var n=e.requireElement("expression",r);var i=r.matchAnyToken("into","before","after");if(i==null&&r.matchToken("at")){r.matchToken("the");i=r.matchAnyToken("start","end");r.requireToken("of")}if(i==null){e.raiseParseError(r,"Expected one of 'into', 'before', 'at start of', 'at end of', 'after'")}var o=e.requireElement("expression",r);var s=i.value;var u=false;var l=false;var c=null;var f=null;if(o.type==="arrayIndex"&&s==="into"){u=true;f=o.prop;c=o.root}else if(o.prop&&o.root&&s==="into"){f=o.prop.value;c=o.root}else if(o.type==="symbol"&&s==="into"){l=true;f=o.name}else if(o.type==="attributeRef"&&s==="into"){var m=true;f=o.name;c=e.requireElement("implicitMeTarget",r)}else if(o.type==="styleRef"&&s==="into"){var p=true;f=o.name;c=e.requireElement("implicitMeTarget",r)}else if(o.attribute&&s==="into"){var m=o.attribute.type==="attributeRef";var p=o.attribute.type==="styleRef";f=o.attribute.name;c=o.root}else{c=o}var h={target:o,operation:s,symbolWrite:l,value:n,args:[c,f,n],op:function(e,r,n,i){if(l){a(t,e,n,i)}else{t.nullCheck(r,c);if(s==="into"){if(m){t.implicitLoop(r,(function(e){e.setAttribute(n,i)}))}else if(p){t.implicitLoop(r,(function(e){e.style[n]=i}))}else if(u){r[n]=i}else{t.implicitLoop(r,(function(e){a(t,e,n,i)}))}}else{var o=s==="before"?Element.prototype.before:s==="after"?Element.prototype.after:s==="start"?Element.prototype.prepend:s==="end"?Element.prototype.append:Element.prototype.append;t.implicitLoop(r,(function(e){o.call(e,i instanceof Node?i:t.convertValue(i,"Fragment"));if(e.parentElement){t.processNode(e.parentElement)}else{t.processNode(e)}}))}}return t.findNext(this,e)}};return h}}));function o(e,t,r){var n;if(r.matchToken("the")||r.matchToken("element")||r.matchToken("elements")||r.currentToken().type==="CLASS_REF"||r.currentToken().type==="ID_REF"||r.currentToken().op&&r.currentToken().value==="<"){e.possessivesDisabled=true;try{n=e.parseElement("expression",r)}finally{delete e.possessivesDisabled}if(r.matchOpToken("'")){r.requireToken("s")}}else if(r.currentToken().type==="IDENTIFIER"&&r.currentToken().value==="its"){var i=r.matchToken("its");n={type:"pseudopossessiveIts",token:i,name:i.value,evaluate:function(e){return t.resolveSymbol("it",e)}}}else{r.matchToken("my")||r.matchToken("me");n=e.parseElement("implicitMeTarget",r)}return n}e.addCommand("transition",(function(e,t,n){if(n.matchToken("transition")){var i=o(e,t,n);var a=[];var s=[];var u=[];var l=n.currentToken();while(!e.commandBoundary(l)&&l.value!=="over"&&l.value!=="using"){if(n.currentToken().type==="STYLE_REF"){let e=n.consumeToken();let t=e.value.substr(1);a.push({type:"styleRefValue",evaluate:function(){return t}})}else{a.push(e.requireElement("stringLike",n))}if(n.matchToken("from")){s.push(e.requireElement("expression",n))}else{s.push(null)}n.requireToken("to");if(n.matchToken("initial")){u.push({type:"initial_literal",evaluate:function(){return"initial"}})}else{u.push(e.requireElement("expression",n))}l=n.currentToken()}if(n.matchToken("over")){var c=e.requireElement("expression",n)}else if(n.matchToken("using")){var f=e.requireElement("expression",n)}var m={to:u,args:[i,a,s,u,f,c],op:function(e,n,a,o,s,u,l){t.nullCheck(n,i);var c=[];t.implicitLoop(n,(function(e){var n=new Promise((function(n,i){var c=e.style.transition;if(l){e.style.transition="all "+l+"ms ease-in"}else if(u){e.style.transition=u}else{e.style.transition=r.defaultTransition}var f=t.getInternalData(e);var m=getComputedStyle(e);var p={};for(var h=0;he.forEach((e=>S(e))))).then((()=>n((function(){a();k.processNode(document.documentElement);e.document.addEventListener("htmx:load",(function(e){k.processNode(e.detail.elt)}))}))));function n(e){if(document.readyState!=="loading"){setTimeout(e)}else{document.addEventListener("DOMContentLoaded",e)}}function i(){var e=document.querySelector('meta[name="htmx-config"]');if(e){return v(e.content)}else{return null}}function a(){var e=i();if(e){Object.assign(r,e)}}}const S=Object.assign(b,{config:r,use(e){e(S)},internals:{lexer:x,parser:g,runtime:k,Lexer:n,Tokens:i,Parser:a,Runtime:o},ElementCollection:m,addFeature:g.addFeature.bind(g),addCommand:g.addCommand.bind(g),addLeafExpression:g.addLeafExpression.bind(g),addIndirectExpression:g.addIndirectExpression.bind(g),evaluate:k.evaluate.bind(k),parse:k.parse.bind(k),processNode:k.processNode.bind(k),version:"0.9.12",browserInit:w});return S})); diff --git a/assets/static/js/main.js b/assets/static/js/main.js new file mode 100644 index 0000000..45b5a87 --- /dev/null +++ b/assets/static/js/main.js @@ -0,0 +1,256 @@ +if (typeof(registerServiceWorker) == undefined) { +const registerServiceWorker = async () => { + if ("serviceWorker" in navigator) { + try { + const registration = await navigator.serviceWorker.register("/static/js/serviceWorker.js", { + scope: "/", + }); + if (registration.installing) { + console.log("Service worker installing"); + } else if (registration.waiting) { + console.log("Service worker installed"); + } else if (registration.active) { + console.log("Service worker active"); + } + } catch (error) { + console.error("Registration failed with ${error}"); + } + } +}; +registerServiceWorker(); +} + +//Variable for gestures +if (typeof(_bm_xDown) == undefined) { + let _bm_xDown; +} + +if (typeof(_bm_yDown) == undefined) { + let _bm_yDown; +} + +function bm_toggle_dropdown(list_id) { + var list = document.getElementById(list_id); + if (list.className.indexOf("w3-show") == -1) { + list.className += " w3-show"; + } else { + list.className = list.className.replace(" w3-show", ""); + } +} + +function bm_overlay_off(sidebar_id) { + document.getElementById("overlay").style.display = "none"; + bm_hide_sidebar(sidebar_id); +} + +function bm_toggle_sidebar(sidebar_id) { + sidebar = document.getElementById(sidebar_id); + if (sidebar.style.display === "block") { + document.getElementById("overlay").style.display = "none"; + sidebar.style.display = "none"; + sidebar.classList.remove("mobile-sidebar"); + } else { + document.getElementById("overlay").style.display = "block"; + sidebar.style.display = "block"; + sidebar.classList.add("mobile-sidebar"); + } +} + +function bm_hide_sidebar(sidebar_id) { + document.getElementById("overlay").style.display = "none"; + sidebar = document.getElementById(sidebar_id); + sidebar.style.display = "none"; + sidebar.classList.remove("mobile-sidebar") +} + +function bm_sidebar_click(sidebar_id) { + sidebar = document.getElementById(sidebar_id); + if(sidebar.classList.contains("mobile-sidebar")) { + bm_hide_sidebar(sidebar_id); + bm_hide_quickbox(); + } +} + +function bm_toggle_visibility(element_id) { + element = document.getElementById(element_id); + if (element.classList.contains("hidden")) { + element.classList.remove("hidden"); + } else { + element.classList.add("hidden"); + } + + var x = document.getElementsByClassName(element_id); + for (var i = 0; i < x.length; i++) { + if (x[i].classList.contains("hidden")) { + x[i].classList.remove("hidden"); + } else { + x[i].classList.add("hidden"); + } + } +} + +function bm_toggle_visibility_list_search(element_id) { + element = document.getElementById(element_id); + if (element.classList.contains("hidden")) { + element.classList.remove("hidden"); + } else { + element.classList.add("hidden"); + } + + var x = document.getElementsByClassName("stickyheader"); + for (var i = 0; i < x.length; i++) { + if (x[i].classList.contains("searchopened")) { + x[i].classList.remove("searchopened"); + } else { + x[i].classList.add("searchopened"); + } + } +} + +function bm_open_tab(element, tab_button_class, tab_class, tab_id) { + var x = document.getElementsByClassName("tab-button"); + for (var i = 0; i < x.length; i++) { + x[i].classList.remove("active"); + } + element.classList.add("active"); + var x = document.getElementsByClassName("tab"); + for (var i = 0; i < x.length; i++) { + x[i].style.display = "none"; + } + document.getElementById(tab_id).style.display = "block"; +} + +function bm_show_quickbox() { + htmx.ajax('GET', '/quickbox/all', {target:'#quickbox-notes', swap:'innerHTML'}) + document.getElementById("quickbox").style.display = "block"; +} + +function bm_hide_quickbox() { + document.getElementById("quickbox").style.display = "none"; +} + +function bm_toggle_quickbox() { + quickbox = document.getElementById("quickbox"); + console.log(quickbox); + if(quickbox.style.display == "block") { + bm_hide_quickbox(); + } + else { + bm_show_quickbox(); + } +} + +function bm_show_confirm(sender, title, message) { + document.querySelector("#modal-confirm-dialog h5").innerHTML = title; + document.querySelector("#modal-confirm-dialog p").innerHTML = message; + + btn_ok = document.getElementById("modal-confirm-ok"); + btn_ok.outerHTML = btn_ok.outerHTML; + + document.getElementById("modal-confirm-ok").addEventListener('click', (event) => { + htmx.trigger(sender, 'confirmed'); + document.getElementById("modal-confirm-dialog").style.display = "none"; + }); + + document.getElementById("modal-confirm-dialog").style.display = "block"; +} + +function bm_item_field_add(type_field_id, widget) { + template = Handlebars.templates['items/field-' + widget] + fields_list = document.getElementById('fields-' + type_field_id); + counter = parseInt(document.getElementById('fields-' + type_field_id + '-counter').innerHTML); + fields_list.insertAdjacentHTML('beforeend', template({type_field_id:type_field_id,counter:counter, value:""})); + document.getElementById('fields-' + type_field_id + '-counter').innerHTML = counter + 1; +} + +document.addEventListener("DOMContentLoaded", function(event){ + // const easyMDE = new EasyMDE({autosave: {enabled: true, uniqueId: 'eMDE-item-descriotion'}, element: document.getElementById('item-description')}); + /* + //Swipe on body, disabled due to conflicts + document.querySelector('body') + .addEventListener( + 'touchstart', + bm_handleTouchStart, + false + ); + document.querySelector('body') + .addEventListener( + 'touchmove', + bm_handleTouchMove, + false + ); + */ + + document.body.addEventListener("quickboxNoteClear", function(evt){ + document.getElementById("quickbox-note").value = '' + }); + + document.body.addEventListener("closeQuickboxTransformModal", function(evt){ + document.getElementById("modal").remove(); + if(evt.detail.keepQuickNote == 0){ + htmx.ajax('DELETE', '/quickbox/delete/' + evt.detail.quickNoteId, {target:'#quicknote-' + evt.detail.quickNoteId, swap:'outerHTML swap:1s'}) + } + }); + + document.body.addEventListener("activateEasyMDE", function(evt){ + const easyMDE = new EasyMDE({element: document.getElementById(evt.detail.value), forceSync: true}); +}); +}); + +function bm_ignoreSwipe(event) { + // if some touches come from elements with ignoreswipe class > ignore + return Array.from(event.touches).some((t) => + t.target.classList.contains('noswipe') + ); +} + +function bm_handleTouchStart(event) { + if (bm_ignoreSwipe(event)) { + _bm_xDown = undefined; + _bm_yDown = undefined; + return; + } + + const firstTouch = event.touches[0]; + _bm_xDown = firstTouch.clientX; + _bm_yDown = firstTouch.clientY; +} + +function bm_handleTouchMove(event) { + + if (!_bm_xDown || !_bm_yDown) { + return; + } + + const xUp = event.touches[0].clientX; + const yUp = event.touches[0].clientY; + + const xDiff = _bm_xDown - xUp; + const yDiff = _bm_yDown - yUp; + + if (Math.abs(xDiff) > Math.abs(yDiff)) { + /*most significant*/ + if (xDiff > 1) { + /* left swipe */ + //console.log('app: left swipe ', true); + bm_show_quickbox(); + } else { + /* right swipe */ + //console.log('app: right swipe ', true); + bm_toggle_sidebar("main-sidebar"); + } + } else { + if (yDiff > 1) { + /* up swipe */ + console.log('app: up swipe ', true); + } else { + /* down swipe */ + console.log('app: down swipe ', true); + } + } + + /* reset values */ + _bm_xDown = null; + _bm_yDown = null; +} + diff --git a/assets/static/js/serviceWorker.js b/assets/static/js/serviceWorker.js new file mode 100644 index 0000000..bf14e82 --- /dev/null +++ b/assets/static/js/serviceWorker.js @@ -0,0 +1,59 @@ +const cacheVersion = "0.266" +const cacheName = "speedtech-brainminder" +const cacheFiles = [ + '/static/bootstrap-icons/font/bootstrap-icons.min.css', + '/static/bootstrap-icons/font/fonts/bootstrap-icons.woff', + '/static/bootstrap-icons/font/fonts/bootstrap-icons.woff2', + '/static/bootstrap-icons/*.svg', + "/static/easymde/easymde.min.css", + '/static/css/main.css', + '/static/img/brainminder.svg', + '/static/img/brainminder-icon.svg', + "/static/easymde/easymde.min.js", + "/static/js/Sortable.min.js", + "/static/js/htmx/htmx.min.js", + "/static/js/hyperscript.min.js", + "/static/js/handlebars.js", + "/static/js/templates.js", + '/static/js/main.js', +] + +self.addEventListener('install', function(e) { + e.waitUntil( + // Open the cache + caches.open(cacheName).then(function(cache) { + // Add all the default files to the cache + console.log('[ServiceWorker] Caching cacheFiles'); + return cache.addAll(cacheFiles); + }) + ); +}); + +self.addEventListener('activate', function(e) { + e.waitUntil( + // Get all the cache keys (cacheName) + caches.keys().then(function(cacheNames) { + return Promise.all(cacheNames.map(function(thisCacheName) { + // If a cached item is saved under a previous cacheName + if (thisCacheName !== cacheName) { + // Delete that cached file + console.log('[ServiceWorker] Removing Cached Files from Cache - ', thisCacheName); + return caches.delete(thisCacheName); + } + })); + }) + ); +}); + +self.addEventListener('fetch', (event) => { + // Respond to the document with what is returned from + event.respondWith( + // 1. Check the cache if a file matching that request is available + caches.match(event.request).then((response) => { + // 2. If it is, respond to the document with the file from the cache + if (response) return response + // 3. If it isn’t, fetch the file from the network and respond to the document with the fetched file + return fetch(event.request) + }) + ); +}); \ No newline at end of file diff --git a/assets/static/js/templates.js b/assets/static/js/templates.js new file mode 100644 index 0000000..d19b365 --- /dev/null +++ b/assets/static/js/templates.js @@ -0,0 +1,67 @@ +(function() { + var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {}; +templates['items/field-text'] = template({"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { + if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { + return parent[propertyName]; + } + return undefined + }; + + return "
    \n
    \n
    \n
    "; +},"useData":true}); +templates['items/field-url'] = template({"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) { + var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) { + if (Object.prototype.hasOwnProperty.call(parent, propertyName)) { + return parent[propertyName]; + } + return undefined + }; + + return "
    \n
    \n
    \n
    "; +},"useData":true}); +})(); \ No newline at end of file diff --git a/assets/static/manifest.json b/assets/static/manifest.json new file mode 100644 index 0000000..5c1d715 --- /dev/null +++ b/assets/static/manifest.json @@ -0,0 +1,89 @@ +{ + "name": "BrainMinder", + "short_name": "BrainMinder", + "start_url": "/", + "scope": "/", + "display": "standalone", + "background_color": "#2b5797", + "theme_color": "#2b5797", + "orientation": "any", + "icons": [{ + "src": "/static/img/icons/72x72.png", + "type": "image/png", + "sizes": "72x72", + "purpose": "any" + }, + { + "src": "/static/img/icons/96x96.png", + "type": "image/png", + "sizes": "96x96", + "purpose": "any" + }, + { + "src": "/static/img/icons/128x128.png", + "type": "image/png", + "sizes": "128x128", + "purpose": "any" + }, + { + "src": "/static/img/icons/144x144.png", + "type": "image/png", + "sizes": "144x144", + "purpose": "any" + }, + { + "src": "/static/img/icons/152x152.png", + "type": "image/png", + "sizes": "152x152", + "purpose": "any" + }, + { + "src": "/static/img/icons/192x192.png", + "type": "image/png", + "sizes": "192x192", + "purpose": "any" + }, + { + "src": "/static/img/icons/384x384.png", + "type": "image/png", + "sizes": "384x384", + "purpose": "any" + }, + { + "src": "/static/img/icons/512x512.png", + "type": "image/png", + "sizes": "512x512", + "purpose": "any" + } + ], + "screenshots" : [ + { + "src": "/static/img/screenshots/BrainMinder-screenshot-wide.webp", + "sizes": "1920x1080", + "type": "image/webp", + "form_factor": "wide", + "label": "List of items of BrainMinder" + }, + { + "src": "/static/img/screenshots/BrainMinder-screenshot-wide-1.webp", + "sizes": "1920x1080", + "type": "image/webp", + "form_factor": "wide", + "label": "Dashboard of BrainMinder" + }, + { + "src": "/static/img/screenshots/BrainMinder-screenshot-narrow.webp", + "sizes": "800x1726", + "type": "image/webp", + "form_factor": "narrow", + "label": "List of items of BrainMinder on mobile" + }, + { + "src": "/static/img/screenshots/BrainMinder-screenshot-narrow-1.webp", + "sizes": "800x1726", + "type": "image/webp", + "form_factor": "narrow", + "label": "Menu opened in BrainMinder on mobile" + } + ] +} \ No newline at end of file diff --git a/assets/templates/base.tmpl b/assets/templates/base.tmpl new file mode 100644 index 0000000..fa9b50f --- /dev/null +++ b/assets/templates/base.tmpl @@ -0,0 +1,132 @@ +{{define "base"}} + + + + + + + + BrainMinder + + + + + + + + {{block "page:meta" . }} + {{ + end + }} + + + + {{template "partial:sidebar" .}} + +
    +
    +
    + + + +
    {{template "page:title" .}}
    + +
    +
    + +
    + {{template "page:content" .}} +
    +
    + + {{template "partial:footer" .}} +
    + +
    + + + +
    +
    +
    + +
    +
    Quickbox
    +
    + +
    +
    +
    +
    + +
    +
    +
    + + + +
    + + + +{{ end }} diff --git a/assets/templates/categories/create_title.tmpl b/assets/templates/categories/create_title.tmpl new file mode 100644 index 0000000..ddaa641 --- /dev/null +++ b/assets/templates/categories/create_title.tmpl @@ -0,0 +1,8 @@ +{{define "page:title"}} +
    +
    New Category
    +
    +
    + +
    +{{end}} diff --git a/assets/templates/categories/form.tmpl b/assets/templates/categories/form.tmpl new file mode 100644 index 0000000..366a735 --- /dev/null +++ b/assets/templates/categories/form.tmpl @@ -0,0 +1,52 @@ +{{ define "page:content" }} +
    +
    +

    + + +

    + +

    + + Back +

    +
    +
    +
    +
    + +
    +
    + + +
    +
    +
    +
    +{{ end }} diff --git a/assets/templates/categories/index.tmpl b/assets/templates/categories/index.tmpl new file mode 100644 index 0000000..9000a24 --- /dev/null +++ b/assets/templates/categories/index.tmpl @@ -0,0 +1,3 @@ +{{define "page:content"}} + {{template "categories:list" .}} +{{end}} diff --git a/assets/templates/categories/list.tmpl b/assets/templates/categories/list.tmpl new file mode 100644 index 0000000..94ce351 --- /dev/null +++ b/assets/templates/categories/list.tmpl @@ -0,0 +1,85 @@ +{{define "categories:list"}} + +
    + + + + + + + + + {{ + range .categories + }} + + + + + {{ + end + }} + +
    Name + + +
    + {{.Name}} + + + +
    +
    +{{ end }} diff --git a/assets/templates/categories/list_title.tmpl b/assets/templates/categories/list_title.tmpl new file mode 100644 index 0000000..bcc4c56 --- /dev/null +++ b/assets/templates/categories/list_title.tmpl @@ -0,0 +1,14 @@ +{{define "page:title"}} +
    +
    Categories
    +
    +
    + + +
    +{{end}} diff --git a/assets/templates/categories/update_title.tmpl b/assets/templates/categories/update_title.tmpl new file mode 100644 index 0000000..e2a8264 --- /dev/null +++ b/assets/templates/categories/update_title.tmpl @@ -0,0 +1,8 @@ +{{define "page:title"}} +
    +
    Edit Category
    +
    +
    + +
    +{{end}} diff --git a/assets/templates/full.tmpl b/assets/templates/full.tmpl new file mode 100644 index 0000000..b2343fc --- /dev/null +++ b/assets/templates/full.tmpl @@ -0,0 +1,28 @@ +{{define "full"}} + + + + + + + + BrainMinder + + + + + + + {{block "page:meta" . }} + {{ + end + }} + + +
    +
    {{template "page:content" .}}
    +
    + {{template "partial:footer" .}} + + +{{ end }} diff --git a/assets/templates/items/add_relation.tmpl b/assets/templates/items/add_relation.tmpl new file mode 100644 index 0000000..7b81eab --- /dev/null +++ b/assets/templates/items/add_relation.tmpl @@ -0,0 +1,45 @@ +{{define "item:add_relation"}} +{{ $relation_name := printf "%s%v" "ItemRelation-New-" .relatedItem.Id }} + + {{.relatedItem.Type_title}} : + {{.relatedItem.Title}} + + + {{ if gt (len .relatedItem.Categories) 0 }} + + {{ range (stringToArray .relatedItem.Categories "|")}} + {{ $category_name := index $.categoriesMap .}} +
    + {{ $category_name }} +
    + {{ end }} + {{ end }} + + + {{ if gt (len .relatedItem.Tags) 0 }} + + {{ range (stringToArray .relatedItem.Tags ",")}} +
    + {{ . }} +
    + {{ end }} + {{ end }} + + {{ widget_relation_type $relation_name "Link" `id="$relation_name" class="w3-input w3-border"` }} + +
    + Remove +
    + + + {{ end }} diff --git a/assets/templates/items/add_to_dashboard.tmpl b/assets/templates/items/add_to_dashboard.tmpl new file mode 100644 index 0000000..1ac31bd --- /dev/null +++ b/assets/templates/items/add_to_dashboard.tmpl @@ -0,0 +1,9 @@ +{{define "item:add_to_dashboard"}} + +{{ end }} \ No newline at end of file diff --git a/assets/templates/items/all_list.tmpl b/assets/templates/items/all_list.tmpl new file mode 100644 index 0000000..345ac1c --- /dev/null +++ b/assets/templates/items/all_list.tmpl @@ -0,0 +1,76 @@ +{{define "itemsAll:list"}} + +
    + + + + + + + + + + + + {{ template "itemsAll:list_rows" .}} + + +
    +{{ end }} diff --git a/assets/templates/items/all_list_rows.tmpl b/assets/templates/items/all_list_rows.tmpl new file mode 100644 index 0000000..43e6ae6 --- /dev/null +++ b/assets/templates/items/all_list_rows.tmpl @@ -0,0 +1,89 @@ +{{define "itemsAll:list_rows"}} +{{ $rowCount := 0 }} + + {{ range .items }} + + + + {{.Title}} + {{.Title}} + + {{.Type_title}} + + {{ if gt (len .Categories) 0 }} + + {{ range (stringToArray .Categories "|")}} + {{ $category_id := index $.categoriesMap .}} + {{ $category_id }} + {{ end }} + {{ end }} + + + {{ if gt (len .Tags) 0 }} + + {{ range (stringToArray .Tags ",")}} + {{ . }} + {{ end }} + {{ end }} + + + + {{ if eq .On_dashboard 1}} + {{ template "item:remove_from_dashboard" .Id }} + {{ else }} + {{ template "item:add_to_dashboard" .Id }} + {{ end }} + + + + + + + + + {{ end }} + {{ end }} diff --git a/assets/templates/items/all_list_title.tmpl b/assets/templates/items/all_list_title.tmpl new file mode 100644 index 0000000..3b39871 --- /dev/null +++ b/assets/templates/items/all_list_title.tmpl @@ -0,0 +1,9 @@ +{{define "page:title"}} +
    +
    All Items
    +
    +
    + + +
    +{{end}} \ No newline at end of file diff --git a/assets/templates/items/create_title.tmpl b/assets/templates/items/create_title.tmpl new file mode 100644 index 0000000..9ada960 --- /dev/null +++ b/assets/templates/items/create_title.tmpl @@ -0,0 +1,5 @@ +{{define "page:title"}} +
    +
    New {{ .type.Title}}
    +
    +{{end}} \ No newline at end of file diff --git a/assets/templates/items/fields.tmpl b/assets/templates/items/fields.tmpl new file mode 100644 index 0000000..657c0fb --- /dev/null +++ b/assets/templates/items/fields.tmpl @@ -0,0 +1,60 @@ +{{ define "items:fields" }} + +{{ range (index .FieldsSection .uisection) }} +{{ $field := .}} +{{ $values := (index $.FieldsValues .Type_field_id)}} + +{{ if eq .Is_multiple 1}} +
    + + +
    + {{ $g_counter := 0 }} + {{ range $counter, $value := $values}} + +
    +
    {{ field_widget $field.Widget $field.Type_field_id $counter "" $value $field.Valid_values ""}}
    +
    + + + +
    +
    + {{ $g_counter = $counter}} + {{ end }} +
    + + {{incr $g_counter }} + +
    +{{ else }} +

    + {{ $value := ""}} + {{ if gt (len $values) 0 }} + {{ $value = index $values 0 }} + {{ end }} + {{ field_widget .Widget .Type_field_id 0 .Title $value .Valid_values ""}} +

    +{{ end }} +{{ end }} + +{{ end }} \ No newline at end of file diff --git a/assets/templates/items/form.tmpl b/assets/templates/items/form.tmpl new file mode 100644 index 0000000..a22ff3e --- /dev/null +++ b/assets/templates/items/form.tmpl @@ -0,0 +1,254 @@ +{{ define "page:content" }} + +{{ $fields_present := false }} +{{ if (gt (len (index .item.FieldsSection "fields")) 0) }} +{{ $fields_present = true }} +{{ end }} + +
    +
    +
    + + General + + {{ if $fields_present }} + + Fields + + {{ end }} + + Relations + +
    + +
    +
    +
    +

    + + +

    +

    + {{ widget_select "Type_id" "Type" .item.Type_id .types `class="w3-input w3-border"` }} +

    +
    +
    +

    + {{ widget_checkboxes "Notebooks" "Notebooks" .item.Notebooks .notebooks `class="w3-check"` }} +

    +
    +
    + +
    + {{ template "items:fields" (map "FieldsSection" .item.FieldsSection "FieldsValues" .item.FieldsValues "uisection" "general")}} +
    + + {{ if eq .item.Type_show_summary 1}} +

    + + +

    + {{ end }} + + {{ if eq .item.Type_show_description 1}} +

    + + +

    + {{ end }} +
    +
    +

    + + +

    +
    +
    +

    + {{ widget_select "Categories" "Categories" .item.Categories .categories `multiple="true" class="w3-input w3-border"` }} +

    +
    +
    + +

    + On dashboard +

    +
    + + {{ if $fields_present }} + + {{ end }} + + +
    +

    + + {{ if not (eq .item.Id 0) }} + View + Delete + Share + {{ end }} + Back +

    + +
    +
    +
    + +
    + {{ if not (eq .item.Id 0) }} +
    + + +
    +
    + + +
    +
    + + +
    + {{ end }} +
    +
    +
    +{{ end }} diff --git a/assets/templates/items/form_jscode.tmpl b/assets/templates/items/form_jscode.tmpl new file mode 100644 index 0000000..e5dae46 --- /dev/null +++ b/assets/templates/items/form_jscode.tmpl @@ -0,0 +1,3 @@ +{{ define "jscode" }} + const easyMDE = new EasyMDE({element: document.getElementById("item-description"),forceSync: true}); +{{ end }} \ No newline at end of file diff --git a/assets/templates/items/index.tmpl b/assets/templates/items/index.tmpl new file mode 100644 index 0000000..fd19735 --- /dev/null +++ b/assets/templates/items/index.tmpl @@ -0,0 +1,3 @@ +{{define "page:content"}} + {{template "items:list" .}} +{{end}} diff --git a/assets/templates/items/index_all.tmpl b/assets/templates/items/index_all.tmpl new file mode 100644 index 0000000..4e15638 --- /dev/null +++ b/assets/templates/items/index_all.tmpl @@ -0,0 +1,3 @@ +{{define "page:content"}} + {{template "itemsAll:list" .}} +{{end}} diff --git a/assets/templates/items/list.tmpl b/assets/templates/items/list.tmpl new file mode 100644 index 0000000..2bbaef1 --- /dev/null +++ b/assets/templates/items/list.tmpl @@ -0,0 +1,85 @@ +{{define "items:list"}} + +
    + + + + + + + {{ range .Fields}} + + {{end}} + + + + + {{ template "items:list_rows" .}} + + +
    +{{ end }} diff --git a/assets/templates/items/list_for_relations.tmpl b/assets/templates/items/list_for_relations.tmpl new file mode 100644 index 0000000..377eb1d --- /dev/null +++ b/assets/templates/items/list_for_relations.tmpl @@ -0,0 +1,61 @@ +{{define "items:list-for-relations"}} + + + + + + + + + + + {{ range .items}} + {{ $relation_name := printf "%s%v%s" "ItemRelation-" .Id }} + + + + + + + {{ end }} + +
    ItemCategoriesTags
    + {{.Title}} + + {{ if gt (len .Categories) 0 }} + + {{ range (stringToArray .Categories "|")}} + {{ $category_name := index $.categoriesMap .}} +
    + {{ $category_name }} +
    + {{ end }} + {{ end }} +
    + {{ if gt (len .Tags) 0 }} + + {{ range (stringToArray .Tags ",")}} +
    + {{ . }} +
    + {{ end }} + {{ end }} +
    +
    + Add +
    +
    +{{ end }} diff --git a/assets/templates/items/list_rows.tmpl b/assets/templates/items/list_rows.tmpl new file mode 100644 index 0000000..01e1a64 --- /dev/null +++ b/assets/templates/items/list_rows.tmpl @@ -0,0 +1,98 @@ +{{define "items:list_rows"}} + +{{ $rowCount := 0 }} + +{{ range .items }} + + + {{.Title}} + {{.Title}} + + + {{ if gt (len .Categories) 0 }} + + {{ range (stringToArray .Categories "|")}} + {{ $category_name := index $.categoriesMap .}} + {{ $category_name }} + {{ end }} + {{ end }} + + + {{ if gt (len .Tags) 0 }} + + {{ range (stringToArray .Tags ",")}} + {{ . }} + {{ end }} + {{ end }} + + {{ $fieldsValuesMap := .FieldsValuesMap}} + {{ range $.Fields}} + + {{ $values_str := renderFieldValues (index $fieldsValuesMap .Type_field_id) .Widget }} + {{ if gt (len $values_str) 0 }} + {{.Title}} : {{ $values_str }} + {{ end }} + + {{end}} + + + {{ if eq .On_dashboard 1}} + {{ template "item:remove_from_dashboard" .Id }} + {{ else }} + {{ template "item:add_to_dashboard" .Id }} + {{ end }} + + + + + + + + + + {{ end }} +{{ end }} \ No newline at end of file diff --git a/assets/templates/items/list_title.tmpl b/assets/templates/items/list_title.tmpl new file mode 100644 index 0000000..5f511f4 --- /dev/null +++ b/assets/templates/items/list_title.tmpl @@ -0,0 +1,19 @@ +{{define "page:title"}} +
    +
    {{.type.Title}} Items
    +
    +
    + + + +
    +{{end}} \ No newline at end of file diff --git a/assets/templates/items/read.tmpl b/assets/templates/items/read.tmpl new file mode 100644 index 0000000..14bea48 --- /dev/null +++ b/assets/templates/items/read.tmpl @@ -0,0 +1,102 @@ +{{define "page:content"}} +
    +
    +
    {{ .item.Title }}
    + {{ if gt (len .item.Summary) 0}} +
    + {{.item.Summary_rendered | safeHTML}} +
    + {{ end }} + + {{.item.Description_rendered | safeHTML}} + + {{ if gt (len .fields) 0}} +
      + {{ range .fields }} +
    • {{.Title}} : {{ renderFieldValue .Value .Widget}}
    • + {{ end }} +
    + {{ end }} + + {{ template "item:relations_view" .}} + +
    +
    + {{if gt (len .item.Categories) 0 }} + + Categories + {{ range (stringToArray .item.Categories "|")}} + {{ $category_name := index $.categoriesMap .}} + + {{ end }} + {{ end }} +
    +
    + {{if gt (len .item.Tags) 0 }} + + Tags {{ range (stringToArray .item.Tags ",")}} +
    + {{ . }} +
    + {{ end }} + {{ end }} +
    +
    + + Edit + Share +
    +
    +
    +
    +
    + + +
    +
    + + +
    +
    +
    +{{ end }} diff --git a/assets/templates/items/read_title.tmpl b/assets/templates/items/read_title.tmpl new file mode 100644 index 0000000..a49d8b0 --- /dev/null +++ b/assets/templates/items/read_title.tmpl @@ -0,0 +1,8 @@ +{{define "page:title"}} +
    +
    {{ .item.Type_title }}
    +
    +
    + +
    +{{end}} diff --git a/assets/templates/items/relations.tmpl b/assets/templates/items/relations.tmpl new file mode 100644 index 0000000..ab10a36 --- /dev/null +++ b/assets/templates/items/relations.tmpl @@ -0,0 +1,88 @@ +{{define "item:relations"}} + + + + + + + + + + + +{{ range .item.Relations}} +{{ $relation_name := printf "%s%v-%v" "ItemRelation-" .Item_id .Related_item_id }} +{{ $relation_name_remove := printf "%s%v-%v" "ItemRelation-ToRemove-" .Item_id .Related_item_id }} + + + + + + + + {{ end }} + +
    ItemCategoriesTagsRelation type
    + {{ $target_id := .Related_item_id}} + {{ $relation_type := .Relation_type }} + {{ if eq .Related_item_id $.item.Id }} + {{ $target_id = .Item_id}} + {{ if eq "Parent" .Relation_type}} + {{ $relation_type = "Child" }} + {{ else if eq "Child" .Relation_type}} + {{ $relation_type = "Parent" }} + {{ end }} + {{ end }} + {{.Title}} + + + {{ if gt (len .Categories) 0 }} + + {{ range (stringToArray .Categories "|")}} + {{ $category_name := index $.categoriesMap .}} +
    + {{ $category_name }} +
    + {{ end }} + {{ end }} +
    + {{ if gt (len .Tags) 0 }} + + {{ range (stringToArray .Tags ",")}} +
    + {{ . }} +
    + {{ end }} + {{ end }} +
    {{ widget_relation_type $relation_name $relation_type `id="$relation_name" class="w3-input w3-border"` }} +
    + + +
    +
    + {{ end }} diff --git a/assets/templates/items/relations_view.tmpl b/assets/templates/items/relations_view.tmpl new file mode 100644 index 0000000..b7d54e3 --- /dev/null +++ b/assets/templates/items/relations_view.tmpl @@ -0,0 +1,37 @@ +{{define "item:relations_view"}} +{{ if (gt (len .relations) 0) }} +
    + Relations +
      + {{ + range.relations + }} + {{ $target_id := .Related_item_id}} + {{ $relation_type := .Relation_type }} + {{ if eq .Related_item_id $.item.Id }} + {{ $target_id = .Item_id}} + {{ if eq "Parent" .Relation_type}} + {{ $relation_type = "Child" }} + {{ else if eq "Child" .Relation_type}} + {{ $relation_type = "Parent" }} + {{ + end + }} + {{ + end + }} +
    • + + {{.Title}} +
    • + {{ + end + }} +
    +
    +{{ end }} +{{ end }} diff --git a/assets/templates/items/remove_from_dashboard.tmpl b/assets/templates/items/remove_from_dashboard.tmpl new file mode 100644 index 0000000..1b0ba88 --- /dev/null +++ b/assets/templates/items/remove_from_dashboard.tmpl @@ -0,0 +1,11 @@ +{{define "item:remove_from_dashboard"}} + + + +{{ end }} \ No newline at end of file diff --git a/assets/templates/items/share.tmpl b/assets/templates/items/share.tmpl new file mode 100644 index 0000000..24fefe0 --- /dev/null +++ b/assets/templates/items/share.tmpl @@ -0,0 +1,99 @@ +{{define "page:content"}} + + {{ end }} \ No newline at end of file diff --git a/assets/templates/items/update_title.tmpl b/assets/templates/items/update_title.tmpl new file mode 100644 index 0000000..ba73259 --- /dev/null +++ b/assets/templates/items/update_title.tmpl @@ -0,0 +1,8 @@ +{{define "page:title"}} +
    +
    Edit {{.item.Type_title}}
    +
    +
    + +
    +{{end}} \ No newline at end of file diff --git a/assets/templates/items/view.tmpl b/assets/templates/items/view.tmpl new file mode 100644 index 0000000..904d85b --- /dev/null +++ b/assets/templates/items/view.tmpl @@ -0,0 +1,76 @@ +{{define "page:content"}} + + {{ end }} \ No newline at end of file diff --git a/assets/templates/notebooks/create_title.tmpl b/assets/templates/notebooks/create_title.tmpl new file mode 100644 index 0000000..7379908 --- /dev/null +++ b/assets/templates/notebooks/create_title.tmpl @@ -0,0 +1,8 @@ +{{define "page:title"}} +
    +
    New Notebook
    +
    +
    + +
    +{{end}} diff --git a/assets/templates/notebooks/form.tmpl b/assets/templates/notebooks/form.tmpl new file mode 100644 index 0000000..88ecff3 --- /dev/null +++ b/assets/templates/notebooks/form.tmpl @@ -0,0 +1,75 @@ +{{ define "page:content" }} +
    +
    +

    + + +

    + +

    + + +

    + +

    + + +

    + +

    + + Back +

    +
    +
    +
    +
    + +
    +
    + + +
    +
    + +{{ end }} diff --git a/assets/templates/notebooks/index.tmpl b/assets/templates/notebooks/index.tmpl new file mode 100644 index 0000000..d6c64e2 --- /dev/null +++ b/assets/templates/notebooks/index.tmpl @@ -0,0 +1,3 @@ +{{define "page:content"}} + {{template "notebooks:list" .}} +{{end}} diff --git a/assets/templates/notebooks/list.tmpl b/assets/templates/notebooks/list.tmpl new file mode 100644 index 0000000..2344d62 --- /dev/null +++ b/assets/templates/notebooks/list.tmpl @@ -0,0 +1,84 @@ +{{define "notebooks:list"}} + +
    + + + + + + + + + {{ + range .notebooks + }} + + + + + {{ + end + }} + +
    Title + + +
    + {{.Title}} + + + +
    +
    +{{ end }} diff --git a/assets/templates/notebooks/list_title.tmpl b/assets/templates/notebooks/list_title.tmpl new file mode 100644 index 0000000..6a5be5e --- /dev/null +++ b/assets/templates/notebooks/list_title.tmpl @@ -0,0 +1,14 @@ +{{define "page:title"}} +
    +
    Notebooks
    +
    +
    + + +
    + +{{end}} diff --git a/assets/templates/notebooks/update_title.tmpl b/assets/templates/notebooks/update_title.tmpl new file mode 100644 index 0000000..2343a0b --- /dev/null +++ b/assets/templates/notebooks/update_title.tmpl @@ -0,0 +1,8 @@ +{{define "page:title"}} +
    +
    Edit Notebook
    +
    +
    + +
    +{{end}} diff --git a/assets/templates/pages/forgotten-password-confirmation.tmpl b/assets/templates/pages/forgotten-password-confirmation.tmpl new file mode 100644 index 0000000..c9e3993 --- /dev/null +++ b/assets/templates/pages/forgotten-password-confirmation.tmpl @@ -0,0 +1,6 @@ +{{define "page:title"}}Check your inbox{{end}} + +{{define "page:main"}} +

    Check your inbox

    +

    We've emailed you instructions for resetting your password. You should receive the email shortly.

    +{{end}} diff --git a/assets/templates/pages/forgotten-password.tmpl b/assets/templates/pages/forgotten-password.tmpl new file mode 100644 index 0000000..61a8b64 --- /dev/null +++ b/assets/templates/pages/forgotten-password.tmpl @@ -0,0 +1,21 @@ +{{define "page:title"}}Forgotten password{{end}} + +{{define "page:main"}} +

    Forgotten password

    +

    Enter your email address below and we'll send you instructions for setting a new password.

    +
    + + + {{if .Form.Validator.HasErrors}} +
    Something was wrong. Please correct the errors below and try again.
    + {{end}} +
    + + {{with .Form.Validator.FieldErrors.Email}} + {{.}} + {{end}} + +
    + +
    +{{end}} diff --git a/assets/templates/pages/home.tmpl b/assets/templates/pages/home.tmpl new file mode 100644 index 0000000..eb33d47 --- /dev/null +++ b/assets/templates/pages/home.tmpl @@ -0,0 +1,8 @@ +{{define "page:content"}} +
    + + {{ template "home:items" .}} + +
    + +{{ end }} diff --git a/assets/templates/pages/home_items.tmpl b/assets/templates/pages/home_items.tmpl new file mode 100644 index 0000000..76cf518 --- /dev/null +++ b/assets/templates/pages/home_items.tmpl @@ -0,0 +1,77 @@ +{{define "home:items"}} + +{{ $itemCount := 0 }} + +{{ range.items }} +
    +
    +
    +
    +
    + {{.Title}} + + {{.Title}} + +
    +
    + {{.Summary | markdownfy | safeHTML}} +
    +
    +
    + + + + + + + + +
    +
    + +
    +
    + {{ end }} + + {{ end }} \ No newline at end of file diff --git a/assets/templates/pages/home_title.tmpl b/assets/templates/pages/home_title.tmpl new file mode 100644 index 0000000..e26fd47 --- /dev/null +++ b/assets/templates/pages/home_title.tmpl @@ -0,0 +1,8 @@ +{{define "page:title"}} +
    +
    Dashboard
    +
    +
    + +
    +{{ end }} diff --git a/assets/templates/pages/login.tmpl b/assets/templates/pages/login.tmpl new file mode 100644 index 0000000..b767d28 --- /dev/null +++ b/assets/templates/pages/login.tmpl @@ -0,0 +1,22 @@ +{{define "page:title"}}Login{{ end }} + +{{define "page:content"}} + +
    +
    +

    BrainMinder

    +
    + +

    + + +

    +

    + + +

    + +
    +
    +
    +{{ end }} diff --git a/assets/templates/pages/password-reset-confirmation.tmpl b/assets/templates/pages/password-reset-confirmation.tmpl new file mode 100644 index 0000000..4e1833e --- /dev/null +++ b/assets/templates/pages/password-reset-confirmation.tmpl @@ -0,0 +1,6 @@ +{{define "page:title"}}Password reset successful{{end}} + +{{define "page:main"}} +

    Password reset successful

    +

    Please login.

    +{{end}} diff --git a/assets/templates/pages/password-reset.tmpl b/assets/templates/pages/password-reset.tmpl new file mode 100644 index 0000000..91e0247 --- /dev/null +++ b/assets/templates/pages/password-reset.tmpl @@ -0,0 +1,31 @@ +{{define "page:title"}}Set a new password{{end}} + +{{define "page:meta"}} + +{{end}} + +{{define "page:main"}} +{{if .InvalidLink}} +

    Invalid password reset link

    +

    The password reset link was invalid, possibly because it has already been used or has expired.

    +

    Get a new password reset link

    +{{else}} +

    Set a new password

    +

    Please enter a new password.

    +
    + + + {{if .Form.Validator.HasErrors}} +
    Something was wrong. Please correct the errors below and try again.
    + {{end}} +
    + + {{with .Form.Validator.FieldErrors.NewPassword}} + {{.}} + {{end}} + +
    + +
    +{{end}} +{{end}} diff --git a/assets/templates/pages/signup.tmpl b/assets/templates/pages/signup.tmpl new file mode 100644 index 0000000..faaa796 --- /dev/null +++ b/assets/templates/pages/signup.tmpl @@ -0,0 +1,28 @@ +{{define "page:title"}}Signup{{end}} + +{{define "page:content"}} +

    Signup

    + +
    + + + {{if .Form.Validator.HasErrors}} +
    Something was wrong. Please correct the errors below and try again.
    + {{end}} +
    + + {{with .Form.Validator.FieldErrors.Email}} + {{.}} + {{end}} + +
    +
    + + {{with .Form.Validator.FieldErrors.Password}} + {{.}} + {{end}} + +
    + +
    +{{end}} diff --git a/assets/templates/partials/footer.tmpl b/assets/templates/partials/footer.tmpl new file mode 100644 index 0000000..aa6d239 --- /dev/null +++ b/assets/templates/partials/footer.tmpl @@ -0,0 +1,9 @@ +{{define "partial:footer"}} + + + + + + + +{{end}} diff --git a/assets/templates/partials/message.tmpl b/assets/templates/partials/message.tmpl new file mode 100644 index 0000000..a68717c --- /dev/null +++ b/assets/templates/partials/message.tmpl @@ -0,0 +1,16 @@ +{{define "message"}} +{{ if len .messageContent}} +{{ $messageClass := ""}} +{{if eq .messageType "success"}} {{ $messageClass = "alert-success"}} +{{else if eq .messageType "failure"}} {{ $messageClass = "alert-failure"}} +{{ end }} +
    +

    {{.messageContent}}

    +
      + {{ range $field, $fieldMessage := .messageFieldErrors }} +
    • {{ $fieldMessage }}
    • + {{ end }} +
    +
    +{{ end }} +{{ end }} diff --git a/assets/templates/partials/nav.tmpl b/assets/templates/partials/nav.tmpl new file mode 100644 index 0000000..3f35783 --- /dev/null +++ b/assets/templates/partials/nav.tmpl @@ -0,0 +1,15 @@ +{{define "partial:nav"}} + +{{end}} diff --git a/assets/templates/partials/notebooks-list.tmpl b/assets/templates/partials/notebooks-list.tmpl new file mode 100644 index 0000000..c8ac920 --- /dev/null +++ b/assets/templates/partials/notebooks-list.tmpl @@ -0,0 +1,4 @@ + +{{define "partial:notebooks-list"}} +{{ widget_select "current_notebook_id" "" .current_notebook_id .notebooksList `hx-on:change="bm_sidebar_click('main-sidebar')" hx-post="/" hx-push-url="true" hx-target="#page-content" hx-trigger="change" id="current_notebook_id" class="w3-input w3-border"` }} +{{ end }} \ No newline at end of file diff --git a/assets/templates/partials/sidebar.tmpl b/assets/templates/partials/sidebar.tmpl new file mode 100644 index 0000000..d1dd6bf --- /dev/null +++ b/assets/templates/partials/sidebar.tmpl @@ -0,0 +1,128 @@ +{{define "partial:sidebar"}} + + + +{{ end }} diff --git a/assets/templates/partials/types-list.tmpl b/assets/templates/partials/types-list.tmpl new file mode 100644 index 0000000..25e0f80 --- /dev/null +++ b/assets/templates/partials/types-list.tmpl @@ -0,0 +1,23 @@ +{{define "partial:types-list"}} +
    + {{ range .typesList }} +
    +
    + +
    + +
    + {{ end }} +
    + {{ end }} \ No newline at end of file diff --git a/assets/templates/quickbox/add.tmpl b/assets/templates/quickbox/add.tmpl new file mode 100644 index 0000000..901dc10 --- /dev/null +++ b/assets/templates/quickbox/add.tmpl @@ -0,0 +1,10 @@ +{{define "quickbox:add"}} +
    +
    + + +
    +
    {{.quicknote.Note_rendered | safeHTML}}
    +
    +{{end}} \ No newline at end of file diff --git a/assets/templates/quickbox/list.tmpl b/assets/templates/quickbox/list.tmpl new file mode 100644 index 0000000..f6328a9 --- /dev/null +++ b/assets/templates/quickbox/list.tmpl @@ -0,0 +1,24 @@ +{{define "quickbox:list"}} +{{ $rowCount := 0 }} +{{ range .quicknotes}} +
    +
    + + +
    +
    {{.Note_rendered | safeHTML}}
    +
    +{{ end }} +{{ end }} \ No newline at end of file diff --git a/assets/templates/quickbox/transform.tmpl b/assets/templates/quickbox/transform.tmpl new file mode 100644 index 0000000..fb78fbd --- /dev/null +++ b/assets/templates/quickbox/transform.tmpl @@ -0,0 +1,107 @@ +{{define "page:content"}} + +{{ end }} diff --git a/assets/templates/types/create_title.tmpl b/assets/templates/types/create_title.tmpl new file mode 100644 index 0000000..25f33b8 --- /dev/null +++ b/assets/templates/types/create_title.tmpl @@ -0,0 +1,8 @@ +{{define "page:title"}} +
    +
    New Type
    +
    +
    + +
    +{{end}} diff --git a/assets/templates/types/field_new.tmpl b/assets/templates/types/field_new.tmpl new file mode 100644 index 0000000..5f7e752 --- /dev/null +++ b/assets/templates/types/field_new.tmpl @@ -0,0 +1,92 @@ +{{define "type:field_new"}} +
    +
    +
    + {{ widget_select (print "Fields-New-" .counter "-Widget_id") "Widget" "" .widgets `class="w3-input w3-border"` }} +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + + +
    +
    +
    +
    +

    + + +

    +

    + + +

    +

    + + +

    +
    +
    + {{ widget_select (print "Fields-" .Type_field_id "-Ui_section") "Section" "general" $.uisections `class="w3-input w3-border"` }} +
    +
    +
    + +
    +
    +{{ end }} diff --git a/assets/templates/types/fields.tmpl b/assets/templates/types/fields.tmpl new file mode 100644 index 0000000..8b61d17 --- /dev/null +++ b/assets/templates/types/fields.tmpl @@ -0,0 +1,112 @@ +{{define "types:fields"}} +{{ range .fields }} +
    +
    +
    +
    + {{ widget_select (print "Fields-" .Type_field_id "-Widget_id") "Widget" .Widget_id $.widgets `class="w3-input w3-border"` }} +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + {{ widget_select (print "Fields-" .Type_field_id "-Ui_section") "Section" .Ui_section $.uisections `class="w3-input w3-border"` }} +
    +
    +
    +

    + + +

    +

    + + +

    +

    + + +

    +
    + +
    +
    + + +
    +
    +{{ end }} +{{ end }} diff --git a/assets/templates/types/form.tmpl b/assets/templates/types/form.tmpl new file mode 100644 index 0000000..8459dcb --- /dev/null +++ b/assets/templates/types/form.tmpl @@ -0,0 +1,145 @@ +{{ define "page:content" }} +
    +
    + + +
    +
    +
    +

    + + +

    +

    + + +

    +
    +
    +

    + {{ widget_checkboxes "Notebooks" "Notebooks" .type.Notebooks .notebooks `class="w3-check"` }} +

    +
    +
    + +

    + + +

    + +

    + Show summary +

    + +

    + Show description +

    +
    + + + +

    + + Back +

    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +{{ end }} diff --git a/assets/templates/types/index.tmpl b/assets/templates/types/index.tmpl new file mode 100644 index 0000000..c240411 --- /dev/null +++ b/assets/templates/types/index.tmpl @@ -0,0 +1,3 @@ +{{define "page:content"}} + {{template "types:list" .}} +{{end}} diff --git a/assets/templates/types/list.tmpl b/assets/templates/types/list.tmpl new file mode 100644 index 0000000..ae75af4 --- /dev/null +++ b/assets/templates/types/list.tmpl @@ -0,0 +1,93 @@ +{{define "types:list"}} + +
    + + + + + + + + + {{ + range .types + }} + + + + + {{ + end + }} + +
    Title + + +
    + {{.Title}} + + + +
    +
    +{{ end }} diff --git a/assets/templates/types/list_title.tmpl b/assets/templates/types/list_title.tmpl new file mode 100644 index 0000000..c5c2e98 --- /dev/null +++ b/assets/templates/types/list_title.tmpl @@ -0,0 +1,15 @@ +{{define "page:title"}} +
    +
    Types
    +
    +
    + + +
    +{{end}} diff --git a/assets/templates/types/update_title.tmpl b/assets/templates/types/update_title.tmpl new file mode 100644 index 0000000..c4c9786 --- /dev/null +++ b/assets/templates/types/update_title.tmpl @@ -0,0 +1,9 @@ +{{define "page:title"}} +
    +
    Edit Type
    +
    +
    + +
    + +{{end}} diff --git a/cmd/web/application.go b/cmd/web/application.go new file mode 100644 index 0000000..2d86bd6 --- /dev/null +++ b/cmd/web/application.go @@ -0,0 +1,110 @@ +package main + +import ( + "crypto/rand" + "encoding/hex" + "log/slog" + "net/http" + "strconv" + "sync" + + "brainminder.speedtech.it/internal/database" + "brainminder.speedtech.it/internal/funcs" + "brainminder.speedtech.it/internal/smtp" + "brainminder.speedtech.it/models" + "github.com/gorilla/sessions" +) + +type application struct { + config config + db *database.DB + logger *slog.Logger + mailer *smtp.Mailer + sessionStore *sessions.CookieStore + wg sync.WaitGroup +} + +func (app *application) getCurrentNotebok_id(r *http.Request) int64 { + session, _ := app.sessionStore.Get(r, "session") + current_notebook_id := session.Values["current_notebook_id"] + var notebook_id int64 = -1 + if current_notebook_id != nil { + notebook_id, _ = strconv.ParseInt(current_notebook_id.(string), 10, 64) + } + return notebook_id +} + +func (app *application) saveSessionValue(w http.ResponseWriter, r *http.Request, name string, value any) { + session, err := app.sessionStore.Get(r, "sessions") + if err != nil { + app.serverError(w, r, err) + return + } + + session.Values[name] = value + + err = session.Save(r, w) + if err != nil { + app.serverError(w, r, err) + return + } +} + +func (app *application) getSessionValue(w http.ResponseWriter, r *http.Request, name string) any { + session, err := app.sessionStore.Get(r, "sessions") + if err != nil { + app.serverError(w, r, err) + return nil + } + + if value, isMapContainsKey := session.Values[name]; isMapContainsKey { + return value + } + return nil +} + +func (app *application) removeSessionValue(w http.ResponseWriter, r *http.Request, name string) { + session, err := app.sessionStore.Get(r, "sessions") + if err != nil { + app.serverError(w, r, err) + return + } + + delete(session.Values, name) + + err = session.Save(r, w) + if err != nil { + app.serverError(w, r, err) + } +} + +func (app *application) getCategoriesAsOptions() []funcs.WidgetOption { + categoryModel := &models.CategoryModel{DB: app.db} + return categoryModel.AllAsOptions() +} + +func (app *application) getCategoriesAsMap() map[string]string { + categoryModel := &models.CategoryModel{DB: app.db} + return categoryModel.AllAsMap() +} + +func (app *application) getTypesAsOptions(r *http.Request) []funcs.WidgetOption { + typeModel := &models.TypeModel{DB: app.db} + criteria := map[string]any{ + "notebook_id": app.getCurrentNotebok_id(r), + } + return typeModel.FindAsOptions(criteria) +} + +func (app *application) getNotebooksAsOptions() []funcs.WidgetOption { + notebookModel := &models.NotebookModel{DB: app.db} + return notebookModel.AllAsOptions(false) +} + +func (app *application) generateSecureToken(length int) string { + b := make([]byte, length) + if _, err := rand.Read(b); err != nil { + return "" + } + return hex.EncodeToString(b) +} diff --git a/cmd/web/categories_handler.go b/cmd/web/categories_handler.go new file mode 100644 index 0000000..01e66cb --- /dev/null +++ b/cmd/web/categories_handler.go @@ -0,0 +1,273 @@ +package main + +import ( + "bytes" + "fmt" + "net/http" + "strconv" + + "brainminder.speedtech.it/internal/request" + "brainminder.speedtech.it/internal/response" + "brainminder.speedtech.it/internal/validator" + "brainminder.speedtech.it/models" + "github.com/alexedwards/flow" +) + +type categoryForm struct { + Id int64 `form:"Id"` + Name string `form:"Name"` + Validator validator.Validator `form:"-"` +} + +func (form *categoryForm) Validate(w http.ResponseWriter, r *http.Request, app *application, data map[string]any) bool { + var fullBuf = new(bytes.Buffer) + + form.Validator.CheckField(form.Name != "", "Name", "Name is required") + + if form.Validator.HasErrors() { + w.Header().Add("HX-Retarget", "#message") + + data["messageType"] = "failure" + data["messageContent"] = "Impossible to save the type" + data["messageFieldErrors"] = form.Validator.FieldErrors + + buf, err := response.Fragment([]string{"partials/message.tmpl"}, "message", data) + if err != nil { + app.serverError(w, r, err) + } + fullBuf.Write(buf.Bytes()) + + if err != nil { + app.serverError(w, r, err) + } + fullBuf.WriteTo(w) + + w.WriteHeader(http.StatusUnprocessableEntity) + return false + } + + return true +} + +func (app *application) categories(w http.ResponseWriter, r *http.Request) { + data := app.newTemplateData(r) + + categoryModel := &models.CategoryModel{DB: app.db} + rows, _, _ := categoryModel.All() + + data["categories"] = &rows + data["messageType"] = "" + data["messageContent"] = "" + + if r.Header.Get("HX-Request") == "true" { + var fullBuf = new(bytes.Buffer) + + err := response.HXFragment(fullBuf, []string{"categories/list.tmpl"}, "categories:list", data) + if err != nil { + app.serverError(w, r, err) + } + + err = response.HXFragmentOOB(fullBuf, []string{"categories/list_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteTo(w) + } else { + err := response.Page(w, http.StatusOK, data, []string{"categories/index.tmpl", "categories/list.tmpl", "categories/list_title.tmpl"}) + if err != nil { + app.serverError(w, r, err) + } + } + + w.WriteHeader(http.StatusOK) +} + +func (app *application) categoryCreate(w http.ResponseWriter, r *http.Request) { + categoryModel := &models.CategoryModel{DB: app.db} + var fullBuf = new(bytes.Buffer) + var category_id int64 + + data := app.newTemplateData(r) + data["formAction"] = "/category/create" + data["formTarget"] = "#page-content" + data["messageType"] = "" + data["messageContent"] = "" + + switch r.Method { + case http.MethodGet: + + data["category"] = categoryForm{ + Name: "", + } + + if r.Header.Get("HX-Request") == "true" { + err := response.HXFragment(fullBuf, []string{"categories/form.tmpl"}, "page:content", data) + if err != nil { + app.serverError(w, r, err) + } + + err = response.HXFragmentOOB(fullBuf, []string{"categories/create_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteTo(w) + } else { + err := response.Page(w, http.StatusOK, data, []string{"categories/create_title.tmpl", "categories/form.tmpl"}) + if err != nil { + app.serverError(w, r, err) + } + } + + case http.MethodPost: + var categoryFromForm categoryForm + + err := request.DecodePostForm(r, &categoryFromForm) + if err != nil { + app.serverError(w, r, err) + } + + if !categoryFromForm.Validate(w, r, app, data) { + return + } + + category := &models.Category{ + Name: categoryFromForm.Name, + } + + category_id, err = categoryModel.Create(category) + if err != nil { + app.badRequest(w, err) + return + } + + data["formAction"] = fmt.Sprint("/category/update/", category_id) + data["formTarget"] = "#message" + + data["category"] = categoryForm{ + Id: category_id, + Name: category.Name, + } + + err = response.HXFragment(fullBuf, []string{"categories/form.tmpl"}, "page:content", data) + if err != nil { + app.serverError(w, r, err) + } + + err = response.HXFragmentOOB(fullBuf, []string{"categories/update_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + + dataMessage := make(map[string]string) + dataMessage["messageType"] = "success" + dataMessage["messageContent"] = "Category created successfully" + err = response.HXFragmentOOB(fullBuf, []string{"partials/message.tmpl"}, "message", dataMessage, "message") + if err != nil { + app.serverError(w, r, err) + } + + w.Header().Add("HX-Replace-Url", fmt.Sprint("/type/update/", category_id)) + fullBuf.WriteTo(w) + + w.WriteHeader(http.StatusUnprocessableEntity) + } +} + +func (app *application) categoryUpdate(w http.ResponseWriter, r *http.Request) { + categoryModel := &models.CategoryModel{DB: app.db} + category_id_str := flow.Param(r.Context(), "category_id") + category_id, _ := strconv.Atoi(category_id_str) + category, _, _ := categoryModel.One(category_id) + + data := app.newTemplateData(r) + data["formAction"] = "/category/update/" + category_id_str + data["formTarget"] = "#message" + data["messageType"] = "" + data["messageContent"] = "" + + var fullBuf = new(bytes.Buffer) + + switch r.Method { + case http.MethodGet: + + data["category"] = categoryForm{ + Id: category.Id, + Name: category.Name, + } + + if r.Header.Get("HX-Request") == "true" { + + err := response.HXFragment(fullBuf, []string{"categories/form.tmpl"}, "page:content", data) + if err != nil { + app.serverError(w, r, err) + } + + err = response.HXFragmentOOB(fullBuf, []string{"categories/update_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteTo(w) + } else { + err := response.Page(w, http.StatusOK, data, []string{"categories/update_title.tmpl", "categories/form.tmpl"}) + if err != nil { + app.serverError(w, r, err) + } + } + + case http.MethodPost: + var categoryFromForm categoryForm + + err := request.DecodePostForm(r, &categoryFromForm) + if err != nil { + app.serverError(w, r, err) + } + + if !categoryFromForm.Validate(w, r, app, data) { + return + } + + category.Name = categoryFromForm.Name + + err = categoryModel.Update(category) + if err != nil { + app.badRequest(w, err) + return + } + + data["category"] = categoryForm{ + Id: category.Id, + Name: category.Name, + } + + dataMessage := make(map[string]string) + dataMessage["messageType"] = "success" + dataMessage["messageContent"] = "Category saved successfully" + err = response.HXFragment(fullBuf, []string{"partials/message.tmpl"}, "message", dataMessage) + if err != nil { + app.serverError(w, r, err) + } + + err = response.HXFragmentOOB(fullBuf, []string{"categories/update_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteTo(w) + + w.WriteHeader(http.StatusUnprocessableEntity) + } +} + +func (app *application) categoryDelete(w http.ResponseWriter, r *http.Request) { + categoryModel := &models.CategoryModel{DB: app.db} + category_id_str := flow.Param(r.Context(), "category_id") + category_id, _ := strconv.Atoi(category_id_str) + + _, err := categoryModel.Delete(category_id) + if err != nil { + app.serverError(w, r, err) + } +} diff --git a/cmd/web/config.go b/cmd/web/config.go new file mode 100644 index 0000000..b80f91c --- /dev/null +++ b/cmd/web/config.go @@ -0,0 +1,24 @@ +package main + +type config struct { + baseURL string + httpPort int + cookie struct { + secretKey string + } + db struct { + dsn string + automigrate bool + } + session struct { + secretKey string + oldSecretKey string + } + smtp struct { + host string + port int + username string + password string + from string + } +} diff --git a/cmd/web/context.go b/cmd/web/context.go new file mode 100644 index 0000000..6b94200 --- /dev/null +++ b/cmd/web/context.go @@ -0,0 +1,28 @@ +package main + +import ( + "context" + "net/http" + + "brainminder.speedtech.it/internal/database" +) + +type contextKey string + +const ( + authenticatedUserContextKey = contextKey("authenticatedUser") +) + +func contextSetAuthenticatedUser(r *http.Request, user *database.User) *http.Request { + ctx := context.WithValue(r.Context(), authenticatedUserContextKey, user) + return r.WithContext(ctx) +} + +func contextGetAuthenticatedUser(r *http.Request) *database.User { + user, ok := r.Context().Value(authenticatedUserContextKey).(*database.User) + if !ok { + return nil + } + + return user +} diff --git a/cmd/web/errors.go b/cmd/web/errors.go new file mode 100644 index 0000000..c0832eb --- /dev/null +++ b/cmd/web/errors.go @@ -0,0 +1,35 @@ +package main + +import ( + "log/slog" + "net/http" + "runtime/debug" +) + +func (app *application) reportServerError(r *http.Request, err error) { + var ( + message = err.Error() + method = r.Method + url = r.URL.String() + trace = string(debug.Stack()) + ) + + requestAttrs := slog.Group("request", "method", method, "url", url) + app.logger.Error(message, requestAttrs, "trace", trace) +} + +func (app *application) serverError(w http.ResponseWriter, r *http.Request, err error) { + app.reportServerError(r, err) + + message := "The server encountered a problem and could not process your request" + http.Error(w, message, http.StatusInternalServerError) +} + +func (app *application) notFound(w http.ResponseWriter, r *http.Request) { + message := "The requested resource could not be found" + http.Error(w, message, http.StatusNotFound) +} + +func (app *application) badRequest(w http.ResponseWriter, err error) { + http.Error(w, err.Error(), http.StatusBadRequest) +} diff --git a/cmd/web/handlers.go b/cmd/web/handlers.go new file mode 100644 index 0000000..4ab7c6f --- /dev/null +++ b/cmd/web/handlers.go @@ -0,0 +1,437 @@ +package main + +import ( + "bytes" + "net/http" + "strconv" + "time" + + "brainminder.speedtech.it/internal/password" + "brainminder.speedtech.it/internal/request" + "brainminder.speedtech.it/internal/response" + "brainminder.speedtech.it/internal/token" + "brainminder.speedtech.it/internal/validator" + "brainminder.speedtech.it/models" + + "github.com/alexedwards/flow" +) + +func (app *application) home(w http.ResponseWriter, r *http.Request) { + session, _ := app.sessionStore.Get(r, "session") + current_notebook_id := session.Values["current_notebook_id"] + params := r.URL.Query() + + if r.Method == http.MethodPost { + err := r.ParseForm() + if err != nil { + app.serverError(w, r, err) + return + } + current_notebook_id = r.PostForm.Get("current_notebook_id") + session.Values["current_notebook_id"] = current_notebook_id + session.Save(r, w) + } + + var fullBuf = new(bytes.Buffer) + + data := app.newTemplateData(r) + itemModel := models.NewItemModel(app.db) + + var notebook_id int64 = -1 + if current_notebook_id != nil { + notebook_id, _ = strconv.ParseInt(current_notebook_id.(string), 10, 64) + } + + criteria := map[string]any{ + "On_dashboard": 1, + "notebook_id": notebook_id, + } + + offset_str := r.URL.Query().Get("offset") + if len(offset_str) == 0 { + offset_str = "0" + } + offset, _ := strconv.ParseInt(offset_str, 10, 64) + + items, _, _ := itemModel.Find(criteria, offset) + data["items"] = items + data["offset"] = offset + + if r.Header.Get("HX-Request") == "true" { + out := params.Get("out") + + if out == "items" { + err := response.HXFragment(fullBuf, []string{"pages/home_items.tmpl"}, "home:items", data) + if err != nil { + app.serverError(w, r, err) + } + } else { + err := response.HXFragment(fullBuf, []string{"pages/home.tmpl", "pages/home_items.tmpl"}, "page:content", data) + if err != nil { + app.serverError(w, r, err) + } + + err = response.HXFragmentOOB(fullBuf, []string{"pages/home_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + } + fullBuf.WriteTo(w) + } else { + err := response.Page(w, http.StatusOK, data, []string{"pages/home.tmpl", "pages/home_items.tmpl", "pages/home_title.tmpl"}) + if err != nil { + app.serverError(w, r, err) + } + } +} + +func (app *application) signup(w http.ResponseWriter, r *http.Request) { + var form struct { + Email string `form:"Email"` + Password string `form:"Password"` + Validator validator.Validator `form:"-"` + } + + switch r.Method { + case http.MethodGet: + data := app.newTemplateData(r) + data["Form"] = form + + err := response.Page(w, http.StatusOK, data, []string{"pages/signup.tmpl"}) + if err != nil { + app.serverError(w, r, err) + } + + case http.MethodPost: + err := request.DecodePostForm(r, &form) + if err != nil { + app.badRequest(w, err) + return + } + + _, found, err := app.db.GetUserByEmail(form.Email) + if err != nil { + app.serverError(w, r, err) + return + } + + form.Validator.CheckField(form.Email != "", "Email", "Email is required") + form.Validator.CheckField(validator.Matches(form.Email, validator.RgxEmail), "Email", "Must be a valid email address") + form.Validator.CheckField(!found, "Email", "Email is already in use") + + form.Validator.CheckField(form.Password != "", "Password", "Password is required") + form.Validator.CheckField(len(form.Password) >= 8, "Password", "Password is too short") + form.Validator.CheckField(len(form.Password) <= 72, "Password", "Password is too long") + form.Validator.CheckField(validator.NotIn(form.Password, password.CommonPasswords...), "Password", "Password is too common") + + if form.Validator.HasErrors() { + data := app.newTemplateData(r) + data["Form"] = form + + err := response.Page(w, http.StatusUnprocessableEntity, data, []string{"pages/signup.tmpl"}, "full") + if err != nil { + app.serverError(w, r, err) + } + return + } + + hashedPassword, err := password.Hash(form.Password) + if err != nil { + app.serverError(w, r, err) + return + } + + id, err := app.db.InsertUser(form.Email, hashedPassword) + if err != nil { + app.serverError(w, r, err) + return + } + + session, err := app.sessionStore.Get(r, "session") + if err != nil { + app.serverError(w, r, err) + return + } + + session.Values["userID"] = id + + err = session.Save(r, w) + if err != nil { + app.serverError(w, r, err) + return + } + + http.Redirect(w, r, "/", http.StatusSeeOther) + } +} + +func (app *application) login(w http.ResponseWriter, r *http.Request) { + var form struct { + Email string `form:"Email"` + Password string `form:"Password"` + Validator validator.Validator `form:"-"` + } + + switch r.Method { + case http.MethodGet: + data := app.newTemplateData(r) + data["Form"] = form + + err := response.Page(w, http.StatusOK, data, []string{"pages/login.tmpl"}, "full") + if err != nil { + app.serverError(w, r, err) + } + + case http.MethodPost: + err := request.DecodePostForm(r, &form) + if err != nil { + app.badRequest(w, err) + return + } + + user, found, err := app.db.GetUserByEmail(form.Email) + if err != nil { + app.serverError(w, r, err) + return + } + + form.Validator.CheckField(form.Email != "", "Email", "Email is required") + form.Validator.CheckField(found, "Email", "Email address could not be found") + + if found { + passwordMatches, err := password.Matches(form.Password, user.HashedPassword) + if err != nil { + app.serverError(w, r, err) + return + } + + form.Validator.CheckField(form.Password != "", "Password", "Password is required") + form.Validator.CheckField(passwordMatches, "Password", "Password is incorrect") + } + + if form.Validator.HasErrors() { + data := app.newTemplateData(r) + data["Form"] = form + + err := response.Page(w, http.StatusUnprocessableEntity, data, []string{"pages/login.tmpl"}, "full") + if err != nil { + app.serverError(w, r, err) + } + return + } + + session, err := app.sessionStore.Get(r, "session") + if err != nil { + app.serverError(w, r, err) + return + } + + session.Values["userID"] = user.ID + + redirectPath, ok := session.Values["redirectPathAfterLogin"].(string) + if ok { + delete(session.Values, "redirectPathAfterLogin") + } else { + redirectPath = "/" + } + + err = session.Save(r, w) + if err != nil { + app.serverError(w, r, err) + return + } + + http.Redirect(w, r, redirectPath, http.StatusSeeOther) + } +} + +func (app *application) logout(w http.ResponseWriter, r *http.Request) { + session, err := app.sessionStore.Get(r, "session") + if err != nil { + app.serverError(w, r, err) + return + } + + delete(session.Values, "userID") + + err = session.Save(r, w) + if err != nil { + app.serverError(w, r, err) + return + } + + http.Redirect(w, r, "/login", http.StatusSeeOther) +} + +func (app *application) forgottenPassword(w http.ResponseWriter, r *http.Request) { + var form struct { + Email string `form:"Email"` + Validator validator.Validator `form:"-"` + } + + switch r.Method { + case http.MethodGet: + data := app.newTemplateData(r) + data["Form"] = form + + err := response.Page(w, http.StatusOK, data, []string{"pages/forgotten-password.tmpl"}, "full") + if err != nil { + app.serverError(w, r, err) + } + + case http.MethodPost: + err := request.DecodePostForm(r, &form) + if err != nil { + app.badRequest(w, err) + return + } + + user, found, err := app.db.GetUserByEmail(form.Email) + if err != nil { + app.serverError(w, r, err) + return + } + + form.Validator.CheckField(form.Email != "", "Email", "Email is required") + form.Validator.CheckField(validator.Matches(form.Email, validator.RgxEmail), "Email", "Must be a valid email address") + form.Validator.CheckField(found, "Email", "No matching email found") + + if form.Validator.HasErrors() { + data := app.newTemplateData(r) + data["Form"] = form + + err := response.Page(w, http.StatusUnprocessableEntity, data, []string{"pages/forgotten-password.tmpl"}, "full") + if err != nil { + app.serverError(w, r, err) + } + return + } + + plaintextToken, err := token.New() + if err != nil { + app.serverError(w, r, err) + return + } + + hashedToken := token.Hash(plaintextToken) + + err = app.db.InsertPasswordReset(hashedToken, user.ID, 24*time.Hour) + if err != nil { + app.serverError(w, r, err) + return + } + + data := app.newEmailData() + data["PlaintextToken"] = plaintextToken + + err = app.mailer.Send(user.Email, data, "forgotten-password.tmpl") + if err != nil { + app.serverError(w, r, err) + return + } + + http.Redirect(w, r, "/forgotten-password-confirmation", http.StatusSeeOther) + } +} + +func (app *application) forgottenPasswordConfirmation(w http.ResponseWriter, r *http.Request) { + data := app.newTemplateData(r) + + err := response.Page(w, http.StatusOK, data, []string{"pages/forgotten-password-confirmation.tmpl"}, "full") + if err != nil { + app.serverError(w, r, err) + } +} + +func (app *application) passwordReset(w http.ResponseWriter, r *http.Request) { + plaintextToken := flow.Param(r.Context(), "plaintextToken") + + hashedToken := token.Hash(plaintextToken) + + passwordReset, found, err := app.db.GetPasswordReset(hashedToken) + if err != nil { + app.serverError(w, r, err) + return + } + + if !found { + data := app.newTemplateData(r) + data["InvalidLink"] = true + + err := response.Page(w, http.StatusUnprocessableEntity, data, []string{"pages/password-reset.tmpl"}, "full") + if err != nil { + app.serverError(w, r, err) + } + return + } + + var form struct { + NewPassword string `form:"NewPassword"` + Validator validator.Validator `form:"-"` + } + + switch r.Method { + case http.MethodGet: + data := app.newTemplateData(r) + data["Form"] = form + data["PlaintextToken"] = plaintextToken + + err := response.Page(w, http.StatusOK, data, []string{"pages/password-reset.tmpl"}) + if err != nil { + app.serverError(w, r, err) + } + + case http.MethodPost: + err := request.DecodePostForm(r, &form) + if err != nil { + app.badRequest(w, err) + return + } + + form.Validator.CheckField(form.NewPassword != "", "NewPassword", "New password is required") + form.Validator.CheckField(len(form.NewPassword) >= 8, "NewPassword", "New password is too short") + form.Validator.CheckField(len(form.NewPassword) <= 72, "NewPassword", "New password is too long") + form.Validator.CheckField(validator.NotIn(form.NewPassword, password.CommonPasswords...), "NewPassword", "New password is too common") + + if form.Validator.HasErrors() { + data := app.newTemplateData(r) + data["Form"] = form + data["PlaintextToken"] = plaintextToken + + err := response.Page(w, http.StatusUnprocessableEntity, data, []string{"pages/password-reset.tmpl"}, "full") + if err != nil { + app.serverError(w, r, err) + } + return + } + + hashedPassword, err := password.Hash(form.NewPassword) + if err != nil { + app.serverError(w, r, err) + return + } + + err = app.db.UpdateUserHashedPassword(passwordReset.UserID, hashedPassword) + if err != nil { + app.serverError(w, r, err) + return + } + + err = app.db.DeletePasswordResets(passwordReset.UserID) + if err != nil { + app.serverError(w, r, err) + return + } + + http.Redirect(w, r, "/password-reset-confirmation", http.StatusSeeOther) + } +} + +func (app *application) passwordResetConfirmation(w http.ResponseWriter, r *http.Request) { + data := app.newTemplateData(r) + + err := response.Page(w, http.StatusOK, data, []string{"pages/password-reset-confirmation.tmpl"}, "full") + if err != nil { + app.serverError(w, r, err) + } +} diff --git a/cmd/web/helpers.go b/cmd/web/helpers.go new file mode 100644 index 0000000..30789c3 --- /dev/null +++ b/cmd/web/helpers.go @@ -0,0 +1,63 @@ +package main + +import ( + "net/http" + + "brainminder.speedtech.it/internal/version" + "brainminder.speedtech.it/models" + "github.com/justinas/nosurf" +) + +func (app *application) newTemplateData(r *http.Request) map[string]any { + data := map[string]any{ + "AuthenticatedUser": contextGetAuthenticatedUser(r), + "CSRFToken": nosurf.Token(r), + "Version": version.Get(), + } + + typeModel := &models.TypeModel{DB: app.db} + + current_notebook_id := app.getCurrentNotebok_id(r) + criteria := map[string]any{ + "notebook_id": current_notebook_id, + } + + types, _, _ := typeModel.Find(criteria) + data["typesList"] = types + + notebookModel := &models.NotebookModel{DB: app.db} + data["notebooksList"] = notebookModel.AllAsOptions(true) + data["current_notebook_id"] = current_notebook_id + + return data +} + +func (app *application) newEmailData() map[string]any { + data := map[string]any{ + "BaseURL": app.config.baseURL, + } + + return data +} + +/* +func (app *application) backgroundTask(r *http.Request, fn func() error) { + app.wg.Add(1) + + go func() { + defer app.wg.Done() + + defer func() { + err := recover() + if err != nil { + app.reportServerError(r, fmt.Errorf("%s", err)) + } + }() + + err := fn() + if err != nil { + app.reportServerError(r, err) + } + }() +} +*/ diff --git a/cmd/web/items_handlers.go b/cmd/web/items_handlers.go new file mode 100644 index 0000000..b38b5ab --- /dev/null +++ b/cmd/web/items_handlers.go @@ -0,0 +1,918 @@ +package main + +import ( + "bytes" + "fmt" + "net/http" + "strconv" + "strings" + + "brainminder.speedtech.it/internal/request" + "brainminder.speedtech.it/internal/response" + "brainminder.speedtech.it/internal/validator" + "brainminder.speedtech.it/models" + "github.com/alexedwards/flow" +) + +type itemForm struct { + Id int64 `form:"Id"` + Type_id int64 `form:"Type_id"` + Title string `form:"Title"` + Summary string `form:"Summary"` + Description string `form:"Description"` + Notebooks []string `form:"Notebooks"` + Tags string `form:"Tags"` + On_dashboard int `form:"On_dashboard"` + Categories []string `form:"Categories"` + Type_icon string + Type_title string + Type_show_summary int + Type_show_description int + FieldsSection map[string][]models.Field + FieldsValues map[int64]map[int]string + Relations []models.ItemRelation + Validator validator.Validator `form:"-"` +} + +func (form *itemForm) Validate(w http.ResponseWriter, r *http.Request, app *application, data map[string]any) bool { + var fullBuf = new(bytes.Buffer) + + form.Validator.CheckField(form.Title != "", "Title", "Title is required") + //form.Validator.CheckField(form.Description != "", "Description", "Description is required") + + if form.Validator.HasErrors() { + w.Header().Add("HX-Retarget", "#message") + + data["messageType"] = "failure" + data["messageContent"] = "Impossible to save the item" + data["messageFieldErrors"] = form.Validator.FieldErrors + + err := response.HXFragment(fullBuf, []string{"partials/message.tmpl"}, "message", data) + if err != nil { + app.serverError(w, r, err) + } + fullBuf.WriteTo(w) + + w.WriteHeader(http.StatusUnprocessableEntity) + return false + } + + return true +} + +func (app *application) itemsRelationAdd(w http.ResponseWriter, r *http.Request) { + data := app.newTemplateData(r) + itemModel := models.NewItemModel(app.db) + categoryModel := &models.CategoryModel{DB: app.db} + var fullBuf = new(bytes.Buffer) + related_item_id, _ := strconv.ParseInt(flow.Param(r.Context(), "related_item_id"), 10, 64) + + relatedItem, _, _ := itemModel.One(related_item_id) + data["relatedItem"] = relatedItem + data["categoriesMap"] = categoryModel.AllAsMap() + + err := response.HXFragment(fullBuf, []string{"items/add_relation.tmpl"}, "item:add_relation", data) + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteTo(w) + w.WriteHeader(http.StatusOK) +} + +func (app *application) itemsSearch(w http.ResponseWriter, r *http.Request) { + data := app.newTemplateData(r) + itemModel := models.NewItemModel(app.db) + var fullBuf = new(bytes.Buffer) + + switch r.Method { + case http.MethodPost: + categoryModel := &models.CategoryModel{DB: app.db} + data["categoriesMap"] = categoryModel.AllAsMap() + + err := r.ParseForm() + if err != nil { + app.serverError(w, r, err) + return + } + + criteria := make(map[string]any) + criteria["notebook_id"] = app.getCurrentNotebok_id(r) + + rows, _, _ := itemModel.Search(r.PostForm.Get("SearchText"), criteria) + data["items"] = &rows + err = response.HXFragment(fullBuf, []string{"items/all_list.tmpl", "items/all_list_rows.tmpl", "items/add_to_dashboard.tmpl", "items/remove_from_dashboard.tmpl"}, "itemsAll:list", data) + if err != nil { + app.serverError(w, r, err) + } + + if r.Header.Get("HX-Target") == "page-content" { + err = response.HXFragmentOOB(fullBuf, []string{"items/all_list_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + } + + fullBuf.WriteTo(w) + } + w.WriteHeader(http.StatusOK) +} + +func (app *application) itemsSearchForRelations(w http.ResponseWriter, r *http.Request) { + + data := app.newTemplateData(r) + itemModel := models.NewItemModel(app.db) + var fullBuf = new(bytes.Buffer) + + categoryModel := &models.CategoryModel{DB: app.db} + data["categoriesMap"] = categoryModel.AllAsMap() + data["item_id"], _ = strconv.ParseInt(flow.Param(r.Context(), "item_id"), 10, 64) + + err := r.ParseForm() + if err != nil { + app.serverError(w, r, err) + return + } + + criteria := make(map[string]any) + criteria["notebook_id"] = app.getCurrentNotebok_id(r) + + rows, _, _ := itemModel.Search(r.Form.Get("SearchText"), criteria) + data["items"] = &rows + err = response.HXFragment(fullBuf, []string{"items/list_for_relations.tmpl"}, "items:list-for-relations", data) + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteTo(w) + w.WriteHeader(http.StatusOK) +} + +func (app *application) items(w http.ResponseWriter, r *http.Request) { + data := app.newTemplateData(r) + itemModel := models.NewItemModel(app.db) + var fullBuf = new(bytes.Buffer) + + categoryModel := &models.CategoryModel{DB: app.db} + data["categoriesMap"] = categoryModel.AllAsMap() + + params := r.URL.Query() + + offset_str := r.URL.Query().Get("offset") + if len(offset_str) == 0 { + offset_str = "0" + } + offset, _ := strconv.ParseInt(offset_str, 10, 64) + data["offset"] = offset + + switch r.Method { + case http.MethodGet: + + criteria := make(map[string]any) + + criteriaName := "itemsSearch" + data["criteriaName"] = criteriaName + + criteriaParam := r.URL.Query()["criteriaName"] + if len(criteriaParam) > 0 { + if criteriaParam[0] == criteriaName { + criteria_values := app.getSessionValue(w, r, criteriaName) + if criteria_values != nil { + criteria = criteria_values.(map[string]any) + } + } + } else { + app.removeSessionValue(w, r, criteriaName) + } + + criteria["notebook_id"] = app.getCurrentNotebok_id(r) + + rows, _, _ := itemModel.Find(criteria, offset) + + data["items"] = &rows + + if r.Header.Get("HX-Request") == "true" { + + out := params.Get("out") + + if out == "rows" { + err := response.HXFragment(fullBuf, []string{"items/all_list_rows.tmpl", "items/add_to_dashboard.tmpl", "items/remove_from_dashboard.tmpl"}, "itemsAll:list_rows", data) + if err != nil { + app.serverError(w, r, err) + } + } else { + err := response.HXFragment(fullBuf, []string{"items/all_list.tmpl", "items/all_list_rows.tmpl", "items/add_to_dashboard.tmpl", "items/remove_from_dashboard.tmpl"}, "itemsAll:list", data) + if err != nil { + app.serverError(w, r, err) + } + + err = response.HXFragmentOOB(fullBuf, []string{"items/all_list_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + } + + fullBuf.WriteTo(w) + } else { + err := response.Page(w, http.StatusOK, data, []string{"items/index_all.tmpl", "items/all_list.tmpl", "items/all_list_rows.tmpl", "items/add_to_dashboard.tmpl", "items/remove_from_dashboard.tmpl", "items/all_list_title.tmpl"}) + if err != nil { + app.serverError(w, r, err) + } + } + case http.MethodPost: + err := r.ParseForm() + if err != nil { + app.serverError(w, r, err) + return + } + + category_id, _ := strconv.ParseInt(r.PostForm.Get("category_id"), 10, 64) + criteria := map[string]any{ + "Title": r.PostForm.Get("Title"), + "Tags": r.PostForm.Get("Tags"), + "category_id": category_id, + } + + criteriaName := "itemsSearch" + data["criteriaName"] = criteriaName + app.saveSessionValue(w, r, criteriaName, criteria) + + rows, _, _ := itemModel.Find(criteria, offset) + data["items"] = &rows + err = response.HXFragment(fullBuf, []string{"items/all_list.tmpl", "items/all_list_rows.tmpl", "items/add_to_dashboard.tmpl", "items/remove_from_dashboard.tmpl"}, "itemsAll:list", data) + if err != nil { + app.serverError(w, r, err) + } + + if r.Header.Get("HX-Target") == "page-content" { + err = response.HXFragmentOOB(fullBuf, []string{"items/all_list_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + } + + fullBuf.WriteTo(w) + } + w.WriteHeader(http.StatusOK) +} + +func (app *application) itemsType(w http.ResponseWriter, r *http.Request) { + data := app.newTemplateData(r) + + type_id, _ := strconv.ParseInt(flow.Param(r.Context(), "type_id"), 10, 64) + + itemModel := models.NewItemModel(app.db) + typeModel := &models.TypeModel{DB: app.db} + aType, _, _ := typeModel.One(type_id) + fieldModel := &models.FieldModel{DB: app.db} + + fields, _, _ := fieldModel.ByTypeOnList(type_id) + data["type"] = &aType + data["Fields"] = fields + + categoryModel := &models.CategoryModel{DB: app.db} + data["categoriesMap"] = categoryModel.AllAsMap() + + params := r.URL.Query() + + offset_str := params.Get("offset") + if len(offset_str) == 0 { + offset_str = "0" + } + offset, _ := strconv.ParseInt(offset_str, 10, 64) + data["offset"] = offset + + var fullBuf = new(bytes.Buffer) + + switch r.Method { + case http.MethodGet: + + criteria := make(map[string]any) + + criteriaName := fmt.Sprintf("itemsTypeSearch_%d", type_id) + data["criteriaName"] = criteriaName + + criteriaParam := r.URL.Query()["criteriaName"] + if len(criteriaParam) > 0 { + if criteriaParam[0] == criteriaName { + criteria_values := app.getSessionValue(w, r, criteriaName) + if criteria_values != nil { + criteria = criteria_values.(map[string]any) + } + } + } else { + app.removeSessionValue(w, r, criteriaName) + } + + criteria["type_id"] = type_id + criteria["notebook_id"] = app.getCurrentNotebok_id(r) + + rows, _, _ := itemModel.Find(criteria, offset) + for i, row := range rows { + rows[i].FieldsValuesMap = fieldModel.GetFieldsValuesAsMap(row.Id) + } + + data["items"] = rows + + if r.Header.Get("HX-Request") == "true" { + out := params.Get("out") + + if out == "rows" { + err := response.HXFragment(fullBuf, []string{"items/list_rows.tmpl", "items/add_to_dashboard.tmpl", "items/remove_from_dashboard.tmpl"}, "items:list_rows", data) + if err != nil { + app.serverError(w, r, err) + } + } else { + err := response.HXFragment(fullBuf, []string{"items/list.tmpl", "items/list_rows.tmpl", "items/add_to_dashboard.tmpl", "items/remove_from_dashboard.tmpl"}, "items:list", data) + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteString("
    ") + err = response.HXFragmentOOB(fullBuf, []string{"items/list_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + } + fullBuf.WriteTo(w) + } else { + err := response.Page(w, http.StatusOK, data, []string{"items/index.tmpl", "items/list.tmpl", "items/list_rows.tmpl", "items/add_to_dashboard.tmpl", "items/remove_from_dashboard.tmpl", "items/list_title.tmpl"}) + if err != nil { + app.serverError(w, r, err) + } + } + case http.MethodPost: + err := r.ParseForm() + if err != nil { + app.serverError(w, r, err) + return + } + + category_id, _ := strconv.ParseInt(r.PostForm.Get("category_id"), 10, 64) + criteria := map[string]any{ + "Title": r.PostForm.Get("Title"), + "Tags": r.PostForm.Get("Tags"), + "category_id": category_id, + "type_id": type_id, + } + + criteriaName := fmt.Sprintf("itemsTypeSearch_%d", type_id) + data["criteriaName"] = criteriaName + app.saveSessionValue(w, r, criteriaName, criteria) + + rows, _, _ := itemModel.Find(criteria, offset) + for i, row := range rows { + rows[i].FieldsValuesMap = fieldModel.GetFieldsValuesAsMap(row.Id) + } + data["items"] = &rows + err = response.HXFragment(fullBuf, []string{"items/list.tmpl", "items/list_rows.tmpl", "items/add_to_dashboard.tmpl", "items/remove_from_dashboard.tmpl"}, "items:list", data) + if err != nil { + app.serverError(w, r, err) + } + fullBuf.WriteTo(w) + } + + w.WriteHeader(http.StatusOK) +} + +func (app *application) itemCreate(w http.ResponseWriter, r *http.Request) { + itemModel := models.NewItemModel(app.db) + fieldModel := &models.FieldModel{DB: app.db} + categoryModel := &models.CategoryModel{DB: app.db} + typeModel := &models.TypeModel{DB: app.db} + + type_id, _ := strconv.ParseInt(flow.Param(r.Context(), "type_id"), 10, 64) + + aType, _, _ := typeModel.One(type_id) + + data := app.newTemplateData(r) + data["type"] = aType + data["formAction"] = fmt.Sprint("/item/create/", type_id) + data["formTarget"] = "#page-content" + data["categories"] = categoryModel.AllAsOptions() + data["categoriesMap"] = categoryModel.AllAsMap() + + criteria := map[string]any{ + "notebook_id": app.getCurrentNotebok_id(r), + } + data["types"] = typeModel.FindAsOptions(criteria) + + notebookModel := &models.NotebookModel{DB: app.db} + data["notebooks"] = notebookModel.AllAsOptions(false) + + var fullBuf = new(bytes.Buffer) + var categories []string + + fieldsSection, _, _ := fieldModel.ByTypeSection(int64(type_id)) + fieldsValues := make(map[int64]map[int]string) + switch r.Method { + case http.MethodGet: + notebooks := []string{strconv.FormatInt(app.getCurrentNotebok_id(r), 10)} + + data["item"] = itemForm{ + Title: "", + Type_id: type_id, + Type_show_summary: aType.Show_summary, + Type_show_description: aType.Show_description, + Summary: "", + Description: "", + Tags: "", + FieldsSection: fieldsSection, + FieldsValues: fieldsValues, + Categories: categories, + Notebooks: notebooks, + Relations: nil, + } + + if r.Header.Get("HX-Request") == "true" { + + err := response.HXFragment(fullBuf, []string{"items/form.tmpl", "items/fields.tmpl", "items/relations.tmpl"}, "page:content", data) + if err != nil { + app.serverError(w, r, err) + } + + err = response.HXFragmentOOB(fullBuf, []string{"items/create_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + + w.Header().Add("HX-Trigger-After-Settle", `{"activateEasyMDE":"item-description"}`) + fullBuf.WriteTo(w) + } else { + err := response.Page(w, http.StatusOK, data, []string{"items/create_title.tmpl", "items/relations.tmpl", "items/form.tmpl", "items/fields.tmpl", "items/form_jscode.tmpl"}) + if err != nil { + app.serverError(w, r, err) + } + } + + case http.MethodPost: + var itemFromForm itemForm + var item_id int64 + + err := request.DecodePostForm(r, &itemFromForm) + if err != nil { + app.serverError(w, r, err) + } + + if !itemFromForm.Validate(w, r, app, data) { + return + } + + item := &models.Item{ + Type_id: itemFromForm.Type_id, + Title: itemFromForm.Title, + Summary: itemFromForm.Summary, + Description: itemFromForm.Description, + Tags: itemFromForm.Tags, + On_dashboard: itemFromForm.On_dashboard, + } + + notebooks_str := strings.Join(itemFromForm.Notebooks, "|") + if len(notebooks_str) > 0 { + notebooks_str = "|" + notebooks_str + "|" + } + item.Notebooks = notebooks_str + + categories_str := strings.Join(itemFromForm.Categories, "|") + if len(categories_str) > 0 { + categories_str = "|" + categories_str + "|" + } + item.Categories = categories_str + + item_id, err = itemModel.Create(item) + item.Id = item_id + if err != nil { + app.badRequest(w, err) + return + } + + fieldsValues := make(map[int64]map[int]string) + for name, values := range r.PostForm { + id_s, found := strings.CutPrefix(name, "FieldsValues-") + if found { + parts := strings.Split(id_s, "-") + type_field_id, _ := strconv.ParseInt(parts[0], 10, 64) + counter, _ := strconv.Atoi(parts[1]) + + _, found_key := fieldsValues[type_field_id] + if !found_key { + fieldsValues[type_field_id] = make(map[int]string) + } + fieldsValues[type_field_id][counter] = values[0] + } + + related_id_s, found := strings.CutPrefix(name, "ItemRelation-New-") + if found && len(values) > 0 { + related_item_id, _ := strconv.ParseInt(related_id_s, 10, 64) + itemModel.AddRelation(item.Id, related_item_id, values[0]) + } + } + + for type_field_id, values := range fieldsValues { + fieldModel.SaveValues(item.Id, type_field_id, values) + } + + item.Type_title = aType.Title + fields, _, _ := fieldModel.ByType(int64(type_id)) + itemModel.SaveKeywords(item, &fields, fieldsValues) + + data["formAction"] = fmt.Sprint("/item/update/", item_id) + data["formTarget"] = "#message" + + notebooks := strings.Split(strings.Trim(item.Notebooks, "|"), "|") + categories := strings.Split(strings.Trim(item.Categories, "|"), "|") + relations, _, _ := itemModel.GetRelations(item.Id) + + data["item"] = itemForm{ + Id: item_id, + Type_id: type_id, + Type_show_summary: aType.Show_summary, + Type_show_description: aType.Show_description, + Title: item.Title, + Summary: item.Summary, + Description: item.Description, + Tags: item.Tags, + Type_icon: item.Type_icon, + Type_title: item.Type_title, + FieldsSection: fieldsSection, + FieldsValues: fieldsValues, + Notebooks: notebooks, + Categories: categories, + Relations: relations, + } + + err = response.HXFragment(fullBuf, []string{"items/form.tmpl", "items/fields.tmpl", "items/relations.tmpl"}, "page:content", data) + if err != nil { + app.serverError(w, r, err) + } + + err = response.HXFragmentOOB(fullBuf, []string{"items/update_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + + dataMessage := make(map[string]string) + dataMessage["messageType"] = "success" + dataMessage["messageContent"] = "Item created successfully" + err = response.HXFragmentOOB(fullBuf, []string{"partials/message.tmpl"}, "message", dataMessage, "message") + if err != nil { + app.serverError(w, r, err) + } + + w.Header().Add("HX-Trigger-After-Settle", `{"activateEasyMDE":"item-description"}`) + w.Header().Add("HX-Replace-Url", fmt.Sprint("/item/update/", item_id)) + fullBuf.WriteTo(w) + + w.WriteHeader(http.StatusUnprocessableEntity) + } +} + +func (app *application) itemRead(w http.ResponseWriter, r *http.Request) { + data := app.newTemplateData(r) + item_id, _ := strconv.ParseInt(flow.Param(r.Context(), "item_id"), 10, 64) + itemModel := models.NewItemModel(app.db) + categoryModel := &models.CategoryModel{DB: app.db} + fieldModel := &models.FieldModel{DB: app.db} + relations, _, _ := itemModel.GetRelations(item_id) + + item, _, _ := itemModel.One(item_id) + + data["item"] = &item + data["relations"] = relations + data["categoriesMap"] = categoryModel.AllAsMap() + data["fields"] = fieldModel.GetFieldsValues(item_id) + + if r.Header.Get("HX-Request") == "true" { + var fullBuf = new(bytes.Buffer) + + err := response.HXFragment(fullBuf, []string{"items/read.tmpl", "items/relations_view.tmpl"}, "page:content", data) + if err != nil { + app.serverError(w, r, err) + } + + err = response.HXFragmentOOB(fullBuf, []string{"items/read_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteTo(w) + } else { + err := response.Page(w, http.StatusOK, data, []string{"items/read_title.tmpl", "items/relations_view.tmpl", "items/read.tmpl"}) + if err != nil { + app.serverError(w, r, err) + } + } + + w.WriteHeader(http.StatusOK) +} + +func (app *application) itemView(w http.ResponseWriter, r *http.Request) { + data := app.newTemplateData(r) + item_id, _ := strconv.ParseInt(flow.Param(r.Context(), "item_id"), 10, 64) + itemModel := models.NewItemModel(app.db) + categoryModel := &models.CategoryModel{DB: app.db} + fieldModel := &models.FieldModel{DB: app.db} + + item, _, _ := itemModel.One(item_id) + relations, _, _ := itemModel.GetRelations(item_id) + + data["item"] = &item + data["relations"] = relations + data["categoriesMap"] = categoryModel.AllAsMap() + data["fields"] = fieldModel.GetFieldsValues(item_id) + + if r.Header.Get("HX-Request") == "true" { + var fullBuf = new(bytes.Buffer) + err := response.HXFragment(fullBuf, []string{"items/view.tmpl", "items/relations_view.tmpl"}, "page:content", data) + if err != nil { + app.serverError(w, r, err) + } + fullBuf.WriteTo(w) + } else { + err := response.Page(w, http.StatusOK, data, []string{"items/read_title.tmpl", "items/relations_view.tmpl", "items/read.tmpl"}) + if err != nil { + app.serverError(w, r, err) + } + + } + + w.WriteHeader(http.StatusOK) +} + +func (app *application) itemUpdate(w http.ResponseWriter, r *http.Request) { + itemModel := models.NewItemModel(app.db) + fieldModel := &models.FieldModel{DB: app.db} + item_id_str := flow.Param(r.Context(), "item_id") + item_id, _ := strconv.ParseInt(flow.Param(r.Context(), "item_id"), 10, 64) + item, _, _ := itemModel.One(item_id) + fieldsSection, _, _ := fieldModel.ByTypeSection(item.Type_id) + fieldsValues := fieldModel.GetFieldsValuesAsMap(item.Id) + + data := app.newTemplateData(r) + data["formAction"] = "/item/update/" + item_id_str + data["formTarget"] = "#message" + + notebookModel := &models.NotebookModel{DB: app.db} + data["notebooks"] = notebookModel.AllAsOptions(false) + + categoryModel := &models.CategoryModel{DB: app.db} + data["categoriesMap"] = categoryModel.AllAsMap() + + var fullBuf = new(bytes.Buffer) + + switch r.Method { + case http.MethodGet: + + notebooks := strings.Split(strings.Trim(item.Notebooks, "|"), "|") + categories := strings.Split(strings.Trim(item.Categories, "|"), "|") + relations, _, _ := itemModel.GetRelations(item.Id) + + data["item"] = itemForm{ + Id: item.Id, + Type_id: item.Type_id, + Type_show_summary: item.Type_show_summary, + Type_show_description: item.Type_show_description, + Title: item.Title, + Summary: item.Summary, + Description: item.Description, + Tags: item.Tags, + On_dashboard: item.On_dashboard, + Type_icon: item.Type_icon, + Type_title: item.Type_title, + FieldsSection: fieldsSection, + FieldsValues: fieldsValues, + Categories: categories, + Notebooks: notebooks, + Relations: relations, + } + + data["categories"] = categoryModel.AllAsOptions() + + typeModel := &models.TypeModel{DB: app.db} + criteria := map[string]any{ + "notebook_id": app.getCurrentNotebok_id(r), + } + data["types"] = typeModel.FindAsOptions(criteria) + + if r.Header.Get("HX-Request") == "true" { + + err := response.HXFragment(fullBuf, []string{"items/form.tmpl", "items/fields.tmpl", "items/relations.tmpl"}, "page:content", data) + if err != nil { + app.serverError(w, r, err) + } + + err = response.HXFragmentOOB(fullBuf, []string{"items/update_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + + w.Header().Add("HX-Trigger-After-Settle", `{"activateEasyMDE":"item-description"}`) + fullBuf.WriteTo(w) + } else { + err := response.Page(w, http.StatusOK, data, []string{"items/update_title.tmpl", "items/form.tmpl", "items/fields.tmpl", "items/relations.tmpl", "items/form_jscode.tmpl"}) + if err != nil { + app.serverError(w, r, err) + } + } + + case http.MethodPost: + var itemFromForm itemForm + + err := request.DecodePostForm(r, &itemFromForm) + if err != nil { + app.serverError(w, r, err) + } + + if !itemFromForm.Validate(w, r, app, data) { + return + } + + item.Title = itemFromForm.Title + item.Type_id = itemFromForm.Type_id + item.Summary = itemFromForm.Summary + item.Description = itemFromForm.Description + item.Tags = itemFromForm.Tags + item.On_dashboard = itemFromForm.On_dashboard + + notebooks_str := strings.Join(itemFromForm.Notebooks, "|") + if len(notebooks_str) > 0 { + notebooks_str = "|" + notebooks_str + "|" + } + item.Notebooks = notebooks_str + + categories_str := strings.Join(itemFromForm.Categories, "|") + if len(categories_str) > 0 { + categories_str = "|" + categories_str + "|" + } + item.Categories = categories_str + + err = itemModel.Update(item) + if err != nil { + app.badRequest(w, err) + return + } + + fieldsValues := make(map[int64]map[int]string) + for name, values := range r.PostForm { + id_s, found := strings.CutPrefix(name, "FieldsValues-") + if found { + parts := strings.Split(id_s, "-") + type_field_id, _ := strconv.ParseInt(parts[0], 10, 64) + counter, _ := strconv.Atoi(parts[1]) + + valuesRemove, isMapContainsKey := r.PostForm["FieldsValuesToRemove-"+id_s] + if !isMapContainsKey || valuesRemove[0] == "0" { + _, found_key := fieldsValues[type_field_id] + if !found_key { + fieldsValues[type_field_id] = make(map[int]string) + } + fieldsValues[type_field_id][counter] = values[0] + } + } + related_id_s, found := strings.CutPrefix(name, "ItemRelation-New-") + if found && len(values) > 0 { + related_item_id, _ := strconv.ParseInt(related_id_s, 10, 64) + itemModel.AddRelation(item.Id, related_item_id, values[0]) + } + + id_s, found = strings.CutPrefix(name, "ItemRelation-") + if found && len(values) > 0 { + ids := strings.Split(id_s, "-") + item_id, _ := strconv.ParseInt(ids[0], 10, 64) + related_item_id, _ := strconv.ParseInt(ids[1], 10, 64) + valuesRemove, isMapContainsKey := r.PostForm["ItemRelation-ToRemove-"+id_s] + if isMapContainsKey && valuesRemove[0] == "1" { + itemModel.DeleteRelation(item_id, related_item_id) + } else { + itemModel.UpdateRelation(item_id, related_item_id, values[0]) + } + } + } + + for type_field_id, values := range fieldsValues { + fieldModel.SaveValues(item.Id, type_field_id, values) + } + + fields, _, _ := fieldModel.ByType(item.Type_id) + itemModel.SaveKeywords(item, &fields, fieldsValues) + + relations, _, _ := itemModel.GetRelations(item.Id) + + data["item"] = itemForm{ + Title: item.Title, + Type_icon: item.Type_icon, + Type_title: item.Type_title, + Relations: relations, + } + + data["FieldsSection"] = fieldsSection + data["FieldsValues"] = fieldsValues + + dataMessage := make(map[string]string) + dataMessage["messageType"] = "success" + dataMessage["messageContent"] = "Item saved successfully" + err = response.HXFragment(fullBuf, []string{"partials/message.tmpl"}, "message", dataMessage) + if err != nil { + app.serverError(w, r, err) + } + + err = response.HXFragmentOOB(fullBuf, []string{"items/update_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + + err = response.HXFragmentOOB(fullBuf, []string{"items/relations.tmpl"}, "item:relations", data, "relations") + if err != nil { + app.serverError(w, r, err) + } + + data["uisection"] = "general" + err = response.HXFragmentOOB(fullBuf, []string{"items/fields.tmpl"}, "items:fields", data, "fields-general") + if err != nil { + app.serverError(w, r, err) + } + + _, found := fieldsSection["fields"] + if found { + data["uisection"] = "fields" + err = response.HXFragmentOOB(fullBuf, []string{"items/fields.tmpl"}, "items:fields", data, "fields-fields") + if err != nil { + app.serverError(w, r, err) + } + } + + fullBuf.WriteTo(w) + + w.WriteHeader(http.StatusUnprocessableEntity) + } +} + +func (app *application) itemDelete(w http.ResponseWriter, r *http.Request) { + itemModel := models.NewItemModel(app.db) + item_id_str := flow.Param(r.Context(), "item_id") + item_id, _ := strconv.Atoi(item_id_str) + + _, err := itemModel.Delete(item_id) + if err != nil { + app.serverError(w, r, err) + } +} + +func (app *application) itemShare(w http.ResponseWriter, r *http.Request) { + itemModel := models.NewItemModel(app.db) + item_id, _ := strconv.ParseInt(flow.Param(r.Context(), "item_id"), 10, 64) + item, _, _ := itemModel.One(item_id) + var fullBuf = new(bytes.Buffer) + + data := app.newTemplateData(r) + data["item"] = item + data["baseUrl"] = app.config.baseURL + data["shareToken"] = app.generateSecureToken(18) + + err := response.HXFragment(fullBuf, []string{"items/share.tmpl"}, "page:content", data) + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteTo(w) +} + +func (app *application) itemAddToDashboard(w http.ResponseWriter, r *http.Request) { + itemModel := models.NewItemModel(app.db) + item_id, _ := strconv.ParseInt(flow.Param(r.Context(), "item_id"), 10, 64) + + err := itemModel.AddToDashboard(item_id) + if err != nil { + app.serverError(w, r, err) + } + + var fullBuf = new(bytes.Buffer) + + err = response.HXFragment(fullBuf, []string{"items/remove_from_dashboard.tmpl"}, "item:remove_from_dashboard", item_id) + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteTo(w) +} + +func (app *application) itemRemoveFromDashboard(w http.ResponseWriter, r *http.Request) { + itemModel := models.NewItemModel(app.db) + item_id, _ := strconv.ParseInt(flow.Param(r.Context(), "item_id"), 10, 64) + + err := itemModel.RemoveFromDashboard(item_id) + if err != nil { + app.serverError(w, r, err) + } + + if r.Method == http.MethodPost { + var fullBuf = new(bytes.Buffer) + + err := response.HXFragment(fullBuf, []string{"items/add_to_dashboard.tmpl"}, "item:add_to_dashboard", item_id) + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteTo(w) + } +} diff --git a/cmd/web/main.go b/cmd/web/main.go new file mode 100644 index 0000000..ae688cc --- /dev/null +++ b/cmd/web/main.go @@ -0,0 +1,92 @@ +package main + +import ( + "encoding/gob" + "flag" + "fmt" + "log/slog" + "net/http" + "os" + "runtime/debug" + + "brainminder.speedtech.it/internal/database" + "brainminder.speedtech.it/internal/env" + "brainminder.speedtech.it/internal/smtp" + "brainminder.speedtech.it/internal/version" + + "github.com/gorilla/sessions" + "github.com/lmittmann/tint" +) + +func main() { + gob.Register(map[string]any{}) + logger := slog.New(tint.NewHandler(os.Stdout, &tint.Options{Level: slog.LevelDebug})) + + err := run(logger) + if err != nil { + trace := string(debug.Stack()) + logger.Error(err.Error(), "trace", trace) + os.Exit(1) + } +} + +func run(logger *slog.Logger) error { + var cfg config + + cfg.baseURL = env.GetString("BASE_URL", "http://localhost:4445") + cfg.httpPort = env.GetInt("HTTP_PORT", 4445) + cfg.cookie.secretKey = env.GetString("COOKIE_SECRET_KEY", `CHANGE_THIS_COOKIE_KEY`) + cfg.db.dsn = env.GetString("DB_DSN", "db.sqlite") + cfg.db.automigrate = env.GetBool("DB_AUTOMIGRATE", true) + cfg.session.secretKey = env.GetString("SESSION_SECRET_KEY", `CHANGE_THIS_SESSION_KEY`) + cfg.session.oldSecretKey = env.GetString("SESSION_OLD_SECRET_KEY", "") + cfg.smtp.host = env.GetString("SMTP_HOST", "example.smtp.host") + cfg.smtp.port = env.GetInt("SMTP_PORT", 25) + cfg.smtp.username = env.GetString("SMTP_USERNAME", "example_username") + cfg.smtp.password = env.GetString("SMTP_PASSWORD", "pa55word") + cfg.smtp.from = env.GetString("SMTP_FROM", "Example Name ") + + showVersion := flag.Bool("version", false, "display version and exit") + + flag.Parse() + + if *showVersion { + fmt.Printf("version: %s\n", version.Get()) + return nil + } + + db, err := database.New(cfg.db.dsn, cfg.db.automigrate) + if err != nil { + return err + } + defer db.Close() + + mailer, err := smtp.NewMailer(cfg.smtp.host, cfg.smtp.port, cfg.smtp.username, cfg.smtp.password, cfg.smtp.from) + if err != nil { + return err + } + + keyPairs := [][]byte{[]byte(cfg.session.secretKey), nil} + if cfg.session.oldSecretKey != "" { + keyPairs = append(keyPairs, []byte(cfg.session.oldSecretKey), nil) + } + + sessionStore := sessions.NewCookieStore(keyPairs...) + sessionStore.Options = &sessions.Options{ + HttpOnly: true, + MaxAge: 86400 * 7, + Path: "/", + SameSite: http.SameSiteLaxMode, + Secure: true, + } + + app := &application{ + config: cfg, + db: db, + logger: logger, + mailer: mailer, + sessionStore: sessionStore, + } + + return app.serveHTTP() +} diff --git a/cmd/web/middleware.go b/cmd/web/middleware.go new file mode 100644 index 0000000..ae9b99b --- /dev/null +++ b/cmd/web/middleware.go @@ -0,0 +1,138 @@ +package main + +import ( + "fmt" + "log/slog" + "net/http" + + "brainminder.speedtech.it/internal/response" + "github.com/justinas/nosurf" + "github.com/tomasen/realip" +) + +func (app *application) recoverPanic(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + defer func() { + err := recover() + if err != nil { + app.serverError(w, r, fmt.Errorf("%s", err)) + } + }() + + next.ServeHTTP(w, r) + }) +} + +func (app *application) securityHeaders(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + w.Header().Set("Referrer-Policy", "origin-when-cross-origin") + w.Header().Set("X-Content-Type-Options", "nosniff") + w.Header().Set("X-Frame-Options", "deny") + w.Header().Set("Service-Worker-Allowed", "/") + + next.ServeHTTP(w, r) + }) +} + +func (app *application) logAccess(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + mw := response.NewMetricsResponseWriter(w) + next.ServeHTTP(mw, r) + + var ( + ip = realip.FromRequest(r) + method = r.Method + url = r.URL.String() + proto = r.Proto + ) + + userAttrs := slog.Group("user", "ip", ip) + requestAttrs := slog.Group("request", "method", method, "url", url, "proto", proto) + responseAttrs := slog.Group("response", "status", mw.StatusCode, "size", mw.BytesCount) + + app.logger.Info("access", userAttrs, requestAttrs, responseAttrs) + }) +} + +func (app *application) preventCSRF(next http.Handler) http.Handler { + csrfHandler := nosurf.New(next) + + csrfHandler.SetBaseCookie(http.Cookie{ + HttpOnly: true, + Path: "/", + MaxAge: 86400, + SameSite: http.SameSiteLaxMode, + Secure: true, + }) + + return csrfHandler +} + +func (app *application) authenticate(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + session, err := app.sessionStore.Get(r, "session") + if err != nil { + app.serverError(w, r, err) + return + } + + userID, ok := session.Values["userID"].(int) + if ok { + user, found, err := app.db.GetUser(userID) + if err != nil { + app.serverError(w, r, err) + return + } + + if found { + r = contextSetAuthenticatedUser(r, user) + } + } + + next.ServeHTTP(w, r) + }) +} + +func (app *application) requireAuthenticatedUser(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + authenticatedUser := contextGetAuthenticatedUser(r) + + if authenticatedUser == nil { + session, err := app.sessionStore.Get(r, "session") + if err != nil { + app.serverError(w, r, err) + return + } + + session.Values["redirectPathAfterLogin"] = r.URL.Path + + err = session.Save(r, w) + if err != nil { + app.serverError(w, r, err) + return + } + + http.Redirect(w, r, "/login", http.StatusSeeOther) + return + } + + w.Header().Add("Cache-Control", "no-store") + + next.ServeHTTP(w, r) + }) +} + +func (app *application) requireAnonymousUser(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + authenticatedUser := contextGetAuthenticatedUser(r) + + if authenticatedUser != nil { + http.Redirect(w, r, "/", http.StatusSeeOther) + return + + } + + next.ServeHTTP(w, r) + }) +} diff --git a/cmd/web/notebooks_handlers.go b/cmd/web/notebooks_handlers.go new file mode 100644 index 0000000..c494194 --- /dev/null +++ b/cmd/web/notebooks_handlers.go @@ -0,0 +1,299 @@ +package main + +import ( + "bytes" + "fmt" + "net/http" + "strconv" + + "brainminder.speedtech.it/internal/request" + "brainminder.speedtech.it/internal/response" + "brainminder.speedtech.it/internal/validator" + "brainminder.speedtech.it/models" + "github.com/alexedwards/flow" +) + +type notebookForm struct { + Id int64 `form:"Id"` + Title string `form:"Title"` + Icon string `form:"Icon"` + Description string `form:"Description"` + Fields []models.Field + Widgets []models.Widget + Validator validator.Validator `form:"-"` +} + +func (form *notebookForm) Validate(w http.ResponseWriter, r *http.Request, app *application, data map[string]any) bool { + var fullBuf = new(bytes.Buffer) + + form.Validator.CheckField(form.Title != "", "Title", "Title is required") + form.Validator.CheckField(form.Description != "", "Description", "Description is required") + + if form.Validator.HasErrors() { + w.Header().Add("HX-Retarget", "#message") + + data["messageType"] = "failure" + data["messageContent"] = "Impossible to save the notebook" + data["messageFieldErrors"] = form.Validator.FieldErrors + + buf, err := response.Fragment([]string{"partials/message.tmpl"}, "message", data) + if err != nil { + app.serverError(w, r, err) + } + fullBuf.Write(buf.Bytes()) + + if err != nil { + app.serverError(w, r, err) + } + fullBuf.WriteTo(w) + + w.WriteHeader(http.StatusUnprocessableEntity) + return false + } + + return true +} + +func (app *application) notebooks(w http.ResponseWriter, r *http.Request) { + data := app.newTemplateData(r) + notebookModel := &models.NotebookModel{DB: app.db} + var fullBuf = new(bytes.Buffer) + + rows, _, _ := notebookModel.All() + data["notebooks"] = &rows + if r.Header.Get("HX-Request") == "true" { + + err := response.HXFragment(fullBuf, []string{"notebooks/list.tmpl"}, "notebooks:list", data) + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteString("
    ") + err = response.HXFragmentOOB(fullBuf, []string{"notebooks/list_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteTo(w) + } else { + err := response.Page(w, http.StatusOK, data, []string{"notebooks/index.tmpl", "notebooks/list.tmpl", "notebooks/list_title.tmpl"}) + if err != nil { + app.serverError(w, r, err) + } + } + w.WriteHeader(http.StatusOK) + +} + +func (app *application) notebookCreate(w http.ResponseWriter, r *http.Request) { + notebookModel := &models.NotebookModel{DB: app.db} + var fullBuf = new(bytes.Buffer) + var notebook_id int64 + + data := app.newTemplateData(r) + data["formAction"] = "/notebook/create" + data["formTarget"] = "#page-content" + + switch r.Method { + case http.MethodGet: + + data["notebook"] = notebookForm{ + Title: "", + Icon: "", + Description: "", + } + + if r.Header.Get("HX-Request") == "true" { + err := response.HXFragment(fullBuf, []string{"notebooks/form.tmpl"}, "page:content", data) + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteString("
    ") + err = response.HXFragmentOOB(fullBuf, []string{"notebooks/create_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteTo(w) + } else { + err := response.Page(w, http.StatusOK, data, []string{"notebooks/create_title.tmpl", "notebooks/form.tmpl"}) + if err != nil { + app.serverError(w, r, err) + } + } + + case http.MethodPost: + var notebookFromForm notebookForm + + err := request.DecodePostForm(r, ¬ebookFromForm) + if err != nil { + app.serverError(w, r, err) + } + + if !notebookFromForm.Validate(w, r, app, data) { + return + } + + notebook := &models.Notebook{ + Title: notebookFromForm.Title, + Icon: notebookFromForm.Icon, + Description: notebookFromForm.Description, + } + + notebook_id, err = notebookModel.Create(notebook) + if err != nil { + app.badRequest(w, err) + return + } + + data["formAction"] = fmt.Sprint("/notebook/update/", notebook_id) + data["formTarget"] = "#message" + + data["notebook"] = notebookForm{ + Id: notebook_id, + Title: notebook.Title, + Icon: notebook.Icon, + Description: notebook.Description, + } + + err = response.HXFragment(fullBuf, []string{"notebooks/form.tmpl"}, "page:content", data) + if err != nil { + app.serverError(w, r, err) + } + + err = response.HXFragmentOOB(fullBuf, []string{"notebooks/update_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + + notebookModel := &models.NotebookModel{DB: app.db} + data["notebooksList"] = notebookModel.AllAsOptions(true) + err = response.HXFragmentOOB(fullBuf, []string{"partials/notebooks-list.tmpl"}, "partial:notebooks-list", data, "current_notebook_id") + if err != nil { + app.serverError(w, r, err) + } + + dataMessage := make(map[string]string) + dataMessage["messageType"] = "success" + dataMessage["messageContent"] = "Notebook created successfully" + err = response.HXFragmentOOB(fullBuf, []string{"partials/message.tmpl"}, "message", dataMessage, "message") + if err != nil { + app.serverError(w, r, err) + } + + w.Header().Add("HX-Replace-Url", fmt.Sprint("/notebook/update/", notebook_id)) + fullBuf.WriteTo(w) + + w.WriteHeader(http.StatusUnprocessableEntity) + } +} + +func (app *application) notebookUpdate(w http.ResponseWriter, r *http.Request) { + notebookModel := &models.NotebookModel{DB: app.db} + notebook_id_str := flow.Param(r.Context(), "notebook_id") + notebook_id, _ := strconv.ParseInt(notebook_id_str, 10, 64) + notebook, _, _ := notebookModel.One(notebook_id) + + data := app.newTemplateData(r) + data["formAction"] = "/notebook/update/" + notebook_id_str + data["formTarget"] = "#message" + + var fullBuf = new(bytes.Buffer) + + switch r.Method { + case http.MethodGet: + + data["notebook"] = notebookForm{ + Id: notebook.Id, + Title: notebook.Title, + Icon: notebook.Icon, + Description: notebook.Description, + } + + if r.Header.Get("HX-Request") == "true" { + + err := response.HXFragment(fullBuf, []string{"notebooks/form.tmpl"}, "page:content", data) + if err != nil { + app.serverError(w, r, err) + } + + err = response.HXFragmentOOB(fullBuf, []string{"notebooks/update_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteTo(w) + } else { + err := response.Page(w, http.StatusOK, data, []string{"notebooks/update_title.tmpl", "notebooks/form.tmpl"}) + if err != nil { + app.serverError(w, r, err) + } + } + + case http.MethodPost: + var notebookFromForm notebookForm + + err := request.DecodePostForm(r, ¬ebookFromForm) + if err != nil { + app.serverError(w, r, err) + } + + if !notebookFromForm.Validate(w, r, app, data) { + return + } + + notebook.Title = notebookFromForm.Title + notebook.Description = notebookFromForm.Description + notebook.Icon = notebookFromForm.Icon + + err = notebookModel.Update(notebook) + if err != nil { + app.badRequest(w, err) + return + } + + data["notebook"] = notebookForm{ + Id: notebook.Id, + Title: notebook.Title, + Icon: notebook.Icon, + Description: notebook.Description, + } + + dataMessage := make(map[string]string) + dataMessage["messageType"] = "success" + dataMessage["messageContent"] = "Notebook saved successfully" + err = response.HXFragment(fullBuf, []string{"partials/message.tmpl"}, "message", dataMessage) + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteString("
    ") + err = response.HXFragmentOOB(fullBuf, []string{"notebooks/update_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + + notebookModel := &models.NotebookModel{DB: app.db} + data["notebooksList"] = notebookModel.AllAsOptions(true) + err = response.HXFragmentOOB(fullBuf, []string{"partials/notebooks-list.tmpl"}, "partial:notebooks-list", data, "current_notebook_id") + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteTo(w) + + w.WriteHeader(http.StatusUnprocessableEntity) + } +} + +func (app *application) notebookDelete(w http.ResponseWriter, r *http.Request) { + notebookModel := &models.NotebookModel{DB: app.db} + notebook_id_str := flow.Param(r.Context(), "notebook_id") + notebook_id, _ := strconv.ParseInt(notebook_id_str, 10, 64) + + _, err := notebookModel.Delete(notebook_id) + if err != nil { + app.serverError(w, r, err) + } +} diff --git a/cmd/web/quickbox_handlers.go b/cmd/web/quickbox_handlers.go new file mode 100644 index 0000000..e977c07 --- /dev/null +++ b/cmd/web/quickbox_handlers.go @@ -0,0 +1,301 @@ +package main + +import ( + "bytes" + "fmt" + "net/http" + "strconv" + "strings" + + "brainminder.speedtech.it/internal/request" + "brainminder.speedtech.it/internal/response" + "brainminder.speedtech.it/internal/validator" + "brainminder.speedtech.it/models" + "github.com/alexedwards/flow" +) + +type quicknoteForm struct { + Id int64 `form:"Id"` + Note string `form:"Note"` + Note_rendered string `form:"Note_rendered"` + Validator validator.Validator `form:"-"` +} + +type quicknoteTransformForm struct { + Title string `form:"Title"` + Type_id int64 `form:"Type_id"` + Description string `form:"Description"` + Tags string `form:"Tags"` + Categories []string `form:"Categories"` + Notebooks []string `form:"Notebooks"` + Keep_in_quickbox int `form:"Keep_in_quickbox"` +} + +func (app *application) quickboxAll(w http.ResponseWriter, r *http.Request) { + var fullBuf = new(bytes.Buffer) + + data := app.newTemplateData(r) + + quicknoteModel := &models.QuicknoteModel{BaseModel: &models.BaseModel{DB: app.db}} + + params := r.URL.Query() + offset_str := params.Get("offset") + var offset int64 = 0 + if len(offset_str) == 0 { + offset = 0 + } else { + offset, _ = strconv.ParseInt(offset_str, 10, 64) + } + data["offset"] = offset + + rows, _, _ := quicknoteModel.AllQB(offset) + data["quicknotes"] = rows + + err := response.HXFragment(fullBuf, []string{"quickbox/list.tmpl"}, "quickbox:list", data) + if err != nil { + app.serverError(w, r, err) + } + fullBuf.WriteTo(w) + w.WriteHeader(http.StatusOK) +} + +func (app *application) quickboxAdd(w http.ResponseWriter, r *http.Request) { + quicknoteModel := models.NewQuicknoteModel(app.db) + var fullBuf = new(bytes.Buffer) + var quicknote_id int64 + data := app.newTemplateData(r) + + var quicknoteFromForm quicknoteForm + + err := request.DecodePostForm(r, &quicknoteFromForm) + if err != nil { + app.serverError(w, r, err) + } + + quicknote := &models.Quicknote{ + Note: quicknoteFromForm.Note, + } + + quicknote_id, err = quicknoteModel.Create(quicknote) + if err != nil { + app.badRequest(w, err) + return + } + + data["quicknote"] = quicknoteForm{ + Id: quicknote_id, + Note: quicknote.Note, + Note_rendered: quicknote.Note_rendered, + } + + err = response.HXFragment(fullBuf, []string{"quickbox/add.tmpl"}, "quickbox:add", data) + if err != nil { + app.serverError(w, r, err) + return + } + + w.Header().Add("HX-Trigger", `{"quickboxNoteClear": ""}`) + + fullBuf.WriteTo(w) + w.WriteHeader(http.StatusUnprocessableEntity) +} + +func (app *application) quickboxTransform(w http.ResponseWriter, r *http.Request) { + quicknoteModel := models.NewQuicknoteModel(app.db) + quicknote_id_str := flow.Param(r.Context(), "quicknote_id") + quicknote_id, _ := strconv.ParseInt(quicknote_id_str, 10, 64) + quicknote, _, _ := quicknoteModel.One(quicknote_id) + + data := app.newTemplateData(r) + + var fullBuf = new(bytes.Buffer) + + switch r.Method { + case http.MethodGet: + + data["quicknote"] = quicknoteForm{ + Id: quicknote.Id, + Note: quicknote.Note, + } + + data["categories"] = app.getCategoriesAsOptions() + data["categoriesMap"] = app.getCategoriesAsMap() + data["types"] = app.getTypesAsOptions(r) + data["notebooks"] = app.getNotebooksAsOptions() + + err := response.HXFragment(fullBuf, []string{"quickbox/transform.tmpl"}, "page:content", data) + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteTo(w) + + case http.MethodPost: + itemModel := models.NewItemModel(app.db) + var quicknoteTransformFromForm quicknoteTransformForm + + err := request.DecodePostForm(r, &quicknoteTransformFromForm) + if err != nil { + app.serverError(w, r, err) + } + + item := &models.Item{ + Type_id: quicknoteTransformFromForm.Type_id, + Title: quicknoteTransformFromForm.Title, + Description: quicknoteTransformFromForm.Description, + Tags: quicknoteTransformFromForm.Tags, + } + + notebooks_str := strings.Join(quicknoteTransformFromForm.Notebooks, "|") + if len(notebooks_str) > 0 { + notebooks_str = "|" + notebooks_str + "|" + } + item.Notebooks = notebooks_str + + categories_str := strings.Join(quicknoteTransformFromForm.Categories, "|") + if len(categories_str) > 0 { + categories_str = "|" + categories_str + "|" + } + item.Categories = categories_str + + item_id, err := itemModel.Create(item) + item.Id = item_id + + typeModel := &models.TypeModel{DB: app.db} + aType, _, _ := typeModel.One(item.Type_id) + item.Type_title = aType.Title + + fieldModel := &models.FieldModel{DB: app.db} + fields, _, _ := fieldModel.ByType(int64(item.Type_id)) + fieldsValues := make(map[int64]map[int]string) + + itemModel.SaveKeywords(item, &fields, fieldsValues) + + if err != nil { + app.badRequest(w, err) + return + } + + data["messageType"] = "success" + data["messageContent"] = "Quicknote transformed successfully" + err = response.HXFragment(fullBuf, []string{"partials/message.tmpl"}, "message", data) + if err != nil { + app.serverError(w, r, err) + } + + triggerResponse := fmt.Sprintf(`{"closeQuickboxTransformModal":{"quickNoteId": "%d", "keepQuickNote": "%d"}}`, quicknote_id, quicknoteTransformFromForm.Keep_in_quickbox) + w.Header().Add("HX-Trigger-After-Swap", triggerResponse) + fullBuf.WriteTo(w) + + w.WriteHeader(http.StatusUnprocessableEntity) + } +} + +func (app *application) quickboxUpdate(w http.ResponseWriter, r *http.Request) { + quicknoteModel := models.NewQuicknoteModel(app.db) + quicknote_id_str := flow.Param(r.Context(), "quicknote_id") + quicknote_id, _ := strconv.ParseInt(quicknote_id_str, 10, 64) + quicknote, _, _ := quicknoteModel.One(quicknote_id) + + data := app.newTemplateData(r) + data["formAction"] = "/quicknote/update/" + quicknote_id_str + data["formTarget"] = "#message" + data["messageType"] = "" + data["messageContent"] = "" + + var fullBuf = new(bytes.Buffer) + + switch r.Method { + case http.MethodGet: + + data["quicknote"] = quicknoteForm{ + Id: quicknote.Id, + Note: quicknote.Note, + } + + if r.Header.Get("HX-Request") == "true" { + + buf, err := response.Fragment([]string{"quicknotes/form.tmpl", "partials/message.tmpl"}, "page:content", data) + if err != nil { + app.serverError(w, r, err) + } + fullBuf.Write(buf.Bytes()) + + fullBuf.WriteString("
    ") + buf, err = response.Fragment([]string{"quicknotes/update_title.tmpl"}, "page:title", data) + if err != nil { + app.serverError(w, r, err) + } + fullBuf.Write(buf.Bytes()) + fullBuf.WriteString("
    ") + + fullBuf.WriteTo(w) + } else { + err := response.Page(w, http.StatusOK, data, []string{"quicknotes/update_title.tmpl", "quicknotes/form.tmpl", "partials/message.tmpl"}) + if err != nil { + app.serverError(w, r, err) + } + } + + case http.MethodPost: + var quicknoteFromForm quicknoteForm + + err := request.DecodePostForm(r, &quicknoteFromForm) + if err != nil { + app.serverError(w, r, err) + } + + quicknote.Note = quicknoteFromForm.Note + + err = quicknoteModel.Update(quicknote) + if err != nil { + app.badRequest(w, err) + return + } + + data["quicknote"] = quicknoteForm{ + Id: quicknote.Id, + Note: quicknote.Note, + } + + data["messageType"] = "success" + data["messageContent"] = "Quicknote saved successfully" + + buf, err := response.Fragment([]string{"partials/message.tmpl"}, "message", data) + if err != nil { + app.serverError(w, r, err) + } + fullBuf.Write(buf.Bytes()) + + fullBuf.WriteString("
    ") + buf, err = response.Fragment([]string{"quicknotes/update_title.tmpl"}, "page:title", data) + if err != nil { + app.serverError(w, r, err) + } + fullBuf.Write(buf.Bytes()) + fullBuf.WriteString("
    ") + + fullBuf.WriteString("
    ") + buf, err = response.Fragment([]string{"partials/quicknotes-list.tmpl"}, "partial:quicknotes-list", data) + if err != nil { + app.serverError(w, r, err) + } + fullBuf.Write(buf.Bytes()) + fullBuf.WriteString("
    ") + + fullBuf.WriteTo(w) + + w.WriteHeader(http.StatusUnprocessableEntity) + } +} + +func (app *application) quickboxDelete(w http.ResponseWriter, r *http.Request) { + quicknoteModel := models.NewQuicknoteModel(app.db) + quicknote_id_str := flow.Param(r.Context(), "quicknote_id") + quicknote_id, _ := strconv.ParseInt(quicknote_id_str, 10, 64) + + _, err := quicknoteModel.Delete(quicknote_id) + if err != nil { + app.serverError(w, r, err) + } +} diff --git a/cmd/web/routes.go b/cmd/web/routes.go new file mode 100644 index 0000000..1f71a47 --- /dev/null +++ b/cmd/web/routes.go @@ -0,0 +1,84 @@ +package main + +import ( + "net/http" + + "brainminder.speedtech.it/assets" + + "github.com/alexedwards/flow" +) + +func (app *application) routes() http.Handler { + mux := flow.New() + mux.NotFound = http.HandlerFunc(app.notFound) + + mux.Use(app.logAccess) + mux.Use(app.recoverPanic) + mux.Use(app.securityHeaders) + + fileServer := http.FileServer(http.FS(assets.EmbeddedFiles)) + + mux.Handle("/static/...", fileServer, "GET") + + mux.Group(func(mux *flow.Mux) { + mux.Use(app.preventCSRF) + mux.Use(app.authenticate) + + mux.Group(func(mux *flow.Mux) { + mux.Use(app.requireAnonymousUser) + mux.HandleFunc("/login", app.login, "GET", "POST") + }) + + mux.Group(func(mux *flow.Mux) { + mux.Use(app.requireAuthenticatedUser) + mux.HandleFunc("/logout", app.logout, "POST", "GET") + // To move + mux.HandleFunc("/signup", app.signup, "GET", "POST") + mux.HandleFunc("/forgotten-password", app.forgottenPassword, "GET", "POST") + mux.HandleFunc("/forgotten-password-confirmation", app.forgottenPasswordConfirmation, "GET") + mux.HandleFunc("/password-reset/:plaintextToken", app.passwordReset, "GET", "POST") + mux.HandleFunc("/password-reset-confirmation", app.passwordResetConfirmation, "GET") + //End to move + + mux.HandleFunc("/", app.home, "GET", "POST") + mux.HandleFunc("/item/relation/add/:related_item_id", app.itemsRelationAdd, "GET") + mux.HandleFunc("/items", app.items, "GET", "POST") + mux.HandleFunc("/items/search", app.items, "GET") + mux.HandleFunc("/items/search", app.itemsSearch, "POST") + mux.HandleFunc("/items/search-for-relations/:item_id", app.itemsSearchForRelations, "GET") + mux.HandleFunc("/items/type/:type_id", app.itemsType, "GET", "POST") + mux.HandleFunc("/item/create/:type_id", app.itemCreate, "GET", "POST") + mux.HandleFunc("/item/read/:item_id", app.itemRead, "GET") + mux.HandleFunc("/item/view/:item_id", app.itemView, "GET") + mux.HandleFunc("/item/update/:item_id", app.itemUpdate, "GET", "POST") + mux.HandleFunc("/item/delete/:item_id", app.itemDelete, "DELETE") + mux.HandleFunc("/item/share/:item_id", app.itemShare, "GET", "POST") + mux.HandleFunc("/item/add-to-dashboard/:item_id", app.itemAddToDashboard, "POST") + mux.HandleFunc("/item/remove-from-dashboard/:item_id", app.itemRemoveFromDashboard, "POST", "DELETE") + + mux.HandleFunc("/types", app.types, "GET") + mux.HandleFunc("/type/create", app.typeCreate, "GET", "POST") + mux.HandleFunc("/type/update/:type_id", app.typeUpdate, "GET", "POST") + mux.HandleFunc("/type/delete/:type_id", app.typeDelete, "DELETE") + mux.HandleFunc("/type/field-new", app.typeFieldNew, "GET") + + mux.HandleFunc("/categories", app.categories, "GET") + mux.HandleFunc("/category/create", app.categoryCreate, "GET", "POST") + mux.HandleFunc("/category/update/:category_id", app.categoryUpdate, "GET", "POST") + mux.HandleFunc("/category/delete/:category_id", app.categoryDelete, "DELETE") + + mux.HandleFunc("/notebooks", app.notebooks, "GET") + mux.HandleFunc("/notebook/create", app.notebookCreate, "GET", "POST") + mux.HandleFunc("/notebook/update/:notebook_id", app.notebookUpdate, "GET", "POST") + mux.HandleFunc("/notebook/delete/:notebook_id", app.notebookDelete, "DELETE") + + mux.HandleFunc("/quickbox/update/:quicknote_id", app.quickboxUpdate, "GET", "POST") + mux.HandleFunc("/quickbox/delete/:quicknote_id", app.quickboxDelete, "DELETE") + mux.HandleFunc("/quickbox/transform/:quicknote_id", app.quickboxTransform, "GET", "POST") + mux.HandleFunc("/quickbox/add", app.quickboxAdd, "POST") + mux.HandleFunc("/quickbox/all", app.quickboxAll, "GET") + }) + }) + + return mux +} diff --git a/cmd/web/server.go b/cmd/web/server.go new file mode 100644 index 0000000..30b2b62 --- /dev/null +++ b/cmd/web/server.go @@ -0,0 +1,61 @@ +package main + +import ( + "context" + "errors" + "fmt" + "log/slog" + "net/http" + "os" + "os/signal" + "syscall" + "time" +) + +const ( + defaultIdleTimeout = time.Minute + defaultReadTimeout = 5 * time.Second + defaultWriteTimeout = 10 * time.Second + defaultShutdownPeriod = 30 * time.Second +) + +func (app *application) serveHTTP() error { + srv := &http.Server{ + Addr: fmt.Sprintf(":%d", app.config.httpPort), + Handler: app.routes(), + ErrorLog: slog.NewLogLogger(app.logger.Handler(), slog.LevelWarn), + IdleTimeout: defaultIdleTimeout, + ReadTimeout: defaultReadTimeout, + WriteTimeout: defaultWriteTimeout, + } + + shutdownErrorChan := make(chan error) + + go func() { + quitChan := make(chan os.Signal, 1) + signal.Notify(quitChan, syscall.SIGINT, syscall.SIGTERM) + <-quitChan + + ctx, cancel := context.WithTimeout(context.Background(), defaultShutdownPeriod) + defer cancel() + + shutdownErrorChan <- srv.Shutdown(ctx) + }() + + app.logger.Info("starting server", slog.Group("server", "addr", srv.Addr)) + + err := srv.ListenAndServe() + if !errors.Is(err, http.ErrServerClosed) { + return err + } + + err = <-shutdownErrorChan + if err != nil { + return err + } + + app.logger.Info("stopped server", slog.Group("server", "addr", srv.Addr)) + + app.wg.Wait() + return nil +} diff --git a/cmd/web/types_handlers.go b/cmd/web/types_handlers.go new file mode 100644 index 0000000..6d91390 --- /dev/null +++ b/cmd/web/types_handlers.go @@ -0,0 +1,431 @@ +package main + +import ( + "bytes" + "fmt" + "net/http" + "strconv" + "strings" + + "brainminder.speedtech.it/internal/funcs" + "brainminder.speedtech.it/internal/request" + "brainminder.speedtech.it/internal/response" + "brainminder.speedtech.it/internal/validator" + "brainminder.speedtech.it/models" + "github.com/alexedwards/flow" +) + +type typeForm struct { + Id int64 `form:"Id"` + Title string `form:"Title"` + Icon string `form:"Icon"` + Description string `form:"Description"` + Show_summary int `form:"Show_summary"` + Show_description int `form:"Show_description"` + Notebooks []string `form:"Notebooks"` + Fields []models.Field + Widgets []models.Widget + Validator validator.Validator `form:"-"` +} + +func (form *typeForm) Validate(w http.ResponseWriter, r *http.Request, app *application, data map[string]any) bool { + var fullBuf = new(bytes.Buffer) + + form.Validator.CheckField(form.Title != "", "Title", "Title is required") + form.Validator.CheckField(form.Description != "", "Description", "Description is required") + + if form.Validator.HasErrors() { + w.Header().Add("HX-Retarget", "#message") + + data["messageType"] = "failure" + data["messageContent"] = "Impossible to save the type" + data["messageFieldErrors"] = form.Validator.FieldErrors + + err := response.HXFragment(fullBuf, []string{"partials/message.tmpl"}, "message", data) + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteTo(w) + + w.WriteHeader(http.StatusUnprocessableEntity) + return false + } + + return true +} + +func (app *application) types(w http.ResponseWriter, r *http.Request) { + data := app.newTemplateData(r) + typeModel := &models.TypeModel{DB: app.db} + + var fullBuf = new(bytes.Buffer) + + criteria := map[string]any{} + rows, _, _ := typeModel.Find(criteria) + data["types"] = &rows + if r.Header.Get("HX-Request") == "true" { + + err := response.HXFragment(fullBuf, []string{"types/list.tmpl"}, "types:list", data) + if err != nil { + app.serverError(w, r, err) + } + + err = response.HXFragmentOOB(fullBuf, []string{"types/list_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteTo(w) + } else { + err := response.Page(w, http.StatusOK, data, []string{"types/index.tmpl", "types/list.tmpl", "types/list_title.tmpl"}) + if err != nil { + app.serverError(w, r, err) + } + } + + w.WriteHeader(http.StatusOK) +} + +func (app *application) typeCreate(w http.ResponseWriter, r *http.Request) { + typeModel := &models.TypeModel{DB: app.db} + var fullBuf = new(bytes.Buffer) + var type_id int64 + + data := app.newTemplateData(r) + data["formAction"] = "/type/create" + data["formTarget"] = "#page-content" + + widgetModel := &models.WidgetModel{DB: app.db} + data["widgets"] = widgetModel.AllAsOptions() + data["uisections"] = widgetModel.UISections() + + notebookModel := &models.NotebookModel{DB: app.db} + data["notebooks"] = notebookModel.AllAsOptions(false) + + switch r.Method { + case http.MethodGet: + + notebooks := []string{strconv.FormatInt(app.getCurrentNotebok_id(r), 10)} + + data["type"] = typeForm{ + Title: "", + Icon: "", + Description: "", + Show_summary: 0, + Show_description: 0, + Notebooks: notebooks, + } + + if r.Header.Get("HX-Request") == "true" { + err := response.HXFragment(fullBuf, []string{"types/form.tmpl", "types/fields.tmpl"}, "page:content", data) + if err != nil { + app.serverError(w, r, err) + } + + err = response.HXFragmentOOB(fullBuf, []string{"types/create_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteTo(w) + } else { + err := response.Page(w, http.StatusOK, data, []string{"types/create_title.tmpl", "types/fields.tmpl", "types/form.tmpl"}) + if err != nil { + app.serverError(w, r, err) + } + } + + case http.MethodPost: + var typeFromForm typeForm + + err := request.DecodePostForm(r, &typeFromForm) + if err != nil { + app.serverError(w, r, err) + } + + if !typeFromForm.Validate(w, r, app, data) { + return + } + + aType := &models.Type{ + Title: typeFromForm.Title, + Icon: typeFromForm.Icon, + Description: typeFromForm.Description, + Show_summary: int(typeFromForm.Show_summary), + Show_description: int(typeFromForm.Show_description), + } + notebooks_str := strings.Join(typeFromForm.Notebooks, "|") + if len(notebooks_str) > 0 { + notebooks_str = "|" + notebooks_str + "|" + } + aType.Notebooks = notebooks_str + + type_id, err = typeModel.Create(aType) + if err != nil { + app.badRequest(w, err) + return + } + + typeModel.AddFields(type_id, r) + + data["formAction"] = fmt.Sprint("/type/update/", type_id) + data["formTarget"] = "#message" + + fieldModel := &models.FieldModel{DB: app.db} + fields, _, _ := fieldModel.ByType(type_id) + + data["type"] = typeForm{ + Id: type_id, + Title: aType.Title, + Icon: aType.Icon, + Description: aType.Description, + Show_summary: aType.Show_summary, + Show_description: aType.Show_description, + Fields: fields, + Notebooks: typeFromForm.Notebooks, + } + + err = response.HXFragment(fullBuf, []string{"types/form.tmpl", "types/fields.tmpl"}, "page:content", data) + if err != nil { + app.serverError(w, r, err) + } + + err = response.HXFragmentOOB(fullBuf, []string{"types/update_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + + criteria := map[string]any{ + "notebook_id": app.getCurrentNotebok_id(r), + } + types, _, _ := typeModel.Find(criteria) + data["typesList"] = types + err = response.HXFragmentOOB(fullBuf, []string{"partials/types-list.tmpl"}, "partial:types-list", data, "types-list") + if err != nil { + app.serverError(w, r, err) + } + + dataMessage := make(map[string]string) + dataMessage["messageType"] = "success" + dataMessage["messageContent"] = "Type created successfully" + err = response.HXFragmentOOB(fullBuf, []string{"partials/message.tmpl"}, "message", dataMessage, "message") + if err != nil { + app.serverError(w, r, err) + } + + w.Header().Add("HX-Replace-Url", fmt.Sprint("/type/update/", type_id)) + fullBuf.WriteTo(w) + + w.WriteHeader(http.StatusUnprocessableEntity) + } +} + +func (app *application) typeUpdate(w http.ResponseWriter, r *http.Request) { + typeModel := &models.TypeModel{DB: app.db} + fieldModel := &models.FieldModel{DB: app.db} + type_id_str := flow.Param(r.Context(), "type_id") + type_id, _ := strconv.ParseInt(type_id_str, 10, 64) + aType, _, _ := typeModel.One(type_id) + + data := app.newTemplateData(r) + data["formAction"] = "/type/update/" + type_id_str + data["formTarget"] = "#message" + data["messageType"] = "" + data["messageContent"] = "" + + widgetModel := &models.WidgetModel{DB: app.db} + data["widgets"] = widgetModel.AllAsOptions() + data["uisections"] = widgetModel.UISections() + + notebookModel := &models.NotebookModel{DB: app.db} + data["notebooks"] = notebookModel.AllAsOptions(false) + + var fullBuf = new(bytes.Buffer) + + switch r.Method { + case http.MethodGet: + + fields, _, _ := fieldModel.ByType(aType.Id) + + notebooks := strings.Split(strings.Trim(aType.Notebooks, "|"), "|") + + data["type"] = typeForm{ + Id: aType.Id, + Title: aType.Title, + Icon: aType.Icon, + Description: aType.Description, + Show_summary: aType.Show_summary, + Show_description: aType.Show_description, + Fields: fields, + Notebooks: notebooks, + } + + if r.Header.Get("HX-Request") == "true" { + + err := response.HXFragment(fullBuf, []string{"types/form.tmpl", "types/fields.tmpl"}, "page:content", data) + if err != nil { + app.serverError(w, r, err) + } + + err = response.HXFragmentOOB(fullBuf, []string{"types/update_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteTo(w) + } else { + err := response.Page(w, http.StatusOK, data, []string{"types/update_title.tmpl", "types/form.tmpl", "types/fields.tmpl"}) + if err != nil { + app.serverError(w, r, err) + } + } + + case http.MethodPost: + var typeFromForm typeForm + + err := request.DecodePostForm(r, &typeFromForm) + if err != nil { + app.serverError(w, r, err) + } + + if !typeFromForm.Validate(w, r, app, data) { + return + } + + aType.Title = typeFromForm.Title + aType.Description = typeFromForm.Description + aType.Icon = typeFromForm.Icon + aType.Show_summary = typeFromForm.Show_summary + aType.Show_description = typeFromForm.Show_description + notebooks_str := strings.Join(typeFromForm.Notebooks, "|") + if len(notebooks_str) > 0 { + notebooks_str = "|" + notebooks_str + "|" + } + aType.Notebooks = notebooks_str + + err = typeModel.Update(aType) + if err != nil { + app.badRequest(w, err) + return + } + + fieldsUpdate := make(map[int64]models.Field) + for name, values := range r.PostForm { + s, found := strings.CutPrefix(name, "Fields-") + if found { + parts := strings.Split(s, "-") + if len(parts) == 2 { + type_field_id, _ := strconv.ParseInt(parts[0], 10, 64) + type_field_attribute := parts[1] + + field, found := fieldsUpdate[type_field_id] + if !found { + field := &models.Field{Type_field_id: type_field_id} + fieldsUpdate[type_field_id] = *field + } + field = fieldsUpdate[type_field_id] + + switch type_field_attribute { + case "Widget_id": + field.Widget_id, _ = strconv.ParseInt(values[0], 10, 64) + case "Title": + field.Title = values[0] + case "Valid_values": + field.Valid_values = values[0] + case "Ui_section": + field.Ui_section = values[0] + case "Show_on_list": + field.Show_on_list, _ = strconv.ParseInt(values[0], 10, 64) + case "Show_on_view": + field.Show_on_view, _ = strconv.ParseInt(values[0], 10, 64) + case "Is_multiple": + field.Is_multiple, _ = strconv.ParseInt(values[0], 10, 64) + case "ToRemove": + field.ToRemove, _ = strconv.ParseInt(values[0], 10, 64) + } + fieldsUpdate[type_field_id] = field + } + } + } + + for id, field := range fieldsUpdate { + if field.ToRemove > 0 { + typeModel.RemoveField(id) + } else { + typeModel.SaveField(id, &field) + } + } + + typeModel.AddFields(type_id, r) + + data["type"] = typeForm{ + Id: aType.Id, + Title: aType.Title, + Icon: aType.Icon, + Description: aType.Description, + Show_summary: aType.Show_summary, + Show_description: aType.Show_description, + } + + dataMessage := make(map[string]string) + dataMessage["messageType"] = "success" + dataMessage["messageContent"] = "Type saved succesfully" + err = response.HXFragment(fullBuf, []string{"partials/message.tmpl"}, "message", dataMessage) + if err != nil { + app.serverError(w, r, err) + } + + err = response.HXFragmentOOB(fullBuf, []string{"types/update_title.tmpl"}, "page:title", data, "page-title") + if err != nil { + app.serverError(w, r, err) + } + + fieldData := make(map[string]any) + fields, _, _ := fieldModel.ByType(aType.Id) + + fieldData["fields"] = fields + fieldData["widgets"] = data["widgets"] + fieldData["uisections"] = widgetModel.UISections() + + err = response.HXFragmentOOB(fullBuf, []string{"types/fields.tmpl"}, "types:fields", fieldData, "fields-list") + if err != nil { + app.serverError(w, r, err) + } + + fullBuf.WriteTo(w) + + w.WriteHeader(http.StatusUnprocessableEntity) + } +} + +func (app *application) typeFieldNew(w http.ResponseWriter, r *http.Request) { + data := app.newTemplateData(r) + + data["counter"] = r.URL.Query()["counter"][0] + widgetModel := &models.WidgetModel{DB: app.db} + widgets, _, _ := widgetModel.All() + var selectOptions []funcs.WidgetOption + for _, widget := range widgets { + selectOptions = append(selectOptions, funcs.WidgetOption{Key: strconv.FormatInt(widget.Id, 10), Value: widget.Name}) + } + data["widgets"] = selectOptions + data["uisections"] = widgetModel.UISections() + + buf, err := response.Fragment([]string{"types/field_new.tmpl"}, "type:field_new", data) + if err != nil { + app.serverError(w, r, err) + } + buf.WriteTo(w) +} + +func (app *application) typeDelete(w http.ResponseWriter, r *http.Request) { + typeModel := &models.TypeModel{DB: app.db} + item_id_str := flow.Param(r.Context(), "type_id") + item_id, _ := strconv.Atoi(item_id_str) + + _, err := typeModel.Delete(item_id) + if err != nil { + app.serverError(w, r, err) + } +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..f7a4c39 --- /dev/null +++ b/go.mod @@ -0,0 +1,32 @@ +module brainminder.speedtech.it + +go 1.23 + +toolchain go1.23.0 + +require ( + github.com/alexedwards/flow v0.1.0 + github.com/go-playground/form/v4 v4.2.1 + github.com/golang-migrate/migrate/v4 v4.17.1 + github.com/gorilla/sessions v1.4.0 + github.com/jmoiron/sqlx v1.4.0 + github.com/justinas/nosurf v1.1.1 + github.com/lmittmann/tint v1.0.5 + github.com/mattn/go-sqlite3 v1.14.22 + github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce + github.com/wneessen/go-mail v0.4.3 + github.com/yuin/goldmark v1.7.4 + github.com/yuin/goldmark-highlighting v0.0.0-20220208100518-594be1970594 + golang.org/x/crypto v0.26.0 + golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa + golang.org/x/text v0.17.0 +) + +require ( + github.com/alecthomas/chroma v0.10.0 // indirect + github.com/dlclark/regexp2 v1.4.0 // indirect + github.com/gorilla/securecookie v1.1.2 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + go.uber.org/atomic v1.7.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..3855de2 --- /dev/null +++ b/go.sum @@ -0,0 +1,68 @@ +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/alecthomas/chroma v0.10.0 h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek= +github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s= +github.com/alexedwards/flow v0.1.0 h1:2JY6lesAFIxB5uEcm4coM6FM8tLNGZovVXqRRTic8a4= +github.com/alexedwards/flow v0.1.0/go.mod h1:RtjEm3RTnsKqwE98bem/60/9cxEyZ0AQEz8GUZ0X+Ww= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= +github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/form/v4 v4.2.1 h1:HjdRDKO0fftVMU5epjPW2SOREcZ6/wLUzEobqUGJuPw= +github.com/go-playground/form/v4 v4.2.1/go.mod h1:q1a2BY+AQUUzhl6xA/6hBetay6dEIhMHjgvJiGo6K7U= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/golang-migrate/migrate/v4 v4.17.1 h1:4zQ6iqL6t6AiItphxJctQb3cFqWiSpMnX7wLTPnnYO4= +github.com/golang-migrate/migrate/v4 v4.17.1/go.mod h1:m8hinFyWBn0SA4QKHuKh175Pm9wjmxj3S2Mia7dbXzM= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= +github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= +github.com/gorilla/sessions v1.4.0 h1:kpIYOp/oi6MG/p5PgxApU8srsSw9tuFbt46Lt7auzqQ= +github.com/gorilla/sessions v1.4.0/go.mod h1:FLWm50oby91+hl7p/wRxDth9bWSuk0qVL2emc7lT5ik= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= +github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= +github.com/justinas/nosurf v1.1.1 h1:92Aw44hjSK4MxJeMSyDa7jwuI9GR2J/JCQiaKvXXSlk= +github.com/justinas/nosurf v1.1.1/go.mod h1:ALpWdSbuNGy2lZWtyXdjkYv4edL23oSEgfBT1gPJ5BQ= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lmittmann/tint v1.0.5 h1:NQclAutOfYsqs2F1Lenue6OoWCajs5wJcP3DfWVpePw= +github.com/lmittmann/tint v1.0.5/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce h1:fb190+cK2Xz/dvi9Hv8eCYJYvIGUTN2/KLq1pT6CjEc= +github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= +github.com/wneessen/go-mail v0.4.3 h1:FN4Ge0lpPxKkXuw4PgJSffXlruDdMo25bamfkMzm+FE= +github.com/wneessen/go-mail v0.4.3/go.mod h1:zxOlafWCP/r6FEhAaRgH4IC1vg2YXxO0Nar9u0IScZ8= +github.com/yuin/goldmark v1.4.5/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg= +github.com/yuin/goldmark v1.7.4 h1:BDXOHExt+A7gwPCJgPIIq7ENvceR7we7rOS9TNoLZeg= +github.com/yuin/goldmark v1.7.4/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= +github.com/yuin/goldmark-highlighting v0.0.0-20220208100518-594be1970594 h1:yHfZyN55+5dp1wG7wDKv8HQ044moxkyGq12KFFMFDxg= +github.com/yuin/goldmark-highlighting v0.0.0-20220208100518-594be1970594/go.mod h1:U9ihbh+1ZN7fR5Se3daSPoz1CGF9IYtSvWwVQtnzGHU= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= +golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa h1:ELnwvuAXPNtPk1TJRuGkI9fDTwym6AYBu0qzT8AcHdI= +golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/cookies/cookies.go b/internal/cookies/cookies.go new file mode 100644 index 0000000..1b1a2c9 --- /dev/null +++ b/internal/cookies/cookies.go @@ -0,0 +1,150 @@ +package cookies + +import ( + "crypto/aes" + "crypto/cipher" + "crypto/hmac" + "crypto/rand" + "crypto/sha256" + "encoding/base64" + "errors" + "fmt" + "io" + "net/http" + "strings" +) + +var ( + ErrValueTooLong = errors.New("cookie value too long") + ErrInvalidValue = errors.New("invalid cookie value") +) + +func Write(w http.ResponseWriter, cookie http.Cookie) error { + cookie.Value = base64.URLEncoding.EncodeToString([]byte(cookie.Value)) + + if len(cookie.String()) > 4096 { + return ErrValueTooLong + } + + http.SetCookie(w, &cookie) + + return nil +} + +func Read(r *http.Request, name string) (string, error) { + cookie, err := r.Cookie(name) + if err != nil { + return "", err + } + + value, err := base64.URLEncoding.DecodeString(cookie.Value) + if err != nil { + return "", ErrInvalidValue + } + + return string(value), nil +} + +func WriteSigned(w http.ResponseWriter, cookie http.Cookie, secretKey string) error { + mac := hmac.New(sha256.New, []byte(secretKey)) + mac.Write([]byte(cookie.Name)) + mac.Write([]byte(cookie.Value)) + signature := mac.Sum(nil) + + cookie.Value = string(signature) + cookie.Value + + return Write(w, cookie) +} + +func ReadSigned(r *http.Request, name string, secretKey string) (string, error) { + signedValue, err := Read(r, name) + if err != nil { + return "", err + } + + if len(signedValue) < sha256.Size { + return "", ErrInvalidValue + } + + signature := signedValue[:sha256.Size] + value := signedValue[sha256.Size:] + + mac := hmac.New(sha256.New, []byte(secretKey)) + mac.Write([]byte(name)) + mac.Write([]byte(value)) + expectedSignature := mac.Sum(nil) + + if !hmac.Equal([]byte(signature), expectedSignature) { + return "", ErrInvalidValue + } + + return value, nil +} + +func WriteEncrypted(w http.ResponseWriter, cookie http.Cookie, secretKey string) error { + block, err := aes.NewCipher([]byte(secretKey)) + if err != nil { + return err + } + + aesGCM, err := cipher.NewGCM(block) + if err != nil { + return err + } + + nonce := make([]byte, aesGCM.NonceSize()) + _, err = io.ReadFull(rand.Reader, nonce) + if err != nil { + return err + } + + plaintext := fmt.Sprintf("%s:%s", cookie.Name, cookie.Value) + + encryptedValue := aesGCM.Seal(nonce, nonce, []byte(plaintext), nil) + + cookie.Value = string(encryptedValue) + + return Write(w, cookie) +} + +func ReadEncrypted(r *http.Request, name string, secretKey string) (string, error) { + encryptedValue, err := Read(r, name) + if err != nil { + return "", err + } + + block, err := aes.NewCipher([]byte(secretKey)) + if err != nil { + return "", err + } + + aesGCM, err := cipher.NewGCM(block) + if err != nil { + return "", err + } + + nonceSize := aesGCM.NonceSize() + + if len(encryptedValue) < nonceSize { + return "", ErrInvalidValue + } + + nonce := encryptedValue[:nonceSize] + ciphertext := encryptedValue[nonceSize:] + + plaintext, err := aesGCM.Open(nil, []byte(nonce), []byte(ciphertext), nil) + if err != nil { + return "", ErrInvalidValue + } + + expectedName, value, ok := strings.Cut(string(plaintext), ":") + if !ok { + return "", ErrInvalidValue + } + + if expectedName != name { + return "", ErrInvalidValue + } + + return value, nil +} diff --git a/internal/database/db.go b/internal/database/db.go new file mode 100644 index 0000000..b347213 --- /dev/null +++ b/internal/database/db.go @@ -0,0 +1,63 @@ +package database + +import ( + "context" + "errors" + "time" + + "brainminder.speedtech.it/assets" + + "github.com/golang-migrate/migrate/v4" + "github.com/golang-migrate/migrate/v4/source/iofs" + "github.com/jmoiron/sqlx" + + _ "github.com/golang-migrate/migrate/v4/database/sqlite3" + _ "github.com/mattn/go-sqlite3" +) + +const defaultTimeout = 3 * time.Second + +type DB struct { + *sqlx.DB +} + +func GetContext() (context.Context, context.CancelFunc) { + return context.WithTimeout(context.Background(), defaultTimeout) +} + +func New(dsn string, automigrate bool) (*DB, error) { + ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) + defer cancel() + + db, err := sqlx.ConnectContext(ctx, "sqlite3", dsn) + if err != nil { + return nil, err + } + + db.SetMaxOpenConns(25) + db.SetMaxIdleConns(25) + db.SetConnMaxIdleTime(5 * time.Minute) + db.SetConnMaxLifetime(2 * time.Hour) + + if automigrate { + iofsDriver, err := iofs.New(assets.EmbeddedFiles, "migrations") + if err != nil { + return nil, err + } + + migrator, err := migrate.NewWithSourceInstance("iofs", iofsDriver, "sqlite3://"+dsn) + if err != nil { + return nil, err + } + + err = migrator.Up() + switch { + case errors.Is(err, migrate.ErrNoChange): + break + case err != nil: + return nil, err + } + } + + return &DB{db}, nil +} diff --git a/internal/database/password_resets.go b/internal/database/password_resets.go new file mode 100644 index 0000000..9ece244 --- /dev/null +++ b/internal/database/password_resets.go @@ -0,0 +1,54 @@ +package database + +import ( + "context" + "database/sql" + "errors" + "time" +) + +type PasswordReset struct { + HashedToken string `db:"hashed_token"` + UserID int `db:"user_id"` + Expiry time.Time `db:"expiry"` +} + +func (db *DB) InsertPasswordReset(hashedToken string, userID int, ttl time.Duration) error { + ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) + defer cancel() + + query := ` + INSERT INTO password_resets (hashed_token, user_id, expiry) + VALUES ($1, $2, $3)` + + _, err := db.ExecContext(ctx, query, hashedToken, userID, time.Now().Add(ttl)) + return err +} + +func (db *DB) GetPasswordReset(hashedToken string) (*PasswordReset, bool, error) { + ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) + defer cancel() + + var passwordReset PasswordReset + + query := ` + SELECT * FROM password_resets + WHERE hashed_token = $1 AND expiry > $2` + + err := db.GetContext(ctx, &passwordReset, query, hashedToken, time.Now()) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + + return &passwordReset, true, err +} + +func (db *DB) DeletePasswordResets(userID int) error { + ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) + defer cancel() + + query := `DELETE FROM password_resets WHERE user_id = $1` + + _, err := db.ExecContext(ctx, query, userID) + return err +} diff --git a/internal/database/users.go b/internal/database/users.go new file mode 100644 index 0000000..3c4f7de --- /dev/null +++ b/internal/database/users.go @@ -0,0 +1,79 @@ +package database + +import ( + "context" + "database/sql" + "errors" + "time" +) + +type User struct { + ID int `db:"id"` + Created time.Time `db:"created"` + Email string `db:"email"` + Roles string `db:"roles"` + HashedPassword string `db:"hashed_password"` +} + +func (db *DB) InsertUser(email, hashedPassword string) (int, error) { + ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) + defer cancel() + + query := ` + INSERT INTO users (created, email, hashed_password) + VALUES ($1, $2, $3)` + + result, err := db.ExecContext(ctx, query, time.Now(), email, hashedPassword) + if err != nil { + return 0, err + } + + id, err := result.LastInsertId() + if err != nil { + return 0, err + } + + return int(id), err +} + +func (db *DB) GetUser(id int) (*User, bool, error) { + ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) + defer cancel() + + var user User + + query := `SELECT * FROM users WHERE id = $1` + + err := db.GetContext(ctx, &user, query, id) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + + return &user, true, err +} + +func (db *DB) GetUserByEmail(email string) (*User, bool, error) { + ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) + defer cancel() + + var user User + + query := `SELECT * FROM users WHERE email = $1` + + err := db.GetContext(ctx, &user, query, email) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + + return &user, true, err +} + +func (db *DB) UpdateUserHashedPassword(id int, hashedPassword string) error { + ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) + defer cancel() + + query := `UPDATE users SET hashed_password = $1 WHERE id = $2` + + _, err := db.ExecContext(ctx, query, hashedPassword, id) + return err +} diff --git a/internal/env/env.go b/internal/env/env.go new file mode 100644 index 0000000..d25a2e2 --- /dev/null +++ b/internal/env/env.go @@ -0,0 +1,43 @@ +package env + +import ( + "os" + "strconv" +) + +func GetString(key, defaultValue string) string { + value, exists := os.LookupEnv(key) + if !exists { + return defaultValue + } + + return value +} + +func GetInt(key string, defaultValue int) int { + value, exists := os.LookupEnv(key) + if !exists { + return defaultValue + } + + intValue, err := strconv.Atoi(value) + if err != nil { + panic(err) + } + + return intValue +} + +func GetBool(key string, defaultValue bool) bool { + value, exists := os.LookupEnv(key) + if !exists { + return defaultValue + } + + boolValue, err := strconv.ParseBool(value) + if err != nil { + panic(err) + } + + return boolValue +} diff --git a/internal/funcs/funcs.go b/internal/funcs/funcs.go new file mode 100644 index 0000000..4f9bba4 --- /dev/null +++ b/internal/funcs/funcs.go @@ -0,0 +1,488 @@ +package funcs + +import ( + "bytes" + "errors" + "fmt" + "html/template" + "math" + "net/url" + "slices" + "strconv" + "strings" + "time" + "unicode" + + "github.com/yuin/goldmark" + highlighting "github.com/yuin/goldmark-highlighting" + "golang.org/x/text/language" + "golang.org/x/text/message" +) + +type WidgetOption struct { + Key string + Value string +} + +const ( + day = 24 * time.Hour + year = 365 * day +) + +var printer = message.NewPrinter(language.English) + +var TemplateFuncs = template.FuncMap{ + // Time functions + "now": time.Now, + "timeSince": time.Since, + "timeUntil": time.Until, + "formatTime": formatTime, + "approxDuration": approxDuration, + + // String functions + "uppercase": strings.ToUpper, + "lowercase": strings.ToLower, + "pluralize": pluralize, + "slugify": slugify, + "safeHTML": safeHTML, + "renderFieldValue": renderFieldValue, + "renderFieldValues": renderFieldValues, + "stringToArray": stringToArray, + + // Slice functions + "join": strings.Join, + + // Number functions + "incr": incr, + "decr": decr, + "addI": addI, + "subI": subI, + "formatInt": formatInt, + "formatFloat": formatFloat, + + // Boolean functions + "yesno": yesno, + + // URL functions + "urlSetParam": urlSetParam, + "urlDelParam": urlDelParam, + + //Markdown render + "markdownfy": markdownfy, + + "linksList": linksList, + + //Widgets + "widget_relation_type": widget_relation_type, + "widget_text": widget_text, + "widget_select": widget_select, + "widget_checkboxes": widget_checkboxes, + "field_widget": field_widget, + + //Map + "map": tmap, +} + +func formatTime(format string, t time.Time) string { + return t.Format(format) +} + +func approxDuration(d time.Duration) string { + if d < time.Second { + return "less than 1 second" + } + + ds := int(math.Round(d.Seconds())) + if ds == 1 { + return "1 second" + } else if ds < 60 { + return fmt.Sprintf("%d seconds", ds) + } + + dm := int(math.Round(d.Minutes())) + if dm == 1 { + return "1 minute" + } else if dm < 60 { + return fmt.Sprintf("%d minutes", dm) + } + + dh := int(math.Round(d.Hours())) + if dh == 1 { + return "1 hour" + } else if dh < 24 { + return fmt.Sprintf("%d hours", dh) + } + + dd := int(math.Round(float64(d / day))) + if dd == 1 { + return "1 day" + } else if dd < 365 { + return fmt.Sprintf("%d days", dd) + } + + dy := int(math.Round(float64(d / year))) + if dy == 1 { + return "1 year" + } + + return fmt.Sprintf("%d years", dy) +} + +func pluralize(count any, singular string, plural string) (string, error) { + n, err := toInt64(count) + if err != nil { + return "", err + } + + if n == 1 { + return singular, nil + } + + return plural, nil +} + +func slugify(s string) string { + var buf bytes.Buffer + + for _, r := range s { + switch { + case r > unicode.MaxASCII: + continue + case unicode.IsLetter(r): + buf.WriteRune(unicode.ToLower(r)) + case unicode.IsDigit(r), r == '_', r == '-': + buf.WriteRune(r) + case unicode.IsSpace(r): + buf.WriteRune('-') + } + } + + return buf.String() +} + +func safeHTML(s string) template.HTML { + return template.HTML(s) +} + +func incr(i any) (int64, error) { + n, err := toInt64(i) + if err != nil { + return 0, err + } + + n++ + return n, nil +} + +func decr(i any) (int64, error) { + n, err := toInt64(i) + if err != nil { + return 0, err + } + + n-- + return n, nil +} + +func addI(i1 any, i2 any) (int64, error) { + i1_64, err := toInt64(i1) + if err != nil { + return 0, err + } + i2_64, err := toInt64(i2) + if err != nil { + return 0, err + } + + t := i1_64 + i2_64 + return t, nil +} + +func subI(i1 any, i2 any) (int64, error) { + i1_64, err := toInt64(i1) + if err != nil { + return 0, err + } + i2_64, err := toInt64(i2) + if err != nil { + return 0, err + } + + t := i1_64 - i2_64 + return t, nil +} + +func formatInt(i any) (string, error) { + n, err := toInt64(i) + if err != nil { + return "", err + } + + return printer.Sprintf("%d", n), nil +} + +func formatFloat(f float64, dp int) string { + format := "%." + strconv.Itoa(dp) + "f" + return printer.Sprintf(format, f) +} + +func yesno(b bool) string { + if b { + return "Yes" + } + + return "No" +} + +func urlSetParam(u *url.URL, key string, value any) *url.URL { + nu := *u + values := nu.Query() + + values.Set(key, fmt.Sprintf("%v", value)) + + nu.RawQuery = values.Encode() + return &nu +} + +func urlDelParam(u *url.URL, key string) *url.URL { + nu := *u + values := nu.Query() + + values.Del(key) + + nu.RawQuery = values.Encode() + return &nu +} + +func toInt64(i any) (int64, error) { + switch v := i.(type) { + case int: + return int64(v), nil + case int8: + return int64(v), nil + case int16: + return int64(v), nil + case int32: + return int64(v), nil + case int64: + return v, nil + case uint: + return int64(v), nil + case uint8: + return int64(v), nil + case uint16: + return int64(v), nil + case uint32: + return int64(v), nil + // Note: uint64 not supported due to risk of truncation. + case string: + return strconv.ParseInt(v, 10, 64) + } + + return 0, fmt.Errorf("unable to convert type %T to int", i) +} + +func markdownfy(s string) string { + markdown := goldmark.New( + goldmark.WithExtensions( + highlighting.Highlighting, + ), + ) + + var buf bytes.Buffer + markdown.Convert([]byte(s), &buf) + return buf.String() +} + +func stringToArray(s string, delim string) []string { + return strings.Split(strings.Trim(s, delim), delim) +} + +func renderFieldValueAsString(value string, widget string) string { + o := "" + widget = strings.ToLower(widget) + switch widget { + case "url": + if len(value) > 0 { + label, _ := strings.CutPrefix(value, "https://") + label, _ = strings.CutPrefix(label, "www.") + if len(label) > 20 { + label = label[:20] + " ..." + } + o = fmt.Sprintf("%v", value, value, label) + } + default: + o = strings.Trim(fmt.Sprint(value), "[]") + } + return o +} + +func renderFieldValue(value string, widget string) template.HTML { + return template.HTML(renderFieldValueAsString(value, widget)) +} + +func renderFieldValues(values map[int]string, widget string) template.HTML { + if len(values) > 0 { + var values_a []string + for _, value := range values { + values_a = append(values_a, renderFieldValueAsString(value, widget)) + } + + return template.HTML(strings.Join(values_a, ",")) + } + + return template.HTML("") +} + +func linksList(urls map[string]string, delim string) template.HTML { + o := "" + return template.HTML(o) +} + +func widget_relation_type(name string, value string, attributes string) template.HTML { + var options []WidgetOption + + options = append(options, WidgetOption{Key: "Parent", Value: "Parent"}) + options = append(options, WidgetOption{Key: "Child", Value: "Child"}) + options = append(options, WidgetOption{Key: "Link", Value: "Link"}) + + return widget_select(name, "", value, options, attributes) +} + +func widget_select(name string, label string, value any, options []WidgetOption, attributes string) template.HTML { + var values []string + + switch v := value.(type) { + case int64: + values = append(values, strconv.FormatInt(v, 10)) + case []int64: + for _, i := range v { + values = append(values, strconv.FormatInt(i, 10)) + } + case string: + if strings.HasPrefix(v, "|") && strings.HasSuffix(v, "|") { + values = strings.Split(strings.Trim(v, "|"), "|") + } else { + values = append(values, v) + } + case []string: + values = v + } + + o := "" + if len(label) > 0 { + o = fmt.Sprintf(``, name, label) + } + o = o + fmt.Sprintf(`` + return template.HTML(o) +} + +func widget_checkboxes(name string, label string, value any, options []WidgetOption, attributes string) template.HTML { + var values []string + + switch v := value.(type) { + case int64: + values = append(values, strconv.FormatInt(v, 10)) + case []int64: + for _, i := range v { + values = append(values, strconv.FormatInt(i, 10)) + } + case string: + if strings.HasPrefix(v, "|") && strings.HasSuffix(v, "|") { + values = strings.Split(strings.Trim(v, "|"), "|") + } else { + values = append(values, v) + } + case []string: + values = v + } + + o := "" + o = o + "
    " + if len(label) > 0 { + o = o + fmt.Sprintf(``, label) + } + checked := "" + for _, option := range options { + checked = "" + if slices.Contains(values, option.Key) { + checked = `checked="checked"` + } + id_str := strings.ReplaceAll(name+"-"+option.Key, " ", "-") + o = o + "

    " + o = o + fmt.Sprintf(``, id_str, id_str, name, checked, option.Key, attributes) + o = o + fmt.Sprintf(`%v`, id_str, option.Value) + o = o + "

    " + } + o = o + "" + return template.HTML(o) +} + +func widget_text(name string, label string, value string, attributes string) template.HTML { + o := "" + if len(label) > 0 { + o = o + fmt.Sprintf(``, name, label) + } + o = o + fmt.Sprintf(``, name, name, value, attributes) + return template.HTML(o) +} + +func widget_url(name string, label string, value string, attributes string) template.HTML { + o := "" + if len(label) > 0 { + o = o + fmt.Sprintf(``, name, label) + } + o = o + fmt.Sprintf(``, name, name, value, attributes) + return template.HTML(o) +} + +func field_widget(widget string, bm_type_field_id int64, counter int, label string, value string, valid_values string, attributes string) template.HTML { + widget_name := fmt.Sprintf("FieldsValues-%v-%v", bm_type_field_id, counter) + var options []WidgetOption + + switch widget { + case "select": + entries := strings.Split(valid_values, "|") + for _, entry := range entries { + parts := strings.Split(entry, ",") + if len(parts) == 2 { + options = append(options, WidgetOption{Key: parts[0], Value: parts[1]}) + } else if len(parts) == 1 { + options = append(options, WidgetOption{Key: parts[0], Value: parts[0]}) + } + } + return widget_select(widget_name, label, value, options, attributes) + case "text": + return widget_text(widget_name, label, value, attributes) + case "url": + return widget_url(widget_name, label, value, attributes) + } + + return template.HTML("") +} + +func tmap(pairs ...any) (map[string]any, error) { + if len(pairs)%2 != 0 { + return nil, errors.New("misaligned map") + } + + m := make(map[string]any, len(pairs)/2) + + for i := 0; i < len(pairs); i += 2 { + key, ok := pairs[i].(string) + if !ok { + return nil, fmt.Errorf("cannot use type %T as map key", pairs[i]) + } + m[key] = pairs[i+1] + } + return m, nil +} diff --git a/internal/password/common.go b/internal/password/common.go new file mode 100644 index 0000000..0b27136 --- /dev/null +++ b/internal/password/common.go @@ -0,0 +1,10006 @@ +package password + +// CommonPasswords list is from +// https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/10k-most-common.txt +var CommonPasswords = []string{ + "password", + "123456", + "12345678", + "1234", + "qwerty", + "12345", + "dragon", + "pussy", + "baseball", + "football", + "letmein", + "monkey", + "696969", + "abc123", + "mustang", + "michael", + "shadow", + "master", + "jennifer", + "111111", + "2000", + "jordan", + "superman", + "harley", + "1234567", + "fuckme", + "hunter", + "fuckyou", + "trustno1", + "ranger", + "buster", + "thomas", + "tigger", + "robert", + "soccer", + "fuck", + "batman", + "test", + "pass", + "killer", + "hockey", + "george", + "charlie", + "andrew", + "michelle", + "love", + "sunshine", + "jessica", + "asshole", + "6969", + "pepper", + "daniel", + "access", + "123456789", + "654321", + "joshua", + "maggie", + "starwars", + "silver", + "william", + "dallas", + "yankees", + "123123", + "ashley", + "666666", + "hello", + "amanda", + "orange", + "biteme", + "freedom", + "computer", + "sexy", + "thunder", + "nicole", + "ginger", + "heather", + "hammer", + "summer", + "corvette", + "taylor", + "fucker", + "austin", + "1111", + "merlin", + "matthew", + "121212", + "golfer", + "cheese", + "princess", + "martin", + "chelsea", + "patrick", + "richard", + "diamond", + "yellow", + "bigdog", + "secret", + "asdfgh", + "sparky", + "cowboy", + "camaro", + "anthony", + "matrix", + "falcon", + "iloveyou", + "bailey", + "guitar", + "jackson", + "purple", + "scooter", + "phoenix", + "aaaaaa", + "morgan", + "tigers", + "porsche", + "mickey", + "maverick", + "cookie", + "nascar", + "peanut", + "justin", + "131313", + "money", + "horny", + "samantha", + "panties", + "steelers", + "joseph", + "snoopy", + "boomer", + "whatever", + "iceman", + "smokey", + "gateway", + "dakota", + "cowboys", + "eagles", + "chicken", + "dick", + "black", + "zxcvbn", + "please", + "andrea", + "ferrari", + "knight", + "hardcore", + "melissa", + "compaq", + "coffee", + "booboo", + "bitch", + "johnny", + "bulldog", + "xxxxxx", + "welcome", + "james", + "player", + "ncc1701", + "wizard", + "scooby", + "charles", + "junior", + "internet", + "bigdick", + "mike", + "brandy", + "tennis", + "blowjob", + "banana", + "monster", + "spider", + "lakers", + "miller", + "rabbit", + "enter", + "mercedes", + "brandon", + "steven", + "fender", + "john", + "yamaha", + "diablo", + "chris", + "boston", + "tiger", + "marine", + "chicago", + "rangers", + "gandalf", + "winter", + "bigtits", + "barney", + "edward", + "raiders", + "porn", + "badboy", + "blowme", + "spanky", + "bigdaddy", + "johnson", + "chester", + "london", + "midnight", + "blue", + "fishing", + "0", + "hannah", + "slayer", + "11111111", + "rachel", + "sexsex", + "redsox", + "thx1138", + "asdf", + "marlboro", + "panther", + "zxcvbnm", + "arsenal", + "oliver", + "qazwsx", + "mother", + "victoria", + "7777777", + "jasper", + "angel", + "david", + "winner", + "crystal", + "golden", + "butthead", + "viking", + "jack", + "iwantu", + "shannon", + "murphy", + "angels", + "prince", + "cameron", + "girls", + "madison", + "wilson", + "carlos", + "hooters", + "willie", + "startrek", + "captain", + "maddog", + "jasmine", + "butter", + "booger", + "angela", + "golf", + "lauren", + "rocket", + "tiffany", + "theman", + "dennis", + "liverpoo", + "flower", + "forever", + "green", + "jackie", + "muffin", + "turtle", + "sophie", + "danielle", + "redskins", + "toyota", + "jason", + "sierra", + "winston", + "debbie", + "giants", + "packers", + "newyork", + "jeremy", + "casper", + "bubba", + "112233", + "sandra", + "lovers", + "mountain", + "united", + "cooper", + "driver", + "tucker", + "helpme", + "fucking", + "pookie", + "lucky", + "maxwell", + "8675309", + "bear", + "suckit", + "gators", + "5150", + "222222", + "shithead", + "fuckoff", + "jaguar", + "monica", + "fred", + "happy", + "hotdog", + "tits", + "gemini", + "lover", + "xxxxxxxx", + "777777", + "canada", + "nathan", + "victor", + "florida", + "88888888", + "nicholas", + "rosebud", + "metallic", + "doctor", + "trouble", + "success", + "stupid", + "tomcat", + "warrior", + "peaches", + "apples", + "fish", + "qwertyui", + "magic", + "buddy", + "dolphins", + "rainbow", + "gunner", + "987654", + "freddy", + "alexis", + "braves", + "cock", + "2112", + "1212", + "cocacola", + "xavier", + "dolphin", + "testing", + "bond007", + "member", + "calvin", + "voodoo", + "7777", + "samson", + "alex", + "apollo", + "fire", + "tester", + "walter", + "beavis", + "voyager", + "peter", + "porno", + "bonnie", + "rush2112", + "beer", + "apple", + "scorpio", + "jonathan", + "skippy", + "sydney", + "scott", + "red123", + "power", + "gordon", + "travis", + "beaver", + "star", + "jackass", + "flyers", + "boobs", + "232323", + "zzzzzz", + "steve", + "rebecca", + "scorpion", + "doggie", + "legend", + "ou812", + "yankee", + "blazer", + "bill", + "runner", + "birdie", + "bitches", + "555555", + "parker", + "topgun", + "asdfasdf", + "heaven", + "viper", + "animal", + "2222", + "bigboy", + "4444", + "arthur", + "baby", + "private", + "godzilla", + "donald", + "williams", + "lifehack", + "phantom", + "dave", + "rock", + "august", + "sammy", + "cool", + "brian", + "platinum", + "jake", + "bronco", + "paul", + "mark", + "frank", + "heka6w2", + "copper", + "billy", + "cumshot", + "garfield", + "willow", + "cunt", + "little", + "carter", + "slut", + "albert", + "69696969", + "kitten", + "super", + "jordan23", + "eagle1", + "shelby", + "america", + "11111", + "jessie", + "house", + "free", + "123321", + "chevy", + "bullshit", + "white", + "broncos", + "horney", + "surfer", + "nissan", + "999999", + "saturn", + "airborne", + "elephant", + "marvin", + "shit", + "action", + "adidas", + "qwert", + "kevin", + "1313", + "explorer", + "walker", + "police", + "christin", + "december", + "benjamin", + "wolf", + "sweet", + "therock", + "king", + "online", + "dickhead", + "brooklyn", + "teresa", + "cricket", + "sharon", + "dexter", + "racing", + "penis", + "gregory", + "0", + "teens", + "redwings", + "dreams", + "michigan", + "hentai", + "magnum", + "87654321", + "nothing", + "donkey", + "trinity", + "digital", + "333333", + "stella", + "cartman", + "guinness", + "123abc", + "speedy", + "buffalo", + "kitty", + "pimpin", + "eagle", + "einstein", + "kelly", + "nelson", + "nirvana", + "vampire", + "xxxx", + "playboy", + "louise", + "pumpkin", + "snowball", + "test123", + "girl", + "sucker", + "mexico", + "beatles", + "fantasy", + "ford", + "gibson", + "celtic", + "marcus", + "cherry", + "cassie", + "888888", + "natasha", + "sniper", + "chance", + "genesis", + "hotrod", + "reddog", + "alexande", + "college", + "jester", + "passw0rd", + "bigcock", + "smith", + "lasvegas", + "carmen", + "slipknot", + "3333", + "death", + "kimberly", + "1q2w3e", + "eclipse", + "1q2w3e4r", + "stanley", + "samuel", + "drummer", + "homer", + "montana", + "music", + "aaaa", + "spencer", + "jimmy", + "carolina", + "colorado", + "creative", + "hello1", + "rocky", + "goober", + "friday", + "bollocks", + "scotty", + "abcdef", + "bubbles", + "hawaii", + "fluffy", + "mine", + "stephen", + "horses", + "thumper", + "5555", + "pussies", + "darkness", + "asdfghjk", + "pamela", + "boobies", + "buddha", + "vanessa", + "sandman", + "naughty", + "douglas", + "honda", + "matt", + "azerty", + "6666", + "shorty", + "money1", + "beach", + "loveme", + "4321", + "simple", + "poohbear", + "444444", + "badass", + "destiny", + "sarah", + "denise", + "vikings", + "lizard", + "melanie", + "assman", + "sabrina", + "nintendo", + "water", + "good", + "howard", + "time", + "123qwe", + "november", + "xxxxx", + "october", + "leather", + "bastard", + "young", + "101010", + "extreme", + "hard", + "password1", + "vincent", + "pussy1", + "lacrosse", + "hotmail", + "spooky", + "amateur", + "alaska", + "badger", + "paradise", + "maryjane", + "poop", + "crazy", + "mozart", + "video", + "russell", + "vagina", + "spitfire", + "anderson", + "norman", + "eric", + "cherokee", + "cougar", + "barbara", + "long", + "420420", + "family", + "horse", + "enigma", + "allison", + "raider", + "brazil", + "blonde", + "jones", + "55555", + "dude", + "drowssap", + "jeff", + "school", + "marshall", + "lovely", + "1qaz2wsx", + "jeffrey", + "caroline", + "franklin", + "booty", + "molly", + "snickers", + "leslie", + "nipples", + "courtney", + "diesel", + "rocks", + "eminem", + "westside", + "suzuki", + "daddy", + "passion", + "hummer", + "ladies", + "zachary", + "frankie", + "elvis", + "reggie", + "alpha", + "suckme", + "simpson", + "patricia", + "147147", + "pirate", + "tommy", + "semperfi", + "jupiter", + "redrum", + "freeuser", + "wanker", + "stinky", + "ducati", + "paris", + "natalie", + "babygirl", + "bishop", + "windows", + "spirit", + "pantera", + "monday", + "patches", + "brutus", + "houston", + "smooth", + "penguin", + "marley", + "forest", + "cream", + "212121", + "flash", + "maximus", + "nipple", + "bobby", + "bradley", + "vision", + "pokemon", + "champion", + "fireman", + "indian", + "softball", + "picard", + "system", + "clinton", + "cobra", + "enjoy", + "lucky1", + "claire", + "claudia", + "boogie", + "timothy", + "marines", + "security", + "dirty", + "admin", + "wildcats", + "pimp", + "dancer", + "hardon", + "veronica", + "fucked", + "abcd1234", + "abcdefg", + "ironman", + "wolverin", + "remember", + "great", + "freepass", + "bigred", + "squirt", + "justice", + "francis", + "hobbes", + "kermit", + "pearljam", + "mercury", + "domino", + "9999", + "denver", + "brooke", + "rascal", + "hitman", + "mistress", + "simon", + "tony", + "bbbbbb", + "friend", + "peekaboo", + "naked", + "budlight", + "electric", + "sluts", + "stargate", + "saints", + "bondage", + "brittany", + "bigman", + "zombie", + "swimming", + "duke", + "qwerty1", + "babes", + "scotland", + "disney", + "rooster", + "brenda", + "mookie", + "swordfis", + "candy", + "duncan", + "olivia", + "hunting", + "blink182", + "alicia", + "8888", + "samsung", + "bubba1", + "whore", + "virginia", + "general", + "passport", + "aaaaaaaa", + "erotic", + "liberty", + "arizona", + "jesus", + "abcd", + "newport", + "skipper", + "rolltide", + "balls", + "happy1", + "galore", + "christ", + "weasel", + "242424", + "wombat", + "digger", + "classic", + "bulldogs", + "poopoo", + "accord", + "popcorn", + "turkey", + "jenny", + "amber", + "bunny", + "mouse", + "7007", + "titanic", + "liverpool", + "dreamer", + "everton", + "friends", + "chevelle", + "carrie", + "gabriel", + "psycho", + "nemesis", + "burton", + "pontiac", + "connor", + "eatme", + "lickme", + "roland", + "cumming", + "mitchell", + "ireland", + "lincoln", + "arnold", + "spiderma", + "patriots", + "goblue", + "devils", + "eugene", + "empire", + "asdfg", + "cardinal", + "brown", + "shaggy", + "froggy", + "qwer", + "kawasaki", + "kodiak", + "people", + "phpbb", + "light", + "54321", + "kramer", + "chopper", + "hooker", + "honey", + "whynot", + "lesbian", + "lisa", + "baxter", + "adam", + "snake", + "teen", + "ncc1701d", + "qqqqqq", + "airplane", + "britney", + "avalon", + "sandy", + "sugar", + "sublime", + "stewart", + "wildcat", + "raven", + "scarface", + "elizabet", + "123654", + "trucks", + "wolfpack", + "pervert", + "lawrence", + "raymond", + "redhead", + "american", + "alyssa", + "bambam", + "movie", + "woody", + "shaved", + "snowman", + "tiger1", + "chicks", + "raptor", + "1969", + "stingray", + "shooter", + "france", + "stars", + "madmax", + "kristen", + "sports", + "jerry", + "789456", + "garcia", + "simpsons", + "lights", + "ryan", + "looking", + "chronic", + "alison", + "hahaha", + "packard", + "hendrix", + "perfect", + "service", + "spring", + "srinivas", + "spike", + "katie", + "252525", + "oscar", + "brother", + "bigmac", + "suck", + "single", + "cannon", + "georgia", + "popeye", + "tattoo", + "texas", + "party", + "bullet", + "taurus", + "sailor", + "wolves", + "panthers", + "japan", + "strike", + "flowers", + "pussycat", + "chris1", + "loverboy", + "berlin", + "sticky", + "marina", + "tarheels", + "fisher", + "russia", + "connie", + "wolfgang", + "testtest", + "mature", + "bass", + "catch22", + "juice", + "michael1", + "nigger", + "159753", + "women", + "alpha1", + "trooper", + "hawkeye", + "head", + "freaky", + "dodgers", + "pakistan", + "machine", + "pyramid", + "vegeta", + "katana", + "moose", + "tinker", + "coyote", + "infinity", + "inside", + "pepsi", + "letmein1", + "bang", + "control", + "hercules", + "morris", + "james1", + "tickle", + "outlaw", + "browns", + "billybob", + "pickle", + "test1", + "michele", + "antonio", + "sucks", + "pavilion", + "changeme", + "caesar", + "prelude", + "tanner", + "adrian", + "darkside", + "bowling", + "wutang", + "sunset", + "robbie", + "alabama", + "danger", + "zeppelin", + "juan", + "rusty", + "pppppp", + "nick", + "2001", + "ping", + "darkstar", + "madonna", + "qwe123", + "bigone", + "casino", + "cheryl", + "charlie1", + "mmmmmm", + "integra", + "wrangler", + "apache", + "tweety", + "qwerty12", + "bobafett", + "simone", + "none", + "business", + "sterling", + "trevor", + "transam", + "dustin", + "harvey", + "england", + "2323", + "seattle", + "ssssss", + "rose", + "harry", + "openup", + "pandora", + "pussys", + "trucker", + "wallace", + "indigo", + "storm", + "malibu", + "weed", + "review", + "babydoll", + "doggy", + "dilbert", + "pegasus", + "joker", + "catfish", + "flipper", + "valerie", + "herman", + "fuckit", + "detroit", + "kenneth", + "cheyenne", + "bruins", + "stacey", + "smoke", + "joey", + "seven", + "marino", + "fetish", + "xfiles", + "wonder", + "stinger", + "pizza", + "babe", + "pretty", + "stealth", + "manutd", + "gracie", + "gundam", + "cessna", + "longhorn", + "presario", + "mnbvcxz", + "wicked", + "mustang1", + "victory", + "21122112", + "shelly", + "awesome", + "athena", + "q1w2e3r4", + "help", + "holiday", + "knicks", + "street", + "redneck", + "12341234", + "casey", + "gizmo", + "scully", + "dragon1", + "devildog", + "triumph", + "eddie", + "bluebird", + "shotgun", + "peewee", + "ronnie", + "angel1", + "daisy", + "special", + "metallica", + "madman", + "country", + "impala", + "lennon", + "roscoe", + "omega", + "access14", + "enterpri", + "miranda", + "search", + "smitty", + "blizzard", + "unicorn", + "tight", + "rick", + "ronald", + "asdf1234", + "harrison", + "trigger", + "truck", + "danny", + "home", + "winnie", + "beauty", + "thailand", + "1234567890", + "cadillac", + "castle", + "tyler", + "bobcat", + "buddy1", + "sunny", + "stones", + "asian", + "freddie", + "chuck", + "butt", + "loveyou", + "norton", + "hellfire", + "hotsex", + "indiana", + "short", + "panzer", + "lonewolf", + "trumpet", + "colors", + "blaster", + "12121212", + "fireball", + "logan", + "precious", + "aaron", + "elaine", + "jungle", + "atlanta", + "gold", + "corona", + "curtis", + "nikki", + "polaris", + "timber", + "theone", + "baller", + "chipper", + "orlando", + "island", + "skyline", + "dragons", + "dogs", + "benson", + "licker", + "goldie", + "engineer", + "kong", + "pencil", + "basketba", + "open", + "hornet", + "world", + "linda", + "barbie", + "chan", + "farmer", + "valentin", + "wetpussy", + "indians", + "larry", + "redman", + "foobar", + "travel", + "morpheus", + "bernie", + "target", + "141414", + "hotstuff", + "photos", + "laura", + "savage", + "holly", + "rocky1", + "fuck_inside", + "dollar", + "turbo", + "design", + "newton", + "hottie", + "moon", + "202020", + "blondes", + "4128", + "lestat", + "avatar", + "future", + "goforit", + "random", + "abgrtyu", + "jjjjjj", + "cancer", + "q1w2e3", + "smiley", + "goldberg", + "express", + "virgin", + "zipper", + "wrinkle1", + "stone", + "andy", + "babylon", + "dong", + "powers", + "consumer", + "dudley", + "monkey1", + "serenity", + "samurai", + "99999999", + "bigboobs", + "skeeter", + "lindsay", + "joejoe", + "master1", + "aaaaa", + "chocolat", + "christia", + "birthday", + "stephani", + "tang", + "1234qwer", + "alfred", + "ball", + "98765432", + "maria", + "sexual", + "maxima", + "77777777", + "sampson", + "buckeye", + "highland", + "kristin", + "seminole", + "reaper", + "bassman", + "nugget", + "lucifer", + "airforce", + "nasty", + "watson", + "warlock", + "2121", + "philip", + "always", + "dodge", + "chrissy", + "burger", + "bird", + "snatch", + "missy", + "pink", + "gang", + "maddie", + "holmes", + "huskers", + "piglet", + "photo", + "joanne", + "hamilton", + "dodger", + "paladin", + "christy", + "chubby", + "buckeyes", + "hamlet", + "abcdefgh", + "bigfoot", + "sunday", + "manson", + "goldfish", + "garden", + "deftones", + "icecream", + "blondie", + "spartan", + "julie", + "harold", + "charger", + "brandi", + "stormy", + "sherry", + "pleasure", + "juventus", + "rodney", + "galaxy", + "holland", + "escort", + "zxcvb", + "planet", + "jerome", + "wesley", + "blues", + "song", + "peace", + "david1", + "ncc1701e", + "1966", + "51505150", + "cavalier", + "gambit", + "karen", + "sidney", + "ripper", + "oicu812", + "jamie", + "sister", + "marie", + "martha", + "nylons", + "aardvark", + "nadine", + "minnie", + "whiskey", + "bing", + "plastic", + "anal", + "babylon5", + "chang", + "savannah", + "loser", + "racecar", + "insane", + "yankees1", + "mememe", + "hansolo", + "chiefs", + "fredfred", + "freak", + "frog", + "salmon", + "concrete", + "yvonne", + "zxcv", + "shamrock", + "atlantis", + "warren", + "wordpass", + "julian", + "mariah", + "rommel", + "1010", + "harris", + "predator", + "sylvia", + "massive", + "cats", + "sammy1", + "mister", + "stud", + "marathon", + "rubber", + "ding", + "trunks", + "desire", + "montreal", + "justme", + "faster", + "kathleen", + "irish", + "1999", + "bertha", + "jessica1", + "alpine", + "sammie", + "diamonds", + "tristan", + "0", + "swinger", + "shan", + "stallion", + "pitbull", + "letmein2", + "roberto", + "ready", + "april", + "palmer", + "ming", + "shadow1", + "audrey", + "chong", + "clitoris", + "wang", + "shirley", + "fuckers", + "jackoff", + "bluesky", + "sundance", + "renegade", + "hollywoo", + "151515", + "bernard", + "wolfman", + "soldier", + "picture", + "pierre", + "ling", + "goddess", + "manager", + "nikita", + "sweety", + "titans", + "hang", + "fang", + "ficken", + "niners", + "bottom", + "bubble", + "hello123", + "ibanez", + "webster", + "sweetpea", + "stocking", + "323232", + "tornado", + "lindsey", + "content", + "bruce", + "buck", + "aragorn", + "griffin", + "chen", + "campbell", + "trojan", + "christop", + "newman", + "wayne", + "tina", + "rockstar", + "father", + "geronimo", + "pascal", + "crimson", + "brooks", + "hector", + "penny", + "anna", + "google", + "camera", + "chandler", + "fatcat", + "lovelove", + "cody", + "cunts", + "waters", + "stimpy", + "finger", + "cindy", + "wheels", + "viper1", + "latin", + "robin", + "greenday", + "987654321", + "creampie", + "brendan", + "hiphop", + "willy", + "snapper", + "funtime", + "duck", + "trombone", + "adult", + "cotton", + "cookies", + "kaiser", + "mulder", + "westham", + "latino", + "jeep", + "ravens", + "aurora", + "drizzt", + "madness", + "energy", + "kinky", + "314159", + "sophia", + "stefan", + "slick", + "rocker", + "55555555", + "freeman", + "french", + "mongoose", + "speed", + "dddddd", + "hong", + "henry", + "hungry", + "yang", + "catdog", + "cheng", + "ghost", + "gogogo", + "randy", + "tottenha", + "curious", + "butterfl", + "mission", + "january", + "singer", + "sherman", + "shark", + "techno", + "lancer", + "lalala", + "autumn", + "chichi", + "orion", + "trixie", + "clifford", + "delta", + "bobbob", + "bomber", + "holden", + "kang", + "kiss", + "1968", + "spunky", + "liquid", + "mary", + "beagle", + "granny", + "network", + "bond", + "kkkkkk", + "millie", + "1973", + "biggie", + "beetle", + "teacher", + "susan", + "toronto", + "anakin", + "genius", + "dream", + "cocks", + "dang", + "bush", + "karate", + "snakes", + "bangkok", + "callie", + "fuckyou2", + "pacific", + "daytona", + "kelsey", + "infantry", + "skywalke", + "foster", + "felix", + "sailing", + "raistlin", + "vanhalen", + "huang", + "herbert", + "jacob", + "blackie", + "tarzan", + "strider", + "sherlock", + "lang", + "gong", + "sang", + "dietcoke", + "ultimate", + "tree", + "shai", + "sprite", + "ting", + "artist", + "chai", + "chao", + "devil", + "python", + "ninja", + "misty", + "ytrewq", + "sweetie", + "superfly", + "456789", + "tian", + "jing", + "jesus1", + "freedom1", + "dian", + "drpepper", + "potter", + "chou", + "darren", + "hobbit", + "violet", + "yong", + "shen", + "phillip", + "maurice", + "gloria", + "nolimit", + "mylove", + "biscuit", + "yahoo", + "shasta", + "sex4me", + "smoker", + "smile", + "pebbles", + "pics", + "philly", + "tong", + "tintin", + "lesbians", + "marlin", + "cactus", + "frank1", + "tttttt", + "chun", + "danni", + "emerald", + "showme", + "pirates", + "lian", + "dogg", + "colleen", + "xiao", + "xian", + "tazman", + "tanker", + "patton", + "toshiba", + "richie", + "alberto", + "gotcha", + "graham", + "dillon", + "rang", + "emily", + "keng", + "jazz", + "bigguy", + "yuan", + "woman", + "tomtom", + "marion", + "greg", + "chaos", + "fossil", + "flight", + "racerx", + "tuan", + "creamy", + "boss", + "bobo", + "musicman", + "warcraft", + "window", + "blade", + "shuang", + "sheila", + "shun", + "lick", + "jian", + "microsoft", + "rong", + "allen", + "feng", + "getsome", + "sally", + "quality", + "kennedy", + "morrison", + "1977", + "beng", + "wwwwww", + "yoyoyo", + "zhang", + "seng", + "teddy", + "joanna", + "andreas", + "harder", + "luke", + "qazxsw", + "qian", + "cong", + "chuan", + "deng", + "nang", + "boeing", + "keeper", + "western", + "isabelle", + "1963", + "subaru", + "sheng", + "thuglife", + "teng", + "jiong", + "miao", + "martina", + "mang", + "maniac", + "pussie", + "tracey", + "a1b2c3", + "clayton", + "zhou", + "zhuang", + "xing", + "stonecol", + "snow", + "spyder", + "liang", + "jiang", + "memphis", + "regina", + "ceng", + "magic1", + "logitech", + "chuang", + "dark", + "million", + "blow", + "sesame", + "shao", + "poison", + "titty", + "terry", + "kuan", + "kuai", + "kyle", + "mian", + "guan", + "hamster", + "guai", + "ferret", + "florence", + "geng", + "duan", + "pang", + "maiden", + "quan", + "velvet", + "nong", + "neng", + "nookie", + "buttons", + "bian", + "bingo", + "biao", + "zhong", + "zeng", + "xiong", + "zhun", + "ying", + "zong", + "xuan", + "zang", + "0.0.000", + "suan", + "shei", + "shui", + "sharks", + "shang", + "shua", + "small", + "peng", + "pian", + "piao", + "liao", + "meng", + "miami", + "reng", + "guang", + "cang", + "change", + "ruan", + "diao", + "luan", + "lucas", + "qing", + "chui", + "chuo", + "cuan", + "nuan", + "ning", + "heng", + "huan", + "kansas", + "muscle", + "monroe", + "weng", + "whitney", + "1passwor", + "bluemoon", + "zhui", + "zhua", + "xiang", + "zheng", + "zhen", + "zhei", + "zhao", + "zhan", + "yomama", + "zhai", + "zhuo", + "zuan", + "tarheel", + "shou", + "shuo", + "tiao", + "lady", + "leonard", + "leng", + "kuang", + "jiao", + "13579", + "basket", + "qiao", + "qiong", + "qiang", + "chuai", + "nian", + "niao", + "niang", + "huai", + "22222222", + "bianca", + "zhuan", + "zhuai", + "shuan", + "shuai", + "stardust", + "jumper", + "margaret", + "archie", + "66666666", + "charlott", + "forget", + "qwertz", + "bones", + "history", + "milton", + "waterloo", + "2002", + "stuff", + "11223344", + "office", + "oldman", + "preston", + "trains", + "murray", + "vertigo", + "246810", + "black1", + "swallow", + "smiles", + "standard", + "alexandr", + "parrot", + "luther", + "user", + "nicolas", + "1976", + "surfing", + "pioneer", + "pete", + "masters", + "apple1", + "asdasd", + "auburn", + "hannibal", + "frontier", + "panama", + "lucy", + "buffy", + "brianna", + "welcome1", + "vette", + "blue22", + "shemale", + "111222", + "baggins", + "groovy", + "global", + "turner", + "181818", + "1979", + "blades", + "spanking", + "life", + "byteme", + "lobster", + "collins", + "dawg", + "hilton", + "japanese", + "1970", + "1964", + "2424", + "polo", + "markus", + "coco", + "deedee", + "mikey", + "1972", + "171717", + "1701", + "strip", + "jersey", + "green1", + "capital", + "sasha", + "sadie", + "putter", + "vader", + "seven7", + "lester", + "marcel", + "banshee", + "grendel", + "gilbert", + "dicks", + "dead", + "hidden", + "iloveu", + "1980", + "sound", + "ledzep", + "michel", + "147258", + "female", + "bugger", + "buffett", + "bryan", + "hell", + "kristina", + "molson", + "2020", + "wookie", + "sprint", + "thanks", + "jericho", + "102030", + "grace", + "fuckin", + "mandy", + "ranger1", + "trebor", + "deepthroat", + "bonehead", + "molly1", + "mirage", + "models", + "1984", + "2468", + "stuart", + "showtime", + "squirrel", + "pentium", + "mario", + "anime", + "gator", + "powder", + "twister", + "connect", + "neptune", + "bruno", + "butts", + "engine", + "eatshit", + "mustangs", + "woody1", + "shogun", + "septembe", + "pooh", + "jimbo", + "roger", + "annie", + "bacon", + "center", + "russian", + "sabine", + "damien", + "mollie", + "voyeur", + "2525", + "363636", + "leonardo", + "camel", + "chair", + "germany", + "giant", + "qqqq", + "nudist", + "bone", + "sleepy", + "tequila", + "megan", + "fighter", + "garrett", + "dominic", + "obiwan", + "makaveli", + "vacation", + "walnut", + "1974", + "ladybug", + "cantona", + "ccbill", + "satan", + "rusty1", + "passwor1", + "columbia", + "napoleon", + "dusty", + "kissme", + "motorola", + "william1", + "1967", + "zzzz", + "skater", + "smut", + "play", + "matthew1", + "robinson", + "valley", + "coolio", + "dagger", + "boner", + "bull", + "horndog", + "jason1", + "blake", + "penguins", + "rescue", + "griffey", + "8j4ye3uz", + "californ", + "champs", + "qwertyuiop", + "portland", + "queen", + "colt45", + "boat", + "xxxxxxx", + "xanadu", + "tacoma", + "mason", + "carpet", + "gggggg", + "safety", + "palace", + "italia", + "stevie", + "picturs", + "picasso", + "thongs", + "tempest", + "ricardo", + "roberts", + "asd123", + "hairy", + "foxtrot", + "gary", + "nimrod", + "hotboy", + "343434", + "1111111", + "asdfghjkl", + "goose", + "overlord", + "blood", + "wood", + "stranger", + "454545", + "shaolin", + "sooners", + "socrates", + "spiderman", + "peanuts", + "maxine", + "rogers", + "13131313", + "andrew1", + "filthy", + "donnie", + "ohyeah", + "africa", + "national", + "kenny", + "keith", + "monique", + "intrepid", + "jasmin", + "pickles", + "assass", + "fright", + "potato", + "darwin", + "hhhhhh", + "kingdom", + "weezer", + "424242", + "pepsi1", + "throat", + "romeo", + "gerard", + "looker", + "puppy", + "butch", + "monika", + "suzanne", + "sweets", + "temple", + "laurie", + "josh", + "megadeth", + "analsex", + "nymets", + "ddddddd", + "bigballs", + "support", + "stick", + "today", + "down", + "oakland", + "oooooo", + "qweasd", + "chucky", + "bridge", + "carrot", + "chargers", + "discover", + "dookie", + "condor", + "night", + "butler", + "hoover", + "horny1", + "isabella", + "sunrise", + "sinner", + "jojo", + "megapass", + "martini", + "assfuck", + "grateful", + "ffffff", + "abigail", + "esther", + "mushroom", + "janice", + "jamaica", + "wright", + "sims", + "space", + "there", + "timmy", + "7654321", + "77777", + "cccccc", + "gizmodo", + "roxanne", + "ralph", + "tractor", + "cristina", + "dance", + "mypass", + "hongkong", + "helena", + "1975", + "blue123", + "pissing", + "thomas1", + "redred", + "rich", + "basketball", + "attack", + "cash", + "satan666", + "drunk", + "dixie", + "dublin", + "bollox", + "kingkong", + "katrina", + "miles", + "1971", + "22222", + "272727", + "sexx", + "penelope", + "thompson", + "anything", + "bbbb", + "battle", + "grizzly", + "passat", + "porter", + "tracy", + "defiant", + "bowler", + "knickers", + "monitor", + "wisdom", + "wild", + "slappy", + "thor", + "letsgo", + "robert1", + "feet", + "rush", + "brownie", + "hudson", + "98765", + "playing", + "playtime", + "lightnin", + "melvin", + "atomic", + "bart", + "hawk", + "goku", + "glory", + "llllll", + "qwaszx", + "cosmos", + "bosco", + "knights", + "bentley", + "beast", + "slapshot", + "lewis", + "assword", + "frosty", + "gillian", + "sara", + "dumbass", + "mallard", + "dddd", + "deanna", + "elwood", + "wally", + "159357", + "titleist", + "angelo", + "aussie", + "guest", + "golfing", + "doobie", + "loveit", + "chloe", + "elliott", + "werewolf", + "vipers", + "janine", + "1965", + "blabla", + "surf", + "sucking", + "tardis", + "serena", + "shelley", + "thegame", + "legion", + "rebels", + "fernando", + "fast", + "gerald", + "sarah1", + "double", + "onelove", + "loulou", + "toto", + "crash", + "blackcat", + "7", + "tacobell", + "soccer1", + "jedi", + "manuel", + "method", + "river", + "chase", + "ludwig", + "poopie", + "derrick", + "boob", + "breast", + "kittycat", + "isabel", + "belly", + "pikachu", + "thunder1", + "thankyou", + "jose", + "celeste", + "celtics", + "frances", + "frogger", + "scoobydo", + "sabbath", + "coltrane", + "budman", + "willis", + "jackal", + "bigger", + "zzzzz", + "silvia", + "sooner", + "licking", + "gopher", + "geheim", + "lonestar", + "primus", + "pooper", + "newpass", + "brasil", + "heather1", + "husker", + "element", + "moomoo", + "beefcake", + "zzzzzzzz", + "tammy", + "shitty", + "smokin", + "personal", + "jjjj", + "anthony1", + "anubis", + "backup", + "gorilla", + "fuckface", + "painter", + "lowrider", + "punkrock", + "traffic", + "claude", + "daniela", + "dale", + "delta1", + "nancy", + "boys", + "easy", + "kissing", + "kelley", + "wendy", + "theresa", + "amazon", + "alan", + "fatass", + "dodgeram", + "dingdong", + "malcolm", + "qqqqqqqq", + "breasts", + "boots", + "honda1", + "spidey", + "poker", + "temp", + "johnjohn", + "miguel", + "147852", + "archer", + "asshole1", + "dogdog", + "tricky", + "crusader", + "weather", + "syracuse", + "spankme", + "speaker", + "meridian", + "amadeus", + "back", + "harley1", + "falcons", + "dorothy", + "turkey50", + "kenwood", + "keyboard", + "ilovesex", + "1978", + "blackman", + "shazam", + "shalom", + "lickit", + "jimbob", + "richmond", + "roller", + "carson", + "check", + "fatman", + "funny", + "garbage", + "sandiego", + "loving", + "magnus", + "cooldude", + "clover", + "mobile", + "bell", + "payton", + "plumber", + "texas1", + "tool", + "topper", + "jenna", + "mariners", + "rebel", + "harmony", + "caliente", + "celica", + "fletcher", + "german", + "diana", + "oxford", + "osiris", + "orgasm", + "punkin", + "porsche9", + "tuesday", + "close", + "breeze", + "bossman", + "kangaroo", + "billie", + "latinas", + "judith", + "astros", + "scruffy", + "donna", + "qwertyu", + "davis", + "hearts", + "kathy", + "jammer", + "java", + "springer", + "rhonda", + "ricky", + "1122", + "goodtime", + "chelsea1", + "freckles", + "flyboy", + "doodle", + "city", + "nebraska", + "bootie", + "kicker", + "webmaster", + "vulcan", + "iverson", + "191919", + "blueeyes", + "stoner", + "321321", + "farside", + "rugby", + "director", + "pussy69", + "power1", + "bobbie", + "hershey", + "hermes", + "monopoly", + "west", + "birdman", + "blessed", + "blackjac", + "southern", + "peterpan", + "thumbs", + "lawyer", + "melinda", + "fingers", + "fuckyou1", + "rrrrrr", + "a1b2c3d4", + "coke", + "nicola", + "bohica", + "heart", + "elvis1", + "kids", + "blacky", + "stories", + "sentinel", + "snake1", + "phoebe", + "jesse", + "richard1", + "1234abcd", + "guardian", + "candyman", + "fisting", + "scarlet", + "dildo", + "pancho", + "mandingo", + "lucky7", + "condom", + "munchkin", + "billyboy", + "summer1", + "student", + "sword", + "skiing", + "sergio", + "site", + "sony", + "thong", + "rootbeer", + "assassin", + "cassidy", + "frederic", + "fffff", + "fitness", + "giovanni", + "scarlett", + "durango", + "postal", + "achilles", + "dawn", + "dylan", + "kisses", + "warriors", + "imagine", + "plymouth", + "topdog", + "asterix", + "hallo", + "cameltoe", + "fuckfuck", + "bridget", + "eeeeee", + "mouth", + "weird", + "will", + "sithlord", + "sommer", + "toby", + "theking", + "juliet", + "avenger", + "backdoor", + "goodbye", + "chevrole", + "faith", + "lorraine", + "trance", + "cosworth", + "brad", + "houses", + "homers", + "eternity", + "kingpin", + "verbatim", + "incubus", + "1961", + "blond", + "zaphod", + "shiloh", + "spurs", + "station", + "jennie", + "maynard", + "mighty", + "aliens", + "hank", + "charly", + "running", + "dogman", + "omega1", + "printer", + "aggies", + "chocolate", + "deadhead", + "hope", + "javier", + "bitch1", + "stone55", + "pineappl", + "thekid", + "lizzie", + "rockets", + "ashton", + "camels", + "formula", + "forrest", + "rosemary", + "oracle", + "rain", + "pussey", + "porkchop", + "abcde", + "clancy", + "nellie", + "mystic", + "inferno", + "blackdog", + "steve1", + "pauline", + "alexander", + "alice", + "alfa", + "grumpy", + "flames", + "scream", + "lonely", + "puffy", + "proxy", + "valhalla", + "unreal", + "cynthia", + "herbie", + "engage", + "yyyyyy", + "10101", + "solomon", + "pistol", + "melody", + "celeb", + "flying", + "gggg", + "santiago", + "scottie", + "oakley", + "portugal", + "a12345", + "newbie", + "mmmm", + "venus", + "1qazxsw2", + "beverly", + "zorro", + "work", + "writer", + "stripper", + "sebastia", + "spread", + "phil", + "tobias", + "links", + "members", + "metal", + "1221", + "andre", + "565656", + "funfun", + "trojans", + "again", + "cyber", + "hurrican", + "moneys", + "1x2zkg8w", + "zeus", + "thing", + "tomato", + "lion", + "atlantic", + "celine", + "usa123", + "trans", + "account", + "aaaaaaa", + "homerun", + "hyperion", + "kevin1", + "blacks", + "44444444", + "skittles", + "sean", + "hastings", + "fart", + "gangbang", + "fubar", + "sailboat", + "older", + "oilers", + "craig", + "conrad", + "church", + "damian", + "dean", + "broken", + "buster1", + "hithere", + "immortal", + "sticks", + "pilot", + "peters", + "lexmark", + "jerkoff", + "maryland", + "anders", + "cheers", + "possum", + "columbus", + "cutter", + "muppet", + "beautiful", + "stolen", + "swordfish", + "sport", + "sonic", + "peter1", + "jethro", + "rockon", + "asdfghj", + "pass123", + "paper", + "pornos", + "ncc1701a", + "bootys", + "buttman", + "bonjour", + "escape", + "1960", + "becky", + "bears", + "362436", + "spartans", + "tinman", + "threesom", + "lemons", + "maxmax", + "1414", + "bbbbb", + "camelot", + "chad", + "chewie", + "gogo", + "fusion", + "saint", + "dilligaf", + "nopass", + "myself", + "hustler", + "hunter1", + "whitey", + "beast1", + "yesyes", + "spank", + "smudge", + "pinkfloy", + "patriot", + "lespaul", + "annette", + "hammers", + "catalina", + "finish", + "formula1", + "sausage", + "scooter1", + "orioles", + "oscar1", + "over", + "colombia", + "cramps", + "natural", + "eating", + "exotic", + "iguana", + "bella", + "suckers", + "strong", + "sheena", + "start", + "slave", + "pearl", + "topcat", + "lancelot", + "angelica", + "magelan", + "racer", + "ramona", + "crunch", + "british", + "button", + "eileen", + "steph", + "456123", + "skinny", + "seeking", + "rockhard", + "chief", + "filter", + "first", + "freaks", + "sakura", + "pacman", + "poontang", + "dalton", + "newlife", + "homer1", + "klingon", + "watcher", + "walleye", + "tasha", + "tasty", + "sinatra", + "starship", + "steel", + "starbuck", + "poncho", + "amber1", + "gonzo", + "grover", + "catherin", + "carol", + "candle", + "firefly", + "goblin", + "scotch", + "diver", + "usmc", + "huskies", + "eleven", + "kentucky", + "kitkat", + "israel", + "beckham", + "bicycle", + "yourmom", + "studio", + "tara", + "33333333", + "shane", + "splash", + "jimmy1", + "reality", + "12344321", + "caitlin", + "focus", + "sapphire", + "mailman", + "raiders1", + "clark", + "ddddd", + "hopper", + "excalibu", + "more", + "wilbur", + "illini", + "imperial", + "phillips", + "lansing", + "maxx", + "gothic", + "golfball", + "carlton", + "camille", + "facial", + "front242", + "macdaddy", + "qwer1234", + "vectra", + "cowboys1", + "crazy1", + "dannyboy", + "jane", + "betty", + "benny", + "bennett", + "leader", + "martinez", + "aquarius", + "barkley", + "hayden", + "caught", + "franky", + "ffff", + "floyd", + "sassy", + "pppp", + "pppppppp", + "prodigy", + "clarence", + "noodle", + "eatpussy", + "vortex", + "wanking", + "beatrice", + "billy1", + "siemens", + "pedro", + "phillies", + "research", + "groups", + "carolyn", + "chevy1", + "cccc", + "fritz", + "gggggggg", + "doughboy", + "dracula", + "nurses", + "loco", + "madrid", + "lollipop", + "trout", + "utopia", + "chrono", + "cooler", + "conner", + "nevada", + "wibble", + "werner", + "summit", + "marco", + "marilyn", + "1225", + "babies", + "capone", + "fugazi", + "panda", + "mama", + "qazwsxed", + "puppies", + "triton", + "9876", + "command", + "nnnnnn", + "ernest", + "momoney", + "iforgot", + "wolfie", + "studly", + "shawn", + "renee", + "alien", + "hamburg", + "81fukkc", + "741852", + "catman", + "china", + "forgot", + "gagging", + "scott1", + "drew", + "oregon", + "qweqwe", + "train", + "crazybab", + "daniel1", + "cutlass", + "brothers", + "holes", + "heidi", + "mothers", + "music1", + "what", + "walrus", + "1957", + "bigtime", + "bike", + "xtreme", + "simba", + "ssss", + "rookie", + "angie", + "bathing", + "fresh", + "sanchez", + "rotten", + "maestro", + "luis", + "look", + "turbo1", + "99999", + "butthole", + "hhhh", + "elijah", + "monty", + "bender", + "yoda", + "shania", + "shock", + "phish", + "thecat", + "rightnow", + "reagan", + "baddog", + "asia", + "greatone", + "gateway1", + "randall", + "abstr", + "napster", + "brian1", + "bogart", + "high", + "hitler", + "emma", + "kill", + "weaver", + "wildfire", + "jackson1", + "isaiah", + "1981", + "belinda", + "beaner", + "yoyo", + "0.0.0.000", + "super1", + "select", + "snuggles", + "slutty", + "some", + "phoenix1", + "technics", + "toon", + "raven1", + "rayray", + "123789", + "1066", + "albion", + "greens", + "fashion", + "gesperrt", + "santana", + "paint", + "powell", + "credit", + "darling", + "mystery", + "bowser", + "bottle", + "brucelee", + "hehehe", + "kelly1", + "mojo", + "1998", + "bikini", + "woofwoof", + "yyyy", + "strap", + "sites", + "spears", + "theodore", + "julius", + "richards", + "amelia", + "central", + "f**k", + "nyjets", + "punisher", + "username", + "vanilla", + "twisted", + "bryant", + "brent", + "bunghole", + "here", + "elizabeth", + "erica", + "kimber", + "viagra", + "veritas", + "pony", + "pool", + "titts", + "labtec", + "lifetime", + "jenny1", + "masterbate", + "mayhem", + "redbull", + "govols", + "gremlin", + "505050", + "gmoney", + "rupert", + "rovers", + "diamond1", + "lorenzo", + "trident", + "abnormal", + "davidson", + "deskjet", + "cuddles", + "nice", + "bristol", + "karina", + "milano", + "vh5150", + "jarhead", + "1982", + "bigbird", + "bizkit", + "sixers", + "slider", + "star69", + "starfish", + "penetration", + "tommy1", + "john316", + "meghan", + "michaela", + "market", + "grant", + "caligula", + "carl", + "flicks", + "films", + "madden", + "railroad", + "cosmo", + "cthulhu", + "bradford", + "br0d3r", + "military", + "bearbear", + "swedish", + "spawn", + "patrick1", + "polly", + "these", + "todd", + "reds", + "anarchy", + "groove", + "franco", + "fuckher", + "oooo", + "tyrone", + "vegas", + "airbus", + "cobra1", + "christine", + "clips", + "delete", + "duster", + "kitty1", + "mouse1", + "monkeys", + "jazzman", + "1919", + "262626", + "swinging", + "stroke", + "stocks", + "sting", + "pippen", + "labrador", + "jordan1", + "justdoit", + "meatball", + "females", + "saturday", + "park", + "vector", + "cooter", + "defender", + "desert", + "demon", + "nike", + "bubbas", + "bonkers", + "english", + "kahuna", + "wildman", + "4121", + "sirius", + "static", + "piercing", + "terror", + "teenage", + "leelee", + "marissa", + "microsof", + "mechanic", + "robotech", + "rated", + "hailey", + "chaser", + "sanders", + "salsero", + "nuts", + "macross", + "quantum", + "rachael", + "tsunami", + "universe", + "daddy1", + "cruise", + "nguyen", + "newpass6", + "nudes", + "hellyeah", + "vernon", + "1959", + "zaq12wsx", + "striker", + "sixty", + "steele", + "spice", + "spectrum", + "smegma", + "thumb", + "jjjjjjjj", + "mellow", + "astrid", + "cancun", + "cartoon", + "sabres", + "samiam", + "pants", + "oranges", + "oklahoma", + "lust", + "coleman", + "denali", + "nude", + "noodles", + "buzz", + "brest", + "hooter", + "mmmmmmmm", + "warthog", + "bloody", + "blueblue", + "zappa", + "wolverine", + "sniffing", + "lance", + "jean", + "jjjjj", + "harper", + "calico", + "freee", + "rover", + "door", + "pooter", + "closeup", + "bonsai", + "evelyn", + "emily1", + "kathryn", + "keystone", + "iiii", + "1955", + "yzerman", + "theboss", + "tolkien", + "jill", + "megaman", + "rasta", + "bbbbbbbb", + "bean", + "handsome", + "hal9000", + "goofy", + "gringo", + "gofish", + "gizmo1", + "samsam", + "scuba", + "onlyme", + "tttttttt", + "corrado", + "clown", + "clapton", + "deborah", + "boris", + "bulls", + "vivian", + "jayhawk", + "bethany", + "wwww", + "sharky", + "seeker", + "ssssssss", + "somethin", + "pillow", + "thesims", + "lighter", + "lkjhgf", + "melissa1", + "marcius2", + "barry", + "guiness", + "gymnast", + "casey1", + "goalie", + "godsmack", + "doug", + "lolo", + "rangers1", + "poppy", + "abby", + "clemson", + "clipper", + "deeznuts", + "nobody", + "holly1", + "elliot", + "eeee", + "kingston", + "miriam", + "belle", + "yosemite", + "sucked", + "sex123", + "sexy69", + "pic's", + "tommyboy", + "lamont", + "meat", + "masterbating", + "marianne", + "marc", + "gretzky", + "happyday", + "frisco", + "scratch", + "orchid", + "orange1", + "manchest", + "quincy", + "unbelievable", + "aberdeen", + "dawson", + "nathalie", + "ne1469", + "boxing", + "hill", + "korn", + "intercourse", + "161616", + "1985", + "ziggy", + "supersta", + "stoney", + "senior", + "amature", + "barber", + "babyboy", + "bcfields", + "goliath", + "hack", + "hardrock", + "children", + "frodo", + "scout", + "scrappy", + "rosie", + "qazqaz", + "tracker", + "active", + "craving", + "commando", + "cohiba", + "deep", + "cyclone", + "dana", + "bubba69", + "katie1", + "mpegs", + "vsegda", + "jade", + "irish1", + "better", + "sexy1", + "sinclair", + "smelly", + "squerting", + "lions", + "jokers", + "jeanette", + "julia", + "jojojo", + "meathead", + "ashley1", + "groucho", + "cheetah", + "champ", + "firefox", + "gandalf1", + "packer", + "magnolia", + "love69", + "tyler1", + "typhoon", + "tundra", + "bobby1", + "kenworth", + "village", + "volley", + "beth", + "wolf359", + "420", + "7", + "swimmer", + "skydive", + "smokes", + "patty", + "peugeot", + "pompey", + "legolas", + "kristy", + "redhot", + "rodman", + "redalert", + "having", + "grapes", + "4runner", + "carrera", + "floppy", + "dollars", + "ou8122", + "quattro", + "adams", + "cloud9", + "davids", + "nofear", + "busty", + "homemade", + "mmmmm", + "whisper", + "vermont", + "webmaste", + "wives", + "insertion", + "jayjay", + "philips", + "phone", + "topher", + "tongue", + "temptress", + "midget", + "ripken", + "havefun", + "gretchen", + "canon", + "celebrity", + "five", + "getting", + "ghetto", + "direct", + "otto", + "ragnarok", + "trinidad", + "usnavy", + "conover", + "cruiser", + "dalshe", + "nicole1", + "buzzard", + "hottest", + "kingfish", + "misfit", + "moore", + "milfnew", + "warlord", + "wassup", + "bigsexy", + "blackhaw", + "zippy", + "shearer", + "tights", + "thursday", + "kungfu", + "labia", + "journey", + "meatloaf", + "marlene", + "rider", + "area51", + "batman1", + "bananas", + "636363", + "cancel", + "ggggg", + "paradox", + "mack", + "lynn", + "queens", + "adults", + "aikido", + "cigars", + "nova", + "hoosier", + "eeyore", + "moose1", + "warez", + "interacial", + "streaming", + "313131", + "pertinant", + "pool6123", + "mayday", + "rivers", + "revenge", + "animated", + "banker", + "baddest", + "gordon24", + "ccccc", + "fortune", + "fantasies", + "touching", + "aisan", + "deadman", + "homepage", + "ejaculation", + "whocares", + "iscool", + "jamesbon", + "1956", + "1pussy", + "womam", + "sweden", + "skidoo", + "spock", + "sssss", + "petra", + "pepper1", + "pinhead", + "micron", + "allsop", + "amsterda", + "army", + "aside", + "gunnar", + "666999", + "chip", + "foot", + "fowler", + "february", + "face", + "fletch", + "george1", + "sapper", + "science", + "sasha1", + "luckydog", + "lover1", + "magick", + "popopo", + "public", + "ultima", + "derek", + "cypress", + "booker", + "businessbabe", + "brandon1", + "edwards", + "experience", + "vulva", + "vvvv", + "jabroni", + "bigbear", + "yummy", + "10203", + "searay", + "secret1", + "showing", + "sinbad", + "sexxxx", + "soleil", + "software", + "piccolo", + "thirteen", + "leopard", + "legacy", + "jensen", + "justine", + "memorex", + "marisa", + "mathew", + "redwing", + "rasputin", + "134679", + "anfield", + "greenbay", + "gore", + "catcat", + "feather", + "scanner", + "pa55word", + "contortionist", + "danzig", + "daisy1", + "hores", + "erik", + "exodus", + "vinnie", + "iiiiii", + "zero", + "1001", + "subway", + "tank", + "second", + "snapple", + "sneakers", + "sonyfuck", + "picks", + "poodle", + "test1234", + "their", + "llll", + "junebug", + "june", + "marker", + "mellon", + "ronaldo", + "roadkill", + "amanda1", + "asdfjkl", + "beaches", + "greene", + "great1", + "cheerleaers", + "force", + "doitnow", + "ozzy", + "madeline", + "radio", + "tyson", + "christian", + "daphne", + "boxster", + "brighton", + "housewifes", + "emmanuel", + "emerson", + "kkkk", + "mnbvcx", + "moocow", + "vides", + "wagner", + "janet", + "1717", + "bigmoney", + "blonds", + "1000", + "storys", + "stereo", + "4545", + "420247", + "seductive", + "sexygirl", + "lesbean", + "live", + "justin1", + "124578", + "animals", + "balance", + "hansen", + "cabbage", + "canadian", + "gangbanged", + "dodge1", + "dimas", + "lori", + "loud", + "malaka", + "puss", + "probes", + "adriana", + "coolman", + "crawford", + "dante", + "nacked", + "hotpussy", + "erotica", + "kool", + "mirror", + "wearing", + "implants", + "intruder", + "bigass", + "zenith", + "woohoo", + "womans", + "tanya", + "tango", + "stacy", + "pisces", + "laguna", + "krystal", + "maxell", + "andyod22", + "barcelon", + "chainsaw", + "chickens", + "flash1", + "downtown", + "orgasms", + "magicman", + "profit", + "pusyy", + "pothead", + "coconut", + "chuckie", + "contact", + "clevelan", + "designer", + "builder", + "budweise", + "hotshot", + "horizon", + "hole", + "experienced", + "mondeo", + "wifes", + "1962", + "strange", + "stumpy", + "smiths", + "sparks", + "slacker", + "piper", + "pitchers", + "passwords", + "laptop", + "jeremiah", + "allmine", + "alliance", + "bbbbbbb", + "asscock", + "halflife", + "grandma", + "hayley", + "88888", + "cecilia", + "chacha", + "saratoga", + "sandy1", + "santos", + "doogie", + "number", + "positive", + "qwert40", + "transexual", + "crow", + "close-up", + "darrell", + "bonita", + "ib6ub9", + "volvo", + "jacob1", + "iiiii", + "beastie", + "sunnyday", + "stoned", + "sonics", + "starfire", + "snapon", + "pictuers", + "pepe", + "testing1", + "tiberius", + "lisalisa", + "lesbain", + "litle", + "retard", + "ripple", + "austin1", + "badgirl", + "golfgolf", + "flounder", + "garage", + "royals", + "dragoon", + "dickie", + "passwor", + "ocean", + "majestic", + "poppop", + "trailers", + "dammit", + "nokia", + "bobobo", + "br549", + "emmitt", + "knock", + "minime", + "mikemike", + "whitesox", + "1954", + "3232", + "353535", + "seamus", + "solo", + "sparkle", + "sluttey", + "pictere", + "titten", + "lback", + "1024", + "angelina", + "goodluck", + "charlton", + "fingerig", + "gallaries", + "goat", + "ruby", + "passme", + "oasis", + "lockerroom", + "logan1", + "rainman", + "twins", + "treasure", + "absolutely", + "club", + "custom", + "cyclops", + "nipper", + "bucket", + "homepage-", + "hhhhh", + "momsuck", + "indain", + "2345", + "beerbeer", + "bimmer", + "susanne", + "stunner", + "stevens", + "456456", + "shell", + "sheba", + "tootsie", + "tiny", + "testerer", + "reefer", + "really", + "1012", + "harcore", + "gollum", + "545454", + "chico", + "caveman", + "carole", + "fordf150", + "fishes", + "gaymen", + "saleen", + "doodoo", + "pa55w0rd", + "looney", + "presto", + "qqqqq", + "cigar", + "bogey", + "brewer", + "helloo", + "dutch", + "kamikaze", + "monte", + "wasser", + "vietnam", + "visa", + "japanees", + "123", + "swords", + "slapper", + "peach", + "jump", + "marvel", + "masterbaiting", + "march", + "redwood", + "rolling", + "1005", + "ametuer", + "chiks", + "cathy", + "callaway", + "fucing", + "sadie1", + "panasoni", + "mamas", + "race", + "rambo", + "unknown", + "absolut", + "deacon", + "dallas1", + "housewife", + "kristi", + "keywest", + "kirsten", + "kipper", + "morning", + "wings", + "idiot", + "18436572", + "1515", + "beating", + "zxczxc", + "sullivan", + "303030", + "shaman", + "sparrow", + "terrapin", + "jeffery", + "masturbation", + "mick", + "redfish", + "1492", + "angus", + "barrett", + "goirish", + "hardcock", + "felicia", + "forfun", + "galary", + "freeporn", + "duchess", + "olivier", + "lotus", + "pornographic", + "ramses", + "purdue", + "traveler", + "crave", + "brando", + "enter1", + "killme", + "moneyman", + "welder", + "windsor", + "wifey", + "indon", + "yyyyy", + "stretch", + "taylor1", + "4417", + "shopping", + "picher", + "pickup", + "thumbnils", + "johnboy", + "jets", + "jess", + "maureen", + "anne", + "ameteur", + "amateurs", + "apollo13", + "hambone", + "goldwing", + "5050", + "charley", + "sally1", + "doghouse", + "padres", + "pounding", + "quest", + "truelove", + "underdog", + "trader", + "crack", + "climber", + "bolitas", + "bravo", + "hohoho", + "model", + "italian", + "beanie", + "beretta", + "wrestlin", + "stroker", + "tabitha", + "sherwood", + "sexyman", + "jewels", + "johannes", + "mets", + "marcos", + "rhino", + "bdsm", + "balloons", + "goodman", + "grils", + "happy123", + "flamingo", + "games", + "route66", + "devo", + "dino", + "outkast", + "paintbal", + "magpie", + "llllllll", + "twilight", + "critter", + "christie", + "cupcake", + "nickel", + "bullseye", + "krista", + "knickerless", + "mimi", + "murder", + "videoes", + "binladen", + "xerxes", + "slim", + "slinky", + "pinky", + "peterson", + "thanatos", + "meister", + "menace", + "ripley", + "retired", + "albatros", + "balloon", + "bank", + "goten", + "5551212", + "getsdown", + "donuts", + "divorce", + "nwo4life", + "lord", + "lost", + "underwear", + "tttt", + "comet", + "deer", + "damnit", + "dddddddd", + "deeznutz", + "nasty1", + "nonono", + "nina", + "enterprise", + "eeeee", + "misfit99", + "milkman", + "vvvvvv", + "isaac", + "1818", + "blueboy", + "beans", + "bigbutt", + "wyatt", + "tech", + "solution", + "poetry", + "toolman", + "laurel", + "juggalo", + "jetski", + "meredith", + "barefoot", + "50spanks", + "gobears", + "scandinavian", + "original", + "truman", + "cubbies", + "nitram", + "briana", + "ebony", + "kings", + "warner", + "bilbo", + "yumyum", + "zzzzzzz", + "stylus", + "321654", + "shannon1", + "server", + "secure", + "silly", + "squash", + "starman", + "steeler", + "staples", + "phrases", + "techniques", + "laser", + "135790", + "allan", + "barker", + "athens", + "cbr600", + "chemical", + "fester", + "gangsta", + "fucku2", + "freeze", + "game", + "salvador", + "droopy", + "objects", + "passwd", + "lllll", + "loaded", + "louis", + "manchester", + "losers", + "vedder", + "clit", + "chunky", + "darkman", + "damage", + "buckshot", + "buddah", + "boobed", + "henti", + "hillary", + "webber", + "winter1", + "ingrid", + "bigmike", + "beta", + "zidane", + "talon", + "slave1", + "pissoff", + "person", + "thegreat", + "living", + "lexus", + "matador", + "readers", + "riley", + "roberta", + "armani", + "ashlee", + "goldstar", + "5656", + "cards", + "fmale", + "ferris", + "fuking", + "gaston", + "fucku", + "ggggggg", + "sauron", + "diggler", + "pacers", + "looser", + "pounded", + "premier", + "pulled", + "town", + "trisha", + "triangle", + "cornell", + "collin", + "cosmic", + "deeper", + "depeche", + "norway", + "bright", + "helmet", + "kristine", + "kendall", + "mustard", + "misty1", + "watch", + "jagger", + "bertie", + "berger", + "word", + "3x7pxr", + "silver1", + "smoking", + "snowboar", + "sonny", + "paula", + "penetrating", + "photoes", + "lesbens", + "lambert", + "lindros", + "lillian", + "roadking", + "rockford", + "1357", + "143143", + "asasas", + "goodboy", + "898989", + "chicago1", + "card", + "ferrari1", + "galeries", + "godfathe", + "gawker", + "gargoyle", + "gangster", + "rubble", + "rrrr", + "onetime", + "pussyman", + "pooppoop", + "trapper", + "twenty", + "abraham", + "cinder", + "company", + "newcastl", + "boricua", + "bunny1", + "boxer", + "hotred", + "hockey1", + "hooper", + "edward1", + "evan", + "kris", + "misery", + "moscow", + "milk", + "mortgage", + "bigtit", + "show", + "snoopdog", + "three", + "lionel", + "leanne", + "joshua1", + "july", + "1230", + "assholes", + "cedric", + "fallen", + "farley", + "gene", + "frisky", + "sanity", + "script", + "divine", + "dharma", + "lucky13", + "property", + "tricia", + "akira", + "desiree", + "broadway", + "butterfly", + "hunt", + "hotbox", + "hootie", + "heat", + "howdy", + "earthlink", + "karma", + "kiteboy", + "motley", + "westwood", + "1988", + "bert", + "blackbir", + "biggles", + "wrench", + "working", + "wrestle", + "slippery", + "pheonix", + "penny1", + "pianoman", + "tomorrow", + "thedude", + "jenn", + "jonjon", + "jones1", + "mattie", + "memory", + "micheal", + "roadrunn", + "arrow", + "attitude", + "azzer", + "seahawks", + "diehard", + "dotcom", + "lola", + "tunafish", + "chivas", + "cinnamon", + "clouds", + "deluxe", + "northern", + "nuclear", + "north", + "boom", + "boobie", + "hurley", + "krishna", + "momomo", + "modles", + "volume", + "23232323", + "bluedog", + "wwwwwww", + "zerocool", + "yousuck", + "pluto", + "limewire", + "link", + "joung", + "marcia", + "awnyce", + "gonavy", + "haha", + "films+pic+galeries", + "fabian", + "francois", + "girsl", + "fuckthis", + "girfriend", + "rufus", + "drive", + "uncencored", + "a123456", + "airport", + "clay", + "chrisbln", + "combat", + "cygnus", + "cupoi", + "never", + "netscape", + "brett", + "hhhhhhhh", + "eagles1", + "elite", + "knockers", + "kendra", + "mommy", + "1958", + "tazmania", + "shonuf", + "piano", + "pharmacy", + "thedog", + "lips", + "jillian", + "jenkins", + "midway", + "arsenal1", + "anaconda", + "australi", + "gromit", + "gotohell", + "787878", + "66666", + "carmex2", + "camber", + "gator1", + "ginger1", + "fuzzy", + "seadoo", + "dorian", + "lovesex", + "rancid", + "uuuuuu", + "911911", + "nature", + "bulldog1", + "helen", + "health", + "heater", + "higgins", + "kirk", + "monalisa", + "mmmmmmm", + "whiteout", + "virtual", + "ventura", + "jamie1", + "japanes", + "james007", + "2727", + "2469", + "blam", + "bitchass", + "believe", + "zephyr", + "stiffy", + "sweet1", + "silent", + "southpar", + "spectre", + "tigger1", + "tekken", + "lenny", + "lakota", + "lionking", + "jjjjjjj", + "medical", + "megatron", + "1369", + "hawaiian", + "gymnastic", + "golfer1", + "gunners", + "7779311", + "515151", + "famous", + "glass", + "screen", + "rudy", + "royal", + "sanfran", + "drake", + "optimus", + "panther1", + "love1", + "mail", + "maggie1", + "pudding", + "venice", + "aaron1", + "delphi", + "niceass", + "bounce", + "busted", + "house1", + "killer1", + "miracle", + "momo", + "musashi", + "jammin", + "2003", + "234567", + "wp2003wp", + "submit", + "silence", + "sssssss", + "state", + "spikes", + "sleeper", + "passwort", + "toledo", + "kume", + "media", + "meme", + "medusa", + "mantis", + "remote", + "reading", + "reebok", + "1017", + "artemis", + "hampton", + "harry1", + "cafc91", + "fettish", + "friendly", + "oceans", + "oooooooo", + "mango", + "ppppp", + "trainer", + "troy", + "uuuu", + "909090", + "cross", + "death1", + "news", + "bullfrog", + "hokies", + "holyshit", + "eeeeeee", + "mitch", + "jasmine1", + "&", + "&", + "sergeant", + "spinner", + "leon", + "jockey", + "records", + "right", + "babyblue", + "hans", + "gooner", + "474747", + "cheeks", + "cars", + "candice", + "fight", + "glow", + "pass1234", + "parola", + "okokok", + "pablo", + "magical", + "major", + "ramsey", + "poseidon", + "989898", + "confused", + "circle", + "crusher", + "cubswin", + "nnnn", + "hollywood", + "erin", + "kotaku", + "milo", + "mittens", + "whatsup", + "vvvvv", + "iomega", + "insertions", + "bengals", + "bermuda", + "biit", + "yellow1", + "12345", + "spike1", + "south", + "sowhat", + "pitures", + "peacock", + "pecker", + "theend", + "juliette", + "jimmie", + "romance", + "augusta", + "hayabusa", + "hawkeyes", + "castro", + "florian", + "geoffrey", + "dolly", + "lulu", + "qaz123", + "usarmy", + "twinkle", + "cloud", + "chuckles", + "cold", + "hounddog", + "hover", + "hothot", + "europa", + "ernie", + "kenshin", + "kojak", + "mikey1", + "water1", + "196969", + "because", + "wraith", + "zebra", + "wwwww", + "33333", + "simon1", + "spider1", + "snuffy", + "philippe", + "thunderb", + "teddy1", + "lesley", + "marino13", + "maria1", + "redline", + "renault", + "aloha", + "antoine", + "handyman", + "cerberus", + "gamecock", + "gobucks", + "freesex", + "duffman", + "ooooo", + "papa", + "nuggets", + "magician", + "longbow", + "preacher", + "porno1", + "county", + "chrysler", + "contains", + "dalejr", + "darius", + "darlene", + "dell", + "navy", + "buffy1", + "hedgehog", + "hoosiers", + "honey1", + "hott", + "heyhey", + "europe", + "dutchess", + "everest", + "wareagle", + "ihateyou", + "sunflowe", + "3434", + "senators", + "shag", + "spoon", + "sonoma", + "stalker", + "poochie", + "terminal", + "terefon", + "laurence", + "maradona", + "maryann", + "marty", + "roman", + "1007", + "142536", + "alibaba", + "america1", + "bartman", + "astro", + "goth", + "century", + "chicken1", + "cheater", + "four", + "ghost1", + "passpass", + "oral", + "r2d2c3po", + "civic", + "cicero", + "myxworld", + "kkkkk", + "missouri", + "wishbone", + "infiniti", + "jameson", + "1a2b3c", + "1qwerty", + "wonderboy", + "skip", + "shojou", + "stanford", + "sparky1", + "smeghead", + "poiuy", + "titanium", + "torres", + "lantern", + "jelly", + "jeanne", + "meier", + "1213", + "bayern", + "basset", + "gsxr750", + "cattle", + "charlene", + "fishing1", + "fullmoon", + "gilles", + "dima", + "obelix", + "popo", + "prissy", + "ramrod", + "unique", + "absolute", + "bummer", + "hotone", + "dynasty", + "entry", + "konyor", + "missy1", + "moses", + "282828", + "yeah", + "xyz123", + "stop", + "426hemi", + "404040", + "seinfeld", + "simmons", + "pingpong", + "lazarus", + "matthews", + "marine1", + "manning", + "recovery", + "12345a", + "beamer", + "babyface", + "greece", + "gustav", + "7007", + "charity", + "camilla", + "ccccccc", + "faggot", + "foxy", + "frozen", + "gladiato", + "duckie", + "dogfood", + "paranoid", + "packers1", + "longjohn", + "radical", + "tuna", + "clarinet", + "claudio", + "circus", + "danny1", + "novell", + "nights", + "bonbon", + "kashmir", + "kiki", + "mortimer", + "modelsne", + "moondog", + "monaco", + "vladimir", + "insert", + "1953", + "zxc123", + "supreme", + "3131", + "sexxx", + "selena", + "softail", + "poipoi", + "pong", + "together", + "mars", + "martin1", + "rogue", + "alone", + "avalanch", + "audia4", + "55bgates", + "cccccccc", + "chick", + "came11", + "figaro", + "geneva", + "dogboy", + "dnsadm", + "dipshit", + "paradigm", + "othello", + "operator", + "officer", + "malone", + "post", + "rafael", + "valencia", + "tripod", + "choice", + "chopin", + "coucou", + "coach", + "cocksuck", + "common", + "creature", + "borussia", + "book", + "browning", + "heritage", + "hiziad", + "homerj", + "eight", + "earth", + "millions", + "mullet", + "whisky", + "jacques", + "store", + "4242", + "speedo", + "starcraf", + "skylar", + "spaceman", + "piggy", + "pierce", + "tiger2", + "legos", + "lala", + "jezebel", + "judy", + "joker1", + "mazda", + "barton", + "baker", + "727272", + "chester1", + "fishman", + "food", + "rrrrrrrr", + "sandwich", + "dundee", + "lumber", + "magazine", + "radar", + "ppppppp", + "tranny", + "aaliyah", + "admiral", + "comics", + "cleo", + "delight", + "buttfuck", + "homeboy", + "eternal", + "kilroy", + "kellie", + "khan", + "violin", + "wingman", + "walmart", + "bigblue", + "blaze", + "beemer", + "beowulf", + "bigfish", + "yyyyyyy", + "woodie", + "yeahbaby", + "123456", + "tbone", + "style", + "syzygy", + "starter", + "lemon", + "linda1", + "merlot", + "mexican", + "11235813", + "anita", + "banner", + "bangbang", + "badman", + "barfly", + "grease", + "carla", + "charles1", + "ffffffff", + "screw", + "doberman", + "diane", + "dogshit", + "overkill", + "counter", + "coolguy", + "claymore", + "demons", + "demo", + "nomore", + "normal", + "brewster", + "hhhhhhh", + "hondas", + "iamgod", + "enterme", + "everett", + "electron", + "eastside", + "kayla", + "minimoni", + "mybaby", + "wildbill", + "wildcard", + "ipswich", + "200000", + "bearcat", + "zigzag", + "yyyyyyyy", + "xander", + "sweetnes", + "369369", + "skyler", + "skywalker", + "pigeon", + "peyton", + "tipper", + "lilly", + "asdf123", + "alphabet", + "asdzxc", + "babybaby", + "banane", + "barnes", + "guyver", + "graphics", + "grand", + "chinook", + "florida1", + "flexible", + "fuckinside", + "otis", + "ursitesux", + "tototo", + "trust", + "tower", + "adam12", + "christma", + "corey", + "chrome", + "buddie", + "bombers", + "bunker", + "hippie", + "keegan", + "misfits", + "vickie", + "292929", + "woofer", + "wwwwwwww", + "stubby", + "sheep", + "secrets", + "sparta", + "stang", + "spud", + "sporty", + "pinball", + "jorge", + "just4fun", + "johanna", + "maxxxx", + "rebecca1", + "gunther", + "fatima", + "fffffff", + "freeway", + "garion", + "score", + "rrrrr", + "sancho", + "outback", + "maggot", + "puddin", + "trial", + "adrienne", + "987456", + "colton", + "clyde", + "brain", + "brains", + "hoops", + "eleanor", + "dwayne", + "kirby", + "mydick", + "villa", + "19691969", + "bigcat", + "becker", + "shiner", + "silverad", + "spanish", + "templar", + "lamer", + "juicy", + "marsha", + "mike1", + "maximum", + "rhiannon", + "real", + "1223", + "10101010", + "arrows", + "andres", + "alucard", + "baldwin", + "baron", + "avenue", + "ashleigh", + "haggis", + "channel", + "cheech", + "safari", + "ross", + "dog123", + "orion1", + "paloma", + "qwerasdf", + "presiden", + "vegitto", + "trees", + "969696", + "adonis", + "colonel", + "cookie1", + "newyork1", + "brigitte", + "buddyboy", + "hellos", + "heineken", + "dwight", + "eraser", + "kerstin", + "motion", + "moritz", + "millwall", + "visual", + "jaybird", + "1983", + "beautifu", + "bitter", + "yvette", + "zodiac", + "steven1", + "sinister", + "slammer", + "smashing", + "slick1", + "sponge", + "teddybea", + "theater", + "this", + "ticklish", + "lipstick", + "jonny", + "massage", + "mann", + "reynolds", + "ring", + "1211", + "amazing", + "aptiva", + "applepie", + "bailey1", + "guitar1", + "chanel", + "canyon", + "gagged", + "fuckme1", + "rough", + "digital1", + "dinosaur", + "punk", + "98765", + "90210", + "clowns", + "cubs", + "daniels", + "deejay", + "nigga", + "naruto", + "boxcar", + "icehouse", + "hotties", + "electra", + "kent", + "widget", + "india", + "insanity", + "1986", + "2004", + "best", + "bluefish", + "bingo1", + "*****", + "stratus", + "strength", + "sultan", + "storm1", + "44444", + "4200", + "sentnece", + "season", + "sexyboy", + "sigma", + "smokie", + "spam", + "point", + "pippo", + "ticket", + "temppass", + "joel", + "manman", + "medicine", + "1022", + "anton", + "almond", + "bacchus", + "aztnm", + "axio", + "awful", + "bamboo", + "hakr", + "gregor", + "hahahaha", + "5678", + "casanova", + "caprice", + "camero1", + "fellow", + "fountain", + "dupont", + "dolphin1", + "dianne", + "paddle", + "magnet", + "qwert1", + "pyon", + "porsche1", + "tripper", + "vampires", + "coming", + "noway", + "burrito", + "bozo", + "highheel", + "hughes", + "hookem", + "eddie1", + "ellie", + "entropy", + "kkkkkkkk", + "kkkkkkk", + "illinois", + "jacobs", + "1945", + "1951", + "24680", + "21212121", + "100000", + "stonecold", + "taco", + "subzero", + "sharp", + "sexxxy", + "skolko", + "shanna", + "skyhawk", + "spurs1", + "sputnik", + "piazza", + "testpass", + "letter", + "lane", + "kurt", + "jiggaman", + "matilda", + "1224", + "harvard", + "hannah1", + "525252", + "4ever", + "carbon", + "chef", + "federico", + "ghosts", + "gina", + "scorpio1", + "rt6ytere", + "madison1", + "loki", + "raquel", + "promise", + "coolness", + "christina", + "coldbeer", + "citadel", + "brittney", + "highway", + "evil", + "monarch", + "morgan1", + "washingt", + "1997", + "bella1", + "berry", + "yaya", + "yolanda", + "superb", + "taxman", + "studman", + "stephanie", + "3636", + "sherri", + "sheriff", + "shepherd", + "poland", + "pizzas", + "tiffany1", + "toilet", + "latina", + "lassie", + "larry1", + "joseph1", + "mephisto", + "meagan", + "marian", + "reptile", + "rico", + "razor", + "1013", + "barron", + "hammer1", + "gypsy", + "grande", + "carroll", + "camper", + "chippy", + "cat123", + "call", + "chimera", + "fiesta", + "glock", + "glenn", + "domain", + "dieter", + "dragonba", + "onetwo", + "nygiants", + "odessa", + "password2", + "louie", + "quartz", + "prowler", + "prophet", + "towers", + "ultra", + "cocker", + "corleone", + "dakota1", + "cumm", + "nnnnnnn", + "natalia", + "boxers", + "hugo", + "heynow", + "hollow", + "iceberg", + "elvira", + "kittykat", + "kate", + "kitchen", + "wasabi", + "vikings1", + "impact", + "beerman", + "string", + "sleep", + "splinter", + "snoopy1", + "pipeline", + "pocket", + "legs", + "maple", + "mickey1", + "manuela", + "mermaid", + "micro", + "meowmeow", + "redbird", + "alisha", + "baura", + "battery", + "grass", + "chevys", + "chestnut", + "caravan", + "carina", + "charmed", + "fraser", + "frogman", + "diving", + "dogger", + "draven", + "drifter", + "oatmeal", + "paris1", + "longdong", + "quant4307s", + "rachel1", + "vegitta", + "cole", + "cobras", + "corsair", + "dadada", + "noelle", + "mylife", + "nine", + "bowwow", + "body", + "hotrats", + "eastwood", + "moonligh", + "modena", + "wave", + "illusion", + "iiiiiii", + "jayhawks", + "birgit", + "zone", + "sutton", + "susana", + "swingers", + "shocker", + "shrimp", + "sexgod", + "squall", + "stefanie", + "squeeze", + "soul", + "patrice", + "poiu", + "players", + "tigers1", + "toejam", + "tickler", + "line", + "julie1", + "jimbo1", + "jefferso", + "juanita", + "michael2", + "rodeo", + "robot", + "1023", + "annie1", + "bball", + "guess", + "happy2", + "charter", + "farm", + "flasher", + "falcon1", + "fiction", + "fastball", + "gadget", + "scrabble", + "diaper", + "dirtbike", + "dinner", + "oliver1", + "partner", + "paco", + "lucille", + "macman", + "poopy", + "popper", + "postman", + "ttttttt", + "ursula", + "acura", + "cowboy1", + "conan", + "daewoo", + "cyrus", + "customer", + "nation", + "nemrac58", + "nnnnn", + "nextel", + "bolton", + "bobdylan", + "hopeless", + "eureka", + "extra", + "kimmie", + "kcj9wx5n", + "killbill", + "musica", + "volkswag", + "wage", + "windmill", + "wert", + "vintage", + "iloveyou1", + "itsme", + "bessie", + "zippo", + "311311", + "starligh", + "smokey1", + "spot", + "snappy", + "soulmate", + "plasma", + "thelma", + "tonight", + "krusty", + "just4me", + "mcdonald", + "marius", + "rochelle", + "rebel1", + "1123", + "alfredo", + "aubrey", + "audi", + "chantal", + "fick", + "goaway", + "roses", + "sales", + "rusty2", + "dirt", + "dogbone", + "doofus", + "ooooooo", + "oblivion", + "mankind", + "luck", + "mahler", + "lllllll", + "pumper", + "puck", + "pulsar", + "valkyrie", + "tupac", + "compass", + "concorde", + "costello", + "cougars", + "delaware", + "niceguy", + "nocturne", + "bob123", + "boating", + "bronze", + "hopkins", + "herewego", + "hewlett", + "houhou", + "hubert", + "earnhard", + "eeeeeeee", + "keller", + "mingus", + "mobydick", + "venture", + "verizon", + "imation", + "1950", + "1948", + "1949", + "223344", + "bigbig", + "blossom", + "zack", + "wowwow", + "sissy", + "skinner", + "spiker", + "square", + "snooker", + "sluggo", + "player1", + "junk", + "jeannie", + "jsbach", + "jumbo", + "jewel", + "medic", + "robins", + "reddevil", + "reckless", + "123456a", + "1125", + "1031", + "beacon", + "astra", + "gumby", + "hammond", + "hassan", + "757575", + "585858", + "chillin", + "fuck1", + "sander", + "lowell", + "radiohea", + "upyours", + "trek", + "courage", + "coolcool", + "classics", + "choochoo", + "darryl", + "nikki1", + "nitro", + "bugs", + "boytoy", + "ellen", + "excite", + "kirsty", + "kane", + "wingnut", + "wireless", + "icu812", + "1master", + "beatle", + "bigblock", + "blanca", + "wolfen", + "summer99", + "sugar1", + "tartar", + "sexysexy", + "senna", + "sexman", + "sick", + "someone", + "soprano", + "pippin", + "platypus", + "pixies", + "telephon", + "land", + "laura1", + "laurent", + "rimmer", + "road", + "report", + "1020", + "12qwaszx", + "arturo", + "around", + "hamish", + "halifax", + "fishhead", + "forum", + "dododo", + "doit", + "outside", + "paramedi", + "lonesome", + "mandy1", + "twist", + "uuuuu", + "uranus", + "ttttt", + "butcher", + "bruce1", + "helper", + "hopeful", + "eduard", + "dusty1", + "kathy1", + "katherin", + "moonbeam", + "muscles", + "monster1", + "monkeybo", + "morton", + "windsurf", + "vvvvvvv", + "vivid", + "install", + "1947", + "187187", + "1941", + "1952", + "tatiana", + "susan1", + "31415926", + "sinned", + "sexxy", + "senator", + "sebastian", + "shadows", + "smoothie", + "snowflak", + "playstat", + "playa", + "playboy1", + "toaster", + "jerry1", + "marie1", + "mason1", + "merlin1", + "roger1", + "roadster", + "112358", + "1121", + "andrea1", + "bacardi", + "auto", + "hardware", + "hardy", + "789789", + "5555555", + "captain1", + "flores", + "fergus", + "sascha", + "rrrrrrr", + "dome", + "onion", + "nutter", + "lololo", + "qqqqqqq", + "quick", + "undertak", + "uuuuuuuu", + "uuuuuuu", + "criminal", + "cobain", + "cindy1", + "coors", + "dani", + "descent", + "nimbus", + "nomad", + "nanook", + "norwich", + "bomb", + "bombay", + "broker", + "hookup", + "kiwi", + "winners", + "jackpot", + "1a2b3c4d", + "1776", + "beardog", + "bighead", + "blast", + "bird33", + "987", + "stress", + "shot", + "spooge", + "pelican", + "peepee", + "perry", + "pointer", + "titan", + "thedoors", + "jeremy1", + "annabell", + "altima", + "baba", + "hallie", + "hate", + "hardone", + "5454", + "candace", + "catwoman", + "flip", + "faithful", + "finance", + "farmboy", + "farscape", + "genesis1", + "salomon", + "destroy", + "papers", + "option", + "page", + "loser1", + "lopez", + "r2d2", + "pumpkins", + "training", + "chriss", + "cumcum", + "ninjas", + "ninja1", + "hung", + "erika", + "eduardo", + "killers", + "miller1", + "islander", + "jamesbond", + "intel", + "jarvis", + "19841984", + "2626", + "bizzare", + "blue12", + "biker", + "yoyoma", + "sushi", + "styles", + "shitface", + "series", + "shanti", + "spanker", + "steffi", + "smart", + "sphinx", + "please1", + "paulie", + "pistons", + "tiburon", + "limited", + "maxwell1", + "mdogg", + "rockies", + "armstron", + "alexia", + "arlene", + "alejandr", + "arctic", + "banger", + "audio", + "asimov", + "augustus", + "grandpa", + "753951", + "4you", + "chilly", + "care1839", + "chapman", + "flyfish", + "fantasia", + "freefall", + "santa", + "sandrine", + "oreo", + "ohshit", + "macbeth", + "madcat", + "loveya", + "mallory", + "rage", + "quentin", + "qwerqwer", + "project", + "ramirez", + "colnago", + "citizen", + "chocha", + "cobalt", + "crystal1", + "dabears", + "nevets", + "nineinch", + "broncos1", + "helene", + "huge", + "edgar", + "epsilon", + "easter", + "kestrel", + "moron", + "virgil", + "winston1", + "warrior1", + "iiiiiiii", + "iloveyou2", + "1616", + "beat", + "bettina", + "woowoo", + "zander", + "straight", + "shower", + "sloppy", + "specialk", + "tinkerbe", + "jellybea", + "reader", + "romero", + "redsox1", + "ride", + "1215", + "1112", + "annika", + "arcadia", + "answer", + "baggio", + "base", + "guido", + "555666", + "carmel", + "cayman", + "cbr900rr", + "chips", + "gabriell", + "gertrude", + "glennwei", + "roxy", + "sausages", + "disco", + "pass1", + "luna", + "lovebug", + "macmac", + "queenie", + "puffin", + "vanguard", + "trip", + "trinitro", + "airwolf", + "abbott", + "aaa111", + "cocaine", + "cisco", + "cottage", + "dayton", + "deadly", + "datsun", + "bricks", + "bumper", + "eldorado", + "kidrock", + "wizard1", + "whiskers", + "wind", + "wildwood", + "istheman", + "interest", + "italy", + "25802580", + "benoit", + "bigones", + "woodland", + "wolfpac", + "strawber", + "suicide", + "3030", + "sheba1", + "sixpack", + "peace1", + "physics", + "pearson", + "tigger2", + "toad", + "megan1", + "meow", + "ringo", + "roll", + "amsterdam", + "717171", + "686868", + "5424", + "catherine", + "canuck", + "football1", + "footjob", + "fulham", + "seagull", + "orgy", + "lobo", + "mancity", + "truth", + "trace", + "vancouve", + "vauxhall", + "acidburn", + "derf", + "myspace1", + "boozer", + "buttercu", + "howell", + "hola", + "easton", + "minemine", + "munch", + "jared", + "1dragon", + "biology", + "bestbuy", + "bigpoppa", + "blackout", + "blowfish", + "bmw325", + "bigbob", + "stream", + "talisman", + "tazz", + "sundevil", + "3333333", + "skate", + "shutup", + "shanghai", + "shop", + "spencer1", + "slowhand", + "polish", + "pinky1", + "tootie", + "thecrow", + "leroy", + "jonathon", + "jubilee", + "jingle", + "martine", + "matrix1", + "manowar", + "michaels", + "messiah", + "mclaren", + "resident", + "reilly", + "redbaron", + "rollins", + "romans", + "return", + "rivera", + "andromed", + "athlon", + "beach1", + "badgers", + "guitars", + "harald", + "harddick", + "gotribe", + "6996", + "7grout", + "5wr2i7h8", + "635241", + "chase1", + "carver", + "charlotte", + "fallout", + "fiddle", + "fredrick", + "fenris", + "francesc", + "fortuna", + "ferguson", + "fairlane", + "felipe", + "felix1", + "forward", + "gasman", + "frost", + "fucks", + "sahara", + "sassy1", + "dogpound", + "dogbert", + "divx1", + "manila", + "loretta", + "priest", + "pornporn", + "quasar", + "venom", + "987987", + "access1", + "clippers", + "daylight", + "decker", + "daman", + "data", + "dentist", + "crusty", + "nathan1", + "nnnnnnnn", + "bruno1", + "bucks", + "brodie", + "budapest", + "kittens", + "kerouac", + "mother1", + "waldo1", + "wedding", + "whistler", + "whatwhat", + "wanderer", + "idontkno", + "1942", + "1946", + "bigdawg", + "bigpimp", + "zaqwsx", + "414141", + "3000gt", + "434343", + "shoes", + "serpent", + "starr", + "smurf", + "pasword", + "tommie", + "thisisit", + "lake", + "john1", + "robotics", + "redeye", + "rebelz", + "1011", + "alatam", + "asses", + "asians", + "bama", + "banzai", + "harvest", + "gonzalez", + "hair", + "hanson", + "575757", + "5329", + "cascade", + "chinese", + "fatty", + "fender1", + "flower2", + "funky", + "sambo", + "drummer1", + "dogcat", + "dottie", + "oedipus", + "osama", + "macleod", + "prozac", + "private1", + "rampage", + "punch", + "presley", + "concord", + "cook", + "cinema", + "cornwall", + "cleaner", + "christopher", + "ciccio", + "corinne", + "clutch", + "corvet07", + "daemon", + "bruiser", + "boiler", + "hjkl", + "eyes", + "egghead", + "expert", + "ethan", + "kasper", + "mordor", + "wasted", + "jamess", + "iverson3", + "bluesman", + "zouzou", + "90909", + "1002", + "switch", + "stone1", + "4040", + "sisters", + "sexo", + "shawna", + "smith1", + "sperma", + "sneaky", + "polska", + "thewho", + "terminat", + "krypton", + "lawson", + "library", + "lekker", + "jules", + "johnson1", + "johann", + "justus", + "rockie", + "romano", + "aspire", + "bastards", + "goodie", + "cheese1", + "fenway", + "fishon", + "fishin", + "fuckoff1", + "girls1", + "sawyer", + "dolores", + "desmond", + "duane", + "doomsday", + "pornking", + "ramones", + "rabbits", + "transit", + "aaaaa1", + "clock", + "delilah", + "noel", + "boyz", + "bookworm", + "bongo", + "bunnies", + "brady", + "buceta", + "highbury", + "henry1", + "heels", + "eastern", + "krissy", + "mischief", + "mopar", + "ministry", + "vienna", + "weston", + "wildone", + "vodka", + "jayson", + "bigbooty", + "beavis1", + "betsy", + "xxxxxx1", + "yogibear", + "1", + "815", + "zulu", + "420000", + "september", + "sigmar", + "sprout", + "stalin", + "peggy", + "patch", + "lkjhgfds", + "lagnaf", + "rolex", + "redfox", + "referee", + "123123123", + "1231", + "angus1", + "ariana", + "ballin", + "attila", + "hall", + "greedy", + "grunt", + "747474", + "carpedie", + "cecile", + "caramel", + "foxylady", + "field", + "gatorade", + "gidget", + "futbol", + "frosch", + "saiyan", + "schmidt", + "drums", + "donner", + "doggy1", + "drum", + "doudou", + "pack", + "pain", + "nutmeg", + "quebec", + "valdepen", + "trash", + "triple", + "tosser", + "tuscl", + "track", + "comfort", + "choke", + "comein", + "cola", + "deputy", + "deadpool", + "bremen", + "borders", + "bronson", + "break", + "hotass", + "hotmail1", + "eskimo", + "eggman", + "koko", + "kieran", + "katrin", + "kordell1", + "komodo", + "mone", + "munich", + "vvvvvvvv", + "winger", + "jaeger", + "ivan", + "jackson5", + "2222222", + "bergkamp", + "bennie", + "bigben", + "zanzibar", + "worm", + "xxx123", + "sunny1", + "373737", + "services", + "sheridan", + "slater", + "slayer1", + "snoop", + "stacie", + "peachy", + "thecure", + "times", + "little1", + "jennaj", + "marquis", + "middle", + "rasta69", + "1114", + "aries", + "havana", + "gratis", + "calgary", + "checkers", + "flanker", + "salope", + "dirty1", + "draco", + "dogface", + "luv2epus", + "rainbow6", + "qwerty123", + "umpire", + "turnip", + "vbnm", + "tucson", + "troll", + "aileen", + "codered", + "commande", + "damon", + "nana", + "neon", + "nico", + "nightwin", + "neil", + "boomer1", + "bushido", + "hotmail0", + "horace", + "enternow", + "kaitlyn", + "keepout", + "karen1", + "mindy", + "mnbv", + "viewsoni", + "volcom", + "wizards", + "wine", + "1995", + "berkeley", + "bite", + "zach", + "woodstoc", + "tarpon", + "shinobi", + "starstar", + "phat", + "patience", + "patrol", + "toolbox", + "julien", + "johnny1", + "joebob", + "marble", + "riders", + "reflex", + "120676", + "1235", + "angelus", + "anthrax", + "atlas", + "hawks", + "grandam", + "harlem", + "hawaii50", + "gorgeous", + "655321", + "cabron", + "challeng", + "callisto", + "firewall", + "firefire", + "fischer", + "flyer", + "flower1", + "factory", + "federal", + "gambler", + "frodo1", + "funk", + "sand", + "sam123", + "scania", + "dingo", + "papito", + "passmast", + "olive", + "palermo", + "ou8123", + "lock", + "ranch", + "pride", + "randy1", + "twiggy", + "travis1", + "transfer", + "treetop", + "addict", + "admin1", + "963852", + "aceace", + "clarissa", + "cliff", + "cirrus", + "clifton", + "colin", + "bobdole", + "bonner", + "bogus", + "bonjovi", + "bootsy", + "boater", + "elway7", + "edison", + "kelvin", + "kenny1", + "moonshin", + "montag", + "moreno", + "wayne1", + "white1", + "jazzy", + "jakejake", + "1994", + "1991", + "2828", + "blunt", + "bluejays", + "beau", + "belmont", + "worthy", + "systems", + "sensei", + "southpark", + "stan", + "peeper", + "pharao", + "pigpen", + "tomahawk", + "teensex", + "leedsutd", + "larkin", + "jermaine", + "jeepster", + "jimjim", + "josephin", + "melons", + "marlon", + "matthias", + "marriage", + "robocop", + "1003", + "1027", + "antelope", + "azsxdc", + "gordo", + "hazard", + "granada", + "8989", + "7894", + "ceasar", + "cabernet", + "cheshire", + "california", + "chelle", + "candy1", + "fergie", + "fanny", + "fidelio", + "giorgio", + "fuckhead", + "ruth", + "sanford", + "diego", + "dominion", + "devon", + "panic", + "longer", + "mackie", + "qawsed", + "trucking", + "twelve", + "chloe1", + "coral", + "daddyo", + "nostromo", + "boyboy", + "booster", + "bucky", + "honolulu", + "esquire", + "dynamite", + "motor", + "mollydog", + "wilder", + "windows1", + "waffle", + "wallet", + "warning", + "virus", + "washburn", + "wealth", + "vincent1", + "jabber", + "jaguars", + "javelin", + "irishman", + "idefix", + "bigdog1", + "blue42", + "blanked", + "blue32", + "biteme1", + "bearcats", + "blaine", + "yessir", + "sylveste", + "team", + "stephan", + "sunfire", + "tbird", + "stryker", + "3ip76k2", + "sevens", + "sheldon", + "pilgrim", + "tenchi", + "titman", + "leeds", + "lithium", + "lander", + "linkin", + "landon", + "marijuan", + "mariner", + "markie", + "midnite", + "reddwarf", + "1129", + "123asd", + "12312312", + "allstar", + "albany", + "asdf12", + "antonia", + "aspen", + "hardball", + "goldfing", + "7734", + "49ers", + "carlo", + "chambers", + "cable", + "carnage", + "callum", + "carlos1", + "fitter", + "fandango", + "festival", + "flame", + "gofast", + "gamma", + "fucmy69", + "scrapper", + "dogwood", + "django", + "magneto", + "loose", + "premium", + "addison", + "9999999", + "abc1234", + "cromwell", + "newyear", + "nichole", + "bookie", + "burns", + "bounty", + "brown1", + "bologna", + "earl", + "entrance", + "elway", + "killjoy", + "kerry", + "keenan", + "kick", + "klondike", + "mini", + "mouser", + "mohammed", + "wayer", + "impreza", + "irene", + "insomnia", + "24682468", + "2580", + "24242424", + "billbill", + "bellaco", + "blessing", + "blues1", + "bedford", + "blanco", + "blunts", + "stinks", + "teaser", + "streets", + "sf49ers", + "shovel", + "solitude", + "spikey", + "sonia", + "pimpdadd", + "timeout", + "toffee", + "lefty", + "johndoe", + "johndeer", + "mega", + "manolo", + "mentor", + "margie", + "ratman", + "ridge", + "record", + "rhodes", + "robin1", + "1124", + "1210", + "1028", + "1226", + "another", + "babylove", + "barbados", + "harbor", + "gramma", + "646464", + "carpente", + "chaos1", + "fishbone", + "fireblad", + "glasgow", + "frogs", + "scissors", + "screamer", + "salem", + "scuba1", + "ducks", + "driven", + "doggies", + "dicky", + "donovan", + "obsidian", + "rams", + "progress", + "tottenham", + "aikman", + "comanche", + "corolla", + "clarke", + "conway", + "cumslut", + "cyborg", + "dancing", + "boston1", + "bong", + "houdini", + "helmut", + "elvisp", + "edge", + "keksa12", + "misha", + "monty1", + "monsters", + "wetter", + "watford", + "wiseguy", + "veronika", + "visitor", + "janelle", + "1989", + "1987", + "20202020", + "biatch", + "beezer", + "bigguns", + "blueball", + "bitchy", + "wyoming", + "yankees2", + "wrestler", + "stupid1", + "sealteam", + "sidekick", + "simple1", + "smackdow", + "sporting", + "spiral", + "smeller", + "sperm", + "plato", + "tophat", + "test2", + "theatre", + "thick", + "toomuch", + "leigh", + "jello", + "jewish", + "junkie", + "maxim", + "maxime", + "meadow", + "remingto", + "roofer", + "124038", + "1018", + "1269", + "1227", + "123457", + "arkansas", + "alberta", + "aramis", + "andersen", + "beaker", + "barcelona", + "baltimor", + "googoo", + "goochi", + "852456", + "4711", + "catcher", + "carman", + "champ1", + "chess", + "fortress", + "fishfish", + "firefigh", + "geezer", + "rsalinas", + "samuel1", + "saigon", + "scooby1", + "doors", + "dick1", + "devin", + "doom", + "dirk", + "doris", + "dontknow", + "load", + "magpies", + "manfred", + "raleigh", + "vader1", + "universa", + "tulips", + "defense", + "mygirl", + "burn", + "bowtie", + "bowman", + "holycow", + "heinrich", + "honeys", + "enforcer", + "katherine", + "minerva", + "wheeler", + "witch", + "waterboy", + "jaime", + "irving", + "1992", + "23skidoo", + "bimbo", + "blue11", + "birddog", + "woodman", + "womble", + "zildjian", + "30303", + "stinker", + "stoppedby", + "sexybabe", + "speakers", + "slugger", + "spotty", + "smoke1", + "polopolo", + "perfect1", + "things", + "torpedo", + "tender", + "thrasher", + "lakeside", + "lilith", + "jimmys", + "jerk", + "junior1", + "marsh", + "masamune", + "rice", + "root", + "1214", + "april1", + "allgood", + "bambi", + "grinch", + "767676", + "5252", + "cherries", + "chipmunk", + "cezer121", + "carnival", + "capecod", + "finder", + "flint", + "fearless", + "goats", + "funstuff", + "gideon", + "savior", + "seabee", + "sandro", + "schalke", + "salasana", + "disney1", + "duckman", + "options", + "pancake", + "pantera1", + "malice", + "lookin", + "love123", + "lloyd", + "qwert123", + "puppet", + "prayers", + "union", + "tracer", + "crap", + "creation", + "cwoui", + "nascar24", + "hookers", + "hollie", + "hewitt", + "estrella", + "erection", + "ernesto", + "ericsson", + "edthom", + "kaylee", + "kokoko", + "kokomo", + "kimball", + "morales", + "mooses", + "monk", + "walton", + "weekend", + "inter", + "internal", + "1michael", + "1993", + "19781978", + "25252525", + "worker", + "summers", + "surgery", + "shibby", + "shamus", + "skibum", + "sheepdog", + "sex69", + "spliff", + "slipper", + "spoons", + "spanner", + "snowbird", + "slow", + "toriamos", + "temp123", + "tennesse", + "lakers1", + "jomama", + "julio", + "mazdarx7", + "rosario", + "recon", + "riddle", + "room", + "revolver", + "1025", + "1101", + "barney1", + "babycake", + "baylor", + "gotham", + "gravity", + "hallowee", + "hancock", + "616161", + "515000", + "caca", + "cannabis", + "castor", + "chilli", + "fdsa", + "getout", + "fuck69", + "gators1", + "sail", + "sable", + "rumble", + "dolemite", + "dork", + "dickens", + "duffer", + "dodgers1", + "painting", + "onions", + "logger", + "lorena", + "lookout", + "magic32", + "port", + "poon", + "prime", + "twat", + "coventry", + "citroen", + "christmas", + "civicsi", + "cocksucker", + "coochie", + "compaq1", + "nancy1", + "buzzer", + "boulder", + "butkus", + "bungle", + "hogtied", + "honor", + "hero", + "hotgirls", + "hilary", + "heidi1", + "eggplant", + "mustang6", + "mortal", + "monkey12", + "wapapapa", + "wendy1", + "volleyba", + "vibrate", + "vicky", + "bledsoe", + "blink", + "birthday4", + "woof", + "xxxxx1", + "talk", + "stephen1", + "suburban", + "stock", + "tabatha", + "sheeba", + "start1", + "soccer10", + "something", + "starcraft", + "soccer12", + "peanut1", + "plastics", + "penthous", + "peterbil", + "tools", + "tetsuo", + "torino", + "tennis1", + "termite", + "ladder", + "last", + "lemmein", + "lakewood", + "jughead", + "melrose", + "megane", + "reginald", + "redone", + "request", + "angela1", + "alive", + "alissa", + "goodgirl", + "gonzo1", + "golden1", + "gotyoass", + "656565", + "626262", + "capricor", + "chains", + "calvin1", + "foolish", + "fallon", + "getmoney", + "godfather", + "gabber", + "gilligan", + "runaway", + "salami", + "dummy", + "dungeon", + "dudedude", + "dumb", + "dope", + "opus", + "paragon", + "oxygen", + "panhead", + "pasadena", + "opendoor", + "odyssey", + "magellan", + "lottie", + "printing", + "pressure", + "prince1", + "trustme", + "christa", + "court", + "davies", + "neville", + "nono", + "bread", + "buffet", + "hound", + "kajak", + "killkill", + "mona", + "moto", + "mildred", + "winner1", + "vixen", + "whiteboy", + "versace", + "winona", + "voyager1", + "instant", + "indy", + "jackjack", + "bigal", + "beech", + "biggun", + "blake1", + "blue99", + "big1", + "woods", + "synergy", + "success1", + "336699", + "sixty9", + "shark1", + "skin", + "simba1", + "sharpe", + "sebring", + "spongebo", + "spunk", + "springs", + "sliver", + "phialpha", + "password9", + "pizza1", + "plane", + "perkins", + "pookey", + "tickling", + "lexingky", + "lawman", + "joe123", + "jolly", + "mike123", + "romeo1", + "redheads", + "reserve", + "apple123", + "alanis", + "ariane", + "antony", + "backbone", + "aviation", + "band", + "hand", + "green123", + "haley", + "carlitos", + "byebye", + "cartman1", + "camden", + "chewy", + "camaross", + "favorite6", + "forumwp", + "franks", + "ginscoot", + "fruity", + "sabrina1", + "devil666", + "doughnut", + "pantie", + "oldone", + "paintball", + "lumina", + "rainbow1", + "prosper", + "total", + "true", + "umbrella", + "ajax", + "951753", + "achtung", + "abc12345", + "compact", + "color", + "corn", + "complete", + "christi", + "closer", + "corndog", + "deerhunt", + "darklord", + "dank", + "nimitz", + "brandy1", + "bowl", + "breanna", + "holidays", + "hetfield", + "holein1", + "hillbill", + "hugetits", + "east", + "evolutio", + "kenobi", + "whiplash", + "waldo", + "wg8e3wjf", + "wing", + "istanbul", + "invis", + "1996", + "benton", + "bigjohn", + "bluebell", + "beef", + "beater", + "benji", + "bluejay", + "xyzzy", + "wrestling", + "storage", + "superior", + "suckdick", + "taichi", + "stellar", + "stephane", + "shaker", + "skirt", + "seymour", + "semper", + "splurge", + "squeak", + "pearls", + "playball", + "pitch", + "phyllis", + "pooky", + "piss", + "tomas", + "titfuck", + "joemama", + "johnny5", + "marcello", + "marjorie", + "married", + "maxi", + "rhubarb", + "rockwell", + "ratboy", + "reload", + "rooney", + "redd", + "1029", + "1030", + "1220", + "anchor", + "bbking", + "baritone", + "gryphon", + "gone", + "57chevy", + "494949", + "celeron", + "fishy", + "gladiator", + "fucker1", + "roswell", + "dougie", + "downer", + "dicker", + "diva", + "domingo", + "donjuan", + "nympho", + "omar", + "praise", + "racers", + "trick", + "trauma", + "truck1", + "trample", + "acer", + "corwin", + "cricket1", + "clemente", + "climax", + "denmark", + "cuervo", + "notnow", + "nittany", + "neutron", + "native", + "bosco1", + "buffa", + "breaker", + "hello2", + "hydro", + "estelle", + "exchange", + "explore", + "kisskiss", + "kittys", + "kristian", + "montecar", + "modem", + "mississi", + "mooney", + "weiner", + "washington", + "20012001", + "bigdick1", + "bibi", + "benfica", + "yahoo1", + "striper", + "tabasco", + "supra", + "383838", + "456654", + "seneca", + "serious", + "shuttle", + "socks", + "stanton", + "penguin1", + "pathfind", + "testibil", + "thethe", + "listen", + "lightning", + "lighting", + "jeter2", + "marma", + "mark1", + "metoo", + "republic", + "rollin", + "redleg", + "redbone", + "redskin", + "rocco", + "1245", + "armand", + "anthony7", + "altoids", + "andrews", + "barley", + "away", + "asswipe", + "bauhaus", + "bbbbbb1", + "gohome", + "harrier", + "golfpro", + "goldeney", + "818181", + "6666666", + "5000", + "5rxypn", + "cameron1", + "calling", + "checker", + "calibra", + "fields", + "freefree", + "faith1", + "fist", + "fdm7ed", + "finally", + "giraffe", + "glasses", + "giggles", + "fringe", + "gate", + "georgie", + "scamper", + "rrpass1", + "screwyou", + "duffy", + "deville", + "dimples", + "pacino", + "ontario", + "passthie", + "oberon", + "quest1", + "postov1000", + "puppydog", + "puffer", + "raining", + "protect", + "qwerty7", + "trey", + "tribe", + "ulysses", + "tribal", + "adam25", + "a1234567", + "compton", + "collie", + "cleopatr", + "contract", + "davide", + "norris", + "namaste", + "myrtle", + "buffalo1", + "bonovox", + "buckley", + "bukkake", + "burning", + "burner", + "bordeaux", + "burly", + "hun999", + "emilie", + "elmo", + "enters", + "enrique", + "keisha", + "mohawk", + "willard", + "vgirl", + "whale", + "vince", + "jayden", + "jarrett", + "1812", + "1943", + "222333", + "bigjim", + "bigd", + "zoom", + "wordup", + "ziggy1", + "yahooo", + "workout", + "young1", + "written", + "xmas", + "zzzzzz1", + "surfer1", + "strife", + "sunlight", + "tasha1", + "skunk", + "shauna", + "seth", + "soft", + "sprinter", + "peaches1", + "planes", + "pinetree", + "plum", + "pimping", + "theforce", + "thedon", + "toocool", + "leeann", + "laddie", + "list", + "lkjh", + "lara", + "joke", + "jupiter1", + "mckenzie", + "matty", + "rene", + "redrose", + "1200", + "102938", + "annmarie", + "alexa", + "antares", + "austin31", + "ground", + "goose1", + "737373", + "78945612", + "789987", + "6464", + "calimero", + "caster", + "casper1", + "cement", + "chevrolet", + "chessie", + "caddy", + "chill", + "child", + "canucks", + "feeling", + "favorite", + "fellatio", + "f00tball", + "francine", + "gateway2", + "gigi", + "gamecube", + "giovanna", + "rugby1", + "scheisse", + "dshade", + "dudes", + "dixie1", + "owen", + "offshore", + "olympia", + "lucas1", + "macaroni", + "manga", + "pringles", + "puff", + "tribble", + "trouble1", + "ussy", + "core", + "clint", + "coolhand", + "colonial", + "colt", + "debra", + "darthvad", + "dealer", + "cygnusx1", + "natalie1", + "newark", + "husband", + "hiking", + "errors", + "eighteen", + "elcamino", + "emmett", + "emilia", + "koolaid", + "knight1", + "murphy1", + "volcano", + "idunno", + "2005", + "2233", + "block", + "benito", + "blueberr", + "biguns", + "yamahar1", + "zapper", + "zorro1", + "911", + "3006", + "sixsix", + "shopper", + "siobhan", + "sextoy", + "stafford", + "snowboard", + "speedway", + "sounds", + "pokey", + "peabody", + "playboy2", + "titi", + "think", + "toast", + "toonarmy", + "lister", + "lambda", + "joecool", + "jonas", + "joyce", + "juniper", + "mercer", + "max123", + "manny", + "massimo", + "mariposa", + "met2002", + "reggae", + "ricky1", + "1236", + "1228", + "1016", + "all4one", + "arianna", + "baberuth", + "asgard", + "gonzales", + "484848", + "5683", + "6669", + "catnip", + "chiquita", + "charisma", + "capslock", + "cashmone", + "chat", + "figure", + "galant", + "frenchy", + "gizmodo1", + "girlies", + "gabby", + "garner", + "screwy", + "doubled", + "divers", + "dte4uw", + "done", + "dragonfl", + "maker", + "locks", + "rachelle", + "treble", + "twinkie", + "trailer", + "tropical", + "acid", + "crescent", + "cooking", + "cococo", + "cory", + "dabomb", + "daffy", + "dandfa", + "cyrano", + "nathanie", + "briggs", + "boners", + "helium", + "horton", + "hoffman", + "hellas", + "espresso", + "emperor", + "killa", + "kikimora", + "wanda", + "w4g8at", + "verona", + "ilikeit", + "iforget", + "1944", + "20002000", + "birthday1", + "beatles1", + "blue1", + "bigdicks", + "beethove", + "blacklab", + "blazers", + "benny1", + "woodwork", + "69", + "101", + "taffy", + "susie", + "survivor", + "swim", + "stokes", + "4567", + "shodan", + "spoiled", + "steffen", + "pissed", + "pavlov", + "pinnacle", + "place", + "petunia", + "terrell", + "thirty", + "toni", + "tito", + "teenie", + "lemonade", + "lily", + "lillie", + "lalakers", + "lebowski", + "lalalala", + "ladyboy", + "jeeper", + "joyjoy", + "mercury1", + "mantle", + "mannn", + "rocknrol", + "riversid", + "reeves", + "123aaa", + "11112222", + "121314", + "1021", + "1004", + "1120", + "allen1", + "ambers", + "amstel", + "ambrose", + "alice1", + "alleycat", + "allegro", + "ambrosia", + "alley", + "australia", + "hatred", + "gspot", + "graves", + "goodsex", + "hattrick", + "harpoon", + "878787", + "8inches", + "4wwvte", + "cassandr", + "charlie123", + "case", + "chavez", + "fighting", + "gabriela", + "gatsby", + "fudge", + "gerry", + "generic", + "gareth", + "fuckme2", + "samm", + "sage", + "seadog", + "satchmo", + "scxakv", + "santafe", + "dipper", + "dingle", + "dizzy", + "outoutout", + "madmad", + "london1", + "qbg26i", + "pussy123", + "randolph", + "vaughn", + "tzpvaw", + "vamp", + "comedy", + "comp", + "cowgirl", + "coldplay", + "dawgs", + "delaney", + "nt5d27", + "novifarm", + "needles", + "notredam", + "newness", + "mykids", + "bryan1", + "bouncer", + "hihihi", + "honeybee", + "iceman1", + "herring", + "horn", + "hook", + "hotlips", + "dynamo", + "klaus", + "kittie", + "kappa", + "kahlua", + "muffy", + "mizzou", + "mohamed", + "musical", + "wannabe", + "wednesda", + "whatup", + "weller", + "waterfal", + "willy1", + "invest", + "blanche", + "bear1", + "billabon", + "youknow", + "zelda", + "yyyyyy1", + "zachary1", + "1234567", + "70462", + "zurich", + "superstar", + "storms", + "tail", + "stiletto", + "strat", + "427900", + "sigmachi", + "shelter", + "shells", + "sexy123", + "smile1", + "sophie1", + "stefano", + "stayout", + "somerset", + "smithers", + "playmate", + "pinkfloyd", + "phish1", + "payday", + "thebear", + "telefon", + "laetitia", + "kswbdu", + "larson", + "jetta", + "jerky", + "melina", + "metro", + "revoluti", + "retire", + "respect", + "1216", + "1201", + "1204", + "1222", + "1115", + "archange", + "barry1", + "handball", + "676767", + "chandra", + "chewbacc", + "flesh", + "furball", + "gocubs", + "fruit", + "fullback", + "gman", + "gentle", + "dunbar", + "dewalt", + "dominiqu", + "diver1", + "dhip6a", + "olemiss", + "ollie", + "mandrake", + "mangos", + "pretzel", + "pusssy", + "tripleh", + "valdez", + "vagabond", + "clean", + "comment", + "crew", + "clovis", + "deaths", + "dandan", + "csfbr5yy", + "deadspin", + "darrel", + "ninguna", + "noah", + "ncc74656", + "bootsie", + "bp2002", + "bourbon", + "brennan", + "bumble", + "books", + "hose", + "heyyou", + "houston1", + "hemlock", + "hippo", + "hornets", + "hurricane", + "horseman", + "hogan", + "excess", + "extensa", + "muffin1", + "virginie", + "werdna", + "idontknow", + "info", + "iron", + "jack1", + "1bitch", + "151nxjmt", + "bendover", + "bmwbmw", + "bills", + "zaq123", + "wxcvbn", + "surprise", + "supernov", + "tahoe", + "talbot", + "simona", + "shakur", + "sexyone", + "seviyi", + "sonja", + "smart1", + "speed1", + "pepito", + "phantom1", + "playoffs", + "terry1", + "terrier", + "laser1", + "lite", + "lancia", + "johngalt", + "jenjen", + "jolene", + "midori", + "message", + "maserati", + "matteo", + "mental", + "miami1", + "riffraff", + "ronald1", + "reason", + "rhythm", + "1218", + "1026", + "123987", + "1015", + "1103", + "armada", + "architec", + "austria", + "gotmilk", + "hawkins", + "gray", + "camila", + "camp", + "cambridg", + "charge", + "camero", + "flex", + "foreplay", + "getoff", + "glacier", + "glotest", + "froggie", + "gerbil", + "rugger", + "sanity72", + "salesman", + "donna1", + "dreaming", + "deutsch", + "orchard", + "oyster", + "palmtree", + "ophelia", + "pajero", + "m5wkqf", + "magenta", + "luckyone", + "treefrog", + "vantage", + "usmarine", + "tyvugq", + "uptown", + "abacab", + "aaaaaa1", + "advance", + "chuck1", + "delmar", + "darkange", + "cyclones", + "nate", + "navajo", + "nope", + "border", + "bubba123", + "building", + "iawgk2", + "hrfzlz", + "dylan1", + "enrico", + "encore", + "emilio", + "eclipse1", + "killian", + "kayleigh", + "mutant", + "mizuno", + "mustang2", + "video1", + "viewer", + "weed420", + "whales", + "jaguar1", + "insight", + "1990", + "159159", + "1love", + "bliss", + "bears1", + "bigtruck", + "binder", + "bigboss", + "blitz", + "xqgann", + "yeahyeah", + "zeke", + "zardoz", + "stickman", + "table", + "3825", + "signal", + "sentra", + "side", + "shiva", + "skipper1", + "singapor", + "southpaw", + "sonora", + "squid", + "slamdunk", + "slimjim", + "placid", + "photon", + "placebo", + "pearl1", + "test12", + "therock1", + "tiger123", + "leinad", + "legman", + "jeepers", + "joeblow", + "mccarthy", + "mike23", + "redcar", + "rhinos", + "rjw7x4", + "1102", + "13576479", + "112211", + "alcohol", + "gwju3g", + "greywolf", + "7bgiqk", + "7878", + "535353", + "4snz9g", + "candyass", + "cccccc1", + "carola", + "catfight", + "cali", + "fister", + "fosters", + "finland", + "frankie1", + "gizzmo", + "fuller", + "royalty", + "rugrat", + "sandie", + "rudolf", + "dooley", + "dive", + "doreen", + "dodo", + "drop", + "oemdlg", + "out3xf", + "paddy", + "opennow", + "puppy1", + "qazwsxedc", + "pregnant", + "quinn", + "ramjet", + "under", + "uncle", + "abraxas", + "corner", + "creed", + "cocoa", + "crown", + "cows", + "cn42qj", + "dancer1", + "death666", + "damned", + "nudity", + "negative", + "nimda2k", + "buick", + "bobb", + "braves1", + "brook", + "henrik", + "higher", + "hooligan", + "dust", + "everlast", + "karachi", + "mortis", + "mulligan", + "monies", + "motocros", + "wally1", + "weapon", + "waterman", + "view", + "willie1", + "vicki", + "inspiron", + "1test", + "2929", + "bigblack", + "xytfu7", + "yackwin", + "zaq1xsw2", + "yy5rbfsc", + "100100", + "660", + "tahiti", + "takehana", + "talks", + "332211", + "3535", + "sedona", + "seawolf", + "skydiver", + "shine", + "spleen", + "slash", + "spjfet", + "special1", + "spooner", + "slimshad", + "sopranos", + "spock1", + "penis1", + "patches1", + "terri", + "thierry", + "thething", + "toohot", + "large", + "limpone", + "johnnie", + "mash4077", + "matchbox", + "masterp", + "maxdog", + "ribbit", + "reed", + "rita", + "rockin", + "redhat", + "rising", + "1113", + "14789632", + "1331", + "allday", + "aladin", + "andrey", + "amethyst", + "ariel", + "anytime", + "baseball1", + "athome", + "basil", + "goofy1", + "greenman", + "gustavo", + "goofball", + "ha8fyp", + "goodday", + "778899", + "charon", + "chappy", + "castillo", + "caracas", + "cardiff", + "capitals", + "canada1", + "cajun", + "catter", + "freddy1", + "favorite2", + "frazier", + "forme", + "follow", + "forsaken", + "feelgood", + "gavin", + "gfxqx686", + "garlic", + "sarge", + "saskia", + "sanjose", + "russ", + "salsa", + "dilbert1", + "dukeduke", + "downhill", + "longhair", + "loop", + "locutus", + "lockdown", + "malachi", + "mamacita", + "lolipop", + "rainyday", + "pumpkin1", + "punker", + "prospect", + "rambo1", + "rainbows", + "quake", + "twin", + "trinity1", + "trooper1", + "aimee", + "citation", + "coolcat", + "crappy", + "default", + "dental", + "deniro", + "d9ungl", + "daddys", + "napoli", + "nautica", + "nermal", + "bukowski", + "brick", + "bubbles1", + "bogota", + "board", + "branch", + "breath", + "buds", + "hulk", + "humphrey", + "hitachi", + "evans", + "ender", + "export", + "kikiki", + "kcchiefs", + "kram", + "morticia", + "montrose", + "mongo", + "waqw3p", + "wizzard", + "visited", + "whdbtp", + "whkzyc", + "image", + "154ugeiu", + "1fuck", + "binky", + "blind", + "bigred1", + "blubber", + "benz", + "becky1", + "year2005", + "wonderfu", + "wooden", + "xrated", + "1", + "tampabay", + "survey", + "tammy1", + "stuffer", + "3mpz4r", + "3000", + "3some", + "selina", + "sierra1", + "shampoo", + "silk", + "shyshy", + "slapnuts", + "standby", + "spartan1", + "sprocket", + "sometime", + "stanley1", + "poker1", + "plus", + "thought", + "theshit", + "torture", + "thinking", + "lavalamp", + "light1", + "laserjet", + "jediknig", + "jjjjj1", + "jocelyn", + "mazda626", + "menthol", + "maximo", + "margaux", + "medic1", + "release", + "richter", + "rhino1", + "roach", + "renate", + "repair", + "reveal", + "1209", + "1234321", + "amigos", + "apricot", + "alexandra", + "asdfgh1", + "hairball", + "hatter", + "graduate", + "grimace", + "7xm5rq", + "6789", + "cartoons", + "capcom", + "cheesy", + "cashflow", + "carrots", + "camping", + "fanatic", + "fool", + "format", + "fleming", + "girlie", + "glover", + "gilmore", + "gardner", + "safeway", + "ruthie", + "dogfart", + "dondon", + "diapers", + "outsider", + "odin", + "opiate", + "lollol", + "love12", + "loomis", + "mallrats", + "prague", + "primetime21", + "pugsley", + "program", + "r29hqq", + "touch", + "valleywa", + "airman", + "abcdefg1", + "darkone", + "cummer", + "dempsey", + "damn", + "nadia", + "natedogg", + "nineball", + "ndeyl5", + "natchez", + "newone", + "normandy", + "nicetits", + "buddy123", + "buddys", + "homely", + "husky", + "iceland", + "hr3ytm", + "highlife", + "holla", + "earthlin", + "exeter", + "eatmenow", + "kimkim", + "karine", + "k2trix", + "kernel", + "kirkland", + "money123", + "moonman", + "miles1", + "mufasa", + "mousey", + "wilma", + "wilhelm", + "whites", + "warhamme", + "instinct", + "jackass1", + "2277", + "20spanks", + "blobby", + "blair", + "blinky", + "bikers", + "blackjack", + "becca", + "blue23", + "xman", + "wyvern", + "085tzzqi", + "zxzxzx", + "zsmj2v", + "suede", + "t26gn4", + "sugars", + "sylvie", + "tantra", + "swoosh", + "swiss", + "4226", + "4271", + "321123", + "383pdjvl", + "shoe", + "shane1", + "shelby1", + "spades", + "spain", + "smother", + "soup", + "sparhawk", + "pisser", + "photo1", + "pebble", + "phones", + "peavey", + "picnic", + "pavement", + "terra", + "thistle", + "tokyo", + "therapy", + "lives", + "linden", + "kronos", + "lilbit", + "linux", + "johnston", + "material", + "melanie1", + "marbles", + "redlight", + "reno", + "recall", + "1208", + "1138", + "1008", + "alchemy", + "aolsucks", + "alexalex", + "atticus", + "auditt", + "ballet", + "b929ezzh", + "goodyear", + "hanna", + "griffith", + "gubber", + "863abgsg", + "7474", + "797979", + "464646", + "543210", + "4zqauf", + "4949", + "ch5nmk", + "carlito", + "chewey", + "carebear", + "caleb", + "checkmat", + "cheddar", + "chachi", + "fever", + "forgetit", + "fine", + "forlife", + "giants1", + "gates", + "getit", + "gamble", + "gerhard", + "galileo", + "g3ujwg", + "ganja", + "rufus1", + "rushmore", + "scouts", + "discus", + "dudeman", + "olympus", + "oscars", + "osprey", + "madcow", + "locust", + "loyola", + "mammoth", + "proton", + "rabbit1", + "question", + "ptfe3xxp", + "pwxd5x", + "purple1", + "punkass", + "prophecy", + "uyxnyd", + "tyson1", + "aircraft", + "access99", + "abcabc", + "cocktail", + "colts", + "civilwar", + "cleveland", + "claudia1", + "contour", + "clement", + "dddddd1", + "cypher", + "denied", + "dapzu455", + "dagmar", + "daisydog", + "name", + "noles", + "butters", + "buford", + "hoochie", + "hotel", + "hoser", + "eddy", + "ellis", + "eldiablo", + "kingrich", + "mudvayne", + "motown", + "mp8o6d", + "wife", + "vipergts", + "italiano", + "innocent", + "2055", + "2211", + "beavers", + "bloke", + "blade1", + "yamato", + "zooropa", + "yqlgr667", + "50505", + "zxcvbnm1", + "zw6syj", + "suckcock", + "tango1", + "swing", + "stern", + "stephens", + "swampy", + "susanna", + "tammie", + "445566", + "333666", + "380zliki", + "sexpot", + "sexylady", + "sixtynin", + "sickboy", + "spiffy", + "sleeping", + "skylark", + "sparkles", + "slam", + "pintail", + "phreak", + "places", + "teller", + "timtim", + "tires", + "thighs", + "left", + "latex", + "llamas", + "letsdoit", + "lkjhg", + "landmark", + "letters", + "lizzard", + "marlins", + "marauder", + "metal1", + "manu", + "register", + "righton", + "1127", + "alain", + "alcat", + "amigo", + "basebal1", + "azertyui", + "attract", + "azrael", + "hamper", + "gotenks", + "golfgti", + "gutter", + "hawkwind", + "h2slca", + "harman", + "grace1", + "6chid8", + "789654", + "canine", + "casio", + "cazzo", + "chamber", + "cbr900", + "cabrio", + "calypso", + "capetown", + "feline", + "flathead", + "fisherma", + "flipmode", + "fungus", + "goal", + "g9zns4", + "full", + "giggle", + "gabriel1", + "fuck123", + "saffron", + "dogmeat", + "dreamcas", + "dirtydog", + "dunlop", + "douche", + "dresden", + "dickdick", + "destiny1", + "pappy", + "oaktree", + "lydia", + "luft4", + "puta", + "prayer", + "ramada", + "trumpet1", + "vcradq", + "tulip", + "tracy71", + "tycoon", + "aaaaaaa1", + "conquest", + "click", + "chitown", + "corps", + "creepers", + "constant", + "couples", + "code", + "cornhole", + "danman", + "dada", + "density", + "d9ebk7", + "cummins", + "darth", + "cute", + "nash", + "nirvana1", + "nixon", + "norbert", + "nestle", + "brenda1", + "bonanza", + "bundy", + "buddies", + "hotspur", + "heavy", + "horror", + "hufmqw", + "electro", + "erasure", + "enough", + "elisabet", + "etvww4", + "ewyuza", + "eric1", + "kinder", + "kenken", + "kismet", + "klaatu", + "musician", + "milamber", + "willi", + "waiting", + "isacs155", + "igor", + "1million", + "1letmein", + "x35v8l", + "yogi", + "ywvxpz", + "xngwoj", + "zippy1", + "20202", + "****", + "stonewal", + "sweeney", + "story", + "sentry", + "sexsexsex", + "spence", + "sonysony", + "smirnoff", + "star12", + "solace", + "sledge", + "states", + "snyder", + "star1", + "paxton", + "pentagon", + "pkxe62", + "pilot1", + "pommes", + "paulpaul", + "plants", + "tical", + "tictac", + "toes", + "lighthou", + "lemans", + "kubrick", + "letmein22", + "letmesee", + "jys6wz", + "jonesy", + "jjjjjj1", + "jigga", + "joelle", + "mate", + "merchant", + "redstorm", + "riley1", + "rosa", + "relief", + "14141414", + "1126", + "allison1", + "badboy1", + "asthma", + "auggie", + "basement", + "hartley", + "hartford", + "hardwood", + "gumbo", + "616913", + "57np39", + "56qhxs", + "4mnveh", + "cake", + "forbes", + "fatluvr69", + "fqkw5m", + "fidelity", + "feathers", + "fresno", + "godiva", + "gecko", + "gladys", + "gibson1", + "gogators", + "fridge", + "general1", + "saxman", + "rowing", + "sammys", + "scotts", + "scout1", + "sasasa", + "samoht", + "dragon69", + "ducky", + "dragonball", + "driller", + "p3wqaw", + "nurse", + "papillon", + "oneone", + "openit", + "optimist", + "longshot", + "portia", + "rapier", + "pussy2", + "ralphie", + "tuxedo", + "ulrike", + "undertow", + "trenton", + "copenhag", + "come", + "delldell", + "culinary", + "deltas", + "mytime", + "nicky", + "nickie", + "noname", + "noles1", + "bucker", + "bopper", + "bullock", + "burnout", + "bryce", + "hedges", + "ibilltes", + "hihje863", + "hitter", + "ekim", + "espana", + "eatme69", + "elpaso", + "envelope", + "express1", + "eeeeee1", + "eatme1", + "karaoke", + "kara", + "mustang5", + "misses", + "wellingt", + "willem", + "waterski", + "webcam", + "jasons", + "infinite", + "iloveyou!", + "jakarta", + "belair", + "bigdad", + "beerme", + "yoshi", + "yinyang", + "zimmer", + "x24ik3", + "063dyjuy", + "7", + "ztmfcq", + "stopit", + "stooges", + "survival", + "stockton", + "symow8", + "strato", + "2hot4u", + "ship", + "simons", + "skins", + "shakes", + "sex1", + "shield", + "snacks", + "softtail", + "slimed123", + "pizzaman", + "pipe", + "pitt", + "pathetic", + "pinto", + "tigercat", + "tonton", + "lager", + "lizzy", + "juju", + "john123", + "jennings", + "josiah", + "jesse1", + "jordon", + "jingles", + "martian", + "mario1", + "rootedit", + "rochard", + "redwine", + "requiem", + "riverrat", + "rats", + "1117", + "1014", + "1205", + "althea", + "allie", + "amor", + "amiga", + "alpina", + "alert", + "atreides", + "banana1", + "bahamut", + "hart", + "golfman", + "happines", + "7uftyx", + "5432", + "5353", + "5151", + "4747", + "byron", + "chatham", + "chadwick", + "cherie", + "foxfire", + "ffvdj474", + "freaked", + "foreskin", + "gayboy", + "gggggg1", + "glenda", + "gameover", + "glitter", + "funny1", + "scoobydoo", + "scroll", + "rudolph", + "saddle", + "saxophon", + "dingbat", + "digimon", + "omicron", + "parsons", + "ohio", + "panda1", + "loloxx", + "macintos", + "lululu", + "lollypop", + "racer1", + "queen1", + "qwertzui", + "prick", + "upnfmc", + "tyrant", + "trout1", + "9skw5g", + "aceman", + "adelaide", + "acls2h", + "aaabbb", + "acapulco", + "aggie", + "comcast", + "craft", + "crissy", + "cloudy", + "cq2kph", + "custer", + "d6o8pm", + "cybersex", + "davecole", + "darian", + "crumbs", + "daisey", + "davedave", + "dasani", + "needle", + "mzepab", + "myporn", + "narnia", + "nineteen", + "booger1", + "bravo1", + "budgie", + "btnjey", + "highlander", + "hotel6", + "humbug", + "edwin", + "ewtosi", + "kristin1", + "kobe", + "knuckles", + "keith1", + "katarina", + "muff", + "muschi", + "montana1", + "wingchun", + "wiggle", + "whatthe", + "walking", + "watching", + "vette1", + "vols", + "virago", + "intj3a", + "ishmael", + "intern", + "jachin", + "illmatic", + "199999", + "2010", + "beck", + "blender", + "bigpenis", + "bengal", + "blue1234", + "your", + "zaqxsw", + "xray", + "xxxxxxx1", + "zebras", + "yanks", + "worlds", + "tadpole", + "stripes", + "svetlana", + "3737", + "4343", + "3728", + "4444444", + "368ejhih", + "solar", + "sonne", + "smalls", + "sniffer", + "sonata", + "squirts", + "pitcher", + "playstation", + "pktmxr", + "pescator", + "points", + "texaco", + "lesbos", + "lilian", + "l8v53x", + "jo9k2jw2", + "jimbeam", + "josie", + "jimi", + "jupiter2", + "jurassic", + "marines1", + "maya", + "rocket1", + "ringer", + "14725836", + "12345679", + "1219", + "123098", + "1233", + "alessand", + "althor", + "angelika", + "arch", + "armando", + "alpha123", + "basher", + "barefeet", + "balboa", + "bbbbb1", + "banks", + "badabing", + "harriet", + "gopack", + "golfnut", + "gsxr1000", + "gregory1", + "766rglqy", + "8520", + "753159", + "8dihc6", + "69camaro", + "666777", + "cheeba", + "chino", + "calendar", + "cheeky", + "camel1", + "fishcake", + "falling", + "flubber", + "giuseppe", + "gianni", + "gloves", + "gnasher23", + "frisbee", + "fuzzy1", + "fuzzball", + "sauce", + "save13tx", + "schatz", + "russell1", + "sandra1", + "scrotum", + "scumbag", + "sabre", + "samdog", + "dripping", + "dragon12", + "dragster", + "paige", + "orwell", + "mainland", + "lunatic", + "lonnie", + "lotion", + "maine", + "maddux", + "qn632o", + "poophead", + "rapper", + "porn4life", + "producer", + "rapunzel", + "tracks", + "velocity", + "vanessa1", + "ulrich", + "trueblue", + "vampire1", + "abacus", + "902100", + "crispy", + "corky", + "crane", + "chooch", + "d6wnro", + "cutie", + "deal", + "dabulls", + "dehpye", + "navyseal", + "njqcw4", + "nownow", + "nigger1", + "nightowl", + "nonenone", + "nightmar", + "bustle", + "buddy2", + "boingo", + "bugman", + "bulletin", + "bosshog", + "bowie", + "hybrid", + "hillside", + "hilltop", + "hotlegs", + "honesty", + "hzze929b", + "hhhhh1", + "hellohel", + "eloise", + "evilone", + "edgewise", + "e5pftu", + "eded", + "embalmer", + "excalibur", + "elefant", + "kenzie", + "karl", + "karin", + "killah", + "kleenex", + "mouses", + "mounta1n", + "motors", + "mutley", + "muffdive", + "vivitron", + "winfield", + "wednesday", + "w00t88", + "iloveit", + "jarjar", + "incest", + "indycar", + "17171717", + "1664", + "17011701", + "222777", + "2663", + "beelch", + "benben", + "yitbos", + "yyyyy1", + "yasmin", + "zapata", + "zzzzz1", + "stooge", + "tangerin", + "taztaz", + "stewart1", + "summer69", + "sweetness", + "system1", + "surveyor", + "stirling", + "3qvqod", + "3way", + "456321", + "sizzle", + "simhrq", + "shrink", + "shawnee", + "someday", + "sparty", + "ssptx452", + "sphere", + "spark", + "slammed", + "sober", + "persian", + "peppers", + "ploppy", + "pn5jvw", + "poobear", + "pianos", + "plaster", + "testme", + "tiff", + "thriller", + "larissa", + "lennox", + "jewell", + "master12", + "messier", + "rockey", + "1229", + "1217", + "1478", + "1009", + "anastasi", + "almighty", + "amonra", + "aragon", + "argentin", + "albino", + "azazel", + "grinder", + "6uldv8", + "83y6pv", + "8888888", + "4tlved", + "515051", + "carsten", + "changes", + "flanders", + "flyers88", + "ffffff1", + "firehawk", + "foreman", + "firedog", + "flashman", + "ggggg1", + "gerber", + "godspeed", + "galway", + "giveitup", + "funtimes", + "gohan", + "giveme", + "geryfe", + "frenchie", + "sayang", + "rudeboy", + "savanna", + "sandals", + "devine", + "dougal", + "drag0n", + "dga9la", + "disaster", + "desktop", + "only", + "onlyone", + "otter", + "pandas", + "mafia", + "lombard", + "luckys", + "lovejoy", + "lovelife", + "manders", + "product", + "qqh92r", + "qcmfd454", + "pork", + "radar1", + "punani", + "ptbdhw", + "turtles", + "undertaker", + "trs8f7", + "tramp", + "ugejvp", + "abba", + "911turbo", + "acdc", + "abcd123", + "clever", + "corina", + "cristian", + "create", + "crash1", + "colony", + "crosby", + "delboy", + "daniele", + "davinci", + "daughter", + "notebook", + "niki", + "nitrox", + "borabora", + "bonzai", + "budd", + "brisbane", + "hotter", + "heeled", + "heroes", + "hooyah", + "hotgirl", + "i62gbq", + "horse1", + "hills", + "hpk2qc", + "epvjb6", + "echo", + "korean", + "kristie", + "mnbvc", + "mohammad", + "mind", + "mommy1", + "munster", + "wade", + "wiccan", + "wanted", + "jacket", + "2369", + "bettyboo", + "blondy", + "bismark", + "beanbag", + "bjhgfi", + "blackice", + "yvtte545", + "ynot", + "yess", + "zlzfrh", + "wolvie", + "007bond", + "******", + "tailgate", + "tanya1", + "sxhq65", + "stinky1", + "3234412", + "3ki42x", + "seville", + "shimmer", + "sheryl", + "sienna", + "shitshit", + "skillet", + "seaman", + "sooners1", + "solaris", + "smartass", + "pastor", + "pasta", + "pedros", + "pennywis", + "pfloyd", + "tobydog", + "thetruth", + "lethal", + "letme1n", + "leland", + "jenifer", + "mario66", + "micky", + "rocky2", + "rewq", + "ripped", + "reindeer", + "1128", + "1207", + "1104", + "1432", + "aprilia", + "allstate", + "alyson", + "bagels", + "basic", + "baggies", + "barb", + "barrage", + "greatest", + "gomez", + "guru", + "guard", + "72d5tn", + "606060", + "4wcqjn", + "caldwell", + "chance1", + "catalog", + "faust", + "film", + "flange", + "fran", + "fartman", + "geil", + "gbhcf2", + "fussball", + "glen", + "fuaqz4", + "gameboy", + "garnet", + "geneviev", + "rotary", + "seahawk", + "russel", + "saab", + "seal", + "samadams", + "devlt4", + "ditto", + "drevil", + "drinker", + "deuce", + "dipstick", + "donut", + "octopus", + "ottawa", + "losangel", + "loverman", + "porky", + "q9umoz", + "rapture", + "pump", + "pussy4me", + "university", + "triplex", + "ue8fpw", + "trent", + "trophy", + "turbos", + "troubles", + "agent", + "aaa340", + "churchil", + "crazyman", + "consult", + "creepy", + "craven", + "class", + "cutiepie", + "ddddd1", + "dejavu", + "cuxldv", + "nettie", + "nbvibt", + "nikon", + "niko", + "norwood", + "nascar1", + "nolan", + "bubba2", + "boobear", + "boogers", + "buff", + "bullwink", + "bully", + "bulldawg", + "horsemen", + "escalade", + "editor", + "eagle2", + "dynamic", + "ella", + "efyreg", + "edition", + "kidney", + "minnesot", + "mogwai", + "morrow", + "msnxbi", + "moonlight", + "mwq6qlzo", + "wars", + "werder", + "verygood", + "voodoo1", + "wheel", + "iiiiii1", + "159951", + "1624", + "1911a1", + "2244", + "bellagio", + "bedlam", + "belkin", + "bill1", + "woodrow", + "xirt2k", + "worship", + "??????", + "tanaka", + "swift", + "susieq", + "sundown", + "sukebe", + "tales", + "swifty", + "2fast4u", + "senate", + "sexe", + "sickness", + "shroom", + "shaun", + "seaweed", + "skeeter1", + "status", + "snicker", + "sorrow", + "spanky1", + "spook", + "patti", + "phaedrus", + "pilots", + "pinch", + "peddler", + "theo", + "thumper1", + "tessie", + "tiger7", + "tmjxn151", + "thematri", + "l2g7k3", + "letmeinn", + "lazy", + "jeffjeff", + "joan", + "johnmish", + "mantra", + "mariana", + "mike69", + "marshal", + "mart", + "mazda6", + "riptide", + "robots", + "rental", + "1107", + "1130", + "142857", + "11001001", + "1134", + "armored", + "alvin", + "alec", + "allnight", + "alright", + "amatuers", + "bartok", + "attorney", + "astral", + "baboon", + "bahamas", + "balls1", + "bassoon", + "hcleeb", + "happyman", + "granite", + "graywolf", + "golf1", + "gomets", + "8vjzus", + "7890", + "789123", + "8uiazp", + "5757", + "474jdvff", + "551scasi", + "50cent", + "camaro1", + "cherry1", + "chemist", + "final", + "firenze", + "fishtank", + "farrell", + "freewill", + "glendale", + "frogfrog", + "gerhardt", + "ganesh", + "same", + "scirocco", + "devilman", + "doodles", + "dinger", + "okinawa", + "olympic", + "nursing", + "orpheus", + "ohmygod", + "paisley", + "pallmall", + "null", + "lounge", + "lunchbox", + "manhatta", + "mahalo", + "mandarin", + "qwqwqw", + "qguvyt", + "pxx3eftp", + "president", + "rambler", + "puzzle", + "poppy1", + "turk182", + "trotter", + "vdlxuc", + "trish", + "tugboat", + "valiant", + "tracie", + "uwrl7c", + "chris123", + "coaster", + "cmfnpu", + "decimal", + "debbie1", + "dandy", + "daedalus", + "dede", + "natasha1", + "nissan1", + "nancy123", + "nevermin", + "napalm", + "newcastle", + "boats", + "branden", + "britt", + "bonghit", + "hester", + "ibxnsm", + "hhhhhh1", + "holger", + "durham", + "edmonton", + "erwin", + "equinox", + "dvader", + "kimmy", + "knulla", + "mustafa", + "monsoon", + "mistral", + "morgana", + "monica1", + "mojave", + "month", + "monterey", + "mrbill", + "vkaxcs", + "victor1", + "wacker", + "wendell", + "violator", + "vfdhif", + "wilson1", + "wavpzt", + "verena", + "wildstar", + "winter99", + "iqzzt580", + "jarrod", + "imback", + "1914", + "19741974", + "1monkey", + "1q2w3e4r5t", + "2500", + "2255", + "blank", + "bigshow", + "bigbucks", + "blackcoc", + "zoomer", + "wtcacq", + "wobble", + "xmen", + "xjznq5", + "yesterda", + "yhwnqc", + "zzzxxx", + "streak", + "393939", + "2fchbg", + "skinhead", + "skilled", + "shakira", + "shaft", + "shadow12", + "seaside", + "sigrid", + "sinful", + "silicon", + "smk7366", + "snapshot", + "sniper1", + "soccer11", + "staff", + "slap", + "smutty", + "peepers", + "pleasant", + "plokij", + "pdiddy", + "pimpdaddy", + "thrust", + "terran", + "topaz", + "today1", + "lionhear", + "littlema", + "lauren1", + "lincoln1", + "lgnu9d", + "laughing", + "juneau", + "methos", + "medina", + "merlyn", + "rogue1", + "romulus", + "redshift", + "1202", + "1469", + "12locked", + "arizona1", + "alfarome", + "al9agd", + "aol123", + "altec", + "apollo1", + "arse", + "baker1", + "bbb747", + "bach", + "axeman", + "astro1", + "hawthorn", + "goodfell", + "hawks1", + "gstring", + "hannes", + "8543852", + "868686", + "4ng62t", + "554uzpad", + "5401", + "567890", + "5232", + "catfood", + "frame", + "flow", + "fire1", + "flipflop", + "fffff1", + "fozzie", + "fluff", + "garrison", + "fzappa", + "furious", + "round", + "rustydog", + "sandberg", + "scarab", + "satin", + "ruger", + "samsung1", + "destin", + "diablo2", + "dreamer1", + "detectiv", + "dominick", + "doqvq3", + "drywall", + "paladin1", + "papabear", + "offroad", + "panasonic", + "nyyankee", + "luetdi", + "qcfmtz", + "pyf8ah", + "puddles", + "privacy", + "rainer", + "pussyeat", + "ralph1", + "princeto", + "trivia", + "trewq", + "tri5a3", + "advent", + "9898", + "agyvorc", + "clarkie", + "coach1", + "courier", + "contest", + "christo", + "corinna", + "chowder", + "concept", + "climbing", + "cyzkhw", + "davidb", + "dad2ownu", + "days", + "daredevi", + "de7mdf", + "nose", + "necklace", + "nazgul", + "booboo1", + "broad", + "bonzo", + "brenna", + "boot", + "butch1", + "huskers1", + "hgfdsa", + "hornyman", + "elmer", + "elektra", + "england1", + "elodie", + "kermit1", + "knife", + "kaboom", + "minute", + "modern", + "motherfucker", + "morten", + "mocha", + "monday1", + "morgoth", + "ward", + "weewee", + "weenie", + "walters", + "vorlon", + "website", + "wahoo", + "ilovegod", + "insider", + "jayman", + "1911", + "1dallas", + "1900", + "1ranger", + "201jedlz", + "2501", + "1qaz", + "bertram", + "bignuts", + "bigbad", + "beebee", + "billows", + "belize", + "bebe", + "wvj5np", + "wu4etd", + "yamaha1", + "wrinkle5", + "zebra1", + "yankee1", + "zoomzoom", + "9876543", + "311", + "?????", + "stjabn", + "tainted", + "3tmnej", + "shoot", + "skooter", + "skelter", + "sixteen", + "starlite", + "smack", + "spice1", + "stacey1", + "smithy", + "perrin", + "pollux", + "peternorth", + "pixie", + "paulina", + "piston", + "pick", + "poets", + "pine", + "toons", + "tooth", + "topspin", + "kugm7b", + "legends", + "jeepjeep", + "juliana", + "joystick", + "junkmail", + "jojojojo", + "jonboy", + "judge", + "midland", + "meteor", + "mccabe", + "matter", + "mayfair", + "meeting", + "merrill", + "raul", + "riches", + "reznor", + "rockrock", + "reboot", + "reject", + "robyn", + "renee1", + "roadway", + "rasta220", + "1411", + "1478963", + "1019", + "archery", + "allman", + "andyandy", + "barks", + "bagpuss", + "auckland", + "gooseman", + "hazmat", + "gucci", + "guns", + "grammy", + "happydog", + "greek", + "7kbe9d", + "7676", + "6bjvpe", + "5lyedn", + "5858", + "5291", + "charlie2", + "chas", + "c7lrwu", + "candys", + "chateau", + "ccccc1", + "cardinals", + "fear", + "fihdfv", + "fortune12", + "gocats", + "gaelic", + "fwsadn", + "godboy", + "gldmeo", + "fx3tuo", + "fubar1", + "garland", + "generals", + "gforce", + "rxmtkp", + "rulz", + "sairam", + "dunhill", + "division", + "dogggg", + "detect", + "details", + "doll", + "drinks", + "ozlq6qwm", + "ov3ajy", + "lockout", + "makayla", + "macgyver", + "mallorca", + "loves", + "prima", + "pvjegu", + "qhxbij", + "raphael", + "prelude1", + "totoro", + "tusymo", + "trousers", + "tunnel", + "valeria", + "tulane", + "turtle1", + "tracy1", + "aerosmit", + "abbey1", + "address", + "clticic", + "clueless", + "cooper1", + "comets", + "collect", + "corbin", + "delpiero", + "derick", + "cyprus", + "dante1", + "dave1", + "nounours", + "neal", + "nexus6", + "nero", + "nogard", + "norfolk", + "brent1", + "booyah", + "bootleg", + "buckaroo", + "bulls23", + "bulls1", + "booper", + "heretic", + "icecube", + "hellno", + "hounds", + "honeydew", + "hooters1", + "hoes", + "howie", + "hevnm4", + "hugohugo", + "eighty", + "epson", + "evangeli", + "eeeee1", + "eyphed", +} diff --git a/internal/password/hash.go b/internal/password/hash.go new file mode 100644 index 0000000..27e78c9 --- /dev/null +++ b/internal/password/hash.go @@ -0,0 +1,30 @@ +package password + +import ( + "errors" + + "golang.org/x/crypto/bcrypt" +) + +func Hash(plaintextPassword string) (string, error) { + hashedPassword, err := bcrypt.GenerateFromPassword([]byte(plaintextPassword), 12) + if err != nil { + return "", err + } + + return string(hashedPassword), nil +} + +func Matches(plaintextPassword, hashedPassword string) (bool, error) { + err := bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(plaintextPassword)) + if err != nil { + switch { + case errors.Is(err, bcrypt.ErrMismatchedHashAndPassword): + return false, nil + default: + return false, err + } + } + + return true, nil +} diff --git a/internal/request/forms.go b/internal/request/forms.go new file mode 100644 index 0000000..4ff07b5 --- /dev/null +++ b/internal/request/forms.go @@ -0,0 +1,46 @@ +package request + +import ( + "errors" + "net/http" + "net/url" + + "github.com/go-playground/form/v4" +) + +var decoder = form.NewDecoder() + +func DecodeForm(r *http.Request, dst any) error { + err := r.ParseForm() + if err != nil { + return err + } + + return decodeURLValues(r.Form, dst) +} + +func DecodePostForm(r *http.Request, dst any) error { + err := r.ParseForm() + if err != nil { + return err + } + + return decodeURLValues(r.PostForm, dst) +} + +func DecodeQueryString(r *http.Request, dst any) error { + return decodeURLValues(r.URL.Query(), dst) +} + +func decodeURLValues(v url.Values, dst any) error { + err := decoder.Decode(dst, v) + if err != nil { + var invalidDecoderError *form.InvalidDecoderError + + if errors.As(err, &invalidDecoderError) { + panic(err) + } + } + + return err +} diff --git a/internal/request/json.go b/internal/request/json.go new file mode 100644 index 0000000..49eeaca --- /dev/null +++ b/internal/request/json.go @@ -0,0 +1,73 @@ +package request + +import ( + "encoding/json" + "errors" + "fmt" + "io" + "net/http" + "strings" +) + +func DecodeJSON(w http.ResponseWriter, r *http.Request, dst interface{}) error { + return decodeJSON(w, r, dst, false) +} + +func DecodeJSONStrict(w http.ResponseWriter, r *http.Request, dst interface{}) error { + return decodeJSON(w, r, dst, true) +} + +func decodeJSON(w http.ResponseWriter, r *http.Request, dst interface{}, disallowUnknownFields bool) error { + maxBytes := 1_048_576 + r.Body = http.MaxBytesReader(w, r.Body, int64(maxBytes)) + + dec := json.NewDecoder(r.Body) + + if disallowUnknownFields { + dec.DisallowUnknownFields() + } + + err := dec.Decode(dst) + if err != nil { + var syntaxError *json.SyntaxError + var unmarshalTypeError *json.UnmarshalTypeError + var invalidUnmarshalError *json.InvalidUnmarshalError + + switch { + case errors.As(err, &syntaxError): + return fmt.Errorf("body contains badly-formed JSON (at character %d)", syntaxError.Offset) + + case errors.Is(err, io.ErrUnexpectedEOF): + return errors.New("body contains badly-formed JSON") + + case errors.As(err, &unmarshalTypeError): + if unmarshalTypeError.Field != "" { + return fmt.Errorf("body contains incorrect JSON type for field %q", unmarshalTypeError.Field) + } + return fmt.Errorf("body contains incorrect JSON type (at character %d)", unmarshalTypeError.Offset) + + case errors.Is(err, io.EOF): + return errors.New("body must not be empty") + + case strings.HasPrefix(err.Error(), "json: unknown field "): + fieldName := strings.TrimPrefix(err.Error(), "json: unknown field ") + return fmt.Errorf("body contains unknown key %s", fieldName) + + case err.Error() == "http: request body too large": + return fmt.Errorf("body must not be larger than %d bytes", maxBytes) + + case errors.As(err, &invalidUnmarshalError): + panic(err) + + default: + return err + } + } + + err = dec.Decode(&struct{}{}) + if !errors.Is(err, io.EOF) { + return errors.New("body must only contain a single JSON value") + } + + return nil +} diff --git a/internal/response/json.go b/internal/response/json.go new file mode 100644 index 0000000..2deac8c --- /dev/null +++ b/internal/response/json.go @@ -0,0 +1,29 @@ +package response + +import ( + "encoding/json" + "net/http" +) + +func JSON(w http.ResponseWriter, status int, data any) error { + return JSONWithHeaders(w, status, data, nil) +} + +func JSONWithHeaders(w http.ResponseWriter, status int, data any, headers http.Header) error { + js, err := json.MarshalIndent(data, "", "\t") + if err != nil { + return err + } + + js = append(js, '\n') + + for key, value := range headers { + w.Header()[key] = value + } + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(status) + w.Write(js) + + return nil +} diff --git a/internal/response/metrics.go b/internal/response/metrics.go new file mode 100644 index 0000000..4daadbe --- /dev/null +++ b/internal/response/metrics.go @@ -0,0 +1,42 @@ +package response + +import "net/http" + +type MetricsResponseWriter struct { + StatusCode int + BytesCount int + headerWritten bool + wrapped http.ResponseWriter +} + +func NewMetricsResponseWriter(w http.ResponseWriter) *MetricsResponseWriter { + return &MetricsResponseWriter{ + StatusCode: http.StatusOK, + wrapped: w, + } +} + +func (mw *MetricsResponseWriter) Header() http.Header { + return mw.wrapped.Header() +} + +func (mw *MetricsResponseWriter) WriteHeader(statusCode int) { + mw.wrapped.WriteHeader(statusCode) + + if !mw.headerWritten { + mw.StatusCode = statusCode + mw.headerWritten = true + } +} + +func (mw *MetricsResponseWriter) Write(b []byte) (int, error) { + mw.headerWritten = true + + n, err := mw.wrapped.Write(b) + mw.BytesCount += n + return n, err +} + +func (mw *MetricsResponseWriter) Unwrap() http.ResponseWriter { + return mw.wrapped +} diff --git a/internal/response/templates.go b/internal/response/templates.go new file mode 100644 index 0000000..355c264 --- /dev/null +++ b/internal/response/templates.go @@ -0,0 +1,96 @@ +package response + +import ( + "bytes" + "fmt" + "html/template" + "net/http" + + "brainminder.speedtech.it/assets" + "brainminder.speedtech.it/internal/funcs" +) + +func HXFragment(fullBuf *bytes.Buffer, pagePaths []string, templateName string, data any) error { + var err error + var buf *bytes.Buffer + buf, err = Fragment(pagePaths, templateName, data) + fullBuf.Write(buf.Bytes()) + return err +} + +func HXFragmentOOB(fullBuf *bytes.Buffer, pagePaths []string, templateName string, data any, div_id string) error { + var err error + var buf *bytes.Buffer + fullBuf.WriteString(fmt.Sprintf("
    ", div_id)) + buf, err = Fragment(pagePaths, templateName, data) + fullBuf.Write(buf.Bytes()) + fullBuf.WriteString("
    ") + return err +} + +func Fragment(pagePaths []string, templateName string, data any) (*bytes.Buffer, error) { + for i := range pagePaths { + pagePaths[i] = "templates/" + pagePaths[i] + } + + buf := new(bytes.Buffer) + + ts, err := template.New("").Funcs(funcs.TemplateFuncs).ParseFS(assets.EmbeddedFiles, pagePaths...) + if err != nil { + return buf, err + } + + err = ts.ExecuteTemplate(buf, templateName, data) + if err != nil { + return buf, err + } + + return buf, err +} + +func Page(w http.ResponseWriter, status int, data any, pagePaths []string, templateNames ...string) error { + templateName := "base" + + if len(templateNames) > 0 { + templateName = templateNames[0] + } + return PageWithHeaders(w, status, data, nil, pagePaths, templateName) +} + +func PageWithHeaders(w http.ResponseWriter, status int, data any, headers http.Header, pagePaths []string, templateName string) error { + templateFile := templateName + ".tmpl" + pagePaths = append(pagePaths, templateFile, "partials/sidebar.tmpl", "partials/nav.tmpl", "partials/footer.tmpl", "partials/types-list.tmpl", "partials/notebooks-list.tmpl") + + return NamedTemplateWithHeaders(w, status, data, headers, templateName, pagePaths) +} + +func NamedTemplate(w http.ResponseWriter, status int, data any, templateName string, pagePaths []string) error { + return NamedTemplateWithHeaders(w, status, data, nil, templateName, pagePaths) +} + +func NamedTemplateWithHeaders(w http.ResponseWriter, status int, data any, headers http.Header, templateName string, pagePaths []string) error { + for i := range pagePaths { + pagePaths[i] = "templates/" + pagePaths[i] + } + + ts, err := template.New("").Funcs(funcs.TemplateFuncs).ParseFS(assets.EmbeddedFiles, pagePaths...) + if err != nil { + return err + } + + buf := new(bytes.Buffer) + + err = ts.ExecuteTemplate(buf, templateName, data) + if err != nil { + return err + } + + for key, value := range headers { + w.Header()[key] = value + } + + w.WriteHeader(status) + buf.WriteTo(w) + + return nil +} diff --git a/internal/smtp/mailer.go b/internal/smtp/mailer.go new file mode 100644 index 0000000..3d538d5 --- /dev/null +++ b/internal/smtp/mailer.go @@ -0,0 +1,102 @@ +package smtp + +import ( + "bytes" + "time" + + "brainminder.speedtech.it/assets" + "brainminder.speedtech.it/internal/funcs" + + "github.com/wneessen/go-mail" + + htmlTemplate "html/template" + textTemplate "text/template" +) + +const defaultTimeout = 10 * time.Second + +type Mailer struct { + client mail.Client + from string +} + +func NewMailer(host string, port int, username, password, from string) (*Mailer, error) { + client, err := mail.NewClient(host, mail.WithTimeout(defaultTimeout), mail.WithSMTPAuth(mail.SMTPAuthLogin), mail.WithPort(port), mail.WithUsername(username), mail.WithPassword(password)) + if err != nil { + return nil, err + } + + mailer := &Mailer{ + client: *client, + from: from, + } + + return mailer, nil +} + +func (m *Mailer) Send(recipient string, data any, patterns ...string) error { + for i := range patterns { + patterns[i] = "emails/" + patterns[i] + } + msg := mail.NewMsg() + + err := msg.To(recipient) + if err != nil { + return err + } + + err = msg.From(m.from) + if err != nil { + return err + } + + ts, err := textTemplate.New("").Funcs(funcs.TemplateFuncs).ParseFS(assets.EmbeddedFiles, patterns...) + if err != nil { + return err + } + + subject := new(bytes.Buffer) + err = ts.ExecuteTemplate(subject, "subject", data) + if err != nil { + return err + } + + msg.Subject(subject.String()) + + plainBody := new(bytes.Buffer) + err = ts.ExecuteTemplate(plainBody, "plainBody", data) + if err != nil { + return err + } + + msg.SetBodyString(mail.TypeTextPlain, plainBody.String()) + + if ts.Lookup("htmlBody") != nil { + ts, err := htmlTemplate.New("").Funcs(funcs.TemplateFuncs).ParseFS(assets.EmbeddedFiles, patterns...) + if err != nil { + return err + } + + htmlBody := new(bytes.Buffer) + err = ts.ExecuteTemplate(htmlBody, "htmlBody", data) + if err != nil { + return err + } + + msg.AddAlternativeString(mail.TypeTextHTML, htmlBody.String()) + } + + for i := 1; i <= 3; i++ { + err = m.client.DialAndSend(msg) + + if nil == err { + return nil + } + + if i != 3 { + time.Sleep(2 * time.Second) + } + } + + return err +} diff --git a/internal/token/token.go b/internal/token/token.go new file mode 100644 index 0000000..8f6171e --- /dev/null +++ b/internal/token/token.go @@ -0,0 +1,34 @@ +package token + +import ( + "crypto/rand" + "crypto/sha256" + "encoding/base32" + "encoding/hex" + "strings" +) + +func randomBytes(n int) ([]byte, error) { + b := make([]byte, n) + + _, err := rand.Read(b) + if err != nil { + return nil, err + } + + return b, nil +} + +func New() (string, error) { + b, err := randomBytes(16) + if err != nil { + return "", err + } + + return strings.ToLower(base32.StdEncoding.WithPadding(base32.NoPadding).EncodeToString(b)), nil +} + +func Hash(plaintext string) string { + hash := sha256.Sum256([]byte(plaintext)) + return hex.EncodeToString(hash[:]) +} diff --git a/internal/validator/helpers.go b/internal/validator/helpers.go new file mode 100644 index 0000000..242c0aa --- /dev/null +++ b/internal/validator/helpers.go @@ -0,0 +1,88 @@ +package validator + +import ( + "net/url" + "regexp" + "strings" + "unicode/utf8" + + "golang.org/x/exp/constraints" +) + +var ( + RgxEmail = regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$") +) + +func NotBlank(value string) bool { + return strings.TrimSpace(value) != "" +} + +func MinRunes(value string, n int) bool { + return utf8.RuneCountInString(value) >= n +} + +func MaxRunes(value string, n int) bool { + return utf8.RuneCountInString(value) <= n +} + +func Between[T constraints.Ordered](value, min, max T) bool { + return value >= min && value <= max +} + +func Matches(value string, rx *regexp.Regexp) bool { + return rx.MatchString(value) +} + +func In[T comparable](value T, safelist ...T) bool { + for i := range safelist { + if value == safelist[i] { + return true + } + } + return false +} + +func AllIn[T comparable](values []T, safelist ...T) bool { + for i := range values { + if !In(values[i], safelist...) { + return false + } + } + return true +} + +func NotIn[T comparable](value T, blocklist ...T) bool { + for i := range blocklist { + if value == blocklist[i] { + return false + } + } + return true +} + +func NoDuplicates[T comparable](values []T) bool { + uniqueValues := make(map[T]bool) + + for _, value := range values { + uniqueValues[value] = true + } + + return len(values) == len(uniqueValues) +} + +func IsEmail(value string) bool { + if len(value) > 254 { + return false + } + + return RgxEmail.MatchString(value) +} + +func IsURL(value string) bool { + u, err := url.ParseRequestURI(value) + if err != nil { + return false + } + + return u.Scheme != "" && u.Host != "" +} diff --git a/internal/validator/validator.go b/internal/validator/validator.go new file mode 100644 index 0000000..f74daea --- /dev/null +++ b/internal/validator/validator.go @@ -0,0 +1,40 @@ +package validator + +type Validator struct { + Errors []string + FieldErrors map[string]string +} + +func (v Validator) HasErrors() bool { + return len(v.Errors) != 0 || len(v.FieldErrors) != 0 +} + +func (v *Validator) AddError(message string) { + if v.Errors == nil { + v.Errors = []string{} + } + + v.Errors = append(v.Errors, message) +} + +func (v *Validator) AddFieldError(key, message string) { + if v.FieldErrors == nil { + v.FieldErrors = map[string]string{} + } + + if _, exists := v.FieldErrors[key]; !exists { + v.FieldErrors[key] = message + } +} + +func (v *Validator) Check(ok bool, message string) { + if !ok { + v.AddError(message) + } +} + +func (v *Validator) CheckField(ok bool, key, message string) { + if !ok { + v.AddFieldError(key, message) + } +} diff --git a/internal/version/version.go b/internal/version/version.go new file mode 100644 index 0000000..dc75e9a --- /dev/null +++ b/internal/version/version.go @@ -0,0 +1,5 @@ +package version + +func Get() string { + return "0.0.1" +} diff --git a/models/base.go b/models/base.go new file mode 100644 index 0000000..c950ad6 --- /dev/null +++ b/models/base.go @@ -0,0 +1,32 @@ +package models + +import ( + "brainminder.speedtech.it/internal/database" + "github.com/yuin/goldmark" + highlighting "github.com/yuin/goldmark-highlighting" + "github.com/yuin/goldmark/extension" + "github.com/yuin/goldmark/renderer/html" +) + +type BaseModel struct { + DB *database.DB +} + +func (model *BaseModel) GetMarkdown() *goldmark.Markdown { + markdown := goldmark.New( + goldmark.WithRendererOptions( + html.WithXHTML(), + html.WithUnsafe(), + ), + goldmark.WithExtensions( + highlighting.Highlighting, + extension.NewLinkify( + extension.WithLinkifyAllowedProtocols([]string{ + "http:", + "https:", + }), + ), + ), + ) + return &markdown +} diff --git a/models/category.go b/models/category.go new file mode 100644 index 0000000..4b2ba9a --- /dev/null +++ b/models/category.go @@ -0,0 +1,131 @@ +package models + +import ( + "database/sql" + "errors" + "strconv" + + "brainminder.speedtech.it/internal/database" + "brainminder.speedtech.it/internal/funcs" + "github.com/jmoiron/sqlx" +) + +type CategoryModel struct { + DB *database.DB +} + +type Category struct { + Id int64 `db:"id"` + Name string `db:"name"` +} + +func (model *CategoryModel) One(id int) (*Category, bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + var row Category + + query := `SELECT id, name FROM bm_category WHERE id = $1` + + err := model.DB.GetContext(ctx, &row, query, id) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + + return &row, true, err +} + +func (model *CategoryModel) All() ([]Category, bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + query := `SELECT id, name FROM bm_category ORDER BY name` + + var rows []Category + + err := model.DB.SelectContext(ctx, &rows, query) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + + return rows, true, err +} + +func (model *CategoryModel) Find(ids []int64) ([]Category, bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + query, args, _ := sqlx.In("SELECT id, name FROM bm_category WHERE id IN (?) ORDER BY name", ids) + query = model.DB.Rebind(query) + + var rows []Category + + err := model.DB.SelectContext(ctx, &rows, query, args) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + + return rows, true, err +} + +func (model *CategoryModel) AllAsOptions() []funcs.WidgetOption { + categories, _, _ := model.All() + var selectOptions []funcs.WidgetOption + for _, category := range categories { + selectOptions = append(selectOptions, funcs.WidgetOption{Key: strconv.FormatInt(category.Id, 10), Value: category.Name}) + } + return selectOptions +} + +func (model *CategoryModel) AllAsMap() map[string]string { + categories, _, _ := model.All() + var categories_map = make(map[string]string) + for _, category := range categories { + categories_map[strconv.FormatInt(category.Id, 10)] = category.Name + } + return categories_map +} + +func (model *CategoryModel) Delete(id int) (bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + query := `DELETE FROM bm_category WHERE id = $1` + + _, err := model.DB.ExecContext(ctx, query, id) + if errors.Is(err, sql.ErrNoRows) { + return false, nil + } + + return true, err +} + +func (model *CategoryModel) Create(Category *Category) (int64, error) { + ctx, cancel := database.GetContext() + defer cancel() + + query := `INSERT INTO bm_category (name) VALUES (:name)` + + result, err := model.DB.NamedExecContext(ctx, query, Category) + if err != nil { + return 0, err + } + + id, err := result.LastInsertId() + if err != nil { + return 0, err + } + + return id, err +} + +func (model *CategoryModel) Update(Category *Category) error { + ctx, cancel := database.GetContext() + defer cancel() + + query := `UPDATE bm_category SET name=:name WHERE id = :id` + + _, err := model.DB.NamedExecContext(ctx, query, Category) + + return err +} diff --git a/models/constructors.go b/models/constructors.go new file mode 100644 index 0000000..f581078 --- /dev/null +++ b/models/constructors.go @@ -0,0 +1,13 @@ +package models + +import ( + "brainminder.speedtech.it/internal/database" +) + +func NewQuicknoteModel(db *database.DB) *QuicknoteModel { + return &QuicknoteModel{BaseModel: &BaseModel{db}} +} + +func NewItemModel(db *database.DB) *ItemModel { + return &ItemModel{BaseModel: &BaseModel{db}} +} diff --git a/models/field.go b/models/field.go new file mode 100644 index 0000000..8cfef52 --- /dev/null +++ b/models/field.go @@ -0,0 +1,168 @@ +package models + +import ( + "database/sql" + "errors" + + "brainminder.speedtech.it/internal/database" +) + +type FieldModel struct { + DB *database.DB +} + +type Field struct { + Type_field_id int64 `db:"type_field_id"` + Widget_id int64 `db:"widget_id"` + Type_id int64 `db:"type_id"` + Widget string `db:"widget"` + Title string `db:"title"` + Position int `db:"position"` + Show_on_list int64 `db:"show_on_list"` + Show_on_view int64 `db:"show_on_view"` + Valid_values string `db:"valid_values"` + Ui_section string `db:"ui_section"` + Is_multiple int64 `db:"is_multiple"` + ToRemove int64 +} + +type FieldValue struct { + Type_field_id int64 `db:"type_field_id"` + Value string `db:"value"` + Title string `db:"title"` + Widget string `db:"widget"` + Number int64 `db:"number"` + Counter int `db:"counter"` +} + +func (model *FieldModel) ByTypeSection(type_id int64) (map[string][]Field, bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + query := `SELECT btf.id AS type_field_id, btf.widget_id, btf.type_id, bw.widget, btf.title, btf.position, + btf.valid_values, btf.show_on_list, btf.show_on_view, btf.ui_section, btf.is_multiple + FROM bm_type_fields btf INNER JOIN bm_widgets bw ON btf.widget_id=bw.id WHERE btf.type_id=$1 ORDER BY btf.position` + + var rows []Field + rowsBySection := make(map[string][]Field) + + err := model.DB.SelectContext(ctx, &rows, query, type_id) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + + for _, row := range rows { + if value, found := rowsBySection[row.Ui_section]; found { + rowsBySection[row.Ui_section] = append(value, row) + } else { + rowsBySection[row.Ui_section] = []Field{row} + } + } + + return rowsBySection, true, err +} + +func (model *FieldModel) ByType(type_id int64) ([]Field, bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + query := `SELECT btf.id AS type_field_id, btf.widget_id, btf.type_id, bw.widget, btf.title, btf.position, + btf.valid_values, btf.show_on_list, btf.show_on_view, btf.ui_section, btf.is_multiple + FROM bm_type_fields btf INNER JOIN bm_widgets bw ON btf.widget_id=bw.id WHERE btf.type_id=$1 ORDER BY btf.position` + + var rows []Field + + err := model.DB.SelectContext(ctx, &rows, query, type_id) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + + return rows, true, err +} + +func (model *FieldModel) ByTypeOnList(type_id int64) ([]Field, bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + query := `SELECT btf.id AS type_field_id, btf.widget_id, btf.type_id, bw.widget, btf.title, btf.position, + btf.valid_values, btf.show_on_list, btf.show_on_view, btf.ui_section, btf.is_multiple + FROM bm_type_fields btf INNER JOIN bm_widgets bw ON btf.widget_id=bw.id WHERE btf.show_on_list=1 AND btf.type_id=$1 ORDER BY btf.position` + + var rows []Field + + err := model.DB.SelectContext(ctx, &rows, query, type_id) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + + return rows, true, err +} + +func (model *FieldModel) SaveValues(item_id int64, type_field_id int64, values map[int]string) bool { + ctx, cancel := database.GetContext() + defer cancel() + + qy_delete := `DELETE FROM bm_item_fields WHERE item_id=? AND type_field_id=?` + + _, err := model.DB.ExecContext(ctx, qy_delete, item_id, type_field_id) + if errors.Is(err, sql.ErrNoRows) { + return false + } + + qy_insert := `INSERT INTO bm_item_fields (item_id, type_field_id, counter, value) VALUES(?, ?, ?, ?)` + + for counter, value := range values { + model.DB.MustExecContext(ctx, qy_insert, item_id, type_field_id, counter, value) + } + + return true +} + +func (model *FieldModel) GetFieldValues(item_id int64, type_field_id int64) map[int]string { + ctx, cancel := database.GetContext() + defer cancel() + + rows, _ := model.DB.QueryContext(ctx, "SELECT counter, value FROM bm_item_fields WHERE item_id=? AND type_field_id=?", item_id, type_field_id) + + values := make(map[int]string) + + for rows.Next() { + var counter int + var value string + rows.Scan(&counter, &value) + + values[counter] = value + } + + return values +} + +func (model *FieldModel) GetFieldsValues(item_id int64) []FieldValue { + ctx, cancel := database.GetContext() + defer cancel() + + var values []FieldValue + q := `SELECT bw.widget, btf.title, bif.type_field_id, bif.value, bif.counter FROM bm_item_fields bif + INNER JOIN bm_type_fields btf on btf.id=bif.type_field_id + INNER JOIN bm_widgets bw on bw.id=btf.widget_id + WHERE bif.item_id=$1` + model.DB.SelectContext(ctx, &values, q, item_id) + + return values +} + +func (model *FieldModel) GetFieldsValuesAsMap(item_id int64) map[int64]map[int]string { + values := model.GetFieldsValues(item_id) + + values_map := make(map[int64]map[int]string) + + for _, item_value := range values { + _, found := values_map[item_value.Type_field_id] + if !found { + values_map[item_value.Type_field_id] = make(map[int]string) + } + values_map[item_value.Type_field_id][item_value.Counter] = item_value.Value + } + + return values_map +} diff --git a/models/item.go b/models/item.go new file mode 100644 index 0000000..1507ab3 --- /dev/null +++ b/models/item.go @@ -0,0 +1,470 @@ +package models + +import ( + "bytes" + "database/sql" + "errors" + "strconv" + "strings" + + "brainminder.speedtech.it/internal/database" +) + +type Item struct { + Id int64 `db:"id"` + Title string `db:"title"` + Summary string `db:"summary"` + Summary_rendered string `db:"summary_rendered"` + Description string `db:"description"` + Description_rendered string `db:"description_rendered"` + Active int `db:"active"` + Tags string `db:"tags"` + Type_id int64 `db:"type_id"` + Categories string `db:"categories"` + Notebooks string `db:"notebooks"` + Crypted int `db:"crypted"` + Hidden int `db:"hidden"` + On_dashboard int `db:"on_dashboard"` + On_dashboard_position int `db:"on_dashboard_position"` + Type_title string `db:"type_title"` + Type_icon string `db:"type_icon"` + Type_show_summary int `db:"type_show_summary"` + Type_show_description int `db:"type_show_description"` + FieldsOnList []Field + FieldsValues []FieldValue + FieldsValuesMap map[int64]map[int]string +} + +type ItemRelation struct { + Item_id int64 `db:"item_id"` + Related_item_id int64 `db:"related_item_id"` + Relation_type string `db:"relation_type"` + Title string `db:"title"` + Categories string `db:"categories"` + Tags string `db:"tags"` + Type_title string `db:"type_title"` + Type_icon string `db:"type_icon"` +} + +type ItemModel struct { + *BaseModel +} + +func (model *ItemModel) One(id int64) (*Item, bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + var row Item + + query := `SELECT bmi.*, bmt.title AS type_title, bmt.icon AS type_icon, bmt.show_summary AS type_show_summary, + bmt.show_description AS type_show_description FROM bm_item bmi + INNER JOIN bm_type bmt ON bmi.type_id=bmt.id WHERE bmi.id = $1` + + err := model.DB.GetContext(ctx, &row, query, id) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + + return &row, true, err +} + +func (model *ItemModel) Delete(id int) (bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + _, err := model.DB.ExecContext(ctx, `DELETE FROM bm_item WHERE id = $1`, id) + if errors.Is(err, sql.ErrNoRows) { + return false, nil + } + + _, err = model.DB.ExecContext(ctx, `DELETE FROM bm_item_relations WHERE id = $1 OR related_item_id=$1`, id) + if errors.Is(err, sql.ErrNoRows) { + return false, nil + } + + _, err = model.DB.ExecContext(ctx, `DELETE FROM bm_item_fields WHERE item_id = $1`, id) + if errors.Is(err, sql.ErrNoRows) { + return false, nil + } + + _, err = model.DB.ExecContext(ctx, `DELETE FROM bm_item_keywords WHERE item_id = $1`, id) + if errors.Is(err, sql.ErrNoRows) { + return false, nil + } + + return true, err +} + +func (model *ItemModel) Search(searchText string, criteria map[string]any) ([]Item, bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + var params []interface{} + var conditions []string + var cond string + + var conditions_criteria []string + var cond_criteria string + + query := `SELECT DISTINCT bmi.*, bmt.title AS type_title, bmt.icon AS type_icon FROM bm_item bmi + INNER JOIN bm_type bmt ON bmi.type_id=bmt.id + INNER JOIN bm_item_keywords bit ON bit.item_id=bmi.id ` + + for field, value := range criteria { + switch field { + case "notebook_id": + if value != nil { + valint := value.(int64) + if valint > 0 { + valstr := "|" + strconv.FormatInt(valint, 10) + "|" + params = append(params, valstr) + conditions_criteria = append(conditions_criteria, "INSTR(bmi.notebooks, ?) > 0 ") + } + } + } + } + + if len(searchText) > 0 { + params = append(params, strings.ToLower(searchText)) + conditions = append(conditions, "bit.keyword = ? ") + } + + for _, s := range strings.Split(searchText, " ") { + s = strings.ToLower(s) + if len(s) > 0 { + params = append(params, s) + conditions = append(conditions, "bit.keyword = ? ") + } + } + + for _, condition := range conditions { + if len(cond) > 0 { + cond = cond + " OR " + } + cond = cond + condition + } + + for _, condition := range conditions_criteria { + if len(cond_criteria) > 0 { + cond_criteria = cond_criteria + " AND " + } + cond_criteria = cond_criteria + condition + } + + len_cond := len(cond) + len_cond_criteria := len(cond_criteria) + + if len_cond_criteria > 0 || len_cond > 0 { + query = query + "WHERE " + } + + if len_cond_criteria > 0 { + query = query + cond_criteria + if len_cond > 0 { + query = query + " AND (" + cond + ")" + } + } else { + if len_cond > 0 { + query = query + " (" + cond + ")" + } + } + + query = query + ` ORDER BY bmi.title` + + var rows []Item + + err := model.DB.SelectContext(ctx, &rows, query, params...) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + + return rows, true, err + +} + +func (model *ItemModel) Find(criteria map[string]any, offset int64) ([]Item, bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + var params []interface{} + var conditions []string + var cond string + query := `SELECT DISTINCT bmi.*, bmt.title AS type_title, bmt.icon AS type_icon FROM bm_item bmi + INNER JOIN bm_type bmt ON bmi.type_id=bmt.id ` + + for field, value := range criteria { + switch field { + case "Title": + valstr := value.(string) + if len(valstr) > 0 { + params = append(params, valstr) + conditions = append(conditions, "bmi.title LIKE '%' || ? || '%'") + } + case "Tags": + valstr := value.(string) + if len(valstr) > 0 { + params = append(params, valstr) + conditions = append(conditions, "bmi.tags LIKE '%' || ? || '%'") + } + case "type_id": + valint := value.(int64) + if valint > 0 { + params = append(params, valint) + conditions = append(conditions, "bmi.type_id=?") + } + case "notebook_id": + if value != nil { + valint := value.(int64) + if valint > 0 { + valstr := "|" + strconv.FormatInt(valint, 10) + "|" + params = append(params, valstr) + conditions = append(conditions, "INSTR(bmi.notebooks, ?) > 0") + } + } + case "category_id": + if value != nil { + valint := value.(int64) + if valint > 0 { + valstr := "|" + strconv.FormatInt(valint, 10) + "|" + params = append(params, valstr) + conditions = append(conditions, "INSTR(bmi.categories, ?) > 0") + } + } + case "On_dashboard": + valint := value.(int) + if valint > 0 { + params = append(params, valint) + conditions = append(conditions, "bmi.on_dashboard=?") + } + } + } + + for _, condition := range conditions { + if len(cond) > 0 { + cond = cond + " AND " + } + cond = cond + condition + } + + if len(cond) > 0 { + query = query + "WHERE " + cond + " " + } + + query = query + ` ORDER BY bmi.title` + + params = append(params, offset) + query = query + ` LIMIT 10 OFFSET ?` + + var rows []Item + + err := model.DB.SelectContext(ctx, &rows, query, params...) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + + return rows, true, err +} + +func (model *ItemModel) Create(Item *Item) (int64, error) { + ctx, cancel := database.GetContext() + defer cancel() + + markdown := *model.GetMarkdown() + + var bufSummary bytes.Buffer + markdown.Convert([]byte(Item.Summary), &bufSummary) + Item.Summary_rendered = bufSummary.String() + + var bufDescription bytes.Buffer + markdown.Convert([]byte(Item.Description), &bufDescription) + Item.Description_rendered = bufDescription.String() + + query := `INSERT INTO bm_item (type_id, title, summary, summary_rendered, description, description_rendered, on_dashboard, tags, notebooks, categories) + VALUES (:type_id, :title, :summary, :summary_rendered, :description, :description_rendered, :on_dashboard, :tags, :notebooks, :categories)` + + result, err := model.DB.NamedExecContext(ctx, query, Item) + if err != nil { + return 0, err + } + + id, err := result.LastInsertId() + if err != nil { + return 0, err + } + + return id, err +} + +func (model *ItemModel) Update(Item *Item) error { + ctx, cancel := database.GetContext() + defer cancel() + + markdown := *model.GetMarkdown() + + var bufSummary bytes.Buffer + markdown.Convert([]byte(Item.Summary), &bufSummary) + Item.Summary_rendered = bufSummary.String() + + var bufDescription bytes.Buffer + markdown.Convert([]byte(Item.Description), &bufDescription) + Item.Description_rendered = bufDescription.String() + + query := `UPDATE bm_item SET title=:title, type_id=:type_id, summary=:summary, summary_rendered=:summary_rendered, + description=:description, description_rendered=:description_rendered, tags=:tags, on_dashboard=:on_dashboard, + categories=:categories, notebooks =:notebooks WHERE id = :id` + _, err := model.DB.NamedExecContext(ctx, query, Item) + + if err != nil { + return err + } + + return err +} + +func (model *ItemModel) AddToDashboard(id int64) error { + ctx, cancel := database.GetContext() + defer cancel() + + query := `UPDATE bm_item SET on_dashboard=1 WHERE id = :id` + _, err := model.DB.ExecContext(ctx, query, id) + + if err != nil { + return err + } + + return err +} + +func (model *ItemModel) RemoveFromDashboard(id int64) error { + ctx, cancel := database.GetContext() + defer cancel() + + query := `UPDATE bm_item SET on_dashboard=0 WHERE id = :id` + _, err := model.DB.ExecContext(ctx, query, id) + + if err != nil { + return err + } + + return err +} + +func (model *ItemModel) SaveKeywords(Item *Item, fields *[]Field, fieldsValues map[int64]map[int]string) error { + ctx, cancel := database.GetContext() + defer cancel() + + var keywords []string + keywords = append(keywords, Item.Type_title) + + var categories_int []int64 + categories_str := strings.Split(strings.Trim(Item.Categories, "|"), "|") + for _, category_str := range categories_str { + category_int, _ := strconv.ParseInt(category_str, 10, 64) + categories_int = append(categories_int, category_int) + } + + categoryModel := &CategoryModel{DB: model.DB} + categories, _, _ := categoryModel.Find(categories_int) + for _, category := range categories { + keywords = append(keywords, category.Name) + } + + keywords = append(keywords, strings.Split(Item.Tags, ",")...) + keywords = append(keywords, strings.Split(Item.Title, " ")...) + + for _, field := range *fields { + if field.Widget != "url" { + values, found := fieldsValues[field.Type_field_id] + if found { + for _, value := range values { + keywords = append(keywords, value) + } + } + } + } + + query := `DELETE FROM bm_item_keywords WHERE item_id = $1` + _, err := model.DB.ExecContext(ctx, query, Item.Id) + + if err != nil { + return err + } + + stmt, err := model.DB.Prepare(`INSERT INTO bm_item_keywords (item_id, keyword) VALUES($1, $2)`) + for _, keyword := range keywords { + keyword = strings.ToLower(strings.TrimSpace(keyword)) + if len(keyword) > 1 { + _, err = stmt.ExecContext(ctx, Item.Id, keyword) + } + + if err != nil { + return err + } + } + + return nil +} + +func (model *ItemModel) AddRelation(id int64, related_id int64, relation_type string) error { + ctx, cancel := database.GetContext() + defer cancel() + + query := `INSERT INTO bm_item_relations (item_id, related_item_id, relation_type) VALUES($1, $2, $3)` + _, err := model.DB.ExecContext(ctx, query, id, related_id, relation_type) + + if err != nil { + return err + } + return nil +} + +func (model *ItemModel) UpdateRelation(id int64, related_id int64, relation_type string) error { + ctx, cancel := database.GetContext() + defer cancel() + + query := `UPDATE bm_item_relations SET relation_type=$1 WHERE item_id=$2 AND related_item_id=$3` + _, err := model.DB.ExecContext(ctx, query, relation_type, id, related_id) + + if err != nil { + return err + } + return nil +} + +func (model *ItemModel) DeleteRelation(id int64, related_id int64) error { + ctx, cancel := database.GetContext() + defer cancel() + + query := `DELETE FROM bm_item_relations WHERE item_id=$1 AND related_item_id=$2` + _, err := model.DB.ExecContext(ctx, query, id, related_id) + + if err != nil { + return err + } + return nil +} + +func (model *ItemModel) GetRelations(id int64) ([]ItemRelation, bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + query := `SELECT bir.item_id, bir.related_item_id, bmi.title, bmi.categories, bmi.tags, bmt.title AS type_title, + bmt.icon AS type_icon, bir.relation_type FROM bm_item bmi + INNER JOIN bm_type bmt ON bmi.type_id=bmt.id + INNER JOIN bm_item_relations bir ON bir.related_item_id=bmi.id WHERE bir.item_id=$1 + UNION + SELECT bir.item_id, bir.related_item_id, bmi.title, bmi.categories, bmi.tags, bmt.title AS type_title, + bmt.icon AS type_icon, bir.relation_type FROM bm_item bmi + INNER JOIN bm_type bmt ON bmi.type_id=bmt.id + INNER JOIN bm_item_relations bir ON bir.item_id=bmi.id WHERE bir.related_item_id=$1 + ` + + var rows []ItemRelation + + err := model.DB.SelectContext(ctx, &rows, query, id) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + + return rows, true, err +} diff --git a/models/notebook.go b/models/notebook.go new file mode 100644 index 0000000..53d136b --- /dev/null +++ b/models/notebook.go @@ -0,0 +1,152 @@ +package models + +import ( + "database/sql" + "errors" + "strconv" + + "brainminder.speedtech.it/internal/database" + "brainminder.speedtech.it/internal/funcs" +) + +type NotebookModel struct { + DB *database.DB +} + +type Notebook struct { + Id int64 `db:"id"` + Title string `db:"title"` + Icon string `db:"icon"` + Description string `db:"description"` + Hidden int `db:"hidden"` +} + +func (model *NotebookModel) One(id int64) (*Notebook, bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + var row Notebook + + query := `SELECT * FROM bm_notebook WHERE id = $1` + + err := model.DB.GetContext(ctx, &row, query, id) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + + return &row, true, err +} + +func (model *NotebookModel) All() ([]Notebook, bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + query := `SELECT * FROM bm_notebook ORDER BY title` + + var rows []Notebook + + err := model.DB.SelectContext(ctx, &rows, query) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + + return rows, true, err +} + +func (model *NotebookModel) AllAsOptions(withAll bool) []funcs.WidgetOption { + Notebooks, _, _ := model.All() + var selectOptions []funcs.WidgetOption + if withAll { + selectOptions = append(selectOptions, funcs.WidgetOption{Key: "0", Value: "- All -"}) + } + for _, Notebook := range Notebooks { + selectOptions = append(selectOptions, funcs.WidgetOption{Key: strconv.FormatInt(Notebook.Id, 10), Value: Notebook.Title}) + } + return selectOptions +} + +func (model *NotebookModel) Find(criteria map[string]any) ([]Notebook, bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + var params []interface{} + var conditions []string + var cond string + query := "SELECT bmn.* FROM bm_notebook bmn " + + for field, value := range criteria { + switch field { + case "Title": + valstr := value.(string) + if len(valstr) > 0 { + params = append(params, valstr) + conditions = append(conditions, "bmn.title LIKE '%' || ? || '%'") + } + } + } + + for _, condition := range conditions { + if len(cond) > 0 { + cond = cond + " AND " + } + cond = cond + condition + } + + if len(cond) > 0 { + query = query + "WHERE " + cond + " " + } + query = query + `ORDER BY bmn.title` + + var rows []Notebook + + err := model.DB.SelectContext(ctx, &rows, query, params...) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + + return rows, true, err +} + +func (model *NotebookModel) Create(Notebook *Notebook) (int64, error) { + ctx, cancel := database.GetContext() + defer cancel() + + query := `INSERT INTO bm_notebook (title, description, icon, hidden) VALUES (:title, :description, :icon, :hidden)` + + result, err := model.DB.NamedExecContext(ctx, query, Notebook) + if err != nil { + return 0, err + } + + id, err := result.LastInsertId() + if err != nil { + return 0, err + } + + return id, err +} + +func (model *NotebookModel) Update(Notebook *Notebook) error { + ctx, cancel := database.GetContext() + defer cancel() + + query := `UPDATE bm_notebook SET title=:title, icon=:icon, description=:description, hidden=:hidden WHERE id = :id` + + _, err := model.DB.NamedExecContext(ctx, query, Notebook) + + return err +} + +func (model *NotebookModel) Delete(id int64) (bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + query := `DELETE FROM bm_notebook WHERE id = $1` + + _, err := model.DB.ExecContext(ctx, query, id) + if errors.Is(err, sql.ErrNoRows) { + return false, nil + } + + return true, err +} diff --git a/models/quicknote.go b/models/quicknote.go new file mode 100644 index 0000000..64fd931 --- /dev/null +++ b/models/quicknote.go @@ -0,0 +1,182 @@ +package models + +import ( + "bytes" + "database/sql" + "errors" + + "brainminder.speedtech.it/internal/database" +) + +type QuicknoteModel struct { + *BaseModel +} + +type Quicknote struct { + Id int64 `db:"id"` + Note string `db:"note"` + Note_rendered string `db:"note_rendered"` +} + +func (model *QuicknoteModel) One(id int64) (*Quicknote, bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + var row Quicknote + + query := `SELECT * FROM bm_quicknote WHERE id = $1` + + err := model.DB.GetContext(ctx, &row, query, id) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + + return &row, true, err +} + +func (model *QuicknoteModel) All() ([]Quicknote, bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + query := `SELECT * FROM bm_quicknote ORDER BY note` + + var rows []Quicknote + + err := model.DB.SelectContext(ctx, &rows, query) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + + return rows, true, err +} + +func (model *QuicknoteModel) Count() int64 { + ctx, cancel := database.GetContext() + defer cancel() + + var count int64 + model.DB.GetContext(ctx, &count, "SELECT COUNT(*) FROM bm_quicknote") + + return count +} + +func (model *QuicknoteModel) AllQB(offset int64) ([]Quicknote, bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + query := `SELECT * FROM bm_quicknote ORDER BY id DESC LIMIT 10 OFFSET ?` + + var rows []Quicknote + + err := model.DB.SelectContext(ctx, &rows, query, offset) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + + rowsLen := len(rows) + var reversedRows []Quicknote + + for i := range rows { + reversedRows = append(reversedRows, rows[rowsLen-i-1]) + } + + return reversedRows, true, err +} + +func (model *QuicknoteModel) Find(criteria map[string]any) ([]Quicknote, bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + var params []interface{} + var conditions []string + var cond string + query := "SELECT bmq.* FROM bm_quicknote bmq " + + for field, value := range criteria { + switch field { + case "Note": + valstr := value.(string) + if len(valstr) > 0 { + params = append(params, valstr) + conditions = append(conditions, "bmq.note LIKE '%' || ? || '%'") + } + } + } + + for _, condition := range conditions { + if len(cond) > 0 { + cond = cond + " AND " + } + cond = cond + condition + } + + if len(cond) > 0 { + query = query + "WHERE " + cond + " " + } + query = query + `ORDER BY bmq.note` + + var rows []Quicknote + + err := model.DB.SelectContext(ctx, &rows, query, params...) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + + return rows, true, err +} + +func (model *QuicknoteModel) Create(Quicknote *Quicknote) (int64, error) { + ctx, cancel := database.GetContext() + defer cancel() + + markdown := *model.GetMarkdown() + + var bufNote bytes.Buffer + markdown.Convert([]byte(Quicknote.Note), &bufNote) + Quicknote.Note_rendered = bufNote.String() + + query := `INSERT INTO bm_quicknote (note, note_rendered) VALUES (:note, :note_rendered)` + + result, err := model.DB.NamedExecContext(ctx, query, Quicknote) + if err != nil { + return 0, err + } + + id, err := result.LastInsertId() + if err != nil { + return 0, err + } + + return id, err +} + +func (model *QuicknoteModel) Update(Quicknote *Quicknote) error { + ctx, cancel := database.GetContext() + defer cancel() + + markdown := *model.GetMarkdown() + + var bufNote bytes.Buffer + markdown.Convert([]byte(Quicknote.Note), &bufNote) + Quicknote.Note_rendered = bufNote.String() + + query := `UPDATE bm_quicknote SET note=:note, note_rendered=:note_rendered WHERE id = :id` + + _, err := model.DB.NamedExecContext(ctx, query, Quicknote) + + return err +} + +func (model *QuicknoteModel) Delete(id int64) (bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + query := `DELETE FROM bm_quicknote WHERE id = $1` + + _, err := model.DB.ExecContext(ctx, query, id) + if errors.Is(err, sql.ErrNoRows) { + return false, nil + } + + return true, err +} diff --git a/models/type.go b/models/type.go new file mode 100644 index 0000000..267ff8b --- /dev/null +++ b/models/type.go @@ -0,0 +1,231 @@ +package models + +import ( + "database/sql" + "errors" + "net/http" + "strconv" + "strings" + + "brainminder.speedtech.it/internal/database" + "brainminder.speedtech.it/internal/funcs" +) + +type TypeModel struct { + DB *database.DB +} + +type Type struct { + Id int64 `db:"id"` + Title string `db:"title"` + Icon string `db:"icon"` + Description string `db:"description"` + Notebooks string `db:"notebooks"` + Show_summary int `db:"show_summary"` + Show_description int `db:"show_description"` + Sections string `db:"sections"` +} + +func (model *TypeModel) One(id int64) (*Type, bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + var row Type + + query := `SELECT * FROM bm_type WHERE id = $1` + + err := model.DB.GetContext(ctx, &row, query, id) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + + return &row, true, err +} + +func (model *TypeModel) Find(criteria map[string]any) ([]Type, bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + var params []interface{} + var conditions []string + var cond string + query := "SELECT DISTINCT bmt.* FROM bm_type bmt " + + for field, value := range criteria { + switch field { + case "Title": + valstr := value.(string) + if len(valstr) > 0 { + params = append(params, valstr) + conditions = append(conditions, "bmt.title LIKE '%' || ? || '%'") + } + case "notebook_id": + if value != nil { + valint := value.(int64) + if valint > 0 { + valstr := "|" + strconv.FormatInt(valint, 10) + "|" + params = append(params, valstr) + conditions = append(conditions, "INSTR(notebooks, ?) > 0") + } + } + } + } + + for _, condition := range conditions { + if len(cond) > 0 { + cond = cond + " AND " + } + cond = cond + condition + } + + if len(cond) > 0 { + query = query + "WHERE " + cond + " " + } + query = query + `ORDER BY bmt.title` + + var rows []Type + + err := model.DB.SelectContext(ctx, &rows, query, params...) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + + return rows, true, err +} + +func (model *TypeModel) FindAsOptions(criteria map[string]any) []funcs.WidgetOption { + Types, _, _ := model.Find(criteria) + var selectOptions []funcs.WidgetOption + for _, Type := range Types { + selectOptions = append(selectOptions, funcs.WidgetOption{Key: strconv.FormatInt(Type.Id, 10), Value: Type.Title}) + } + return selectOptions +} + +func (model *TypeModel) Delete(id int) (bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + query := `DELETE FROM bm_type WHERE id = $1` + + _, err := model.DB.ExecContext(ctx, query, id) + if errors.Is(err, sql.ErrNoRows) { + return false, nil + } + + return true, err +} + +func (model *TypeModel) Create(Type *Type) (int64, error) { + ctx, cancel := database.GetContext() + defer cancel() + + query := `INSERT INTO bm_type (title, icon, description, notebooks, sections, show_summary, show_description) + VALUES (:title, :icon, :description, :notebooks, :sections, :show_summary, :show_description)` + + result, err := model.DB.NamedExecContext(ctx, query, Type) + if err != nil { + return 0, err + } + + id, err := result.LastInsertId() + if err != nil { + return 0, err + } + + return id, err +} + +func (model *TypeModel) Update(Type *Type) error { + ctx, cancel := database.GetContext() + defer cancel() + + query := `UPDATE bm_type SET title=:title, icon=:icon, description=:description, notebooks=:notebooks, + sections=:sections, show_summary=:show_summary, show_description=:show_description WHERE id = :id` + + _, err := model.DB.NamedExecContext(ctx, query, Type) + + return err +} + +func (model *TypeModel) SaveField(type_field_id int64, field *Field) error { + ctx, cancel := database.GetContext() + defer cancel() + + query := `UPDATE bm_type_fields SET widget_id=:widget_id, title=:title, position=:position, + valid_values=:valid_values, show_on_list=:show_on_list, show_on_view=:show_on_view, ui_section=:ui_section, is_multiple=:is_multiple WHERE id =:type_field_id` + + _, err := model.DB.NamedExecContext(ctx, query, field) + + return err +} + +func (model *TypeModel) RemoveField(type_field_id int64) error { + ctx, cancel := database.GetContext() + defer cancel() + + //Check here if it is used + query := "DELETE FROM bm_type_fields WHERE id=$1" + + _, err := model.DB.ExecContext(ctx, query, type_field_id) + + return err +} + +func (model *TypeModel) AddField(bmField *Field) error { + ctx, cancel := database.GetContext() + defer cancel() + + query := `INSERT INTO bm_type_fields (type_id, widget_id, title, position, valid_values, show_on_list, show_on_view, ui_section, is_multiple) + VALUES (:type_id, :widget_id, :title, :position, :valid_values, :show_on_list, :show_on_view, :ui_section, :is_multiple)` + + _, err := model.DB.NamedExecContext(ctx, query, bmField) + + return err +} + +func (model *TypeModel) AddFields(TypeId int64, r *http.Request) { + fieldsNew := make(map[int64]Field) + for name, values := range r.PostForm { + s, found := strings.CutPrefix(name, "Fields-New-") + if found { + parts := strings.Split(s, "-") + if len(parts) == 2 { + counter, _ := strconv.ParseInt(parts[0], 10, 64) + type_field_attribute := parts[1] + + field, found := fieldsNew[counter] + if !found { + field := &Field{Type_id: TypeId} + fieldsNew[counter] = *field + } + field = fieldsNew[counter] + + switch type_field_attribute { + case "Widget_id": + field.Widget_id, _ = strconv.ParseInt(values[0], 10, 64) + case "Title": + field.Title = values[0] + case "Valid_values": + field.Valid_values = values[0] + case "Ui_section": + field.Ui_section = values[0] + case "Is_multiple": + field.Is_multiple, _ = strconv.ParseInt(values[0], 10, 64) + case "Show_on_list": + field.Show_on_list, _ = strconv.ParseInt(values[0], 10, 64) + case "Show_on_view": + field.Show_on_view, _ = strconv.ParseInt(values[0], 10, 64) + } + fieldsNew[counter] = field + } + } + } + + for _, field := range fieldsNew { + if len(field.Title) > 0 { + model.AddField(&field) + } + } + +} diff --git a/models/widget.go b/models/widget.go new file mode 100644 index 0000000..bb9c4ae --- /dev/null +++ b/models/widget.go @@ -0,0 +1,52 @@ +package models + +import ( + "database/sql" + "errors" + "strconv" + + "brainminder.speedtech.it/internal/database" + "brainminder.speedtech.it/internal/funcs" +) + +type WidgetModel struct { + DB *database.DB +} + +type Widget struct { + Id int64 `db:"id"` + Name string `db:"name"` + Widget string `db:"widget"` +} + +func (model *WidgetModel) All() ([]Widget, bool, error) { + ctx, cancel := database.GetContext() + defer cancel() + + query := `SELECT * FROM bm_widgets ORDER BY name` + + var rows []Widget + + err := model.DB.SelectContext(ctx, &rows, query) + if errors.Is(err, sql.ErrNoRows) { + return nil, false, nil + } + + return rows, true, err +} + +func (model *WidgetModel) AllAsOptions() []funcs.WidgetOption { + Widgets, _, _ := model.All() + var selectOptions []funcs.WidgetOption + for _, Widget := range Widgets { + selectOptions = append(selectOptions, funcs.WidgetOption{Key: strconv.FormatInt(Widget.Id, 10), Value: Widget.Name}) + } + return selectOptions +} + +func (model *WidgetModel) UISections() []funcs.WidgetOption { + var selectOptions []funcs.WidgetOption + selectOptions = append(selectOptions, funcs.WidgetOption{Key: "general", Value: "General"}) + selectOptions = append(selectOptions, funcs.WidgetOption{Key: "fields", Value: "Fields"}) + return selectOptions +}