diff --git a/.github/workflows/hugo.yaml b/.github/workflows/hugo.yaml
new file mode 100644
index 000000000..852bbfe00
--- /dev/null
+++ b/.github/workflows/hugo.yaml
@@ -0,0 +1,32 @@
+name: Hugo
+
+on:
+ push:
+ branches: [ main ]
+ pull_request:
+ branches: [ main ]
+
+jobs:
+
+ build:
+ name: Build
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository and submodules
+ uses: actions/checkout@v2
+
+
+ - name: Setup Hugo
+ uses: peaceiris/actions-hugo@v2
+ with:
+ hugo-version: '0.121.2'
+ extended: true
+
+ - name: Build
+ run: |
+ cd website && npm install && hugo --gc --minify
+ - name: Deploy to GitHub Pages
+ uses: peaceiris/actions-gh-pages@v3
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ publish_dir: ./website/public
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index ec9267cf7..71ae02003 100644
--- a/.gitignore
+++ b/.gitignore
@@ -31,6 +31,12 @@ __pycache__/
default.tfstate
default.tfstate.backup
.terraform*
+__pycache__/
+
+public/
+node_modules/
+resources/
terraform.tfstate*
terraform.tfvars
tfplan
+
diff --git a/website/.gitignore b/website/.gitignore
new file mode 100644
index 000000000..cc87aecd0
--- /dev/null
+++ b/website/.gitignore
@@ -0,0 +1,12 @@
+public/
+
+# Modules generated by node.js for CSS editing
+node_modules/
+
+# Resources directory generated by Hugo local build
+resources/
+
+# Notebooks
+.ipynb_checkpoints
+#
+.hugo_build.lock
diff --git a/website/archetypes/default.md b/website/archetypes/default.md
new file mode 100644
index 000000000..26f317f30
--- /dev/null
+++ b/website/archetypes/default.md
@@ -0,0 +1,5 @@
+---
+title: "{{ replace .Name "-" " " | title }}"
+date: {{ .Date }}
+draft: true
+---
diff --git a/website/assets/icons/logo.svg b/website/assets/icons/logo.svg
new file mode 100644
index 000000000..791e15a0a
--- /dev/null
+++ b/website/assets/icons/logo.svg
@@ -0,0 +1 @@
+Icon_24px_K8Engine_Color
\ No newline at end of file
diff --git a/website/assets/scss/_styles_project.scss b/website/assets/scss/_styles_project.scss
new file mode 100644
index 000000000..fccde58c0
--- /dev/null
+++ b/website/assets/scss/_styles_project.scss
@@ -0,0 +1,174 @@
+// --------------------------------------------------
+// remove whitespace after footer
+// --------------------------------------------------
+footer {
+ min-height: auto;
+}
+
+// --------------------------------------------------
+// prevent overflow of long names in sidebar
+// --------------------------------------------------
+.td-sidebar-nav__section > ul {
+ overflow-wrap: break-word;
+}
+
+.td-overlay--dark::after {
+ background-color: rgba(33, 61, 122, 0.6);
+}
+
+#main_navbar {
+ justify-content: end;
+ padding-right: 16px;
+}
+
+.row > * {
+ flex-shrink: 1;
+}
+
+.row > .container {
+ max-width: 1200px;
+}
+
+// --------------------------------------------------
+// custom navbar with larger logo, dropdown on mobile
+// --------------------------------------------------
+.td-navbar {
+ min-height: auto;
+
+ .navbar-brand {
+ margin: 0;
+ padding: 0;
+
+ .text-uppercase {
+ display: none;
+ }
+
+ .navbar-logo {
+ svg {
+ display: inline-block;
+ position: absolute;
+ top: 0;
+ z-index: 33;
+ padding: 10px;
+ height: 95px;
+ background: white;
+ border: 2px solid #4279f4;
+ border-top: none;
+
+ @include media-breakpoint-down(md) {
+ width: 80px;
+ height: auto;
+ padding: 6px;
+ }
+ }
+ }
+ }
+
+ .navbar-nav {
+ @include media-breakpoint-down(md) {
+ font-size: .875rem;
+ .dropdown {
+ min-width: inherit;
+ }
+ }
+ }
+}
+
+.td-sidebar {
+ padding-bottom: 0.5rem;
+
+ .td-sidebar__inner {
+ padding-top: 30px;
+
+ @include media-breakpoint-down(md) {
+ padding-top: 10px;
+ }
+ }
+}
+
+.td-sidebar-toc {
+ @supports (position: sticky) {
+ position: sticky;
+ top: 60px;
+ height: calc(100vh - 120px);
+ overflow-y: auto;
+ }
+}
+
+
+// --------------------------------------------------
+// 404 page
+// --------------------------------------------------
+.error-page {
+ margin-top: 120px;
+
+ ul {
+ margin-bottom: 50px;
+ list-style-type: none;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-wrap: wrap;
+ padding-left: 0;
+ }
+
+ li {
+ margin-left: 10px;
+ margin-right: 10px;
+ }
+
+ h1 {
+ text-align: center;
+ margin-bottom: 20px;
+ }
+
+ @media (min-width: 768px) and (max-width: 991px) {
+ margin-top: 100px;
+ }
+
+ @media (max-width: 767px) {
+ margin-top: 50px;
+ }
+}
+
+figcaption {
+ font-size: 0.8rem;
+ text-align: center;
+ font-style: italic;
+ color: #6c757d;
+}
+
+// --------------------------------------------------
+// for tabbed code blocks
+// --------------------------------------------------
+.nav-tabs {
+ border-bottom: none !important;
+}
+
+.td-content > ul li,
+.td-content > ol li.nav-item {
+ margin-bottom: 0px;
+}
+
+.td-content .tab-content .highlight {
+ margin: 0;
+}
+
+.tab-pane {
+ border-radius: 0.25rem;
+ padding: 0 16px 16px;
+
+ border: 1px solid #dee2e6;
+
+ &:first-of-type.active {
+ border-top-left-radius: 0;
+ }
+}
+
+nav.foldable-nav .ul-1 .with-child>label:hover:before {
+ transform: none;
+}
+
+nav.foldable-nav .ul-1 .with-child>input:checked~label:hover:before {
+ transform: rotate(90deg) !important;
+}
\ No newline at end of file
diff --git a/website/assets/scss/_variables_project.scss b/website/assets/scss/_variables_project.scss
new file mode 100644
index 000000000..f9614eb5c
--- /dev/null
+++ b/website/assets/scss/_variables_project.scss
@@ -0,0 +1,151 @@
+/*
+Add styles or override the theme's variables here.
+*/
+
+html.smooth-scroll {
+ scroll-behavior: smooth;
+}
+
+// Theme colors
+$primary: #4279f4;
+$secondary: #fff;
+$dark: #213d7a;
+$info: #adb5bd;
+$light: #dee2e6;
+
+// Nav bar colors
+$white: #fff;
+$navbar-dark-color: rgba($white, 1);
+$navbar-dark-hover-color: rgba($white, 0.75);
+$navbar-dark-active-color: $navbar-dark-color;
+
+// Fonts
+$google_font_family: "Open+Sans:300,300i,400,400i,600,600i,700,700i&display=swap" !default;
+
+// Front page styling
+.card-img-top {
+ object-fit: scale-down;
+}
+
+.text-white {
+ font-weight: 400;
+}
+
+.bg-primary-dark {
+ background-color: $dark;
+
+ a {
+ border-bottom: 1px dotted paleturquoise;
+
+ color: paleturquoise !important;
+ font-weight: 600;
+ padding: 0 2px 1px 2px;
+ text-decoration: none;
+
+ &:hover {
+ border-bottom: 1px dotted #fff;
+
+ color: #fff !important;
+ }
+ }
+}
+
+.border-primary-dark {
+ border-color: $info !important;
+}
+
+.section-head {
+ font-size: 1.25em;
+ color: $primary;
+ font-weight: bold;
+ padding: 0 0 1em 0;
+}
+
+.contain {
+ margin: 0 auto;
+ max-width: 1200px; }
+
+.image {
+ display: block; }
+ .image img {
+ display: block;
+ width: 100%;
+ height: auto; }
+ .image.left, .image.right {
+ max-width: 45%; }
+ .image.left::after, .image.right::after {
+ clear: both;
+ content: "";
+ display: block; }
+ .image.left {
+ float: left;
+ margin: 0 1.5em 1.5em 0; }
+ .image.right {
+ float: right;
+ margin: 0 0 1.5em 1.5em; }
+
+#overview, #community {
+ padding: 6em 1.5em 3em 1.5em;
+ text-align: center;
+ margin: 0; }
+ #overview p, #community p {
+ font-size: 1.125em;}
+
+#overview {
+ border-bottom: 2px solid #b6d0ff;
+}
+
+#community {
+ border-top: 2px solid #b6d0ff;
+}
+
+#pageContent .lead {
+ margin: 0 1.5em 3em 1.5em;}
+ #pageContent .lead > .image {
+ padding: 0 1.5em;
+ max-width: 60%;
+ margin-bottom: 1.5em; }
+ #pageContent .lead > .text p {
+ font-size: 1em; }
+
+@media screen and (min-width: 480px) {
+ #overview, #community {
+ font-size: 1.125em; }
+ #pageContent .lead > .image {
+ max-width: 35%;
+ margin-bottom: 3em; }
+ #pageContent .lead > .text p {
+ font-size: 1em; } }
+
+@media screen and (min-width: 769px) {
+ #pageContent .lead {
+ margin-top: 1em;
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ -ms-flex-align: stretch;
+ align-items: stretch; }
+ #pageContent .lead > * {
+ -ms-flex: 0 1 auto;
+ flex: 0 1 auto; }
+ #pageContent .lead > .image {
+ display: block;
+ margin: 0 auto;
+ max-width: 100%; }
+ #pageContent .lead > .image > img {
+ max-width: 80%;
+ margin: 0 auto; }
+ #pageContent .lead > .text {
+ -ms-flex-preferred-size: 70%;
+ flex-basis: 70%; }
+ #pageContent .lead:nth-child(2n+0) > .image {
+ -ms-flex-order: 2;
+ order: 2; }
+ #pageContent .lead:nth-child(2n+0) > .text {
+ -ms-flex-order: 1;
+ order: 1; } }
diff --git a/website/config.toml b/website/config.toml
new file mode 100644
index 000000000..3c8769785
--- /dev/null
+++ b/website/config.toml
@@ -0,0 +1,155 @@
+baseURL = "/ai-on-gke/"
+title = "AI on GKE"
+
+enableRobotsTXT = true
+
+theme = "docsy"
+themesDir = "node_modules"
+
+###############################################################################
+# Docsy
+###############################################################################
+enableGitInfo = true
+
+# language settings
+contentDir = "content/en"
+defaultContentLanguage = "en"
+# tell Hugo not to include the /en/ element in the URL path for English docs
+defaultContentLanguageInSubdir = false
+# useful when translating
+enableMissingTranslationPlaceholders = true
+# disable taxonomies
+disableKinds = ["taxonomy", "taxonomyTerm"]
+# deprecated directories
+ignoreFiles = []
+###############################################################################
+# Hugo - Top-level navigation (horizontal)
+###############################################################################
+[menu]
+
+ [[menu.main]]
+ name = "GitHub"
+ weight = 99
+ pre = " "
+ url = "https://github.com/GoogleCloudPlatform/ai-on-gke"
+
+###############################################################################
+# Docsy - Goldmark markdown parser
+###############################################################################
+[markup]
+ [markup.goldmark]
+ [markup.goldmark.renderer]
+ unsafe = true
+ [markup.highlight]
+ # See a complete list of available styles at https://xyproto.github.io/splash/docs/all.html
+ style = "tango"
+ guessSyntax = "true"
+
+###############################################################################
+# Docsy - Image processing configuration
+###############################################################################
+[imaging]
+ resampleFilter = "CatmullRom"
+ quality = 75
+ anchor = "smart"
+
+###############################################################################
+# Docsy - Services configuration
+###############################################################################
+[services]
+ [services.googleAnalytics]
+ id = "UA-135379910-1"
+
+###############################################################################
+# Docsy - Language configuration
+###############################################################################
+[languages]
+ [languages.en]
+ languageName ="English"
+ # weight used for sorting in the language menu
+ weight = 1
+
+###############################################################################
+# Docsy - Site Parameters
+###############################################################################
+[params]
+ github_repo = "https://github.com/GoogleCloudPlatform/ai-on-gke"
+ github_project_repo = "https://github.com/GoogleCloudPlatform/ai-on-gke"
+ github_subdir = "website"
+ RSSLink = "/index.xml"
+ author = "Google Cloud" # add your company name
+ github = "GoogleCloudPlatform" # add your github profile name
+ twitter = "googlecloud" # add your twitter profile
+
+ copyright = "Google Cloud"
+
+ # Google Custom Search Engine ID.
+ # gcs_engine_id = "007239566369470735695:624rglujm-w"
+ prism_syntax_highlighting = true
+ # Text label for the version menu in the top bar of the website.
+ version_menu = "Version"
+
+ # The major.minor version tag for the version of the docs represented in this
+ # branch of the repository. Used in the "version-banner" partial to display a
+ # version number for this doc set.
+ version = "v0.1.0"
+
+ # Flag used in the "version-banner" partial to decide whether to display a
+ # banner on every page indicating that this is an archived version of the docs.
+ archived_version = false
+
+ # A link to latest version of the docs. Used in the "version-banner" partial to
+ # point people to the main doc site.
+ url_latest_version = "https://cloud.google.com/ai-platform/training/docs"
+
+ # A variable used in various docs to determine URLs for config files etc.
+ # To find occurrences, search the repo for 'params "githubbranch"'.
+ githubbranch = "main"
+
+ # These entries appear in the drop-down menu at the top of the website.
+ # [[params.versions]]
+ # version = "main"
+ # githubbranch = "main"
+
+ # User interface configuration
+ [params.ui]
+ # Enable the logo
+ navbar_logo = true
+ # Enable to show the side bar menu in its compact state.
+ sidebar_menu_compact = true
+ # Enable the search box in the side bar.
+ sidebar_search_disable = false
+ # Set to true to disable breadcrumb navigation.
+ breadcrumb_disable = false
+ # Show expand/collapse icon for sidebar sections
+ sidebar_menu_foldable = true
+ # Disable about button in footer
+ footer_about_disable = true
+
+ # Adds a H2 section titled "Feedback" to the bottom of each doc. The responses are sent to Google Analytics as events.
+ # This feature depends on [services.googleAnalytics] and will be disabled if "services.googleAnalytics.id" is not set.
+ # If you want this feature, but occasionally need to remove the "Feedback" section from a single page,
+ # add "hide_feedback: true" to the page's front matter.
+ [params.ui.feedback]
+ enable = true
+ # The responses that the user sees after clicking "yes" (the page was helpful) or "no" (the page was not helpful).
+ yes = 'Glad to hear it! Please tell us how we can improve .'
+ no = 'Sorry to hear that. Please tell us how we can improve .'
+
+[params.links]
+# End user relevant links. These will show up on left side of footer and in the community page if you have one.
+ [[params.links.user]]
+ name ="Twitter"
+ url = "https://twitter.com/googlecloud"
+ icon = "fab fa-twitter"
+ desc = "Follow us on Twitter to get the latest news!"
+ [[params.links.user]]
+ name = "Stack Overflow"
+ url = "https://stackoverflow.com/questions/tagged/google-kubernetes-engine"
+ icon = "fab fa-stack-overflow"
+ desc = "Practical questions and curated answers"
+ [[params.links.user]]
+ name = "Slack"
+ url = "https://googlecloud-community.slack.com/"
+ icon = "fab fa-slack"
+ desc = "Chat with other project developers"
diff --git a/website/content/en/_index.html b/website/content/en/_index.html
new file mode 100644
index 000000000..56cd1d04a
--- /dev/null
+++ b/website/content/en/_index.html
@@ -0,0 +1,11 @@
++++
+title = "AI on GKE"
+linkTitle = "AI on GKE"
+description = "AI on GKE"
++++
+
+{{< blocks/cover title="AI on GKE" image_anchor="top" height="full" color="orange" >}}
+
+{{< /blocks/cover >}}
+
+
+{{- range $i, $e := $tabs -}}
+{{- $id := printf "%s-%d" $tab_set_id $i -}}
+{{- if (eq $i 0) -}}
+
+{{ else }}
+
+{{ end }}
+
+ {{- with .content -}}
+ {{- . -}}
+ {{- else -}}
+ {{- if eq $.Page.BundleType "leaf" -}}
+ {{- /* find the file somewhere inside the bundle. Note the use of double asterisk */ -}}
+ {{- with $.Page.Resources.GetMatch (printf "**%s*" .include) -}}
+ {{- if ne .ResourceType "page" -}}
+ {{- /* Assume it is a file that needs code highlighting. */ -}}
+ {{- $codelang := $e.codelang | default ( path.Ext .Name | strings.TrimPrefix ".") -}}
+ {{- highlight .Content $codelang "" -}}
+ {{- else -}}
+ {{- .Content -}}
+ {{- end -}}
+ {{- end -}}
+ {{- else -}}
+ {{- $path := path.Join $.Page.File.Dir .include -}}
+ {{- $page := site.GetPage "page" $path -}}
+ {{- with $page -}}
+ {{- .Content -}}
+ {{- else -}}
+ {{- errorf "[%s] tabs include not found for path %q" site.Language.Lang $path -}}
+ {{- end -}}
+ {{- end -}}
+ {{- end -}}
+
+{{- end -}}
+
diff --git a/website/layouts/shortcodes/include.html b/website/layouts/shortcodes/include.html
new file mode 100644
index 000000000..b15253c89
--- /dev/null
+++ b/website/layouts/shortcodes/include.html
@@ -0,0 +1,43 @@
+
+{{/* Handle the "file" and "lang" named parameter or two unnamed parameter as the filepath and coding language*/}}
+{{/* The first parameter should be a relative path to the "static" directory. Ex: "examples/jobs/sample-job.yaml" */}}
+{{ if .IsNamedParams }}
+ {{ $.Scratch.Set "fparameter" ( .Get "file" ) }}
+ {{ $.Scratch.Set "lang" ( .Get "lang") }}
+{{ else }}
+ {{ $.Scratch.Set "fparameter" ( .Get 0 ) }}
+ {{ $.Scratch.Set "lang" ( .Get 1 ) }}
+{{ end }}
+
+{{/* If coding language are specified, then the static file is a code file; If not, then the static are non-code file. */}}
+{{ if eq ($.Scratch.Get "lang") "" }}
+{{ $.Scratch.Set "iscode" "false"}}
+{{ else }}
+{{ $.Scratch.Set "iscode" "true" }}
+{{ end }}
+
+{{/* `fparameter is a relative path of the static file from the `static` diretory. For example, `/example/python/hello.py` */}}
+{{ $.Scratch.Set "filepath" "/" }}
+{{ $.Scratch.Add "filepath" "static/" }}
+{{ $.Scratch.Add "filepath" ($.Scratch.Get "fparameter") }}
+
+{{/* If the file exists, read it and highlight it if it's code.
+Throw a compile error or print an error on the page if the file is not found */}}
+
+{{ if fileExists ($.Scratch.Get "filepath") }}
+ {{ $filename := (path.Split ($.Scratch.Get "filepath")).File }}
+ {{ $link := printf "/%s" ($.Scratch.Get "fparameter") | safeURL }}
+
+
{{ $filename }}
+ {{ if eq ($.Scratch.Get "iscode") "true" }}
+ {{- highlight ($.Scratch.Get "filepath" | readFile | htmlUnescape |
+ safeHTML ) ($.Scratch.Get "lang") "" -}}
+ {{ else }}
+ {{- $.Scratch.Get "filepath" | os.ReadFile | .Page.RenderString | safeHTML -}}
+ {{ end }}
+
+{{ else if eq (.Get "draft") "true" }}
+
+
The file {{ $.Scratch.Get "filepath" }}
was not found.
+
+{{ else }}{{- errorf "Shortcode %q: file %q not found at %s" .Name ($.Scratch.Get "filepath") .Position -}}{{ end }}
\ No newline at end of file
diff --git a/website/layouts/shortcodes/needs-update.html b/website/layouts/shortcodes/needs-update.html
new file mode 100644
index 000000000..6dcb7d2d1
--- /dev/null
+++ b/website/layouts/shortcodes/needs-update.html
@@ -0,0 +1,4 @@
+
+
Documentation Needs Update
+ This page needs updating.
+
diff --git a/website/layouts/shortcodes/params.html b/website/layouts/shortcodes/params.html
new file mode 100644
index 000000000..499251b98
--- /dev/null
+++ b/website/layouts/shortcodes/params.html
@@ -0,0 +1 @@
+{{- .Page.Param (.Get 0) -}}
\ No newline at end of file
diff --git a/website/layouts/sitemap.xml b/website/layouts/sitemap.xml
new file mode 100644
index 000000000..20ea79af4
--- /dev/null
+++ b/website/layouts/sitemap.xml
@@ -0,0 +1,21 @@
+
+ {{ range .Data.Pages }}
+
+ https://github.com/GoogleCloudPlatform/ai-on-gke{{ .Permalink }} {{ if not .Lastmod.IsZero }}
+ {{ safeHTML ( .Lastmod.Format "2006-01-02T15:04:05-07:00" ) }} {{ end }}{{ with .Sitemap.ChangeFreq }}
+ {{ . }} {{ end }}{{ if ge .Sitemap.Priority 0.0 }}
+ {{ .Sitemap.Priority }} {{ end }}{{ if .IsTranslated }}{{ range .Translations }}
+ {{ end }}
+ {{ end }}
+
+ {{ end }}
+
\ No newline at end of file
diff --git a/website/package-lock.json b/website/package-lock.json
new file mode 100644
index 000000000..3b4b018d5
--- /dev/null
+++ b/website/package-lock.json
@@ -0,0 +1,1020 @@
+{
+ "name": "website",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "devDependencies": {
+ "autoprefixer": "^10.4.13",
+ "docsy": "github:google/docsy",
+ "postcss": "^8.4.21",
+ "postcss-cli": "^10.1.0"
+ }
+ },
+ "node_modules/@fortawesome/fontawesome-free": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.2.1.tgz",
+ "integrity": "sha512-viouXhegu/TjkvYQoiRZK3aax69dGXxgEjpvZW81wIJdxm5Fnvp3VVIP4VHKqX4SvFw6qpmkILkD4RJWAdrt7A==",
+ "dev": true,
+ "hasInstallScript": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@popperjs/core": {
+ "version": "2.11.6",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz",
+ "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==",
+ "dev": true,
+ "peer": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.13",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz",
+ "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ }
+ ],
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "caniuse-lite": "^1.0.30001426",
+ "fraction.js": "^4.2.0",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/bootstrap": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz",
+ "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/twbs"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/bootstrap"
+ }
+ ],
+ "peerDependencies": {
+ "@popperjs/core": "^2.11.6"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.21.5",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
+ "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001449",
+ "electron-to-chromium": "^1.4.284",
+ "node-releases": "^2.0.8",
+ "update-browserslist-db": "^1.0.10"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001449",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001449.tgz",
+ "integrity": "sha512-CPB+UL9XMT/Av+pJxCKGhdx+yg1hzplvFJQlJ2n68PyQGMz9L/E2zCyLdOL8uasbouTUgnPl+y0tccI/se+BEw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ }
+ ]
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/dependency-graph": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz",
+ "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/docsy": {
+ "version": "0.6.0",
+ "resolved": "git+ssh://git@github.com/google/docsy.git#dc94be3e13e2090ff6cd1c50edd650ab7ebd968b",
+ "dev": true,
+ "dependencies": {
+ "@fortawesome/fontawesome-free": "6.2.1",
+ "bootstrap": "5.2.3"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.284",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
+ "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
+ "dev": true
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/fast-glob": {
+ "version": "3.2.12",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
+ "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
+ "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://www.patreon.com/infusion"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz",
+ "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-stdin": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz",
+ "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/globby": {
+ "version": "13.1.3",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz",
+ "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==",
+ "dev": true,
+ "dependencies": {
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.11",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globby/node_modules/slash": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
+ "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.10",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+ "dev": true
+ },
+ "node_modules/ignore": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz",
+ "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
+ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
+ "dev": true,
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz",
+ "integrity": "sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA==",
+ "dev": true
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.21",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
+ "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.4",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-cli": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-10.1.0.tgz",
+ "integrity": "sha512-Zu7PLORkE9YwNdvOeOVKPmWghprOtjFQU3srMUGbdz3pHJiFh7yZ4geiZFMkjMfB0mtTFR3h8RemR62rPkbOPA==",
+ "dev": true,
+ "dependencies": {
+ "chokidar": "^3.3.0",
+ "dependency-graph": "^0.11.0",
+ "fs-extra": "^11.0.0",
+ "get-stdin": "^9.0.0",
+ "globby": "^13.0.0",
+ "picocolors": "^1.0.0",
+ "postcss-load-config": "^4.0.0",
+ "postcss-reporter": "^7.0.0",
+ "pretty-hrtime": "^1.0.3",
+ "read-cache": "^1.0.0",
+ "slash": "^5.0.0",
+ "yargs": "^17.0.0"
+ },
+ "bin": {
+ "postcss": "index.js"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz",
+ "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==",
+ "dev": true,
+ "dependencies": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^2.1.1"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-reporter": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.5.tgz",
+ "integrity": "sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^1.0.0",
+ "thenby": "^1.3.4"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "node_modules/pretty-hrtime": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+ "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/slash": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-5.0.0.tgz",
+ "integrity": "sha512-n6KkmvKS0623igEVj3FF0OZs1gYYJ0o0Hj939yc1fyxl2xt+xYpLnzJB6xBSqOfV9ZFLEWodBBN/heZJahuIJQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/thenby": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz",
+ "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==",
+ "dev": true
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
+ "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "browserslist-lint": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yaml": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz",
+ "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "17.6.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz",
+ "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ }
+ }
+}
diff --git a/website/package.json b/website/package.json
new file mode 100644
index 000000000..5000fb607
--- /dev/null
+++ b/website/package.json
@@ -0,0 +1,8 @@
+{
+ "devDependencies": {
+ "autoprefixer": "^10.4.13",
+ "docsy": "github:google/docsy",
+ "postcss": "^8.4.21",
+ "postcss-cli": "^10.1.0"
+ }
+}
diff --git a/website/static/favicons/android-144x144.png b/website/static/favicons/android-144x144.png
new file mode 100644
index 000000000..c08925589
Binary files /dev/null and b/website/static/favicons/android-144x144.png differ
diff --git a/website/static/favicons/android-192x192 copy.png b/website/static/favicons/android-192x192 copy.png
new file mode 100644
index 000000000..ccacec3a4
Binary files /dev/null and b/website/static/favicons/android-192x192 copy.png differ
diff --git a/website/static/favicons/android-192x192.png b/website/static/favicons/android-192x192.png
new file mode 100644
index 000000000..ccacec3a4
Binary files /dev/null and b/website/static/favicons/android-192x192.png differ
diff --git a/website/static/favicons/android-48x48.png b/website/static/favicons/android-48x48.png
new file mode 100644
index 000000000..f754031df
Binary files /dev/null and b/website/static/favicons/android-48x48.png differ
diff --git a/website/static/favicons/android-72x72.png b/website/static/favicons/android-72x72.png
new file mode 100644
index 000000000..c1e6c6601
Binary files /dev/null and b/website/static/favicons/android-72x72.png differ
diff --git a/website/static/favicons/android-96x96.png b/website/static/favicons/android-96x96.png
new file mode 100644
index 000000000..ccd728d49
Binary files /dev/null and b/website/static/favicons/android-96x96.png differ
diff --git a/website/static/favicons/android-chrome-192x192.png b/website/static/favicons/android-chrome-192x192.png
new file mode 100644
index 000000000..ccacec3a4
Binary files /dev/null and b/website/static/favicons/android-chrome-192x192.png differ
diff --git a/website/static/favicons/apple-touch-icon-180x180.png b/website/static/favicons/apple-touch-icon-180x180.png
new file mode 100644
index 000000000..795cb8857
Binary files /dev/null and b/website/static/favicons/apple-touch-icon-180x180.png differ
diff --git a/website/static/favicons/favicon-16x16.png b/website/static/favicons/favicon-16x16.png
new file mode 100644
index 000000000..fe8a03f7a
Binary files /dev/null and b/website/static/favicons/favicon-16x16.png differ
diff --git a/website/static/favicons/favicon-32x32.png b/website/static/favicons/favicon-32x32.png
new file mode 100644
index 000000000..b0c3c2e65
Binary files /dev/null and b/website/static/favicons/favicon-32x32.png differ
diff --git a/website/static/favicons/favicon-96x96.png b/website/static/favicons/favicon-96x96.png
new file mode 100644
index 000000000..ccd728d49
Binary files /dev/null and b/website/static/favicons/favicon-96x96.png differ
diff --git a/website/static/favicons/favicon.ico b/website/static/favicons/favicon.ico
new file mode 100644
index 000000000..dc42506ae
Binary files /dev/null and b/website/static/favicons/favicon.ico differ
diff --git a/website/static/favicons/site.webmanifest b/website/static/favicons/site.webmanifest
new file mode 100644
index 000000000..45dc8a206
--- /dev/null
+++ b/website/static/favicons/site.webmanifest
@@ -0,0 +1 @@
+{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
\ No newline at end of file
diff --git a/website/static/images/logo.svg b/website/static/images/logo.svg
new file mode 100644
index 000000000..791e15a0a
--- /dev/null
+++ b/website/static/images/logo.svg
@@ -0,0 +1 @@
+
Icon_24px_K8Engine_Color
\ No newline at end of file